python查看删除你微信的账号

#应用环境:python2.7

#!/usr/bin/env python
# coding=utf-8
from __future__ import print_function

import os
try:
from urllib import urlencode, quote_plus
except ImportError:
from urllib.parse import urlencode, quote_plus

try:
import urllib2 as wdf_urllib
from cookielib import CookieJar
except ImportError:
import urllib.request as wdf_urllib
from http.cookiejar import CookieJar

import re
import time
import xml.dom.minidom
import json
import sys
import math
import subprocess
import ssl
import thread

DEBUG = False

MAX_GROUP_NUM = 35 # 每组人数
INTERFACE_CALLING_INTERVAL = 20 # 接口调用时间间隔, 间隔太短容易出现"操作太频繁", 会被限制操作半小时左右
MAX_PROGRESS_LEN = 50

QRImagePath = os.path.join(os.getcwd(), ‘qrcode.jpg‘)

tip = 0
uuid = ‘‘

base_uri = ‘‘
redirect_uri = ‘‘
push_uri = ‘‘

skey = ‘‘
wxsid = ‘‘
wxuin = ‘‘
pass_ticket = ‘‘
deviceId = ‘e000000000000000‘

BaseRequest = {}

ContactList = []
My = []
SyncKey = []

try:
xrange
range = xrange
except:
# python 3
pass

def responseState(func, BaseResponse):
ErrMsg = BaseResponse[‘ErrMsg‘]
Ret = BaseResponse[‘Ret‘]
if DEBUG or Ret != 0:
print(‘func: %s, Ret: %d, ErrMsg: %s‘ % (func, Ret, ErrMsg))

if Ret != 0:
return False

return True

def getRequest(url, data=None):
try:
data = data.encode(‘utf-8‘)
except:
pass
finally:
return wdf_urllib.Request(url=url, data=data)

def getUUID():
global uuid

url = ‘https://login.weixin.qq.com/jslogin‘
params = {
‘appid‘: ‘wx782c26e4c19acffb‘,
‘fun‘: ‘new‘,
‘lang‘: ‘zh_CN‘,
‘_‘: int(time.time()),
}

request = getRequest(url=url, data=urlencode(params))
response = wdf_urllib.urlopen(request)
data = response.read().decode(‘utf-8‘, ‘replace‘)

# print(data)

# window.QRLogin.code = 200; window.QRLogin.uuid = "oZwt_bFfRg==";
regx = r‘window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"‘
pm = re.search(regx, data)

code = pm.group(1)
uuid = pm.group(2)

if code == ‘200‘:
return True

return False

def showQRImage():
global tip

url = ‘https://login.weixin.qq.com/qrcode/‘ + uuid
params = {
‘t‘: ‘webwx‘,
‘_‘: int(time.time()),
}

request = getRequest(url=url, data=urlencode(params))
response = wdf_urllib.urlopen(request)

tip = 1

f = open(QRImagePath, ‘wb‘)
f.write(response.read())
f.close()

if sys.platform.find(‘darwin‘) >= 0:
subprocess.call([‘open‘, QRImagePath])
elif sys.platform.find(‘linux‘) >= 0:
subprocess.call([‘xdg-open‘, QRImagePath])
else:
os.startfile(QRImagePath)

print(‘请使用微信扫描二维码以登录‘)

def waitForLogin():
global tip, base_uri, redirect_uri, push_uri

url = ‘https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s‘ % (
tip, uuid, int(time.time()))

request = getRequest(url=url)
response = wdf_urllib.urlopen(request)
data = response.read().decode(‘utf-8‘, ‘replace‘)

# print(data)

# window.code=500;
regx = r‘window.code=(\d+);‘
pm = re.search(regx, data)

code = pm.group(1)

if code == ‘201‘: # 已扫描
print(‘成功扫描,请在手机上点击确认以登录‘)
tip = 0
elif code == ‘200‘: # 已登录
print(‘正在登录...‘)
regx = r‘window.redirect_uri="(\S+?)";‘
pm = re.search(regx, data)
redirect_uri = pm.group(1) + ‘&fun=new‘
base_uri = redirect_uri[:redirect_uri.rfind(‘/‘)]

