之前看了网上有人写过的沙雕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即可),运行完了它会弹出一个二维码,扫码登录:
4-2加载存储插件
将第二步中的py文件复制到 C:\Users\用户名\.qqbot-tmp\plugins 下(把“用户名”改成你自己的用户名就行),再打开一个新的cmd窗口,同样cd到有qqbot.exe的目录下, 运行“qq plug 第二步文件的文件名”(这里我的文件名叫 ”repeter_copy.py“)
4-3 加载发送插件
调整好keyword、min_time和max_time参数,直接运行该py文件即可实现发送消息。
效果图:
其中复读格式为 “消息” ——By:“发消息者” “时间”
参考资料:
qqbot的github主页: https://github.com/pandolia/qqbot