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 稀疏矩阵-sparse 存储和转换
May 27 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
python基础while循环及if判断的实例讲解
Aug 25 Python
Python定时器实例代码
Nov 01 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
Python实现字符型图片验证码识别完整过程详解
May 10 Python
python根据多个文件名批量查找文件
Aug 13 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
python如何基于redis实现ip代理池
Jan 17 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 Python
python基础学习之递归函数知识总结
May 26 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计算两个日期相差天数的方法
2015/03/14 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
Javascript读写cookie的实例源码
2019/03/16 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
django 修改server端口号的方法
2018/05/14 Python
Python docutils文档编译过程方法解析
2020/06/23 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
Python修改DBF文件指定列
2020/12/19 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
致短跑运动员广播稿
2014/01/09 职场文书
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
秋季红领巾广播稿
2014/01/27 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
锅炉工岗位职责
2015/02/13 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
工作态度检讨书范文
2015/05/06 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL