亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python找出微信上刪除你好友的人腳本寫法

2020-02-15 23:30:14
字體:
來源:轉載
供稿:網友

相信大家在微信上一定被上面的這段話刷過屏,群發消息應該算是微信上流傳最廣的找到刪除好友的方法了。但群發消息不僅僅會把通訊錄里面所有的好友騷擾一遍,而且你還得挨個刪除好幾百個聊天記錄,回復大家的疑問和鄙視。作為一個互聯網從業者,除了群發消息就不能有更高效、不打擾好友的方式么?

答案是當然有,本人的微:1613161916可以一起討論python,還有許多Python資料可以發送。

微信在拉好友進群聊的時候,如果這個人刪除了你好友的話,會提示你一下「請先發送朋友驗證申請給某某,對方將你加為微信朋友后,你才能邀請其加入群聊。」有辦法了,那我把微信好友拉一個大群里面,然后默默的刪掉微信群不就好了么。

于是 Github 上就有一位叫 0x5e 的開發者寫了這么一個 Python 腳本來代替你手動拉群和踢人。經過筆者測試,目前只能支持 Mac 的操作系統。在此之前,筆者在稀土掘金上先放出了Github的方法,這里再詳細提下。

在 0x5e 的 Github 代碼倉庫描述里面,他具體的實現步驟是用 Python 腳本處理網頁版微信的拉群、踢人操作。具體的步驟如下:

下載代碼文件 wdf.py 打開 Terminal 輸入:python 然后拖動剛才下載的 wdf.py 到 Terminal 窗后回車。命令格式類似: python wdf.py 接下來按步驟掃碼操作即可;

查詢結果可能會引起一些心理上的不適,請小心使用。

筆者測試了兩次,這個 Python 腳本還是有一些小問題,歡迎開發者們給原作者發 Pull Request 完善:

兩次結果稍有出入,可能是微信網頁版返回數據的問題 最終在微信會遺留一個只有自己的群組,需要手動刪除 此腳本暫時不支持查找被拉黑的情況

源碼

