Nonebot QQ机器人插件九:qq群聊天记录词云图

QQ机器人插件九:qq群聊天记录词云图

1. 将实时聊天记录保存到数据库

安装数据库可自行到网上查找,本文仅使用mysql数据库为例。linux下mysql数据库安装可参考(59条消息) Linux安装mysql 5.7_qq_43784519的博客-CSDN博客或者(59条消息) Linux下载安装mysql5.7版本教程最全详解_jrj5的博客-CSDN博客_linux安装mysql5.7

1.1 创建相应的数据库和表

  • 首先,先创建数据库和表
mysql -u root -p
输入密码
# 创建数据库
create database db;
# 使用当前数据库
use db;
# 创建表
create table chat(
	qq_id int not null,
	group_id int not null,
	msg varchar(100)
);
# 查看表
desc chat;

image-20220818103612422

  • 可以使用pychram进行连接,连接成功后可简化建表等流程。

image-20220818102410670

image-20220818102707017

连接成功可以看见之前建好的表

image-20220818102753000

1.2 使用python连接数据库

在指定路径下创建一个数据库配置文件mysql.ini,并进行配置。

[mysql]
host=127.0.0.1
#设置3306端口
port = 3306
#设置用户名
user =用户名
#设置用户密码
passwd=密码
#设置要连接的数据库
db =数据库名
#设置字符编码
charset=utf8

image-20220818101236001

  • 加载mysql文件的配置项
import os
import pymysql
import configparser

def conn_mysql_database():
    path = os.path.join(os.path.dirname(os.path.abspath(__file__)) + '/conf/mysql.ini')

    db_config = configparser.ConfigParser()
    db_config.read_file(open(path, encoding='utf-8', mode='rt'))

    conn = pymysql.connect(
        host=db_config.get('mysql', 'host'),
        # 连接名称,默认127.0.0.1
        user=db_config.get('mysql', 'user'),
        # 用户名
        passwd=db_config.get('mysql', 'passwd'),
        # 密码
        port=int(db_config.get('mysql', 'port')),
        # 端口,默认为3306
        db=db_config.get('mysql', 'db'),
        # 数据库名称
        charset=db_config.get('mysql', 'charset'),
        # 字符编码
    )
    return conn

或者使用如下语句进行连接:

db = pymysql.connect(host='host', user='user', password='password', database='database')

1.3 对数据库进行操作

db = pymysql.connect(host='host', user='user', password='password', database='database')
   conn = db.cursor()  # 获取指针以操作数据库
    # 写入MYSQL数据库
    qq = event.user_id
    group = event.group_id
    msg = event.message
    t = [qq,group,msg]
    sql = u"INSERT INTO chat_record(user_id,group_id,msg) VALUES(%s,%s,%s)"
    conn.execute(sql, t)
    db.commit()  # 提交操作
    # 关闭MySQL连接
    conn.close()
    db.close()

1.4 chat.py完整代码

import random
import uuid
import os
import pymysql
from pymysql import Connection
import configparser
import nonebot
from nonebot import  on_keyword,on_message     # 事件响应器函数
from nonebot.typing import T_State      #bot使用的对象和字典
from nonebot.adapters.onebot.v11 import Bot, Message, MessageSegment, GroupMessageEvent  # #Message是使用cq码的必要函数
from nonebot.rule import to_me
import requests

chat = on_message(block = False)  #block=False可是让chat相应后,不影响其他插件的运行

@chat.handle()
async def send_private_msg(bot: Bot, event: GroupMessageEvent,state: T_State):
    db = pymysql.connect(host='host', user='user', password='password', database='database')
    conn = db.cursor()  # 获取指针以操作数据库
    # 写入MYSQL数据库
    qq = event.user_id
    group = event.group_id
    msg = event.message
    t = [qq,group,msg]
    sql = u"INSERT INTO chat_record(user_id,group_id,msg) VALUES(%s,%s,%s)"
    conn.execute(sql, t)

    db.commit()  # 提交操作

    # 关闭MySQL连接
    conn.close()
    db.close()

    #await chat.send(str(qq))


def conn_mysql_database():
    path = os.path.join(os.path.dirname(os.path.abspath(__file__)) + '/conf/mysql.ini')

    db_config = configparser.ConfigParser()
    db_config.read_file(open(path, encoding='utf-8', mode='rt'))

    conn = pymysql.connect(
        host=db_config.get('mysql', 'host'),
        # 连接名称,默认127.0.0.1
        user=db_config.get('mysql', 'user'),
        # 用户名
        passwd=db_config.get('mysql', 'passwd'),
        # 密码
        port=int(db_config.get('mysql', 'port')),
        # 端口,默认为3306
        db=db_config.get('mysql', 'db'),
        # 数据库名称
        charset=db_config.get('mysql', 'charset'),
        # 字符编码
    )
    return conn
!!! `chat = on_message(block = False) `
 #block=False可是让chat相应后,不影响其他插件的运行

1.5 效果展示

image-20220818104428396

2. 将保存在数据库里面的消息做成词云图

2.1 连接数据库,找出相应信息,并对消息进行处理

