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

由于Go-CQHTTP的更新,老版的yes酱存在诸多问题(若还是想使用以前的yes酱请移步博客),让新手望而却步,因此,这里开源自己魔改的yes酱,希望能够造福群友和大家一起交流学习Python

新版yes酱说明

魔改后的yes酱生存的环境如下:

  • Python 3.7+
  • Go-CQHTTP 1.0.0.4 beta

新版yes酱在原有基础上基本保持不变,改动如下:

  • 通信方式改为正向websocket
  • 兼容最新版Go-CQHTTP
  • 更改协议为nonebot
  • 新增添加好友自动处理函数
  • 封装了合并转发功能
  • 封装了私聊功能
  • 修复原yes酱猫猫图发送失败问题
  • 新增了几个禁言的字段

准备工作

QQ号注册

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

程序下载

在github下载go-cqhttp,windows 64位选择go-cqhttp_windows_amd64.exe,linux选择go-cqhttp_1.0.0-beta4_linux_amd64.deb:

下载Go-CQHTTP

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

下载Yes酱源码

在cmd窗口输入命令安装python的websocket库:

pip install websocket
pip install websocket-client

新版yes酱配置

go-cqhttp配置

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


双击运行EXE

输入数字2,按下回车:


输入2回车

然后就可以看到本地多了个文件config.yml

生成配置文件

Linux的话直接sudo dpkg -i go-cqhttp_0.9.40-fix5_linux_amd64.deb安装框架,然后在任意处使用命令go-cqhttp启动程序,重复上述操作即可

编辑该文件,更改QQ号、密码(初始设置建议为空,登录成功的几率更高)、以及server下的ws下的address(改为0.0.0.0:6700,表示绑定本地的6700端口),其他都不用改。看一下注释就能明白,这里不做赘述。更改完成后的文件内容如下所示:

# go-cqhttp 默认配置文件

account: # 账号相关
  uin: 123456789 # QQ账号
  password: '' # 密码为空时使用扫码登录
  encrypt: false  # 是否开启密码加密
  status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
  relogin: # 重连设置
    delay: 3   # 首次重连延迟, 单位秒
    interval: 3   # 重连间隔
    max-times: 0  # 最大重连次数, 0为无限制

  # 是否使用服务器下发的新地址进行重连
  # 注意, 此设置可能导致在海外服务器上连接情况更差
  use-sso-address: true
  # 是否允许发送临时会话消息
  allow-temp-session: false

heartbeat:
  # 心跳频率, 单位秒
  # -1 为关闭心跳
  interval: 5

message:
  # 上报数据类型
  # 可选: string,array
  post-format: string
  # 是否忽略无效的CQ码, 如果为假将原样发送
  ignore-invalid-cqcode: false
  # 是否强制分片发送消息
  # 分片发送将会带来更快的速度
  # 但是兼容性会有些问题
  force-fragment: false
  # 是否将url分片发送
  fix-url: false
  # 下载图片等请求网络代理
  proxy-rewrite: ''
  # 是否上报自身消息
  report-self-message: false
  # 移除服务端的Reply附带的At
  remove-reply-at: false
  # 为Reply附加更多信息
  extra-reply-data: false
  # 跳过 Mime 扫描, 忽略错误数据
  skip-mime-scan: false

output:
  # 日志等级 trace,debug,info,warn,error
  log-level: warn
  # 日志时效 单位天. 超过这个时间之前的日志将会被自动删除. 设置为 0 表示永久保留.
  log-aging: 15
  # 是否在每次启动时强制创建全新的文件储存日志. 为 false 的情况下将会在上次启动时创建的日志文件续写
  log-force-new: true
  # 是否启用日志颜色
  log-colorful: true
  # 是否启用 DEBUG
  debug: false # 开启调试模式

# 默认中间件锚点
default-middlewares: &default
  # 访问密钥, 强烈推荐在公网的服务器设置
  access-token: ''
  # 事件过滤器文件目录
  filter: ''
  # 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: 1     # 令牌桶大小

database: # 数据库相关设置
  leveldb:
    # 是否启用内置leveldb数据库
    # 启用将会增加10-20MB的内存占用和一定的磁盘空间
    # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
    enable: true
  sqlite3:
    # 是否启用内置sqlite3数据库
    # 启用将会增加一定的内存占用和一定的磁盘空间
    # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
    enable: false
    cachettl: 3600000000000 # 1h

