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

news/2024/10/18 5:43:31/

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 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 效果展示

image-20220818104428396

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

2.5 效果展示

在这里插入图片描述


http://www.ppmy.cn/news/581951.html

相关文章

【已解决】有些网站播放视频时,视频播放器无法拖动进度,无法快进的问题

解决某些网站播放视频时,我们无法拖动视频播放器的进度条,无法快进播放,而且也不能使用倍速播放的问题 目录

Roop:显卡GPU版软件已就位,速度提升28倍!

我在本地的一台电脑行做了个简单的对比,同一个小视频,CPU要5分多钟,GPU只要12秒。而且,内存的需求量也大幅度降低了。 美队这个架子,给托尼用,也挺不错哦! 这次的版本,准确来说是GPU…

【SpringCloud】二、Nacos集群与Feign服务调用简介

Nacos Nacos的安装 在父工程中加载springcloudalibaba依赖用来管理版本信息 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><…

电脑能登qq但是无法访问网页

解决方法&#xff0c;对我的电脑来说最简单的方法就是打开联想电脑管家&#xff0c;然后打开网络诊断&#xff0c;进行网络修复&#xff0c;有效简单。

连了热点可以用qq却不能用浏览器

可能你不知不觉开了代理服务器 关了就行

Shell Script Strengthening Exercises

文章目录 1、Given the lengths of the three sides a, b, and c of a triangle, use a formula to calculate the area of the triangle.2、Use the quadratic formula to find the two roots of a quadratic equation, with a, b, and c entered from the keyboard.3、Input …

【华为OD机试真题2023 JAVAJS】阿里巴巴找黄金宝箱(IV)

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 阿里巴巴找黄金宝箱(IV) 知识点数组栈单调栈 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一…

神秘海域4:盗贼末路特效解密

给公司技术公众号写了篇文章&#xff0c;转到这儿供大家学习。 https://mp.weixin.qq.com/s/K9ijK4Texth_oeEGOQTv4A 版权属公司所有。