ホームページ >バックエンド開発 >Python チュートリアル >Python を使用して Dr.com にログインするためのアイデアとコード共有
前提条件: ISP は Web ログインをサポートしている必要があります。
注: 各 ISP のログイン ページは異なりますが、アルゴリズムは同じであると推定されるため、解決策も同様になるはずですが、フォームのキーは異なる場合があります。
まず、ログインページを分析します。
ページの先頭には 3f1c4e4b6b16bbbd69b2ee476dc4f83a タグが埋め込まれており、送信関連のスクリプトはすべてここにあります。ページの重要な部分は、f1 と f0 の 2 つの形式です。 f0 全体は表示されませんが、f1 の submit をクリックすると、f0 の submit 自体が submit されるのではなく、直接呼び出されます。フォームのテーブルレイアウトには文句は言えません...
HTML の一部
<form name="f1" method="post" action="" onsubmit="return ee()"> <table border="0" width="100%" cellspacing="1" cellpadding="0" height="100%" class="f1"> ... <tr> <td height="34" width="35%" align="right">账号 Account </td><td height="34" width="64%"> <input name="DDDDD" type="text" maxlength="26" class="input-border"></td> </tr> <tr> <td height="32" width="35%" align="right">密码 Password </td><td height="32" width="64%"> <input name="upass" type="password" maxlength="16" class="input-border"></td> </tr> <tr> <td height="57" width="35%"> </td><td height="57" width="64%"> <input type="submit" name="0MKKey" value="" onclick="cc(0)" class="login-b"> <input type="submit" name="" value="" onclick="reset();return false;"></td> </tr> ... </form>
ここでわかるように、送信をクリックすると cc(0) が呼び出され、送信すると ee() 関数が呼び出されます
js の一部:
function cc(ss) { f0.R1.value = ss; } function ee() { if (f1.DDDDD.value == "") { alert("请输入您的账号 Please enter your account account number"); return false; } f0.DDDDD.value = f1.DDDDD.value if (ps == 0) { f0.upass.value = xproc1(f1.upass.value); } else { tmpchar = pid + f1.upass.value + calg; f0.upass.value = calcMD5(tmpchar) + calg + pid; f0.R2.value = 1; } document.f0.submit(); return false; }
明らかに、送信をクリックすると、一連の割り当てが f0 に行われ、問題がなければ f0 が送信されます。
f0:
<form name="f0" method="post" action=""><input type="hidden" name="DDDDD" value="0"><input type="hidden" name="upass" value="0"> <input type="hidden" name="R1" value="0"><input type="hidden" name="R2" value="0"><input type="hidden" name="para" value="00"> <input type="hidden" name="0MKKey" value="123456"> </form>
js の内容を参照してください。Python の dict を使用して f0 を表す場合、次の疑似コードが得られます。
f0={} f0["DDDDD"] = f1['DDDD'] f0["upass"] = calcMD5(pid + f1['upass'] + calg) + calg + pid; f0["R1"] = ss f0["R2"] = 1 f0["para"] = 00 f0["0MKKey"] = 123456
このうち、ss、pid、calg はすべて定数で、f1['DDDD'] と f1['upass'] はそれぞれユーザーが入力したユーザー名とパスワードの文字列です
鍵はcalcMD5のアルゴリズムにあります。
関数名と関数自体から判断すると、この関数は MD5 の実装です。ただし、js コードの移植中にいくつかの問題が発生しました。js と Python のシフト操作の動作が異なります。
ユーザーが入力したパスワードを除いて、f0['upass'] フィールド全体は定数であるため、この文字列を Python で保存するだけで、js を使用して f0['upass'] を計算できます。
Cookie を確認したところ、Web ページ全体で Cookie が使用されていないことがわかりました。
ログイン後、ログアウト ページにジャンプします。ログアウト ページを分析した結果、ログアウトするには特定の Web ページにアクセスするだけであることがわかります。
全体の考え方は非常に単純で、pos はサーバーにログインしてログインし、指定された Web ページを取得してログアウトします。実装コードは次のとおりです:
import sys from urllib import urlencode from urllib2 import urlopen username = "s10********" upass = "6696a3***********************************" LOGIN = "http://202.1**.***.***/" LOGOUT = "http://202.1**.***.***/F.htm" def post(url, data=None): if data: data = urlencode(data) response = urlopen(url, data) return response.read() def login(): data={} data["DDDDD"] = username data["upass"] = upass data["R1"] = 0 data["R2"] = 1 data["para"] = 00 data["0MKKey"] = 123456 post(LOGIN, data) pass def logout(): post(LOGOUT) def main(argv): if argv[0] in ('login','in','i'): login() elif argv[0] in ('logout','out','o'): logout() pass pass if __name__ == '__main__': main(sys.argv[1:]);