78行Python代码实现现微信撤回消息功能


Posted in Python onJuly 26, 2018

Python曾经对我说:"时日不多,赶紧用Python"。于是看到了一个基于python的微信开源库:itchat,玩了一天,做了一个程序,把私聊撤回的信息可以收集起来并发送到个人微信的文件传输助手,包括:

  • who :谁发送的
  • when :什么时候发送的消息
  • what:什么信息
  • which:哪一类信息,包括:文本、图片、语音、视频、分享、位置、附件...

01 代码实现

# -*-encoding:utf-8-*- 
import os 
import re 
import shutil 
import time 
import itchat 
from itchat.content import * 
# 说明:可以撤回的有文本文字、语音、视频、图片、位置、名片、分享、附件 
# {msg_id:(msg_from,msg_to,msg_time,msg_time_rec,msg_type,msg_content,msg_share_url)} 
msg_dict = {} 
# 文件存储临时目录 
rev_tmp_dir = "/home/alic/RevDir/" 
if not os.path.exists(rev_tmp_dir): os.mkdir(rev_tmp_dir) 
# 表情有一个问题 | 接受信息和接受note的msg_id不一致 巧合解决方案 
face_bug = None 
# 将接收到的消息存放在字典中,当接收到新消息时对字典中超时的消息进行清理 | 不接受不具有撤回功能的信息 
# [TEXT, PICTURE, MAP, CARD, SHARING, RECORDING, ATTACHMENT, VIDEO, FRIENDS, NOTE] 
@itchat.msg_register([TEXT, PICTURE, MAP, CARD, SHARING, RECORDING, ATTACHMENT, VIDEO]) 
def handler_receive_msg(msg): 
  global face_bug 
  # 获取的是本地时间戳并格式化本地时间戳 e: 2017-04-21 21:30:08 
  msg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 
  # 消息ID 
  msg_id = msg['MsgId'] 
  # 消息时间 
  msg_time = msg['CreateTime'] 
  # 消息发送人昵称 | 这里也可以使用RemarkName备注 但是自己或者没有备注的人为None 
  msg_from = (itchat.search_friends(userName=msg['FromUserName']))["NickName"] 
  # 消息内容 
  msg_content = None 
  # 分享的链接 
  msg_share_url = None 
  if msg['Type'] == 'Text' \ 
      or msg['Type'] == 'Friends': 
    msg_content = msg['Text'] 
  elif msg['Type'] == 'Recording' \ 
      or msg['Type'] == 'Attachment' \ 
      or msg['Type'] == 'Video' \ 
      or msg['Type'] == 'Picture': 
    msg_content = r"" + msg['FileName'] 
    # 保存文件 
    msg['Text'](rev_tmp_dir + msg['FileName']) 
  elif msg['Type'] == 'Card': 
    msg_content = msg['RecommendInfo']['NickName'] + r" 的名片" 
  elif msg['Type'] == 'Map': 
    x, y, location = re.search( 
      "<location x=\"(.*?)\" y=\"(.*?)\".*label=\"(.*?)\".*", msg['OriContent']).group(1, 2, 3) 
    if location is None: 
      msg_content = r"纬度->" + x.__str__() + " 经度->" + y.__str__() 
    else: 
      msg_content = r"" + location 
  elif msg['Type'] == 'Sharing': 
    msg_content = msg['Text'] 
    msg_share_url = msg['Url'] 
  face_bug = msg_content 
  # 更新字典 
  msg_dict.update( 
    { 
      msg_id: { 
        "msg_from": msg_from, "msg_time": msg_time, "msg_time_rec": msg_time_rec, 
        "msg_type": msg["Type"], 
        "msg_content": msg_content, "msg_share_url": msg_share_url 
      } 
    } 
  ) 
