新⼿向Ubuntulinux服务器搭建部署QQ机器⼈⽅法序⾔ 本篇⽂章记录我搭建QQ机器⼈的步骤及踩过的坑
使⽤的是项⽬,基于以及开发的 cqhttp golang 原⽣实现, 并在的基础上做了部分修改和拓展。
我使⽤的python语⾔编写功能模块
⼤致流程
⼀ : 下载解压go-cqhttp
⼆ : 开放端⼝
三 : 运⾏配置go-cqhttp
四 : 编写机器⼈功能模块
正⽂
⼀ : 下载解压go-cqhttp
熔炼焊剂
因为服务器不便于下载解压与编写模块,所以我建议在window下完成
连接完在软件下⽅出现的⽂件夹中,创建你能记住的机器⼈⽬录,并上传刚刚下载解压好的go-cqhttp⽂件夹
⼆ : 开放端⼝
这个端⼝是机器⼈处理事务⽤的端⼝
开放的端⼝号随意,你记住就⾏但不能是80,8080,8181,3306,443等等常见端⼝,会占⽤
1 ufw allow 1314
挤出机螺杆2
3 iptables -I INPUT -p tcp --dport 131
4 -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"粘扣
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 // baike.baidu/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
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
不出意外能登⼊,但要验证,聪明的你⾃⼰解决验证问题
解决完验证后, 向机器⼈发送消息,你的命令符已经能看见了
如果呀,在登⼊时出现端⼝占⽤的提⽰,执⾏如下步骤
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,妙⼿回春
四 : 编写功能模块
唉,涉及了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()
接下来我就默认你配置好了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
6from os import path
7import nonebot
8from nonebot import session
9
10import 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 = _bot()
21 app = bot.asgi
22
23
24if__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? : 机器⼈的配置
5from datetime import timedelta
6from 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 nonebotmand import CommandSession
perimental.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 = ('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 = "udao/trans"
response = requests.post(url, params=formdata)
answer = str(response.json()['translation'][0])
return answer