iT邦幫忙

0

如何用httpclient模似一个带验证码的post请求

请求的url :http://dynamic.12306.cn/TrainQuery/iframeLeftTicketByStation.jsp
但是这个页面需要用户输入一个验证码,所以首先得先请求一次,得到验证码,然后让用户输入这个验证码,把验证码的参数带上再次请求。请教各位高手,哪位有类似的经验。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

12
wiseguy
iT邦超人 1 級 ‧ 2011-12-15 10:24:46
最佳解答

我很有經驗,每天都在用這招。不過樓主應該不是問我有沒有經驗而已吧?疑惑

因為樓主的問題該說的都沒說 (既沒說要用 script 還是用什麼程式語言寫,也沒說是不是要先用帳號密碼從某個 URL 登入,再來這個 URL 取資料 ),給的 URL 又 500 錯誤,無法連線,所以我只好用 script 的做法,兩次 wget 搞定:

<pre class="c" name="code">wget -nv -q --max-redirect 0 --save-cookie cookie.txt -post-data="user=user&password=password" http://somewhere/login.php
wget --max-redirect 0 --load-cookie cookie.txt -post-data="param=param" http://somewhere/getdata.php

基本上先登入後,網站會先在 cookie 中記錄 session,所以第一次登入記下 cookie (即 session),第二次 query 時,再把 cookie 帶入即可。至於樓主問的驗證碼,因為樓主也沒說這玩意兒是代在 cookie 中還是從網頁顯示出來。若是 cookie 那就直接上面這樣用即可,若是秀在網頁,則從第一次 query 的網頁內容抓出來,帶在第二次的 post-data 裡就行了。

看更多先前的回應...收起先前的回應...
igool iT邦新手 4 級 ‧ 2011-12-15 14:26:18 檢舉

你是大鸟,对不起,我可以说的再详细一些:
我第一次请求的URL是http://dynamic.12306.cn/TrainQuery/leftTicketByStation.jsp,当输入查询条件与验证码之后,再去post请求一次,这次的URL是http://dynamic.12306.cn/TrainQuery/iframeLeftTicketByStation.jsp。

igool iT邦新手 4 級 ‧ 2011-12-15 14:38:42 檢舉

我基本是按照您的解答去偿试的,但是它里面产生验证码的是一个这样的请求
http://dynamic.12306.cn/TrainQuery/passCodeAction.do?rand=rrand,就算我用程序把这个图片弄下来,那如何与对应产生的cookie起来?如果您有详细的解决办法,先在此谢谢了。多谢您的热心回复

fillano iT邦超人 1 級 ‧ 2011-12-16 08:44:29 檢舉

用同樣的cookie,這樣才是同樣的session。

fillano iT邦超人 1 級 ‧ 2011-12-17 11:39:55 檢舉

看起來就算收到驗證碼圖片,也還需要做OCR耶?這個部分怎麼做的阿?

igool iT邦新手 4 級 ‧ 2011-12-17 15:13:28 檢舉

我现在把验证码读取换成人工识别,把读取验证码请求的coolie保留下来,然后连同验证码一起提交,OK了。只是参数好像不太完整,继续研究中。在此特别感谢wiseguy,多谢你的提示。

我要發表回答

立即登入回答