【プロジェクト実戦】私はどのように分析から微信ロボットを手書きにしたのか-登録編

6091 ワード

皆さんも微信を使っていると思いますし、web版微信の存在も知っていると思います.今日は、Web版の微信インタフェースをシミュレートして、全自動の微信ロボットを作る方法についてお話しします.本編はこの実戦プロジェクトの第1編で、上陸過程をどのように実現するかを主に述べている.全体の分析過程は実際にはhttps://res.wx.qq.com/a/wx_fed/webwx/res/static/js/index_4f3487a.js文書の解読である.
0 x 00論理図セット
1つのサイトを論理的に再現する前に、論理脳図を作成すると、プロセス全体がよりよく理解されます.考えを整理するのに役立ちます.
図セットの寸法
画像をよりきれいにするために、カッコ付きの内容、例えば【verb】を変数として表す.
さらに,論理路線をより明確にするために,次のような線を宣言して次の操作を区別する.
ログインロジック
次はmindnodeで描かれたウェブページの微信登録プロセスです.
セッションとは、このセッションを指し、プロセス全体で発生するset-cookieイベントを自動的に処理できます.
0 x 01プロセス分解
その後、web微信のログインプロセスを以下のいくつかのステップに分けます.
  • 1.Web微信のトップページ
  • を開く
  • 2.スキャンQRコード
  • 3.シミュレーションスキャンおよび確認プロセス
  • 4.ログイン完了
  • 5.ログイン後の情報取得
  • 0 x 02プロセスの詳細
    1.web微信のトップページを開く
    まず、スキャンのためにQRコードを取得する必要があります.Webリクエストプロセスを観察すると、https://login.weixin.qq.com/qrcode/【xxx】が実際のアドレスであることが分かった.一方、【xxx】の内容は、/jsloginに対する要求結果に依存する.
    キーワードjsloginを検索することによって、後続のすべてのリクエストに必要なパスを含む興味深いコンテンツを発見しました.現在の関連を含むAPI_jsLoginしたがって、この経路は以下のアドレスであり、末尾_のタイムスタンプは無視できることが分かった.
    https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN

    2.QRコード画像を取得するQRcodeを取得して印刷するプロセスをシミュレートします.
    import re
    from imgcat import imgcat
    import requests_html
    
    session = requests_html.HTMLSession()
    API_jsLogin = 'https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN'
    QR_code = 'https://login.weixin.qq.com/qrcode/{}'
    
    def get_qrcode_uid():
        resp = session.get(API_jsLogin)
        uid = re.split(r'"|";', resp.text)[1]
        print(f'uid is {uid}')
        return uid
    
    def get_qrcode_img(uid):
        resp = session.get(QR_code.format(uid))
        return imgcat(resp.content)
        
    uid = get_qrcode_uid()
    get_qrcode_img(uid)

    ここでは、imgcatを使用してコマンドラインに直接画像を表示します.このモジュールはmacにのみ適用されます.上記のコードをtestimg.pyという名前に書き込み、実行して以下の結果を得た.QRコードが正常に印刷されたことがわかります.
    3.アナログスキャン及び確認プロセス
    今、私たちはコードをスキャンしてログインしたのではないでしょうか.残念なことに、タイムアウト時間が25 のサイクル要求を開く必要があります.総サイクル時間は5 を超えず、成功するまでです.なぜかと聞かれる同級生もいるかもしれません.振り返って、これまでのプロセスアニメーションを観察してみましょう.QRコードを取得する前に、peddingのステータスが要求された.
    私たちが携帯電話の微信でスキャンを完了した瞬間、このリクエストは完了しました.要求が返されたコンテンツには、base64符号化された画像、すなわちあなたの顔が含まれています.
    次に、クライアントでログインを確認する操作を行います.リクエストプロセスを観察すると,傍受QRコードスキャンおよびログイン確認はほぼ同じリクエストであることが分かったので,シミュレーションのために次のコードを記述した.
    #     session   import
    mport execjs
    import time
    import base64
    
    API_login = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/login'
    API_check_login = 'https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login'
    
    def get_timestamp(reverse=False):
        if reverse:
            return execjs.eval("~new Date")
        return int(time.time() * 1e3)
            
    def login_wait(confirm = True):
        return session.get(
            API_check_login if confirm else API_login,
            params={
                "loginicon": "true",
                "uuid": uid,
                "tip": 0 if confirm else 1,
                "r": get_timestamp(True),
                "_": get_timestamp()
            },timeout=25)
            
    nums = 10
    while nums > 0:
        try:
            print("       ,    ", nums)
            res = login_wait()
            if "userAvatar" in res.text:
                print("      ")
                imgcat(base64.b64decode(re.findall("base64,(.*?)';", res.text)[0]))
                break
            nums -= 1
        except Exception as e:
            pass
        
    print("       ")
    redirect_uri = re.findall('redirect_uri="(.*?)"',login_wait(True).text)[0]
    print('    ',redirect_uri)

    上記のコードを実行した後.私たちは携帯電話のスキャナーで自分の顔と確認後にジャンプするurlを確認し、成功しました.
    4.ログイン完了redirect_uriを取得した後、必要な手形を取得するために直接アクセスし、結果は処理対象のxml形式の文字列である.シミュレーションおよび処理のために以下のコードを作成します.
    def get_auth_data(resp):
        return {
            key: resp.html.find(key)[0].text
            for key in ["skey", "wxsid", "wxuin", "pass_ticket", "isgrayscale"]
        }
    
    
    def get_ticket():
        resp = session.get(
            redirect_uri, params={"fun": "new", "lang": "zh_CN", "_": get_timestamp()}
        )
        print("Get Ticket:", requests_html.requests.utils.dict_from_cookiejar(resp.cookies))
        auth_data = get_auth_data(resp)
        session.cookies.update(
            requests_html.requests.utils.cookiejar_from_dict(
                {"last_wxuin": auth_data["wxuin"]}
            )
        )
        if list(filter(lambda item: item[1], auth_data.items())):
            return auth_data
    
    
    auth_data = get_ticket()

    今、私たちも手形情報を取得することに成功しました.ここの情報は、個人のライブ情報を取得するのに役立ちます.
    5.ログイン後の情報取得
    次に、次のリクエストの応答体には、私のニックネームS045pdが含まれています.つまり、ログインに成功し、現在の個人情報を取得しました.
    ここでは、直感的なフィールドをいくつか選択します.
  • ChatSet現在のメッセージオブジェクトIDのセットのいくつか(誰とチャットしているかtop 10)
  • ContactList現在のメッセージ・オブジェクトのセット数(誰と話していますかtop 10)
  • MemberListグループであればグループユーザリスト
  • である.
  • MPSubscribeMsgList公衆番号リスト
  • SKey重要なパラメータ
  • SyncKeyメッセージインタラクションの重要なパラメータ
  • SystemTimeシステム時間
  • Userユーザ情報
  • HeadImgUrl頭像
  • NickNameニックネーム
  • Sex性別
  • Signature個性署名
  • UserName現在のID

  • もちろんここで取得したのは基礎情報だけで、友达のリストはすべてではありません.次号では『Webot微信ロボットプロジェクト実戦【友達導出】』について書く.
    公衆番号のバックグラウンドでの返信: で、今回の文章で使用したコードを入手できます.
    完全なコードオープンソースプロジェクトへようこそ:Webot
    <br>.red {</p>
    <pre><code>color:red;</code></pre>
    <p>}<br>
    もっと素晴らしいのは公衆番号: Hunter