【プロジェクト実戦】私はどのように分析から微信ロボットを手書きにしたのか-登録編
6091 ワード
皆さんも微信を使っていると思いますし、web版微信の存在も知っていると思います.今日は、Web版の微信インタフェースをシミュレートして、全自動の微信ロボットを作る方法についてお話しします.本編はこの実戦プロジェクトの第1編で、上陸過程をどのように実現するかを主に述べている.全体の分析過程は実際には
0 x 00論理図セット
1つのサイトを論理的に再現する前に、論理脳図を作成すると、プロセス全体がよりよく理解されます.考えを整理するのに役立ちます.
図セットの寸法
画像をよりきれいにするために、カッコ付きの内容、例えば
さらに,論理路線をより明確にするために,次のような線を宣言して次の操作を区別する.
ログインロジック
次はmindnodeで描かれたウェブページの微信登録プロセスです.
セッションとは、このセッションを指し、プロセス全体で発生するset-cookieイベントを自動的に処理できます.
0 x 01プロセス分解
その後、web微信のログインプロセスを以下のいくつかのステップに分けます. 1.Web微信のトップページ を開く 2.スキャンQRコード 3.シミュレーションスキャンおよび確認プロセス 4.ログイン完了 5.ログイン後の情報取得 0 x 02プロセスの詳細
1.web微信のトップページを開く
まず、スキャンのためにQRコードを取得する必要があります.Webリクエストプロセスを観察すると、
キーワード
2.QRコード画像を取得する
ここでは、
3.アナログスキャン及び確認プロセス
今、私たちはコードをスキャンしてログインしたのではないでしょうか.残念なことに、タイムアウト時間が
私たちが携帯電話の微信でスキャンを完了した瞬間、このリクエストは完了しました.要求が返されたコンテンツには、
次に、クライアントでログインを確認する操作を行います.リクエストプロセスを観察すると,傍受QRコードスキャンおよびログイン確認はほぼ同じリクエストであることが分かったので,シミュレーションのために次のコードを記述した.
上記のコードを実行した後.私たちは携帯電話のスキャナーで自分の顔と確認後にジャンプするurlを確認し、成功しました.
4.ログイン完了
今、私たちも手形情報を取得することに成功しました.ここの情報は、個人のライブ情報を取得するのに役立ちます.
5.ログイン後の情報取得
次に、次のリクエストの応答体には、私のニックネーム
ここでは、直感的なフィールドをいくつか選択します. である.
もちろんここで取得したのは基礎情報だけで、友达のリストはすべてではありません.次号では『Webot微信ロボットプロジェクト実戦【友達導出】』について書く.
公衆番号のバックグラウンドでの返信:
完全なコードオープンソースプロジェクトへようこそ:Webot
<br>.red {</p>
<pre><code>color:red;</code></pre>
<p>}<br>
もっと素晴らしいのは公衆番号:
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微信のトップページを開く
まず、スキャンのために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