Python开发QQ聊天机器人——Yes酱的部署与调教

Yes酱是一个会发s图的群管理机器人,基于 go-cqhttp,使用OneBot标准的插件开发的一个机器人,支持以下功能:

  • 发送setu/猫猫图返回一张涩图/猫猫图
  • 检测关键字禁言
  • 私聊调教对话

本文主要参考了其官方博客,结合Yes酱的github和go-cqhttp的github的官方教程

最终实现的效果如下:


群聊

环境

  • 系统:Windows 10 or Ubuntu 18.04
  • 编辑器:Sublime Text 3(记事本也可)
  • 浏览器:这里用的Chrome
  • 框架:go-cqhttp
  • Yes酱:Go-CQHTTP-YesBot

准备工作

注:由于该程序依赖的框架go-cqhttp有多处更新,因此在原版基础上进行了改良,详见Python开发QQ聊天机器人——进阶的yes酱部署与调教一文,本文仅留作纪念,不再维护

QQ号注册

一个手机号能够绑定十个QQ号,所以直接在官方网站注册QQ即可,注册完之后记得马上登陆并记下QQ号,最好保持活跃,否则会被收回

程序下载

在github下载go-cqhttp,windows 64位选择go-cqhttp_windows_amd64.exe,linux选择go-cqhttp_0.9.40-fix5_linux_amd64.deb

下载go-cqhttp

在github下载Yes酱源码,可以使用Git下载,也可以直接网页下载解压即可:

下载Yes酱源码

程序配置

go-cqhttp配置

Windows的话直接双击运行下载好的EXE程序,会出现如图所示界面:


双击运行EXE

然后会自动在同级目录下生成一个config.hjson的文件:

生成配置文件

Linux的话直接sudo dpkg -i go-cqhttp_0.9.40-fix5_linux_amd64.deb安装框架,然后在任意处使用命令go-cqhttp启动程序,即会在当前目录下生成config文件

编辑该文件,编辑内容如下:


/*
    go-cqhttp 默认配置文件
*/

{
    // QQ号
    uin: 123456789
    // QQ密码
    password: "XXXXX"
    // 是否启用密码加密
    encrypt_password: false
    // 加密后的密码, 如未启用密码加密将为空, 请勿随意修改.
    password_encrypted: ""
    // 是否启用内置数据库
    // 启用将会增加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: 0
    // HTTP设置
    http_config: {
        // 是否启用正向HTTP服务器
        enabled: true
        // 服务端监听地址
        host: 0.0.0.0
        // 服务端监听端口
        port: 5700
        // 反向HTTP超时时间, 单位秒
        // 最小值为5,小于5将会忽略本项设置
        timeout: 0
        // 反向HTTP POST地址列表
        // 格式: 
        // {
        //    地址: secret
        // }
        post_urls: {
            "127.0.0.1:5701": secret
        }
    }
    // 正向WS设置
    ws_config: {
        // 是否启用正向WS服务器
        enabled: true
        // 正向WS服务器监听地址
        host: 0.0.0.0
        // 正向WS服务器监听端口
        port: 6700
    }
    // 反向WS设置
    ws_reverse_servers: [
        // 可以添加多个反向WS推送
        {
            // 是否启用该推送
            enabled: false
            // 反向WS Universal 地址
            // 注意 设置了此项地址后下面两项将会被忽略
            // 留空请使用 ""
            reverse_url: ws://127.0.0.1:5701
            // 反向WS API 地址
            reverse_api_url: ws://127.0.0.1:5701
            // 反向WS Event 地址
            reverse_event_url: ws://127.0.0.1:5701
            // 重连间隔 单位毫秒
            reverse_reconnect_interval: 3000
        }
    ]
    // 上报数据类型
    // 可选: string array
    post_message_format: string
    // 是否使用服务器下发的新地址进行重连
    // 注意, 此设置可能导致在海外服务器上连接情况更差
    use_sso_address: false
    // 是否启用 DEBUG
    debug: false
    // 日志等级 trace,debug,info,warn,error
    log_level: ""
    // WebUi 设置
    web_ui: {
        // 是否启用 WebUi
        enabled: true
        // 监听地址
        host: 127.0.0.1
        // 监听端口
        web_ui_port: 9999
        // 是否接收来自web的输入
        web_input: false
    }
}

