系列文章目录

基础:requests的基本使用:QQ机器人基础  传送门

pythonQQ机器人系列:使用requests实现QQ机器人聊天

pythonQQ机器人系列:使用requests实现QQ机器人聊天(1-0国庆特更)传送门


目录

系列文章目录

前言

一、request库和go-cqhttp框架

二、使用步骤

1.引入库

三.源代码

四.源代码讲解

1.

2.

3.

4.

5.

6.

7.


前言

更偏向零基础。

通过使用requests进行实现QQ机器人(说白了就是使用爬虫),requests库相对于使用socket库和requests库来说是相对简单的,所以比较适合那些,短时间内socket库学不完的,但是因为socket库没用的原因,相应的会使我们制作QQ机器人有较多的缺点,所以能尽量学socket库就加把劲去学socket。

也建议大家学习一下深度学习之类的,毕竟别人家的机器人,永远没有自己的机器人用起来舒服,所以去学个机器学习,深度学习什么的自己训练一个属于自己的机器人,这里我们使用的是青客云的智能聊天API。

这系列的文章会持续更新也更偏向零基础,当然水的时间会比较长。希望大家多多支持。如有不对的地方请斧正。

此代码及后续代码会持续优化。


一、request库和go-cqhttp框架

对于requests的基本使用可以参考requests基础,且前文讲过的东西后文不再讲解。前文仅讲过:url,headers,text与json的区别,json的键值取值

二、使用步骤

1.引入库

这次我们仅使用requests库以及go-cqhttp这个框架。

先下载requests。

pip install requests

再下载go-cqhttp。

找一个属于自己机器版本的下载即可,下载完后自行运行程序并加载好,360等可能会弹提示,这个是无毒的可以放心。

其他的是不需要改动的,改好后在运行一次go-cqhttp.bat就行了。

这个样就算是启动好了,当然有些可能开了设备锁,这个自行解决就可以了,有些时候扫码弄设备锁会弹链接,复制一下到浏览器打开扫一下就行了。

当然,大家也可能会遇到风控,当然风控是不会封号的,只是限制了你不能用框架了,把QQ号晾几天,水水群就行了。

三.源代码

我就先把代码放上。

import time
import requestsmessage_id_collect = [] #放入获取的消息ID以便进行判断是否有人说话
message_id_collect_again = [] #放入获取的消息ID以便进行判断是否有人说话
message_append = [] #添加获取的内容def res_get_error():#获取最新的消息数据res_get = requests.get(url=url, headers=headers).json()mes_get = res_get["data"]["messages"]for mes_get_append in mes_get:message_append.append(mes_get_append)#print(message_append)def res_separate_mes():mes_get_append = message_append[-1] #最新的消息记录mes_content = mes_get_append["message"] #拿取消息内容mes_content_sender = mes_get_append["sender"]["nickname"] #拿取消息发送者的名字print("获取-----:" + mes_content_sender + ':' + mes_content)  # 检查是否正常API_get_answer(mes_content)def API_get_answer(mes_content):#聊天API的调用,并获取回答urls="http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(mes_content)answer_get = requests.get(url=urls,headers=headers).json()answer_content = answer_get["content"]#获取API回答的内容print("回答:" + answer_content)#检察是否可以正常运行answer_post(answer_content)def answer_post(answer_content):group_id = res_mes_post["group_id"]#群号msg = answer_contenturls = "http://127.0.0.1:5700/send_group_msg?group_id=" + group_id + "&message=" + msg#print(urls)answer_post_use = requests.post(url=urls,headers=headers).json() #发送消息#print(answer_post_use)print("已回答")answer_post_again()def answer_post_again():#发消息前的消息IDres_get_first = message_append[-1]res_mes_id = res_get_first["message_id"]message_id_collect.append(res_mes_id)nums = message_id_collect[-1]#print(nums)return nums #返回nums以便进行对比def answer_post_again_check():#发消息后的消息IDres_get_again = message_append[-2]res_mes_id_again = res_get_again["message_id"]message_id_collect_again.append(res_mes_id_again)numss = message_id_collect_again[-1]#print(numss)return numss  # 返回nums以便进行对比if __name__ == '__main__':res_mes_post = {"instruction_message": "message_seq", "group_id": "736038975", "message_id": ""}message_group_id = res_mes_post["group_id"]url = "http://127.0.0.1:5700/get_group_msg_history?group_id=" + message_group_idheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}res = requests.get(url=url, headers=headers).json()# print(res)#检查while True:res_get_error()answer_post_again()n = answer_post_again()#print(message_id_collect)res_separate_mes()res_get_error()time.sleep(1)while True:res_get_error()answer_post_again_check()m = answer_post_again_check()time.sleep(1)#print(message_id_collect_again)if n == m:print("无消息")time.sleep(3)passelse:print("有消息")break

