日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2023/12/10 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pythonQQ机器人系列:使用requests实现QQ机器人聊天(0-2) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

系列文章目錄

基礎(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。