這篇文章主要介紹了微信 ?用腳本查看是否被微信好友刪除的相關(guān)資料,需要的朋友可以參考下
某日,一同學(xué)給小的發(fā)了 Github 源碼,說是可以輕松查到刪除自己的微信好友,于是就開始了作死之路。
Github 源碼請(qǐng)看:0x5e/wechat-deleted-friends
前言
相信各位一定有收到過這樣的群發(fā)短信,據(jù)說還被歸類為玩轉(zhuǎn)微信的五大技巧之一╮(╯▽╰)╭但,其實(shí),只要跑一下腳本,就輕松找出刪除自己的好友(輕松摔碎玻璃心,逃
GitHub:開源怪我咯?
原理
新建群組,如果加不進(jìn)來就是被刪好友了(不要在群組里講話,別人是看不見的)。
用的是微信網(wǎng)頁版的接口,還有些小問題,不過現(xiàn)在結(jié)果好像有疏漏一小部分,原因不明……也沒試過被拉黑的情況。最終會(huì)遺留下一個(gè)只有自己的群組,需要手工刪一下。
方法
下載 python 腳本,跑一下。啟動(dòng) Terminal,切到文件目錄下:
python wdf.py
代碼如下
#!/usr/bin/env python # coding=utf-8 import os import urllib, urllib2 import re import cookielib import time import xml.dom.minidom import json import sys import math DEBUG = False MAX_GROUP_NUM = 35 # 每組人數(shù) QRImagePath = os.getcwd() + '/qrcode.jpg' tip = 0 uuid = '' base_uri = '' redirect_uri = '' skey = '' wxsid = '' wxuin = '' pass_ticket = '' deviceId = 'e000000000000000' BaseRequest = {} ContactList = [] My = [] def getUUID(): global uuid url = 'https://login.weixin.qq.com/jslogin' params = { 'appid': 'wx782c26e4c19acffb', 'fun': 'new', 'lang': 'zh_CN', '_': int(time.time()), } request = urllib2.Request(url = url, data = urllib.urlencode(params)) response = urllib2.urlopen(request) data = response.read() # 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 = urllib2.Request(url = url, data = urllib.urlencode(params)) response = urllib2.urlopen(request) tip = 1 f = open(QRImagePath, 'wb') f.write(response.read()) f.close() if sys.platform.find('darwin') >= 0: os.system('open %s' % QRImagePath) elif sys.platform.find('linux') >= 0: os.system('xdg-open %s' % QRImagePath) else: os.system('call %s' % QRImagePath) print '請(qǐng)使用微信掃描二維碼以登錄' def waitForLogin(): global tip, base_uri, redirect_uri url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s' % (tip, uuid, int(time.time())) request = urllib2.Request(url = url) response = urllib2.urlopen(request) data = response.read() # print data # window.code=500; regx = r'window.code=(\d+);' pm = re.search(regx, data) code = pm.group(1) if code == '201': #已掃描 print '成功掃描,請(qǐng)?jiān)谑謾C(jī)上點(diǎn)擊確認(rèn)以登錄' 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('/')] elif code == '408': #超時(shí) pass # elif code == '400' or code == '500': return code def login(): global skey, wxsid, wxuin, pass_ticket, BaseRequest request = urllib2.Request(url = redirect_uri) response = urllib2.urlopen(request) data = response.read() # 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 skey == '' or wxsid == '' or wxuin == '' or 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 = urllib2.Request(url = url, data = json.dumps(params)) request.add_header('ContentType', 'application/json; charset=UTF-8') response = urllib2.urlopen(request) data = response.read() if DEBUG == True: f = open(os.getcwd() + '/webwxinit.json', 'wb') f.write(data) f.close() # print data global ContactList, My dic = json.loads(data) ContactList = dic['ContactList'] My = dic['User'] ErrMsg = dic['BaseResponse']['ErrMsg'] if len(ErrMsg) > 0: print 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 = urllib2.Request(url = url) request.add_header('ContentType', 'application/json; charset=UTF-8') response = urllib2.urlopen(request) data = response.read() if DEBUG == True: f = open(os.getcwd() + '/webwxgetcontact.json', 'wb') f.write(data) f.close() # print data dic = json.loads(data) MemberList = dic['MemberList'] # 倒序遍歷,不然刪除的時(shí)候出問題.. SpecialUsers = ['newsapp', 'fmessage', 'filehelper', 'weibo', 'qqmail', 'fmessage', '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', 'wxid_novlwrv3lqwv11', 'gh_22b87fa7cb3c', 'wxitil', 'userexperience_alarm', 'notification_messages'] for i in xrange(len(MemberList) - 1, -1, -1): Member = MemberList[i] if Member['VerifyFlag'] & 8 != 0: # 公眾號(hào)/服務(wù)號(hào) MemberList.remove(Member) elif Member['UserName'] in SpecialUsers: # 特殊賬號(hào) 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}) url = base_uri + '/webwxcreatechatroom?pass_ticket=%s&r=%s' % (pass_ticket, int(time.time())) params = { 'BaseRequest': BaseRequest, 'MemberCount': len(MemberList), 'MemberList': MemberList, 'Topic': '', } request = urllib2.Request(url = url, data = json.dumps(params)) request.add_header('ContentType', 'application/json; charset=UTF-8') response = urllib2.urlopen(request) data = response.read() # print data dic = json.loads(data) ChatRoomName = dic['ChatRoomName'] MemberList = dic['MemberList'] DeletedList = [] for Member in MemberList: if Member['MemberStatus'] == 4: #被對(duì)方刪除了 DeletedList.append(Member['UserName']) ErrMsg = dic['BaseResponse']['ErrMsg'] if len(ErrMsg) > 0: print 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 = urllib2.Request(url = url, data = json.dumps(params)) request.add_header('ContentType', 'application/json; charset=UTF-8') response = urllib2.urlopen(request) data = response.read() # print data dic = json.loads(data) ErrMsg = dic['BaseResponse']['ErrMsg'] if len(ErrMsg) > 0: print ErrMsg Ret = dic['BaseResponse']['Ret'] 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 = urllib2.Request(url = url, data = json.dumps(params)) request.add_header('ContentType', 'application/json; charset=UTF-8') response = urllib2.urlopen(request) data = response.read() # print data dic = json.loads(data) MemberList = dic['MemberList'] DeletedList = [] for Member in MemberList: if Member['MemberStatus'] == 4: #被對(duì)方刪除了 DeletedList.append(Member['UserName']) ErrMsg = dic['BaseResponse']['ErrMsg'] if len(ErrMsg) > 0: print ErrMsg return DeletedList def main(): opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) urllib2.install_opener(opener) if getUUID() == False: print '獲取uuid失敗' return showQRImage() time.sleep(1) while waitForLogin() != '200': pass os.remove(QRImagePath) if login() == False: print '登錄失敗' return if webwxinit() == False: print '初始化失敗' return MemberList = webwxgetcontact() MemberCount = len(MemberList) print '通訊錄共%s位好友' % MemberCount ChatRoomName = '' result = [] for i in xrange(0, int(math.ceil(MemberCount / float(MAX_GROUP_NUM)))): UserNames = [] NickNames = [] DeletedList = '' for j in xrange(0, MAX_GROUP_NUM): if i * MAX_GROUP_NUM + j >= MemberCount: break Member = MemberList[i * MAX_GROUP_NUM + j] UserNames.append(Member['UserName']) NickNames.append(Member['NickName'].encode('utf-8')) print '第%s組...' % (i + 1) print ', '.join(NickNames) print '回車鍵繼續(xù)...' raw_input() # 新建群組/添加成員 if ChatRoomName == '': (ChatRoomName, DeletedList) = createChatroom(UserNames) else: DeletedList = addMember(ChatRoomName, UserNames) DeletedCount = len(DeletedList) if DeletedCount > 0: result += DeletedList print '找到%s個(gè)被刪好友' % DeletedCount # raw_input() # 刪除成員 deleteMember(ChatRoomName, UserNames) # todo 刪除群組 resultNames = [] for Member in MemberList: if Member['UserName'] in result: NickName = Member['NickName'] if Member['RemarkName'] != '': NickName += '(%s)' % Member['RemarkName'] resultNames.append(NickName.encode('utf-8')) print '---------- 被刪除的好友列表 ----------' print '\n'.join(resultNames) print '-----------------------------------' # windows下編碼問題修復(fù) # http://m.miracleart.cn/ 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 '本程序的查詢結(jié)果可能會(huì)引起一些心理上的不適,請(qǐng)小心使用...' print '回車鍵繼續(xù)...' raw_input() main() print '回車鍵結(jié)束' raw_input()
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
Atas ialah kandungan terperinci 微信開發(fā)之如何用腳本查看是否被微信好友刪除. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)