jjzjj

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

走错说爱你 2023-10-09 原文

由于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酱部署与调教的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  4. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  5. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  6. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  10. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

随机推荐