本人博客
https://blog.seclusion.work
序言
本篇文章記錄我搭建QQ機器人的步驟及踩過的坑
使用的是 go-cqhttp 項目,基於 mirai 以及 MiraiGo (opens new window)開發的 cqhttp golang 原生實現, 並在 cqhttp 原版 (opens new window)的基礎上做了部分修改和拓展。
我使用的python語言編寫功能模塊
大致流程
一 : 下載解壓go-cqhttp
二 : 開放端口
三 : 運行配置go-cqhttp
四 : 編寫機器人功能模塊
正文
一 : 下載解壓go-cqhttp
因為服務器不便於下載解壓與編寫模塊,所以我建議在window下完成
下載go-cqhttp最新版本到本地並解壓 https://github.com/Mrs4s/go-cqhttp/releases 注意下載對應的 Linux版
使用ssh工具上傳到服務器的指定目錄,我使用的是 FinalShell http://www.hostbuf.com/downloads/finalshell_install.exe
連接完在軟件下方出現的文件夾中,創建你能記住的機器人目錄,並上傳剛剛下載解壓好的go-cqhttp文件夾
二 : 開放端口
這個端口是機器人處理事務用的端口
開放的端口號隨意,你記住就行 但不能是80,8080,8181,3306,443等等常見端口,會占用
1 ufw allow 1314
2
3 iptables -I INPUT -p tcp --dport 1314 -j ACCEPT 4
5 iptables-save > /etc/iptables.up.rules 6
7 iptables-restore < /etc/iptables.up.rules
顯然我這里開放的是1314端口
三 : 運行配置
cd /NaiveBot/goqq/ //進入到你的go-cq'http主程序目錄
./go-cqhttp //現在是第一次運行,會報錯退出並生成一個config.hjson文件
如果你使用的是我前文推薦的 FinalShell ,可以在軟件下方文件夾中右鍵config文件,選擇我們window上的軟件打開並編譯
所以我是在window的Sublime編輯的
1 /* 2 go-cqhttp 默認配置文件 3 */ 4
5 { 6 // QQ號 7 uin: 6666666 8 // QQ密碼 9 password: "6666666666" 10 // 是否啟用密碼加密 11 encrypt_password: false 12 // 加密后的密碼, 如未啟用密碼加密將為空, 請勿隨意修改. 13 password_encrypted: "" 14 status: 4 15 // 是否啟用內置數據庫 16 // 啟用將會增加10-20MB的內存占用和一定的磁盤空間 17 // 關閉將無法使用 撤回 回復 get_msg 等上下文相關功能 18 enable_db: true 19 // 訪問密鑰, 強烈推薦在公網的服務器設置 20 access_token: "" 21 // 重連設置 22 relogin: { 23 // 是否啟用自動重連 24 // 如不啟用掉線后將不會自動重連 25 enabled: true 26 // 重連延遲, 單位秒 27 relogin_delay: 3 28 // 最大重連次數, 0為無限制 29 max_relogin_times: 0 30 } 31 // API限速設置 32 // 該設置為全局生效 33 // 原 cqhttp 雖然啟用了 rate_limit 后綴, 但是基本沒插件適配 34 // 目前該限速設置為令牌桶算法, 請參考: 35 // https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin 36 _rate_limit: { 37 // 是否啟用限速 38 enabled: false 39 // 令牌回復頻率, 單位秒 40 frequency: 1 41 // 令牌桶大小 42 bucket_size: 1 43 } 44 // 是否忽略無效的CQ碼 45 // 如果為假將原樣發送 46 ignore_invalid_cqcode: false 47 // 是否強制分片發送消息 48 // 分片發送將會帶來更快的速度 49 // 但是兼容性會有些問題 50 force_fragmented: false 51 // 心跳頻率, 單位秒 52 // -1 為關閉心跳 53 heartbeat_interval: -1 54 // HTTP設置 55 http_config: { 56 // 是否啟用正向HTTP服務器 57 enabled: true 58 // 服務端監聽地址 59 //host: 60 // 服務端監聽端口 61 //port: 62 // 反向HTTP超時時間, 單位秒 63 // 最小值為5,小於5將會忽略本項設置 64 timeout: 0 65 // 反向HTTP POST地址列表 66 // 格式: 67 // { 68 // 地址: secret 69 // } 70 post_urls: {} 71 } 72 // 正向WS設置 73 ws_config: { 74 // 是否啟用正向WS服務器 75 enabled: false 76 // 正向WS服務器監聽地址 77 host: 0.0.0.0 78 // 正向WS服務器監聽端口 79 port: 6700 80 } 81 // 反向WS設置 82 ws_reverse_servers: [ 83 // 可以添加多個反向WS推送 84 { 85 // 是否啟用該推送 86 enabled: true 87 // 反向WS Universal 地址 88 // 注意 設置了此項地址后下面兩項將會被忽略 89 // 留空請使用 "" 90 reverse_url: ws://127.0.0.4:1314/ws 91 // 反向WS API 地址 92 reverse_api_url: ws://you_websocket_api.server 93 // 反向WS Event 地址 94 reverse_event_url: ws://you_websocket_event.server 95 // 重連間隔 單位毫秒 96 reverse_reconnect_interval: 3000 97 } 98 ] 99 // 上報數據類型 100 // 可選: string array 101 post_message_format: string 102 // 是否使用服務器下發的新地址進行重連 103 // 注意, 此設置可能導致在海外服務器上連接情況更差 104 use_sso_address: false 105 // 是否啟用 DEBUG 106 debug: false 107 // 日志等級 trace,debug,info,warn,error 108 log_level: "info" 109 // WebUi 設置 110 web_ui: { 111 // 是否啟用 WebUi 112 enabled: false 113 // 監聽地址 114 host : 127.0.0.6 115 // 監聽端口 116 web_ui_port: 1316 117 // 是否接收來自web的輸入 118 web_input: false 119 } 120 }
配置如上面代碼,都有注釋
其中uin為機器人QQ號 password為密碼 status為登入協議
我采用了Websocket反向接口,所以只開啟了86行的代碼,並在90行位置填寫你監聽的IP地址和第二步開放的端口號
reverse_url: ws://127.0.0.4:1314/ws //其中的127.0.0.4隨意寫,1314改成你第二步開放的端口號
至此,再次運行go-cqhttp
./go-cqhttp
不出意外能登入,但要驗證,聰明的你自己解決驗證問題
我在這里給出滑塊驗證的官方參考 https://docs.go-cqhttp.org/faq/slider.html
解決完驗證后, 向機器人發送消息,你的命令符已經能看見了
如果呀,在登入時出現端口占用的提示,執行如下步驟
root@yzg-server:/NaiveBot/goqq# netstat -lnp | grep 1314
tcp 0 0 127.0.0.4:1314 0.0.0.0:* LISTEN 3140/python3
命令是 netstat -lnp | grep 端口號
可以看到是python3占用,他的進程號是 3140 ,我們接下來殺這個進程
kill -9 3410
現在可以重新運行go,妙手回春
四 : 編寫功能模塊
給了我寫的服務,按下文參考內容 https://nepenthicstore.lanzoui.com/iqx5upitn5a
唉,涉及了python環境問題,Ubuntu20.4以上是自帶了python3,淘汰了2,查詢自己是否有環境如下
root@yzg-server:/NaiveBot/goqq# python3
Python 3.8.5 (default, Jan 27 2021, 15:41:15)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
我這里自帶了3.8.5,如果你沒有的話,參考一下網上的方法我就不多言 https://www.jianshu.com/p/fe0b278b8916
接下來我就默認你配置好了python呦
不管你用什么程序寫python,新建一個項目,項目名隨意,我使用了我機器人的名字Naive
項目里新建 bot.py bot_config.py apps目錄,並在apps目錄下再新建plugins目錄,這是官方建議
bot的文件編寫 :
1 # -*- codeing = utf-8 -*-
2 # @TIME : 2021/5/18 5:49
3 # @Auther : 幼稚鬼(Naive)
4 # @what are you to do? : 機器人入口
5
6 from os import path 7 import nonebot 8 from nonebot import session 9
10 import bot_config 11
12 nonebot.init(bot_config) # 引入config配置
13
14 nonebot.load_plugins( 15 path.join(path.dirname(__file__), 'apps', 'plugins'), 16 'apps.plugins'
17 ) # 引入插件庫 第一個參數是插件目錄的路徑 第二個參數是導入插件模塊時使用的模塊名前綴
18
19 # 如果使用 asgi
20 bot = nonebot.get_bot() 21 app = bot.asgi 22
23
24 if __name__ == '__main__': 25 nonebot.run()
bot_config.py文件編寫 : 第八行寫你管理機器人的QQ非機器人QQ 16,17行寫你第三步config文件監聽的地址和端口
1 # -*- codeing = utf-8 -*-
2 # @TIME : 2021/5/18 5:51
3 # @Auther : 幼稚鬼(Naive)
4 # @what are you to do? : 機器人的配置
5 from datetime import timedelta 6 from nonebot.default_config import *
7
8 SUPERUSERS = {2297813468} # 可以是 set、list、tuple 等類型,元素類型為 int;超級用戶的 QQ
9
10 COMMAND_START = {'', '/', '!', '/', '!'} # 命令頭 可以是 list、tuple、set 等任意容器類型,元素類型可以是 str 或正則表達式
11
12 NICKNAME = {'Naive', 'naive', '幼稚鬼'} # 機器人昵稱,設定后 "@機器人 天氣" 和 "lucia 天氣" 效果相同。
13
14 SESSION_EXPIRE_TIMEOUT = timedelta(minutes=2) # 表示一條命令的超時(沒有用戶輸入)時間。
15
16 HOST = '127.0.0.4' # 服務器和端口
17 PORT = 1314
18
19 DEBUG = False # 關閉調試輸出,提升性能。
現在基本需要已經解決,機器人有了基本處理能力,現在我們實戰加一個翻譯功能
在plugins目錄下新建一個 translation目錄,並在此目錄下新建 一個__init__.py
在 __init__.py 里編寫 :
# -*- codeing = utf-8 -*- # @TIME : 2021/5/18 20:24 # @Auther : 幼稚鬼(Naive) # @what are you to do? : 實現翻譯功能
import requests from nonebot.command import CommandSession from nonebot.experimental.plugin import on_command __plugin_name__ = '翻譯'
__plugin_usage__ = '用法 : 翻譯 xxxx' @on_command('翻譯', permission=lambda sender: sender.is_privatechat or sender.is_superuser) async def trans(session: CommandSession): need = session.get('need', prompt='你想翻譯的內容呢?') answer = await transMain(need) await session.send(answer) @trans.args_parser async def _(session: CommandSession): stripped_arg = session.current_arg_text.strip() if session.is_first_run: if stripped_arg: session.state['need'] = stripped_arg return
if not stripped_arg: session.pause('翻譯內容為空') session.state[session.current_key] = stripped_arg async def transMain(need: str) -> str: formdata = { # 傳入翻譯內容
"q": need, "from": "Auto", "to": "Auto", } url = "https://aidemo.youdao.com/trans" response = requests.post(url, params=formdata) answer = str(response.json()['translation'][0]) return answer
現在翻譯功能已經有了,我們把整個Naive項目文件夾通過FinalShell上傳到服務器上,前文已教
學過python的朋友應該知道我們新建的幾個py文件使用了一些庫,顯然服務器的python是沒有的,使用我們在服務器上也要安裝對應庫
命令是
pip install 庫名 ///或者是 pip3 install 庫名
解決完庫問題
cd到機器人目錄啟動機器人
然后新建一個命令窗口
cd到bot.py的目錄 python3 bot.py 啟動服務
給機器人發 翻譯 xxxx,應該能回復
以后你要開發的功能也在plugins新建即可,再見!!!