四.源代码讲解

1.

因为配置的原因。

我们就复制url去网页打开就可以。

接下来就是正常的引入使用的库和爬虫需要的请求头等。

####上面import time
import requests
message_id_collect = [] #放入发消息前的消息ID
message_id_collect_again = [] #放入发消息后的消息ID以便进行判断是否有人说话
message_append = [] #添加获取的内容####下面if __name__ == '__main__':res_mes_post = {"instruction_message": "message_seq", "group_id": "736038975", "message_id": ""}message_group_id = res_mes_post["group_id"]url = "http://127.0.0.1:5700/get_group_msg_history?group_id=" + message_group_idheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}res = requests.get(url=url, headers=headers).json()# print(res)#检查

因为没有使用socket的原因,加上go-cqhttp的指令我没找到其他的获取最新消息的指令,我就只能使用获取历史消息的指令,这条指令是会获取最近的18或19条消息,因为我们没办法确定到底是18条还是19条,所以只能创建一个空的列表,从列表里拿取消息,这样就容易了许多。

讲一下这里的url怎么用,终结点就是http://127.0.0.1:5700,后面必加的内容比如说我们的获取群历史消息指令的一部分,就是http://127.0.0.1:5700/get_group_msg_history,好了,这样的话也得知道QQ群的账号吧,那么参数怎么写呢?这样的话就需要“?”来帮忙了,当然必须是英文输入法下的问号否则指令是错的,然后就是我们整体的获取群历史消息的指令了,

http://127.0.0.1:5700/get_group_msg_history?group_id=自己的群号,然后对于同等级的参数就使用“&”来实现,就像下面源代码讲解的第五部分的url:

http://127.0.0.1:5700/send_group_msg?group_id=群号&message=内容 。

看一下运行结果,当然你得把注释符号去掉。

2.

def res_get_error():#获取最新的消息数据ressss = requests.get(url=url, headers=headers).json()mes_get = ressss["data"]["messages"]for mes_get_append in mes_get:message_append.append(mes_get_append)#print(message_append)

通过这几行代码获取我们的群历史消息,并通过键值取值获取主内容,再通过for...in...循环获取主内容里面的消息,并添加到空列表里。

下面是运行结果。

以下是运行代码,仅运行时使用,不要加到源代码中。

#import time
import requestsurl = "http://127.0.0.1:5700/get_group_msg_history?group_id=736038975"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
res = requests.get(url=url,headers=headers).json()
#print(res)#检查#message_id_collect = [] #放入获取的消息ID以便进行判断是否有人说话
#message_id_collect_again = [] #放入获取的消息ID以便进行判断是否有人说话
message_append = [] #添加获取的内容def res_get_error():#获取最新的消息数据res_get = requests.get(url=url, headers=headers).json()mes_get = res_get["data"]["messages"]for mes_get_append in mes_get:message_append.append(mes_get_append)
res_get_error()print(message_append)

与网页中拿取的信息一样,只不过加在了列表里。

3.

def res_separate_mes():mes_get_append = message_append[-1] #最新的消息记录mes_content = mes_get_append["message"] #拿取消息内容mes_content_sender = mes_get_append["sender"]["nickname"] #拿取消息发送者的名字print("获取-----:" + mes_content_sender + ':' + mes_content)  # 检查是否正常API_get_answer(mes_content)

因为我们已经把想要获取的消息放在列表里,所以我们直接就在列表里拿取即可,我们想要的最近的消息是在最后一个,我们可以用切片的方法拿取。

我们就先用  message_append[-1]  拿取最后一个的信息,怎么样算一个呢?

这个样算一个,因为我们的网页中也是这样的信息,这就算是一个,所以我们切片也是拿的最后一个。

下面是获取消息的网页结构。

所以我们就用键值取值的方法进行获取发送的内容与发送消息的人,因为发送的消息需要再次发送到API中调用,我们就需要使用  API_get_answer(mes_content)  进行调用下面的函数,下面类似的函数调用不再说明。

我们运行看一下,下面是运行代码,及运行结果。

