本文最初发布于简书:从零开始微信机器人(一):wxpy简介(登录、消息发送、注册回复)

本文Github源代码地址:locoda/connector-wechat-bot (代码适用版本为python 3.6)


在过去的几个月中,由于在新生群中回答问题费时费力,同时又有许多重复而又有固定答案的回答,我受到一些知乎文章的启发,维护了一个基于itchat的群聊机器人。从刚开始接入图灵机器人时只会尬聊的机器人,之后又加入了api.ai的按照消息内容自动回复,而后再加入了回复表情功能,使得机器人变得越来越有趣。

现在,由于itchat的更新和被wxpy一些更有趣的功能所吸引,我计划将这个机器人分步重写,并将完整的机器人构建步骤展现给大家。这是我第一次做这样的事,有诸多不足之处,也希望多多谅解和指正。

本文很大程度上面向仅对python入门或是了解较少的开发者因此较为详细,希望最大程度上帮助大家从零开始构建一个属于自己的微信机器人,哪怕仅有很少的编程基础。每一篇会将长度控制在较短、能够快速阅读完的范围内。

本文基于python 2.7,与python 3可能有略微语法上区别。

安装wxpy

安装wxpy非常简单,如果你拥有pip,请直接按照Github中的方法安装:

从 PYPI 官方源下载安装 (在国内可能比较慢或不稳定):

pip install -U wxpy

从豆瓣 PYPI 镜像源下载安装 (推荐国内用户选用):

pip install -U wxpy -i "https://pypi.doubanio.com/simple/"

登录微信

(这里吐槽一下wxpy文档中登录错写为登陆)

Github上和文档中给出了最简单的登录机器人的方式,在程序中写上这两行并运行,会通过图片扫描二维码并登录微信。

# 导入模块
from wxpy import *
# 初始化机器人,扫码登陆
bot = Bot()

有些情况下,可能不能通过终端打开图片(例如部署在服务器上时),我们可以通过参数选择在终端内显示二维码,这样代码会变为:

from wxpy import *
bot = Bot(console_qr=True)

如果你发现这样设置终端中的二维码变形了,可以尝试传入console_qr=1(或其他倍数)来进行调整字幅宽度。如果需要反色显示,可以使用负数来进行反色操作。

如果你认为每次都需要扫描二维码很麻烦,可以启用缓存,来保存自己的登录状态:

bot = Bot(console_qr=True, cache_path=True)

发送消息

首先我们尝试给自己和文件传输助手发消息:

# 给机器人自己发送消息
bot.self.send('Hello World!')
# 给文件传输助手发送消息
bot.file_helper.send('Hello World!')

如果无法给机器人自身发送消息,请参考机器人对象 - wxpy 0.3.9.7 文档

# 查找昵称为'乙醚。'的好友
my_friend = bot.friends().search(u'乙醚。')[0]
# <Friend: 乙醚。>

wxpy同时也包括了发送不同类型消息的方法,通过这些方法我们可以发送各种不同类型的消息。以下是文档给出的样例使用方式:

# 发送文本
my_friend.send('Hello, WeChat!')
# 发送图片
my_friend.send_image('my_picture.png')
# 发送视频
my_friend.send_video('my_video.mov')
# 发送文件
my_friend.send_file('my_file.zip')
# 以动态的方式发送图片
my_friend.send('@img@my_picture.png')

通过使用这些方法,我们就可以自定义一个在合适的时候做合适的事情的机器人了!

由于群聊机器人设计暂时需要好友相关内容不多,此处不再作过过多赘述,如果有需要搜索好友的可以参考聊天对象 - wxpy 0.3.9.7 文档

自动处理消息

wxpy提供了注册消息的方法,可以简单将各种类型的消息注册并自定义处理方式。

注册消息使用简单的@bot.register()方法,

# 获取所有类型的消息(好友消息、群聊、公众号,不包括任何自己发送的消息)
# 并将获得的消息打印到控制台
@bot.register()
def print_others(msg):print(msg)

同时wxpy也可以给注册消息的类型加上限制,

# 回复 my_friend 发送的消息
@bot.register(my_friend)
def reply_my_friend(msg):return 'received: {} ({})'.format(msg.text, msg.type)# 回复发送给自己的消息,可以使用这个方法来进行测试机器人而不影响到他人
@bot.register(bot.self, except_self=False)
def reply_self(msg):return 'received: {} ({})'.format(msg.text, msg.type)# 打印出所有群聊中@自己的文本消息,并自动回复相同内容
# 这条注册消息是我们构建群聊机器人的基础
@bot.register(Group, TEXT)
def print_group_msg(msg):if msg.is_at:print(msg)msg.reply(meg.text)

当然仅仅写以上内容,会导致你的程序主程序运行结束自然退出。wxpy给出了embed()方法,在程序末尾(或其他你想要暂停调试的地方)加上embed()方法就可以让程序保持运行,同时进入Python命令行。

# 进入 Python 命令行、让程序保持运行
# 推荐使用
embed()# 或者仅仅堵塞线程
# bot.join()

关于消息注册的文档,更多内容可以参考消息处理 - wxpy 0.3.9.7 文档

现在,你已经可以用这个微信机器人和自动回复消息玩了!刺不刺激呢!

下一篇中,我将就如何将API接入机器人进行阐述。

你可能会遇到的一些问题

报错[SSL: CERTIFICATE_VERIFY_FAILED]

