超詳細,教你用python語言實現(xiàn)QQ機器人制作教程
前期準備
1、機器人框架的下載和配置
首先需要一個qq機器人框架,我使用的是基于mirai 以及 MiraiGo 開發(fā)的go-cqhttp(里面有開發(fā)文檔)。
Windows下32位文件為 go-cqhttp-v*-windows-386.zip
Windows下64位文件為 go-cqhttp-v*-windows-amd64.zip
Windows下arm用(如使用高通CPU的筆記本)文件為 go-cqhttp-v*-windows-arm.zip
選擇合適的壓縮包下載,然后解壓。
雙擊exe文件,出現(xiàn)如下窗口:
輸入1后回車,然后關(guān)閉,此時已經(jīng)在原來的文件目錄下生成了配置文件config.yml。
雙擊config.yml,輸入QQ號和密碼(建議使用無登錄保護的qq,否則可能出現(xiàn)滑塊驗證等問題)。
再轉(zhuǎn)到最后兩行,把注釋去掉。(很重要)
可以參考我的配置:
# go-cqhttp 默認配置文件
account: # 賬號相關(guān)
uin: 1233456 # QQ賬號
password: '123456' # 密碼為空時使用掃碼登錄
encrypt: false # 是否開啟密碼加密
status: 0 # 在線狀態(tài) 請參考 https://docs.go-cqhttp.org/guide/config.html#在線狀態(tài)
relogin: # 重連設置
delay: 3 # 首次重連延遲, 單位秒
interval: 3 # 重連間隔
max-times: 0 # 最大重連次數(shù), 0為無限制# 是否使用服務器下發(fā)的新地址進行重連
# 注意, 此設置可能導致在海外服務器上連接情況更差
use-sso-address: trueheartbeat:
# 心跳頻率, 單位秒
# -1 為關(guān)閉心跳
interval: 5message:
# 上報數(shù)據(jù)類型
# 可選: string,array
post-format: string
# 是否忽略無效的CQ碼, 如果為假將原樣發(fā)送
ignore-invalid-cqcode: false
# 是否強制分片發(fā)送消息
# 分片發(fā)送將會帶來更快的速度
# 但是兼容性會有些問題
force-fragment: false
# 是否將url分片發(fā)送
fix-url: false
# 下載圖片等請求網(wǎng)絡代理
proxy-rewrite: ''
# 是否上報自身消息
report-self-message: false
# 移除服務端的Reply附帶的At
remove-reply-at: false
# 為Reply附加更多信息
extra-reply-data: false
# 跳過 Mime 掃描, 忽略錯誤數(shù)據(jù)
skip-mime-scan: falseoutput:
# 日志等級 trace,debug,info,warn,error
log-level: warn
# 日志時效 單位天. 超過這個時間之前的日志將會被自動刪除. 設置為 0 表示永久保留.
log-aging: 15
# 是否在每次啟動時強制創(chuàng)建全新的文件儲存日志. 為 false 的情況下將會在上次啟動時創(chuàng)建的日志文件續(xù)寫
log-force-new: true
# 是否啟用 DEBUG
debug: false # 開啟調(diào)試模式# 默認中間件錨點
default-middlewares: &default
# 訪問密鑰, 強烈推薦在公網(wǎng)的服務器設置
access-token: ''
# 事件過濾器文件目錄
filter: ''
# API限速設置
# 該設置為全局生效
# 原 cqhttp 雖然啟用了 rate_limit 后綴, 但是基本沒插件適配
# 目前該限速設置為令牌桶算法, 請參考:
# https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
rate-limit:
enabled: false # 是否啟用限速
frequency: 1 # 令牌回復頻率, 單位秒
bucket: 1 # 令牌桶大小database: # 數(shù)據(jù)庫相關(guān)設置
leveldb:
# 是否啟用內(nèi)置leveldb數(shù)據(jù)庫
# 啟用將會增加10-20MB的內(nèi)存占用和一定的磁盤空間
# 關(guān)閉將無法使用 撤回 回復 get_msg 等上下文相關(guān)功能
enable: true# 連接服務列表
servers:
# 添加方式,同一連接方式可添加多個,具體配置說明請查看文檔
#- http: # http 通信
#- ws: # 正向 Websocket
#- ws-reverse: # 反向 Websocket
#- pprof: #性能分析服務器
# HTTP 通信設置
- http:
# 服務端監(jiān)聽地址
host: 127.0.0.1
# 服務端監(jiān)聽端口
port: 5700
# 反向HTTP超時時間, 單位秒
# 最小值為5,小于5將會忽略本項設置
timeout: 5
# 長輪詢拓展
long-polling:
# 是否開啟
enabled: false
# 消息隊列大小,0 表示不限制隊列大小,謹慎使用
max-queue-size: 2000
middlewares:
<<: *default # 引用默認中間件
# 反向HTTP POST地址列表
post:
#- url: '' # 地址
# secret: '' # 密鑰
- url: 127.0.0.1:5701 # 地址
secret: '' # 密鑰
配置完后直接雙擊exe文件。等待一段時間出現(xiàn)如下窗口:
補充:窗口可能會一直出現(xiàn)如下警告(這個不需要管,是正?,F(xiàn)象):
窗口會一直顯示接受到信息,不要關(guān)閉。
2、python的配置和安裝
要實現(xiàn)自動回復功能的機器人需要借助一種語言,我選擇的是python。
所以需要電腦配置好python環(huán)境和下載編譯器pycharm。可以直接上網(wǎng)找相關(guān)的安裝和配置教程,這里就不展開說了。
具體實現(xiàn)
1、發(fā)送信息
這包括發(fā)送私聊信息和發(fā)送群聊信息。下面的函數(shù)已經(jīng)寫好了,直接調(diào)用函數(shù)傳入?yún)?shù)就行了。
import socket def send_msg(resp_dict): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ip = '127.0.0.1' client.connect((ip, 5700)) msg_type = resp_dict['msg_type'] # 回復類型(群聊/私聊) number = resp_dict['number'] # 回復賬號(群號/好友號) msg = resp_dict['msg'] # 要回復的消息 # 將字符中的特殊字符進行url編碼 msg = msg.replace(" ", "%20") msg = msg.replace("\n", "%0a") if msg_type == 'group': payload = "GET /send_group_msg?group_id=" + str( number) + "&message=" + msg + " HTTP/1.1\r\nHost:" + ip + ":5700\r\nConnection: close\r\n\r\n" elif msg_type == 'private': payload = "GET /send_private_msg?user_id=" + str( number) + "&message=" + msg + " HTTP/1.1\r\nHost:" + ip + ":5700\r\nConnection: close\r\n\r\n" print("發(fā)送" + payload) client.send(payload.encode("utf-8")) client.close() return 0
(1)比如發(fā)送私聊信息(QQ用接收者的):
resp_dict={'msg_type':'private','number':QQ號,'msg':'你好'} send_msg(resp_dict)
(2)發(fā)送群聊信息(群號自己用一個):
send_msg({'msg_type': 'group', 'number': QQ群號, 'msg': '大家好'})
(3)當然不止發(fā)送文本信息
還可以發(fā)表情、圖片、音樂等。還可以艾特某人。
例如:發(fā)表情
send_msg({'msg_type': 'group', 'number': QQ群號, 'msg': '[CQ:shake]'})
發(fā)窗口抖動
send_msg({'msg_type': 'group', 'number': QQ群號, 'msg': '[CQ:shake]'})
還有很多CQcode可以去官方文檔查看:http://docs.go-cqhttp.org/cqcode/
2、獲取群成員列表
import requests def get_group(id): response = requests.post('http://127.0.0.1:5700/get_group_member_list?group_id='+str(id)).json() for i in response['data']: if(i['card']!=''): print(i['card']+str(i['user_id'])) else: print(i['nickname']+str(i['user_id']))
直接調(diào)用即可(群號隨便用一個)
get_group(QQ群號)
會打印出所有群成員的群昵稱(未編輯群昵稱的打印QQ昵稱)和QQ號。
3、接收上報的事件
下面這個代碼命名為receive.py,之后方便調(diào)用。
這個返回的是事件的上報信息,包括接收到的信息、加好友請求等等。
import socket import json ListenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ListenSocket.bind(('127.0.0.1', 5701)) ListenSocket.listen(100) HttpResponseHeader = '''HTTP/1.1 200 OK Content-Type: text/html ''' def request_to_json(msg): for i in range(len(msg)): if msg[i]=="{" and msg[-1]=="\n": return json.loads(msg[i:]) return None #需要循環(huán)執(zhí)行,返回值為json格式 def rev_msg():# json or None Client, Address = ListenSocket.accept() Request = Client.recv(1024).decode(encoding='utf-8') rev_json=request_to_json(Request) Client.sendall((HttpResponseHeader).encode(encoding='utf-8')) Client.close() return rev_json
4、實現(xiàn)簡單的自動回復
需要寫一個whil循環(huán)一直接收返回的rev,然后根據(jù)字段里面的信息做出回應。
下面的代碼需要改一處地方,改為你機器人的QQ號。
from receive import rev_msg import socket import requests import random while True: try: rev = rev_msg() print(rev) if rev == None: continue except: continue if rev["post_type"] == "message": #print(rev) #需要功能自己DIY if rev["message_type"] == "private": #私聊 if rev['raw_message']=='在嗎': qq = rev['sender']['user_id'] send_msg({'msg_type':'private','number':qq,'msg':'我在'}) elif rev["message_type"] == "group": #群聊 group = rev['group_id'] if "[CQ:at,qq=機器人的QQ號]" in rev["raw_message"]: if rev['raw_message'].split(' ')[1]=='在嗎': qq=rev['sender']['user_id'] send_msg({'msg_type':'group','number':group,'msg':'[CQ:poke,qq={}]'.format(qq)}) else: continue else: # rev["post_type"]=="meta_event": continue
上述代碼實現(xiàn)的是,當私聊對方發(fā)送在嗎時回復我在;
當群聊有人艾特并發(fā)送在嗎時會戳一戳對方。
大家也可以去官方文檔查看所有的事件和API,實現(xiàn)各種各樣的功能。
下一篇文章實現(xiàn)更多功能 教你使用python搭建一個QQ機器人實現(xiàn)叫起床服務
包括定時發(fā)送消息、智能聊天、天氣、星座運勢等等。
以上就是超詳細的教你用python語言實現(xiàn)QQ機器人制作教程的詳細內(nèi)容,更多關(guān)于python語言實現(xiàn)QQ機器人制作教程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 找出出現(xiàn)次數(shù)超過數(shù)組長度一半的元素實例
這篇文章主要介紹了Python 找出出現(xiàn)次數(shù)超過數(shù)組長度一半的元素實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05淺談Python的自省Introspection和反射機制Reflection
這篇文章主要介紹了淺談Python的自省Introspection和反射機制Reflection,反射就是通過字符串的形式去對象(模塊)中操作(查找/獲取/刪除/添加)成員,一種基于字符串的事件驅(qū)動,需要的朋友可以參考下2023-08-08python錯誤提示:Errno?2]?No?such?file?or?directory的解決方法
我相信很多人在學習Python的時候,特別是在open文件的時候總還碰到,還報錯IOError:[Errno?2]沒有這樣的文件或目錄:'E://aaa.txt',這篇文章主要給大家介紹了關(guān)于python錯誤提示:Errno?2]?No?such?file?or?directory的解決方法,需要的朋友可以參考下2022-02-02