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