from bs4 import BeautifulSoup | |
import requests | |
from PIL import image | |
import pytesseract | |
mysession = requests.Session() | |
url = 'http://110.249.223.91/hbhb/Default.aspx' | |
r = mysession.get(url,timeout=60*4) | |
c = r.content | |
mysoup = BeautifulSoup(c) | |
inputstring = mysoup.find_all('input', attrs={"name":"__VIEWSTATE"}) | |
inputstring = inputstring[0] | |
##获取post需要的请求参数__VIEWSTATE的值 赋值为变量viewstate | |
viewstate = inputstring['value'] | |
captcha_url = 'http://110.249.223.91/hbhb/CheckCode.aspx' | |
capr = mysession.get(captcha_url,timeout=60*4) | |
with open('/home/captcha.jpg', 'wb') as f: | |
f.write(capr.content) | |
###获取验证码字串 赋值cap_str | |
cap_str = pytesseract.image_to_string(Image.open('/home/captcha.jpg')) | |
payload = {'__EVENTTARGET':'','__EVENTARGUMENT':'','__VIEWSTATE':viewstate,'txtUserName':'guest','txtPWD':'123','txtCheckCode':cap_str,'ibtnLogin.x':'25','ibtnLogin.y':'8'} | |
headers = { | |
'Content-Type':'application/x-www-form-urlencoded', | |
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', | |
'Accept-Encoding':'gzip,deflate,sdch', | |
'Accept-Language':'zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4', | |
'Cache-Control':'max-age=0', | |
'Connection':'keep-alive', | |
'Content-Type':'application/x-www-form-urlencoded', | |
'Host':'110.249.223.91', | |
'Origin':'http://110.249.223.91', | |
'Referer':'http://110.249.223.91/hbhb/Default.aspx', | |
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.3' | |
} | |
result = mysession.post(url, data=payload, headers=headers,timeout=60*4) | |
print result.content |
1
CDuXZMAPgHp1q9ew 2014-09-22 11:13:30 +08:00
试试这样? http://110.249.223.91/hbhb/(wyzkkr55fxit0o45yho2u5nv)/Default.aspx
我觉得应该保持session 不是很懂哦! |
![]() |
2
janxin 2014-09-22 11:21:23 +08:00
cap_str识别出来没有用吧?
|
![]() |
4
whywhywhy 2014-09-22 11:33:20 +08:00
正常情况下,只要带着正确的SessionId去请求验证码,以及提交,就不会有问题。(同一个SessionId请求多次验证码。以最后一次为准)
|
![]() |
5
no13bus OP @janxin
![]() 图片里面是我的抓包记录。图片里面可以看到登录页面打开之后,验证码的网址 http://110.249.223.91/hbhb/CheckCode.aspx 也随后请求了,代码里面我模拟了请求http://110.249.223.91/hbhb/default.aspx 是不是说我后面再次模拟请求验证码的地址的时候,其实是第二次点击了验证码地址? |
![]() |
6
1130335361 2014-09-22 11:52:27 +08:00
'txtCheckCode':cap_str
|
![]() |
7
no13bus OP @whywhywhy 嗯。那你的意思是说我的那个代码没啥问题?可是我执行的时候 最后的result结果并不是登录之后的页面。我再次使用mysession.get('http://110.249.223.91/hbhb/Main.aspx') 返回的是500错误。这说明我并没有登录进去。我使用chrome的一个插件postman测试的时候也是没有登录进去。
|
![]() |
8
no13bus OP @1130335361 修改了。但是还是登录不进去。
|
![]() |
9
mhycy 2014-09-22 11:56:47 +08:00
检查是否存在JS添加/修改参数的情况
一般验证码是结合Cookie/Session做标记的吧? |
![]() |
10
mornlight 2014-09-22 11:56:50 +08:00
@no13bus 不会啊,你抓包时有这个请求是因为浏览器会自动加载验证码,程序里你只获取Default.aspx的话默认不会去加载其他东西的。
你先试试手动请求最新的验证码,然后把验证码填进去再 模拟登录看看,是不是其他部分有问题。 |
![]() |
11
mhycy 2014-09-22 12:07:39 +08:00
ibtnlogin.y
ibtnlogin.x 这个参数每次请求都不一样 检查一下 |
12
CDuXZMAPgHp1q9ew 2014-09-22 12:25:12 +08:00
@no13bus session
|
![]() |
17
janxin 2014-09-22 13:26:49 +08:00 ![]() @no13bus 'Cookie':'ASP.NET_SessionId=zybypfvmlkof0f55rrtprvb3',你cookies写死了
|
![]() |
18
no13bus OP @janxin 直接把他删除了。就好了。登录上去了。忘了requests.Session是自动保持cookie状态的,header不用另加cookie参数
|
![]() |
19
pc10201 2014-09-22 13:57:13 +08:00
这种情况用浏览器模拟是最好的办法~
|
![]() |
20
imn1 2014-09-22 14:24:36 +08:00
凡是需要session的进程,需要先get一次url获取cookies,其中至少需要得到session-id的相关项,然后后续的请求/post都应该附带这个cookies发送出去
|
![]() |
21
no13bus OP @imn1 嗯。多谢。mysession = requests.Session()
url = 'http://110.249.223.91/hbhb/Default.aspx' r = mysession.get(url,timeout=60*4) 这个就是了。requests的session方法就可以保持session的状态。很好用。 |
23
ld0891 2014-09-22 15:48:36 +08:00
调HTTP最好用Firefox,因为Chrome一些字段有限制没法自定义。
记得Postman要用个代理才能修改限制字段。 |
25
ld0891 2014-09-22 20:08:18 +08:00
@no13bus 就是HTTP报文头有些字段没法修改,比如Host,Referer啥的。
具体参见http://www.getpostman.com/docs/requests,里面Headers有详解。 |
![]() |
26
no13bus OP @ld0891 哦。我这里能改。你说的那个我之前就下载过。http://blog.getpostman.com/wp-content/uploads/2014/02/Postman_-_v0_9_5_and_Airmail.png
这个东西我有的。多谢了。下载了之后 就能修改了 |