Python3下利用QQBot和PyMySQL实现定时复读QQ群中发送过的消息

时间:2024-04-14 14:43:02

之前看了网上有人写过的沙雕QQ机器人,于是自己也想写一个机器人玩玩,然后就有了下面这些代码。
关于MySQL数据库的部分这里就只说一下建表的格式,至于安装MySQL的具体步骤和问题已经有很多博主写过,这里就不再赘述了(老话说的对:“重启能解决很多问题”)

1.建表

因为表不大,所以我是用Navicat进数据库建表的,也可以选择用PyMySQL建,这就看个人喜好了,下面把我建表的代码贴出来:

#选中你要建表的库,这里我的库叫"repeter"
use repeter;
#开始建表( 设置属性时字符的大小写无所谓,如果群消息很长可以把message的varchar属性设置得更大)
create table message (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(15) DEFAULT NULL,
  time char(19) DEFAULT NULL,
  message varchar(60) DEFAULT NULL,
  PRIMARY KEY (id)
) ;

2.复制并存储消息

# -*- coding: utf-8 -*-
# @File    :repeter_copy.py
# @Author : Skysinger

# 导入运行QQ机器人、连接mysql数据库和获取当前世界所需要的库
from qqbot import _bot as bot
import pymysql
from time import strftime, localtime
# 定义消息响应函数
def onQQMessage(bot, contact, member, content):
    # 打开数据库连接
    db = pymysql.connect("localhost", "root", "2333", "repeter")
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
    # 判断是否是自己发送的消息或是好友发来的消息
    if bot.isMe(contact, member) or member is None:
        pass
    else:
        # 获取发送消息的时间,格式为YYYY-MM-DD HH:MM:SS
        t = str(strftime("%Y-%m-%d %H:%M:%S", localtime()))
        # 当消息不为空时,将其存入数据库
        if content:
            try:
                cursor.execute(
                    "insert into message(name,time,message) values('%s','%s','%s');" % (member.name, t, content))
                db.commit()
            except Exception:
                pass

3.向指定群聊中发送消息

# -*- coding: utf-8 -*-
# @File    :repeter_send.py
# @Author : Skysinger

# 导入需要的库
import pymysql
import subprocess
from random import randint
from time import sleep
# 群关键字,如果有重名的群可以增加关键字。例如查找群名称中含有“python3”的群,把"梦"换为“python3”即可
keyword = "梦"
#最小复读间隔(秒)
min_time = 3
#最大复读间隔(秒)
max_time = 3600
# 打开数据库连接
db = pymysql.connect("localhost", "root", "2333", "repeter")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

while True:
    # 使用游标的execute方法查询数据库内的数据
    cursor.execute("select * from message;")
    
    # 使用fetchall()方法得到查询结果
    results = cursor.fetchall()
    
    # 获取查询到记录的条数
    number = len(results)
    
    # 取用于选择消息条数和复读间隔的随机数
    rand_num = randint(0, number - 1)
    sleep_time = randint(min_time, max_time)
    
    # 取选中的消息并将内容提取出来传入格式化的字符串中
    message = "{} ——By:{} {}".format(results[rand_num][3], results[rand_num][1], results[rand_num][2], )

由于复读机不需要对他人的消息进行响应,而我也没有找到官方方法中可以单独发送消息的函数,故出此下策,使用在CMD中发送消息的指令:

    # 使用subprocess中的Popen方法实现用向CMD中输入相关指令
    result = subprocess.Popen(r"qq send group :like:%s %s" % (keyword, message))
    # 阻塞等待第一条命令执行完毕再执行第二条命令
    result.wait()
    result2 = subprocess.Popen(r"qq send group :like:%s 距离下一次复读还有%s秒" % (keyword, sleep_time))
    # 用time模块中的sleep函数实现发送间隔
    sleep(sleep_time)

4.运行方式

4-1启动qqbot

用win+R打开cmd,cd到有qqbot.exe的目录(我这里的目录是C:\ProgramData\Anaconda3\Scripts)下运行"qqbot"(如果设置了环境变量直接运行qqbot即可),运行完了它会弹出一个二维码,扫码登录:

Python3下利用QQBot和PyMySQL实现定时复读QQ群中发送过的消息

4-2加载存储插件

将第二步中的py文件复制到 C:\Users\用户名\.qqbot-tmp\plugins 下(把“用户名”改成你自己的用户名就行),再打开一个新的cmd窗口,同样cd到有qqbot.exe的目录下, 运行“qq plug 第二步文件的文件名”(这里我的文件名叫 ”repeter_copy.py“)
Python3下利用QQBot和PyMySQL实现定时复读QQ群中发送过的消息

4-3 加载发送插件

调整好keyword、min_time和max_time参数,直接运行该py文件即可实现发送消息。

效果图:

其中复读格式为 “消息” ——By:“发消息者” “时间”
Python3下利用QQBot和PyMySQL实现定时复读QQ群中发送过的消息

参考资料:
qqbot的github主页: https://github.com/pandolia/qqbot