Linux部署QQ机器人

Linux部署QQ机器人

共计8400字,阅读大约28分钟。

序言

专题内容

  • 记录我搭建的步骤及踩过的坑
  • 未来加一些功能分享

框架

使用的是 go-cqhttp 项目 : 基于 mirai 以及 MiraiGo (opens new window)开发的 cqhttp golang 原生实现, 并在 cqhttp 原版 (opens new window)的基础上做了部分修改和拓展。

技术需求

  • 了解linux
  • 简单使用一门语言(本篇使用python)

克隆go-cq

直接拉取

自己找个文件夹放  https://github.com/Mrs4s/go-cqhttp

手动解压

下载go-cqhttp最新版本到本地并解压 https://github.com/Mrs4s/go-cqhttp/releases 注意下载对应的 Linux版

使用ssh工具上传到服务器的指定目录,我使用的是 FinalShell http://www.hostbuf.com/downloads/finalshell_install.exe

图片[1] | Web Stack | Linux部署QQ机器人 | 一个栈
创建新连接
图片[2] | Web Stack | Linux部署QQ机器人 | 一个栈
添加信息
图片[3] | Web Stack | Linux部署QQ机器人 | 一个栈
上传

开放端口

这个端口是机器人处理事务用的端口

开放的端口号随意,你记住就行  但不能是80,8080,8181,3306,443等等常见端口,会占用

ufw allow 1314
iptables -I INPUT -p tcp --dport 1314 -j ACCEPT
iptables-save > /etc/iptables.up.rules
iptables-restore < /etc/iptables.up.rules

显然我这里开放的是1314端口

配置go-cq

进入目录

cd /NaiveBot/goqq/       //进入到你的go-cq'http主程序目录
 
./go-cqhttp                  //现在是第一次运行,会报错退出并生成一个config.hjson文件

修改配置

配置如下面代码,都有注释

其中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 默认配置文件
*/

{
    // QQ号
    uin: 6666666
    // QQ密码
    password: "6666666666"
    // 是否启用密码加密
    encrypt_password: false
    // 加密后的密码, 如未启用密码加密将为空, 请勿随意修改.
    password_encrypted: ""
    status: 4
    // 是否启用内置数据库
    // 启用将会增加10-20MB的内存占用和一定的磁盘空间
    // 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
    enable_db: true
    // 访问密钥, 强烈推荐在公网的服务器设置
    access_token: ""
    // 重连设置
    relogin: {
        // 是否启用自动重连
        // 如不启用掉线后将不会自动重连
        enabled: true
        // 重连延迟, 单位秒
        relogin_delay: 3
        // 最大重连次数, 0为无限制
        max_relogin_times: 0
    }
    // 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_size: 1
    }
    // 是否忽略无效的CQ码
    // 如果为假将原样发送
    ignore_invalid_cqcode: false
    // 是否强制分片发送消息
    // 分片发送将会带来更快的速度
    // 但是兼容性会有些问题
    force_fragmented: false
    // 心跳频率, 单位秒
    // -1 为关闭心跳
    heartbeat_interval: -1
    // HTTP设置
    http_config: {
        // 是否启用正向HTTP服务器
        enabled: true
        // 服务端监听地址
        //host:
        // 服务端监听端口
        //port:
        // 反向HTTP超时时间, 单位秒
        // 最小值为5,小于5将会忽略本项设置
        timeout: 0
        // 反向HTTP POST地址列表
        // 格式:
        // {
        //    地址: secret
        // }
        post_urls: {}
    }
    // 正向WS设置
    ws_config: {
        // 是否启用正向WS服务器
        enabled: false
        // 正向WS服务器监听地址
        host: 0.0.0.0
        // 正向WS服务器监听端口
        port: 6700
    }
    // 反向WS设置
    ws_reverse_servers: [
        // 可以添加多个反向WS推送
        {
            // 是否启用该推送
            enabled: true
            // 反向WS Universal 地址
            // 注意 设置了此项地址后下面两项将会被忽略
            // 留空请使用 ""
            reverse_url: ws://127.0.0.4:1314/ws
            // 反向WS API 地址
            reverse_api_url: ws://you_websocket_api.server
            // 反向WS Event 地址
            reverse_event_url: ws://you_websocket_event.server
            // 重连间隔 单位毫秒
            reverse_reconnect_interval: 3000
        }
    ]
    // 上报数据类型
    // 可选: string array
    post_message_format: string
    // 是否使用服务器下发的新地址进行重连
    // 注意, 此设置可能导致在海外服务器上连接情况更差
    use_sso_address: false
    // 是否启用 DEBUG
    debug: false
    // 日志等级 trace,debug,info,warn,error
    log_level: "info"
    // WebUi 设置
    web_ui: {
        // 是否启用 WebUi
        enabled: false
        // 监听地址
        host : 127.0.0.6
        // 监听端口
        web_ui_port: 1316
        // 是否接收来自web的输入
        web_input: false
    }
}

