【微信聊天机器人】基于python实现的PC端个人微信聊天机器人

文章目录

  • 前言
  • 一、运行环境
  • 二、使用步骤
    • 1.引入库
    • 2.根据文本内容自动生成回复
    • 3.接收消息的回调函数
    • 4.启动客户端
    • 5.程序入口
  • 三、代码全文
  • 总结


前言

微信自动回复、聊天机器人应该是一个很多人迫切需要的功能(如时间管理大师),网上能搜到的大多解决方案是采用2018年之前的基于Web版微信的itchat或wxpy第三方库,但现在申请注册比较晚的微信号无法登录Web版微信,故上述两个库均已失效。还有一些需要注入dll手段的,操作比较麻烦不适合新手。
本文用python提供一种解决方案初代版本,只需调包,无需对系统进行其他操作,可根据自身需要定制内容。
温馨提示:仅供娱乐,请谨慎使用,由自身使用不当引起家庭矛盾、跟上级领导关系不和等各种不良后果,本文作者概不负责。
该机器人支持天气查询、成语接龙、彩虹屁等功能,可在天行控制台进行定制。
效果展示:
【微信聊天机器人】基于python实现的PC端个人微信聊天机器人_第1张图片
【微信聊天机器人】基于python实现的PC端个人微信聊天机器人_第2张图片


提示:以下是本篇文章正文内容,下面案例可供参考

一、运行环境

Windows10+python 3.7.4+PC端微信V2.7.1.82版本+PyCharm/VS2017
提示:python版本一定要是3.7及以后;微信版本目前仅支持V2.7.1.82版本

PC端微信V2.7.1.82版本安装包百度网盘下载
链接:https://pan.baidu.com/s/1yADEwqht8hcTTjxpkW8DXw 
提取码:rneo

二、使用步骤

1.引入库

代码如下(示例):

from WechatPCAPI import WechatPCAPI
import time
import http.client, urllib

所用库的说明和下载地址:
https://github.com/terrywangt/WeChatBot
https://www.tianapi.com/apiview/47
第二个网址为天行公司的网址,免费申请注册可以获得接口,有示例代码

2.根据文本内容自动生成回复

代码如下(示例):

# #生成回复内容的函数,传入的是接收到的字符串,返回值为回复str
def send_msg_producer(content):
    conn = http.client.HTTPSConnection('api.tianapi.com')  # 接口域名
    params = urllib.parse.urlencode({'key': '你在天行网站上申请获得的APIKEY', 'question': content})
    headers = {'Content-type': 'application/x-www-form-urlencoded'}
    conn.request('POST', '/robot/index', params, headers)
    res = conn.getresponse()
    data = res.read()
    str_data = data.decode('utf-8')  # 报文解码返回值为str,转为dict再操作
    dict_data = eval(str_data)

    out_content = dict_data['newslist'][0]['reply'] #将要回复消息读取出来,作为返回值
    return out_content

该函数传入的参数content为你对机器人的提问,str类型(也就是微信收到的新消息字符串);返回值为机器人根据上文自动生成的回复,str类型。
注意:代码中的key需要填上你在天行网站上申请到的key

3.接收消息的回调函数

代码如下(示例):

# 接收消息的回调函数,可自行定义
def on_message(message):
    print(message)
    msg_obj = message
    print(msg_obj['type'])
    # #----------------------------------------------------------------------个人聊天
    if msg_obj['type'] == 'msg::single':
        name_id = msg_obj['data']['from_wxid']
        send_or_recv=msg_obj['data']['send_or_recv'][0]
        content = msg_obj['data']['msg']
        # #---------------------------------------
        # #打印输出测试
        print(name_id)
        print(send_or_recv)
        print(content)

        if (send_or_recv == '0') and (name_id == '你想启用自动回复的目标1' or name_id == '你想启用自动回复的目标2' or name_id == '你想启用自动回复的目标3'):
            # #判定通过
            print('该个人节点已通过')
            # #封装的生成输出内容的函数
            out_content = send_msg_producer(content)
            # ---------------------------------------------------------发送输出
            wx_inst.send_text(to_user=name_id, msg= '主人让我对你说:\n' + str(out_content) )
    # #-------------------------------------------------------------------------------------群聊设置
    elif msg_obj['type'] == 'msg::chatroom':
        chatroom_id = msg_obj['data']['from_chatroom_wxid']
        send_or_recv = msg_obj['data']['send_or_recv'][0]
        content = msg_obj['data']['msg']
        # ---------------------------------------
        # 打印输出测试
        print(chatroom_id)
        print(send_or_recv)
        print(content)

        if (send_or_recv == '0') and (chatroom_id == '你想启用自动回复的目标1' or chatroom_id == '你想启用自动回复的目标2'): 
            # #判定通过
            print('该群聊节点已通过')
            # #调用内容生成函数
            out_content = send_msg_producer(content)
            # ---------------------------------------------------------发送输出
            wx_inst.send_text(to_user=chatroom_id, msg='主人让我对你说:\n' + str(out_content))
    return None

