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 相关文章推荐
Python3读取zip文件信息的方法
May 22 Python
改进Django中的表单的简单方法
Jul 17 Python
python基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
python中list列表的高级函数
May 17 Python
带你了解python装饰器
Jun 15 Python
python 将数据保存为excel的xls格式(实例讲解)
May 03 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
详解python数据结构和算法
Apr 18 Python
Django的models模型的具体使用
Jul 15 Python
Python 获取指定文件夹下的目录和文件的实现
Aug 30 Python
利用Python计算KS的实例详解
Mar 03 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 06 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
php基于mcrypt的加密解密实例
2014/10/27 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
聊聊Python中的pypy
2018/01/12 Python
Python学生信息管理系统修改版
2018/03/13 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
html+css3实现的登录界面
2020/12/09 HTML / CSS
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
美国在线家具网站:GDFStudio
2021/03/13 全球购物
个人生活学习自我评价范文
2013/11/26 职场文书
一体化教学实施方案
2014/05/10 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA