itchat_itchat聊天软件 - CSDN
精华内容
参与话题
  • Python中有一个itchat实现微信的分析和登录。 itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。使用不到三十行的代码,你就可以完成一个能够处理有信息的微信机器人。当然,该api的使用远不止一...

    Python中有一个itchat实现微信的分析和登录。

    itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。使用不到三十行的代码,你就可以完成一个能够处理有信息的微信机器人。当然,该api的使用远不止一个机器人,更多的功能等着你来发现。

    #实现微信消息的获取

    import itchat
    
    @itchat.msg_register(itchat.content.TEXT)
    def print_content(msg):
        print(msg['Text'])
    
    itchat.auto_login()
    itchat.run()
    

    实现微信消息的发送

    import itchat
    
    itchat.auto_login(hotReload=True)
    
    # 注意实验楼环境的中文输入切换
    itchat.send(u'测试消息发送', 'filehelper')   
    
    

    如果接收到TEXT类型的消息,则执行以下的方法,msg是收到的消息,return msg.text是返回收到的消息的内容,实际效果是别人发给你什么,程序自动返回给他什么。

    import itchat
    from itchat.content import TEXT
    @itchat.msg_register
    def simple_reply(msg):
      if msg['Type'] == TEXT:
        return 'I received: %s' % msg['Content']
    itchat.auto_login()
    itchat.run()
    
    

    使用itchat统计你的微信好友

    好友的信息的列表,每一个好友字典的 key 如下表

    key 备注
    UserName 微信系统内的用户编码标识
    NickName 好友昵称
    Sex 性别
    Province 省份
    City 城市
    HeadImgUrl 微信系统内的头像URL
    RemarkName 好友的备注名
    Signature 个性签名

    下面我统计我的微信好友

    import itchat
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']    # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    itchat.auto_login(hotReload=True)   #itchat.auto_login()自动登陆命令
                                        # #hotReload为热加载即是否缓存
    
    
    # 统计你的好友的男女比例
    # friends是一个类似列表的数据类型, 其中第一个是自己的信息, 除了第一个之外是你的好友信息.
    friends = itchat.get_friends()
    
    info = {}  # 'male':1, 'female':, 'other':          #存储信息
    for friend in friends[1:]:                          #获取好友信息
        #以用此句print查看好友的微信名、备注名、性别、省份、个性签名(1:男 2:女 0:性别不详)
        print(friend['NickName'],friend['RemarkName'],friend['Sex'],friend['Province'],friend['Signature'])
        if friend['Sex'] == 1:                          #判断好友性别,1为男性,2为女性,0为其他。
            info['male'] = info.get('male', 0) + 1
        elif friend['Sex'] == 2:
            info['female'] = info.get('female', 0) + 1
        else:
            info['other'] = info.get('other', 0) + 1
    print(info)  #{'male': 263, 'other': 77, 'female': 165}
    # 柱状图展示
    for i, key in enumerate(info):
        plt.bar(key, info[key])
    plt.title('微信好友性别比例柱形图')
    plt.show()
    # 饼图
    total = int(info['male']+ info['female'] + info['other'])
    man_ratio = int(info['male'])/total * 100
    woman_ratio = int(info['female'])/total * 100
    other_ratio = int(info['other'])/total * 100
    colors = ['red', 'yellowgreen', 'lightskyblue']
    sex_li = ['男', '女', '其他']
    radius = [0.01, 0.01, 0.01]  # 设定各项距离圆心n个半径
    proportion = [man_ratio, woman_ratio, other_ratio]
    plt.pie(proportion, explode=radius, labels=sex_li, colors=colors, autopct='%.2f%%')   # 绘制饼图
    # 加入图例 loc =  'upper right' 位于右上角 bbox_to_anchor=[0.5, 0.5] # 外边距 上边 右边 borderaxespad = 0.3图例的内边距
    plt.legend(loc="upper right", fontsize=10, bbox_to_anchor=(1.1, 1.1), borderaxespad=0.3)
    # 绘制标题
    plt.title('微信好友性别比例饼图')
    # 展示
    plt.show()
    

    我的微信好友分布如下图所示:

    地区分析

    # 获取区域及城市
    prov_dict, city_dict = {}, {}
    for fri_info in friends[1:]:
        prov = fri_info['Province']
        city = fri_info['City']
        if prov and prov not in prov_dict.keys():
            prov_dict[prov] = 1
        elif prov:
            prov_dict[prov] += 1
        if city and city not in city_dict.keys():
            city_dict[city] = 1
        elif city:
            city_dict[city] += 1
    
    
    # 区域Top10
    prov_dict_top10 = sorted(prov_dict.items(), key=lambda x: x[1], reverse=True)[0:10]
    # 城市Top10
    city_dict_top10 = sorted(city_dict.items(), key=lambda y: y[1], reverse=True)[0:10]
    
    prov_nm, prov_num = [], []  # 省会名 + 数量\
    
    for prov_data in prov_dict_top10:
        prov_nm.append(prov_data[0])
        prov_num.append(prov_data[1])
    city_nm ,city_num = [],[] # 城市名 + 数量
    for city_data in city_dict_top10:
        city_nm.append(city_data[0])
        city_num.append(city_data[1])
    colors = ['#00FFFF', '#7FFFD4', '#F08080', '#90EE90', '#AFEEEE',
              '#98FB98', '#B0E0E6', '#00FF7F', '#FFFF00', '#9ACD32']
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    # 省会好友人数绘制
    index = range(len(prov_num))
    plt.bar(index, prov_num, color=colors, width=0.5, align='center')
    
    plt.xticks(range(len(prov_nm)), prov_nm)  # 横坐轴标签
    for x, y in enumerate(prov_num):
        # 在柱子上方1.2处标注值
        plt.text(x, y + 1.2, '%s' % y, ha='center', fontsize=10)
    plt.ylabel('省会好友人数')  # 设置纵坐标标签
    prov_title = '微信好友区域Top10'
    plt.title(prov_title)    # 设置标题
    plt.show()
    # 城市好友人数绘制
    index_= range(len(city_num))
    plt.bar(index_,city_num,color = colors,width=0.5,align='center')
    plt.xticks(range(len(city_nm)), city_nm)  # 横坐轴标签
    for x, y in enumerate(city_num):
        # 在柱子上方1.2处标注值
        plt.text(x, y + 1.2, '%s' % y, ha='center', fontsize=10)
    plt.ylabel('城市好友人数')  # 设置纵坐标标签
    plt.title('微信好友区域Top10')    # 设置标题
    plt.show()
    

    我的微信好友地区分布如下图所示:

    下载好友头像图片

    itchat还可以下载好友的头像

    import itchat
    itchat.auto_login(True)
    friend =  itchat.get_friends(update=True)[0:]
    for count, f in enumerate(friends):
        # 根据userName获取头像
        img = itchat.get_head_img(userName=f["UserName"])
        imgFile = open("img/" + str(count) + ".jpg", "wb")
        imgFile.write(img)
        imgFile.close()
    
    

    我的微信好友的头像

    微信好友头像拼接图

    下面我们用好友的头像拼接大图

    x = 0
    y = 0
    imgs = os.listdir("img")
    random.shuffle(imgs) #打乱顺序
    # 创建640*640的图片用于填充各小图片
    newImg = Image.new('RGBA', (640, 640))
    # 以640*640来拼接图片,math.sqrt()开平方根计算每张小图片的宽高,
    width = int(math.sqrt(640 * 640 / len(imgs)))
    # 每行图片数
    numLine = int(640 / width)
    for i in imgs:
        img = Image.open("img/" + i)
        # 缩小图片
        img = img.resize((width, width), Image.ANTIALIAS)
        # 拼接图片,一行排满,换行拼接
        newImg.paste(img, (x * width, y * width))
        x += 1
        if x >= numLine:
            x = 0
            y += 1
    newImg.save("all.png")
    
    

    拼接大图如下:

    制作词云

    下面可以获取个性签名, 制作词云

    import itchat
    import re
    
    # 扫二维码登录微信
    itchat.auto_login(hotReload=True)
    # 获取好友列表,返回的是json信息
    friends = itchat.get_friends(update=True)[0:]
    # 打印好友列表信息
    # print(friends)
    tList = []
    for i in friends:
        # 获取个性签名,替换掉span,class,emoji
        signature = i["Signature"].replace(" ", "").replace("span", "").replace("class", "").replace("emoji", "")
        # 正则匹配过滤掉emoji表情,例如emoji1f3c3等
        rep = re.compile("1f\d.+")
        signature = rep.sub("", signature)
        tList.append(signature)
    # 拼接字符串
    text = "".join(tList)
    # jieba分词
    import jieba
    wordlist_jieba = jieba.cut(text, cut_all=True)
    wl_space_split = " ".join(wordlist_jieba)
    # wordcloud词云
    import matplotlib.pyplot as plt
    from wordcloud import WordCloud, ImageColorGenerator
    import os
    import numpy as np
    import PIL.Image as Image
    # d = os.path.dirname(__file__)
    # 找一张微信logo图来生成配色方案,微信logo图wechat.jpg路径在D:\\盘下
    alice_coloring = np.array(Image.open(os.path.join('D:\\', 'wechat.jpg')))
    # 这里要选择字体存放路径,win的字体在C:/windows/Fonts中
    """#my_wordcloud = WordCloud().generate(wl_space_split) 默认构造函数
    my_wordcloud = WordCloud(
                background_color='white',    # 设置背景颜色
                mask = abel_mask,        # 设置背景图片
                max_words = 200,            # 设置最大显示的字数
                stopwords = STOPWORDS,        # 设置停用词
                font_path = C:/Users/Windows/fonts/simkai.ttf',  # 设置字体格式,如不设置显示不了中文
                max_font_size = 50,            # 设置字体最大值
                random_state = 30,            # 设置有多少种随机生成状态,即有多少种配色方案
                    scale=.5
                    ).generate(wl_space_split)"""
    my_wordcloud = WordCloud(background_color="white", max_words=2000, mask=alice_coloring,
                             max_font_size=40, random_state=42,
                             font_path='C:/Windows/Fonts/simhei.ttf').generate(wl_space_split)
    image_colors = ImageColorGenerator(alice_coloring)
    plt.imshow(my_wordcloud.recolor(color_func=image_colors))
    plt.imshow(my_wordcloud)
    plt.axis("off")
    plt.show()
    # 保存图片到F:\\盘下 并发送到手机里的文件传输助手(filehelper)里
    my_wordcloud.to_file(os.path.join('F:\\', 'wechat_cloud.png'))
    itchat.send_image("F:\\wechat_cloud.png", 'filehelper')
    

    制作词云如下图所示:

    实现自动回复消息

    我们选用的是图灵机器人,大家的data 是不一样的,其实我们调用的就是图灵机器人,好友发送信息过来,然你传到图灵机器人,图灵机器人自动回复消息。

    import itchat
    import requests
    def get_tuling_response(_info):
        print(_info)
        # 图灵机器人网址
        ## 构造了要发送给服务器的数据
        api_url = "http://www.tuling123.com/openapi/api"
        data = {
            'key' : '824073e601264a22ba160d11988458e0',
            'info' : _info,
            'userid' : 'villa'
        }
        ##其中userId是用户的标志
        ##Key来告诉图灵服务器你有权和他对话
        ##info接收的信息
        res = requests.post(api_url,data).json()
        # 字典的get方法在字典没有'text'值的时候会返回None而不会抛出异常
        print(res['text'])
        return res['text']
    
    #时刻监控好友发送的文本消息,并且给予一回复
    # isGroupChat=True接收群聊消息中的文本信息, 并让图灵机器人自动回复;
    # isMapChat=True接收群聊消息中的文本信息, 并让图灵机器人自动回复;
    @itchat.msg_register(itchat.content.TEXT)
    def text_reply(msg):
        #获取好友发送消息的内容
        content = msg['Content']
        #将好友的消息发送给机器人处理,处理结果就是返回给好友的消息
        returnContent = get_tuling_response(content)
        return returnContent
    
    # if __name__ == "__main__":
    itchat.auto_login(hotReload=True)
    itchat.run()
    
    
    展开全文
  • Py之itchat:python库之itchat的简介、安装、使用方法之详细攻略 目录 itchat的简介 itchat的安装 itchat的使用方法 itchat的简介 iTwitter是一个开放源码API,是一个常用的中国社交网络应用程序。在...

    Py之itchat:python库之itchat的简介、安装、使用方法之详细攻略

     

    目录

    itchat的简介

    itchat的安装

    itchat的使用方法


     

    itchat的简介

        iTwitter是一个开放源码API,是一个常用的中国社交网络应用程序。在Python中通过ITQualChina访问个人聊天帐户从来都不容易。一个微信机器人可以处理所有基本的消息,只有少于30行代码。它类似于ITCHATMP(用于微博客海量平台的API),学习一次并获得两个工具。现在Wechat是个人生活的一个重要部分,希望这个回购可以帮助您扩展您的个人网络聊天帐户的功能和更好的用户体验与微信。

     

     

    itchat的安装

    pip install itchat

     

     

    itchat的使用方法

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

     

     

     

    展开全文
  • 再见,itchat!再见,网页版微信!

    千次阅读 2020-06-29 00:08:42
    有一个词叫做“三月爬虫”,指的是有些学生临到毕业了,需要收集数据写毕业论文,于是在网上随便找了几篇教程,学了点requests甚至是urllib和正则表达式的皮毛,就开始写爬虫疯狂从网上...


    有一个词叫做“三月爬虫”,指的是有些学生临到毕业了,需要收集数据写毕业论文,于是在网上随便找了几篇教程,学了点requests甚至是urllib和正则表达式的皮毛,就开始写爬虫疯狂从网上爬数据。这些爬虫几乎没有做任何隐藏自己的举动,不换IP,不设置headers,不限制速度,极易被有反爬的网站封锁,极易给没反爬的小网站造成流量压力。

    后来,他们又不知道看了哪篇文章,知道要使用代理IP,要修改UserAgent。于是,他们真的就只在headers设置UserAgent,其他项一概不设置。你给他指出来,他还振振有词:你看我这样能爬到数据啊,headers里面其他项目没有用。

    事实真的是这样吗?

    我们来做个实验,首先使用Chrome访问 http://httpbin.org/headers 这个网站可以显示当前你的headers。运行效果如下图所示:

    然后,再使用requests不设置headers请求这个URL,运行效果如下图所示:

    最后,我们仅仅设置一个UserAgent看看效果:

    可以看出来,仅仅设置一个UserAgent,与用浏览器访问的 Headers 还是有很多不一样的地方。缺了很多项。网站只需要检测缺的这几项,就能确定你是用程序发起的请求还是用浏览器发的请求。

    说回微信网页版的问题

    很多人使用 wxpy 或者 itchat 这种第三方库通过Python控制自己的微信号,实现很多自动化操作。但不久以后就反馈说自己被限制登录网页版微信了,以为是不是自己的行为被微信发现了,例如一秒钟内发了几十条消息,或者同时回复了好几个人的消息。

    但我要说的是,你们太高估自己了,微信要发现你们,根本就不用这么麻烦。它直接检查headers就可以了。

    我们来看一下wxpy的源代码中,涉及到网络请求的地方:

    wxpy是基于itchat二次开发的,登录功能是通过 itchat 来实现的。我们再来看看itchat里面发起网络请求的地方:

    其中的 self.core.s就是一个 requests 的 Session,如下图所示:

    两库不要随便用

    这两个库,他们在headers里面只放了UserAgent,其他字段都没有放。所以在你登录的瞬间,微信就已经知道你这个账号没有用浏览器登录了!

    所以,那些用了wxpy或者itchat就被限制登录网页版微信的人,不要怀疑,你们就是被这两个库给害了。这两个库里面涉及到网络请求的相关代码,水平一看就是一个学了两三天爬虫的人写出来的代码。

    你用这两个库就是让你的微信号去送死。

    不仅仅是这两个库,我们再看看很多人使用的Python 弹幕包,更夸张,在获取斗鱼直播信息的时候,直接用requests请求网址,连headers都没有设置,如下图所示:

    后果很严重

    现在大网站的机器行为对抗团队一般会把检测爬虫与封禁爬虫分开。因为反爬虫策略多了以后,不可避免存在误伤的情况,为了尽可能降低误伤率,检查爬虫时会对请求的可疑性进行打分,当你出现疑似爬虫行为时,给你的请求加上一些分数,某些行为分数高,某些行为分数低。当你总积分达到一定程度时,再调用封禁的流程。

    由于HTTP是无状态的,如果你要爬的网站不需要登录,那么也许你频繁更换 IP 有用(阿布云的代理池就是被这样污染的)。

    但是对于微信这种需要登录的情况,你的所有可疑行为的积分都会直接关联到你的这个账号上。于是,一开始可能你用 wxpy 登录网页版微信没问题,这个时候你的可疑性积分还不够高,可能确实有一些老古董浏览器的 Headers 就是少了很多项?

    但是你已经在怀疑名单里面了。一旦你又出现了其他可疑行为导致可疑性积分继续增加,那么当微信已经可以100%确信你就是用的自动化程序登录网页版微信的时候,封禁你就是自然而然的事情了。

      延伸阅读  
    Python:
    ☞ 这是我看过的最好的Python零基础Pandas教程(可下载)
    ☞ 我用 pyhton 做了款可开淘宝店赚钱的工具
    
    ☞ 一个超有意思的 Python 综合能力测试网站
    
    
    
    技能GET:
    ☞ 拍一拍,微信史上最短一行代码
    ☞ 立刻、马上对你的电脑做这三件事!
    ☞ 专为技术人员打造的搜索引擎,提升n倍搜索效率!
    ☞ 一个聚合全网热点信息的神网站
    
    
    
    
    展开全文
  • import itchat itchat.login() friends = itchat.get_friends(update=True)[0:] ``` 扫完码之后就报错误了,但是换别的微信又可以。 错误如下,求助。 ``` ----------------------------------------...
  • 利用itchat搭建微信机器人详解(附三个实用示例)

    万次阅读 多人点赞 2018-08-02 14:05:53
    本文简介 好久没更新文章啦,因为最近在赶一本Py的入门书,碰巧今天把这篇文章赶出来了。 而很多加群的小朋友很多都是咨询如何搭建微信机器人的,所以就把这一章放出来了, 取需,三个实用示例:定时发信息,集成...

    本文简介

    好久没更新文章啦,因为最近在赶一本Py的入门书,碰巧今天把这篇文章赶出来了。
    而很多加群的小朋友很多都是咨询如何搭建微信机器人的,所以就把这一章放出来了,
    取需,三个实用示例:定时发信息,集成图灵API实现聊天机器人,微信防撤回实现,基本够玩了。
    另外,微信改版了网页端,很多接口都开始用不了,比如拉人进群,可以通过无障碍服务或者
    Xposed来解决,具体怎么玩可以参见前面的章节,谢谢。


    2011年1月21日,微信推出第一个正式版本,到现在已有7个年头。从一开始的不被看到好,到现在的用户量超10亿,大众的日常生活越来越离不开微信。人生苦短我用Python,有没有办法通过Python来对我们使用微信提供一些便利呢? 答案肯定是有的,在Github上有一个基于微信网页版接口微信开源库:itchat,通过几十行的代码就能轻松实现一个微信机器人。本章我们就来了解学习这个库,然后通过三个实用案例来帮大家玩转这个库。


    19.1 itchat库详解

    我们跟着文档来解读下itchat这个库的用法。

    19.1.1 文档与安装

    itchat的仓库地址https://github.com/littlecodersh/ItChat
    官方文档http://itchat.readthedocs.io

    安装也很简单,直接通过pip命令安装即可,命令如下:

    pip install itchat

    19.1.2 简单的使用示例

    通过一个简单的例子来让读者体会下通过itchat编写一个微信机器人有多简单,代码功能:
    扫码登录后给文件助手发送一条信息,监听接收到的文件信息,打印出来,具体代码如下。

    import itchat
    import time
    
    @itchat.msg_register(itchat.content.TEXT)
    def reply_msg(msg):
        print("收到一条信息:",msg.text)
    
    
    if __name__ == '__main__':
        itchat.auto_login()
        time.sleep(5)
        itchat.send("文件助手你好哦", toUserName="filehelper")
        itchat.run()

    代码执行结果

    先会弹出一个二维码图片,扫描后会登陆网页端微信,间隔一会儿后文件助手收到如图19.1所示的信息

    图19.1 文件传输助手收到信息

    然后用另一个账号发送一条信息给这个账号,控制台会把接收到的信息打印出来

    Getting uuid of QR code.
    Downloading QR code.
    Please scan the QR code to log in.
    Please press confirm on your phone.
    Loading the contact, this may take a little while.
    TERM environment variable not set.
    Login successfully as Robot Pig
    Start auto replying.
    收到一条信息: 你好

    通过上面8行有效代码就实现了一个简单的技巧人,酷不酷,带着这样的思路,我们可以进行扩展,比如添加一个自动回复的功能,比如在忙的时候,别人给你发信息,自动回复:”在忙,晚点给你回复信息”等。


    19.2 使用itchat的注意事项

    在学习itchat的详细用法前,先和读者说一些要注意的东西。

    (1)itchat不是微信官方提供的库,意味使用这个库会有风险,笔者的小号就曾被微信封过一段时间,禁止网页端登录微信,移动端和电脑客户端还是能正常使用的,微信此举旨在封杀泛滥的微商机器人。
    (2)如何减少被封概率:消息发送不要过于频繁;不要发送过多重复信息;尽量少调用加人的接口;
    (3)被封如何解封:被封后是无法找到申述入口,只能随缘解封,笔者在坚持了一周用手机聊天和朋友圈点赞留言后突然就解封了。
    (4)微信正在慢慢收窄网页端的功能,意味着一些接口会慢慢失效,比如说拉人进群聊的接口,以前还能用,现在就不行了。在调用某个接口没有得到意料中的结果,可能就是接口失效了,可以到官方仓库查找相关的issues。
    (5)微信只支持双端登录,不使用黑科技的话,移动端加上Web网页端或PC客户端。
    (6)新注册的微信号是无法使用网页版登录的。

    最后,还是要感谢开源作者的无私奉献。


    19.3 itchat详细用法

    巧妇难为无米之炊,在扩展前先跟笔者把文档过一过,理解得差不多了,再开始去扩展,这样效率会高很多。

    19.3.1 登陆

    登陆时通过itchat.auto_login()这个函数来完成的,不带参数的话会生成一个二维码图片文件供你扫描登陆。一般的话我们的电脑都会关机,如果机器人有需要持久在线的需求,我们可以把脚本挂到服务器上,24小时跑,但是一般的云服务器是没有界面的,都是通过终端命令行进行操作,这个时候可以添加enableCmdQR=True参数,让二维码显示到命令行上,另外部分系统可能字符宽度有出入,如图19.2所示,可以通过把enableCmdQR赋值为特定的倍数进行调整。

    图19.2 命令行二维码错位

    比如enableCmdQR=2后,二维码图片如图19.3所示

    图19.3 调整后正常的二维码图片

    扫码登录后,如果想退出程序以后还暂存登录状态,重新执行程序也不用扫码可以添加参数hotReload=True

    19.3.2 退出

    如果在启动时没有设置hotReload=True参数,程序退出后过一会儿就会自动掉线的了,如果想快速退出的话可以调用itchat.logout()注销登录状态。另外,有时我们可能想在登录成功或者注销登录后执行一些操作,可以添加两个调用登录时传入两个方法参数loginCallback和exitCallback,简单示例如下:

    import itchat
    import time
    
    
    def after_login():
        print("登录后调用")
    
    
    def after_logout():
        print("退出后调用")
    
    
    if __name__ == '__main__':
        itchat.auto_login(loginCallback=after_login, exitCallback=after_logout)
        time.sleep(5)
        itchat.logout()
    

    代码执行结果如下

    Getting uuid of QR code.
    Downloading QR code.
    Please scan the QR code to log in.
    Please press confirm on your phone.
    Loading the contact, this may take a little while.
    登录后调用
    退出后调用

    19.3.3 查找用户

    itchat提供四种查找用户的搜索方式,

    (1)获取自己的用户信息 示例如下:

        # 获取自己的用户信息,返回自己的属性字典
        result = itchat.search_friends()
        print(result)

    代码执行结果如下

    {'MemberList': <ContactList: []>, 'UserName': '@299f59697878267efb48e8cad07xxxxcadd0efbb63xxxxxxx0964c51f028e8474', 'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial': '', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '', 'EncryChatRoomId': '', 'Alias': '', 'Signature': '(´v`o)♡', 'NickName': 'Robot Pig', 'RemarkPYQuanPin': '', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1663312400&username=@299f59697878267efb48e8cad07f5f1cadd0efbb63ae19610964c51f028e8474&skey=@crypt_2d4a1972_5e7829c893346a53135fb03affa39f9c', 'UniFriend': 0, 'Sex': 2, 'AppAccountFlag': 0, 'VerifyFlag': 0, 'ChatRoomId': 0, 'HideInputBarFlag': 0, 'AttrStatus': 0, 'SnsFlag': 1, 'MemberCount': 0, 'OwnerUin': 0, 'ContactFlag': 0, 'Uin': 3454488193, 'StarFriend': 0, 'Statues': 0, 'WebWxPluginSwitch': 0, 'HeadImgFlag': 1}
    

    (2)根据昵称查询某个用户,代码示例如下:

        # 根据姓名查找用户
        result = itchat.search_friends(name='培杰')
        print(result)

    代码执行结果如下

    [<User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@xxb096c3036543exx2d4de4fc222xxxx', 'NickName': '培杰', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@40b096c3036543e5b2d4de4fc22208ed&skey=@crypt_2d4a1972_ac0122b1740b332921afc9f2fffa546f', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': 'Expectation is the root of all heartache.', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'PJ', 'PYQuanPin': 'peijie', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 33783847, 'Province': '广东', 'City': '江门', 'Alias': '', 'SnsFlag': 17, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'zpj', 'EncryChatRoomId': '', 'IsOwner': 0}>]

    (3)根据微信号查找用户,代码示例如下:

        # 根据微信号查找用户
        result = itchat.search_friends(wechatAccount='zpj779878443')
        print(result)

    代码执行结果如下:

    [<User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@xxb096c3036543exx2d4de4fc222xxxx', 'NickName': '培杰', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@40b096c3036543e5b2d4de4fc22208ed&skey=@crypt_2d4a1972_ac0122b1740b332921afc9f2fffa546f', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': 'Expectation is the root of all heartache.', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'PJ', 'PYQuanPin': 'peijie', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 33783847, 'Province': '广东', 'City': '江门', 'Alias': '', 'SnsFlag': 17, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'zpj', 'EncryChatRoomId': '', 'IsOwner': 0}>]

    另外,2和3功能可以同时使用,比如itchat.search_friends(name=’培杰’, wechatAccount=’zpj779878443’)

    (4)根据UserName查找用户,就是上面返回结果里跟着的UserName字段,@xxxx这样一串东西,代码示例如下:

        # 根据UserName查找用户
        result = itchat.search_friends(userName='@xxb096c3036543exx2d4de4fc222xxxx')
        print(result)

    代码执行结果如下:

    [<User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@xxb096c3036543exx2d4de4fc222xxxx', 'NickName': '培杰', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@xxb096c3036543exx2d4de4fc222xxxx&skey=@crypt_2d4a1972_ac0122b1740b332921afc9f2fffa546f', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': 'Expectation is the root of all heartache.', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'PJ', 'PYQuanPin': 'peijie', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 33783847, 'Province': '广东', 'City': '江门', 'Alias': '', 'SnsFlag': 17, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'zpj', 'EncryChatRoomId': '', 'IsOwner': 0}>]

    19.3.4 发送信息

    itchat提供了几个发送不同类型信息的函数,没有发送语音的原因是网页版没有这个接口,可供调用
    的函数如表19.1所示。

    函数名 作用
    send_msg() 发送文字信息
    send_file() 发送文件
    send_video() 发送视频
    send_image() 发送图片

    使用代码示例如下

    import itchat
    import time
    
    def after():
        user_info = itchat.search_friends(name='培杰')
        if len(user_info) > 0:
            # 拿到用户名
            user_name = user_info[0]['UserName']
            # 发送文字信息
            itchat.send_msg('培杰你好啊!', user_name)
            # 发送图片
            time.sleep(10)
            itchat.send_image('cat.jpg', user_name)
            # 发送文件
            time.sleep(10)
            itchat.send_file('19_2.py', user_name)
            # 发送视频
            time.sleep(10)
            itchat.send_video('sport.mp4', user_name)
    
    
    if __name__ == '__main__':
        itchat.auto_login(loginCallback=after)
        itchat.run()
    

    代码执行结果如下

    19.2.4 监听信息

    除了主动发送信息外,还可以对信息进行监控,支持对多种类型的信息进行监控,类型如表19.2所示。
    另外,有多个注册信息监听,后注册的信息优先级高于先注册信息,带参数信息高于不带参数信息。

    信息类型 解释
    itchat.content.TEXT 文本内容
    itchat.content.MAP 位置文本
    itchat.content.Card 名片
    itchat.content.Note 通知文本
    itchat.content.Sharing 分享名称
    itchat.content.RECORDING 录音
    itchat.PICTURE 图片/表情
    itchat.content.VOICE 录音
    itchat.content.ATTACHMENT 附件
    itchat.content.VIDEO 短视频
    itchat.content.FRIENDS 好友邀请
    itchat.content.SYSTEM 系统信息

    一个监听到文字信息并响应信息的代码示例如下:

    import itchat
    
    
    @itchat.msg_register(itchat.content.TEXT)
    def reply_msg(msg):
        if msg['Content'] == u'你好':
            itchat.send_msg(msg['User']['NickName'] + "你好啊!", msg['FromUserName'])
    
    
    if __name__ == '__main__':
        itchat.auto_login()
        itchat.run()
    

    代码执行结果如下

    19.2.5 群聊

    在微信网页端改版后,创建群聊、拉人进群和删除群聊这几个接口都用不了,现在利用itchat能做的有:查找群聊,往群聊发送信息,以及监控群聊信息,使用代码示例如下:

    import itchat
    import time
    
    
    @itchat.msg_register(itchat.content.TEXT, isGroupChat=True)
    def reply_msg(msg):
        print("收到一条群信息:", msg['ActualNickName'], msg['Content'])
    
    
    def after_login():
        # 获得完整的群聊列表
        print("完整的群聊列表如下:")
        print(itchat.get_chatrooms())
        # 查找特定群聊
        time.sleep(10)
        # 通过群聊名查找
        chat_rooms = itchat.search_chatrooms(name='小猪的Python学习交流群')
        if len(chat_rooms) > 0:
            itchat.send_msg('测试', chat_rooms[0]['UserName'])
    
    
    if __name__ == '__main__':
        itchat.auto_login(loginCallback=after_login)
        itchat.run()

    代码执行结果如下:

    完整的群聊列表如下:
    [<Chatroom: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@@60dc5027bbbb83d532aa633b8d126szcf497a98ceea5c098d2c65f0932139b88', 'NickName': '湖北人在深圳90后', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=625714901&username=@@60dc502769a783d532aa633b8d126190f497a98ceea5c098d2c65f0932139b88&skey=@crypt_2d4a1972_ea00536c8ac4e35fae1c2a1c48dfe40d', 'ContactFlag': 3, 'MemberCount': 82, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 0, 'Signature': '', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'HBRZSZ90H', 'PYQuanPin': 'hubeirenzaishenzhen90hou', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 0, 'Province': '', 'City': '', 'Alias': '', 'SnsFlag': 0, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': '', 'EncryChatRoomId': '', 'IsOwner': 0, 'IsAdmin': None, 'Self': <User: {'MemberList': <ContactList: []>, 'UserName': '@29b9cb6386352503319f411754e7424e383ae09e50a224feca754a4516db6a13', 'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial': '', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '', 'EncryChatRoomId': '', 'Alias': '', 'Signature': '(´v`o)♡', 'NickName': 'Robot Pig', 'RemarkPYQuanPin': '', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=275167114&username=@29b9cb6386352503319f411754e7424e383ae09e50a224feca754a4516db6a13&skey=@crypt_2d4a1972_ea00536c8ac4e35fae1c2a1c48dfe40d', 'UniFriend': 0, 'Sex': 2, 'AppAccountFlag': 0, 'VerifyFlag': 0, 'ChatRoomId': 0, 'HideInputBarFlag': 0, 'AttrStatus': 0, 'SnsFlag': 1, 'MemberCount': 0, 'OwnerUin': 0, 'ContactFlag': 0, 'Uin': 3454488193, 'StarFriend': 0, 'Statues': 0, 'WebWxPluginSwitch': 0, 'HeadImgFlag': 1}>}> 内容过多省略... ]
    
    收到一条群信息: 培杰 123
    收到一条群信息: 培杰 你好

    聊天记录截图

    另外,群聊除了通过群名搜索外还可以通过username来查找,或者两者搭配使用;
    在msg里有一个isAt字段,可用于判断是否被人@了。

    19.2.6 公众号

    使用方式和群聊的非常类似,搜索公众号方法search_mps,监听公众号信息添加isMpChat=True元素,使用代码示例如下:

    import itchat
    
    
    @itchat.msg_register(itchat.content.TEXT, isMpChat=True)
    def reply_msg(msg):
        print("收到一条公众号信息:", msg['User']['NickName'], msg['Content'])
    
    
    def login_after():
        mps = itchat.search_mps(name='CoderPig')
        if len(mps) > 0:
            print(mps)
            itchat.send_msg('人生苦短', toUserName=mps[0]['UserName'])
    
    
    if __name__ == '__main__':
        itchat.auto_login(loginCallback=login_after)
        itchat.run()

    代码执行结果如下

    [<MassivePlatform: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@07585e92f75be7320e49627cf0c3ad43', 'NickName': 'CoderPig', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=610904174&username=@07585e92f75be7320e49627cf0c3ad43&skey=@crypt_2d4a1972_bc443bf966f94fa11f2db8f812e456cf', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 0, 'Signature': '一枚咸鱼Android开发,会点Python,分享点学习经验,总结,鸡汤,读书笔记,生活技巧', 'VerifyFlag': 8, 'OwnerUin': 0, 'PYInitial': 'CODERPIG', 'PYQuanPin': 'CoderPig', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 0, 'Province': '广东', 'City': '深圳', 'Alias': '', 'SnsFlag': 0, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'gh_', 'EncryChatRoomId': '', 'IsOwner': 0}>]
    
    收到一条公众号信息: CoderPig 我用Python

    聊天记录截图

    19.3 实用示例:定时发送消息

    定时发送信息这个操作在日常生活中非常实用,比如给别人发生日或者节日祝福,晚上12点准时发,如果有早睡习惯的要熬到12点就很难受了,我们可以利用itchat编写一个简单的定时发送信息脚本。这里我们用到一个apscheduler定时调度任务模块,在命令行键入pip install apscheduler即可完成安装。这里并不会详细讲解,有兴趣的可移步到官方文档自行查阅:
    http://apscheduler.readthedocs.io/en/latest/userguide.html
    定时发送消息的代码示例如下:

    import itchat
    from apscheduler.schedulers.blocking import BlockingScheduler
    import time
    
    
    # 发送信息
    def send_msg():
        user_info = itchat.search_friends(name='培杰')
        if len(user_info) > 0:
            user_name = user_info[0]['UserName']
            itchat.send_msg('生日快乐哦!', toUserName=user_name)
    
    
    def after_login():
        sched.add_job(send_msg, 'cron', year=2018, month=7, day=28, hour=16, minute=5, second=30)
        sched.start()
    
    
    def after_logout():
        sched.shutdown()
    
    
    if __name__ == '__main__':
        sched = BlockingScheduler()
        itchat.auto_login(loginCallback=after_login, exitCallback=after_login)
        itchat.run()

    代码执行结果如下

    19.4 实用示例:集成图灵API制作聊天机器人

    图灵机器人官网:http://www.tuling123.com/member/robot/index.jhtml
    注册一个账号后,点击创建机器人,会弹出如图所示的面板,按需配置下即可。

    普通账户可以创建5个机器人,每天有5000次的免费调用机会。点击新创建好的机器人,
    会进入如图所示的界面,我们只需要保存下apikey,调用接口用的秘钥。

    点击底下的api使用文档,或者直接打开 https://www.kancloud.cn/turing/web_api/522992,进入接口文档页,在这里我们可以看到接口调用相关的信息,包括接口地址:http://openapi.tuling123.com/openapi/api/v2,请求方式:POST,请求数据格式:JSON,请求数据示例:

    {
        "reqType":0,
        "perception": {
            "inputText": {
                "text": "附近的酒店"
            },
            "inputImage": {
                "url": "imageUrl"
            },
            "selfInfo": {
                "location": {
                    "city": "北京",
                    "province": "北京",
                    "street": "信息路"
                }
            }
        },
        "userInfo": {
            "apiKey": "",
            "userId": ""
        }
    }

    我们可以利用Postman模拟下请求,试试接口是否可用,先设下请求头:

    Content-Type:application/json
    Host:openapi.tuling123.com
    User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3486.0 Safari/537.36

    接着是提交数据:

    {
        "reqType":0,
        "perception": {
            "inputText": {
                "text": "你好"
            }
        },
        "userInfo": {
            "apiKey": "7e9377d760274b3499f6dec8eed37bbb",
            "userId": "123"
        }
    }

    看下返回结果:

    {
        "emotion": {
            "robotEmotion": {
                "a": 0,
                "d": 0,
                "emotionId": 0,
                "p": 0
            },
            "userEmotion": {
                "a": 0,
                "d": 0,
                "emotionId": 0,
                "p": 0
            }
        },
        "intent": {
            "actionName": "",
            "code": 10004,
            "intentName": ""
        },
        "results": [
            {
                "groupType": 1,
                "resultType": "text",
                "values": {
                    "text": "我很好,你也要好好的"
                }
            }
        ]
    }

    返回结果里的text明显就是我们想要的东西,整个过程了解了,接着我们来编写代码,流程如下:

    (1)监听微信信息。
    (2)接收到信息,获取信息内容。
    (3)调用接口,获取请求结果,提取返回的text。
    (4)把提取到的text返回给发送信息的人。

    具体代码实现如下

    import itchat
    import requests as rq
    
    
    @itchat.msg_register(itchat.content.TEXT)
    def reply_msg(msg):
        info = msg['Content'].encode('utf8')
        # 图灵API接口
        api_url = 'http://openapi.tuling123.com/openapi/api/v2'
        # 接口请求数据
        data = {
            "reqType": 0,
            "perception": {
                "inputText": {
                    "text": str(info)
                }
            },
            "userInfo": {
                "apiKey": "7e9377d76fc7ee9499f6dec8eed37bbb",
                "userId": "123"
            }
        }
    
        headers = {
            'Content-Type': 'application/json',
            'Host': 'openapi.tuling123.com',
            'User-Agent': 'Mozilla/5.0 (Wi`ndows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3486.0 '
                          'Safari/537.36 '
        }
        # 请求接口
        result = rq.post(api_url, headers=headers, json=data).json()
        # 提取text,发送给发信息的人
        itchat.send_msg(result['results'][0]['values']['text'], msg['FromUserName'])
        print()
    
    
    if __name__ == '__main__':
        itchat.auto_login()
        itchat.run()

    代码执行结果如下图所示:

    19.5 实用示例:实现微信信息防撤回

    上面的图灵机器人有时回答得牛头不对马嘴,特别是在多轮问答的时候,闲聊玩玩还是不错的。
    接着的我们要利用itchat来编写一个微信信息防撤回的脚本。当监控到用户或者群聊发送信息
    撤回的话,把撤回的内容通过文件传输助手发送给我们,说下大体的思路流程。

    (1)监听所有聊天记录,包括群聊,把信息都存入到一个字典里,资源类文件下载到本地。
    (2)监听到撤回信息后,根据撤回的信息id,查找字典里对应的信息,发送给文件助手。
    (3)每隔五分钟清理缓存数据。

    流程看上去是挺简单,接着我们一点点来摸索实现。

    19.5.1 监控接收到的数据

    先是监控信息,信息又分为好友聊天和群聊,我们编写代码来监控下收到的数据是怎么样的?

    import itchat
    from itchat.content import *
    
    
    # 好友信息监听
    @itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True)
    def handle_friend_msg(msg):
        print("好友信息: ", msg)
    
    
    # 群聊信息监听
    @itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)
    def information(msg):
        print("群聊信息: ", msg)
    
    
    if __name__ == '__main__':
        itchat.auto_login()
        itchat.run()

    给机器人发送一条信息,还有往群聊里发送一条信息,查看打印的信息内容,先是好友信息

    好友信息:  {'MsgId': '5500935424291030814', 'FromUserName': '@8fd8b5b2bd0862ed5d0d573bc6c08362', 'ToUserName': '@913c3124d973db6ae25924bd0598b48a0028e0c2d01e18d8095cc6fd58db116b', 'MsgType': 1, 'Content': '123', 'Status': 3, 'ImgStatus': 1, 'CreateTime': 1533010285, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 0, 'ImgWidth': 0, 'SubMsgType': 0, 'NewMsgId': 5500935424291030814, 'OriContent': '', 'EncryFileName': '', 'User': <User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@8fd8b5b2bd0862ed5d0d573bc6c08362', 'NickName': 'CoderPig', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@8fd8b5b2bd0862ed5d0d573bc6c08362&skey=@crypt_2d4a1972_26dc3be99a177455b82518b3ca6e6cc5', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': '不服气,就用行动去证明,少说多做...2018.7.29', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'CODERPIG', 'PYQuanPin': 'CoderPig', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 33783847, 'Province': '广东', 'City': '江门', 'Alias': '', 'SnsFlag': 17, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'zpj', 'EncryChatRoomId': '', 'IsOwner': 0}>, 'Type': 'Text', 'Text': '123'}

    分析下要采集的数据,MsgId(微信信息的标识,用来作为键),NickName(发送者的用户名),Content(信息内容),CreateTime(创建时间), Type(信息类型)。接着是群聊信息:

    群聊信息:  {'MsgId': '3177606925001563512', 'FromUserName': '@@16521484d35b2fe9c953282d98ec4f11456607924b3a7cc6d7fb671fe7e3081c', 'ToUserName': '@913c3124d973db6ae25924bd0598b48a0028e0c2d01e18d8095cc6fd58db116b', 'MsgType': 1, 'Content': '嘿嘿', 'Status': 3, 'ImgStatus': 1, 'CreateTime': 1533010298, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 0, 'ImgWidth': 0, 'SubMsgType': 0, 'NewMsgId': 3177606925001563512, 'OriContent': '', 'EncryFileName': '', 'ActualNickName': '易♂建♂联', 'IsAt': False, 'ActualUserName': '@8fd8b5b2bd0862ed5d0d573bc6c08362', 'User': 

    同样分析下要采集的数据,MsgId(微信信息的标识),ActualNickName(发送者群名称),Content(信息内容),CreateTime(创建时间), Type(信息类型)。改下我们的程序,把这些都提取打印出来。

    import itchat
    from itchat.content import *
    
    
    # 好友信息监听
    @itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True)
    def handle_friend_msg(msg):
        msg_id = msg['MsgId']
        msg_from_user = msg['User']['NickName']
        msg_content = msg['Content']
        msg_create_time = msg['CreateTime']
        msg_type = msg['Type']
        print("收到信息: ", msg_id, msg_from_user, msg_content, msg_create_time,msg_type)
    
    
    # 群聊信息监听
    @itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)
    def information(msg):
        msg_id = msg['MsgId']
        msg_from_user = msg['ActualNickName']
        msg_content = msg['Content']
        msg_create_time = msg['CreateTime']
        msg_type = msg['Type']
        print("群聊信息: ",msg_id, msg_from_user, msg_content, msg_create_time,msg_type)
    
    
    if __name__ == '__main__':
        itchat.auto_login()
        itchat.run()
    

    代码执行结果如下:

    群聊信息:  2254622820807367335 胡小韬 对手公司 1533023277 Text
    群聊信息:  1765614482944449471 xia_ang 还有自干五 1533023285 Text
    好友信息:  615083621872361432 CoderPig 哈哈 1533023293 Text
    好友信息:  7292909308782687092 CoderPig 你好哦 1533023302 Text

    19.5.2 验证不同信息类型和对应处理方式

    嗯,信息提取成功,接下来要验证的是不同的信息类型和对应的处理方式,文字,图片(表情),音频,视频,文件五种,后面四种都需要下载到本地,itchat中提供了一个下载文件的方法msg['Text'](文件存储路径),调用这个方法即可完成文件下载,修改后的代码如下:

    import itchat
    from itchat.content import *
    import os
    import time
    
    # 文件临时存储页
    rec_tmp_dir = os.path.join(os.getcwd(), 'tmp/')
    
    # 存储数据的字典
    rec_msg_dict = {}
    
    
    # 好友信息监听
    @itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True)
    def handle_friend_msg(msg):
        msg_id = msg['MsgId']
        msg_from_user = msg['User']['NickName']
        msg_content = ''
        # 收到信息的时间
        msg_time_rec = time.strftime("%Y-%m-%d %H:%M%S", time.localtime())
        msg_create_time = msg['CreateTime']
        msg_type = msg['Type']
    
        if msg['Type'] == 'Text':
            msg_content = msg['Content']
        elif msg['Type'] == 'Picture' \
                or msg['Type'] == 'Recording' \
                or msg['Type'] == 'Video' \
                or msg['Type'] == 'Attachment':
            msg_content = r"" + msg['FileName']
            msg['Text'](rec_tmp_dir + msg['FileName'])
        rec_msg_dict.update({
            msg_id: {
                'msg_from_user': msg_from_user,
                'msg_time_rec': msg_time_rec,
                'msg_create_time': msg_create_time,
                'msg_type': msg_type,
                'msg_content': msg_content
            }
        })
        print(msg)
    
    
    # 群聊信息监听
    @itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)
    def information(msg):
        msg_id = msg['MsgId']
        msg_from_user = msg['ActualNickName']
        msg_content = ''
        # 收到信息的时间
        msg_time_rec = time.strftime("%Y-%m-%d %H:%M%S", time.localtime())
        msg_create_time = msg['CreateTime']
        msg_type = msg['Type']
    
        if msg['Type'] == 'Text':
            msg_content = msg['Content']
        elif msg['Type'] == 'Picture' \
                or msg['Type'] == 'Recording' \
                or msg['Type'] == 'Video' \
                or msg['Type'] == 'Attachment':
            msg_content = r"" + msg['FileName']
            msg['Text'](rec_tmp_dir + msg['FileName'])
        rec_msg_dict.update({
            msg_id: {
                'msg_from_user': msg_from_user,
                'msg_time_rec': msg_time_rec,
                'msg_create_time': msg_create_time,
                'msg_type': msg_type,
                'msg_content': msg_content
            }
        })
        print(msg)
    
    
    if __name__ == '__main__':
        if not os.path.exists(rec_tmp_dir):
            os.mkdir(rec_tmp_dir)
        itchat.auto_login()
        itchat.run()

    代码执行后,分别测试下发送各种文件,看是否都缓存下来,如图所示

    19.5.3 监控撤回信息和数据提取

    接着到撤回信息的监控,撤回的信息类型是NOTE,我们监听下看看,看看撤回的信息具体内容。

    {'MsgId': '7399110162640182490', 'FromUserName': '@9c1a8bf4e28771a6b3ab635991dea2a1', 'ToUserName': '@49d1d90b90371099297a08da1009f3cdd042f21194239ef47b60e8f0b52e4553', 'MsgType': 10002, 'Content': '<sysmsg type="revokemsg"><revokemsg><session>zpj779878443</session><oldmsgid>1625723544</oldmsgid><msgid>3154925139554625499</msgid><replacemsg><![CDATA["CoderPig" 撤回了一条消息]]></replacemsg></revokemsg></sysmsg>', 'Status': 4, 'ImgStatus': 1, 'CreateTime': 1533103679, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 0, 'ImgWidth': 0, 'SubMsgType': 0, 'NewMsgId': 7399110162640182490, 'OriContent': '', 'EncryFileName': '', 'User': <User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@9c1a8bf4e28771a6b3ab635991dea2a1', 'NickName': 'CoderPig', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@9c1a8bf4e28771a6b3ab635991dea2a1&skey=@crypt_2d4a1972_e0963a9b961045c2e06293043f1c98a8', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': '不服气,就用行动去证明,少说多做...2018.7.29', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'CODERPIG', 'PYQuanPin': 'CoderPig', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 33783847, 'Province': '广东', 'City': '江门', 'Alias': '', 'SnsFlag': 17, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'zpj', 'EncryChatRoomId': '', 'IsOwner': 0}>, 'Type': 'Note', 'Text': '"CoderPig" 撤回了一条消息'}

    首先是判断系统信息是默认撤回了一条信息,内容是:
    显示判断是否是撤回的信息,从上面可以看到这样的串字符串:<![CDATA["CoderPig" 撤回了一条消息]]>,我们只需要写个正则判断是否有这样的内容,有说明是撤回的信息提醒,接着找撤回的信息MsgId,在上面这串信息的前面就是了:<msgid>3154925139554625499</msgid>,同样用正则提取。接着要做的就是拿着MsgId去查存消息的字典,根据信息类型拼接文字或文字加文件,然后发送给文件传输助手。具体代码如下:

    @itchat.msg_register([NOTE], isFriendChat=True, isGroupChat=True)
    def revoke_msg(msg):
        if revoke_msg_compile.search(msg['Content']) is not None:
            old_msg_id = extract_msgid_compile.search(msg['Content']).group(1)
            old_msg = rec_msg_dict.get(old_msg_id, {})
            # 先发送一条文字信息
            itchat.send_msg(str(old_msg.get('msg_from_user') + "撤回了一条信息:"
                                + old_msg.get('msg_content')), toUserName="filehelper")
            # 判断文msg_content是否存在,不存在说明可能是
            if os.path.exists(os.path.join(rec_tmp_dir, old_msg.get('msg_content'))):
                if old_msg.get('msg_type') == 'Picture':
                    itchat.send_image(os.path.join(rec_tmp_dir, old_msg.get('msg_content')),
                                      toUserName="filehelper")
                elif old_msg.get('msg_type') == 'Video':
                    itchat.send_video(os.path.join(rec_tmp_dir, old_msg.get('msg_content')),
                                      toUserName="filehelper")
                elif old_msg.get('msg_type') == 'Attachment' \
                        or old_msg.get('msg_type') == 'Recording':
                    itchat.send_file(os.path.join(rec_tmp_dir, old_msg.get('msg_content')),
                                     toUserName="filehelper")

    运行后测试下发送信息后撤回,看下是否生效,测试结果如图所示。

    19.5.4 定时清理缓存

    另外,我们的信息都是用一个字典存着的,时间长了的话,数据会很多,而且图片文件这些会越攒越多,我们可以添加一个定时任务,比如每隔五分钟清理一下创建时长超过2分钟的信息和对应的文件。相关代码如下:

    # 每隔五种分钟执行一次清理任务
    def clear_cache():
        # 当前时间
        cur_time = time.time()
        # 遍历字典,如果有创建时间超过2分钟(120s)的记录,删除,非文本的话,连文件也删除
        for key in list(rec_msg_dict.keys()):
            if int(cur_time) - int(rec_msg_dict.get(key).get('msg_create_time')) > 120:
                if not rec_msg_dict.get(key).get('msg_type') == 'Text':
                    file_path = os.path.join(rec_tmp_dir, rec_msg_dict.get(key).get('msg_content'))
                    print(file_path)
                    if os.path.exists(file_path):
                        os.remove(file_path)
                rec_msg_dict.pop(key)
    
    # 开始轮询任务
    def start_schedule():
        sched.add_job(clear_cache, 'interval', minutes=2)
        sched.start()
    
    
    # 退出停止所有任务并清空缓存文件夹
    def after_logout():
        sched.shutdown()
        shutil.rmtree(rec_tmp_dir)
    
    if __name__ == '__main__':
        sched = BlockingScheduler()
        if not os.path.exists(rec_tmp_dir):
            os.mkdir(rec_tmp_dir)
        itchat.auto_login(exitCallback=after_logout)
        itchat.run(blockThread=False)
        start_schedule()    

    19.6 小结

    本章我们对微信网页接口开源库itchat库进行了学习,通过三个实用的代码示例,相信你对这个库已经有个大概的了解了,你也可以根据自己的需求来定制一个自己的机器人,比如添加自动回复,特定信息监控转发等。另外,如果你想让自己的机器人一直运行,可以把脚本部署到服务器上运行,具体怎么运行可以参见爬虫部分的章节。


    Tips:

    如果在查看本文的时候有什么问题,可以在评论区留言,或者加我微信(不闲聊),拉你进群一起讨论:


    展开全文
  • itchat研究笔记

    千次阅读 2017-08-12 15:21:20
    看了一些python的书之后总算是入门了一点,然后又听说了itchat,想了解一下,然后又 是github啊,什么啊,总之先看吧,看不懂,发现itchat的文件跟包完全看不懂,好再有 itchat官方文档,但是官方文档也没多大详细...
  • itchat 新手上路

    千次阅读 2018-10-30 14:05:01
    之前客户端每次在测试阶段更新测试包之后一直在寻找一个有效的自动化提醒测试组已更新安装包方式,自动提醒邮件...QQ就我目前所知暂时没有一个有效稳定的api或者类库可以用来自动发消息,然而,微信有itchat。。 ...
  • itchat

    2019-03-23 13:27:18
    文档:https://itchat.readthedocs.io/zh/latest/ 图灵机器人官网:http://www.tuling123.com/
  • Python入门:import itchat

    千次阅读 2018-06-16 23:43:30
    找到自己电脑中py3.7的安装路径,cd到Scripts目录下:Python\Python36\Scripts使用命令安装:pip install itchat提示更新:更新后可以发现目录中多了chatdetect这个应用程序:可以使用了,完成第一个程序吧:im...
  • itchat总结

    2019-08-01 14:30:19
    python实现微信接口(itchat) 安装 sudo pip install itchat 登录 itchat.auto_login()这种方法将会通过微信扫描二维码登录,但是这种登录的方式确实短时间的登录,并不会保留登录的状态,也就是下次...
  • itchat模块

    2019-09-26 11:06:53
    itchat(关于此部分学习可以在百度上搜索itchat进行学习) itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。 使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。 当然,该...
  • 找到python安装目录下的scripts文件物理路劲,cd进去然后输入命令即可 。。。。。。 看到如图所示,恭喜你,你已经成功了
  • window下安装itchat

    万次阅读 2018-01-04 10:35:56
    首先开发环境是pyCharm,要安装itchat库吗,网上大部分就是说pip install itchat 命令就行,问题是我要在哪里执行这个命令呢? 解决办法:  运行,输入cmd,回车,在里面pip就行了。如果没有安装,看下是否是...
  • itchat遇到的问题

    千次阅读 2017-10-08 10:03:11
    itchat.auto_login(hotReload=True) 之前使用了 itchat.auto_login(enableCmdQR=true) 之后,每次扫码登录之后自动logout,在将 itchat.auto_login(enableCmdQR=-1)(不改成-1即反色手机读不出二维码
  • python安装itchat(win+linux)

    千次阅读 2018-06-28 15:26:25
    安装成功之后,进入pip3.exe所在的目录,一般在 ..\python34\Scripts 这个目录下面安装itchat:pip3.exe install itchat 下图我的已经安装过了(注意:使用3以及以上版本执行)。3、打开cmd,直接拖入python脚本...
  • itchat给指定联系人发消息

    千次阅读 2018-03-04 14:31:41
    首先先安装itchat,具体可以看我另外一篇博客import itchat itchat.auto_login() itchat.send('Hello, filehelper', toUserName='filehelper')这段代码意思是给filehelper发送一个hello,filehelper就是文件助手。...
  • python itchat在ubuntu登录二维码乱码

    千次阅读 2019-02-07 14:16:31
    python itchat在ubuntu登录二维码乱码 无法扫描出来 原因:部分系统可能字幅宽度有出入,可以通过将enableCmdQR赋值为特定的倍数进行调整: 参考itchat文档:登陆配置 - itchat 解决方案: itchat.auto_login...
  • itchat微信自动回复消息

    万次阅读 2017-02-18 11:07:46
    使用之前需要准备的工作:安装itchat API easy_install itchat#coding=utf8 import itchat,time from itchat.content import *''' ##自动回复的功能 @itchat.msg_register(itchat.content.TEXT) def text_reply(msg...
  • 新手一枚,在写一个爬虫要用到itchat模块,于是在cmd中pip install itchat 成功后在annocanda中却出现了下面的情况··· 经过查找网上各大神博客发现,原来pip默认是把东西安装在系统python环境中,即C:\Python27\...
  • 微信 聊天 机器人 python itchat

    千次阅读 2017-02-01 19:53:58
    正文调用itchat访问图灵机器人api聊天的小程序,应付一下过年的刷屏群发 之前搞的alice只能回英语,而且略呆傻 图灵api的key去注册账号就有了,网址戳这里 就是这样Code# -*- coding: utf-8 -*- import requests,...
1 2 3 4 5 ... 20
收藏数 3,121
精华内容 1,248
关键字:

itchat