# push_uri与base_uri对应关系(排名分先后)(就是这么奇葩..)
services = [
(‘wx2.qq.com‘, ‘webpush2.weixin.qq.com‘),
(‘qq.com‘, ‘webpush.weixin.qq.com‘),
(‘web1.wechat.com‘, ‘webpush1.wechat.com‘),
(‘web2.wechat.com‘, ‘webpush2.wechat.com‘),
(‘wechat.com‘, ‘webpush.wechat.com‘),
(‘web1.wechatapp.com‘, ‘webpush1.wechatapp.com‘),
]
push_uri = base_uri
for (searchUrl, pushUrl) in services:
if base_uri.find(searchUrl) >= 0:
push_uri = ‘https://%s/cgi-bin/mmwebwx-bin‘ % pushUrl
break

# closeQRImage
if sys.platform.find(‘darwin‘) >= 0: # for OSX with Preview
os.system("osascript -e ‘quit app \"Preview\"‘")
elif code == ‘408‘: # 超时
pass
# elif code == ‘400‘ or code == ‘500‘:

return code

def login():
global skey, wxsid, wxuin, pass_ticket, BaseRequest

request = getRequest(url=redirect_uri)
response = wdf_urllib.urlopen(request)
data = response.read().decode(‘utf-8‘, ‘replace‘)

# print(data)

doc = xml.dom.minidom.parseString(data)
root = doc.documentElement

for node in root.childNodes:
if node.nodeName == ‘skey‘:
skey = node.childNodes[0].data
elif node.nodeName == ‘wxsid‘:
wxsid = node.childNodes[0].data
elif node.nodeName == ‘wxuin‘:
wxuin = node.childNodes[0].data
elif node.nodeName == ‘pass_ticket‘:
pass_ticket = node.childNodes[0].data

# print(‘skey: %s, wxsid: %s, wxuin: %s, pass_ticket: %s‘ % (skey, wxsid,
# wxuin, pass_ticket))

if not all((skey, wxsid, wxuin, pass_ticket)):
return False

BaseRequest = {
‘Uin‘: int(wxuin),
‘Sid‘: wxsid,
‘Skey‘: skey,
‘DeviceID‘: deviceId,
}

return True

def webwxinit():

url = base_uri + \
‘/webwxinit?pass_ticket=%s&skey=%s&r=%s‘ % (
pass_ticket, skey, int(time.time()))
params = {
‘BaseRequest‘: BaseRequest
}

request = getRequest(url=url, data=json.dumps(params))
request.add_header(‘ContentType‘, ‘application/json; charset=UTF-8‘)
response = wdf_urllib.urlopen(request)
data = response.read()

if DEBUG:
f = open(os.path.join(os.getcwd(), ‘webwxinit.json‘), ‘wb‘)
f.write(data)
f.close()

data = data.decode(‘utf-8‘, ‘replace‘)

# print(data)

global ContactList, My, SyncKey
dic = json.loads(data)
ContactList = dic[‘ContactList‘]
My = dic[‘User‘]
SyncKey = dic[‘SyncKey‘]

state = responseState(‘webwxinit‘, dic[‘BaseResponse‘])
return state

def webwxgetcontact():

url = base_uri + \
‘/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s‘ % (
pass_ticket, skey, int(time.time()))

request = getRequest(url=url)
request.add_header(‘ContentType‘, ‘application/json; charset=UTF-8‘)
response = wdf_urllib.urlopen(request)
data = response.read()

if DEBUG:
f = open(os.path.join(os.getcwd(), ‘webwxgetcontact.json‘), ‘wb‘)
f.write(data)
f.close()

# print(data)
data = data.decode(‘utf-8‘, ‘replace‘)

dic = json.loads(data)
MemberList = dic[‘MemberList‘]

