国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

這篇具有很好參考價(jià)值的文章主要介紹了pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

系列文章目錄

基礎(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/

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

下面是代碼的各個(gè)文件

?

?pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

?


一.思路講解?

?該怎么說呢,咱這個(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ì)的注釋..........................

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

?好,直接及進(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ò)了。

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

好了,按照我們的思路,我們要拿到發(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)看著我的吧。

?

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

?第一個(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的毛病,所以就把獲取的消息都變成字符串,然后添加到字典中

?

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

?

?以下是示例

群聊
{"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

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

?好了,就這樣吧,requests的使用不會(huì)的可以看一下前面的文章,我太懶了。

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

?接下來,繼續(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的操作,這里就不多展示了,額......,要不展示一下吧,下面是示例

?pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

?

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

這是這個(gè)亞子,所以懂了嗎??

?因?yàn)槲覀冊讷@取消息的時(shí)候,就把獲取到的消息添加到了字典,我們通過比對,一個(gè)一個(gè)回復(fù)就行了,最后沒有消息可用才使用青客云的智能機(jī)器人進(jìn)行聊天,我們可以這么說,我們分三級(jí)回復(fù)消息,第一級(jí)是我們的word.xlsx里面我們設(shè)置的回答,第二級(jí)是我們的api,最后是機(jī)器人聊天,第一級(jí)等級(jí)最高,對,就是這樣,所以懂了嗎?

那我們就繼續(xù)向下講了。

?

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

?

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è)毛都不剩了,哭死。。。。。。

?

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

?

?好了,哭完我們繼續(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

pythonQQ機(jī)器人系列(基于go-cqhttp):使用requests和socket實(shí)現(xiàn)QQ機(jī)器人聊天(2-0)

?

?

?

?

?

到了這里,關(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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用go-cqhttp搭建QQ機(jī)器人

    使用go-cqhttp搭建QQ機(jī)器人

    go-cqhttp是基于 Mirai 以及 MiraiGo 的 OneBot Golang 原生實(shí)現(xiàn)(此句照搬文檔) 個(gè)人使用(不知道是不是只能使用)Python語言進(jìn)行編寫,僅供教程,不做完全分享 官方文檔地址 github項(xiàng)目地址 Python語言環(huán)境配置下載Python 要勾選Add python.exe to PATH 點(diǎn)擊Next 勾選Add Python to environment variab

    2024年02月03日
    瀏覽(26)
  • go-cqhttp+SpringBoot3實(shí)現(xiàn)QQ機(jī)器人

    go-cqhttp+SpringBoot3實(shí)現(xiàn)QQ機(jī)器人

    1.調(diào)用青云客的API進(jìn)行自動(dòng)聊天 2.輸入自動(dòng)添加為好友 非特殊情況保持一致即可! 1.SpringBoot-3.0.5 2.JDK-17 3.go-cqhttp1.0 Github:GitHub - Mrs4s/go-cqhttp: cqhttp的golang實(shí)現(xiàn),輕量、原生跨平臺(tái). gocq api文檔地址:https://docs.go-cqhttp.org/api/ https://gitee.com/mumangguo/go-cqhttp ? Friend類 Message類

    2024年02月14日
    瀏覽(20)
  • 新版nonebot,go-cqhttp搭建qq機(jī)器人保姆級(jí)教程

    新版nonebot,go-cqhttp搭建qq機(jī)器人保姆級(jí)教程

    前段時(shí)間QQ進(jìn)行了更新,所以導(dǎo)致了非手表協(xié)議掃碼登陸報(bào)錯(cuò)的問題,不過好在大佬已經(jīng)推出rc5版本的go-cqhttp,解決了這一頭疼的問題 在開始之前,我需要說明一下,本文章是針對沒有經(jīng)驗(yàn)和基礎(chǔ)的用戶,所以說篇幅可能會(huì)長一點(diǎn) 你需要準(zhǔn)備的東西有: python3.8及以上版本 虛

    2023年04月18日
    瀏覽(24)
  • go-cqhttp,QQ機(jī)器人發(fā)語音+視頻+表情+接入chatgpt

    windows布局go-cqhttp_嗶哩嗶哩_bilibili 注意:圖片需要放到go-cqhttp的目錄下的data/images下面,否則無法發(fā)送,網(wǎng)絡(luò)圖片可以直接發(fā)送

    2024年02月11日
    瀏覽(19)
  • 【Python簡單QQ機(jī)器人】使用nonebot2與go-cqhttp構(gòu)建

    目錄 一、前言 nonebot2-2.0.0b4 QQ機(jī)器人詳細(xì)教程 二、準(zhǔn)備 1.Python 2.Pycharm 3.nonebot2 4.go-cqhttp 三、配置 1.搭建go-cqhttp 2.創(chuàng)建nonebot2機(jī)器人 四、運(yùn)行 五、nonebot2插件 ? ? ? ? 閑著沒事干,忽看到群里面的qq機(jī)器人,想要學(xué)習(xí)一下,用了兩天實(shí)現(xiàn)了本體的搭建并添加了一些插件。期間

    2024年02月09日
    瀏覽(22)
  • 使用go-cqhttp搭建本地qq機(jī)器人 并實(shí)現(xiàn)發(fā)送信息案例(使用python)語言實(shí)現(xiàn)

    使用go-cqhttp搭建本地qq機(jī)器人 并實(shí)現(xiàn)發(fā)送信息案例(使用python)語言實(shí)現(xiàn)

    目錄 1.go-cqhttp簡介 2.案例介紹 3.下載go-cqhttp 4.配置安裝 ①:下載之后我們可以將執(zhí)行程序放在一個(gè)新建的文件夾中,然后雙擊執(zhí)行該程序 直接點(diǎn)擊確定執(zhí)行 ?②:然后雙擊執(zhí)行該程序,會(huì)看到讓我們選擇一種通信方式,我們直接輸入0 選擇HTTP通信?,然后回車 ?③:然后他會(huì)

    2024年02月14日
    瀏覽(28)
  • GLM聯(lián)合go-cqhttp實(shí)現(xiàn)qq群GLM機(jī)器人服務(wù)器的本地化部署筆記

    GLM聯(lián)合go-cqhttp實(shí)現(xiàn)qq群GLM機(jī)器人服務(wù)器的本地化部署筆記

    以下chatgpt-mirai-qq-bot簡稱GPT轉(zhuǎn)發(fā)程序 實(shí)現(xiàn)本地化部署的GLM q群機(jī)器人 最好16GB的顯存 顯卡性能要求不高 window環(huán)境 該項(xiàng)目的是利用lss233大佬的項(xiàng)目一頭對接GLM模型將其消息處理成go-cqhttp可以處理的形式最后發(fā)送到qq群內(nèi) lss233大佬的項(xiàng)目地址 https://github.com/lss233/chatgpt-mirai-qq-bot

    2024年02月16日
    瀏覽(30)
  • 使用騰訊云服務(wù)器+Nonebot2+go-cqhttp搭建QQ聊天機(jī)器人【保姆級(jí)教程 2023最新版】

    使用騰訊云服務(wù)器+Nonebot2+go-cqhttp搭建QQ聊天機(jī)器人【保姆級(jí)教程 2023最新版】

    下載go-cqhttp 這里有不同版本的cqhttp,并且對每個(gè)版本都有介紹。但是大家可以看到有 arm與adm 不同的版本,這兩個(gè)啥關(guān)系呢? 嚴(yán)格來說, AMD和ARM沒有任何關(guān)系 。AMD是桌面級(jí)處理器和桌面級(jí)GPU的生產(chǎn)廠商,而ARM是移動(dòng)級(jí)處理器的生產(chǎn)廠商。AMD是目前業(yè)內(nèi)唯一一個(gè)可以提供高性能

    2023年04月18日
    瀏覽(24)
  • 【ChatGPT】基于GO語言實(shí)現(xiàn)的微信聊天和圖片生成機(jī)器人

    ??基于GO語言實(shí)現(xiàn)的微信聊天和圖片生成機(jī)器人?? 個(gè)人微信接入ChatGPT,實(shí)現(xiàn)和GPT機(jī)器人互動(dòng)聊天,同時(shí)支持基于文本生成圖像。支持私聊回復(fù)和群聊艾特回復(fù)。 GitHub源代碼地址 實(shí)現(xiàn)功能 GPT機(jī)器人模型熱度可配置 提問增加上下文指令清空上下文 DreamStudio圖像生成模型參數(shù)可

    2024年02月09日
    瀏覽(26)
  • 基于Unity構(gòu)建機(jī)器人的數(shù)字孿生平臺(tái)系列2—四旋翼無人機(jī)三維模型

    基于Unity構(gòu)建機(jī)器人的數(shù)字孿生平臺(tái)系列2—四旋翼無人機(jī)三維模型

    系列2的主要內(nèi)容是探討如何自己構(gòu)建一個(gè)模型并且導(dǎo)入U(xiǎn)nity 。 3D仿真與其他類型仿真的一大區(qū)別是三維場景和三維模型。為了實(shí)現(xiàn)對某個(gè)對象的仿真,模型是必須的。當(dāng)然,針對不同的仿真任務(wù),需要描述對象也是不一樣的。但是,一個(gè)可視化的三維模型是必須的。比如,通

    2024年02月06日
    瀏覽(174)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包