ホームページ バックエンド開発 Python チュートリアル PythonでWeChatの友達が自分自身を削除したかどうかを確認する方法

PythonでWeChatの友達が自分自身を削除したかどうかを確認する方法

Mar 30, 2017 pm 02:30 PM

この記事の例では、Python で WeChat の友達を削除するための具体的なコードを共有します。具体的な内容は次のとおりです

#weixin.py
#coding:utf-8
# !/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 # 每组人数

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 '请使用微信扫描二维码以登录'

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 '成功扫描,请在手机上点击确认以登录'
    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 = 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;]

  # 倒序遍历,不然删除的时候出问题..
  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: # 公众号/服务号
      MemberList.remove(Member)
    elif Member[&#39;UserName&#39;] in SpecialUsers: # 特殊账号
      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: # 被对方删除了
      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: # 被对方删除了
      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;回车键继续...&#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个被删好友&#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下编码问题修复
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;本程序的查询结果可能会引起一些心理上的不适,请小心使用...&#39;
  print &#39;回车键继续...&#39;
  raw_input()

  main()

  print &#39;回车键结束&#39;
  raw_input()
ログイン後にコピー

以上がPythonでWeChatの友達が自分自身を削除したかどうかを確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PythonインタープリターはLinuxシステムで削除できますか? PythonインタープリターはLinuxシステムで削除できますか? Apr 02, 2025 am 07:00 AM

Linux Systemsに付属するPythonインタープリターを削除する問題に関して、多くのLinuxディストリビューションは、インストール時にPythonインタープリターをプリインストールし、パッケージマネージャーを使用しません...

Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか? Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか? Apr 02, 2025 am 07:12 AM

Python 3.6のピクルスファイルのロードレポートエラー:modulenotFounderror:nomodulenamed ...

Debian文字列は、複数のブラウザと互換性があります Debian文字列は、複数のブラウザと互換性があります Apr 02, 2025 am 08:30 AM

「DebianStrings」は標準的な用語ではなく、その特定の意味はまだ不明です。この記事は、ブラウザの互換性について直接コメントすることはできません。ただし、「DebianStrings」がDebianシステムで実行されているWebアプリケーションを指す場合、そのブラウザの互換性はアプリケーション自体の技術アーキテクチャに依存します。ほとんどの最新のWebアプリケーションは、クロスブラウザーの互換性に取り組んでいます。これは、次のWeb標準と、適切に互換性のあるフロントエンドテクノロジー(HTML、CSS、JavaScriptなど)およびバックエンドテクノロジー(PHP、Python、Node.jsなど)を使用することに依存しています。アプリケーションが複数のブラウザと互換性があることを確認するには、開発者がクロスブラウザーテストを実施し、応答性を使用する必要があることがよくあります

XMLの変更にはプログラミングが必要ですか? XMLの変更にはプログラミングが必要ですか? Apr 02, 2025 pm 06:51 PM

XMLコンテンツを変更するには、ターゲットノードの正確な検出が必要であるため、プログラミングが必要です。プログラミング言語には、XMLを処理するための対応するライブラリがあり、APIを提供して、データベースの運用などの安全で効率的で制御可能な操作を実行します。

携帯電話でXMLをPDFに変換するとき、変換速度は高速ですか? 携帯電話でXMLをPDFに変換するとき、変換速度は高速ですか? Apr 02, 2025 pm 10:09 PM

Mobile XMLからPDFへの速度は、次の要因に依存します。XML構造の複雑さです。モバイルハードウェア構成変換方法(ライブラリ、アルゴリズム)コードの品質最適化方法(効率的なライブラリ、アルゴリズムの最適化、キャッシュデータ、およびマルチスレッドの利用)。全体として、絶対的な答えはなく、特定の状況に従って最適化する必要があります。

XMLのコメントコンテンツを変更する方法 XMLのコメントコンテンツを変更する方法 Apr 02, 2025 pm 06:15 PM

小さなXMLファイルの場合、注釈コンテンツをテキストエディターに直接置き換えることができます。大きなファイルの場合、XMLパーサーを使用してそれを変更して、効率と精度を確保することをお勧めします。 XMLコメントを削除するときは注意してください。コメントを維持すると、通常、コードの理解とメンテナンスが役立ちます。高度なヒントは、XMLパーサーを使用してコメントを変更するためのPythonサンプルコードを提供しますが、特定の実装を使用するXMLライブラリに従って調整する必要があります。 XMLファイルを変更する際のエンコード問題に注意してください。 UTF-8エンコードを使用して、エンコード形式を指定することをお勧めします。

XMLをPDFに変換できるモバイルアプリはありますか? XMLをPDFに変換できるモバイルアプリはありますか? Apr 02, 2025 pm 08:54 PM

XMLをPDFに直接変換するアプリケーションは、2つの根本的に異なる形式であるため、見つかりません。 XMLはデータの保存に使用され、PDFはドキュメントを表示するために使用されます。変換を完了するには、PythonやReportLabなどのプログラミング言語とライブラリを使用して、XMLデータを解析してPDFドキュメントを生成できます。

Protobufおよび関連文字列定数の列挙タイプを定義する方法は? Protobufおよび関連文字列定数の列挙タイプを定義する方法は? Apr 02, 2025 pm 03:36 PM

Protobufの文字列定数列挙を定義する問題Protobufを使用する場合、列挙タイプを文字列定数に関連付ける必要がある状況に遭遇することがよくあります...

See all articles