import requestsurl = "http://127.0.0.1:5700/get_group_msg_history?group_id=736038975"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
res = requests.get(url=url,headers=headers).json()
#print(res)#检查#message_id_collect = [] #放入获取的消息ID以便进行判断是否有人说话
#message_id_collect_again = [] #放入获取的消息ID以便进行判断是否有人说话
message_append = [] #添加获取的内容def res_get_error():#获取最新的消息数据res_get = requests.get(url=url, headers=headers).json()mes_get = res_get["data"]["messages"]for mes_get_append in mes_get:message_append.append(mes_get_append)res_separate_mes()
def res_separate_mes():mes_get_append = message_append[-1] #最新的消息记录mes_content = mes_get_append["message"] #拿取消息内容mes_content_sender = mes_get_append["sender"]["nickname"] #拿取消息发送者的名字print("获取-----:" + mes_content_sender + ':' + mes_content)  # 检查是否正常if __name__ == '__main__':res_get_error()

4.

def API_get_answer(mes_content):#聊天API的调用,并获取回答urls="http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(mes_content)answer_get = requests.get(url=urls,headers=headers).json()answer_content = answer_get["content"]#获取API回答的内容print("回答:" + answer_content)#检察是否可以正常运行answer_post(answer_content)

这里我们用的是青客云的API,暂时也找不到多么好的API了,所以就用这个了。

 这就是url的来源,所以我们调用的时候只需要改一下后面的你好就行了。

我们就使用  .format()  来改就行了,改的地方就是url中放大括号的地方了,  mes_content  就是参数,也就是我们获取的消息的内容。因为它的请求也是url,所以我们可以到网页中打开看一下到底什么样子。

这就看见了回答的消息内容,这样一看,也挺简单的,就两个东西,result和content,看来这个content就是我们要的东西了,我们就通过键值取值获取它即可,不过我们只获取消息可不行,还得让他把消息发送过去才行,所以我们就在写一个函数,顺便在这个地方的最后调用一下这个函数。

我们运行看一下,下面是运行代码,及运行结果。

import requestsurl = "http://127.0.0.1:5700/get_group_msg_history?group_id=736038975"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
res = requests.get(url=url,headers=headers).json()
#print(res)#检查#message_id_collect = [] #放入获取的消息ID以便进行判断是否有人说话
#message_id_collect_again = [] #放入获取的消息ID以便进行判断是否有人说话
message_append = [] #添加获取的内容def res_get_error():#获取最新的消息数据res_get = requests.get(url=url, headers=headers).json()mes_get = res_get["data"]["messages"]for mes_get_append in mes_get:message_append.append(mes_get_append)res_separate_mes()
def res_separate_mes():mes_get_append = message_append[-1] #最新的消息记录mes_content = mes_get_append["message"] #拿取消息内容mes_content_sender = mes_get_append["sender"]["nickname"] #拿取消息发送者的名字print("获取-----:" + mes_content_sender + ':' + mes_content)  # 检查是否正常API_get_answer(mes_content)def API_get_answer(mes_content):#聊天API的调用,并获取回答urls="http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(mes_content)answer_get = requests.get(url=urls,headers=headers).json()answer_content = answer_get["content"]#获取API回答的内容print("回答:" + answer_content)#检察是否可以正常运行if __name__ == '__main__':res_get_error()

5.

def answer_post(answer_content):group_id = res_mes_post["group_id"]#群号msg = answer_contenturls = "http://127.0.0.1:5700/send_group_msg?group_id=" + group_id + "&message=" + msg#print(urls)answer_post_use = requests.post(url=urls,headers=headers).json() #发送消息#print(answer_post_use)print("已回答")

因为刚刚只是获取的回答的内容,我们还需要把这些回答的消息回答到QQ上。

所以我们就使用  post  来向网页提交,通过这样一个爬虫来实现对于QQ上的消息回复,我们结合go-cqhttp的指令来组成url

当然这里的  res_mes_post  也是为了剩下在别处换群号的时间,当然这些以后都会优化的。这里也说一下大括号里面也是可以键值取值的

下面是我们的消息内容,也就是回答消息之前。

这是回答之后的。

下面是运行代码及运行结果。