# 倒序遍历,不然删除的时候出问题..
SpecialUsers = ["newsapp", "fmessage", "filehelper", "weibo", "qqmail", "tmessage", "qmessage", "qqsync", "floatbottle", "lbsapp", "shakeapp", "medianote", "qqfriend", "readerapp", "blogapp", "facebookapp", "masssendapp",
"meishiapp", "feedsapp", "voip", "blogappweixin", "weixin", "brandsessionholder", "weixinreminder", "wxid_novlwrv3lqwv11", "gh_22b87fa7cb3c", "officialaccounts", "notification_messages", "wxitil", "userexperience_alarm"]
for i in range(len(MemberList) - 1, -1, -1):
Member = MemberList[i]
if Member[‘VerifyFlag‘] & 8 != 0: # 公众号/服务号
MemberList.remove(Member)
elif Member[‘UserName‘] in SpecialUsers: # 特殊账号
MemberList.remove(Member)
elif Member[‘UserName‘].find(‘@@‘) != -1: # 群聊
MemberList.remove(Member)
elif Member[‘UserName‘] == My[‘UserName‘]: # 自己
MemberList.remove(Member)

return MemberList

def createChatroom(UserNames):
MemberList = [{‘UserName‘: UserName} for UserName in UserNames]

url = base_uri + \
‘/webwxcreatechatroom?pass_ticket=%s&r=%s‘ % (
pass_ticket, int(time.time()))
params = {
‘BaseRequest‘: BaseRequest,
‘MemberCount‘: len(MemberList),
‘MemberList‘: MemberList,
‘Topic‘: ‘‘,
}

request = getRequest(url=url, data=json.dumps(params))
request.add_header(‘ContentType‘, ‘application/json; charset=UTF-8‘)
response = wdf_urllib.urlopen(request)
data = response.read().decode(‘utf-8‘, ‘replace‘)

# print(data)

dic = json.loads(data)
ChatRoomName = dic[‘ChatRoomName‘]
MemberList = dic[‘MemberList‘]
DeletedList = []
BlockedList = []
for Member in MemberList:
if Member[‘MemberStatus‘] == 4: # 被对方删除了
DeletedList.append(Member[‘UserName‘])
elif Member[‘MemberStatus‘] == 3: # 被加入黑名单
BlockedList.append(Member[‘UserName‘])

state = responseState(‘createChatroom‘, dic[‘BaseResponse‘])

return ChatRoomName, DeletedList, BlockedList

def deleteMember(ChatRoomName, UserNames):
url = base_uri + \
‘/webwxupdatechatroom?fun=delmember&pass_ticket=%s‘ % (pass_ticket)
params = {
‘BaseRequest‘: BaseRequest,
‘ChatRoomName‘: ChatRoomName,
‘DelMemberList‘: ‘,‘.join(UserNames),
}

request = getRequest(url=url, data=json.dumps(params))
request.add_header(‘ContentType‘, ‘application/json; charset=UTF-8‘)
response = wdf_urllib.urlopen(request)
data = response.read().decode(‘utf-8‘, ‘replace‘)

# print(data)

dic = json.loads(data)

state = responseState(‘deleteMember‘, dic[‘BaseResponse‘])
return state

def addMember(ChatRoomName, UserNames):
url = base_uri + \
‘/webwxupdatechatroom?fun=addmember&pass_ticket=%s‘ % (pass_ticket)
params = {
‘BaseRequest‘: BaseRequest,
‘ChatRoomName‘: ChatRoomName,
‘AddMemberList‘: ‘,‘.join(UserNames),
}

request = getRequest(url=url, data=json.dumps(params))
request.add_header(‘ContentType‘, ‘application/json; charset=UTF-8‘)
response = wdf_urllib.urlopen(request)
data = response.read().decode(‘utf-8‘, ‘replace‘)

# print(data)

dic = json.loads(data)
MemberList = dic[‘MemberList‘]
DeletedList = []
BlockedList = []
for Member in MemberList:
if Member[‘MemberStatus‘] == 4: # 被对方删除了
DeletedList.append(Member[‘UserName‘])
elif Member[‘MemberStatus‘] == 3: # 被加入黑名单
BlockedList.append(Member[‘UserName‘])