再次运行

./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目录,这是官方建议

图片[4] | Web Stack | Linux部署QQ机器人 | 一个栈
目录结构

bot文件

# -*- codeing = utf-8 -*-
# @TIME : 2021/5/18 5:49
# @Auther : 幼稚鬼(Naive)
# @what are you to do? :    机器人入口

from os import path
import nonebot
from nonebot import session

import bot_config

nonebot.init(bot_config)  # 引入config配置

nonebot.load_plugins(
    path.join(path.dirname(__file__), 'apps', 'plugins'),
    'apps.plugins'
)  # 引入插件库 第一个参数是插件目录的路径 第二个参数是导入插件模块时使用的模块名前缀

# 如果使用 asgi
bot = nonebot.get_bot()
app = bot.asgi


if __name__ == '__main__':
    nonebot.run()

bot_config文件

第八行写你管理机器人的QQ非机器人QQ  16,17行写你第三步config文件监听的地址和端口

# -*- codeing = utf-8 -*-
# @TIME : 2021/5/18 5:51
# @Auther : 幼稚鬼(Naive)
# @what are you to do? :  机器人的配置
from datetime import timedelta
from nonebot.default_config import *

SUPERUSERS = {2297813468}  # 可以是 set、list、tuple 等类型,元素类型为 int;超级用户的 QQ

COMMAND_START = {'', '/', '!', '/', '!'}  # 命令头 可以是 list、tuple、set 等任意容器类型,元素类型可以是 str 或正则表达式

NICKNAME = {'Naive', 'naive', '幼稚鬼'}  # 机器人昵称,设定后 "@机器人 天气" 和 "lucia 天气" 效果相同。

SESSION_EXPIRE_TIMEOUT = timedelta(minutes=2)  # 表示一条命令的超时(没有用户输入)时间。

HOST = '127.0.0.4'  # 服务器和端口
PORT = 1314

DEBUG = False  # 关闭调试输出,提升性能。

功能代码区

现在基本需要已经解决,机器人有了基本处理能力,现在我们实战加一个翻译功能

在plugins目录下新建一个 translation目录,并在此目录下新建 一个__init__.py

图片[5] | Web Stack | Linux部署QQ机器人 | 一个栈
目录结构
# -*- 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

现在翻译功能已经有了(当然这是2021年的代码,可能api失效了),我们把整个Naive项目文件夹通过FinalShell上传到服务器上,前文已教

学过python的朋友应该知道我们新建的几个py文件使用了一些库,显然服务器的python是没有的,使用我们在服务器上也要安装对应库

pip install 库名
///或者是
pip3 install 库名

结束

解决完库问题

  cd到机器人目录启动机器人

  然后新建一个命令窗口

  cd到bot.py的目录   python3 bot.py  启动服务

  给机器人发 翻译 xxxx,应该能回复

以后你要开发的功能也在plugins新建即可

有机会再下文见

# -*- 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
温馨提示:本文最后更新于2022-10-04 01:45:09,某些文章具有时效性,若有错误或已失效,请在下方留言或联系雅舍站长
© 版权声明
THE END
有所帮助就支持一下吧
点赞12当赏 分享
箴言区 抢沙发
头像
达瓦里希请发言...
提交
头像

昵称

取消
昵称表情代码图片