主要改动的有这么几处:

  • 开头的QQ号和密码
  • http设置里的post_urls
  • 反向ws设置中的三个url

linux版本配置

还没试过,配了再写

Yes酱配置

打开yes酱所在的文件夹,找到config.json文件,配置如下:

{
    "path":"E:\\test\\QQbot\\Go-CQHTTP-YesBot-master\\pic\\mao\\",
    "ban_words":["科学上网","黑产","翻墙","huangse"],
    "apikey":"",
    "group":[987654321],
    "self_qq":"123456789"
}

其中:

  • path为项目文件夹下的pic文件夹下的mao文件夹地址,注意使用双反斜杠,末尾也有一个双反斜杠

  • ban_words为想要yes酱禁言的关键词

  • apikey为yes酱调用的setuAPI,可以去申请一个,也可以不填,申请方式如图所示:

    apikey申请

  • group为想要yes酱管理的群号,可以填写多个,用英文逗号分隔即可

  • self_qq为之前注册申请想要用来当机器人的QQ号

找到send_message文件夹下的word_detect.py文件,修改其第106行代码为:

local_img_url = "[CQ:image,file=file:///"+path+choice(setu_list)+"]"

程序运行

go-cqhttp运行

windows的话直接右键,以管理员权限运行即可:


运行go-cqhttp

Linux的话,使用命令nohup go-cqhttp &后台运行:

linux运行

初次运行会自动创建设备:


创建设备

然后需要验证新设备以登录:


验证新设备登录

这里输入1按下回车:

回车之后

鼠标选中-><-之间的网址,按下ctri+shift+C复制链接,然后打开浏览器,在地址栏粘贴链接进入验证页面,在页面空白处右键单击检查

验证页面

选择network等候抓包:

选择network

然后手动拖动滑块,完成验证,查看右边抓到的包:


验证的包

其中的ticket即为需要在命令行输入的字符串。双击该字符串选中复制,随便找个地方粘贴出来看看再复制一遍,然后在命令行窗口单击鼠标右键即可粘贴进去,然后回车,即可看到登陆成功:

登陆成功

yes酱启动

windows的话在yes酱根目录下启动cmd命令行窗口,输入命令启动:

python main.py

linux的话使用命令nohup python main.py &启动,可后台运行

yes酱启动:


yes酱启动

程序效果

在群聊里艾特yes酱即可:


群聊

在群里艾特yes酱发送help即可获得菜单:


help菜单

添加yes酱为好友之后,即可私聊开始调教(这里diy了一下yes酱回答的话语,原句是添加成功!):

私聊

bug解决

注:由于该程序依赖的框架go-cqhttp有多处更新,因此在原版基础上进行了改良,详见Python开发QQ聊天机器人——进阶的yes酱部署与调教一文,本文仅留作纪念,不再维护

因为是第一次接触QQ机器人的开发,其中遇到了不少bug,这里记录下:

P1. 两边程序都没报错,yes酱也显示start,但是在群里艾特她却没有回复
S1. 首先看看是不是自己的网络问题,网速如果太慢的话会需要等一会。这里我自己是因为go-cqhttp的config配置不对,忘了配置反向ws配置选项中的url为本地地址的5701端口,配置好了之后就解决了问题

P2. 猫猫图发送报错,显示路径不对
S2. 按照上述配置仔细检查修改即可

P3. 猫猫图发送内容为一串字符[CQ:image,file=file://E:NPC_Gocqhttppicmao0DEE3C4C2AE7A02C39C86F1E0F618B6A.png],而不是一张图片
S3. 修改路径为上述配置中的样子,并且找到send_message文件夹下的word_detect.py文件,修改其第106行代码为:

local_img_url = "[CQ:image,file=file:///"+path+choice(setu_list)+"]"

主要原因是因为file这个路径会吞掉一个字符,而按照原博主的设置又会报P2的错,因此直接修改源程序,在代码中加入这个字符即可

P4. 其他都ok,但是setu这个api几次之后就没有反应了
S4. 这是因为apikey为空的话每天可以调用的次数有限,按照setuAPI的申请方式申请一个apikey即可获得300次/天的调用次数

你可能感兴趣的:(Python开发QQ聊天机器人——Yes酱的部署与调教)