python使用wxpy實(shí)現(xiàn)微信消息防撤回腳本
本文實(shí)例為大家分享了python實(shí)現(xiàn)微信消息防撤回的具體代碼,供大家參考,具體內(nèi)容如下
使用了sqlite3保存數(shù)據(jù),當(dāng)有人撤回消息時(shí)取出數(shù)據(jù)發(fā)送到文件傳輸助手。
文件的話會(huì)先保存到本地,語音會(huì)以文件的方式發(fā)送。
wxpy 和 itchat很久沒更新了,有些功能沒法用了,web微信也不知道什么時(shí)候會(huì)涼。
幫助信息在注釋里。
# -*- coding: utf-8 -*-
# 使用sqlite3保存message,當(dāng)有人撤回消息時(shí)在數(shù)據(jù)庫中通過ID檢索該消息是否存在,如果存在則將撤回的消息發(fā)送到文件助手里。
# 目前只支持 text picture map sharing recording video attachment 類型的消息。
import wxpy
import sqlite3
import os
import re
# 準(zhǔn)備工作
# 創(chuàng)建attachment目錄用于存儲(chǔ) 圖像、地圖/位置、分享、語音、視頻、文件
if not os.path.isdir('attachment'):
os.mkdir('attachment')
attachment_path = os.path.join(os.getcwd(), 'attachment')
bot = wxpy.Bot()
# 用于獲取msg ID
pattern = re.compile(r'\d{19}')
# 測試wxpy能否正常工作
myself = bot.friends()[0]
myself.send('Hello?')
# 創(chuàng)建數(shù)據(jù)庫和message表
try:
conn = sqlite3.connect('wxpy.db')
cursor = conn.cursor()
# cursor.execute('DROP TABLE MESSAGES')
cursor.execute("""CREATE TABLE IF NOT EXISTS MESSAGES (id INTEGER PRIMARY KEY AUTOINCREMENT,
msg_id INTEGER NOT NULL,
msg_text TEXT,
create_time DATE NOT NULL,
revoke_time DATE,
attachment_path TEXT,
msg_sender TEXT NOT NULL,
msg_type TEXT NOT NULL,
msg_url TEXT,
msg_raw_data TEXT NOT NULL)""")
# print('establish successfully')
finally:
conn.commit()
cursor.close()
conn.close()
# 注冊(cè)所有消息,在程序運(yùn)行期間將插入所有支持的信息
@bot.register()
def store_data(msg):
# print(msg.raw)
# 如果消息是支持的類型就將數(shù)據(jù)插入數(shù)據(jù)庫
if msg.type in [wxpy.TEXT, wxpy.RECORDING, wxpy.PICTURE, wxpy.ATTACHMENT, wxpy.VIDEO, wxpy.SHARING, wxpy.MAP]:
insert_data(msg)
# 撤回的消息類型是note
elif msg.type == wxpy.NOTE:
send_revoke(msg)
# 插入數(shù)據(jù)
def insert_data(msg):
try:
conn = sqlite3.connect('wxpy.db')
cursor = conn.cursor()
if msg.type == wxpy.TEXT:
cursor.execute("INSERT INTO MESSAGES (msg_id, msg_text, create_time, msg_sender, msg_type, msg_raw_data)\
values (?, ?, ?, ?, ?, ?)", (msg.id, msg.text, msg.create_time, str(msg.sender)[9:-1],
msg.type, str(msg.raw)))
# 將錄音/圖像/文件/視頻下載到本地,插入保存路徑。
elif msg.type in [wxpy.RECORDING, wxpy.PICTURE, wxpy.ATTACHMENT, wxpy.VIDEO]:
save_path = os.path.join(attachment_path, msg.file_name)
msg.get_file(save_path)
cursor.execute('INSERT INTO MESSAGES (msg_id, create_time, attachment_path, msg_sender, msg_type,\
msg_raw_data) values (?, ?, ?, ?, ?, ?)',
(msg.id, msg.create_time, save_path, str(msg.sender)[9:-1], msg.type, str(msg.raw)))
# 插入分享/位置鏈接
elif msg.type in [wxpy.SHARING, wxpy.MAP]:
cursor.execute('INSERT INTO MESSAGES (msg_id, msg_text, create_time, msg_sender, msg_type, msg_url,\
msg_raw_data) values (?, ?, ?, ?, ?, ?, ?)',
(msg.id, msg.text, msg.create_time, str(msg.sender)[9:-1], msg.type, str(msg.url), str(msg.raw)))
# print('insert data successfully')
finally:
conn.commit()
cursor.close()
conn.close()
# 在數(shù)據(jù)庫中檢索消息是否存在,如果存在則將被撤回的消息發(fā)送到文件傳輸助手。
def send_revoke(message):
msg_id = pattern.search(message.raw['Content']).group()
try:
conn = sqlite3.connect('wxpy.db')
cursor = conn.cursor()
cursor.execute('INSERT INTO MESSAGES (msg_id, create_time, msg_sender, msg_type, msg_raw_data)\
values (?, ?, ?, ?, ?)',
(message.id, message.create_time, str(message.sender)[9:-1], message.type, str(message.raw)))
msg_data = cursor.execute('SELECT * FROM MESSAGES WHERE msg_id=?', (msg_id, )).fetchall()
# print('take out data successfully')
finally:
conn.commit()
cursor.close()
conn.close()
if msg_data[0][7] == 'Text':
msg_info = '告訴你一個(gè)秘密 {} 在 {} 撤回了文本\n{}'.format(msg_data[0][6], msg_data[0][3], msg_data[0][2])
bot.file_helper.send(msg_info)
else:
send_revoke_nontext(msg_data)
# 非文本信息發(fā)送
def send_revoke_nontext(msg_data):
if msg_data[0][7] == 'Picture':
if msg_data[0][5][-4:] == '.gif':
# 現(xiàn)在wxpy & itchat發(fā)不了GIF了
bot.file_helper('很抱歉,暫時(shí)不支持表情(gif)的撤回重發(fā)。')
else:
msg_info = '告訴你一個(gè)秘密 {} 在 {} 撤回了圖像'.format(msg_data[0][6], msg_data[0][3])
bot.file_helper.send(msg_info)
bot.file_helper.send_image(msg_data[0][5])
elif msg_data[0][7] == 'Recording':
msg_info = '告訴你一個(gè)秘密 {} 在 {} 撤回了語音'.format(msg_data[0][6], msg_data[0][3])
bot.file_helper.send(msg_info)
bot.file_helper.send_file(msg_data[0][5])
elif msg_data[0][7] == 'Attachment':
msg_info = '告訴你一個(gè)秘密 {} 在 {} 撤回了文件'.format(msg_data[0][6], msg_data[0][3])
bot.file_helper.send(msg_info)
bot.file_helper.send_file(msg_data[0][5])
elif msg_data[0][7] == 'Video':
msg_info = '告訴你一個(gè)秘密 {} 在 {} 撤回了視頻'.format(msg_data[0][6], msg_data[0][3])
bot.file_helper.send(msg_info)
bot.file_helper.send_video(msg_data[0][5])
elif msg_data[0][7] == 'Sharing':
msg_info = '告訴你一個(gè)秘密 {} 在 {} 撤回了分享\n{}\n{}'.format(msg_data[0][6], msg_data[0][3], msg_data[0][2],\
msg_data[0][8])
bot.file_helper.send(msg_info)
elif msg_data[0][7] == 'Map':
msg_info = '告訴你一個(gè)秘密 {} 在 {} 撤回了位置\n{}\n{}'.format(msg_data[0][6], msg_data[0][3], msg_data[0][2],\
msg_data[0][8])
bot.file_helper.send(msg_info)
wxpy.embed()
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python如何通過ARIMA模型進(jìn)行時(shí)間序列分析預(yù)測
這篇文章主要介紹了Python如何通過ARIMA模型進(jìn)行時(shí)間序列分析預(yù)測問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
Python用20行代碼實(shí)現(xiàn)完整郵件功能
這篇文章主要介紹了如何使用Python實(shí)現(xiàn)完整郵件功能的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容,希望能幫助到您2021-09-09
Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化
這篇文章主要介紹了Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化,Matplotlib?是?Python?中常用的?2D?繪圖庫,它能輕松地將數(shù)據(jù)進(jìn)行可視化,作出精美的圖表2022-08-08
django實(shí)現(xiàn)更改數(shù)據(jù)庫某個(gè)字段以及字段段內(nèi)數(shù)據(jù)
這篇文章主要介紹了django實(shí)現(xiàn)更改數(shù)據(jù)庫某個(gè)字段以及字段段內(nèi)數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
CentOS 6.5下安裝Python 3.5.2(與Python2并存)
這篇文章主要給大家介紹了在CentOS 6.5下安裝Python 3.5.2的方法教程,安裝后的python3與Python2并存,文中分享了詳細(xì)的方法步驟,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,下面來一起看看吧。2017-06-06
Python正則表達(dá)式匹配日期與時(shí)間的方法
這篇文章主要介紹了Python正則表達(dá)式匹配日期與時(shí)間的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的完整代碼(面向?qū)ο?
這篇文章主要介紹了Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的完整代碼(面向?qū)ο?,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04