可能的解决方案一:

pip install -U requests[security]

可能的解决方案二:

进如python后运行:

import certifi
print(certifi.old_where())
# /usr/local/lib/python2.7/site-packages/certifi/weak.pem

把打印出的路径放入环境变量REQUESTS_CA_BUNDLE中。具体而言是在*nix环境下运行:

export REQUESTS_CA_BUNDLE='What you get'

或是在Windows中使用系统面板进行修改。

从零开始微信机器人(一):wxpy简介(登录、消息发送、注册回复)相关推荐

  1. 微信公众号如何实现模板消息发送的功能

    微信公众号为技术人员提供了开发接口,会代码的可以自己买服务器买域名开发,不会写代码.嫌麻烦.高成本,可以直接用微号帮平台,微信第三方平台. 实现模板消息发送功能,不限发送次数.无限群发,只要不违背微信 ...

  2. python、C# 写企业微信机器人推送【图文消息】

    企业微信机器人发送图文消息(基础版) 使用工具 进入代码模式 1. 引入 2. 发送方式 3. 发送到企业微信机器人步骤 3. 总代码 C#写法 看下效果图: 代码展示 使用工具 突然来兴趣搞了个机器 ...

  3. 企业微信-自建应用二:消息发送测试

    1.开发过程 要测试企微自建应用的消息发送功能 企业微信开发者中心-调试工具 建立连接 corpsecret即是自建应用的Secret 输入参数,调用接口,即可拿到返回的token 发送应用消息 填写 ...

  4. 微信小程序实现客服消息自动回复(回复图片消息)

    前提 小程序已经开通了"云开发"功能 在微信开发者工具中打开"云开发",点"设置",点击"其它设置",点击"添 ...

  5. PHP处理微信中带Emoji表情的消息发送和接收(Unicode字符转码编码)

    在进行微信公众号开发者接入的时候,与用户的对话互动中,涉及到的文本信息不仅仅是文字那么简单,其中可能还会包含着各种表情字符,例如「emoji表情」. 百科:  Emoji 由于微信接口中对于emoji ...

  6. Python 微信机器人-通过wxpy库向指定名称的好友发送微信消息实例演示

    原来用的是 itchat 库,想向好友发送消息只能通过 UserName 这个关键词来发送,但是这个 UserName 每次重新登录后都是变的,根本没法定位到指定好友,一般好友的备注或微信名是 Nic ...

  7. Python 微信机器人:itchat库识别消息来源于群聊还是个人

    实现原理: 我们把群里收到的消息和个人接收到的消息都打印出来发现群里的消息会多个 ActualNickName 字段,所以我们直接检测有没有这个字段就好了. 我还选择了触发条件,就是如果谁@我了 ,我 ...

  8. Python 微信机器人-用itchat库向好友发送名片、转发名片实例演示

    先看效果图: 我发给机器人的名片,它存了下来,然后再发送给我. itchat.content.CARD 就是名片类型,当微信接收到名片就会触发. itchat.send_raw_msg() 就是发送名 ...

  9. [微信开发] - 关于测试号以及消息发送及回复

    通过测试号,可以使用微信平台的全面功能. 而微信官方文档中也具体地描述了各种对接端口的参数调用和规则:https://mp.weixin.qq.com/wiki 今天小试牛刀将用户关注微信平台的事件E ...

最新文章

  1. 页面置换算法 - FIFO、LFU、LRU
  2. UNITY 接讯飞语音过程总结
  3. eclipse项目迁移到Android Studio
  4. 基于rancher在线安装k8s集群
  5. unity中单位是米还是厘米_2019-08-22Unity中的单位长度与像素之间的关系
  6. 列车时刻管理c语言程序设计,列车时刻表信息管理系统实践报告C语言源代码
  7. 《Programming WPF》学习(一)Hello WPF
  8. recect build 打包发布后访问出现404错误的简易解决方法
  9. Tensorflow——Tensorboard可视化
  10. 编译原理---代码优化基础(自己看)
  11. ORACLE PL/SQL编程之八: 把触发器说透 |来自cnblogs的EricHu|
  12. readResolve()原理
  13. 数字电路与逻辑设计之集成触发器
  14. 前端的IDE工具对比
  15. oracle查询sql对应用户名,Oracle EBS-SQL (SYS-21):sys_用户名与人员对应关系查询.sql
  16. 如何快速制作证件照并压缩到100K?
  17. 教你 IntelliJ IDEA 永久激活,建议收藏!(转)
  18. 《linux基础》实验2:基本概念及操作
  19. 跳出多层for循环的几种方式
  20. 华硕X43S关闭触控板

热门文章

  1. 分布式数据库TiDB的部署
  2. 游戏王生命值计算机,游戏王        直接扣生命值的卡有什么啊
  3. Android 12.0 第三方app安装完成后默认授予运行时权限
  4. Unity全局光照/Bake GI/Precomputed Real-time GI/Lightmap/Light Probe
  5. Fractal解题笔记
  6. PL2303在win10无法使用的解决办法
  7. c语言编程高阶证书有用吗,信誉好:C语言编程高阶证什么报名流程那可以考取
  8. 中国软件杯——行人检测与跟踪(GitHub地址:https://github.com/dddlli/Swin-Transformer-Object-Detection-PaddlePaddle)
  9. AIX中 |SMIT/SMITTY| 的使用
  10. 【Django 学习笔记】1、基础概念和MVT架构