国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Rumah applet WeChat pembangunan WeChat 微信開發(fā)之如何用腳本查看是否被微信好友刪除

微信開發(fā)之如何用腳本查看是否被微信好友刪除

Mar 11, 2017 pm 02:22 PM

這篇文章主要介紹了微信 ?用腳本查看是否被微信好友刪除的相關(guān)資料,需要的朋友可以參考下

某日,一同學(xué)給小的發(fā)了 Github 源碼,說是可以輕松查到刪除自己的微信好友,于是就開始了作死之路。

Github 源碼請(qǐng)看:0x5e/wechat-deleted-friends

前言

相信各位一定有收到過這樣的群發(fā)短信,據(jù)說還被歸類為玩轉(zhuǎn)微信的五大技巧之一╮(╯▽╰)╭但,其實(shí),只要跑一下腳本,就輕松找出刪除自己的好友(輕松摔碎玻璃心,逃

GitHub:開源怪我咯?

原理

新建群組,如果加不進(jìn)來就是被刪好友了(不要在群組里講話,別人是看不見的)。

用的是微信網(wǎng)頁版的接口,還有些小問題,不過現(xiàn)在結(jié)果好像有疏漏一小部分,原因不明……也沒試過被拉黑的情況。最終會(huì)遺留下一個(gè)只有自己的群組,需要手工刪一下。

方法

下載 python 腳本,跑一下。啟動(dòng) Terminal,切到文件目錄下:

python wdf.py

代碼如下


#!/usr/bin/env python
# coding=utf-8

import os
import urllib, urllib2
import re
import cookielib
import time
import xml.dom.minidom
import json
import sys
import math

DEBUG = False

MAX_GROUP_NUM = 35 # 每組人數(shù)

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 uuid

  url = '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 True

  return False

def showQRImage():
  global tip

  url = 'https://login.weixin.qq.com/qrcode/' + uuid
  params = {
    't': 'webwx',
    '_': int(time.time()),
  }

  request = urllib2.Request(url = url, data = urllib.urlencode(params))
  response = urllib2.urlopen(request)

  tip = 1

  f = 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 '請(qǐng)使用微信掃描二維碼以登錄'

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 = 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 '成功掃描,請(qǐng)?jiān)谑謾C(jī)上點(diǎn)擊確認(rèn)以登錄'
    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': #超時(shí)
    pass
  # elif code == '400' or code == '500':

  return code

def login():
  global skey, wxsid, wxuin, pass_ticket, BaseRequest

  request = urllib2.Request(url = redirect_uri)
  response = urllib2.urlopen(request)
  data = response.read()

  # 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>
  &#39;&#39;&#39;

  doc = xml.dom.minidom.parseString(data)
  root = doc.documentElement

  for node in root.childNodes:
    if node.nodeName == &#39;skey&#39;:
      skey = node.childNodes[0].data
    elif node.nodeName == &#39;wxsid&#39;:
      wxsid = node.childNodes[0].data
    elif node.nodeName == &#39;wxuin&#39;:
      wxuin = node.childNodes[0].data
    elif node.nodeName == &#39;pass_ticket&#39;:
      pass_ticket = node.childNodes[0].data

  # print &#39;skey: %s, wxsid: %s, wxuin: %s, pass_ticket: %s&#39; % (skey, wxsid, wxuin, pass_ticket)

  if skey == &#39;&#39; or wxsid == &#39;&#39; or wxuin == &#39;&#39; or pass_ticket == &#39;&#39;:
    return False

  BaseRequest = {
    &#39;Uin&#39;: int(wxuin),
    &#39;Sid&#39;: wxsid,
    &#39;Skey&#39;: skey,
    &#39;DeviceID&#39;: deviceId,
  }

  return True

def webwxinit():

  url = base_uri + &#39;/webwxinit?pass_ticket=%s&skey=%s&r=%s&#39; % (pass_ticket, skey, int(time.time()))
  params = {
    &#39;BaseRequest&#39;: BaseRequest
  }

  request = urllib2.Request(url = url, data = json.dumps(params))
  request.add_header(&#39;ContentType&#39;, &#39;application/json; charset=UTF-8&#39;)
  response = urllib2.urlopen(request)
  data = response.read()

  if DEBUG == True:
    f = open(os.getcwd() + &#39;/webwxinit.json&#39;, &#39;wb&#39;)
    f.write(data)
    f.close()

  # print data

  global ContactList, My
  dic = json.loads(data)
  ContactList = dic[&#39;ContactList&#39;]
  My = dic[&#39;User&#39;]

  ErrMsg = dic[&#39;BaseResponse&#39;][&#39;ErrMsg&#39;]
  if len(ErrMsg) > 0:
    print ErrMsg

  Ret = dic[&#39;BaseResponse&#39;][&#39;Ret&#39;]
  if Ret != 0:
    return False
    
  return True

def webwxgetcontact():
  
  url = base_uri + &#39;/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s&#39; % (pass_ticket, skey, int(time.time()))

  request = urllib2.Request(url = url)
  request.add_header(&#39;ContentType&#39;, &#39;application/json; charset=UTF-8&#39;)
  response = urllib2.urlopen(request)
  data = response.read()

  if DEBUG == True:
    f = open(os.getcwd() + &#39;/webwxgetcontact.json&#39;, &#39;wb&#39;)
    f.write(data)
    f.close()

  # print data

  dic = json.loads(data)
  MemberList = dic[&#39;MemberList&#39;]

  # 倒序遍歷,不然刪除的時(shí)候出問題..
  SpecialUsers = [&#39;newsapp&#39;, &#39;fmessage&#39;, &#39;filehelper&#39;, &#39;weibo&#39;, &#39;qqmail&#39;, &#39;fmessage&#39;, &#39;tmessage&#39;, &#39;qmessage&#39;, &#39;qqsync&#39;, &#39;floatbottle&#39;, &#39;lbsapp&#39;, &#39;shakeapp&#39;, &#39;medianote&#39;, &#39;qqfriend&#39;, &#39;readerapp&#39;, &#39;blogapp&#39;, &#39;facebookapp&#39;, &#39;masssendapp&#39;, &#39;meishiapp&#39;, &#39;feedsapp&#39;, &#39;voip&#39;, &#39;blogappweixin&#39;, &#39;weixin&#39;, &#39;brandsessionholder&#39;, &#39;weixinreminder&#39;, &#39;wxid_novlwrv3lqwv11&#39;, &#39;gh_22b87fa7cb3c&#39;, &#39;officialaccounts&#39;, &#39;notification_messages&#39;, &#39;wxid_novlwrv3lqwv11&#39;, &#39;gh_22b87fa7cb3c&#39;, &#39;wxitil&#39;, &#39;userexperience_alarm&#39;, &#39;notification_messages&#39;]
  for i in xrange(len(MemberList) - 1, -1, -1):
    Member = MemberList[i]
    if Member[&#39;VerifyFlag&#39;] & 8 != 0: # 公眾號(hào)/服務(wù)號(hào)
      MemberList.remove(Member)
    elif Member[&#39;UserName&#39;] in SpecialUsers: # 特殊賬號(hào)
      MemberList.remove(Member)
    elif Member[&#39;UserName&#39;].find(&#39;@@&#39;) != -1: # 群聊
      MemberList.remove(Member)
    elif Member[&#39;UserName&#39;] == My[&#39;UserName&#39;]: # 自己
      MemberList.remove(Member)

  return MemberList

def createChatroom(UserNames):
  MemberList = []
  for UserName in UserNames:
    MemberList.append({&#39;UserName&#39;: UserName})


  url = base_uri + &#39;/webwxcreatechatroom?pass_ticket=%s&r=%s&#39; % (pass_ticket, int(time.time()))
  params = {
    &#39;BaseRequest&#39;: BaseRequest,
    &#39;MemberCount&#39;: len(MemberList),
    &#39;MemberList&#39;: MemberList,
    &#39;Topic&#39;: &#39;&#39;,
  }

  request = urllib2.Request(url = url, data = json.dumps(params))
  request.add_header(&#39;ContentType&#39;, &#39;application/json; charset=UTF-8&#39;)
  response = urllib2.urlopen(request)
  data = response.read()

  # print data

  dic = json.loads(data)
  ChatRoomName = dic[&#39;ChatRoomName&#39;]
  MemberList = dic[&#39;MemberList&#39;]
  DeletedList = []
  for Member in MemberList:
    if Member[&#39;MemberStatus&#39;] == 4: #被對(duì)方刪除了
      DeletedList.append(Member[&#39;UserName&#39;])

  ErrMsg = dic[&#39;BaseResponse&#39;][&#39;ErrMsg&#39;]
  if len(ErrMsg) > 0:
    print ErrMsg

  return (ChatRoomName, DeletedList)

def deleteMember(ChatRoomName, UserNames):
  url = base_uri + &#39;/webwxupdatechatroom?fun=delmember&pass_ticket=%s&#39; % (pass_ticket)
  params = {
    &#39;BaseRequest&#39;: BaseRequest,
    &#39;ChatRoomName&#39;: ChatRoomName,
    &#39;DelMemberList&#39;: &#39;,&#39;.join(UserNames),
  }

  request = urllib2.Request(url = url, data = json.dumps(params))
  request.add_header(&#39;ContentType&#39;, &#39;application/json; charset=UTF-8&#39;)
  response = urllib2.urlopen(request)
  data = response.read()

  # print data

  dic = json.loads(data)
  ErrMsg = dic[&#39;BaseResponse&#39;][&#39;ErrMsg&#39;]
  if len(ErrMsg) > 0:
    print ErrMsg

  Ret = dic[&#39;BaseResponse&#39;][&#39;Ret&#39;]
  if Ret != 0:
    return False
    
  return True

def addMember(ChatRoomName, UserNames):
  url = base_uri + &#39;/webwxupdatechatroom?fun=addmember&pass_ticket=%s&#39; % (pass_ticket)
  params = {
    &#39;BaseRequest&#39;: BaseRequest,
    &#39;ChatRoomName&#39;: ChatRoomName,
    &#39;AddMemberList&#39;: &#39;,&#39;.join(UserNames),
  }

  request = urllib2.Request(url = url, data = json.dumps(params))
  request.add_header(&#39;ContentType&#39;, &#39;application/json; charset=UTF-8&#39;)
  response = urllib2.urlopen(request)
  data = response.read()

  # print data

  dic = json.loads(data)
  MemberList = dic[&#39;MemberList&#39;]
  DeletedList = []
  for Member in MemberList:
    if Member[&#39;MemberStatus&#39;] == 4: #被對(duì)方刪除了
      DeletedList.append(Member[&#39;UserName&#39;])

  ErrMsg = dic[&#39;BaseResponse&#39;][&#39;ErrMsg&#39;]
  if len(ErrMsg) > 0:
    print ErrMsg

  return DeletedList

def main():

  opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
  urllib2.install_opener(opener)
  
  if getUUID() == False:
    print &#39;獲取uuid失敗&#39;
    return

  showQRImage()
  time.sleep(1)

  while waitForLogin() != &#39;200&#39;:
    pass

  os.remove(QRImagePath)

  if login() == False:
    print &#39;登錄失敗&#39;
    return

  if webwxinit() == False:
    print &#39;初始化失敗&#39;
    return

  MemberList = webwxgetcontact()

  MemberCount = len(MemberList)
  print &#39;通訊錄共%s位好友&#39; % MemberCount

  ChatRoomName = &#39;&#39;
  result = []
  for i in xrange(0, int(math.ceil(MemberCount / float(MAX_GROUP_NUM)))):
    UserNames = []
    NickNames = []
    DeletedList = &#39;&#39;
    for j in xrange(0, MAX_GROUP_NUM):
      if i * MAX_GROUP_NUM + j >= MemberCount:
        break

      Member = MemberList[i * MAX_GROUP_NUM + j]
      UserNames.append(Member[&#39;UserName&#39;])
      NickNames.append(Member[&#39;NickName&#39;].encode(&#39;utf-8&#39;))
            
    print &#39;第%s組...&#39; % (i + 1)
    print &#39;, &#39;.join(NickNames)
    print &#39;回車鍵繼續(xù)...&#39;
    raw_input()

    # 新建群組/添加成員
    if ChatRoomName == &#39;&#39;:
      (ChatRoomName, DeletedList) = createChatroom(UserNames)
    else:
      DeletedList = addMember(ChatRoomName, UserNames)

    DeletedCount = len(DeletedList)
    if DeletedCount > 0:
      result += DeletedList

    print &#39;找到%s個(gè)被刪好友&#39; % DeletedCount
    # raw_input()

    # 刪除成員
    deleteMember(ChatRoomName, UserNames)

  # todo 刪除群組


  resultNames = []
  for Member in MemberList:
    if Member[&#39;UserName&#39;] in result:
      NickName = Member[&#39;NickName&#39;]
      if Member[&#39;RemarkName&#39;] != &#39;&#39;:
        NickName += &#39;(%s)&#39; % Member[&#39;RemarkName&#39;]
      resultNames.append(NickName.encode(&#39;utf-8&#39;))

  print &#39;---------- 被刪除的好友列表 ----------&#39;
  print &#39;\n&#39;.join(resultNames)
  print &#39;-----------------------------------&#39;

# windows下編碼問題修復(fù)
# http://m.miracleart.cn/
class UnicodeStreamFilter: 
  def __init__(self, target): 
    self.target = target 
    self.encoding = &#39;utf-8&#39; 
    self.errors = &#39;replace&#39; 
    self.encode_to = self.target.encoding 
  def write(self, s): 
    if type(s) == str: 
      s = s.decode(&#39;utf-8&#39;) 
    s = s.encode(self.encode_to, self.errors).decode(self.encode_to) 
    self.target.write(s) 
     
if sys.stdout.encoding == &#39;cp936&#39;: 
  sys.stdout = UnicodeStreamFilter(sys.stdout)

if __name__ == &#39;__main__&#39; :

  print &#39;本程序的查詢結(jié)果可能會(huì)引起一些心理上的不適,請(qǐng)小心使用...&#39;
  print &#39;回車鍵繼續(xù)...&#39;
  raw_input()

  main()

  print &#39;回車鍵結(jié)束&#39;
  raw_input()

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

Atas ialah kandungan terperinci 微信開發(fā)之如何用腳本查看是否被微信好友刪除. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276