ホームページ >バックエンド開発 >Python チュートリアル >WeiboログインをPythonでシミュレートする方法の紹介(コード付き)

WeiboログインをPythonでシミュレートする方法の紹介(コード付き)

不言
不言転載
2019-03-18 09:15:512713ブラウズ

この記事では、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でシミュレートする方法の紹介(コード付き)

以上がWeiboログインをPythonでシミュレートする方法の紹介(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。