import requestsmessage_id_collect = [] #放入获取的消息ID以便进行判断是否有人说话
message_id_collect_again = [] #放入获取的消息ID以便进行判断是否有人说话
message_append = [] #添加获取的内容def res_get_error():#获取最新的消息数据res_get = requests.get(url=url, headers=headers).json()mes_get = res_get["data"]["messages"]for mes_get_append in mes_get:message_append.append(mes_get_append)res_separate_mes()
def res_separate_mes():mes_get_append = message_append[-1] #最新的消息记录mes_content = mes_get_append["message"] #拿取消息内容mes_content_sender = mes_get_append["sender"]["nickname"] #拿取消息发送者的名字print("获取-----:" + mes_content_sender + ':' + mes_content)  # 检查是否正常API_get_answer(mes_content)def API_get_answer(mes_content):#聊天API的调用,并获取回答urls="http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(mes_content)answer_get = requests.get(url=urls,headers=headers).json()answer_content = answer_get["content"]#获取API回答的内容print("回答:" + answer_content)#检察是否可以正常运行answer_post(answer_content)def answer_post(answer_content):group_id = res_mes_post["group_id"]#群号msg = answer_contenturls = "http://127.0.0.1:5700/send_group_msg?group_id=" + group_id + "&message=" + msg#print(urls)answer_post_use = requests.post(url=urls,headers=headers).json() #发送消息#print(answer_post_use)print("已回答")if __name__ == '__main__':res_mes_post = {"instruction_message": "message_seq", "group_id": "736038975", "message_id": ""}message_group_id = res_mes_post["group_id"]url = "http://127.0.0.1:5700/get_group_msg_history?group_id=" + message_group_idheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}res = requests.get(url=url, headers=headers).json()res_get_error()

6.

def answer_post_again():#发消息前的消息IDres_get_first = message_append[-1]res_mes_id = res_get_first["message_id"]message_id_collect.append(res_mes_id)nums = message_id_collect[-1]#print(nums)return nums #返回nums以便进行对比def answer_post_again_check():#发消息后的消息IDres_get_again = message_append[-2]res_mes_id_again = res_get_again["message_id"]message_id_collect_again.append(res_mes_id_again)numss = message_id_collect_again[-1]#print(numss)return numss  # 返回nums以便进行对比

因为只使用了requests,所以就导致判断是否有新消息成了麻烦的问题,加上我们的持续的回复是会用到  while True  的,下面会有(这个代码的意思是一直循环除非用  break  打破这个循环),所以总不能让机器人回完消息后一直回复自己的消息,我们就需要判断一下是否有新消息,也尽量避免机器人回复自己的消息,造成一个恶性循环。

因为我们一开始就把内容爬取并添加到了  message_append  这个列表里,所以我们就从这里面获取消息的ID,因为刚才我们只是把消息获取并发送,也没有再次爬取消息添加到列表里,所以列表的最后一个就是你机器人回复的消息,所以我们就拿取这个消息的ID,并通过  return  这个语法,把获取的消息ID返回。这是第一个函数。

第二个函数和第一个函数差不多,这个函数只不过拿取的消息是倒数第二个,而不是倒数第一个,因为机器人发消息后刚才回复的消息就会由倒数第一个消息变成倒数第二个消息,所以我们要拿取第二个的消息的ID。如下图。

回答前,最新的消息倒一。

回答后,刚才的消息为倒二。

7.

if __name__ == '__main__':res_mes_post = {"instruction_message": "message_seq", "group_id": "736038975", "message_id": ""}message_group_id = res_mes_post["group_id"]url = "http://127.0.0.1:5700/get_group_msg_history?group_id=" + message_group_idheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}res = requests.get(url=url, headers=headers).json()# print(res)#检查while True:res_get_error()answer_post_again()n = answer_post_again()#print(message_id_collect)res_separate_mes()res_get_error()time.sleep(1)while True:res_get_error()answer_post_again_check()m = answer_post_again_check()time.sleep(1)#print(message_id_collect_again)if n == m:print("无消息")time.sleep(3)passelse:print("有消息")break

首先,调用  res_get_error()  这个函数,通过这个函数进行群历史消息,再通过调用answer_post_again()  获取发消息前的要回复的消息的ID,再调用  res_separate_mes()  这个函数进行获取消息,获取机器人的回答以及回复消息,再调用  res_get_error()  这个函数把发消息后的内容爬取,之后我们就需要进行判断是否有人发送新的消息,刚才上面也说了,机器人回复后,刚刚被回复的消息就成了倒二,这样第一个函数获取的ID就等于第二个函数获取的ID,我们通过一直循环获取倒二的消息ID,如果有人发消息,机器人回复的消息就变成了倒二,他的消息ID就不等于刚才回复的消息的ID了,就证明有新的消息,这个时候,我们就用  break  打破这个循环,让他再次执行回复。


总结