# 连接服务列表
servers:
  # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
  #- http: # http 通信
  #- ws:   # 正向 Websocket
  #- ws-reverse: # 反向 Websocket
  #- pprof: #性能分析服务器

  - http: # HTTP 通信设置
      address: 0.0.0.0:5700 # HTTP监听地址
      timeout: 5      # 反向 HTTP 超时时间, 单位秒,<5 时将被忽略
      long-polling:   # 长轮询拓展
        enabled: false       # 是否开启
        max-queue-size: 2000 # 消息队列大小,0 表示不限制队列大小,谨慎使用
      middlewares:
        <<: *default # 引用默认中间件
      post:           # 反向HTTP POST地址列表
      #- url: ''                # 地址
      #  secret: ''             # 密钥
      #  max-retries: 3         # 最大重试,0 时禁用
      #  retries-interval: 1500 # 重试时间,单位毫秒,0 时立即
      #- url: http://127.0.0.1:5701/ # 地址
      #  secret: ''                  # 密钥
      #  max-retries: 10             # 最大重试,0 时禁用
      #  retries-interval: 1000      # 重试时间,单位毫秒,0 时立即
  # LambdaServer 配置
  - lambda:
      type: scf # scf: 腾讯云函数 aws: aws Lambda
      middlewares:
        <<: *default # 引用默认中间件
  # 正向WS设置
  - ws:
      # 正向WS服务器监听地址
      address: 0.0.0.0:6700
      middlewares:
        <<: *default # 引用默认中间件
  # 反向WS设置
  - ws-reverse:
      # 反向WS Universal 地址
      # 注意 设置了此项地址后下面两项将会被忽略
      # universal: ws://127.0.0.1:6700/ws
      # 反向WS API 地址
      # api: ws://127.0.0.1:6700/ws
      # 反向WS Event 地址
      # event: ws://127.0.0.1:6700/ws
      # 重连间隔 单位毫秒
      reconnect-interval: 3000
      middlewares:
        <<: *default # 引用默认中间件

Yes酱配置

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

{
    "path":"/pic/mao/",
    "ban_words":["科学上网","黑产","翻墙","huangse","@全体成员"],
    "apikey":"",
    "group":[123456789],
    "self_qq":"987654321"
}

其中:

  • path为项目文件夹下的pic文件夹下的mao文件夹地址,一般无需更改,除非你想换个地方存储

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

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

    apikey申请

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

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

程序运行

go-cqhttp运行

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


运行go-cqhttp

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

linux运行

然后的步骤和老版的Go-CQHTTP一样,大家看看之前的截图就行了。

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


创建设备

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


验证新设备登录

这里输入1按下回车:

回车之后

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

验证页面

选择network等候抓包:

选择network

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


验证的包

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

登陆成功

如果还是不行的话,就将config.yml的配置文件中的密码字段留空,然后启动,之后选择扫码登录即可

yes酱启动

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

python main.py

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

yes酱启动:

yes酱启动

静等出现连接成功字样即可

程序效果

在群聊里艾特yes酱即可:


群聊

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


help菜单

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

私聊

报错处理

这里列举一些常见的错误:

python程序报错

E1. 连接到服务器时出现错误:unexcepted EOF

检查go-cqhttp的配置文件的地址是否有误,端口需和程序里main函数填写的一致。例如:文中github开源代码内填写的端口为6700,则go-cqhttp的配置文件中对应的server.ws.address的端口需要配置为同样的6700

E2. 只出现start,没有出现连接成功

检查go-cqhttp启动时选择的连接方式和python程序是否一致。例如:文中github选择的连接方式为正向ws,则go-cqhttp在创建配置文件时也应选择正向ws,且端口一致(见E1)

E3. setu这个api调用几次之后就没有反应了

这是因为apikey为空的话每天可以调用的次数有限,按照setuAPI的申请方式申请一个apikey即可获得300次/天的调用次数

go-cqhttp报错

E4. No connection could be made because the target machine actively refused it

该错误表明没找到对应连接的python客户端,解决方法同E1E2

E5. 登录不上

请到github更新go-cqhttp到最新版(建议手机和电脑处于同一局域网(例如:连接同一WiFi、手机给电脑开热点、电脑给手机开WiFi等)使用扫码登录,成功率最高)

E6. 同样的配置换个环境(Linux)登录不上

先在本地使用go-cqhttp将账号保持在线大概一个星期,然后就可以顺利移植了

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