新手向 Ubuntu linux服务器搭建部署QQ机器人方法


 

本人博客


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新建即可,再见!!!

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM