微信机器人

微信机器人

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

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

准备环境

python3.x

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

itchat

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

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

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

代码示例

首先你需要安装

pip install itchat

来看个例子

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

import itchat

itchat.auto_login()

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

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

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

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

itchat.auto_login(hotReload=True)

添加自动回复

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

pip install requests

tuling.py

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

pip install redis

redism.py

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

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()

原文发布于微信公众号 - 777开发日记(gh_773193545262)

原文发表时间:2018-10-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java工会

MVC设计模式

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器...

18000
来自专栏Java3y

图书管理系统【总结】

感想 该项目是目前为止,我写过代码量最多的项目了.....虽然清楚是没有含金量的【跟着视频来写的】,但感觉自己也在进步中...... 写的过程中,出了不少的问题...

40950
来自专栏SDNLAB

SDNLAB技术分享(十四):ONOS项目介绍(下)

第二部分,创新项目及ONOS特性增强项目介绍 NFV相关 随着云计算、SDN、虚拟化等理念和技术的不断成熟,以通用替代专有将原本传统专业的网元设备上的网络功能提...

45790
来自专栏嵌入式程序猿

C8051F060单片机在数字电源控制器中的应用

引言 随着科技的发展,数字控制系统的应用越来越广泛。以前的模拟电源控制系统线路复杂,控制精度低,故障率高。因此开发全数字电源控制系统越来越重要。微控制器,微处理...

32460
来自专栏程序人生

软件性能调优:看数据,还是谈概念?

上周写了「想让服务器跑得快,并不是换个编程语言那么简单」,很多朋友的留言歪了楼:论性能,C语言甩Python数倍到数十倍,你说和编程语言没关?拜托,程序君只是说...

29940
来自专栏JackieZheng

可视化工具gephi源码探秘(二)---导入netbeans

  在上篇《可视化工具gephi源码探秘(一)》中主要介绍了如何将gephi的源码导入myeclipse中遇到的一些问题,此篇接着上篇而来,主要讲解当下通过my...

29880
来自专栏睿哥杂货铺

Linux 性能诊断:快速检查单(Netflix版)

快速检查单(Quick Reference Handbook,QRH)是飞行员在飞行过程中依赖的重要指导性文件。

45470
来自专栏HappenLee的技术杂谈

数据模型与查询语言 ------《Designing Data-Intensive Applications》读书笔记2

作为一个开发者来说,在一个复杂的应用程序中,是存在很多分层模型的,但基本思想还是一样的:每一层都提供了一个干净的数据模型,从而隐藏了底层的复杂性。通过这样的抽象...

13920
来自专栏祝威廉

Elasticsearch 漫谈

之前在研究ElasticSearch的时候,发现竟然已经有七篇文章了。这些文章通常都是遇到了问题,于是去研读相关代码,试图搞清楚里面的机制,顺带记录下来而成文的...

20140
来自专栏安智客

《密码模块安全技术要求》解读

今天要讲到的是密码模块安全认证! 中国密码行业标准化技术委员会分别在2014年、2015年制定了GM/T 0028-2014《密码模块安全技术要求》和GM/T ...

65970

扫码关注云+社区

领取腾讯云代金券