单纯一个requests是挺麻烦的,尽量也去学习一下socket库,这样便能省下不少的代码,也能节约时间,相比之前,只一个requests,不仅耗时,而且因为爬虫的原因也会有许多的麻烦。

第一次代码优化 (征集代码修改意见)

import requests
import timemessage_id_collect = [] #放入获取的消息ID以便进行判断是否有人说话
message_id_collect_again = [] #放入获取的消息ID以便进行判断是否有人说话
message_append = [] #添加获取的全部内容class res_mess_html(): #获取网页的jsondef __init__(self,url,headers):self.url = urlself.headers = headersdef res_get_html(self): #获取最新的消息数据res = requests.get(url=self.url,headers=self.headers).json() #获取数据jsonmes_list = res["data"]["messages"] #键值取值for res_get_mes in mes_list: #循环获取全部内容#res_get = res_get_mes.replace(r'')message_append.append(res_get_mes)#print(message_append)return Noneclass res_mess_post(): #回答消息def res_separate_mes(self):mes_get_append = message_append[-1]  # 最新的消息记录mes_content = mes_get_append["message"]  # 拿取消息内容mes_content_sender = mes_get_append["sender"]["nickname"]  # 拿取消息发送者的名字print(">>>>>>>:获取:" + mes_content_sender + ':' + mes_content)  # 检查是否正常return mes_contentdef API_get_answer(self,mes_content):  # 聊天API的调用,并获取回答if mes_content == "菜单": #回答消息的第一优先级msg = "暂时只能聊天哦"else: #回答消息的第二优先级urls = "http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(mes_content)answer_get = requests.get(url=urls, headers=headers).json()answer_content = answer_get["content"]  # 获取API回答的内容print(">>>>>>>:回答:" + answer_content)  # 检察是否可以正常运行msg = answer_contentreturn msgdef post_url(self,msg): #进行回复group_id = res_mes_post["group_id"]  # 群号urls = "http://127.0.0.1:5700/send_group_msg?group_id=" + group_id + "&message=" + msganswer_post_use = requests.post(url=urls, headers=headers).json()  # 发送消息print(">>>>>>>:已回答")
class answer_check():def answer_post_again(self):  # 发消息前的消息IDres_get_first = message_append[-1]res_mes_id = res_get_first["message_id"]message_id_collect.append(res_mes_id)nums = message_id_collect[-1]# print(nums)return nums  # 返回nums以便进行对比def answer_post_again_check(self):  # 发消息后的消息IDres_get_again = message_append[-2]res_mes_id_again = res_get_again["message_id"]message_id_collect_again.append(res_mes_id_again)numss = message_id_collect_again[-1]# print(numss)return numss  # 返回nums以便进行对比class list_clear():def list_clears(self):  # 清除列表中的所有元素message_append.clear()message_id_collect.clear()message_id_collect_again.clear()def get_F(url,headers):while True:# 实例化类res_post_mes = res_mess_html(url=url, headers=headers)res_mess_posts = res_mess_post()# 调用API实现机器人回复mes_content = res_mess_posts.res_separate_mes()msg = res_mess_posts.API_get_answer(mes_content=mes_content)return msg
def get_post(url,headers):while True:#实例化类res_post_mes = res_mess_html(url=url, headers=headers)res_mess_posts = res_mess_post()res_answer_check = answer_check()#获取发消息前的消息IDres_post_mes.res_get_html()n = res_answer_check.answer_post_again()#调用API实现机器人回复mes_content = res_mess_posts.res_separate_mes()msg = res_mess_posts.API_get_answer(mes_content=mes_content)post = res_mess_posts.post_url(msg=msg)#刷新页面准备循环拿取消息IDres_post_mes.res_get_html()time.sleep(1)while True:#循环获取最新消息的IDres_post_mes.res_get_html()m = res_answer_check.answer_post_again_check()time.sleep(1)# print(message_id_collect_again)if n == m: #比对消息ID验证是否有新消息print(">>>>>>>:无消息")s = list_clear()s.list_clears()#清除列表中的所有元素time.sleep(3)# print(message_append,message_id_collect,mes_content)passelse:print(">>>>>>>:有消息")s= list_clear()s.list_clears()# print(message_append, message_id_collect, mes_content)break
if __name__ == '__main__':res_mes_post = {"instruction_message": "message_seq", "group_id": "736038975", "message_id": ""}message_group_id = res_mes_post["group_id"]url = "http://127.0.0.1:5700/get_group_msg_history?group_id=" + message_group_idheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}get_post(url=url,headers=headers)

在前文的基础上,仅增加了一级回复的功能,这样就可以自行添加一些功能

