专栏首页Python中文社区用Python玩转微信的正确姿势!

用Python玩转微信的正确姿势!

0. itchat

最近研究了一些微信的玩法,我们可以通过网页版的微信微信网页版,扫码登录后去抓包爬取信息,还可以post去发送信息。

然后发现了itchat这个开源项目,作者是@LittleCoder,已经把微信的接口完成了,大大的方便了我们对微信的挖掘,以下的功能也通过itchat来实现。

安装itchat这个库

pip install itchat

先来段简单的试用,实现微信的登录,运行下面代码会生成一个二维码,扫码之后手机端确认登录,就会发送一条信息给‘filehelper’,这个filehelper就是微信上的文件传输助手。

import itchat# 登录itchat.login()# 发送消息itchat.send(u'你好', 'filehelper')

除了登录和发送消息我们还可以这么来玩,往下走~

1. 微信好友男女比例

想统计下自己微信里好友的性别比例,当然也是很简单,先获取好友列表,统计列表里性别计数

import itchat# 先登录itchat.login()# 获取好友列表friends = itchat.get_friends(update=True)[0:]# 初始化计数器,有男有女,当然,有些人是不填的male = female = other = 0# 遍历这个列表,列表里第一位是自己,所以从"自己"之后开始计算# 1表示男性,2女性for i in friends[1:]:
    sex = i["Sex"]
    if sex == 1:
        male += 1
    elif sex == 2:
        female += 1
    else:
        other += 1# 总数算上,好计算比例啊~total = len(friends[1:])# 好了,打印结果print u"男性好友:%.2f%%" % (float(male) / total * 100)print u"女性好友:%.2f%%" % (float(female) / total * 100)print u"其他:%.2f%%" % (float(other) / total * 100)

好看看结果:

(好吧,暴露了我男性友人较多的真相~~)

好像不够直观,有兴趣的朋友可以加上可视化的展示,我这里用基于python的Echarts(有机会再细讲) 先安装了

pip install echarts-python

展示比例一般使用百分比圆饼表吧

# 使用echarts,加上这段from echarts import Echart, Legend, Piechart = Echart(u'%s的微信好友性别比例' % (friends[0]['NickName']), 'from WeChat')chart.use(Pie('WeChat',
              [{'value': male, 'name': u'男性 %.2f%%' % (float(male) / total * 100)},
               {'value': female, 'name': u'女性 %.2f%%' % (float(female) / total * 100)},
               {'value': other, 'name': u'其他 %.2f%%' % (float(other) / total * 100)}],
              radius=["50%", "70%"]))chart.use(Legend(["male", "female", "other"]))del chart.json["xAxis"]del chart.json["yAxis"]chart.plot()

登登登登~

2. 好友个性签名词云

获取好友列表的时候,返回的json信息中还看到了有个性签名的信息,脑洞一开,把大家的个性签名都抓下来,看看高频词语,还做了个词云。

# coding:utf-8import itchat# 先登录itchat.login()# 获取好友列表friends = itchat.get_friends(update=True)[0:]for i in friends:
    # 获取个性签名
    signature = i["Signature"]print signature

先全部抓取下来 打印之后你会发现,有大量的span,class,emoji,emoji1f3c3等的字段,因为个性签名中使用了表情符号,这些字段都是要过滤掉的,写个正则和replace方法过滤掉

for i in friends:# 获取个性签名
    signature = i["Signature"].strip().replace("span", "").replace("class", "").replace("emoji", "")# 正则匹配过滤掉emoji表情,例如emoji1f3c3等
    rep = re.compile("1f\d.+")
    signature = rep.sub("", signature)
    print signature

接来下用jieba分词,然后制作成词云,首先要安装jieba和wordcloud库

pip install jieba
pip install wordcloud

代码

# coding:utf-8import itchatimport reitchat.login()friends = itchat.get_friends(update=True)[0:]tList = []for i in friends:
    signature = i["Signature"].replace(" ", "").replace("span", "").replace("class", "").replace("emoji", "")
    rep = re.compile("1f\d.+")
    signature = rep.sub("", signature)
    tList.append(signature)# 拼接字符串text = "".join(tList)# jieba分词import jiebawordlist_jieba = jieba.cut(text, cut_all=True)wl_space_split = " ".join(wordlist_jieba)# wordcloud词云import matplotlib.pyplot as pltfrom wordcloud import WordCloudimport PIL.Image as Image# 这里要选择字体存放路径,这里是Mac的,win的字体在windows/Fonts中my_wordcloud = WordCloud(background_color="white", max_words=2000, 
                         max_font_size=40, random_state=42,
                         font_path='/Users/sebastian/Library/Fonts/Arial Unicode.ttf').generate(wl_space_split)plt.imshow(my_wordcloud)plt.axis("off")plt.show()

