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

目录(?)[+]


前言

本文出自 时而宁靜 的博客。

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

相信各位一定有收到过这样的群发短信,据说还被归类为玩转微信的五大技巧之一╮(╯▽╰)╭

【你说收到这样的信息该有多桑新,人和人的信任呢?!】

但,其实,只要跑一下脚本,就轻松找出删除自己的好友,还不被他们发现

2016第1篇--Python查看微信被删好友_第1张图片

昨日,一同学发的朋友圈分享 Github 源码,说是可以轻松查到删除自己的微信好友,于是就开始了作死之路。

Github 源码请看:0x5e/wechat-deleted-friends

好了,话不多说,开始操作~

1.下载Python官方安装包:  点击下载   【推荐使用2.7,自己找了个一个地址,自己百度也成】

2016第1篇--Python查看微信被删好友_第2张图片


2.下载Python源码: 点击下载 【源码来自GITHUB,不放心下载可查】,

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



我把文件夹放到放到E盘下:

2016第1篇--Python查看微信被删好友_第3张图片


3.安装好Python客户端后,配置环境变量

右键计算机-高级系统设置-高级-PATH。。。。【这里不做详细赘述,如下图设置即可】


2016第1篇--Python查看微信被删好友_第4张图片


2016第1篇--Python查看微信被删好友_第5张图片



4.运行-cmd,输入指令,查看有谁删除:

[python]  view plain  copy
 print ?
  1. python "E:\wechat-deleted-friends-master\wdf.py"  


2016第1篇--Python查看微信被删好友_第6张图片

5.回车继续,扫二维码登录,一步步来,就可以查看谁删除你喽~

6.可能会在聊天记录下留下你一个人的讨论组,删除就好~


原理

用的是微信网页版的接口,还有些小问题,不过现在结果好像有疏漏一小部分,原因不明……也没试过被拉黑的情况。

最终会遗留下一个只有自己的群组,需要手工删一下。


代码如下:

[python]  view plain  copy
 print ?
  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.          
  136.             0 
  137.             OK 
  138.             xxx 
  139.             xxx 
  140.             xxx 
  141.             xxx 
  142.             1 
  143.          
  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()  

你可能感兴趣的:(2016第1篇--Python查看微信被删好友)