除全局增加为类后,此次改动仅有一处,增加一级回复的部分以下是改动处的代码(仅文章的部分,如需改动建议全文复制粘贴)。

def API_get_answer(self,mes_content):  # 聊天API的调用,并获取回答if mes_content == "菜单": #回答消息的第一优先级msg = "暂时只能聊天哦"else: #回答消息的第二优先级urls = "http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(mes_content)answer_get = requests.get(url=urls, headers=headers).json()answer_content = answer_get["content"]  # 获取API回答的内容print(">>>>>>>:回答:" + answer_content)  # 检察是否可以正常运行msg = answer_contentreturn msg

第二次代码修改(小改)

import requests
import time'''
message_id_collect = [] #放入获取的消息ID以便进行判断是否有人说话
message_id_collect_again = [] #放入获取的消息ID以便进行判断是否有人说话
'''
message_append = []  # 添加获取的全部内容
self_qq = 2712065523class res_mess_html():  # 获取网页的jsondef __init__(self, url, headers):self.url = urlself.headers = headersdef res_get_html(self):  # 获取最新的消息数据res = requests.get(url=self.url, headers=self.headers).json()  # 获取数据jsonmes_list = res["data"]["messages"]  # 键值取值for res_get_mes in mes_list:  # 循环获取全部内容# res_get = res_get_mes.replace(r'')message_append.append(res_get_mes)# print(message_append)return Noneclass res_mess_post():  # 回答消息def res_separate_mes(self):mes_get_append = message_append[-1]  # 最新的消息记录mes_content = mes_get_append["message"]  # 拿取消息内容mes_content_sender = mes_get_append["sender"]["nickname"]  # 拿取消息发送者的名字print(">>>>>>>:获取:" + mes_content_sender + ':' + mes_content)  # 检查是否正常return mes_contentdef API_get_answer(self, mes_content):  # 聊天API的调用,并获取回答if mes_content == "菜单":  # 回答消息的第一优先级msg = "暂时只能聊天哦"'''group_id = res_mes_post["group_id"]  # 群号urls = "http://127.0.0.1:5700/send_group_msg?group_id=" + group_id + "&message=" + msganswer_post_use = requests.post(url=urls, headers=headers).json()  # 发送消息# print(answer_post_use)'''else:  # 回答消息的第二优先级urls = "http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(mes_content)answer_get = requests.get(url=urls, headers=headers).json()answer_content = answer_get["content"]  # 获取API回答的内容print(">>>>>>>:回答:" + answer_content)  # 检察是否可以正常运行msg = answer_content# instruction = "send_group_msg" #发送消息的go-cqhttp的指令# print(instruction)# instruction_group = 'group_id' #发送消息的类型:群聊'''group_id = res_mes_post["group_id"]  # 群号urls = "http://127.0.0.1:5700/send_group_msg?group_id=" + group_id + "&message=" + msg# print(urls)answer_post_use = requests.post(url=urls, headers=headers).json()  # 发送消息# print(answer_post_use)print(">>>>>>>:已回答")'''return msgdef post_url(self, msg):  # 进行回复group_id = res_mes_post["group_id"]  # 群号urls = "http://127.0.0.1:5700/send_group_msg?group_id=" + group_id + "&message=" + msganswer_post_use = requests.post(url=urls, headers=headers).json()  # 发送消息print(">>>>>>>:已回答")class answer_check():'''def answer_post_again(self):  # 发消息前的消息IDres_get_first = message_append[-1]res_mes_id = res_get_first["message_id"]message_id_collect.append(res_mes_id)nums = message_id_collect[-1]# print(nums)return nums  # 返回nums以便进行对比def answer_post_again_check(self):  # 发消息后的消息IDres_get_again = message_append[-2]res_mes_id_again = res_get_again["message_id"]message_id_collect_again.append(res_mes_id_again)numss = message_id_collect_again[-1]# print(numss)return numss  # 返回nums以便进行对比'''def answer_post_qq(self):  # 获取发送者的QQ号poster_qq = message_append[-1]["sender"]["user_id"]
'''     print(poster_qq)if self_qq == poster_qq:print('1')else:print('2')
'''return poster_qq  # 对比自身QQ号class list_clear():def list_clears(self):  # 清除列表中的所有元素message_append.clear()return None
'''  message_id_collect.clear()message_id_collect_again.clear()
''''''
def get_F(url, headers):while True:# 实例化类res_post_mes = res_mess_html(url=url, headers=headers)res_mess_posts = res_mess_post()# 调用API实现机器人回复mes_content = res_mess_posts.res_separate_mes()msg = res_mess_posts.API_get_answer(mes_content=mes_content)return msg
'''def get_post(url, headers):while True:# 实例化类res_post_mes = res_mess_html(url=url, headers=headers)res_mess_posts = res_mess_post()res_answer_check = answer_check()# 获取发消息前的消息IDres_post_mes.res_get_html()# n = res_answer_check.answer_post_again()qq = res_answer_check.answer_post_qq()if self_qq == qq:print(">>>>>>>:无消息")s = list_clear()clear = s.list_clears()# 清除列表中的所有元素time.sleep(3)passelse:print(">>>>>>>:有消息")# 调用API实现机器人回复mes_content = res_mess_posts.res_separate_mes()msg = res_mess_posts.API_get_answer(mes_content=mes_content)post = res_mess_posts.post_url(msg=msg)# 刷新页面准备循环拿取消息IDres_post_mes.res_get_html()time.sleep(1)s = list_clear()clear = s.list_clears()# print(message_append, message_id_collect, mes_content)if __name__ == '__main__':res_mes_post = {"instruction_message": "message_seq", "group_id": "736038975"}message_group_id = res_mes_post["group_id"]url = "http://127.0.0.1:5700/get_group_msg_history?group_id=" + message_group_idheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}get_post(url=url, headers=headers)