每当收到新消息时,就会触发回调函数。示例中的回调函数内容为个人和群聊两部分,需要在if判定条件里填入你想进行自动回复的目标。注意:填入的目标id一定要为原始id,比如个人的微信号格式为wxid_1122334455asdf,微信号更改后的那个id不可以,群聊的微信号格式为1122334455@chatroom,如何才能知道某个人的原始微信号,可以百度,也可以直接看WechatPCAPI接受到信息的报文,不赘述。
代码中部分用于测试输出的语句我没有注释掉,不影响运行结果,同时可以让你可以很清楚的看到,当微信收到新消息时,你的程序都进行了哪些操作


4.启动客户端

def main():
    # 启动微信 目前仅支持微信V2.7.1.82
    wx_inst.start_wechat(block=True)
    # 等待登陆成功,此时需要人为扫码登录微信
    while not wx_inst.get_myself():
        time.sleep(5)

    # 登录成功了
    print(wx_inst.get_myself())

    time.sleep(10)
    # 更新所有好友信息,数据会通过上面的回调函数返回
    wx_inst.update_frinds()

5.程序入口

wx_inst = WechatPCAPI(on_message=on_message)
main()

程序从此处开始执行,也可以写为if__name__== ’ __main __’:的方式来执行

三、代码全文

from WechatPCAPI import WechatPCAPI
import time
import http.client, urllib


def send_msg_producer(content):
    conn = http.client.HTTPSConnection('api.tianapi.com')  # 接口域名
    params = urllib.parse.urlencode({'key': '你在天行网站上申请获得的APIKEY', 'question': content})
    headers = {'Content-type': 'application/x-www-form-urlencoded'}
    conn.request('POST', '/robot/index', params, headers)
    res = conn.getresponse()
    data = res.read()
    str_data = data.decode('utf-8')  # 报文解码返回值为str,转为dict再操作
    dict_data = eval(str_data)

    out_content = dict_data['newslist'][0]['reply'] #将要回复消息读取出来,作为返回值
    return out_content


def on_message(message):
    print(message)
    msg_obj = message
    print(msg_obj['type'])
    # #----------------------------------------------------------------------个人聊天
    if msg_obj['type'] == 'msg::single':
        name_id = msg_obj['data']['from_wxid']
        send_or_recv=msg_obj['data']['send_or_recv'][0]
        content = msg_obj['data']['msg']
        # #---------------------------------------
        # #打印输出测试
        print(name_id)
        print(send_or_recv)
        print(content)

        if (send_or_recv == '0') and (name_id == '你想启用自动回复的目标1' or name_id == '你想启用自动回复的目标2' or name_id == '你想启用自动回复的目标3'):
            # #判定通过
            print('该个人节点已通过')
            # #封装的生成输出内容的函数
            out_content = send_msg_producer(content)
            # ---------------------------------------------------------发送输出
            wx_inst.send_text(to_user=name_id, msg= '主人让我对你说:\n' + str(out_content) )
    # #-------------------------------------------------------------------------------------群聊设置
    elif msg_obj['type'] == 'msg::chatroom':
        chatroom_id = msg_obj['data']['from_chatroom_wxid']
        send_or_recv = msg_obj['data']['send_or_recv'][0]
        content = msg_obj['data']['msg']
        # ---------------------------------------
        # 打印输出测试
        print(chatroom_id)
        print(send_or_recv)
        print(content)

        if (send_or_recv == '0') and (chatroom_id == '你想启用自动回复的目标1' or chatroom_id == '你想启用自动回复的目标2'): 
            # #判定通过
            print('该群聊节点已通过')
            # #调用内容生成函数
            out_content = send_msg_producer(content)
            # ---------------------------------------------------------发送输出
            wx_inst.send_text(to_user=chatroom_id, msg='主人让我对你说:\n' + str(out_content))
    return None


def main():
    # 启动微信 目前仅支持微信V2.7.1.82
    wx_inst.start_wechat(block=True)
    # 等待登陆成功,此时需要人为扫码登录微信
    while not wx_inst.get_myself():
        time.sleep(5)

    # 登录成功了
    print(wx_inst.get_myself())

    time.sleep(10)
    # 更新所有好友信息,数据会通过上面的回调函数返回
    wx_inst.update_frinds()


wx_inst = WechatPCAPI(on_message=on_message)
main()

总结

所提供的代码只是一个最简单的示例,还有很多改进的空间。比如创建一个dict来存储需要自动回复的对象的微信id,然后通过创建一个简单的UI窗口来实现对该dict的增删。采用跟本文一致的环境的话应该不会产生额外的环境问题,如有问题请参照本文2.1节给出的两个链接。机器人回复的效果也可以提升,本文采用的是天行提供的免费试用版库,普通用户每天可以免费调用接口100次,也可以自行购买别的库来使用,如腾讯云。回复中“主人让我对你说:”是额外添加的标志词,从而来区分机器人发的消息和本人发的消息,想要以假乱真可将该提示去掉。

感谢免费提供库的作者和公司。

你可能感兴趣的:(python,微信,python,聊天机器人)