#!/usr/bin/env python# coding=utf-8 from __future__ import print_function import osimport requestsimport reimport timeimport xml.dom.minidomimport jsonimport sysimport mathimport subprocessimport sslimport threading DEBUG = False MAX_GROUP_NUM = 2 # 每組人數INTERFACE_CALLING_INTERVAL = 5 # 接口調用時間間隔, 間隔太短容易出現"操作太頻繁", 會被限制操作半小時左右MAX_PROGRESS_LEN = 50 QRImagePath = os.path.join(os.getcwd(), 'qrcode.jpg') tip = 0uuid = '' base_uri = ''redirect_uri = ''push_uri = '' skey = ''wxsid = ''wxuin = ''pass_ticket = ''deviceId = 'e000000000000000' BaseRequest = {} ContactList = []My = []SyncKey = [] try:  xrange  range = xrangeexcept:  # python 3  pass  def responseState(func, BaseResponse):  ErrMsg = BaseResponse['ErrMsg']  Ret = BaseResponse['Ret']  if DEBUG or Ret != 0:    print('func: %s, Ret: %d, ErrMsg: %s' % (func, Ret, ErrMsg))   if Ret != 0:    return False   return True   def getUUID():  global uuid   url = 'https://login.weixin.qq.com/jslogin'  params = {    'appid': 'wx782c26e4c19acffb',    'fun': 'new',    'lang': 'zh_CN',    '_': int(time.time()),  }   r= myRequests.get(url=url, params=params)  r.encoding = 'utf-8'  data = r.text   # 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()),  }   r = myRequests.get(url=url, params=params)   tip = 1   f = open(QRImagePath, 'wb')  f.write(r.content)  f.close()  time.sleep(1)   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, push_uri   url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s' % (    tip, uuid, int(time.time()))   r = myRequests.get(url=url)  r.encoding = 'utf-8'  data = r.text   # 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('/')]     # push_uri與base_uri對應關系(排名分先后)(就是這么奇葩..)    services = [      ('wx2.qq.com', 'webpush2.weixin.qq.com'),      ('qq.com', 'webpush.weixin.qq.com'),      ('web1.wechat.com', 'webpush1.wechat.com'),      ('web2.wechat.com', 'webpush2.wechat.com'),      ('wechat.com', 'webpush.wechat.com'),      ('web1.wechatapp.com', 'webpush1.wechatapp.com'),    ]    push_uri = base_uri    for (searchUrl, pushUrl) in services:      if base_uri.find(searchUrl) >= 0:        push_uri = 'https://%s/cgi-bin/mmwebwx-bin' % pushUrl        break     # closeQRImage    if sys.platform.find('darwin') >= 0: # for OSX with Preview      os.system("osascript -e 'quit app /"Preview/"'")  elif code == '408': # 超時    pass  # elif code == '400' or code == '500':   return code  def login():  global skey, wxsid, wxuin, pass_ticket, BaseRequest   r = myRequests.get(url=redirect_uri)  r.encoding = 'utf-8'  data = r.text   # print(data)   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 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 }  headers = {'content-type': 'application/json; charset=UTF-8'}   r = myRequests.post(url=url, data=json.dumps(params),headers=headers)  r.encoding = 'utf-8'  data = r.json()   if DEBUG:    f = open(os.path.join(os.getcwd(), 'webwxinit.json'), 'wb')    f.write(r.content)    f.close()    # print(data)   global ContactList, My, SyncKey  dic = data  ContactList = dic['ContactList']  My = dic['User']  SyncKey = dic['SyncKey']   state = responseState('webwxinit', dic['BaseResponse'])  return state  def webwxgetcontact():   url = (base_uri +     '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % (      pass_ticket, skey, int(time.time())) )  headers = {'content-type': 'application/json; charset=UTF-8'}    r = myRequests.post(url=url,headers=headers)  r.encoding = 'utf-8'  data = r.json()   if DEBUG:    f = open(os.path.join(os.getcwd(), 'webwxgetcontact.json'), 'wb')    f.write(r.content)    f.close()   # print(data)   dic = 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 = [{'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': '',  }  headers = {'content-type': 'application/json; charset=UTF-8'}   r = myRequests.post(url=url, data=json.dumps(params),headers=headers)  r.encoding = 'utf-8'  data = r.json()   # print(data)   dic = data  ChatRoomName = dic['ChatRoomName']  MemberList = dic['MemberList']  DeletedList = []  BlockedList = []  for Member in MemberList:    if Member['MemberStatus'] == 4: # 被對方刪除了      DeletedList.append(Member['UserName'])    elif Member['MemberStatus'] == 3: # 被加入黑名單      BlockedList.append(Member['UserName'])   state = responseState('createChatroom', dic['BaseResponse'])   return ChatRoomName, DeletedList, BlockedList  def deleteMember(ChatRoomName, UserNames):  url = (base_uri +     '/webwxupdatechatroom?fun=delmember&pass_ticket=%s' % (pass_ticket) )  params = {    'BaseRequest': BaseRequest,    'ChatRoomName': ChatRoomName,    'DelMemberList': ','.join(UserNames),  }  headers = {'content-type': 'application/json; charset=UTF-8'}   r = myRequests.post(url=url, data=json.dumps(params),headers=headers)  r.encoding = 'utf-8'  data = r.json()   # print(data)   dic = data   state = responseState('deleteMember', dic['BaseResponse'])  return state  def addMember(ChatRoomName, UserNames):  url = (base_uri +     '/webwxupdatechatroom?fun=addmember&pass_ticket=%s' % (pass_ticket) )  params = {    'BaseRequest': BaseRequest,    'ChatRoomName': ChatRoomName,    'AddMemberList': ','.join(UserNames),  }  headers = {'content-type': 'application/json; charset=UTF-8'}   r = myRequests.post(url=url, data=json.dumps(params),headers=headers)  r.encoding = 'utf-8'  data = r.json()   # print(data)   dic = data  MemberList = dic['MemberList']  DeletedList = []  BlockedList = []  for Member in MemberList:    if Member['MemberStatus'] == 4: # 被對方刪除了      DeletedList.append(Member['UserName'])    elif Member['MemberStatus'] == 3: # 被加入黑名單      BlockedList.append(Member['UserName'])   state = responseState('addMember', dic['BaseResponse'])   return DeletedList, BlockedList  def syncKey():  SyncKeyItems = ['%s_%s' % (item['Key'], item['Val'])          for item in SyncKey['List']]  SyncKeyStr = '|'.join(SyncKeyItems)  return SyncKeyStr  def syncCheck():  url = push_uri + '/synccheck?'  params = {    'skey': BaseRequest['Skey'],    'sid': BaseRequest['Sid'],    'uin': BaseRequest['Uin'],    'deviceId': BaseRequest['DeviceID'],    'synckey': syncKey(),    'r': int(time.time()),  }   r = myRequests.get(url=url,params=params)  r.encoding = 'utf-8'  data = r.text   # print(data)   # window.synccheck={retcode:"0",selector:"2"}  regx = r'window.synccheck={retcode:"(/d+)",selector:"(/d+)"}'  pm = re.search(regx, data)   retcode = pm.group(1)  selector = pm.group(2)   return selector  def webwxsync():  global SyncKey   url = base_uri + '/webwxsync?lang=zh_CN&skey=%s&sid=%s&pass_ticket=%s' % (    BaseRequest['Skey'], BaseRequest['Sid'], quote_plus(pass_ticket))  params = {    'BaseRequest': BaseRequest,    'SyncKey': SyncKey,    'rr': ~int(time.time()),  }  headers = {'content-type': 'application/json; charset=UTF-8'}   r = myRequests.post(url=url, data=json.dumps(params))  r.encoding = 'utf-8'  data = r.json()   # print(data)   dic = data  SyncKey = dic['SyncKey']   state = responseState('webwxsync', dic['BaseResponse'])  return state  def heartBeatLoop():  while True:    selector = syncCheck()    if selector != '0':      webwxsync()    time.sleep(1)  def main():  global myRequests   if hasattr(ssl, '_create_unverified_context'):    ssl._create_default_https_context = ssl._create_unverified_context   headers = {'User-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36'}  myRequests = requests.Session()  myRequests.headers.update(headers)    if not getUUID():    print('獲取uuid失敗')    return   print('正在獲取二維碼圖片...')  showQRImage()   while waitForLogin() != '200':    pass   os.remove(QRImagePath)   if not login():    print('登錄失敗')    return   if not webwxinit():    print('初始化失敗')    return   MemberList = webwxgetcontact()   print('開啟心跳線程')  threading.Thread(target=heartBeatLoop)   MemberCount = len(MemberList)  print('通訊錄共%s位好友' % MemberCount)   ChatRoomName = ''  result = []  d = {}  for Member in MemberList:    d[Member['UserName']] = (Member['NickName'], Member['RemarkName'])  print('開始查找...')  group_num = int(math.ceil(MemberCount / float(MAX_GROUP_NUM)))  for i in range(0, group_num):    UserNames = []    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'])     # 新建群組/添加成員    if ChatRoomName == '':      (ChatRoomName, DeletedList, BlockedList) = createChatroom(        UserNames)    else:      (DeletedList, BlockedList) = addMember(ChatRoomName, UserNames)     # todo BlockedList 被拉黑列表     DeletedCount = len(DeletedList)    if DeletedCount > 0:      result += DeletedList     # 刪除成員    deleteMember(ChatRoomName, UserNames)     # 進度條    progress = MAX_PROGRESS_LEN * (i + 1) / group_num    print('[', '#' * int(progress), '-' * int(MAX_PROGRESS_LEN - progress), ']', end=' ')    print('新發現你被%d人刪除' % DeletedCount)    for i in range(DeletedCount):      if d[DeletedList[i]][1] != '':        print('%s(%s)' % (d[DeletedList[i]][0],d[DeletedList[i]][1]))      else:        print(d[DeletedList[i]][0])     if i != group_num - 1:      print('正在繼續查找,請耐心等待...')      # 下一次進行接口調用需要等待的時間      time.sleep(INTERFACE_CALLING_INTERVAL)  # todo 刪除群組   print('/n結果匯總完畢,20s后可重試...')  resultNames = []  for r in result:    if d[r][1] != '':      resultNames.append('%s(%s)' % (d[r][0],d[r][1]))    else:      resultNames.append(d[r][0])   print('---------- 被刪除的好友列表(共%d人) ----------' % len(result))  # 過濾emoji  resultNames = list(map(lambda x: re.sub(r'<span.+/span>', '', x), resultNames))  if len(resultNames):    print('/n'.join(resultNames))  else:    print("無")  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:      try:        s = s.decode('utf-8')      except:        pass    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('1小時內只能使用一次,否則會因操作繁忙阻止建群')  main()  print('回車鍵退出...')  input()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
九九热r在线视频精品| 国产精品女主播| 欧美成人在线免费视频| 欧美精品videosex性欧美| 日韩中文视频免费在线观看| 国产精品网站大全| 国产精品成人va在线观看| 日韩成人av一区| 欧美日韩另类在线| 亚洲欧美另类人妖| 亚洲精品资源美女情侣酒店| 久色乳综合思思在线视频| 亚洲激情小视频| 国产成人aa精品一区在线播放| 亚洲最大激情中文字幕| 欧美成人午夜影院| 操日韩av在线电影| 亚洲综合中文字幕在线观看| 亚洲乱码国产乱码精品精| 久久精品国产亚洲| 国产成人精品日本亚洲专区61| 亚洲国产日韩一区| 亚洲精品aⅴ中文字幕乱码| 色综合91久久精品中文字幕| 日韩亚洲欧美成人| 97久久精品人搡人人玩| 97免费在线视频| 欧美成人免费全部| 国产精品普通话| 欧美在线观看日本一区| 国产在线观看91精品一区| 美女精品视频一区| 日韩一区二区久久久| 国产网站欧美日韩免费精品在线观看| 亚洲国产成人久久综合| 亚洲a成v人在线观看| 亚洲电影成人av99爱色| 欧美日韩国产色| 欧美国产日韩一区二区在线观看| 国产欧美日韩最新| 高清亚洲成在人网站天堂| 国内精品久久久久影院 日本资源| 日韩欧亚中文在线| 麻豆乱码国产一区二区三区| 色妞色视频一区二区三区四区| 亚洲第一天堂av| 欧美激情在线狂野欧美精品| 亚洲第一色中文字幕| 成人免费视频在线观看超级碰| 日韩成人在线视频观看| 亚洲国产成人在线视频| 精品一区二区亚洲| 日本一欧美一欧美一亚洲视频| 成人在线国产精品| 亚洲精品av在线播放| 91国内产香蕉| 国产精品白丝av嫩草影院| 国产成人精品视| 啪一啪鲁一鲁2019在线视频| 国产最新精品视频| 亚洲欧美自拍一区| 国产精品视频资源| 91精品在线影院| 色婷婷av一区二区三区在线观看| 国产精品狼人色视频一区| 国产一区二区三区视频在线观看| 亚洲最新av在线| 在线亚洲国产精品网| 亚洲第一精品电影| 国产精品日韩欧美大师| 国产欧美一区二区三区在线| 精品性高朝久久久久久久| 国产欧美 在线欧美| 91精品国产色综合久久不卡98口| www.久久久久久.com| 国产成人av在线| 欧美一级片在线播放| 日韩高清电影免费观看完整| 欧美在线视频观看| 45www国产精品网站| 国产精品日韩在线| 奇米4444一区二区三区| 亚洲日韩欧美视频一区| 欧美日本啪啪无遮挡网站| 久久香蕉国产线看观看av| 亚洲片在线资源| 日本老师69xxx| 日韩在线观看免费高清| 草民午夜欧美限制a级福利片| 久久精品99久久久久久久久| 亚洲国产成人久久综合一区| 久久久91精品国产| 欧美第一淫aaasss性| 国产精品成人va在线观看| 日韩精品在线免费观看视频| 国产亚洲欧洲黄色| 日韩精品视频在线免费观看| 亚洲成人999| 亚洲免费福利视频| 久久久噜噜噜久久| 高清欧美电影在线| 日韩av电影在线网| 国产精品视频yy9099| 日韩在线观看免费| 久久成人这里只有精品| 国产精品99蜜臀久久不卡二区| 国产激情视频一区| 欧美中文字幕精品| 欧美日韩国产二区| 欧美精品福利在线| 久久久久国产精品www| 亚洲理论在线a中文字幕| 色综合久久悠悠| 亚洲日本中文字幕免费在线不卡| 日韩激情av在线免费观看| 日本亚洲欧洲色α| 亚洲欧美日韩国产精品| 精品国产一区二区三区久久狼黑人| 国产日本欧美视频| 国产91精品青草社区| 欧美大片在线免费观看| 欧美夫妻性视频| 91久久久久久久久| 日韩欧美第一页| 亚洲国产精品成人精品| 亚洲免费伊人电影在线观看av| 欧美电影在线免费观看网站| 国产综合久久久久久| 综合136福利视频在线| 亚洲aⅴ日韩av电影在线观看| 久久精品亚洲热| 激情成人在线视频| 国产不卡一区二区在线播放| 国产精品pans私拍| 成人免费激情视频| 国产精品青青在线观看爽香蕉| 欧美天天综合色影久久精品| 亚洲午夜av电影| 国产视频久久久| 国产精品高精视频免费| 国产欧美一区二区三区久久| 欧美激情欧美激情| 久久人人爽人人爽人人片av高请| 国产成人免费91av在线| 国产激情综合五月久久| 亚洲国产日韩欧美在线动漫| 成人黄色中文字幕| 亚洲国产精品中文| 日韩最新中文字幕电影免费看| 久久中文久久字幕| 欧美xxxx综合视频| 亚洲剧情一区二区| 美女啪啪无遮挡免费久久网站| 538国产精品一区二区在线| 欧美亚洲成人网| 亚洲2020天天堂在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 中文字幕亚洲在线| 亚洲无限乱码一二三四麻| 欧美性猛xxx| 亚洲日本成人女熟在线观看| 日韩福利伦理影院免费| 亚洲欧美三级在线| 国产999精品视频|