免费注册 查看新帖 |

Chinaunix

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

求助:python带验证码自动登陆问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-13 15:28 |只看该作者 |倒序浏览
想用python实现自动登陆网站,已经实现自动识别验证码,但现在不知道如何把账号密码同验证码同步提交来登陆系统。
现在的流程是先去网站链接下载验证码到本地,然后来识别好传递给函数.verify参数
Brower(url,user,password,verify):
    login_page = "http://xx.xx.xx.xx/checkLogin"
        try:
            cj = cookielib.CookieJar()
            print cj
            opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
            opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')]
            data = urllib.urlencode({"username":user,"userpass":password,"verify":verify,"ajax":1,"think_html_token":""})
            opener.open(login_page,data)
            op=opener.open(url)
            data= op.read()
            return data
        except Exception,e:
            print str(e)
        print opener
print Brower("http://xx.xx.xx.xx/login","user","pw","verify")
但这样子没法成功,请问如何解决同步post问题,多谢!

附:
1.截取到的cookie:think_template=default; PHPSESSID=p0vd9ha7sr45vrl3nad0m0kv77
2.网页源代码生成验证码的代码:
function fleshVerify(){
//重载验证码
    var timenow = new Date().getTime();
    $('verifyImg').src= '/index.php/verify/'+timenow;
}
function ToEmpty() {
   var elements=document.getElementsByTagName("input");
   for(var i in elements){
      var element=elements[i];
      if((element.type=="text")||(element.type=="password"))element.value="";
   }
}

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-08-13 22:22 |只看该作者
1,第一个是重新加载图片,用一个当前时间作为GET参数避免浏览器缓存。
2,ToEmpty对你没有意义,它是清空表单的。

登陆过程:

1, 读验证码图片, 将其返回的PHPSESSID这个COOKIE保留起来.
2, 提交表单, 同时发送第一步得到的COOKIE.

不知道楼主对Web熟不熟, 知道会话(SESSION)的工作原理我相信你就不会有任何疑惑了, 再复杂的问题也可以通过fiddler抓包配合阅读JS代码得以模拟.

会话原理, 对应上面所说的登陆过程:
1,不提交任何COOKIE,读取验证码图片,此时PHP端将调用session_start(),因为你未提交PHPSESSID这个COOKIE,所以服务端开启新的SESSION,并将新的会话COOKIEHPSESSID返回给你,同时它将生成随机数作为验证码并存储在SESSION中(服务端持久化),使用GD库绘制成一个图片返回给你。
2,你破解验证码图片,得到其中的随机数,将验证码随表单其他字段(账号,密码)伴随着PHPSESSID这个COOKIE一起提交到服务端登陆接口。服务端会根据PHPSESSID到持久化文件中获取你的会话信息,当然就是存储在其中的验证码了,然后比较你提交的验证码和会话中存储的验证码是否一致,一致并且账户密码正确,则会在SESSION中记录你的用户名证明你登陆成功。 你就完成了登陆,之后你只要每次访问该网站都提交PHPSESSID这个COOKIE,就可以始终保持登陆状态了。

论坛徽章:
0
3 [报告]
发表于 2012-08-14 09:40 |只看该作者
谢谢linux_c_py_php 回复。您的意思是我在下载验证码的同时服务器已经返回给我一个sessid了,然后我在登陆提交页面提交参数时服务器又给了我另外一个sessid?

论坛徽章:
0
4 [报告]
发表于 2012-08-14 15:47 |只看该作者
求新浪微博/手机微博 图片验证码该如何识别呢,用python的什么库

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2012-08-14 17:19 |只看该作者
是的, 访问表单页面的SESSION ID你完全可以不拿, 直接存储图片返回给你的SESSION ID即可.

不过具体问题具体分析, 如果表单页面愚蠢到用COOKIE来做表单TICKET唯一提交验证, 你还是得在获取图片与登录时都提交访问表单页面时返回的COOKIE.

回复 3# redstone100


   

论坛徽章:
0
6 [报告]
发表于 2012-08-15 08:49 |只看该作者
回复 4# ubuntu_mark

这个只是针对我登陆的网站写的识别代码,使用的PIL库。贴出供你参考。对于新浪那些验证码估计没那么简单能破的。我的验证码识别就是简单的处理下图片,把图片变成黑白,然后切割与库中模板进行异或操作,选取与库图片差别最小的作为识别结果。(验证码识别思路:可以先把验证码下载本地,用PS处理下,RGB单通道、对比度、亮度调整等)
代码:

import Image
import ImageEnhance
import os

result=[]
def verfiy_Identification():
#下载验证码
    url = 'http://xx.xx.com/verify'
    file("./Initial/1.bmp","wb").write(urllib.urlopen(url).read())

#库图片字典
    Font_Pic = {}
#定义初始图片变量
    Init_Pic= Image.open("./Initial/1.bmp")
    Init_Pic_Cov=Init_Pic.convert('1')
    Init_Pic_Cov_Cro_=[]

    s = 4
    t = 5
    w = 13
    h = 16
#切割图片
    for a in range(4):
        Init_Pic_Cov_Cro = Init_Pic_Cov.crop((s+9*a,t,w+9*a,h))
        Init_Pic_Cov_Cro_.append(Init_Pic_Cov_Cro)
        #Init_Pic_Cov_Cro_[a].save("./Initial/"+str(a)+".png")
        for b in range(10):
            Font_Pic=Image.open("./font/"+str(b)+".bmp")
            value=[]
            for y in range(11):
                for x in range(9):
                    Font_Pic.putpixel((x,y), Init_Pic_Cov_Cro_[a].getpixel((x,y)) ^ Font_Pic.getpixel((x,y)))        #统计白色点数目
                    value = list(Font_Pic.getdata())
            result.append(value.count(255))
            #print value.count(255),
        #print "\n"

#---------------------------------
#寻找列表最小值,返回其位置
#--------------------------------
def getMinIndex(my_list):
    min = my_list[0]
    for i in my_list:
        if i < min:
            min = i
    return my_list.index(min)

if __name__=="__main__":
    verfiy_Identification()
    name1=getMinIndex(result[0:10])
    name2=getMinIndex(result[10:20])
    name3=getMinIndex(result[20:30])
    name4=getMinIndex(result[30:40])
    #print name1,name2,name3,name4,
    newname=str(name1)+str(name2)+str(name3)+str(name4)
    os.rename("./Initial/1.bmp","./Initial/"+newname+".bmp")
    print newname
附:
此程序识别的验证码 ,无歪曲粘连,数字间距相等,练手用很合适。  

论坛徽章:
0
7 [报告]
发表于 2012-08-15 08:55 |只看该作者
回复 5# linux_c_py_php


    谢谢你的帮助,今天再试试看

论坛徽章:
31
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43CU十二周年纪念徽章
日期:2013-10-24 15:41:34丑牛
日期:2013-12-01 10:11:07水瓶座
日期:2014-01-15 08:47:25
8 [报告]
发表于 2012-08-15 09:22 |只看该作者
回复 6# redstone100


    倾斜,变形,粘连 ,大量相近干扰色,这才是识别的难点。。。。以前研究过一阵子,后来放弃了。。

论坛徽章:
0
9 [报告]
发表于 2012-08-15 10:14 |只看该作者
像我这新手只能从简单的验证码开始练起找找自信和经验了。高深的以后真正需要再去弄了,这图像识别学问水深着呢

论坛徽章:
0
10 [报告]
发表于 2013-07-08 15:50 |只看该作者
mark 下,现在的js写的越来越复杂了,可以用casperjs模拟浏览器,但是这验证码登录要研究下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP