PS:目测由于微信改动,该脚本目前不起作用

下面截图来自原作者0x5e

相信大家在微信上一定被上面的这段话刷过屏,群发消息应该算是微信上流传最广的找到删除好友的方法了。但群发消息不仅仅会把通讯录里面所有的好友骚扰一遍,而且你还得挨个删除好几百个聊天记录,回复大家的疑问和鄙视。作为一个互联网从业者,除了群发消息就不能有更高效、不打扰好友的方式么?

答案是当然有,微信在拉好友进群聊的时候,如果这个人删除了你好友的话,会提示你一下「请先发送朋友验证申请给某某,对方将你加为微信朋友后,你才能邀请其加入群聊。」有办法了,那我把微信好友拉一个大群里面,然后默默的删掉微信群不就好了么。

于是 Github 上就有一位叫 0x5e 的开发者写了这么一个 Python 脚本来代替你手动拉群和踢人。

(上面是抄的  链接    http://www.chinaz.com/program/2016/0106/492576.shtml?uc_biz_str=S:custom|C:iflow_ncmt|K:true&fromSearch=1)

首先你得有python的环境,自己百度如何搭建python的环境。

链接附上:  http://jingyan.baidu.com/article/6d704a1316cf7b28db51ca9a.html

python 脚本如下:

来源于github

代码链接:   https://raw.githubusercontent.com/0x5e/wechat-deleted-friends/master/wdf.py

保存为如下图到桌面即可

安装完python环境以后打开如箭头所示

继续点击file

点击open

打开你的python代码

弹出一个新窗口点击run

选择run module

弹出新窗口,按照提示  按回车继续

会自动弹出二维码,并提示下图

扫描该二维码,就可以了,等待程序运行完毕就统计出了好友删除情况,最后需要你去删除只有你自己一个人的群,别人看不到的奥

附代码:

#!/usr/bin/env python
# coding=utf-8
from __future__ import print_function import os
try:
from urllib import urlencode
except ImportError:
from urllib.parse import urlencode try:
import urllib2 as wdf_urllib
from cookielib import CookieJar
except ImportError:
import urllib.request as wdf_urllib
from http.cookiejar import CookieJar import re
import time
import xml.dom.minidom
import json
import sys
import math
import subprocess DEBUG = False MAX_GROUP_NUM = 35 # 每组人数 #QRImagePath = os.getcwd() + '/qrcode.jpg'
QRImagePath = os.path.join(os.getcwd(), 'qrcode.jpg') tip = 0
uuid = '' base_uri = ''
redirect_uri = '' skey = ''
wxsid = ''
wxuin = ''
pass_ticket = ''
deviceId = 'e000000000000000' BaseRequest = {} ContactList = []
My = [] try:
xrange
range = xrange
except:
# 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.weixin.qq.com/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.weixin.qq.com/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.weixin.qq.com/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('/')]
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 skey == '' or wxsid == '' or wxuin == '' or pass_ticket == '':
#return False
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/json; charset=UTF-8')
response = wdf_urllib.urlopen(request)
data = response.read().decode('utf-8', 'replace') if DEBUG:
#f = open(os.getcwd() + '/webwxinit.json', 'wb')
f = open(os.path.join(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 = getRequest(url = url)
request.add_header('ContentType', 'application/json; charset=UTF-8')
response = wdf_urllib.urlopen(request)
data = response.read() if DEBUG:
#f = open(os.getcwd() + '/webwxgetcontact.json', 'wb')
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/json; 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 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 = getRequest(url = url, data = json.dumps(params))
request.add_header('ContentType', 'application/json; 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']
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 = getRequest(url = url, data = json.dumps(params))
request.add_header('ContentType', 'application/json; 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 len(ErrMsg) > 0:
print(ErrMsg) return DeletedList def main(): try:
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 = []
print('开始查找...')
group_num=int(math.ceil(MemberCount / float(MAX_GROUP_NUM)))
for i in range(0, group_num):
UserNames = []
NickNames = []
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'])
NickNames.append(Member['NickName'].encode('utf-8')) # 进度条
progress='-'*10
progress_str='%s'%''.join(map(lambda x:'#',progress[:int((10*(i+1))/group_num)]))
#print '[',progress_str,''.join('-'*(10-len(progress_str))),']',
#print '(当前,你被%d人删除,好友共%d人'%(len(result),len(MemberList)),'\r',
print('[',progress_str,''.join('-'*(10-len(progress_str))),']', end=' ')
print('(当前,你被%d人删除,好友共%d人'%(len(result),len(MemberList)),'\r',end=' ') # 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 += DeletedList # print '找到%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('\n---------- 被删除的好友列表 ----------')
# 过滤emoji
resultNames=list(map(lambda x:re.sub(r'<span.+/span>','',x),resultNames))
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('回车键继续...')
try:
raw_input()
input = raw_input
except:
input() main() print('回车键结束')
input() # vim: noet:sts=8:ts=8:sw=8

  

python 脚本查看微信把你删除的好友--win系统版的更多相关文章

  1. python 脚本备份mssql数据库并删除数据库

    一.实现脚本 # -*- coding=utf-8 -*- import pyodbc from datetime import datetime import pymssql import os i ...

  2. 通过python脚本查看端口

    [root@zabbix-server alertscripts]# cat check_port1.py #!/usr/bin/env python #coding:utf-8 import os, ...

  3. Discuz!X 3.4 任意文件删除漏洞复现过程(附python脚本)

    今天看下群里在讨论Discuz!X 3.4 任意文件删除漏洞,自己做了一些测试,记录一下过程.结尾附上自己编写的python脚本,自动化实现任意文件删除. 具体漏洞,请查看 https://paper ...

  4. 【Python脚本】Python创建删除文件-----------我的第一个Python脚本

    Python相对C++和Java来说,是解释性语言,非常适合来编写脚本. 很久之前就开始学习Python的语法了,今天写了第一个Python的脚本,来简化我的一些日常工作. 我平时学习的时候喜欢新建一 ...

  5. python脚本文件删除

    昨天有需求需要用python脚本删除一个目录下的文件.遇到了点麻烦. 使用的是shutil.rmtree(dir)函数,这个函数可以删除有内容的目录,而shutil.rmdir(dir)只能删除空目录 ...

  6. 【MonkeyRunner】[技术博客]用python编写脚本查看设备信息

    [MonkeyRunner]用python编写脚本查看设备信息 原以为是个简单的操作,在实践的时候发现了一些问题. python脚本 test.py: from com.android.monkeyr ...

  7. python 脚本定时删除 elk索引

    脚本如下 一.python 脚本如下 #! /usr/bin/python # -*- coding=utf-8 -*- import urllib import urllib.request imp ...

  8. Linux服务器CPU、内存、磁盘空间、负载情况查看python脚本

    [本文出自天外归云的博客园] 网上搜,东拼西凑,组装了一个可以查Linux服务器CPU使用率.内存使用率.磁盘空间占用率.负载情况的python脚本. 脚本内容如下: # -*- coding:utf ...

  9. 删除windows上特定目录下以*.rar后缀名的python脚本

    import os,fnmatch,datetime,time def all_files(root,pattern='*',single_level=False,yield_folders=Fals ...

随机推荐

  1. Error:Could not open initscript class cache for initialization script 'C:\Users\Avishek\AppData\Local\Temp\asLocalRepo14.gradle' (C:\Users\Avishek.gradle\caches\2.2.1\scripts\asLocalRepo14_dkwbdtenxxg

    Error:Could not open initscript class cache for initialization script 见鬼 Android Studio打开项目时遇到这个问题 昨 ...

  2. Android从零单排之免费短信验证

    介绍 短信验证功能大家都很熟悉了.在很多地方都能见到,注册新用户或者短息验证支付等.短信验证利用短信验证码来注册会员,大大降低了非法注册,很大程度上提高了用户账户的安全性. 目前市面上已经有了很多提供 ...

  3. CORREL

    CORREL Show All Returns the correlation coefficient of the array1 and array2 cell ranges. Use the co ...

  4. HDU5653 Bomber Man wants to bomb an Array 简单DP

    题意:bc 77 div1 1003(中文题面) 分析:先不考虑将结果乘以 1e6. 设 dp[i] 为从前 i 个格子的状态可以获得的最大破坏指数. 那么我们可以枚举每个炸弹,该炸弹向左延伸的距离和 ...

  5. EF RepositoryBase 参考示例【转】

    1.定义泛型类 namespace Crm.Data.Logic.Repository{    public abstract class AbstractRepository<TC, T> ...

  6. oracle 日志学习(转载)

    一,重做日志概念 重做日志文件(redo log file)对于Oracle数据库至关重要.它们是数据库的事务日志.通常只用于恢复,不过也可以用于以下工作: q 系统崩溃后的实例恢复 q 通过备份恢复 ...

  7. redis命令之lrange

    LRANGE key start stop Related commands BLPOP BRPOP BRPOPLPUSH LINDEX LINSERT LLEN LPOP LPUSH LPUSHX ...

  8. chmod chgrp chown

    Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁 ...

  9. deep learning(1)BP神经网络原理与练习

    具体原理参考如下讲义: 1.神经网络 2.反向传导 3.梯度检验与高级优化 看完材料1和2就可以梳理清楚bp神经网络的基本工作原理,下面通过一个C语言实现的程序来练习这个算法 //Backpropag ...

  10. devexpress中gridview控件编辑时改变输入法状态

    在win7环境下使用Devexpress中的SpinEdit控件,切换成中文[简/繁]输入法输入数字键时有不少输入法会重复产生数字如输入1会变成11,输入123会变成112233.使用SpinEdit ...