# 收到note通知类消息,判断是不是撤回并进行相应操作 
@itchat.msg_register([NOTE]) 
def send_msg_helper(msg): 
  global face_bug 
  if re.search(r"\<\!\[CDATA\[.*撤回了一条消息\]\]\>", msg['Content']) is not None: 
    # 获取消息的id 
    old_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1) 
    old_msg = msg_dict.get(old_msg_id, {}) 
    if len(old_msg_id) < 11: 
      itchat.send_file(rev_tmp_dir + face_bug, toUserName='filehelper') 
      os.remove(rev_tmp_dir + face_bug) 
    else: 
      msg_body = "告诉你一个秘密~" + "\n" \ 
            + old_msg.get('msg_from') + " 撤回了 " + old_msg.get("msg_type") + " 消息" + "\n" \ 
            + old_msg.get('msg_time_rec') + "\n" \ 
            + "撤回了什么 ⇣" + "\n" \ 
            + r"" + old_msg.get('msg_content') 
      # 如果是分享存在链接 
      if old_msg['msg_type'] == "Sharing": msg_body += "\n就是这个链接➣ " + old_msg.get('msg_share_url') 
      # 将撤回消息发送到文件助手 
      itchat.send(msg_body, toUserName='filehelper') 
      # 有文件的话也要将文件发送回去 
      if old_msg["msg_type"] == "Picture" \ 
          or old_msg["msg_type"] == "Recording" \ 
          or old_msg["msg_type"] == "Video" \ 
          or old_msg["msg_type"] == "Attachment": 
        file = '@fil@%s' % (rev_tmp_dir + old_msg['msg_content']) 
        itchat.send(msg=file, toUserName='filehelper') 
        os.remove(rev_tmp_dir + old_msg['msg_content']) 
      # 删除字典旧消息 
      msg_dict.pop(old_msg_id) 
if __name__ == '__main__': 
  itchat.auto_login(hotReload=True,enableCmdQR=2) 
  itchat.run()

该程序可以直接在终端运行,在终端扫码成功够即可登录成功,同时也可以打包在window系统运行(注意修改一下路径,推荐使用相对路径)。

~ python wx.py 
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. 
�[3;J 
Login successfully as AlicFeng 
Start auto replying.

02 效果图

78行Python代码实现现微信撤回消息功能 

03 itchat

上面都是编程逻辑的小事,我还是记录一下itchat微信这个开源库。

1. 简介

itchat是一个开源的微信个人号接口,使用python调用微信变得非常简单。简单是用itchat代码即可构建一个基于微信的即时通讯,更不错的体现在于方便扩展个人微信的在其他平台的更多通讯功能。

2. 安装

pip3 install itchat

3. itchat - Helloworld

仅仅三行代码发送一条信息给文件传输助手。

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

4. 查看客户端

78行Python代码实现现微信撤回消息功能 

学习最重要的还是API说明手册:

Github for itchat:

https://github.com/liduanwei/ItChat

中文API:

http://itchat.readthedocs.io/zh/latest/

Python 相关文章推荐
Python实现简单的代理服务器
Jul 25 Python
python读取二进制mnist实例详解
May 31 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 Python
Flask入门之上传文件到服务器的方法示例
Jul 18 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
python pytest进阶之xunit fixture详解
Jun 27 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
pytorch下使用LSTM神经网络写诗实例
Jan 14 Python
python中np是做什么的
Jul 21 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 Python
python opencv实现图片旋转矩形分割
Jul 26 #Python
Flask之flask-session的具体使用
Jul 26 #Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 #Python
python opencv旋转图像(保持图像不被裁减)
Jul 26 #Python
详解Django中间件的5种自定义方法
Jul 26 #Python
python opencv实现切变换 不裁减图片
Jul 26 #Python
Flask之flask-script模块使用
Jul 26 #Python
You might like
如何取得中文字符串中出现次数最多的子串
2013/08/08 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
php实现数据库的增删改查
2017/02/26 PHP
PHP xpath()函数讲解
2019/02/11 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
PHP7 新增常量
2021/03/09 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
JQuery实现自定义对话框的代码
2008/06/15 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
vuex操作state对象的实例代码
2018/04/25 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
在Python的Django框架中创建语言文件
2015/07/27 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
大学生优秀团员事迹材料
2014/01/30 职场文书
护士毕业生自荐信
2014/02/07 职场文书
学生会主席演讲稿
2014/04/25 职场文书
大学生创业计划书
2014/08/14 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
大学校园招聘会感想
2015/08/10 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书