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;
- 可以使用pychram进行连接,连接成功后可简化建表等流程。
连接成功可以看见之前建好的表
1.2 使用python连接数据库
在指定路径下创建一个数据库配置文件mysql.ini
,并进行配置。
[mysql]
host=127.0.0.1
#设置3306端口
port = 3306
#设置用户名
user =用户名
#设置用户密码
passwd=密码
#设置要连接的数据库
db =数据库名
#设置字符编码
charset=utf8
- 加载mysql文件的配置项
import os
import pymysql
import configparserdef 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.1user=db_config.get('mysql', 'user'),# 用户名passwd=db_config.get('mysql', 'passwd'),# 密码port=int(db_config.get('mysql', 'port')),# 端口,默认为3306db=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_idgroup = event.group_idmsg = event.messaget = [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 requestschat = 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_idgroup = event.group_idmsg = event.messaget = [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.1user=db_config.get('mysql', 'user'),# 用户名passwd=db_config.get('mysql', 'passwd'),# 密码port=int(db_config.get('mysql', 'port')),# 端口,默认为3306db=db_config.get('mysql', 'db'),# 数据库名称charset=db_config.get('mysql', 'charset'),# 字符编码)return conn
!!! `chat = on_message(block = False) `#block=False可是让chat相应后,不影响其他插件的运行
1.5 效果展示
2. 将保存在数据库里面的消息做成词云图
2.1 连接数据库,找出相应信息,并对消息进行处理
# 准备词云所需的文字(词)db = pymysql.connect(host='host', user='user', password='password', database='database')conn = db.cursor() # 获取指针以操作数据库qq = event.user_idgroup = event.group_idsql = 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 以及 Regionsecret_id = 'secretId' # 替换为用户的 secretIdsecret_key = 'secretKey' # 替换为用户的 secretKeyregion = '地址' # 替换为用户的 Regiontoken = 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 CosS3Clientword_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_idgroup = event.group_idsql = 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 以及 Regionsecret_id = 'secretId' # 替换为用户的 secretIdsecret_key = 'secretKey' # 替换为用户的 secretKeyregion = '地址' # 替换为用户的 Regiontoken = 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`(不开启缓存),如果不加,之后显示的图片都是第一次显示的图片。