python發送GET或POST請求以便干一些趣事
適合級別:入門,中級
關鍵字 :python, http, GET, POST, 安全, 模擬, 瀏覽器, 驗證碼,圖片識別, google
1 此文不是關於黑客或安全話題的!
2 使用腳本程序發送GET或POST,這是最簡單也是最常見最頻繁的事情之一;那為什么我還要YY一遍呢? 因為不只是熟能生巧,熟還能生出好多東西來呢,就看是和誰生!
3 我想有必要再次溫習一遍HTTP協議及GET/POST請求相應內容與格式等基礎知識的;不過我不會在此簡述,希望你去看看那些諸如“當你使用瀏覽器打開一個URL,究竟發生了哪些事”這樣的文章吧!
4 python發送GET/POST可能涉及的lib: urllib, urllib2, cookielib ;至於其他的諸如處理HTML等不在本話題范圍內:)
5 請求google.com的首頁:
- >>> import urllib2
- >>> print urllib2.urlopen('http://google.com').read()
以上是hello world級別了;但geek程序員往往會通過此發現,打印出的東西,因URL而異 --- 廢話,當然不是說內容,是指風格!!! 優秀的站點,其源碼往往也在各個方面高一個水准,包括unicode編碼、安全、性能等等方面。
下載GOOGLE的LOGO文件
- open('d:\\temp\\google-logo.gif','wb').write(urllib2.urlopen('http://www.google.com/images/logo_sm.gif').read())
6 模擬瀏覽器打開某個登錄URL,並通過POST成功登錄:
(1 這個問題的情況比較特殊,所以我打算寫一個稍微全面點的,以盡可能涵蓋常見情況,包括但不限於:cookies ,密碼加密發送,https,簡單驗證碼,ip限制,充分假裝瀏覽器等等。
(2 POST請求發送的最小形式:
- >>> import urllib
- >>> import urllib2
- >>> import cookielib
- >>> cj = cookielib.CookieJar()
- >>> opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
- >>> opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')]
- >>> urllib2.install_opener(opener)
- >>> req = urllib2.Request("http://xxoo.com",urllib.urlencode({"username":"root","password":"ROOTXXOO"}))
- >>> req.add_header("Referer","http://xxoo.com")
- >>> resp = urllib2.urlopen(req)
- >>> print resp.read()
(3 一些注意事項或最佳實踐:
A 是否因為cookie的問題而POST失敗,最好使用真的瀏覽器登錄,然后使用firebug這樣的調試工具來查看實際的請求與響應頭信息,以及cookie數據!
B 除了cookie之外,還有很多其他方法來達到一些安全或其他目的;cookie能保存的數據就4k,而且對客戶端完全開放。
C 其實第一件重要的事情是閱讀源碼,肉眼解析出form及其action和參數等;搞清楚邏輯,再去模擬;但這一步往往是最開始的斗智斗勇階段;有些程序員總是使用小把戲來調戲你,比如追加無意義參數,追加隨機數並命名為看上去像業務數據的變量等,還有人喜歡玩數學,比如搞質數運算等。
D 驗證碼問題:分很多種,有的程序員比較嫩,所以你可以分析下繞過;而一般的安全驗證碼,則需要你自己多請求一些驗證碼回來建庫,做特征識別;至於很變態的驗證碼,建議你放棄這個思路,不要非去識別不可!
E 網上流傳的discuz!模擬登錄,其實都大多是理論;真正的程序都在那些專業發帖公司那里。
F 我本來想貼一個真實的代碼出來,但是擔心和諧問題,所以還是作罷!
7 熟練地掌握這些東西可以做什么?
答:這只是一種方式和途徑,或者說一種小伎倆;做什么是你自己的事哦,能做什么就是方法本身的事了!!!低調地說,我用這個干過:刷票(投票的,刷人氣的,耍點擊率的,抽獎的...);突破限制完全下載整站數據(區別於爬蟲哦);專業數據庫的數據COPY;其他不和諧的勾當。。。
8 其實只要你夠geek,幾乎能用curl搞定大多數問題。不過往往,我們更應該將精力放在解決問題上,而不是解決問題的工具上!
關於驗證碼的問題:
1 有很多很多的人都想搞這個驗證碼,比如想破解,比如想寫機器人,等等
2 驗證碼的問題我覺得就兩張思路: 繞過,識別; 其中繞過的條件是機制本身有漏洞,識別又分自動識別和人工識別
3 不是所有場合都一定需要破解驗證碼才能繼續,比如有的時候只需要人工識別即可: 一個半自動化的機器人,在需要填寫驗證碼時,把驗證碼圖片給出(甚至可以發送到email或者手機上),人工識別並返回,機器人提交並繼續工作 - 這是很理想也很底代價的方式之一 。
當然,如果你非要破解驗證碼不可,那就搞特征庫並比對識別嘍。具體思路也很簡單,而且個人建議不要重頭來寫,用開源的即可:
1 大量讀取驗證碼圖片,建立原始數據庫;
2 分析並提取特征,比如有的驗證碼圖片很簡單,就幾個數字而已,你抓2W個圖片拿下來分析一下,基本八九不離十了,都可以識別出;
3 程序里遇到驗證碼的時候,拿圖片去特征數據庫比對,得到結果。
4 主意事項:比如圖片中字符的分隔,比如容錯,比如干擾因素的排除,比如對於類似google驗證碼的那種扭曲等變換,就要麻煩了。。。