此次的改动处:最后的逻辑回复的代码以及前面的回复检查的代码,此次改动只为解决启动后会有一次回复的错误。

class answer_check():
'''def answer_post_again(self):  # 发消息前的消息IDres_get_first = message_append[-1]res_mes_id = res_get_first["message_id"]message_id_collect.append(res_mes_id)nums = message_id_collect[-1]return nums  # 返回nums以便进行对比def answer_post_again_check(self):  # 发消息后的消息IDres_get_again = message_append[-2]res_mes_id_again = res_get_again["message_id"]message_id_collect_again.append(res_mes_id_again)numss = message_id_collect_again[-1]return numss  # 返回nums以便进行对比
'''def answer_post_qq(self):#获取发送者的QQ号poster_qq= message_append[-1]["sender"]["user_id"]return poster_qq #对比自身QQ号

这是此次改动的第一处,当然前面也有一点,不过仅仅是将集合删除。这处的代码通俗易懂,仅仅改为获取发送者的QQ号,关于为什么不用消息的ID值,毕竟QQ号的获取与对比,相比于消息 的ID值是比较简单的,也避免了消息不是18条就是19条,而导致代码错误的尴尬,毕竟我太菜了。

def get_post(url, headers):while True:# 实例化类res_post_mes = res_mess_html(url=url, headers=headers)res_mess_posts = res_mess_post()res_answer_check = answer_check()# 获取发消息前的消息IDres_post_mes.res_get_html()# n = res_answer_check.answer_post_again()qq = res_answer_check.answer_post_qq()if self_qq == qq:print(">>>>>>>:无消息")s = list_clear()clear = s.list_clears()# 清除列表中的所有元素time.sleep(3)passelse:print(">>>>>>>:有消息")# 调用API实现机器人回复mes_content = res_mess_posts.res_separate_mes()msg = res_mess_posts.API_get_answer(mes_content=mes_content)post = res_mess_posts.post_url(msg=msg)# 刷新页面准备循环拿取消息IDres_post_mes.res_get_html()time.sleep(1)s = list_clear()clear = s.list_clears()# print(message_append, message_id_collect, mes_content)

此处的代码改动:将机器人的回复以及刷新页面放在了IF语句的else中,改代码的时候才发现,启动这个机器人总是回复第一句话的原因主要就是把机器人的回复放的靠前了,有点离谱,现在也才发现,我写代码的时候,脑子根本不转。