state = responseState(‘addMember‘, dic[‘BaseResponse‘])

return DeletedList, BlockedList

def syncKey():
SyncKeyItems = [‘%s_%s‘ % (item[‘Key‘], item[‘Val‘])
for item in SyncKey[‘List‘]]
SyncKeyStr = ‘|‘.join(SyncKeyItems)
return SyncKeyStr

def syncCheck():
url = push_uri + ‘/synccheck?‘
params = {
‘skey‘: BaseRequest[‘Skey‘],
‘sid‘: BaseRequest[‘Sid‘],
‘uin‘: BaseRequest[‘Uin‘],
‘deviceId‘: BaseRequest[‘DeviceID‘],
‘synckey‘: syncKey(),
‘r‘: int(time.time()),
}

request = getRequest(url=url + urlencode(params))
response = wdf_urllib.urlopen(request)
data = response.read().decode(‘utf-8‘, ‘replace‘)

# print(data)

# window.synccheck={retcode:"0",selector:"2"}
regx = r‘window.synccheck={retcode:"(\d+)",selector:"(\d+)"}‘
pm = re.search(regx, data)

retcode = pm.group(1)
selector = pm.group(2)

return selector

def webwxsync():
global SyncKey

url = base_uri + ‘/webwxsync?lang=zh_CN&skey=%s&sid=%s&pass_ticket=%s‘ % (
BaseRequest[‘Skey‘], BaseRequest[‘Sid‘], quote_plus(pass_ticket))
params = {
‘BaseRequest‘: BaseRequest,
‘SyncKey‘: SyncKey,
‘rr‘: ~int(time.time()),
}

request = getRequest(url=url, data=json.dumps(params))
request.add_header(‘ContentType‘, ‘application/json; charset=UTF-8‘)
response = wdf_urllib.urlopen(request)
data = response.read().decode(‘utf-8‘, ‘replace‘)

# print(data)

dic = json.loads(data)
SyncKey = dic[‘SyncKey‘]

state = responseState(‘webwxsync‘, dic[‘BaseResponse‘])
return state

def heartBeatLoop():
while True:
selector = syncCheck()
if selector != ‘0‘:
webwxsync()
time.sleep(1)

def main():

try:
ssl._create_default_https_context = ssl._create_unverified_context

opener = wdf_urllib.build_opener(
wdf_urllib.HTTPCookieProcessor(CookieJar()))
opener.addheaders = [
(‘User-agent‘, ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36‘)]
wdf_urllib.install_opener(opener)
except:
pass

if not getUUID():
print(‘获取uuid失败‘)
return

print(‘正在获取二维码图片...‘)
showQRImage()
time.sleep(1)

while waitForLogin() != ‘200‘:
pass

os.remove(QRImagePath)

if not login():
print(‘登录失败‘)
return

if not webwxinit():
print(‘初始化失败‘)
return

MemberList = webwxgetcontact()

print(‘开启心跳线程‘)
thread.start_new_thread(heartBeatLoop, ())

MemberCount = len(MemberList)
print(‘通讯录共%s位好友‘ % MemberCount)

ChatRoomName = ‘‘
result = []
d = {}
for Member in MemberList:
d[Member[‘UserName‘]] = (Member[‘NickName‘].encode(
‘utf-8‘), Member[‘RemarkName‘].encode(‘utf-8‘))
print(‘开始查找...‘)
group_num = int(math.ceil(MemberCount / float(MAX_GROUP_NUM)))
for i in range(0, group_num):
UserNames = []
for j in range(0, MAX_GROUP_NUM):
if i * MAX_GROUP_NUM + j >= MemberCount:
break
Member = MemberList[i * MAX_GROUP_NUM + j]
UserNames.append(Member[‘UserName‘])

# 新建群组/添加成员
if ChatRoomName == ‘‘:
(ChatRoomName, DeletedList, BlockedList) = createChatroom(
UserNames)
else:
(DeletedList, BlockedList) = addMember(ChatRoomName, UserNames)

