2016第1篇--Python查看微信被刪好友

目錄(?)[+]


前言

本文出自 時而寧靜 的博客。

地址:http://blog.csdn.net/ty_hf/article/details/50471912

相信各位一定有收到過這樣的羣發短信,據說還被歸類爲玩轉微信的五大技巧之一╮(╯▽╰)╭

【你說收到這樣的信息該有多桑新,人和人的信任呢?!】

但,其實,只要跑一下腳本,就輕鬆找出刪除自己的好友,還不被他們發現偷笑


昨日,一同學發的朋友圈分享 Github 源碼,說是可以輕鬆查到刪除自己的微信好友,於是就開始了作死之路。

Github 源碼請看:0x5e/wechat-deleted-friends

好了,話不多說,開始操作~

1.下載Python官方安裝包:  點擊下載   【推薦使用2.7,自己找了個一個地址,自己百度也成】



2.下載Python源碼: 點擊下載 【源碼來自GITHUB,不放心下載可查】,

http://download.csdn.net/detail/ty_hf/9485713



我把文件夾放到放到E盤下:



3.安裝好Python客戶端後,配置環境變量

右鍵計算機-高級系統設置-高級-PATH。。。。【這裏不做詳細贅述,如下圖設置即可】







4.運行-cmd,輸入指令,查看有誰刪除:

[python] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. python "E:\wechat-deleted-friends-master\wdf.py"  




5.回車繼續,掃二維碼登錄,一步步來,就可以查看誰刪除你嘍~

6.可能會在聊天記錄下留下你一個人的討論組,刪除就好~


原理

用的是微信網頁版的接口,還有些小問題,不過現在結果好像有疏漏一小部分,原因不明……也沒試過被拉黑的情況。

最終會遺留下一個只有自己的羣組,需要手工刪一下。


代碼如下:

