91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何找出微信上刪除你好友的人

發布時間:2021-08-05 15:08:34 來源:億速云 閱讀:145 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Python如何找出微信上刪除你好友的人,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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

答案是當然有,本人的微: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 os
import requests
import re
import time
import xml.dom.minidom
import json
import sys
import math
import subprocess
import ssl
import threading
 
DEBUG = False
 
MAX_GROUP_NUM = 2 # 每組人數
INTERFACE_CALLING_INTERVAL = 5 # 接口調用時間間隔, 間隔太短容易出現"操作太頻繁", 會被限制操作半小時左右
MAX_PROGRESS_LEN = 50
 
QRImagePath = os.path.join(os.getcwd(), 'qrcode.jpg')
 
tip = 0
uuid = ''
 
base_uri = ''
redirect_uri = ''
push_uri = ''
 
skey = ''
wxsid = ''
wxuin = ''
pass_ticket = ''
deviceId = 'e000000000000000'
 
BaseRequest = {}
 
ContactList = []
My = []
SyncKey = []
 
try:
  xrange
  range = xrange
except:
  # 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', 'webpush3.weixin.qq.com'),
      ('qq.com', 'webpush.weixin.qq.com'),
      ('web1.wechat.com', 'webpush2.wechat.com'),
      ('web2.wechat.com', 'webpush3.wechat.com'),
      ('wechat.com', 'webpush.wechat.com'),
      ('web1.wechatapp.com', 'webpush2.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()

關于“Python如何找出微信上刪除你好友的人”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

克东县| 洞头县| 襄城县| 兴山县| 平遥县| 濮阳市| 东阳市| 顺昌县| 鸡东县| 凉山| 中西区| 方城县| 沾益县| 武隆县| 芮城县| 南陵县| 白玉县| 山丹县| 应用必备| 美姑县| 洛隆县| 大姚县| 松桃| 勐海县| 彭州市| 开平市| 荣成市| 上蔡县| 苏州市| 满洲里市| 宝清县| 通道| 固始县| 张家港市| 陆良县| 滁州市| 观塘区| 九江市| 府谷县| 龙岩市| 普定县|