この記事では、Python で Weibo ログインをシミュレートする方法 (コード付き) を紹介します。一定の参考値があります。困っている友達は参考にしてください。お役に立てれば幸いです。あなた、助けます。
今日は、いくつかの隠された秘密を満たすために、Weibo の個人ページをクロールするためのツールを作成したいと思います。それなら、そのやらなければいけないことを最初にやろう!シミュレートされたログイン...
コードを最適化し、Python 3.6 バージョンにリファクタリングし、全員が学習しやすいように多くのコメントを追加しました。
PC で Sina Weibo にログインする場合、ユーザー名とパスワードはクライアントで js を使用して事前に暗号化され、一連のパラメーターが POST の前に GET され、これはとしても使用されます。 POST_DATA の一部。このように、通常の単純な方法 (Renren など) を使用して POST ログインをシミュレートすることはできません。
1. POST リクエストを送信する前に、GET を通じて 2 つのパラメータを取得する必要があります。
アドレスは次のとおりです:
http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)
取得したdata サーバータイム値とノンス値があり、これらはランダムであり、他の値は役に立たないようです。
def get_servertime(): url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939' # 返回出来的是一个Response对象,无法直接获取,text后,可以通过正则匹配到 # 大概长这样子的:sinaSSOController.preloginCallBack({"retcode":0,"servertime":1545606770, ...}) data = requests.request('GET', url).text p = re.compile('\((.*)\)') try: json_data = p.search(data).group(1) data = json.loads(json_data) servertime = str(data['servertime']) nonce = data['nonce'] return servertime, nonce except: print('获取 severtime 失败!') return None
2. httpfox を介して POST データを観察します。パラメータはさらに複雑で、「su」は暗号化されたユーザー名、sp は暗号化されたパスワードです。 servertime と nonce は前のステップから取得されます。他のパラメータは変更されません。
ユーザー名は BASE64 で計算されています:
username = base64.encodestring( urllib.quote(username) )[:-1]
パスワードは SHA1 で 3 回暗号化されており、干渉するためにサーバータイムと nonce の値が追加されています。
つまり: SHA1 暗号化を 2 回行った後、結果にサーバータイムと nonce の値を追加し、SHA1 が再度計算されます。
def get_pwd(pwd, servertime, nonce): # 第一次计算,注意Python3 的加密需要encode,使用bytes pwd1 = hashlib.sha1(pwd.encode()).hexdigest() # 使用pwd1的结果在计算第二次 pwd2 = hashlib.sha1(pwd1.encode()).hexdigest() # 使用第二次的结果再加上之前计算好的servertime和nonce值,hash一次 pwd3_ = pwd2 + servertime + nonce pwd3 = hashlib.sha1(pwd3_.encode()).hexdigest() return pwd3 def get_user(username): # 将@符号转换成url中能够识别的字符 _username = urllib.request.quote(username) # Python3中的base64计算也是要字节 # base64出来后,最后有一个换行符,所以用了切片去了最后一个字符 username = base64.encodebytes(_username.encode())[:-1] return username
3.パラメータを整理してPOSTリクエストを行います。それ以来、ログインに成功したことはありません。
POST 後に取得されたコンテンツには、次の文が含まれています:
location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3")
これは、ログインが失敗した場合の結果です。ログイン成功後の結果も同様ですが、retcode の値は 0 です。
次に、この URL を再度リクエストすると、Weibo に正常にログインできます。
事前にキャッシュを構築することを忘れないでください。
以上がWeiboログインをPythonでシミュレートする方法の紹介(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。