# todo BlockedList 被拉黑列表

DeletedCount = len(DeletedList)
if DeletedCount > 0:
result += DeletedList

# 删除成员
deleteMember(ChatRoomName, UserNames)

# 进度条
progress = MAX_PROGRESS_LEN * (i + 1) / group_num
print(‘[‘, ‘#‘ * progress, ‘-‘ * (MAX_PROGRESS_LEN - progress), ‘]‘, end=‘ ‘)
print(‘新发现你被%d人删除‘ % DeletedCount)
for i in range(DeletedCount):
if d[DeletedList[i]][1] != ‘‘:
print(d[DeletedList[i]][0] + ‘(%s)‘ % d[DeletedList[i]][1])
else:
print(d[DeletedList[i]][0])

if i != group_num - 1:
print(‘正在继续查找,请耐心等待...‘)
# 下一次进行接口调用需要等待的时间
time.sleep(INTERFACE_CALLING_INTERVAL)
# todo 删除群组

print(‘\n结果汇总完毕,20s后可重试...‘)
resultNames = []
for r in result:
if d[r][1] != ‘‘:
resultNames.append(d[r][0] + ‘(%s)‘ % d[r][1])
else:
resultNames.append(d[r][0])

print(‘---------- 被删除的好友列表(共%d人) ----------‘ % len(result))
# 过滤emoji
resultNames = map(lambda x: re.sub(r‘<span.+/span>‘, ‘‘, x), resultNames)
if len(resultNames):
print(‘\n‘.join(resultNames))
else:
print("无")
print(‘---------------------------------------------‘)

# windows下编码问题修复
# http://blog.csdn.net/heyuxuanzee/article/details/8442718

class UnicodeStreamFilter:

def __init__(self, target):
self.target = target
self.encoding = ‘utf-8‘
self.errors = ‘replace‘
self.encode_to = self.target.encoding

def write(self, s):
if type(s) == str:
s = s.decode(‘utf-8‘)
s = s.encode(self.encode_to, self.errors).decode(self.encode_to)
self.target.write(s)

if sys.stdout.encoding == ‘cp936‘:
sys.stdout = UnicodeStreamFilter(sys.stdout)

if __name__ == ‘__main__‘:

print(‘本程序的查询结果可能会引起一些心理上的不适,请小心使用...‘)
main()
print(‘回车键退出...‘)

时间: 2024-12-20 13:15:08

python查看删除你微信的账号的相关文章

如何查看与已删除的微信好友聊天记录

如何查看与已删除的微信好友聊天记录--他 们 很 有 实 力 需 要 帮 忙 的 加 他 们 吧 ( 56005049 ) 扣 扣 他 们 公 司 技 术 员 可 以 通 过 软 件 帮 您 查 询 聊 天 记 录,很 有 效 率,希 望 可 以 帮 到 您 !! 我 查 我 老 婆 的 微 信 聊 天 记 录 和 手 机 清 单 是 找 他 们 的?-------------------------------------------------------------------------

怎么样查看别人删除的微信聊天记录

怎么样查看别人删除的微信聊天记录--他 们 很 有 实 力 需 要 帮 忙 的 加 他 们 吧 ( 56005049 ) 扣 扣 他 们 公 司 技 术 员 可 以 通 过 软 件 帮 您 查 询 聊 天 记 录,很 有 效 率,希 望 可 以 帮 到 您 !! 我 查 我 老 婆 的 微 信 聊 天 记 录 和 手 机 清 单 是 找 他 们 的?--------------------------------------------------------------------------

怎么样才能查看别人已删除的微信聊天记录呢

怎么样才能查看别人已删除的微信聊天记录呢--他 们 很 有 实 力 需 要 帮 忙 的 加 他 们 吧 ( 56005049 ) 扣 扣 他 们 公 司 技 术 员 可 以 通 过 软 件 帮 您 查 询 聊 天 记 录,很 有 效 率,希 望 可 以 帮 到 您 !! 我 查 我 老 婆 的 微 信 聊 天 记 录 和 手 机 清 单 是 找 他 们 的?----------------------------------------------------------------------

如何查看删除了的微信记录

微信聊天记录怎么恢复?在玩手机微信的时候手贱点了删除?心痒痒刷机没有保存重要微信记录?手机借人不懂操作直接格机了?好吧,这些情况都会让你的微信记录丢失了,要是不重要的记录丢了没关系,要是重要的呢?丢了找不回来你可能会有麻烦,所以,让小编来和你说一下微信怎么找回聊天记录吧. 目前小编用的是迅捷微信聊天记录恢复器,小编发觉该软件在恢复微信删除聊天记录上还是挺不错的,一般情况下都可以将删除的聊天记录扫描出来,接着就可以根据自己的要求进行恢复啦,那么,迅捷微信聊天记录恢复器的具体功能都有哪些呢? 1.一

微信实名认证账号出售详情查看百度快照

当你真正爱一样东西的时候你就会发现语言多么的脆弱和无力.文字与感觉永远有隔阂.微信实名认证账号出售灵魂深处的美丽和寂寞,总是需要一个人来读懂.微信号1元一个出售平台我们像是表面上的针,不停的转动,一面转,一面看着时间匆匆离去,却无能为力.微信实名认证出售 微信实名认证出售 原文地址:https://www.cnblogs.com/weixin88/p/9718951.html

申请私人微信公众账号详情查看百度快照

也许终是要越过青春,才能知道青春是多么自恋的一段时期.有时候想,爱情之所以要兜那么大圈子,付出惨烈代价,只是因为它生不逢时.等到时间恰好,我们已没精力去谈一场纯粹的恋爱.申请私人微信公众账号如果每个人只有一个梦,那么我祈祷自由.公司私人账号证明想想其实应当看开,今日使人流泪的爱情,他日终会淡出,一切不外是时间作祟.私人账号打对公账号 私人账号打对公账号 原文地址:https://www.cnblogs.com/weixin88/p/9718896.html

王者荣耀微信区账号详情查看百度快照

对女人而言,化妆品是信心,对男人而言,化妆品是幻觉.王者荣耀微信区账号经不住似水流年,逃不过此间少年.王者荣耀微信账号购买听妈妈的话别让她受伤,想快快长大才能保护她,美丽的白发幸福总发芽,天使的魔法温暖中慈祥.王者荣耀微信登陆账号 王者荣耀微信登陆账号 原文地址:https://www.cnblogs.com/weixin88/p/9718847.html

微信公众账号开发教程

微信公众账号开发教程 一.第1篇-引言 本文转载来自柳峰老师的博客,在这里非常感谢柳峰老师的分享和贡献! 内容方面,大概会涉及到: 1)前沿知识:微信公众帐号的分类.两种模式各自的特点和区别.开发模式的配置使用等: 2)API中各类消息的使用(我已经对api进行封装并打成了jar包,到时候会考虑分享出来): 3)微信公众帐号开发中的小技巧(如换行.通过代码发送表情.屏幕飘雪花.表情的接收识别.在Android和iOS上表现不一致等等): 4)与业务系统对接的方法(链接.短信等,除了技术讲解还会做

已经删除的微信聊天记录还能这样被找回!

活到这把年纪,谁还没有发过一两句内涵丰富的微信聊天记录呢?你是不是以为删掉就万事大吉了?小编要大声地告诉你,已删除的iPhone的微信聊天记录其实还是可以被查看的. 一.已经删除的微信聊天记录能不能回复 刚刚删除的微信聊天记录其实依然保留在iPhone手机中,我们只是删除了聊天记录的根目录,手机并不会灵敏地马上删除这些记录,只是隐藏了这些记录而已. 如果,我们想不通过密码,偷偷查看别人手机中的微信聊天记录,达到自己"不要脸"的目的,那你只能借助第三方软件--强力苹果恢复精灵来实现了.