哪位大神有地狱解剖bd手机在线看百度云分享?

不知道被谁删了微信好友?用 Python 来帮忙呀! - Python - 伯乐在线
& 不知道被谁删了微信好友?用 Python 来帮忙呀!
本文根据 gaosen 的开源项目
整理而成。
还在苦恼不知道被谁删了微信好友么?这里有个 gaosen 编写的工具可帮到你:
查看被删的微信好友。原理就是新建群组,如果加不进来就是被删好友了(不要在群组里讲话,别人是看不见的)。
用的是微信网页版的接口。查询结果可能会引起一些心理上的不适,请小心使用……[逃]
gaosen 说还有些小问题:
结果好像有疏漏一小部分,原因不明..
最终会遗留下一个只有自己的群组,需要手工删一下
没试过被拉黑的情况
Mac OS 用法:启动终端
$ python wdf.py
$ python wdf.py
然后会弹出一个显示登录网页版微信的二维码窗口,用手机扫描登录。按指示做即可!
不过大家要先把源代码下载保存到 wdf.y 文件中。源码源代码:
#!/usr/bin/env python
# coding=utf-8
from __future__ import print_function
from urllib import urlencode
except ImportError:
from urllib.parse import urlencode
import urllib2 as wdf_urllib
from cookielib import CookieJar
except ImportError:
import urllib.request as wdf_urllib
from http.cookiejar import CookieJar
import time
import xml.dom.minidom
import json
import sys
import math
import subprocess
import ssl
DEBUG = False
MAX_GROUP_NUM = 35
# 每组人数
INTERFACE_CALLING_INTERVAL = 16
# 接口调用时间间隔, 值设为13时亲测出现"操作太频繁"
MAX_PROGRESS_LEN = 50
QRImagePath = os.path.join(os.getcwd(), 'qrcode.jpg')
base_uri = ''
redirect_uri = ''
wxsid = ''
wxuin = ''
pass_ticket = ''
deviceId = 'e000'
BaseRequest = {}
ContactList = []
SyncKey = ''
range = xrange
# python 3
def getRequest(url, data=None):
data = data.encode('utf-8')
return wdf_urllib.Request(url=url, data=data)
def getUUID():
global uuid
url = 'https://login./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./qrcode/' + uuid
params = {
't': 'webwx',
'_': int(time.time()),
request = getRequest(url=url, data=urlencode(params))
response = wdf_urllib.urlopen(request)
f = open(QRImagePath, 'wb')
f.write(response.read())
if sys.platform.find('darwin') &= 0:
subprocess.call(['open', QRImagePath])
elif sys.platform.find('linux') &= 0:
subprocess.call(['xdg-open', QRImagePath])
os.startfile(QRImagePath)
print('请使用微信扫描二维码以登录')
def waitForLogin():
global tip, base_uri, redirect_uri
url = 'https://login./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('成功扫描,请在手机上点击确认以登录')
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('/')]
# closeQRImage
if sys.platform.find('darwin') &= 0:
# for OSX with Preview
os.system("osascript -e 'quit app \"Preview\"'")
elif code == '408':
# 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)
&ret&0&/ret&
&message&OK&/message&
&skey&xxx&/skey&
&wxsid&xxx&/wxsid&
&wxuin&xxx&/wxuin&
&pass_ticket&xxx&/pass_ticket&
&isgrayscale&1&/isgrayscale&
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/ charset=UTF-8')
response = wdf_urllib.urlopen(request)
data = response.read()
f = open(os.path.join(os.getcwd(), 'webwxinit.json'), 'wb')
f.write(data)
data = data.decode('utf-8', 'replace')
# print(data)
global ContactList, My, SyncKey
dic = json.loads(data)
ContactList = dic['ContactList']
My = dic['User']
SyncKeyList = []
for item in dic['SyncKey']['List']:
SyncKeyList.append('%s_%s' % (item['Key'], item['Val']))
SyncKey = '|'.join(SyncKeyList)
ErrMsg = dic['BaseResponse']['ErrMsg']
print("Ret: %d, ErrMsg: %s" % (dic['BaseResponse']['Ret'], ErrMsg))
Ret = dic['BaseResponse']['Ret']
if Ret != 0:
return False
return True
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/ charset=UTF-8')
response = wdf_urllib.urlopen(request)
data = response.read()
f = open(os.path.join(os.getcwd(), 'webwxgetcontact.json'), 'wb')
f.write(data)
# 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 = []
# for UserName in UserNames:
# MemberList.append({'UserName': UserName})
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/ 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 = []
for Member in MemberList:
if Member['MemberStatus'] == 4:
# 被对方删除了
DeletedList.append(Member['UserName'])
ErrMsg = dic['BaseResponse']['ErrMsg']
print("Ret: %d, ErrMsg: %s" % (dic['BaseResponse']['Ret'], ErrMsg))
return ChatRoomName, DeletedList
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/ charset=UTF-8')
response = wdf_urllib.urlopen(request)
data = response.read().decode('utf-8', 'replace')
# print(data)
dic = json.loads(data)
ErrMsg = dic['BaseResponse']['ErrMsg']
Ret = dic['BaseResponse']['Ret']
print("Ret: %d, ErrMsg: %s" % (Ret, ErrMsg))
if Ret != 0:
return False
return True
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/ 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 = []
for Member in MemberList:
if Member['MemberStatus'] == 4:
# 被对方删除了
DeletedList.append(Member['UserName'])
ErrMsg = dic['BaseResponse']['ErrMsg']
print("Ret: %d, ErrMsg: %s" % (dic['BaseResponse']['Ret'], ErrMsg))
return DeletedList
def syncCheck():
url = base_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"}
def main():
ssl._create_default_https_context = ssl._create_unverified_context
opener = wdf_urllib.build_opener(
wdf_urllib.HTTPCookieProcessor(CookieJar()))
wdf_urllib.install_opener(opener)
if not getUUID():
print('获取uuid失败')
showQRImage()
time.sleep(1)
while waitForLogin() != '200':
os.remove(QRImagePath)
if not login():
print('登录失败')
if not webwxinit():
print('初始化失败')
MemberList = webwxgetcontact()
MemberCount = len(MemberList)
print('通讯录共%s位好友' % MemberCount)
ChatRoomName = ''
result = []
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:
Member = MemberList[i * MAX_GROUP_NUM + j]
UserNames.append(Member['UserName'])
# 新建群组/添加成员
if ChatRoomName == '':
(ChatRoomName, DeletedList) = createChatroom(UserNames)
DeletedList = addMember(ChatRoomName, UserNames)
DeletedCount = len(DeletedList)
if DeletedCount & 0:
result += DeletedList
# 删除成员
deleteMember(ChatRoomName, UserNames)
progress_len = MAX_PROGRESS_LEN
progress = '-' * progress_len
progress_str = '%s' % ''.join(
map(lambda x: '#', progress[:(progress_len * (i + 1)) / group_num]))
print(''.join(
['[', progress_str, ''.join('-' * (progress_len - len(progress_str))), ']']))
print('新发现你被%d人删除' % DeletedCount)
for i in range(DeletedCount):
if d[DeletedList[i]][1] != '':
print(d[DeletedList[i]][0] + '(%s)' % d[DeletedList[i]][1])
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])
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))
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('本程序的查询结果可能会引起一些心理上的不适,请小心使用...')
print('开始')
print('结束')
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
#!/usr/bin/env python# coding=utf-8from __future__ import print_function&import ostry:&&&&from urllib import urlencodeexcept ImportError:&&&&from urllib.parse import urlencode&try:&&&&import urllib2 as wdf_urllib&&&&from cookielib import CookieJarexcept ImportError:&&&&import urllib.request as wdf_urllib&&&&from http.cookiejar import CookieJar&import reimport timeimport xml.dom.minidomimport jsonimport sysimport mathimport subprocessimport ssl&DEBUG = False&MAX_GROUP_NUM = 35&&# 每组人数INTERFACE_CALLING_INTERVAL = 16&&# 接口调用时间间隔, 值设为13时亲测出现"操作太频繁"MAX_PROGRESS_LEN = 50&QRImagePath = os.path.join(os.getcwd(), 'qrcode.jpg')&tip = 0uuid = ''&base_uri = ''redirect_uri = ''&skey = ''wxsid = ''wxuin = ''pass_ticket = ''deviceId = 'e000'&BaseRequest = {}&ContactList = []My = []SyncKey = ''&try:&&&&xrange&&&&range = xrangeexcept:&&&&# python 3&&&&pass&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./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./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&&&&&url = 'https://login./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('/')]&&&&&&&&&# 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)&&&&&'''&&&&&&&&&error&&&&&&&&&&&&&&ret&0&/ret&&&&&&&&&&&&&&message&OK&/message&&&&&&&&&&&&&&skey&xxx&/skey&&&&&&&&&&&&&&wxsid&xxx&/wxsid&&&&&&&&&&&&&&wxuin&xxx&/wxuin&&&&&&&&&&&&&&pass_ticket&xxx&/pass_ticket&&&&&&&&&&&&&&isgrayscale&1&/isgrayscale&&&&&&&&&&/error&&&&&'''&&&&&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/ 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']&&&&&SyncKeyList = []&&&&for item in dic['SyncKey']['List']:&&&&&&&&SyncKeyList.append('%s_%s' % (item['Key'], item['Val']))&&&&SyncKey = '|'.join(SyncKeyList)&&&&&ErrMsg = dic['BaseResponse']['ErrMsg']&&&&if DEBUG:&&&&&&&&print("Ret: %d, ErrMsg: %s" % (dic['BaseResponse']['Ret'], ErrMsg))&&&&&Ret = dic['BaseResponse']['Ret']&&&&if Ret != 0:&&&&&&&&return False&&&&&return True&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/ 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 = []&&&&# for UserName in UserNames:&&&&&&&&# MemberList.append({'UserName': UserName})&&&&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/ 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 = []&&&&for Member in MemberList:&&&&&&&&if Member['MemberStatus'] == 4:&&# 被对方删除了&&&&&&&&&&&&DeletedList.append(Member['UserName'])&&&&&ErrMsg = dic['BaseResponse']['ErrMsg']&&&&if DEBUG:&&&&&&&&print("Ret: %d, ErrMsg: %s" % (dic['BaseResponse']['Ret'], ErrMsg))&&&&&return ChatRoomName, DeletedList&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/ charset=UTF-8')&&&&response = wdf_urllib.urlopen(request)&&&&data = response.read().decode('utf-8', 'replace')&&&&&# print(data)&&&&&dic = json.loads(data)&&&&ErrMsg = dic['BaseResponse']['ErrMsg']&&&&Ret = dic['BaseResponse']['Ret']&&&&if DEBUG:&&&&&&&&print("Ret: %d, ErrMsg: %s" % (Ret, ErrMsg))&&&&&if Ret != 0:&&&&&&&&return False&&&&&return True&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/ 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 = []&&&&for Member in MemberList:&&&&&&&&if Member['MemberStatus'] == 4:&&# 被对方删除了&&&&&&&&&&&&DeletedList.append(Member['UserName'])&&&&&ErrMsg = dic['BaseResponse']['ErrMsg']&&&&if DEBUG:&&&&&&&&print("Ret: %d, ErrMsg: %s" % (dic['BaseResponse']['Ret'], ErrMsg))&&&&&return DeletedList&def syncCheck():&&&&url = base_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"}&def main():&&&&&try:&&&&&&&&ssl._create_default_https_context = ssl._create_unverified_context&&&&&&&&&opener = wdf_urllib.build_opener(&&&&&&&&&&&&wdf_urllib.HTTPCookieProcessor(CookieJar()))&&&&&&&&wdf_urllib.install_opener(opener)&&&&except:&&&&&&&&pass&&&&&if not getUUID():&&&&&&&&print('获取uuid失败')&&&&&&&&return&&&&&showQRImage()&&&&time.sleep(1)&&&&&while waitForLogin() != '200':&&&&&&&&pass&&&&&os.remove(QRImagePath)&&&&&if not login():&&&&&&&&print('登录失败')&&&&&&&&return&&&&&if not webwxinit():&&&&&&&&print('初始化失败')&&&&&&&&return&&&&&MemberList = webwxgetcontact()&&&&&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) = createChatroom(UserNames)&&&&&&&&else:&&&&&&&&&&&&DeletedList = addMember(ChatRoomName, UserNames)&&&&&&&&&DeletedCount = len(DeletedList)&&&&&&&&if DeletedCount & 0:&&&&&&&&&&&&result += DeletedList&&&&&&&&&# 删除成员&&&&&&&&deleteMember(ChatRoomName, UserNames)&&&&&&&&&# 进度条&&&&&&&&progress_len = MAX_PROGRESS_LEN&&&&&&&&progress = '-' * progress_len&&&&&&&&progress_str = '%s' % ''.join(&&&&&&&&&&&&map(lambda x: '#', progress[:(progress_len * (i + 1)) / group_num]))&&&&&&&&print(''.join(&&&&&&&&&&&&['[', progress_str, ''.join('-' * (progress_len - len(progress_str))), ']']))&&&&&&&&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('本程序的查询结果可能会引起一些心理上的不适,请小心使用...')&&&&print('开始')&&&&main()&&&&print('结束')
可能感兴趣的话题
这些深层次的东西都是怎么弄到的,俗话说国内都是山寨别人的!
o 224 回复
关于 Python 频道
Python频道分享 Python 开发技术、相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线

我要回帖

更多关于 地狱解剖bd手机在线看 的文章

 

随机推荐