运行代码

这。。好像有点丑,根据wordcloud用法,我可以找一张图来生成配色方案,我这里找了一张微信的logo

修改一下代码

# wordcloud词云import matplotlib.pyplot as pltfrom wordcloud import WordCloud, ImageColorGeneratorimport osimport numpy as npimport PIL.Image as Imaged = os.path.dirname(__file__)alice_coloring = np.array(Image.open(os.path.join(d, "wechat.jpg")))my_wordcloud = WordCloud(background_color="white", max_words=2000, mask=alice_coloring,
                         max_font_size=40, random_state=42,
                         font_path='/Users/sebastian/Library/Fonts/Arial Unicode.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()# 保存图片 并发送到手机my_wordcloud.to_file(os.path.join(d, "wechat_cloud.png"))itchat.send_image("wechat_cloud.png", 'filehelper')

嗯~好像还可以,这是Mac下生成的,附一个win10下生成的

3. 微信自动回复

接着来实现一个类似qq上的自动回复,原理就是接收到消息,就发消息回去,同时发一条给文件助手,就可以在文件助手中统一查看消息。

代码很简单,来看看

#coding=utf8import itchat# 自动回复# 封装好的装饰器,当接收到的消息是Text,即文字消息@itchat.msg_register('Text')def text_reply(msg):
    # 当消息不是由自己发出的时候
    if not msg['FromUserName'] == myUserName:
        # 发送一条提示给文件助手
        itchat.send_msg(u"[%s]收到好友@%s 的信息:%s\n" %
                        (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(msg['CreateTime'])),
                         msg['User']['NickName'],
                         msg['Text']), 'filehelper')
        # 回复给好友
        return u'[自动回复]您好,我现在有事不在,一会再和您联系。\n已经收到您的的信息:%s\n' % (msg['Text'])if __name__ == '__main__':
    itchat.auto_login()

    # 获取自己的UserName
    myUserName = itchat.get_friends(update=True)[0]["UserName"]
    itchat.run()

运行后会保持登录状态,开启自动回复模式,手机上查看:

当然,除了文字Text信息,还可以接收图片(表情包算图片),语音,名片,地理位置,分享和类型为Note的信息(就是有人提示类的消息,例如撤回消息),把装饰器写成下面形式即可接受,大家可以试试

@itchat.msg_register(['Map', 'Card', 'Note', 'Sharing', 'Picture'])

4. 最后

除了上面这些,还可以做到管理微信群,自动添加好友,还可以加入机器人回复功能,有时间会补上。

再次感谢itchat作者@LittleCoder

yLive预告:Python数据科学与

本文分享自微信公众号 - Python中文社区(python-china),作者:yonggege

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-05-09

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python文档研读系列:zip函数

    zip([iterable, ...]) This function returns a list of tuples, where the i-th tupl...

    Python中文社区
  • PyQt的一个UI单元测试框架思路

    專 欄 ❈丁果,Python中文社区作者。对django、pyqt、opencv、tornado感兴趣。 GitHub:https://github.com/...

    Python中文社区
  • Python中被忽略的else

    else, 我们再熟悉不过了。对于一个python程序员来说,else往往都是配合if来使用的,像这样:

    Python中文社区
  • python爬取微信信息--显示性别/地

    看到一篇有意思的博客 利用微信开放的接口itchat 可以获取登录的微信好友信息 并且利用图像工具显示分析结果 非常的有意思 记录下实现过程 并提供可执行代码

    py3study
  • 很简单的企业管理器---我写程序的方式,几个自定义控件。

    这里呢我利用我常用的东东写个实例,抛砖引玉,大家也都来批批,帮助我提高嘛。 我常用的呢是 数据访问层(简单理解是SQLHelp,但是绝不等于)、分页控件等自定...

    用户1174620
  • 如何用Python处理自然语言?(Spacy与Word Embedding)

    本文教你用简单易学的工业级Python自然语言处理软件包Spacy,对自然语言文本做词性分析、命名实体识别、依赖关系刻画,以及词嵌入向量的计算和可视化。

    王树义
  • Laravel 第三方登陆之 Socialite Providers

    Laravel 框架在 PHP 以优雅著称,得到不少同行之人称赞;也招揽了,无数的第三方扩展包,扩展了框架的各个方面功能,本篇文章,采用 Socialite P...

    霡霂
  • Seata为什么效率高

    老梁
  • BBC最新纪录片数据之欢(下):美女数学家讲述数据的前世今生

    大数据文摘
  • 美国国家情报总监首度公开承认NSA大规模监控项目

    据外媒报道,美国国家情报总监(DNI)于日前公开承认了自2001年就已经开始的NSA大规模监控项目。现 在,该机构已经在其官方上公布了一份名为"...

    安恒信息

扫码关注云+社区

领取腾讯云代金券