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开发编码规范
Sep 08 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
Python入门必须知道的11个知识点
Mar 21 Python
Python GUI布局尺寸适配方法
Oct 11 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
Python实现京东秒杀功能代码
May 16 Python
python实现截取屏幕保存文件,删除N天前截图的例子
Aug 27 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
浅析Python 多行匹配模式
Jul 24 Python
Python如何操作docker redis过程解析
Aug 10 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
一个ubbcode的函数,速度很快.
2006/10/09 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
JS Array对象入门分析
2008/10/30 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
分享纯手写漂亮的表单验证
2015/11/19 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
python定位xpath 节点位置的方法
2019/08/27 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
python数据爬下来保存的位置
2020/02/17 Python
解决Django no such table: django_session的问题
2020/04/07 Python
使用Python实现将多表分批次从数据库导出到Excel
2020/05/15 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
日本小田急百货官网:Odakyu
2018/07/19 全球购物
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
英国DIY汽车维修配件网站:DIY Car Service Parts
2019/08/30 全球购物
甜点店创业计划书
2014/01/27 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
2014年教师节寄语
2014/04/03 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
浅谈JavaScript作用域
2021/12/06 Javascript
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL