查看被删的微信好友

原理就是新建群组,如果加不进来就是被删好友了(不要在群组里讲话,别人是看不见的)

用的是微信网页版的接口

查询结果可能会引起一些心理上的不适,请小心使用…(逃

还有些小问题:

结果好像有疏漏一小部分,原因不明…

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

没试过被拉黑的情况

新手步骤 Mac 上步骤:

  1. 在 Mac 上操作,下载代码文件
  2. 打开 Terminal 输入:python +空格,然后拖动刚才下载的 wdf.py 到 Terminal 后回车。格式: python wdf.py
  3. 接下来按步骤操作即可;

代码如下:

#!/usr/bin/env python
# coding=utf-8import os
import urllib, urllib2
import re
import cookielib
import time
import xml.dom.minidom
import json
import sys
import mathDEBUG = FalseMAX_GROUP_NUM = 35 # 每组人数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 uuidurl = '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 Truereturn Falsedef showQRImage():global tipurl = 'https://login.weixin.qq.com/qrcode/' + uuidparams = {'t': 'webwx','_': int(time.time()),}request = urllib2.Request(url = url, data = urllib.urlencode(params))response = urllib2.urlopen(request)tip = 1f = 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 '请使用微信扫描二维码以登录'def waitForLogin():global tip, base_uri, redirect_uriurl = '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 '成功扫描,请在手机上点击确认以登录'tip = 0elif 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': #超时pass# elif code == '400' or code == '500':return codedef login():global skey, wxsid, wxuin, pass_ticket, BaseRequestrequest = urllib2.Request(url = redirect_uri)response = urllib2.urlopen(request)data = response.read()# print data'''0OKxxxxxxxxxxxx1'''doc = xml.dom.minidom.parseString(data)root = doc.documentElementfor node in root.childNodes:if node.nodeName == 'skey':skey = node.childNodes[0].dataelif node.nodeName == 'wxsid':wxsid = node.childNodes[0].dataelif node.nodeName == 'wxuin':wxuin = node.childNodes[0].dataelif 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 FalseBaseRequest = {'Uin': int(wxuin),'Sid': wxsid,'Skey': skey,'DeviceID': deviceId,}return Truedef 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 dataglobal ContactList, Mydic = json.loads(data)ContactList = dic['ContactList']My = dic['User']ErrMsg = dic['BaseResponse']['ErrMsg']if len(ErrMsg) > 0:print ErrMsgRet = dic['BaseResponse']['Ret']if Ret != 0:return Falsereturn Truedef 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 datadic = json.loads(data)MemberList = dic['MemberList']# 倒序遍历,不然删除的时候出问题..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: # 公众号/服务号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 MemberListdef 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 datadic = 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 len(ErrMsg) > 0:print ErrMsgreturn (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 datadic = json.loads(data)ErrMsg = dic['BaseResponse']['ErrMsg']if len(ErrMsg) > 0:print ErrMsgRet = dic['BaseResponse']['Ret']if Ret != 0:return Falsereturn Truedef 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 datadic = json.loads(data)MemberList = dic['MemberList']DeletedList = []for Member in MemberList:if Member['MemberStatus'] == 4: #被对方删除了DeletedList.append(Member['UserName'])ErrMsg = dic['BaseResponse']['ErrMsg']if len(ErrMsg) > 0:print ErrMsgreturn DeletedListdef main():opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))urllib2.install_opener(opener)if getUUID() == False:print '获取uuid失败'returnshowQRImage()time.sleep(1)while waitForLogin() != '200':passos.remove(QRImagePath)if login() == False:print '登录失败'returnif webwxinit() == False:print '初始化失败'returnMemberList = webwxgetcontact()MemberCount = len(MemberList)print '通讯录共%s位好友' % MemberCountChatRoomName = ''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:breakMember = 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 '回车键继续...'raw_input()# 新建群组/添加成员if ChatRoomName == '':(ChatRoomName, DeletedList) = createChatroom(UserNames)else:DeletedList = addMember(ChatRoomName, UserNames)DeletedCount = len(DeletedList)if DeletedCount > 0:result += DeletedListprint '找到%s个被删好友' % 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下编码问题修复
# 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 '回车键继续...'raw_input()main()print '回车键结束'raw_input()

视频教程戳⬇️

主要目录如下:


这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

Python脚本一键找出哪些微信好友删了你(附源码)相关推荐

  1. python爬取短视频,Python爬虫一键下载yy全站短视频详细步骤(附源码)

    基本开发环境 Python 3.6 Pycharm 相关模块的使用 importosimport requests 安装Python并添加到环境变量,pip安装需要的相关模块即可. 一.确定目标需求 ...

  2. Python爬虫一键下载yy全站短视频详细步骤(附源码)

    基本开发环境 Python 3.6 Pycharm 相关模块的使用 import os import requests 安装Python并添加到环境变量,pip安装需要的相关模块即可. 一.确定目标需 ...

  3. Python 实现图片格式转换,jpg\png\webp等,附源码

    Python 实现图片格式转换,jpg\png\webp等,附源码 需要使用 PIL库,但python 3是无法安装该库的,如果是python 3安装pillow库即可. 1.安装 python 2 ...

  4. AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一)

    AOP注解@Before.@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一) 问题背景 AOP注解@Before.@AfterReturni ...

  5. 微信无痕清粉分析过程-附源码地址

    一.环境 1.微信版本 2.WeChatWin.dll基址 基址=0FD30000 大小=018A2000 (25829376.) 入口=10A0AA01 WeChatWi. 名称=WeChatWi ...

  6. python没有pygame_Python制作十款经典的童年游戏(附源码)

    不知道行友们每年六一是怎么度过的,行哥的童年是在游戏世界里度过.这里行哥分享一下十个python可以制作的经典游戏,看看有没有你的菜,代码链接放在文末 对了以下游戏皆是小学六年级的代码水平 如有不适, ...

  7. Python程序打包成.exe文件(弹窗恶搞小程序附源码)

    0.先来张效果图: 1.安装pyinsatller 打开命令行窗口,输入如下指令:pip3 install pyinstaller 我的已经安装过,所以这样显示. 2.使用pyinstaller打包P ...

  8. Java微信公众号开发(附源码!!!)

    笔者最近在为一个艺考服务团队开发手机端的服务,由于开发app需要的时间较长,所以选择开发微信公众号.本人比较擅长Java开发,所以本文是基于Java语言的公众号开发.话不多说,直接进入正题. 准备工作 ...

  9. Python模拟屏幕点击自动完成词达人任务(附源码)

    Python模拟屏幕点击自动完成微信词达人任务 该贴是以微信词达人为基础实践而写,如果我们并没有使用词达人,该源码中关键代码部分和模拟点击原理希望对大家有帮助. Python模拟屏幕点击自动完成微信词 ...

