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 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 效果展示
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`(不开启缓存),如果不加,之后显示的图片都是第一次显示的图片。