前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信机器人

微信机器人

作者头像
双鬼带单
发布2018-12-05 16:00:46
7.2K2
发布2018-12-05 16:00:46
举报
文章被收录于专栏:CodingToDie

微信机器人

前几天有人问我,你的微信是不是背盗号了,其实我是在测试聊天机器人

今天讲一下如何使用itchat来写一个机器人

准备环境

python3.x

我这里使用了 PyCharm 进行开发和测试

itchat

tchat是一个开源的微信个人号接口,使用python调用微信从未如此简单

使用它可以方便的完成 回复消息、搜索好友、被添加自动回复、获取好友信息等功能,当然功能不止于这些,这里我们用到了回复信息功能

官网:https://itchat.readthedocs.io/zh/latest/

代码示例

首先你需要安装

代码语言:javascript
复制
pip install itchat

来看个例子

给文件传输助手发一条信息

代码语言:javascript
复制
import itchat

itchat.auto_login()

itchat.send('Hello, filehelper', toUserName='filehelper')

当你运行这段代码的时候,会弹出一个二维码,需要手机微信进行扫码登录,登录成功之后,下一句会向文件助手发送一条消息,同时你的手机上方应该会显示“网页微信已经登录”

这样我们就可以给指定用户发送消息了

退出程序后暂存登陆状态通过如下命令登陆,即使程序关闭,一定时间内重新开启也可以不用重新扫码。

代码语言:javascript
复制
itchat.auto_login(hotReload=True)

添加自动回复

代码语言:javascript
复制
import itchat

@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
    return msg.text

itchat.auto_login()
itchat.run()

通过装饰器,可以提供消息注册的功能,如果接收到消息会运行 text_reply 方法,其中 itchat.content.TEXT 表示是文本类型,该方法会将发送者消息原样发给原发送者,这样就可以完成自动回复的功能,但是这时我们回复的相同文本,能不能差异化呢?

智能回复

在上面我们已经可以将消息原样发给发送者,那么想自动回复应该怎么做呢?

  1. 通过 msg 我们可以获得是谁发送给我们的,这样我们就可以针对用户进行消息上下文存储和识别使用是否需要自动回复,毕竟你不想胡乱的回复你的老板吧
  2. 关于自动回复,这里使用了图灵机器人

图灵机器人

官网:http://www.tuling123.com/

进入官网注册用户并添加一个机器人

添加之后,下面会显示 apikey 同时把密钥关闭

调用图灵机器人进行回复

安装 requests

代码语言:javascript
复制
pip install requests

tuling.py

代码语言:javascript
复制
import requests

default_api_key = '6f4056d2eaef43sdr889aa3e157f228e1'


def send(user_id, input_text, api_key=None):
    if not api_key:
        api_key = default_api_key
    msg = {
        "reqType": 0,
        "perception": {
            "inputText": {
                "text": input_text
            },
            "selfInfo": {
                "location": {
                    "city": "北京",
                    "province": "北京",
                }
            }
        },
        "userInfo": {
            "apiKey": api_key,
            "userId": user_id
        }
    }

    return requests.post('http://openapi.tuling123.com/openapi/api/v2',json=msg).json()

其中使用 http 请求发送请求内容到图灵,其中 user_id 是传给为了区别不同的用户,最大长度为32位, selfInfo 是添加用户的一下个人信息,比如地点,这样可以为你搜索一下周边信息,例如美食、酒店 userInfo 需要传入一下授权,里面包含 apiKey

具体参数见:https://www.kancloud.cn/turing/www-tuling123-com/718218

完成代码

安装 redis

代码语言:javascript
复制
pip install redis

redism.py

代码语言:javascript
复制
import redis

pool = None

def get_connection():
    global pool
    if not pool:
        pool = redis.ConnectionPool(host=host,
                                    port=port,
                                    password=password,
                                    max_connections=10,
                                    decode_responses=True)
    return redis.Redis(connection_pool=pool)

wechat.py

代码语言:javascript
复制
import itchat
import tuling
import time
import redism
from itchat.content import TEXT, MAP, CARD, NOTE, SHARING, ATTACHMENT, VIDEO, RECORDING, PICTURE, FRIENDS

__author__ = '张瑀楠'
__mail__ = 'zyndev@gmail.com'


@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
    '''
    用户消息回复
    使用机器人回复用户信息,并将用户信息添加到redis进行缓存
    :param msg: 消息体
    '''
    api_key = None
    if msg.user.get('RemarkName', None):
        # 判断下这个用户是否在你需要忽略的人中,比如你的老板
        if msg.user.RemarkName in redism.get_connection().smembers('wechat:ignore'):
            return None
        # 你可以为不同的人指定不同的api_key,因为图灵机器人是可以设置年龄的,这样可以做到为她专属一个机器人
        if msg.user.RemarkName == '她':
            api_key = 'f271e04ffa5c44c0ae4f0e'
    # 将消息内容保存下来,方便做统计分析使用
    redism.get_connection().set(f'wechat:user:{msg.get("ToUserName")}', msg.user.get('RemarkName', 'unknow'))

    # 因为图灵的user_id 为32位,而微信的 userName 很长,这里截取一下
    req = tuling.send(msg.FromUserName[1: 32], msg.text, api_key)
    redism.get_connection().set(f'wechat:msg:{msg.get("ToUserName")}:{msg.MsgId}', msg.text)
    print(req.get('results'))
    # 发送文本内容
    for result in req.get('results'):
        msg.user.send(result.get('values').get(result.get('resultType')))
        redism.get_connection().set(f'wechat:msgr:{msg.get("ToUserName")}:{msg.MsgId}:',
                                    result.get('values').get(result.get('resultType')))


@itchat.msg_register([PICTURE])
def download_files(msg):
    msg.download(msg.fileName)
    typeSymbol = {
        PICTURE: 'img',
        VIDEO: 'vid', }.get(msg.type, 'fil')
    return '@%s@%s' % (typeSymbol, msg.fileName)


@itchat.msg_register(FRIENDS)
def add_friend(msg):
    '''
    用户添加
    :param msg: 消息体
    '''
    msg.user.verify()
    msg.user.send('Nice to meet you!')


@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):
    '''
    群组消息回复
    :param msg: 消息参数
    '''
    if msg.user.NickName in redism.get_connection().smembers('wechat:group'):
        req = tuling.send(msg.FromUserName[2: 32], msg.text)
        print(req.get('results'))
        for result in req.get('results'):
            msg.user.send(result.get('values').get('text'))


def main():
    time.sleep(2)
    itchat.auto_login(hotReload=True, exitCallback=main)
    itchat.run(True)
    pass


if '__main__' == __name__:
    main()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 777开发日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 微信机器人
    • 准备环境
      • itchat
        • 代码示例
          • 图灵机器人
            • 调用图灵机器人进行回复
              • 完成代码
              相关产品与服务
              云数据库 Redis
              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档