系列文章目錄
基礎(chǔ):requests的基本使用:QQ機(jī)器人基礎(chǔ)??傳送門
pythonQQ機(jī)器人系列:使用requests實(shí)現(xiàn)QQ機(jī)器人聊天(0-2)?傳送門
pythonQQ機(jī)器人系列:使用requests實(shí)現(xiàn)QQ機(jī)器人聊天(1-0)傳送門
pythonQQ機(jī)器人系列:使用requests實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)
目錄
系列文章目錄
前言(一)
前言(二)
一.源代碼講解
1.main_api_program.py源碼講解
2.Main_system.py源碼講解
前言(一)
?文章來源地址http://www.zghlxwxcb.cn/news/detail-499999.html
hello,大家好,這里是菜的離譜的萌新博主。
這幾天不也是快春節(jié)了嘛。
咱是閑下來有空了,把這個(gè)鴿了N年的博客咱抽空寫完了。大家應(yīng)該也是放假或者馬上要放假了
在此提前祝大家新年快樂。
過一個(gè)好年。
咱寫的不好,非喜勿噴。
前言(二)
#目前又找到了一種新的方法來獲取消息,獲取的速度比socket快,也不再需要上報(bào),打算不再使用socket,所以說,下一次又是一次大更,希望大家支持一下博主
socket簡單教程:https://www.runoob.com/python3/python3-socket.html
所有的文件都在這(包括config.yml)密碼:博主好菜:?https://www.123pan.com/s/UovlVv-5P83h
github地址(不包括config.yml):https://github.com/ximenxiaoxue/QQ_bot.git?
go-cqhttp下載:?https://docs.go-cqhttp.org/?
這里的話先把主體講完(不包括多群喊話),剩下的api就留到下一次再講,順便再加一點(diǎn)別的api。
此文章繼承前面的文章,這次更新了socket,可以用socket接收群私聊消息以及多群喊話,實(shí)現(xiàn)群私聊消息的回復(fù)功能,以及點(diǎn)歌和新聞。
最后謝謝大家的支持。
?go-cqhttp的config.yml文件改動(dòng)了部分內(nèi)容,如下所示,改動(dòng)部分在這個(gè)文件的靠下的位置(或者直接用我的文件進(jìn)行替換),將前面的“#”號(hào)刪去,并在url中加上,
http://127.0.0.1:5720/
下面是代碼的各個(gè)文件
?文章來源:http://www.zghlxwxcb.cn/news/detail-499999.html
?
?
一.思路講解?
?該怎么說呢,咱這個(gè)QQ機(jī)器人,就一個(gè)普通的單線程程序,所以代碼一多運(yùn)行的就慢了。
正常的思路
一.等待消息出現(xiàn)?
二.接收消息,并做處理
三.回復(fù)消息
四.循環(huán)
這是一個(gè)最簡單的思路,接下來咱就跟著這個(gè)最簡單的思路,往下恰代碼,我知道你們肯定喜歡敲代碼
?
?
二.源代碼講解
這次咱們就不把源碼放上了,源碼都在上面大家可以下下來直接看,咱們直接進(jìn)入主題。
1.main_api_program.py源碼講解
# Predetermined:預(yù)先確定 Specific:具體的
# Reporting:報(bào)告 directives:指令
# Preprocessing:預(yù)處理 instruction:指令
# segment:段
# Detach:拆卸
# Overall:全部
# separation:分離
# ---------------------------------------------------------------------------------------------------
print("正在進(jìn)行預(yù)處理")
# ---------------------------------------------------------------------------------------------------
import time
t1 = time.time()
import json # 講獲取的消息進(jìn)行字典化
import socket # 使用socket監(jiān)聽上報(bào),接收各種消息
import pandas as pd # 準(zhǔn)備實(shí)現(xiàn)本地詞庫
import requests # 發(fā)送消息及獲取機(jī)器人回答
import news_api #實(shí)現(xiàn)新聞
import music_api#實(shí)現(xiàn)點(diǎn)歌
# ---------------------------------------------------------------------------------------------------
# 實(shí)現(xiàn)本地詞庫時(shí)使用
# path = 'words\word.xlsx' # 本地詞庫路徑
data_word = pd.read_excel("words/word.xlsx")
word_question = data_word.loc[:, 'question'] # 讀取question內(nèi)容
word_answer = data_word.loc[:, 'answer'] # 讀取answer內(nèi)容
total = data_word.shape[0] # data.shape可以獲取行,列的數(shù)
# ---------------------------------------------------------------------------------------------------
# 接收消息時(shí)使用
SK = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SK.bind(('127.0.0.1', 5720)) # 綁定IP及端口號(hào)
SK.listen(100) # 開始監(jiān)聽
# 用來回復(fù)go-cqhttp上報(bào),防止黃色的上報(bào)指令的輸出,以及不可操控的程序錯(cuò)誤(測試的錯(cuò)誤:不停地回復(fù)消息)
HttpResponseHeader = '''HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n'''
# ---------------------------------------------------------------------------------------------------
# 發(fā)送消息
# 存放獲取的各種消息,以后有必要可能需要將各個(gè)消息存放的內(nèi)容分開
dict_receive = {'message_type': '', 'sender_msg': '', 'sender_name': '', 'sender_id': '', 'sender_msg_id': '',
'sender_group_id': '', 'sender_self_id': ''}
# 用副本字典準(zhǔn)備使用多線程,講多群喊話與正常的聊天分隔開
dict_receive_copy = {'message_type': '', 'sender_msg': '', 'sender_name': '', 'sender_id': '', 'sender_msg_id': '',
'sender_group_id': '', 'sender_self_id': ''}
# ---------------------------------------------------------------------------------------------------
# 獲取群的ID與名稱,為了實(shí)現(xiàn)多群喊話做準(zhǔn)備
group_id_list = []
group_name_list = []
# ---------------------------------------------------------------------------------------------------
t2 = time.time()
print("預(yù)處理完畢,用時(shí):"+str((t2-t1)*1000)[:8]+"毫秒" )
感覺這些挺通俗易懂的,當(dāng)然我相信你們是會(huì)的,況且我上面加了詳細(xì)的注釋..........................
?好,直接及進(jìn)入下一步
?
# 在這里進(jìn)行消息之間的同道連接,以及獲得的消息的第一步處理,進(jìn)行字典化
class Listener(): # 獲取網(wǎng)頁的json并獲取消息
def receiver(self):
Client, Address = SK.accept() # 被動(dòng)接受TCP客戶端連接,(阻塞式)等待連接的到來
Reporting_events = Client.recv(1024).decode(encoding='utf-8') # 主動(dòng)初始化TCP服務(wù)器連接,并解碼
Client.sendall((HttpResponseHeader).encode(encoding='utf-8')) # 完整發(fā)送TCP數(shù)據(jù),并回復(fù)go-cqhttp的上報(bào)
# print(Reporting_events)
Client.close() # 關(guān)閉連接
return Reporting_events # 彈出獲取的上報(bào)文字
def Preprocessing_segment(self, Preprocess_Text): # 處理上報(bào)文字
# 用切片的方法把“{”找到,并獲取后面的消息
num = 0
while True:
num = num + 1
# 用切片的方法把“{”找到,并獲取后面的消息
Processing_text = Preprocess_Text[num]
if Processing_text == "{":
Processed_text = Preprocess_Text[num:]
# print(Processed_text)
break
else:
pass
return json.loads(Processed_text) # 將字符串轉(zhuǎn)變?yōu)樽值?
?
這里與之前不同,之前咱們的代碼是靠的go-cqhttp的api指令進(jìn)行獲取的群消息,這次咱們使用的socket來獲取消息,用socket的好處就是,可以接收到各種上報(bào)事件,消息就是上報(bào)事件之一,這樣咱們也就可以進(jìn)行回復(fù)私聊消息等各種的操作。
接下來跟著博主來看看運(yùn)行的代碼,當(dāng)然就是單純這里的運(yùn)行代碼
import socket
import json
SK = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SK.bind(('127.0.0.1', 5720)) # 綁定IP及端口號(hào)
SK.listen(100) # 開始監(jiān)聽
HttpResponseHeader = '''HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n'''
Client, Address = SK.accept() # 被動(dòng)接受TCP客戶端連接,(阻塞式)等待連接的到來
Reporting_events = Client.recv(1024).decode(encoding='utf-8') # 主動(dòng)初始化TCP服務(wù)器連接,并解碼
Client.sendall((HttpResponseHeader).encode(encoding='utf-8')) # 完整發(fā)送TCP數(shù)據(jù),并回復(fù)go-cqhttp的上報(bào)
# print(Reporting_events)
Client.close() # 關(guān)閉連接
# 處理上報(bào)文字
# 用切片的方法把“{”找到,并獲取后面的消息
num = 0
while True:
num = num + 1
# 用切片的方法把“{”找到,并獲取后面的消息
Processing_text = Reporting_events[num]
if Processing_text == "{":
Processed_text = Reporting_events[num:]
break
else:
pass
print(Reporting_events)
print(Processed_text)
下面是運(yùn)行的代碼結(jié)果
POST / HTTP/1.1
Host: 127.0.0.1:5720
User-Agent: CQHttp/4.15.0
Content-Length: 386
Content-Type: application/json
X-Self-Id: 2712065523
Accept-Encoding: gzip
{"post_type":"meta_event","meta_event_type":"heartbeat","time":1673787352,"self_id":2712065523,"status":{"app_enabled":true,"app_good":true,"app_initialized":true,"good":true,"online":true,"plugins_good":null,"stat":{"packet_received":26,"packet_sent":17,"packet_lost":0,"message_received":0,"message_sent":0,"disconnect_times":0,"lost_times":0,"last_message_time":0}},"interval":5000}
{"post_type":"meta_event","meta_event_type":"heartbeat","time":1673787352,"self_id":2712065523,"status":{"app_enabled":true,"app_good":true,"app_initialized":true,"good":true,"online":true,"plugins_good":null,"stat":{"packet_received":26,"packet_sent":17,"packet_lost":0,"message_received":0,"message_sent":0,"disconnect_times":0,"lost_times":0,"last_message_time":0}},"interval":5000}
這里大家也都看見了,第一部分是
POST / HTTP/1.1
Host: 127.0.0.1:5720
User-Agent: CQHttp/4.15.0
Content-Length: 386
Content-Type: application/json
X-Self-Id: 2712065523
Accept-Encoding: gzip
{"post_type":"meta_event","meta_event_type":"heartbeat","time":1673787352,"self_id":2712065523,"status":{"app_enabled":true,"app_good":true,"app_initialized":true,"good":true,"online":true,"plugins_good":null,"stat":{"packet_received":26,"packet_sent":17,"packet_lost":0,"message_received":0,"message_sent":0,"disconnect_times":0,"lost_times":0,"last_message_time":0}},"interval":5000}
所以我們就想要拿到這第一部分的下面的內(nèi)容,然后我就想了一個(gè)辦法,用切片的方法把這里獲取下來。
然后我就用while循環(huán)一直循環(huán)到有"{"才結(jié)束,然后在這里記錄切片到這里的計(jì)數(shù),然后把這里以及后面的全部拿下來,也就是我們的演示部分的那塊代碼。?
還有一個(gè)非常重要的事情,就是這里,你獲取的非常想字典,但是他不是字典,是字符串,然后我們就用json庫,來把字符串,變成字典,也就是?loads()的用法。
還有還有非常非常重要的一個(gè)點(diǎn)?,那就是沒消息獲取的上報(bào)與有新消息時(shí)的上報(bào)是不一樣的,下面是他們的例子,大家可以觀察一下
無消息
{"post_type":"meta_event","meta_event_type":"heartbeat","time":1673788242,"self_id":2712065523,"interval":5000,"status":{"app_enabled":true,"app_good":true,"app_initialized":true,"good":true,"online":true,"plugins_good":null,"stat":{"packet_received":59,"packet_sent":50,"packet_lost":0,"message_received":0,"message_sent":0,"disconnect_times":0,"lost_times":0,"last_message_time":0}}}
有消息
{"post_type":"message","message_type":"group","time":1673788243,"self_id":2712065523,"sub_type":"normal","font":0,"group_id":736038975,"message_seq":1805,"raw_message":"你好","anonymous":null,"message":"你好","sender":{"age":0,"area":"","card":"額額","level":"","nickname":"C-C(x_x;)","role":"owner","sex":"unknown","title":"","user_id":1732373074},"user_id":1732373074,"message_id":301654598}
所以在取消息的時(shí)候一定不要弄的太絕對 ,額,至于怎么絕對,就自己想吧,我反正是出錯(cuò)了。
好了,按照我們的思路,我們要拿到發(fā)送的消息,把沒用的剔除去,畢竟是字典,我們用鍵值取值的方法就可以拿到消息的各個(gè)參數(shù),并添加到我們設(shè)置的字典中,也就是咱們下面的代碼。
class Detach_Message():
# 精細(xì)化分離消息,準(zhǔn)備實(shí)現(xiàn)私聊與群聊的回復(fù)
def group_separation(self, Set_to_be_separated):
# 判斷群私聊
if Set_to_be_separated["post_type"] == "message":
if Set_to_be_separated["message_type"] == "group":
dict_receive['message_type'] = 'group'
return None
elif Set_to_be_separated["message_type"] == "private":
dict_receive['message_type'] = 'private'
return None
else:
pass
else: # 因?yàn)榘l(fā)送新消息時(shí)監(jiān)聽的消息集合與沒有消息時(shí)的集合,不一樣?。。。。。。?!
pass
return None
def Other_separation(self, Set_to_be_separated): # 其他消息的獲取
if Set_to_be_separated["post_type"] == "message":
sender_msg = Set_to_be_separated["message"] # 獲取消息
sender_name = Set_to_be_separated["sender"]["nickname"] # 獲取發(fā)送者的名字
sender_id = Set_to_be_separated["sender"]["user_id"] # 獲取發(fā)送者的QQ號(hào)
sender_msg_id = Set_to_be_separated["message_id"] # 獲取消息的ID
sender_self_id = Set_to_be_separated["self_id"] # 獲取自己的QQ號(hào)
# return sender_msg,sender_name,sender_id,sender_msg_id
if Set_to_be_separated["message_type"] == "group":
sender_group_id = Set_to_be_separated["group_id"] # 獲取發(fā)送群的群號(hào)
dict_receive['sender_msg'] = sender_msg
dict_receive['sender_name'] = sender_name
dict_receive['sender_id'] = str(sender_id)
dict_receive['sender_msg_id'] = str(sender_msg_id)
dict_receive['sender_group_id'] = str(sender_group_id)
dict_receive['sender_self_id'] = str(sender_self_id)
pass
else:
dict_receive['sender_msg'] = sender_msg
dict_receive['sender_name'] = sender_name
dict_receive['sender_id'] = str(sender_id)
dict_receive['sender_msg_id'] = str(sender_msg_id)
dict_receive['sender_self_id'] = str(sender_self_id)
pass
else:
pass
return None
說實(shí)話,我也不知道為什么我當(dāng)初要單獨(dú)把判斷消息的群聊還是私聊的取值要單獨(dú)弄一個(gè)函數(shù),算了不管了,直接擺爛,我相信你們這些大佬一定會(huì)解決好這些問題的,不想改的就勉強(qiáng)看著我的吧。
?
?第一個(gè)分離消息的函數(shù),我們就是先判斷是否獲取到的上報(bào)消息是否為消息,也就是第一個(gè)if,第二個(gè)if,也就是獲取消息的群聊還是私聊的消息,獲取這里的消息是為了后面回復(fù)時(shí)用的不同的api的使用
第二個(gè)分離消息的函數(shù),對了對了,還有一個(gè)非常重要的事情,群聊消息的上報(bào)與私聊消息的上報(bào)是不一樣的,這也就是為什么要單獨(dú)的多一個(gè)if,下面有示例。好,我們接下來繼續(xù)講,?第二個(gè)分離消息的函數(shù),和上面一樣,先判斷是否獲取到的上報(bào)消息是否為消息,也就是第一個(gè)if,第二個(gè)if,也就是獲取消息的群聊還是私聊的消息,獲取這里的消息是為了后面回復(fù)時(shí)用的不同的api的使用,好家伙,感覺這兩個(gè)函數(shù)的作用一樣,好吧,懶得改了,靠你們了,(斜笑臉)。
還有一個(gè)非常重要的一個(gè)點(diǎn),你獲取的消息可能不是str(字符串),額,至于是不是這里的毛病我也忘了,沒辦法,N年前的代碼了?,我記得我是遇到了一個(gè)str與int的毛病,所以就把獲取的消息都變成字符串,然后添加到字典中
?
?
?以下是示例
群聊
{"post_type":"message","message_type":"group","time":1673789105,"self_id":2712065523,"sub_type":"normal","anonymous":null,"font":0,"group_id":736038975,"raw_message":"在","sender":{"age":0,"area":"","card":"額額","level":"","nickname":"C-C(x_x;)","role":"owner","sex":"unknown","title":"","user_id":1732373074},"message":"在","message_seq":1806,"user_id":1732373074,"message_id":-1997294596}
私聊
{"post_type":"message","message_type":"private","time":1673789107,"self_id":2712065523,"sub_type":"friend","target_id":2712065523,"message":"在","raw_message":"在","font":0,"sender":{"age":0,"nickname":"C-C(x_x;)","sex":"unknown","user_id":1732373074},"message_id":-98257865,"user_id":1732373074}
?好了,我們繼續(xù)向下講
class Send_operation(): # 可視化獲取的消息類別等
def Send_operation_first(self):
# 輸出獲取到的消息
if dict_receive['message_type'] == 'private':
print(
'>>>:' * 3 + "獲取: \n" + "名字: " + dict_receive['sender_name'] + '\n' + 'QQ號(hào): ' + dict_receive[
'sender_id'] + '\n' + "消息內(nèi)容: " +
dict_receive[
'sender_msg'] + '\n' + '消息ID:' + dict_receive['sender_msg_id'])
# Clear_Dictionary().clear_() #清除字典中的數(shù)據(jù)
pass
elif dict_receive['message_type'] == 'group':
print(
'>>>:' * 3 + "獲取: \n" + "名字: " + dict_receive['sender_name'] + '\n' + 'QQ號(hào): ' + dict_receive[
'sender_id'] + '\n' + '群號(hào): ' + dict_receive['sender_group_id'] + '\n' + "消息內(nèi)容: " +
dict_receive[
'sender_msg'] + '\n' + '消息ID: ' + dict_receive['sender_msg_id'])
# Clear_Dictionary().clear_()#清除字典中的數(shù)據(jù)
pass
else:
pass
# print('>>>:' * 3 +'暫無消息')
return None
def Send_operation_second(self, msg, *age): # 進(jìn)行回復(fù)
# 輸出邏輯回答的消息
url = 'http://127.0.0.1:5700'
if dict_receive['message_type'] == 'private':
urls = url + "/send_private_msg?user_id=" + dict_receive['sender_id'] + '&' + 'message=' + msg
answer_post_use = requests.post(url=urls).json() # 發(fā)送消息
print('>>>:' * 3 + "已回答:" + "\n " + msg)
pass
elif dict_receive['message_type'] == 'group':
urls = url + '/send_group_msg?group_id=' + dict_receive['sender_group_id'] + '&' + "message=" + msg
# print(urls)
answer_post_use = requests.post(url=urls) # 發(fā)送消息
print('>>>:' * 3 + "\n" + "已回答:" + msg)
pass
else:
# print(1)
pass
第一個(gè)函數(shù)的使用就不再細(xì)講了,懂點(diǎn)基礎(chǔ)就會(huì),將是想把獲取的消息輸出。?
第二個(gè)函數(shù)的使用 ,懂go-cqhttp的可以跳過了,應(yīng)該明白,不懂的,也可以跳過,鬧著玩,大家可以去go-cqhttp的官網(wǎng)看看,我直接給大家鏈接:https://docs.go-cqhttp.org/api/#%E5%9F%BA%E7%A1%80%E4%BC%A0%E8%BE%93
?好了,就這樣吧,requests的使用不會(huì)的可以看一下前面的文章,我太懶了。
?接下來,繼續(xù)講
class answer_logic(): # 回復(fù)邏輯
# 邏輯回答,以后可能會(huì)再改,將判斷分開,用多線程
def get_API_answer(self): # 本地詞庫一級(jí)回答
# 回答消息的第一優(yōu)先級(jí)
# 放到前面提前處理
num = 0
for num in range(total):
num = +num # 前加的意思是先進(jìn)行一次運(yùn)行下一次再 +1
answer_Pre_post = str(word_question[num])
'''
因?yàn)榛卮鸬南⒃谕?,所以后面也是num。
因?yàn)閤lsx里面的數(shù)字是int類型,我們獲取的消息里面的數(shù)字是str
所以要用str轉(zhuǎn)化一下,這個(gè)漏洞我找了好久
哭~~~~~。
'''
if dict_receive['sender_msg'] == answer_Pre_post:
msg = word_answer[num]
return msg # 彈出本地詞庫消息,便于下面發(fā)送
else:
pass
if dict_receive['sender_msg'] == "菜單" or dict_receive['sender_msg'] == "#": # 回答消息的第二優(yōu)先級(jí)
msg = "1.聊天\n2.多群喊話\n3.新聞\n4.點(diǎn)歌(網(wǎng)抑云)\n5.網(wǎng)抑云\n6.隨機(jī)美句\n7.我在人間湊數(shù)的日子" # \n可以實(shí)現(xiàn)多行輸出
return msg
elif dict_receive['sender_msg'] == "多群喊話" or dict_receive['sender_msg'] == "#2": # 在此判斷發(fā)消息人的QQ號(hào)
if '1732373074' == dict_receive['sender_id']: # 防止別人發(fā)送(有缺陷,如果主人先發(fā)多群喊話,不管誰再發(fā)消息,都會(huì)喊)
msg = '接收消息中......'
return msg
else:
msg = '您的等級(jí)不夠'
return msg
elif dict_receive['sender_msg'] == "新聞" or dict_receive['sender_msg'] == "#3":
msg = news_api.news_content()
return msg
elif "點(diǎn)歌" in dict_receive['sender_msg']:
musics_id = music_api.music_id(music_api.handle_content(dict_receive['sender_msg']))
msg = "[CQ:music,type=163,id={}]".format(musics_id)
return msg
elif dict_receive['sender_msg'] == "網(wǎng)抑云" or dict_receive['sender_msg'] == "#5":
msg = api_group_1.wangyiyun()
return msg
elif dict_receive['sender_msg'] == "隨機(jī)美句" or dict_receive['sender_msg'] == "#6":
msg = api_group_1.philosophy_of_life()
return msg
elif dict_receive['sender_msg'] == "我在人間湊數(shù)的日子" or dict_receive['sender_msg'] == "#7":
msg = api_group_1.i_counted_the_days_on_earth()
return msg
else: # 回答消息的第三優(yōu)先級(jí)
urls = "http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(dict_receive['sender_msg'])
answer_get = requests.get(url=urls).json()
answer_content = answer_get["content"] # 獲取API回答的內(nèi)容
# print('>>>:' * 3 + "回答:" + answer_content) # 檢察是否可以正常運(yùn)行
msg = answer_content
return msg
一不小心暴露,自己的新增的api了 ,這里的代碼切記不可帶人使用,要直接用我們前面的地址中沒改前的代碼,關(guān)于為什么前文沒寫這些api,因?yàn)槲乙彩亲罱耪业搅艘粋€(gè)好的api網(wǎng)站,沒辦法。
?說明,這里的代碼是為了彈出我們獲取的消息的回答,所以需要彈出msg,一開始,我們用的切片的方法遍歷我們的word.xlsx文件中的字,這種匹配的話,只能是精確匹配,必須一樣才能給與后面的回復(fù),大家可以手動(dòng)試一下前面的pandas的操作,這里就不多展示了,額......,要不展示一下吧,下面是示例
?
?
這是這個(gè)亞子,所以懂了嗎??
?因?yàn)槲覀冊讷@取消息的時(shí)候,就把獲取到的消息添加到了字典,我們通過比對,一個(gè)一個(gè)回復(fù)就行了,最后沒有消息可用才使用青客云的智能機(jī)器人進(jìn)行聊天,我們可以這么說,我們分三級(jí)回復(fù)消息,第一級(jí)是我們的word.xlsx里面我們設(shè)置的回答,第二級(jí)是我們的api,最后是機(jī)器人聊天,第一級(jí)等級(jí)最高,對,就是這樣,所以懂了嗎?
那我們就繼續(xù)向下講了。
?
?
class Clear_Dictionary(): # 清除字典中的數(shù)據(jù),后面有許多的地方需要清空字典
def clear_(self):
dict_receive['sender_msg'] = ''
dict_receive['sender_name'] = ''
dict_receive['sender_id'] = ''
dict_receive['sender_msg_id'] = ''
dict_receive['sender_group_id'] = ''
dict_receive['message_type'] = ''
dict_receive['sender_self_id'] = ''
?這應(yīng)該就不用講了吧,相當(dāng)于是把字典清空,當(dāng)初試了一下clear,結(jié)果,清空的連個(gè)毛都不剩了,哭死。。。。。。
?
?
?好了,哭完我們繼續(xù),我想知道能看到這里的有幾個(gè)人,可以評(píng)論一下嗎?碼字也是很辛苦的
2.Main_system.py源碼講解
#引用已編寫好的聊天主程序
#這個(gè)為簡單開頭
import main_api_program #大部分主要功能在此設(shè)計(jì)
import multi_group_shouting_api #多群喊話的api文件
# ---------------------------------------------------------------------------------------------------
#聊天回復(fù)函數(shù)
def Chat_reply():
while True:
try:
# 獲取消息
words = main_api_program.Listener().Preprocessing_segment(main_api_program.Listener().receiver())
# print(word)
# 分離消息
Group_private_chat = main_api_program.Detach_Message().group_separation(words)
Other_chat = main_api_program.Detach_Message().Other_separation(words)
# 輸出消息內(nèi)容 輸出的消息是獲取的消息
main_api_program.Send_operation().Send_operation_first()
# 獲得回答邏輯中的程序回答
word = main_api_program.answer_logic().get_API_answer()
# 多群喊話
multi_group_shouting_api.multi_group_shouting(word)
# 輸出的消息是回答邏輯中的程序回答
main_api_program.Send_operation().Send_operation_second(word) # 多群喊話完后這里也會(huì)輸出,不過是空
# 清除字典里的內(nèi)容
main_api_program.Clear_Dictionary().clear_()
except:
print("-----" + "遇到未知錯(cuò)誤!@#¥%……&*" + "-----")
print("-----" + "記錄錯(cuò)誤!@#¥%……&*" + "-----")
# main_api_program.Send_operation().Send_operation_second(main_api_program.answer_logic().failing_answer(),1)
if __name__ == '__main__':
Chat_reply()
這里面我們就只需要一個(gè)邏輯就行了,一開始,我們先獲取消息,一直監(jiān)聽,直到新的消息出現(xiàn),也就是
main_api_program.Listener().Preprocessing_segment(main_api_program.Listener().receiver())
?接下來就是將消息分離,用到的?
# 分離消息
Group_private_chat = main_api_program.Detach_Message().group_separation(words)
Other_chat = main_api_program.Detach_Message().Other_separation(words)
?再把我們獲取到的消息輸出
main_api_program.Send_operation().Send_operation_first()
因?yàn)槲覀円呀?jīng)獲取到了發(fā)消息的內(nèi)容 ,所以我們就獲取消息的回答
word = main_api_program.answer_logic().get_API_answer()
?當(dāng)然我們中間插了一個(gè)多群喊話的api,這個(gè)到時(shí)候再改一下,我感覺多群喊話的api在這里不妥當(dāng),我相信你們也這么覺得
multi_group_shouting_api.multi_group_shouting(word)
剩下的咱們也就不講了,就單純的把回復(fù)的消息輸出,最后清除字典,我們加上try也是為了避免錯(cuò)誤,你可能聽說過xss攻擊?,我們在這里也不能避免類似的這種攻擊,一句話說的好,永遠(yuǎn)不要相信用戶的輸入,當(dāng)然咱們這里單純就是想避免錯(cuò)誤,我是過,加"",或者加''或者加#,都有可能引發(fā)錯(cuò)誤
三.最后
文章寫的肯定是不好,有錯(cuò)誤希望大佬斧正
有不明白的可以留言,我會(huì)關(guān)注這些評(píng)論的,有不懂的可以看看go-cqhttp的官網(wǎng),或者我的前面的文章,或者別的教程,總之,謝謝支持
也讓我們,共同進(jìn)步
同時(shí),希望大家有一個(gè)美好的新年
在這里提前祝賀大家新年快樂
大家有興趣的可以加群一起學(xué)習(xí)與進(jìn)步,QQ群:494461275
?
?
?
?
?
到了這里,關(guān)于pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!