[python] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. #!/usr/bin/env python  
  2. # coding=utf-8  
  3.   
  4. import os  
  5. import urllib, urllib2  
  6. import re  
  7. import cookielib  
  8. import time  
  9. import xml.dom.minidom  
  10. import json  
  11. import sys  
  12. import math  
  13.   
  14. DEBUG = False  
  15.   
  16. MAX_GROUP_NUM = 35 # 每組人數  
  17.   
  18. QRImagePath = os.getcwd() + '/qrcode.jpg'  
  19.   
  20. tip = 0  
  21. uuid = ''  
  22.   
  23. base_uri = ''  
  24. redirect_uri = ''  
  25.   
  26. skey = ''  
  27. wxsid = ''  
  28. wxuin = ''  
  29. pass_ticket = ''  
  30. deviceId = 'e000000000000000'  
  31.   
  32. BaseRequest = {}  
  33.   
  34. ContactList = []  
  35. My = []  
  36.   
  37. def getUUID():  
  38.     global uuid  
  39.   
  40.     url = 'https://login.weixin.qq.com/jslogin'  
  41.     params = {  
  42.         'appid''wx782c26e4c19acffb',  
  43.         'fun''new',  
  44.         'lang''zh_CN',  
  45.         '_': int(time.time()),  
  46.     }  
  47.   
  48.     request = urllib2.Request(url = url, data = urllib.urlencode(params))  
  49.     response = urllib2.urlopen(request)  
  50.     data = response.read()  
  51.   
  52.     # print data  
  53.   
  54.     # window.QRLogin.code = 200; window.QRLogin.uuid = "oZwt_bFfRg==";  
  55.     regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"'  
  56.     pm = re.search(regx, data)  
  57.   
  58.     code = pm.group(1)  
  59.     uuid = pm.group(2)  
  60.   
  61.     if code == '200':  
  62.         return True  
  63.   
  64.     return False  
  65.   
  66. def showQRImage():  
  67.     global tip  
  68.   
  69.     url = 'https://login.weixin.qq.com/qrcode/' + uuid  
  70.     params = {  
  71.         't''webwx',  
  72.         '_': int(time.time()),  
  73.     }  
  74.   
  75.     request = urllib2.Request(url = url, data = urllib.urlencode(params))  
  76.     response = urllib2.urlopen(request)  
  77.   
  78.     tip = 1  
  79.   
  80.     f = open(QRImagePath, 'wb')  
  81.     f.write(response.read())  
  82.     f.close()  
  83.   
  84.     if sys.platform.find('darwin') >= 0:  
  85.         os.system('open %s' % QRImagePath)  
  86.     elif sys.platform.find('linux') >= 0:  
  87.         os.system('xdg-open %s' % QRImagePath)  
  88.     else:  
  89.         os.system('call %s' % QRImagePath)  
  90.   
  91.     print '請使用微信掃描二維碼以登錄'  
  92.   
  93. def waitForLogin():  
  94.     global tip, base_uri, redirect_uri  
  95.   
  96.     url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s' % (tip, uuid, int(time.time()))  
  97.   
  98.     request = urllib2.Request(url = url)  
  99.     response = urllib2.urlopen(request)  
  100.     data = response.read()  
  101.       
  102.     # print data  
  103.   
  104.     # window.code=500;  
  105.     regx = r'window.code=(\d+);'  
  106.     pm = re.search(regx, data)  
  107.   
  108.     code = pm.group(1)  
  109.   
  110.     if code == '201'#已掃描  
  111.         print '成功掃描,請在手機上點擊確認以登錄'  
  112.         tip = 0  
  113.     elif code == '200'#已登錄  
  114.         print '正在登錄...'  
  115.         regx = r'window.redirect_uri="(\S+?)";'  
  116.         pm = re.search(regx, data)  
  117.         redirect_uri = pm.group(1) + '&fun=new'  
  118.         base_uri = redirect_uri[:redirect_uri.rfind('/')]  
  119.     elif code == '408'#超時  
  120.         pass  
  121.     # elif code == '400' or code == '500':  
  122.   
  123.     return code  
  124.   
  125. def login():  
  126.     global skey, wxsid, wxuin, pass_ticket, BaseRequest  
  127.   
  128.     request = urllib2.Request(url = redirect_uri)  
  129.     response = urllib2.urlopen(request)  
  130.     data = response.read()  
  131.   
  132.     # print data  
  133.   
  134.     ''''' 
  135.         <error> 
  136.             <ret>0</ret> 
  137.             <message>OK</message> 
  138.             <skey>xxx</skey> 
  139.             <wxsid>xxx</wxsid> 
  140.             <wxuin>xxx</wxuin> 
  141.             <pass_ticket>xxx</pass_ticket> 
  142.             <isgrayscale>1</isgrayscale> 
  143.         </error> 
  144.     '''  
  145.   
  146.     doc = xml.dom.minidom.parseString(data)  
  147.     root = doc.documentElement  
  148.   
  149.     for node in root.childNodes:  
  150.         if node.nodeName == 'skey':  
  151.             skey = node.childNodes[0].data  
  152.         elif node.nodeName == 'wxsid':  
  153.             wxsid = node.childNodes[0].data  
  154.         elif node.nodeName == 'wxuin':  
  155.             wxuin = node.childNodes[0].data  
  156.         elif node.nodeName == 'pass_ticket':  
  157.             pass_ticket = node.childNodes[0].data  
  158.   
  159.     # print 'skey: %s, wxsid: %s, wxuin: %s, pass_ticket: %s' % (skey, wxsid, wxuin, pass_ticket)  
  160.   
  161.     if skey == '' or wxsid == '' or wxuin == '' or pass_ticket == '':  
  162.         return False  
  163.   
  164.     BaseRequest = {  
  165.         'Uin': int(wxuin),  
  166.         'Sid': wxsid,  
  167.         'Skey': skey,  
  168.         'DeviceID': deviceId,  
  169.     }  
  170.   
  171.     return True  
  172.   
  173. def webwxinit():  
  174.   
  175.     url = base_uri + '/webwxinit?pass_ticket=%s&skey=%s&r=%s' % (pass_ticket, skey, int(time.time()))  
  176.     params = {  
  177.         'BaseRequest': BaseRequest  
  178.     }  
  179.   
  180.     request = urllib2.Request(url = url, data = json.dumps(params))  
  181.     request.add_header('ContentType''application/json; charset=UTF-8')  
  182.     response = urllib2.urlopen(request)  
  183.     data = response.read()  
  184.   
  185.     if DEBUG == True:  
  186.         f = open(os.getcwd() + '/webwxinit.json''wb')  
  187.         f.write(data)  
  188.         f.close()  
  189.   
  190.     # print data  
  191.   
  192.     global ContactList, My  
  193.     dic = json.loads(data)  
  194.     ContactList = dic['ContactList']  
  195.     My = dic['User']  
  196.   
  197.     ErrMsg = dic['BaseResponse']['ErrMsg']  
  198.     if len(ErrMsg) > 0:  
  199.         print ErrMsg  
  200.   
  201.     Ret = dic['BaseResponse']['Ret']  
  202.     if Ret != 0:  
  203.         return False  
  204.           
  205.     return True  
  206.   
  207. def webwxgetcontact():  
  208.       
  209.     url = base_uri + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % (pass_ticket, skey, int(time.time()))  
  210.   
  211.     request = urllib2.Request(url = url)  
  212.     request.add_header('ContentType''application/json; charset=UTF-8')  
  213.     response = urllib2.urlopen(request)  
  214.     data = response.read()  
  215.   
  216.     if DEBUG == True:  
  217.         f = open(os.getcwd() + '/webwxgetcontact.json''wb')  
  218.         f.write(data)  
  219.         f.close()  
  220.   
  221.     # print data  
  222.   
  223.     dic = json.loads(data)  
  224.     MemberList = dic['MemberList']  
  225.   
  226.     # 倒序遍歷,不然刪除的時候出問題..  
  227.     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']  
  228.     for i in xrange(len(MemberList) - 1, -1, -1):  
  229.         Member = MemberList[i]  
  230.         if Member['VerifyFlag'] & 8 != 0# 公衆號/服務號  
  231.             MemberList.remove(Member)  
  232.         elif Member['UserName'in SpecialUsers: # 特殊賬號  
  233.             MemberList.remove(Member)  
  234.         elif Member['UserName'].find('@@') != -1# 羣聊  
  235.             MemberList.remove(Member)  
  236.         elif Member['UserName'] == My['UserName']: # 自己  
  237.             MemberList.remove(Member)  
  238.   
  239.     return MemberList  
  240.   
  241. def createChatroom(UserNames):  
  242.     MemberList = []  
  243.     for UserName in UserNames:  
  244.         MemberList.append({'UserName': UserName})  
  245.   
  246.   
  247.     url = base_uri + '/webwxcreatechatroom?pass_ticket=%s&r=%s' % (pass_ticket, int(time.time()))  
  248.     params = {  
  249.         'BaseRequest': BaseRequest,  
  250.         'MemberCount': len(MemberList),  
  251.         'MemberList': MemberList,  
  252.         'Topic''',  
  253.     }  
  254.   
  255.     request = urllib2.Request(url = url, data = json.dumps(params))  
  256.     request.add_header('ContentType''application/json; charset=UTF-8')  
  257.     response = urllib2.urlopen(request)  
  258.     data = response.read()  
  259.   
  260.     # print data  
  261.   
  262.     dic = json.loads(data)  
  263.     ChatRoomName = dic['ChatRoomName']  
  264.     MemberList = dic['MemberList']  
  265.     DeletedList = []  
  266.     for Member in MemberList:  
  267.         if Member['MemberStatus'] == 4#被對方刪除了  
  268.             DeletedList.append(Member['UserName'])  
  269.   
  270.     ErrMsg = dic['BaseResponse']['ErrMsg']  
  271.     if len(ErrMsg) > 0:  
  272.         print ErrMsg  
  273.   
  274.     return (ChatRoomName, DeletedList)  
  275.   
  276. def deleteMember(ChatRoomName, UserNames):  
  277.     url = base_uri + '/webwxupdatechatroom?fun=delmember&pass_ticket=%s' % (pass_ticket)  
  278.     params = {  
  279.         'BaseRequest': BaseRequest,  
  280.         'ChatRoomName': ChatRoomName,  
  281.         'DelMemberList'','.join(UserNames),  
  282.     }  
  283.   
  284.     request = urllib2.Request(url = url, data = json.dumps(params))  
  285.     request.add_header('ContentType''application/json; charset=UTF-8')  
  286.     response = urllib2.urlopen(request)  
  287.     data = response.read()  
  288.   
  289.     # print data  
  290.   
  291.     dic = json.loads(data)  
  292.     ErrMsg = dic['BaseResponse']['ErrMsg']  
  293.     if len(ErrMsg) > 0:  
  294.         print ErrMsg  
  295.   
  296.     Ret = dic['BaseResponse']['Ret']  
  297.     if Ret != 0:  
  298.         return False  
  299.           
  300.     return True  
  301.   
  302. def addMember(ChatRoomName, UserNames):  
  303.     url = base_uri + '/webwxupdatechatroom?fun=addmember&pass_ticket=%s' % (pass_ticket)  
  304.     params = {  
  305.         'BaseRequest': BaseRequest,  
  306.         'ChatRoomName': ChatRoomName,  
  307.         'AddMemberList'','.join(UserNames),  
  308.     }  
  309.   
  310.     request = urllib2.Request(url = url, data = json.dumps(params))  
  311.     request.add_header('ContentType''application/json; charset=UTF-8')  
  312.     response = urllib2.urlopen(request)  
  313.     data = response.read()  
  314.   
  315.     # print data  
  316.   
  317.     dic = json.loads(data)  
  318.     MemberList = dic['MemberList']  
  319.     DeletedList = []  
  320.     for Member in MemberList:  
  321.         if Member['MemberStatus'] == 4#被對方刪除了  
  322.             DeletedList.append(Member['UserName'])  
  323.   
  324.     ErrMsg = dic['BaseResponse']['ErrMsg']  
  325.     if len(ErrMsg) > 0:  
  326.         print ErrMsg  
  327.   
  328.     return DeletedList  
  329.   
  330. def main():  
  331.   
  332.     opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))  
  333.     urllib2.install_opener(opener)  
  334.       
  335.     if getUUID() == False:  
  336.         print '獲取uuid失敗'  
  337.         return  
  338.   
  339.     showQRImage()  
  340.     time.sleep(1)  
  341.   
  342.     while waitForLogin() != '200':  
  343.         pass  
  344.   
  345.     os.remove(QRImagePath)  
  346.   
  347.     if login() == False:  
  348.         print '登錄失敗'  
  349.         return  
  350.   
  351.     if webwxinit() == False:  
  352.         print '初始化失敗'  
  353.         return  
  354.   
  355.     MemberList = webwxgetcontact()  
  356.   
  357.     MemberCount = len(MemberList)  
  358.     print '通訊錄共%s位好友' % MemberCount  
  359.   
  360.     ChatRoomName = ''  
  361.     result = []  
  362.     for i in xrange(0, int(math.ceil(MemberCount / float(MAX_GROUP_NUM)))):  
  363.         UserNames = []  
  364.         NickNames = []  
  365.         DeletedList = ''  
  366.         for j in xrange(0, MAX_GROUP_NUM):  
  367.             if i * MAX_GROUP_NUM + j >= MemberCount:  
  368.                 break  
  369.   
  370.             Member = MemberList[i * MAX_GROUP_NUM + j]  
  371.             UserNames.append(Member['UserName'])  
  372.             NickNames.append(Member['NickName'].encode('utf-8'))  
  373.                           
  374.         print '第%s組...' % (i + 1)  
  375.         print ', '.join(NickNames)  
  376.         print '回車鍵繼續...'  
  377.         raw_input()  
  378.   
  379.         # 新建羣組/添加成員  
  380.         if ChatRoomName == '':  
  381.             (ChatRoomName, DeletedList) = createChatroom(UserNames)  
  382.         else:  
  383.             DeletedList = addMember(ChatRoomName, UserNames)  
  384.   
  385.         DeletedCount = len(DeletedList)  
  386.         if DeletedCount > 0:  
  387.             result += DeletedList  
  388.   
  389.         print '找到%s個被刪好友' % DeletedCount  
  390.         # raw_input()  
  391.   
  392.         # 刪除成員  
  393.         deleteMember(ChatRoomName, UserNames)  
  394.   
  395.     # todo 刪除羣組  
  396.   
  397.   
  398.     resultNames = []  
  399.     for Member in MemberList:  
  400.         if Member['UserName'in result:  
  401.             NickName = Member['NickName']  
  402.             if Member['RemarkName'] != '':  
  403.                 NickName += '(%s)' % Member['RemarkName']  
  404.             resultNames.append(NickName.encode('utf-8'))  
  405.   
  406.     print '---------- 被刪除的好友列表 ----------'  
  407.     print '\n'.join(resultNames)  
  408.     print '-----------------------------------'  
  409.   
  410. # windows下編碼問題修復  
  411. # http://blog.csdn.net/heyuxuanzee/article/details/8442718  
  412. class UnicodeStreamFilter:    
  413.     def __init__(self, target):    
  414.         self.target = target    
  415.         self.encoding = 'utf-8'    
  416.         self.errors = 'replace'    
  417.         self.encode_to = self.target.encoding    
  418.     def write(self, s):    
  419.         if type(s) == str:    
  420.             s = s.decode('utf-8')    
  421.         s = s.encode(self.encode_to, self.errors).decode(self.encode_to)    
  422.         self.target.write(s)    
  423.             
  424. if sys.stdout.encoding == 'cp936':    
  425.     sys.stdout = UnicodeStreamFilter(sys.stdout)  
  426.   
  427. if __name__ == '__main__' :  
  428.   
  429.     print '本程序的查詢結果可能會引起一些心理上的不適,請小心使用...'  
  430.     print '回車鍵繼續...'  
  431.     raw_input()  
  432.   
  433.     main()  
  434.   
  435.     print '回車鍵結束'  
  436.     raw_input()  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章