# 准备词云所需的文字(词)
   db = pymysql.connect(host='host', user='user', password='password', database='database')
    conn = db.cursor()  # 获取指针以操作数据库
    qq = event.user_id
    group = event.group_id
    sql = f'select msg from chat_record where user_id ="{qq}" and group_id ="{group}"' #查找对应信息
    print(sql)
    conn.execute(sql)
    data = conn.fetchall()
    text = ""
    for item in data:
        text = text + item[0]	#将消息连接成一个字符串
        
    conn.close()
    db.close()

2.2 制作词云图

 # 分词
    cut = jieba.cut(text)
    word = ' '.join(cut)
    print(word)
    #词->图片,设置字体,背景等
    img = Image.open(r'./img/ch.png')   # 打开背景图片
    #print(img)
    #img.show()
    img_array = np.array(img)   # 将图片转换为数组
    wc = WordCloud(
        background_color='white',
        mask=img_array,
        font_path="STXINGKA.TTF"    # 字体所在位置:C:\Windows\Fonts
    )

    wc.generate_from_text(word)
    wc.to_file(r'./img/WorldCould.jpg')

1. 图片地址在相对路径和绝对路径中二选一;

2. linux系统的字体操作可参考(59条消息) Linux下安装字体_qq_43784519的博客-CSDN博客

2.3 将保存在本地的词云图上传至图床

  • 本文使用的是腾讯云cos,如何创建可自行在网上搜索,设置好以后就可以进行操作了。
 # 1. 设置用户配置, 包括 secretId,secretKey 以及 Region
    secret_id = 'secretId'  # 替换为用户的 secretId
    secret_key = 'secretKey'  # 替换为用户的 secretKey
    region = '地址'  # 替换为用户的 Region

    token = None  # 使用临时密钥需要传入 Token,默认为空,可不填
    config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key)
    # 2. 获取客户端对象
    client = CosS3Client(config)
    # 3. 上传文件
    response = client.upload_file(
        Bucket='桶名',
        LocalFilePath='WorldCould.jpg',  # 本地文件的路径
        Key='WorldCould.jpg',  # 上传到桶之后的文件名
        PartSize=1,  # 上传分成几部分
        MAXThread=10,  # 支持最多的线程数
        EnableMD5=False  # 是否支持MD5
    )

2.4 word_cloud.py完整代码

import nonebot
from nonebot import on_keyword
from nonebot.matcher import Matcher
from nonebot.adapters import Message
from nonebot.params import Arg, CommandArg, ArgPlainText
from nonebot.adapters.onebot.v11 import Bot, Message, MessageSegment, Event, PrivateMessageEvent,GroupMessageEvent
from nonebot.typing import T_State      #bot使用的对象和字典
import jieba                            # 分词
import pymysql                          # 数据库
from matplotlib import pyplot as plt    # 绘图,数据可视化
from wordcloud import WordCloud         # 词云
from PIL import Image                   # 图片处理
import numpy as np                      # 矩阵运算
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client

word_cloud = on_keyword({'词云'})

@word_cloud.handle()
async def handle_cloud(bot: Bot, event: GroupMessageEvent,state: T_State):
    # 准备词云所需的文字(词)
     db = pymysql.connect(host='host', user='user', password='password', database='database')
    conn = db.cursor()  # 获取指针以操作数据库
    qq = event.user_id
    group = event.group_id
    sql = f'select msg from chat_record where user_id ="{qq}" and group_id ="{group}"'
    print(sql)
    conn.execute(sql)
    data = conn.fetchall()
    text = ""
    for item in data:
        text = text + item[0]
    conn.close()
    db.close()

    # 分词
    cut = jieba.cut(text)
    word = ' '.join(cut)
    print(word)
    #词->图片,设置字体,背景等
    img = Image.open(r'./img/ch.png')   # 打开背景图片
    #print(img)
    #img.show()
    img_array = np.array(img)   # 将图片转换为数组
    wc = WordCloud(
        background_color='white',
        mask=img_array,
        font_path="STXINGKA.TTF"    # 字体所在位置:C:\Windows\Fonts
    )

    wc.generate_from_text(word)
    wc.to_file(r'./img/WorldCould.jpg')
    upload()
    cloud = '保存在cos在图片的链接'
    await word_cloud.send(MessageSegment.image(cloud,cache=False))
    picture = f"[CQ:image,file={cloud}]"
    #await word_cloud.send(Message(picture))
    #await word_cloud.send(MessageSegment.image(cloud))



def upload():
   # 1. 设置用户配置, 包括 secretId,secretKey 以及 Region
    secret_id = 'secretId'  # 替换为用户的 secretId
    secret_key = 'secretKey'  # 替换为用户的 secretKey
    region = '地址'  # 替换为用户的 Region

    token = None  # 使用临时密钥需要传入 Token,默认为空,可不填
    config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key)
    # 2. 获取客户端对象
    client = CosS3Client(config)
    # 3. 上传文件
    response = client.upload_file(
        Bucket='桶名',
        LocalFilePath='WorldCould.jpg',  # 本地文件的路径
        Key='WorldCould.jpg',  # 上传到桶之后的文件名
        PartSize=1,  # 上传分成几部分
        MAXThread=10,  # 支持最多的线程数
        EnableMD5=False  # 是否支持MD5
    )
注意 MessageSegment.image(cloud,cache=False)
这里要加`cache=False`(不开启缓存),如果不加,之后显示的图片都是第一次显示的图片。

2.5 效果展示

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值