免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3863 | 回复: 3
打印 上一主题 下一主题

再次求教一个问题~关于验证码图片下载的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-26 13:58 |只看该作者 |倒序浏览
目标:实现批量注册tom邮箱

已做:在python里用某api给予图片可以返回text,

问题:如何下载验证码图片

这是目前写的程序,就差
import re;
import cookielib;
import urllib;
import urllib2;

def emulateLoginTom():
cj = cookielib.CookieJar();
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj));
urllib2.install_opener(opener);
print " emulate login tom";
MainLoginUrl = http://bjcgi.tom.com/cgi-bin/tom_reg.cgi?rf=060704;

#######
postDict = {
'funcid'="reguser",
'rf'="060704",
'refer'=,
'year'="1980",
'month'="1",
'day'="1",
'argee'="1",
'idnum'="4401",
'question'="%CE%D2%D7%EE%B0%AE%B5%C4%C8%CB%B5%C4%C3%FB%D7%D6",
'answer'="tomtommail",
'checkuname'="on",
'uid'="prpdiyicitest",
'hid_pwd'="123456",
'password'="123456",
'hid_pwdcfm'="123456",
'confirm_password'="123456",
'safemail'="qqqqq@qq.com",
'authcode'=
#here is the test of the captha;
'argee_c'="yes"
};
postData = urllib.urlencode(postDict);
req = urllib2.Request(MainLoginUrl, postData);
req.add_header('Content-Type', "application/x-www-form-urlencoded"); if __name__=="__main__":
emulateLoginTom();


关于authcode里的数据我用api可以直接返回一个text,而这个text的前期是我上传一个本地图片,所以我需要在代码中打了一排#的地方把图片载下来……但是不会弄……求大神教

'question'="%CE%D2%D7%EE%B0%AE%B5%C4%C8%CB%B5%C4%C3%FB%D7%D6",这里好像还要解码下 但不是主要问题……大神请忽略这个小错误……

论坛徽章:
0
2 [报告]
发表于 2012-11-26 14:19 |只看该作者
1.用工具分析,原先获取图片的内部流程是啥:
【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程

相关背景知识,如果不熟悉,可参考:
【整理】关于抓取网页,分析网页内容,模拟登陆网站的逻辑/流程和注意事项

2.然后找到对应验证码图片(的地址)后,就可以去下载下来了。
如果不会下载,可参考我总结的:
crifanLib.py
中的
downloadFile

manuallyDownloadFile
直接拿去用就可以了。

3.关于解码,我也总结过了,需要的直接参考即可:
【整理】关于http(GET或POST)请求中的url地址的编码(encode)和解码(decode)




论坛徽章:
0
3 [报告]
发表于 2012-11-28 11:33 |只看该作者
回复 2# crifan

谢谢 不过还是遇到了几个问题:

先是我用了你所说的那先分析,首先是得到我要post给他的数据,这些都ok,其中一个要post的数据是authcode,也就是验证码的答案,

然后至于验证码他有个叫做 image ID的cookie 但是可能是因为什么技术没有显示具体的值,

所以我想了想才需要把图片载到本地,但是这个下载我不能直接访问他的那个图片的url,这样会给我一个新的图片
我想知道的是如何才能得到那张确切的图,以及Req这个指令会不会产生新的图片?因为很奇怪的是他那个imageID的cookie是在我post的时候才给我的,而不是我原来以为的之前给我而那个时候比对的

   

论坛徽章:
0
4 [报告]
发表于 2012-11-28 12:53 |只看该作者
本帖最后由 crifan 于 2012-11-28 12:54 编辑

回复 3# feeLinglyn


    "其中一个要post的数据是authcode,也就是验证码的答案"
不出意外的话, 肯定是对应的验证码图片的值。
这个需要你自己去想办法,破解验证码图片,然后把验证码图片上的字符,赋值给authcode

“然后至于验证码他有个叫做 image ID的cookie 但是可能是因为什么技术没有显示具体的值,”
自己去参考:
【教程】如何利用IE9的F12去分析网站登陆过程中的复杂的(参数,cookie等)值(的来源)


注:这个帖子,在
【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程

也已经提到了,你要是注意看,应该会看到的。

“所以我想了想才需要把图片载到本地,但是这个下载我不能直接访问他的那个图片的url,这样会给我一个新的图片”
先说浏览器:
浏览器中你登陆对应网址,看到的验证码的图片,也是通过访问对应的url,不论是GET还是POST,然后得到对应的验证码图片,然后显示出来,你才看到的。
再说代码:
你写代码,目的就是为了模拟浏览器中发生的过程。
所以也是,必须,访问对应的url,去获得对应图片的。
这个不存在新旧。
如果有什么新旧,那也是类似于浏览器中,你点击了验证码图片,刷新验证码了,然后浏览器内部再去重新请求一个新的验证码图片,然后获得了新的验证码图片,显示出来而已。
如果有这个需要,在代码中,也还只是重复模拟这个过程而已。
总之,浏览器怎么做的,你代码就怎么做。

如果是为了访问对应的url,而其中需要提交的值,你找不到的话,
那问题只是在于你没有找到而已。
具体如何找到,还是那句话,参考上面的
【教程】如何利用IE9的F12去分析网站登陆过程中的复杂的(参数,cookie等)值(的来源)

去一点点找而已。
如果还是找不到,那有2种可能:
(1)对应的值,是类似于swf等flash插件,内部计算出来的,而你此处,无法直接从浏览器抓取的数据中获得。
(2)或者是内部的js脚本计算出来的,而此处只能靠你自己去调试js脚本,想办法找到如何计算的。
找到了计算方法了,再用代码模拟出来。
如果js内部计算过程太复杂,无法调试出来计算方法,那我也无能为力的。

“我想知道的是如何才能得到那张确切的图,以及Req这个指令会不会产生新的图片?因为很奇怪的是他那个imageID的cookie是在我post的时候才给我的,而不是我原来以为的之前给我而那个时候比对的”
同上,就一句话,
浏览器做啥,你就用代码去模拟做啥。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP