pythonQQ机器人系列:使用requests实现QQ机器人聊天(0-2)
系列文章目錄
基礎(chǔ):requests的基本使用:QQ機(jī)器人基礎(chǔ)??傳送門
pythonQQ機(jī)器人系列:使用requests實(shí)現(xiàn)QQ機(jī)器人聊天
pythonQQ機(jī)器人系列:使用requests實(shí)現(xiàn)QQ機(jī)器人聊天(1-0國慶特更)傳送門
目錄
系列文章目錄
前言
一、request庫和go-cqhttp框架
二、使用步驟
1.引入庫
三.源代碼
四.源代碼講解
1.
2.
3.
4.
5.
6.?
7.
前言
更偏向零基礎(chǔ)。
通過使用requests進(jìn)行實(shí)現(xiàn)QQ機(jī)器人(說白了就是使用爬蟲),requests庫相對于使用socket庫和requests庫來說是相對簡單的,所以比較適合那些,短時間內(nèi)socket庫學(xué)不完的,但是因?yàn)閟ocket庫沒用的原因,相應(yīng)的會使我們制作QQ機(jī)器人有較多的缺點(diǎn),所以能盡量學(xué)socket庫就加把勁去學(xué)socket。
也建議大家學(xué)習(xí)一下深度學(xué)習(xí)之類的,畢竟別人家的機(jī)器人,永遠(yuǎn)沒有自己的機(jī)器人用起來舒服,所以去學(xué)個機(jī)器學(xué)習(xí),深度學(xué)習(xí)什么的自己訓(xùn)練一個屬于自己的機(jī)器人,這里我們使用的是青客云的智能聊天API。
這系列的文章會持續(xù)更新也更偏向零基礎(chǔ),當(dāng)然水的時間會比較長。希望大家多多支持。如有不對的地方請斧正。
此代碼及后續(xù)代碼會持續(xù)優(yōu)化。
一、request庫和go-cqhttp框架
對于requests的基本使用可以參考requests基礎(chǔ),且前文講過的東西后文不再講解。前文僅講過:url,headers,text與json的區(qū)別,json的鍵值取值。
二、使用步驟
1.引入庫
這次我們僅使用requests庫以及go-cqhttp這個框架。
先下載requests。
pip install requests?再下載go-cqhttp。
?找一個屬于自己機(jī)器版本的下載即可,下載完后自行運(yùn)行程序并加載好,360等可能會彈提示,這個是無毒的可以放心。
?
?
?其他的是不需要改動的,改好后在運(yùn)行一次go-cqhttp.bat就行了。
?這個樣就算是啟動好了,當(dāng)然有些可能開了設(shè)備鎖,這個自行解決就可以了,有些時候掃碼弄設(shè)備鎖會彈鏈接,復(fù)制一下到瀏覽器打開掃一下就行了。
當(dāng)然,大家也可能會遇到風(fēng)控,當(dāng)然風(fēng)控是不會封號的,只是限制了你不能用框架了,把QQ號晾幾天,水水群就行了。
三.源代碼
我就先把代碼放上。
import time import requestsmessage_id_collect = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 message_id_collect_again = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 message_append = [] #添加獲取的內(nèi)容def res_get_error():#獲取最新的消息數(shù)據(jù)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"] #拿取消息內(nèi)容mes_content_sender = mes_get_append["sender"]["nickname"] #拿取消息發(fā)送者的名字print("獲取-----:" + mes_content_sender + ':' + mes_content) # 檢查是否正常API_get_answer(mes_content)def API_get_answer(mes_content):#聊天API的調(diào)用,并獲取回答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回答的內(nèi)容print("回答:" + answer_content)#檢察是否可以正常運(yùn)行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() #發(fā)送消息#print(answer_post_use)print("已回答")answer_post_again()def answer_post_again():#發(fā)消息前的消息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以便進(jìn)行對比def answer_post_again_check():#發(fā)消息后的消息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以便進(jìn)行對比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.
因?yàn)榕渲玫脑颉?/p>
我們就復(fù)制url去網(wǎng)頁打開就可以。?
接下來就是正常的引入使用的庫和爬蟲需要的請求頭等。
####上面import time import requests message_id_collect = [] #放入發(fā)消息前的消息ID message_id_collect_again = [] #放入發(fā)消息后的消息ID以便進(jìn)行判斷是否有人說話 message_append = [] #添加獲取的內(nèi)容####下面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)#檢查因?yàn)闆]有使用socket的原因,加上go-cqhttp的指令我沒找到其他的獲取最新消息的指令,我就只能使用獲取歷史消息的指令,這條指令是會獲取最近的18或19條消息,因?yàn)槲覀?strong>沒辦法確定到底是18條還是19條,所以只能創(chuàng)建一個空的列表,從列表里拿取消息,這樣就容易了許多。
?講一下這里的url怎么用,終結(jié)點(diǎn)就是http://127.0.0.1:5700,后面必加的內(nèi)容比如說我們的獲取群歷史消息指令的一部分,就是http://127.0.0.1:5700/get_group_msg_history,好了,這樣的話也得知道QQ群的賬號吧,那么參數(shù)怎么寫呢?這樣的話就需要“?”來幫忙了,當(dāng)然必須是英文輸入法下的問號否則指令是錯的,然后就是我們整體的獲取群歷史消息的指令了,
http://127.0.0.1:5700/get_group_msg_history?group_id=自己的群號,然后對于同等級的參數(shù)就使用“&”來實(shí)現(xiàn),就像下面源代碼講解的第五部分的url:
http://127.0.0.1:5700/send_group_msg?group_id=群號&message=內(nèi)容 。
?看一下運(yùn)行結(jié)果,當(dāng)然你得把注釋符號去掉。
2.
def res_get_error():#獲取最新的消息數(shù)據(jù)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)?通過這幾行代碼獲取我們的群歷史消息,并通過鍵值取值獲取主內(nèi)容,再通過for...in...循環(huán)獲取主內(nèi)容里面的消息,并添加到空列表里。
下面是運(yùn)行結(jié)果。
以下是運(yùn)行代碼,僅運(yùn)行時使用,不要加到源代碼中。
#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以便進(jìn)行判斷是否有人說話 #message_id_collect_again = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 message_append = [] #添加獲取的內(nèi)容def res_get_error():#獲取最新的消息數(shù)據(jù)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)?與網(wǎng)頁中拿取的信息一樣,只不過加在了列表里。
3.
def res_separate_mes():mes_get_append = message_append[-1] #最新的消息記錄mes_content = mes_get_append["message"] #拿取消息內(nèi)容mes_content_sender = mes_get_append["sender"]["nickname"] #拿取消息發(fā)送者的名字print("獲取-----:" + mes_content_sender + ':' + mes_content) # 檢查是否正常API_get_answer(mes_content)?因?yàn)槲覀円呀?jīng)把想要獲取的消息放在列表里,所以我們直接就在列表里拿取即可,我們想要的最近的消息是在最后一個,我們可以用切片的方法拿取。
我們就先用? message_append[-1]? 拿取最后一個的信息,怎么樣算一個呢?
?
這個樣算一個,因?yàn)槲覀兊木W(wǎng)頁中也是這樣的信息,這就算是一個,所以我們切片也是拿的最后一個。
下面是獲取消息的網(wǎng)頁結(jié)構(gòu)。
所以我們就用鍵值取值的方法進(jìn)行獲取發(fā)送的內(nèi)容與發(fā)送消息的人,因?yàn)榘l(fā)送的消息需要再次發(fā)送到API中調(diào)用,我們就需要使用? API_get_answer(mes_content)? 進(jìn)行調(diào)用下面的函數(shù),下面類似的函數(shù)調(diào)用不再說明。?
我們運(yùn)行看一下,下面是運(yùn)行代碼,及運(yùn)行結(jié)果。
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以便進(jìn)行判斷是否有人說話 #message_id_collect_again = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 message_append = [] #添加獲取的內(nèi)容def res_get_error():#獲取最新的消息數(shù)據(jù)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"] #拿取消息內(nèi)容mes_content_sender = mes_get_append["sender"]["nickname"] #拿取消息發(fā)送者的名字print("獲取-----:" + mes_content_sender + ':' + mes_content) # 檢查是否正常if __name__ == '__main__':res_get_error()??
4.
def API_get_answer(mes_content):#聊天API的調(diào)用,并獲取回答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回答的內(nèi)容print("回答:" + answer_content)#檢察是否可以正常運(yùn)行answer_post(answer_content)?這里我們用的是青客云的API,暫時也找不到多么好的API了,所以就用這個了。
?這就是url的來源,所以我們調(diào)用的時候只需要改一下后面的你好就行了。
我們就使用??.format()? 來改就行了,改的地方就是url中放大括號的地方了,? mes_content? 就是參數(shù),也就是我們獲取的消息的內(nèi)容。因?yàn)樗恼埱笠彩莡rl,所以我們可以到網(wǎng)頁中打開看一下到底什么樣子。
這就看見了回答的消息內(nèi)容,這樣一看,也挺簡單的,就兩個東西,result和content,看來這個content就是我們要的東西了,我們就通過鍵值取值獲取它即可,不過我們只獲取消息可不行,還得讓他把消息發(fā)送過去才行,所以我們就在寫一個函數(shù),順便在這個地方的最后調(diào)用一下這個函數(shù)。?
?我們運(yùn)行看一下,下面是運(yùn)行代碼,及運(yùn)行結(jié)果。
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以便進(jìn)行判斷是否有人說話 #message_id_collect_again = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 message_append = [] #添加獲取的內(nèi)容def res_get_error():#獲取最新的消息數(shù)據(jù)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"] #拿取消息內(nèi)容mes_content_sender = mes_get_append["sender"]["nickname"] #拿取消息發(fā)送者的名字print("獲取-----:" + mes_content_sender + ':' + mes_content) # 檢查是否正常API_get_answer(mes_content)def API_get_answer(mes_content):#聊天API的調(diào)用,并獲取回答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回答的內(nèi)容print("回答:" + answer_content)#檢察是否可以正常運(yùn)行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() #發(fā)送消息#print(answer_post_use)print("已回答")因?yàn)閯倓傊皇谦@取的回答的內(nèi)容,我們還需要把這些回答的消息回答到QQ上。
所以我們就使用? post? 來向網(wǎng)頁提交,通過這樣一個爬蟲來實(shí)現(xiàn)對于QQ上的消息回復(fù),我們結(jié)合go-cqhttp的指令來組成url。
當(dāng)然這里的? res_mes_post? 也是為了剩下在別處換群號的時間,當(dāng)然這些以后都會優(yōu)化的。這里也說一下大括號里面也是可以鍵值取值的。
?下面是我們的消息內(nèi)容,也就是回答消息之前。
這是回答之后的。?
?
下面是運(yùn)行代碼及運(yùn)行結(jié)果。
import requestsmessage_id_collect = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 message_id_collect_again = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 message_append = [] #添加獲取的內(nèi)容def res_get_error():#獲取最新的消息數(shù)據(jù)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"] #拿取消息內(nèi)容mes_content_sender = mes_get_append["sender"]["nickname"] #拿取消息發(fā)送者的名字print("獲取-----:" + mes_content_sender + ':' + mes_content) # 檢查是否正常API_get_answer(mes_content)def API_get_answer(mes_content):#聊天API的調(diào)用,并獲取回答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回答的內(nèi)容print("回答:" + answer_content)#檢察是否可以正常運(yùn)行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() #發(fā)送消息#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():#發(fā)消息前的消息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以便進(jìn)行對比def answer_post_again_check():#發(fā)消息后的消息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以便進(jìn)行對比?因?yàn)橹皇褂昧藃equests,所以就導(dǎo)致判斷是否有新消息成了麻煩的問題,加上我們的持續(xù)的回復(fù)是會用到? while True? 的,下面會有(這個代碼的意思是一直循環(huán)除非用? break? 打破這個循環(huán)),所以總不能讓機(jī)器人回完消息后一直回復(fù)自己的消息,我們就需要判斷一下是否有新消息,也盡量避免機(jī)器人回復(fù)自己的消息,造成一個惡性循環(huán)。
因?yàn)槲覀円婚_始就把內(nèi)容爬取并添加到了? message_append? 這個列表里,所以我們就從這里面獲取消息的ID,因?yàn)閯偛盼覀?strong>只是把消息獲取并發(fā)送,也沒有再次爬取消息添加到列表里,所以列表的最后一個就是你機(jī)器人回復(fù)的消息,所以我們就拿取這個消息的ID,并通過? return? 這個語法,把獲取的消息ID返回。這是第一個函數(shù)。
?第二個函數(shù)和第一個函數(shù)差不多,這個函數(shù)只不過拿取的消息是倒數(shù)第二個,而不是倒數(shù)第一個,因?yàn)闄C(jī)器人發(fā)消息后剛才回復(fù)的消息就會由倒數(shù)第一個消息變成倒數(shù)第二個消息,所以我們要拿取第二個的消息的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首先,調(diào)用? res_get_error()? 這個函數(shù),通過這個函數(shù)進(jìn)行群歷史消息,再通過調(diào)用answer_post_again()? 獲取發(fā)消息前的要回復(fù)的消息的ID,再調(diào)用? res_separate_mes()? 這個函數(shù)進(jìn)行獲取消息,獲取機(jī)器人的回答以及回復(fù)消息,再調(diào)用? res_get_error()? 這個函數(shù)把發(fā)消息后的內(nèi)容爬取,之后我們就需要進(jìn)行判斷是否有人發(fā)送新的消息,剛才上面也說了,機(jī)器人回復(fù)后,剛剛被回復(fù)的消息就成了倒二,這樣第一個函數(shù)獲取的ID就等于第二個函數(shù)獲取的ID,我們通過一直循環(huán)獲取倒二的消息ID,如果有人發(fā)消息,機(jī)器人回復(fù)的消息就變成了倒二,他的消息ID就不等于剛才回復(fù)的消息的ID了,就證明有新的消息,這個時候,我們就用? break? 打破這個循環(huán),讓他再次執(zhí)行回復(fù)。
總結(jié)
單純一個requests是挺麻煩的,盡量也去學(xué)習(xí)一下socket庫,這樣便能省下不少的代碼,也能節(jié)約時間,相比之前,只一個requests,不僅耗時,而且因?yàn)榕老x的原因也會有許多的麻煩。
第一次代碼優(yōu)化 (征集代碼修改意見)
import requests import timemessage_id_collect = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 message_id_collect_again = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 message_append = [] #添加獲取的全部內(nèi)容class res_mess_html(): #獲取網(wǎng)頁的jsondef __init__(self,url,headers):self.url = urlself.headers = headersdef res_get_html(self): #獲取最新的消息數(shù)據(jù)res = requests.get(url=self.url,headers=self.headers).json() #獲取數(shù)據(jù)jsonmes_list = res["data"]["messages"] #鍵值取值for res_get_mes in mes_list: #循環(huán)獲取全部內(nèi)容#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"] # 拿取消息內(nèi)容mes_content_sender = mes_get_append["sender"]["nickname"] # 拿取消息發(fā)送者的名字print(">>>>>>>:獲取:" + mes_content_sender + ':' + mes_content) # 檢查是否正常return mes_contentdef API_get_answer(self,mes_content): # 聊天API的調(diào)用,并獲取回答if mes_content == "菜單": #回答消息的第一優(yōu)先級msg = "暫時只能聊天哦"else: #回答消息的第二優(yōu)先級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回答的內(nèi)容print(">>>>>>>:回答:" + answer_content) # 檢察是否可以正常運(yùn)行msg = answer_contentreturn msgdef post_url(self,msg): #進(jìn)行回復(fù)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() # 發(fā)送消息print(">>>>>>>:已回答") class answer_check():def answer_post_again(self): # 發(fā)消息前的消息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以便進(jìn)行對比def answer_post_again_check(self): # 發(fā)消息后的消息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以便進(jìn)行對比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:# 實(shí)例化類res_post_mes = res_mess_html(url=url, headers=headers)res_mess_posts = res_mess_post()# 調(diào)用API實(shí)現(xiàn)機(jī)器人回復(fù)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:#實(shí)例化類res_post_mes = res_mess_html(url=url, headers=headers)res_mess_posts = res_mess_post()res_answer_check = answer_check()#獲取發(fā)消息前的消息IDres_post_mes.res_get_html()n = res_answer_check.answer_post_again()#調(diào)用API實(shí)現(xiàn)機(jī)器人回復(fù)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)#刷新頁面準(zhǔn)備循環(huán)拿取消息IDres_post_mes.res_get_html()time.sleep(1)while True:#循環(huán)獲取最新消息的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驗(yàn)證是否有新消息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) 在前文的基礎(chǔ)上,僅增加了一級回復(fù)的功能,這樣就可以自行添加一些功能除全局增加為類后,此次改動僅有一處,增加一級回復(fù)的部分以下是改動處的代碼(僅文章的部分,如需改動建議全文復(fù)制粘貼)。?
def API_get_answer(self,mes_content): # 聊天API的調(diào)用,并獲取回答if mes_content == "菜單": #回答消息的第一優(yōu)先級msg = "暫時只能聊天哦"else: #回答消息的第二優(yōu)先級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回答的內(nèi)容print(">>>>>>>:回答:" + answer_content) # 檢察是否可以正常運(yùn)行msg = answer_contentreturn msg第二次代碼修改(小改)
import requests import time''' message_id_collect = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 message_id_collect_again = [] #放入獲取的消息ID以便進(jìn)行判斷是否有人說話 ''' message_append = [] # 添加獲取的全部內(nèi)容 self_qq = 2712065523class res_mess_html(): # 獲取網(wǎng)頁的jsondef __init__(self, url, headers):self.url = urlself.headers = headersdef res_get_html(self): # 獲取最新的消息數(shù)據(jù)res = requests.get(url=self.url, headers=self.headers).json() # 獲取數(shù)據(jù)jsonmes_list = res["data"]["messages"] # 鍵值取值for res_get_mes in mes_list: # 循環(huán)獲取全部內(nèi)容# 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"] # 拿取消息內(nèi)容mes_content_sender = mes_get_append["sender"]["nickname"] # 拿取消息發(fā)送者的名字print(">>>>>>>:獲取:" + mes_content_sender + ':' + mes_content) # 檢查是否正常return mes_contentdef API_get_answer(self, mes_content): # 聊天API的調(diào)用,并獲取回答if mes_content == "菜單": # 回答消息的第一優(yōu)先級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() # 發(fā)送消息# print(answer_post_use)'''else: # 回答消息的第二優(yōu)先級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回答的內(nèi)容print(">>>>>>>:回答:" + answer_content) # 檢察是否可以正常運(yùn)行msg = answer_content# instruction = "send_group_msg" #發(fā)送消息的go-cqhttp的指令# print(instruction)# instruction_group = 'group_id' #發(fā)送消息的類型:群聊'''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() # 發(fā)送消息# print(answer_post_use)print(">>>>>>>:已回答")'''return msgdef post_url(self, msg): # 進(jìn)行回復(fù)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() # 發(fā)送消息print(">>>>>>>:已回答")class answer_check():'''def answer_post_again(self): # 發(fā)消息前的消息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以便進(jìn)行對比def answer_post_again_check(self): # 發(fā)消息后的消息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以便進(jìn)行對比'''def answer_post_qq(self): # 獲取發(fā)送者的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:# 實(shí)例化類res_post_mes = res_mess_html(url=url, headers=headers)res_mess_posts = res_mess_post()# 調(diào)用API實(shí)現(xiàn)機(jī)器人回復(fù)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:# 實(shí)例化類res_post_mes = res_mess_html(url=url, headers=headers)res_mess_posts = res_mess_post()res_answer_check = answer_check()# 獲取發(fā)消息前的消息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(">>>>>>>:有消息")# 調(diào)用API實(shí)現(xiàn)機(jī)器人回復(fù)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)# 刷新頁面準(zhǔn)備循環(huán)拿取消息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)此次的改動處:最后的邏輯回復(fù)的代碼以及前面的回復(fù)檢查的代碼,此次改動只為解決啟動后會有一次回復(fù)的錯誤。
class answer_check(): '''def answer_post_again(self): # 發(fā)消息前的消息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以便進(jìn)行對比def answer_post_again_check(self): # 發(fā)消息后的消息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以便進(jìn)行對比 '''def answer_post_qq(self):#獲取發(fā)送者的QQ號poster_qq= message_append[-1]["sender"]["user_id"]return poster_qq #對比自身QQ號?這是此次改動的第一處,當(dāng)然前面也有一點(diǎn),不過僅僅是將集合刪除。這處的代碼通俗易懂,僅僅改為獲取發(fā)送者的QQ號,關(guān)于為什么不用消息的ID值,畢竟QQ號的獲取與對比,相比于消息 的ID值是比較簡單的,也避免了消息不是18條就是19條,而導(dǎo)致代碼錯誤的尷尬,畢竟我太菜了。
def get_post(url, headers):while True:# 實(shí)例化類res_post_mes = res_mess_html(url=url, headers=headers)res_mess_posts = res_mess_post()res_answer_check = answer_check()# 獲取發(fā)消息前的消息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(">>>>>>>:有消息")# 調(diào)用API實(shí)現(xiàn)機(jī)器人回復(fù)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)# 刷新頁面準(zhǔn)備循環(huán)拿取消息IDres_post_mes.res_get_html()time.sleep(1)s = list_clear()clear = s.list_clears()# print(message_append, message_id_collect, mes_content)?此處的代碼改動:將機(jī)器人的回復(fù)以及刷新頁面放在了IF語句的else中,改代碼的時候才發(fā)現(xiàn),啟動這個機(jī)器人總是回復(fù)第一句話的原因主要就是把機(jī)器人的回復(fù)放的靠前了,有點(diǎn)離譜,現(xiàn)在也才發(fā)現(xiàn),我寫代碼的時候,腦子根本不轉(zhuǎn)。
總結(jié)
以上是生活随笔為你收集整理的pythonQQ机器人系列:使用requests实现QQ机器人聊天(0-2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse链接mycat报数据源初始
- 下一篇: python alpha量化交易软件_2