最新文章

  1. 人工智能机器视觉的未来发展趋势
  2. 关于软件质量(2)- 开发 vs 测试
  3. Android Handler Runnable和Thread之间的区别和联系详解
  4. .依存句法分析--提取用户评论
  5. php安全拦截,php类中的各种拦截器用法分析
  6. 毛星云OpenCV3
  7. 高中化学实验室建设及常规设备配置
  8. pcshare完美版
  9. 点击链接元素出现蓝色边框或者出现半透明蓝色背景
  10. cms10——友情链接
  11. python 高德/百度/腾讯/谷歌API 与WGS84坐标互转(BD09/GCJ02/WGS84)
  12. web网页本地视频播放器
  13. extJs 2.0学习笔记(Ext.Panel篇四)
  14. git命令判断当前分支是否与master合并
  15. 服务器端编程心得(二)—— Reactor模式
  16. 基于attention机制的中英文机器翻译
  17. Android 实现拍照、录像
  18. 企业如何制定高效可靠环保企业管理平台解决方案
  19. C++11、C++14、C++17、C++20新特性总结(5万字详解)
  20. Matlab数字图像处理 实验1、数字图像的傅里叶变换

热门文章

  1. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java自来水收费管理系统7yd5p
  2. 博图sodt定时器的用法_图文详解|西门子博途中的定时器指令
  3. Android 让注册商标R往上移
  4. linux dns区域传送,DNS服务之主从复制和区域传送
  5. java 2 实用教程(第五版)第六章课后编程题:设计一个动物声音模拟器,希望模拟器可以模拟许多的动物的叫声。
  6. 启动不了argis的license manager
  7. 433~458(flex+携程网移动端首页)
  8. 怎么显示隐藏的文件类型的后缀名
  9. 最新PHP一些面试题
  10. Marvell车载交换机88Q5050, 88Q5072 VLAN配置(二)------VLAN的交换策略