资讯专栏INFORMATION COLUMN

更新:扫码即可实现丨用脚本快速查看自己被多少微信好友删除

ziwenxie / 754人阅读

摘要:重大更新懒人扫码即可这是马坐等软狗啊哈哈哈来更他的整个项目某日,一同学给小的发了源码,说是可以轻松查到删除自己的微信好友,于是就开始了作死之路。

重大更新

懒人扫码即可:这是马
坐等软狗啊哈哈哈来更他的整个项目

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

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

前言

相信各位一定有收到过这样的群发短信,据说还被归类为玩转微信的五大技巧之一╮(╯▽╰)╭但,其实,只要跑一下脚本,就轻松找出删除自己的好友(轻松摔碎玻璃心,逃

</>复制代码

  1. GitHub:开源怪我咯?

原理

</>复制代码

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

用的是微信网页版的接口,还有些小问题,不过现在结果好像有疏漏一小部分,原因不明……也没试过被拉黑的情况。最终会遗留下一个只有自己的群组,需要手工删一下。

方法

下载 python 脚本,跑一下。
windows:改用 python2;
MAC:启动 Terminal,切到文件目录下:

</>复制代码

  1. python wdf.py
代码如下

</>复制代码

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. import os
  4. import urllib, urllib2
  5. import re
  6. import cookielib
  7. import time
  8. import xml.dom.minidom
  9. import json
  10. import sys
  11. import math
  12. DEBUG = False
  13. MAX_GROUP_NUM = 35 # 每组人数
  14. QRImagePath = os.getcwd() + "/qrcode.jpg"
  15. tip = 0
  16. uuid = ""
  17. base_uri = ""
  18. redirect_uri = ""
  19. skey = ""
  20. wxsid = ""
  21. wxuin = ""
  22. pass_ticket = ""
  23. deviceId = "e000000000000000"
  24. BaseRequest = {}
  25. ContactList = []
  26. My = []
  27. def getUUID():
  28. global uuid
  29. url = "https://login.weixin.qq.com/jslogin"
  30. params = {
  31. "appid": "wx782c26e4c19acffb",
  32. "fun": "new",
  33. "lang": "zh_CN",
  34. "_": int(time.time()),
  35. }
  36. request = urllib2.Request(url = url, data = urllib.urlencode(params))
  37. response = urllib2.urlopen(request)
  38. data = response.read()
  39. # print data
  40. # window.QRLogin.code = 200; window.QRLogin.uuid = "oZwt_bFfRg==";
  41. regx = r"window.QRLogin.code = (d+); window.QRLogin.uuid = "(S+?)""
  42. pm = re.search(regx, data)
  43. code = pm.group(1)
  44. uuid = pm.group(2)
  45. if code == "200":
  46. return True
  47. return False
  48. def showQRImage():
  49. global tip
  50. url = "https://login.weixin.qq.com/qrcode/" + uuid
  51. params = {
  52. "t": "webwx",
  53. "_": int(time.time()),
  54. }
  55. request = urllib2.Request(url = url, data = urllib.urlencode(params))
  56. response = urllib2.urlopen(request)
  57. tip = 1
  58. f = open(QRImagePath, "wb")
  59. f.write(response.read())
  60. f.close()
  61. if sys.platform.find("darwin") >= 0:
  62. os.system("open %s" % QRImagePath)
  63. elif sys.platform.find("linux") >= 0:
  64. os.system("xdg-open %s" % QRImagePath)
  65. else:
  66. os.system("call %s" % QRImagePath)
  67. print "请使用微信扫描二维码以登录"
  68. def waitForLogin():
  69. global tip, base_uri, redirect_uri
  70. url = "https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s" % (tip, uuid, int(time.time()))
  71. request = urllib2.Request(url = url)
  72. response = urllib2.urlopen(request)
  73. data = response.read()
  74. # print data
  75. # window.code=500;
  76. regx = r"window.code=(d+);"
  77. pm = re.search(regx, data)
  78. code = pm.group(1)
  79. if code == "201": #已扫描
  80. print "成功扫描,请在手机上点击确认以登录"
  81. tip = 0
  82. elif code == "200": #已登录
  83. print "正在登录..."
  84. regx = r"window.redirect_uri="(S+?)";"
  85. pm = re.search(regx, data)
  86. redirect_uri = pm.group(1) + "&fun=new"
  87. base_uri = redirect_uri[:redirect_uri.rfind("/")]
  88. elif code == "408": #超时
  89. pass
  90. # elif code == "400" or code == "500":
  91. return code
  92. def login():
  93. global skey, wxsid, wxuin, pass_ticket, BaseRequest
  94. request = urllib2.Request(url = redirect_uri)
  95. response = urllib2.urlopen(request)
  96. data = response.read()
  97. # print data
  98. """
  99. 0
  100. OK
  101. xxx
  102. xxx
  103. xxx
  104. xxx
  105. 1
  106. """
  107. doc = xml.dom.minidom.parseString(data)
  108. root = doc.documentElement
  109. for node in root.childNodes:
  110. if node.nodeName == "skey":
  111. skey = node.childNodes[0].data
  112. elif node.nodeName == "wxsid":
  113. wxsid = node.childNodes[0].data
  114. elif node.nodeName == "wxuin":
  115. wxuin = node.childNodes[0].data
  116. elif node.nodeName == "pass_ticket":
  117. pass_ticket = node.childNodes[0].data
  118. # print "skey: %s, wxsid: %s, wxuin: %s, pass_ticket: %s" % (skey, wxsid, wxuin, pass_ticket)
  119. if skey == "" or wxsid == "" or wxuin == "" or pass_ticket == "":
  120. return False
  121. BaseRequest = {
  122. "Uin": int(wxuin),
  123. "Sid": wxsid,
  124. "Skey": skey,
  125. "DeviceID": deviceId,
  126. }
  127. return True
  128. def webwxinit():
  129. url = base_uri + "/webwxinit?pass_ticket=%s&skey=%s&r=%s" % (pass_ticket, skey, int(time.time()))
  130. params = {
  131. "BaseRequest": BaseRequest
  132. }
  133. request = urllib2.Request(url = url, data = json.dumps(params))
  134. request.add_header("ContentType", "application/json; charset=UTF-8")
  135. response = urllib2.urlopen(request)
  136. data = response.read()
  137. if DEBUG == True:
  138. f = open(os.getcwd() + "/webwxinit.json", "wb")
  139. f.write(data)
  140. f.close()
  141. # print data
  142. global ContactList, My
  143. dic = json.loads(data)
  144. ContactList = dic["ContactList"]
  145. My = dic["User"]
  146. ErrMsg = dic["BaseResponse"]["ErrMsg"]
  147. if len(ErrMsg) > 0:
  148. print ErrMsg
  149. Ret = dic["BaseResponse"]["Ret"]
  150. if Ret != 0:
  151. return False
  152. return True
  153. def webwxgetcontact():
  154. url = base_uri + "/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s" % (pass_ticket, skey, int(time.time()))
  155. request = urllib2.Request(url = url)
  156. request.add_header("ContentType", "application/json; charset=UTF-8")
  157. response = urllib2.urlopen(request)
  158. data = response.read()
  159. if DEBUG == True:
  160. f = open(os.getcwd() + "/webwxgetcontact.json", "wb")
  161. f.write(data)
  162. f.close()
  163. # print data
  164. dic = json.loads(data)
  165. MemberList = dic["MemberList"]
  166. # 倒序遍历,不然删除的时候出问题..
  167. 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"]
  168. for i in xrange(len(MemberList) - 1, -1, -1):
  169. Member = MemberList[i]
  170. if Member["VerifyFlag"] & 8 != 0: # 公众号/服务号
  171. MemberList.remove(Member)
  172. elif Member["UserName"] in SpecialUsers: # 特殊账号
  173. MemberList.remove(Member)
  174. elif Member["UserName"].find("@@") != -1: # 群聊
  175. MemberList.remove(Member)
  176. elif Member["UserName"] == My["UserName"]: # 自己
  177. MemberList.remove(Member)
  178. return MemberList
  179. def createChatroom(UserNames):
  180. MemberList = []
  181. for UserName in UserNames:
  182. MemberList.append({"UserName": UserName})
  183. url = base_uri + "/webwxcreatechatroom?pass_ticket=%s&r=%s" % (pass_ticket, int(time.time()))
  184. params = {
  185. "BaseRequest": BaseRequest,
  186. "MemberCount": len(MemberList),
  187. "MemberList": MemberList,
  188. "Topic": "",
  189. }
  190. request = urllib2.Request(url = url, data = json.dumps(params))
  191. request.add_header("ContentType", "application/json; charset=UTF-8")
  192. response = urllib2.urlopen(request)
  193. data = response.read()
  194. # print data
  195. dic = json.loads(data)
  196. ChatRoomName = dic["ChatRoomName"]
  197. MemberList = dic["MemberList"]
  198. DeletedList = []
  199. for Member in MemberList:
  200. if Member["MemberStatus"] == 4: #被对方删除了
  201. DeletedList.append(Member["UserName"])
  202. ErrMsg = dic["BaseResponse"]["ErrMsg"]
  203. if len(ErrMsg) > 0:
  204. print ErrMsg
  205. return (ChatRoomName, DeletedList)
  206. def deleteMember(ChatRoomName, UserNames):
  207. url = base_uri + "/webwxupdatechatroom?fun=delmember&pass_ticket=%s" % (pass_ticket)
  208. params = {
  209. "BaseRequest": BaseRequest,
  210. "ChatRoomName": ChatRoomName,
  211. "DelMemberList": ",".join(UserNames),
  212. }
  213. request = urllib2.Request(url = url, data = json.dumps(params))
  214. request.add_header("ContentType", "application/json; charset=UTF-8")
  215. response = urllib2.urlopen(request)
  216. data = response.read()
  217. # print data
  218. dic = json.loads(data)
  219. ErrMsg = dic["BaseResponse"]["ErrMsg"]
  220. if len(ErrMsg) > 0:
  221. print ErrMsg
  222. Ret = dic["BaseResponse"]["Ret"]
  223. if Ret != 0:
  224. return False
  225. return True
  226. def addMember(ChatRoomName, UserNames):
  227. url = base_uri + "/webwxupdatechatroom?fun=addmember&pass_ticket=%s" % (pass_ticket)
  228. params = {
  229. "BaseRequest": BaseRequest,
  230. "ChatRoomName": ChatRoomName,
  231. "AddMemberList": ",".join(UserNames),
  232. }
  233. request = urllib2.Request(url = url, data = json.dumps(params))
  234. request.add_header("ContentType", "application/json; charset=UTF-8")
  235. response = urllib2.urlopen(request)
  236. data = response.read()
  237. # print data
  238. dic = json.loads(data)
  239. MemberList = dic["MemberList"]
  240. DeletedList = []
  241. for Member in MemberList:
  242. if Member["MemberStatus"] == 4: #被对方删除了
  243. DeletedList.append(Member["UserName"])
  244. ErrMsg = dic["BaseResponse"]["ErrMsg"]
  245. if len(ErrMsg) > 0:
  246. print ErrMsg
  247. return DeletedList
  248. def main():
  249. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
  250. urllib2.install_opener(opener)
  251. if getUUID() == False:
  252. print "获取uuid失败"
  253. return
  254. showQRImage()
  255. time.sleep(1)
  256. while waitForLogin() != "200":
  257. pass
  258. os.remove(QRImagePath)
  259. if login() == False:
  260. print "登录失败"
  261. return
  262. if webwxinit() == False:
  263. print "初始化失败"
  264. return
  265. MemberList = webwxgetcontact()
  266. MemberCount = len(MemberList)
  267. print "通讯录共%s位好友" % MemberCount
  268. ChatRoomName = ""
  269. result = []
  270. for i in xrange(0, int(math.ceil(MemberCount / float(MAX_GROUP_NUM)))):
  271. UserNames = []
  272. NickNames = []
  273. DeletedList = ""
  274. for j in xrange(0, MAX_GROUP_NUM):
  275. if i * MAX_GROUP_NUM + j >= MemberCount:
  276. break
  277. Member = MemberList[i * MAX_GROUP_NUM + j]
  278. UserNames.append(Member["UserName"])
  279. NickNames.append(Member["NickName"].encode("utf-8"))
  280. print "第%s组..." % (i + 1)
  281. print ", ".join(NickNames)
  282. print "回车键继续..."
  283. raw_input()
  284. # 新建群组/添加成员
  285. if ChatRoomName == "":
  286. (ChatRoomName, DeletedList) = createChatroom(UserNames)
  287. else:
  288. DeletedList = addMember(ChatRoomName, UserNames)
  289. DeletedCount = len(DeletedList)
  290. if DeletedCount > 0:
  291. result += DeletedList
  292. print "找到%s个被删好友" % DeletedCount
  293. # raw_input()
  294. # 删除成员
  295. deleteMember(ChatRoomName, UserNames)
  296. # todo 删除群组
  297. resultNames = []
  298. for Member in MemberList:
  299. if Member["UserName"] in result:
  300. NickName = Member["NickName"]
  301. if Member["RemarkName"] != "":
  302. NickName += "(%s)" % Member["RemarkName"]
  303. resultNames.append(NickName.encode("utf-8"))
  304. print "---------- 被删除的好友列表 ----------"
  305. print "
  306. ".join(resultNames)
  307. print "-----------------------------------"
  308. # windows下编码问题修复
  309. # http://blog.csdn.net/heyuxuanzee/article/details/8442718
  310. class UnicodeStreamFilter:
  311. def __init__(self, target):
  312. self.target = target
  313. self.encoding = "utf-8"
  314. self.errors = "replace"
  315. self.encode_to = self.target.encoding
  316. def write(self, s):
  317. if type(s) == str:
  318. s = s.decode("utf-8")
  319. s = s.encode(self.encode_to, self.errors).decode(self.encode_to)
  320. self.target.write(s)
  321. if sys.stdout.encoding == "cp936":
  322. sys.stdout = UnicodeStreamFilter(sys.stdout)
  323. if __name__ == "__main__" :
  324. print "本程序的查询结果可能会引起一些心理上的不适,请小心使用..."
  325. print "回车键继续..."
  326. raw_input()
  327. main()
  328. print "回车键结束"
  329. raw_input()
友尽

亲测有效,有 11 个删除我的「好友」,默默归类为 11 个相亲男,还有比我伤的更深的么?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45412.html

相关文章

  • 从零开始:微信小程序新手入门宝典《一》

    摘要:为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习一微信小程序的特点张小龙张小龙全面阐述小程序,推荐通读此文小程序是一种不需要下载安装即可使用的应用,它出现了触手可及的梦想,用户扫一扫或者搜一下即 为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习; 一:微信小程序的特点 张小龙:张小龙全面阐述小程...

    whataa 评论0 收藏0
  • 从零开始:微信小程序新手入门宝典《一》

    摘要:为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习一微信小程序的特点张小龙张小龙全面阐述小程序,推荐通读此文小程序是一种不需要下载安装即可使用的应用,它出现了触手可及的梦想,用户扫一扫或者搜一下即 为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习; 一:微信小程序的特点 张小龙:张小龙全面阐述小程...

    mdluo 评论0 收藏0
  • 从零开始:微信小程序新手入门宝典《一》

    摘要:为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习一微信小程序的特点张小龙张小龙全面阐述小程序,推荐通读此文小程序是一种不需要下载安装即可使用的应用,它出现了触手可及的梦想,用户扫一扫或者搜一下即 为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习; 一:微信小程序的特点 张小龙:张小龙全面阐述小程...

    LdhAndroid 评论0 收藏0
  • QQBot:基于SmartQQ协议的QQ机器人的简单使用

    摘要:一介绍是一个用实现的基于腾讯协议的简单机器人,可运行在和平台下,所有代码集成在一个文件中。三使用方法启动在命令行输入,或直接运行。操作机器人启动后,用另外一个向本发送消息即可操作。 一、介绍 QQBot 是一个用 python 实现的、基于腾讯 SmartQQ 协议的简单 QQ 机器人,可运行在 Linux 和 Windows 平台下,所有代码集成在一个 qqbot.py 文件中。 Q...

    RyanQ 评论0 收藏0

发表评论

0条评论

ziwenxie

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<