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.5仿微软记事本notepad
Jun 15 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 Python
Python之reload流程实例代码解析
Jan 29 Python
python中的句柄操作的方法示例
Jun 20 Python
Django 接收Post请求数据,并保存到数据库的实现方法
Jul 12 Python
Django ORM多对多查询方法(自定义第三张表&amp;ManyToManyField)
Aug 09 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
Python requests模块session代码实例
Apr 14 Python
Python基于进程池实现多进程过程解析
Apr 30 Python
pygame用blit()实现动画效果的示例代码
May 28 Python
python利用while求100内的整数和方式
Nov 07 Python
django中websocket的具体使用
Jan 22 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自动加载autoload机制示例分享
2014/02/20 PHP
php对象和数组相互转换的方法
2015/05/12 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
jquery按回车提交数据的代码示例
2013/11/05 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
JS烟花背景效果实现方法
2015/03/03 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
深入解析Python中的urllib2模块
2015/11/13 Python
python读取oracle函数返回值
2016/07/18 Python
pandas中去除指定字符的实例
2018/05/18 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
Python求离散序列导数的示例
2019/07/10 Python
Django之PopUp的具体实现方法
2019/08/31 Python
python银行系统实现源码
2019/10/25 Python
Python设计密码强度校验程序
2020/07/30 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
高三自我鉴定怎么写
2013/10/19 职场文书
物业电工岗位职责
2013/11/20 职场文书
高中班长自我鉴定
2013/12/20 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
springboot如何初始化执行sql语句
2021/06/22 Java/Android
Oracle表空间与权限的深入讲解
2021/11/17 Oracle