2013年3月29日 星期五

[Python] 模擬登入

最近為了應付學校的落落長問卷,用 Python 寫了一支自動填表的 Bot。
基本上,想寫一支自動填表的程式,要做的事有:
  • 了解用法
  • 分析網站

import urllib2
import cookielib
from urllib import urlencode

上面是大致上會用到的 library。

假設今天你想要 登入 一個網站,自動填完裡面的問卷,使用Browser的開發者工具去檢查元素,發現登入的Block長這樣。

<form method="POST" action="login.php">
    <input type="text" name="username" />
    <input type="password" name="password" />
</form>

此時,你得到了一些資訊:
  1. path = login.php
  2. method = POST
  3. 帳號的 name = username
  4. 密碼的 name = password
以 urllib2 為基礎,創建一個 opener 出來,這是為了能記錄 cookie 。

#set cookie
cookie = urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie, urllib2.HTTPHandler)

POST的Data,以字典的形式來表示。然後先以 opener 來 Send Request,然後得到 cookie ,最後將其 install 在 urllib2 裡。

login_url = 'http://www.yourdomain.com/login/php'
login_data = {'username': 'root', 'password': 'root'}
opener.open(login_url, urlencode(login_data))
urllib2.install_opener(opener)

最重要的部分就在於,將登入後得到的 cookie 牢牢的鎖在 urllib2 裡。
得到 cookie 後,我們要開始填寫問卷。

分析─透過 chrome 的檢查元素,可是查看 Network 也就是封包傳遞的情況,便可手動分析到每一次問卷 POST 出去究竟是 POST 了甚麼資料。

再度假設,問卷的位置為 /form.php ,分析到的 form-data 為:

  • __VIEW: qwerty12345
  • first: 5
  • second: 7
  • third: 9
  • button: OK

那當然你POST出去的東西也要有這 5 個,建立字典!其中「__VIEW」很明顯是一種 hidden 的 input ,而你必須自己從 source code 中爬出來。
post_url = 'http://www.yourdomain.com/form.php'
post_data = {'__VIEW': find, 'first': value1, 'second': value2, 'third': value3, 'button': 'OK'}
request = urllib2.Request(post_url , urlencode(post_data))
result = urllib2.urlopen(request )

這樣便可完成簡單的表單填寫!

沒有留言:

張貼留言