qqbot实现QQ消息的自动回复

最近像机器人一样,早上准点出门去图书馆,中午回来吃饭睡午觉,晚上吃饭看视频,整个人都快整蒙了。然后就想起来干点其他的事来改善改善我这平淡的生活。

之前写的是一个itchat实现微信消息的自动回复,然后是调用的图灵机器人实现的自动对话。这里的QQ自动回复就没有用机器人自动回复了,而是从网页上爬取的祝福语,然后保存到数据库中,在QQ收到消息的时候,随机从数据库中取出一句祝福语回复发消息的好友。

开发环境:windows10 + pycharm

所需要的包为:requests、peewee、time、random、lxml、qqbot

首先在pycharm中新建一个工程,在工程下面创建python文件。先建立一个数据库用来保存爬取到的祝福语内容,以便自动回复的时候能够随机从数据库中提取:

#coding : UTF-8

#peewee是一种轻量级的ORM框架
#ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。
import peewee

#创建数据库
db = peewee.SqliteDatabase("text.db")

#创建数据表
class Text(peewee.Model) :
    #定义字段
    text = peewee.TextField()

    class Meta :
        #库表关联
        database = db

if __name__ == "__main__" :
    Text().create_table()

运行上面的程序,在项目下会出现一个.db的文件,就是创建的数据库,可以自行用数据库工具打开,这里就不演示了。然后要做的就是从祝福语网站上爬取祝福语,祝福语的网站为:

http://www.aizhufu.cn/duanxinku/column/77/1.html

爬取祝福语具体的就不用解释了,以前写了好多爬虫,爬取网页内容的也有,如果有不清楚的可以看看以前的博客。下面附上爬取祝福语的具体代码以及部分代码的解释:

#coding : UTF-8

import requests
from lxml import etree
from models import Text

url_list = []
for i in range(1,11) :
    urls = "http://www.aizhufu.cn/duanxinku/column/77/" + str(i) + ".html"
    url_list.append(urls)

headers = {
    "Upgrade-Insecure-Requests" : "1",
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36",
}

for url in url_list :

    res = requests.get(url=url, headers=headers)

    res.encoding = "UTF-8"

    html = etree.HTML(res.text)

    text_list = html.xpath("//ul[@class='list']/li/span[2]/text()")

    for text in text_list :
        if(text != "内容"):
            #实例化数据库模型
            t = Text()
            #字段赋值
            t.text = text
            #保存字段
            t.save()
            print(text)
        #这里只是测试是否爬取到祝福语内容
        print()

然后查看数据库是否已经保存爬取到的祝福语(这里只爬取了100条作为实验),数据库如下图所示:

 这就完成了祝福语的爬取,接下来就是用qqbot来将消息发送出去。qqbot是采用的smart qq机制,也就是网页版QQ。

最后附上自动回消息的部分,只需要将上述几个部分放到一个工程里即可测试,有兴趣的可以尝试一下下。

#coding : UTF-8

import qqbot
import random
import time
from models import Text

#首先查询数据库
messages = Text.select()
#创建一个消息列表
text_list = []
#将数据库的消息放到列表中
for message in messages :

    text_list.append(message.text)

@qqbot.QQBotSlot
def onQQMessage(bot,contact,member,content) :

    #当内容非空的时候,回复消息
    if(content != ""):
        
        #随机从列表中取出一条祝福语
        sendData = random.choice(text_list)
        #将祝福语发送给那个给你发消息的人
        bot.SendTo(contact,sendData)
        time.sleep(0.5)

if __name__ == "__main__" :
    qqbot.RunBot()