pythonQQ机器人系列:使用requests实现QQ机器人聊天(0-2)相关推荐

  1. pythonQQ机器人系列:使用requests实现QQ机器人聊天(1-0)

    系列文章目录 基础:requests的基本使用:QQ机器人基础  传送门 pythonQQ机器人系列:使用requests实现QQ机器人聊天(0-2) 传送门 pythonQQ机器人系列:使用requ ...

  2. ROS系统MoveIt玩转双臂机器人系列(一)--ROS机器人建模

    ROS系统MoveIt玩转双臂机器人系列(一)--ROS机器人建模 注:本篇博文全部源码下载地址为:Git Repo. 1. 下载到本地后解压到当前文件夹然后运行:catkin_make 编译. 2. ...

  3. 第十代晨风机器人_第十代QQ机器人下载_第十代QQ机器人 v20180102 官方版 - 西西下载...

    官方介绍: 第十代QQ机器人是对QQ进行功能扩展的程序,在第十代机器人软件登录QQ号码后可以按照预先设定的一些指令自动完成某些任务,例如与好友进行交流,执行一些数据交互任务,实现QQ与网站的交互,常用 ...

  4. 晨风机器人安卓版_晨风qq机器人

    手机qq自动聊天机器人,晨风qq机器人手机版发布了,目前仅有导入自动回复.自动启用网络词库.支持群聊.私聊.群临时会话等简单功能,实现了与qq好友聊天以及qq群消息.qq群私聊的自动提取,自动回复,除 ...

  5. pythonQQ机器人系列(基于go-cqhttp):使用requests和socket实现QQ机器人聊天(2-0)

    系列文章目录 基础:requests的基本使用:QQ机器人基础  传送门 pythonQQ机器人系列:使用requests实现QQ机器人聊天(0-2) 传送门 pythonQQ机器人系列:使用requ ...

  6. Ubuntu16.04安装QQ机器人

    Ubuntu安装QQ机器人 看了看现在QQ机器人似乎只有酷Q机器人有Docker可以在linux上运行了 那就k开始装酷Q机器人,资源占用也不是很大,大概占用180M内存吧 安装酷Q HTTP 首先安 ...

  7. 2023最新可用QQ机器人框架整理

    排名无先后顺序,不定时更新,欢迎留言补充 1.qy机器人 官网:www.qvbot.com 稳定.高效.免费的QQ机器人框架.支持多种语言二次开发可现实群管.聊天.便民服务等多种功能.功能更强大,无限 ...

  8. 一个基于MFC的QQ机器人框架

    GitHub项目地址:https://github.com/HarmoniaLeo/MFC-QQbot 0x00 这是什么? 欢迎使用本QQ机器人开发框架(如果有人会用的话).本框架是主要使用MFC中 ...

  9. PHP开发基于Mirai的QQ机器人

    博客和更新地址:PHP开发基于Mirai的QQ机器人 前言 在完成配置开源安卓QQ协议库Mirai后,便可使用已有开源项目来部署自己的QQ机器人,但自行开发显然更符合需求.借助mirai-api-ht ...

  10. E-puck2机器人系列教程

    E-puck2机器人系列教程 目录 1.E-puck2机器人系列教程-1.开关机 2.E-puck2机器人系列教程-2.LED代表的含义 3.E-puck2机器人系列教程-3.USB调试 4.E-pu ...

最新文章

  1. Linux下glibc内存管理
  2. 如何只使用标签来构建一个简单的电影推荐系统
  3. There is no Action mapped for namespace [/]
  4. CSS中box-sizing: border-box;的作用
  5. 爷青结,Microsoft 放弃 Windows 95 时代的图标
  6. 加密流量分类任务的深度学习方法(一般框架总结)
  7. 夜深人静写算法(八)- 朴素贝叶斯分类
  8. 休假管理系统的问题描述与词汇表
  9. Android中的接口的使用举例
  10. 什么是DNS,DNS的作用是什么?
  11. 从零搭建移动H5开发项目实战
  12. Html 后端了解基础
  13. 数据结构1800试题(第四章)
  14. 洛谷 P1085 不高兴的津津 C语言
  15. 数据恢复软件:FonePaw Data Recovery mac中文版
  16. 用AI“狙杀”威胁地球的天体 这个团队花5万美元做到了
  17. Microsoft Dynamics AX发展历史
  18. 云服务器搭建MQTT消息代理EMQX
  19. tp90和tp99是指什么性能指标
  20. 反编译c#的DLL工具,学习的好东西呀

热门文章

  1. 蝙蝠算法c语言,求解0-1背包问题的二进制蝙蝠算法
  2. 牛逼,70行代码开启微信分身术,让你无限开启多个微信
  3. NOIP2020退役记
  4. 【python】速查手册(基础笔记) - 人生苦短,我用python
  5. 打印机服务器没有响应 请检查设置,打印机服务无法启动的解决办法
  6. c语言头文件和函数库,C语言的头文件和库文件(函数库)
  7. html打包成APP,h5打包成apk,浅显易懂!
  8. 一分钟学会神经网络3——图解深度学习原理(有这篇博客就够了)
  9. jQuery WEUI
  10. air文件打包成exe