打码平台破解验证码+session登陆豆瓣

版权声明:原创不易,如若转载,请注明出处! https://blog.csdn.net/MG1723054/article/details/81938633

上节博客(链接https://blog.csdn.net/MG1723054/article/details/81900983)谈到利用python实现登陆的三种方法,其中利用session登陆网站的方法具有比较不错的效果,不需要考虑cookie的时效性,但是有一个潜在的问题是有些文字验证码用一般的程序很难破解,主要是识别度不高,为了提高识别有多种方法,包含机器学习训练验证码,利用OpenCV中的点降噪或者线降噪,还有就是利用打码平台,将程序接到打码平台让别人解决验证码问题(相当于是一个黑盒,我们只需要传入验证码图片,然后输出验证码字符),网上的打码平台有很多,我选择的是超级鹰打码平台(http://www.chaojiying.com/),这个平台可以通过注册账号,关注微信号送1000题分,可以免费测试。超级鹰打码平台中有python怎么使用该平台的案例。下面是chaojiying.py文件,这个文件在主程序时候调用即可,现在版本chaojiying.py与之前的有些不同。

#!/usr/bin/env python
# coding:utf-8

import requests
from hashlib import md5


class Chaojiying_Client(object):###这里面类名与之前的有所改变

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()

####chaojingyi.py文件,等下导入到别的程序中

介绍了这么多,下面我们进入正题。我们先点击进入豆瓣登陆首页,打开源代码找到验证码图片。如下图所示。

利用 正则表达式提取出链接地址,这样我们就得到了图片的链接,然后再将图片下载在指定的文件中。代码如下,该段代码相对比较简单

import requests,re
login_url='https://accounts.douban.com/login'
def get_imge_url():
    rep=requests.get(login_url,headers={'User-Agent':'Mozilla/5.0'})
    res=re.compile('<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>')
    imge_url=re.findall(res,rep.text)
    return imge_url[0]
def download_imge(url,filename):
    byte=requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
    with open (filename,'wb') as f:
        f.write(byte.content)

再次我们怎么样将图片传入超级鹰平台,根据该网站提供的实例,我们只要这样即可:

chaojiying = Chaojiying_Client('超级鹰账号', '超级鹰密码', '超级鹰ID')
im = open(filename, 'rb').read()
yanzhengma=chaojiying.PostPic(im, 1902)['pic_str']

最后,我们需要解决的是怎么样传送表单,于是我们打开开发者模式,勾选preserve log,然后再登陆页面的账号,密码,验证码随便输入字符(先不要输入正确的账号密码和验证码,便于后面的分析),点击登陆,我们在DOC选项中看到一个post请求,然后我们看下面的表单,果然是我们当时输入的账号,密码,和验证码,如下图所示。

前面我们已经解决了验证码问题,现在这表单里面还有一个需要构造的参数,也就是captcha_id,仔细观察该captcha_id键的值我们可以知道,这个就是在验证码图片链接https://www.douban.com/misc/captcha?id=GU3dsxGehVnCmQ5IaWIipDKo:en&size=s

中的数据,我们就利用正则表达式来构造它,这样所有的表单构造全部完成。这也是利用打码平台破解验证码,session登陆豆瓣的全部思路。

下面我们给出完整代码:

# -*- coding: utf-8 -*-
"""
Created on Tue Aug 21 16:18:38 2018

@author: NJUer
"""
import requests,re
from chaojiying import Chaojiying_Client ###导入chaojiying模块中的Chaojiying_Client
login_url='https://accounts.douban.com/login'
def get_imge_url():  ###获取验证码链接
    rep=requests.get(login_url,headers={'User-Agent':'Mozilla/5.0'})
    res=re.compile('<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>')
    imge_url=re.findall(res,rep.text)
    return imge_url[0]
def download_imge(url,filename):
    byte=requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
    with open (filename,'wb') as f:
        f.write(byte.content)####下载验证码图片
def post_data(id_string,yanzhengma):    ###提交表单
    form_data={'source':'index_nav',
               'redir:https':'//www.douban.com/',
               'form_email':'[email protected]',
               'form_password':'豆瓣账号',
               'captcha-solution':'豆瓣密码',###自己注册豆瓣账号密码
               'captcha-id':id_string,
               'login':'登录', 
            }
    session=requests.session()
    session.post(login_url,data=form_data)
    infor=session.get('https://www.douban.com/',headers={'User-Agent':'Mozilla/5.0'})
    infor.encoding='utf-8'
    if '方天画戟吕奉先的帐号'in infor.text : ###测试是否登陆成功,因为我的账号
###名称为‘方天画戟吕奉先’,所以登陆成功必然会有显示
        print('登陆成功!')
    else :
        print('登陆失败!')
    print(infor.text[0:10000])
if __name__ == '__main__':
    chaojiying = Chaojiying_Client('超级鹰账号', '超级鹰密码', '超级鹰ID')###自己注册
    
    url= get_imge_url()
    id_string=url.split('=')[1].split("&")[0] ###获取验证码的ID
    filename='C:\\Users\\FangWei\\Desktop\\网络爬虫\\chaojiying_Python\\豆瓣.jpg'
    download_imge(url,filename)
    im = open(filename, 'rb').read()
    yanzhengma=chaojiying.PostPic(im, 1902)['pic_str']
    post_data(id_string,yanzhengma)
    

运行部分结果如下:

利用打码平台破解验证码相对于机器学习来说,学习时间短,不需要我们知道怎么去识别,机器学习学习周期长,不易理解,所以使用打码平台是一个不错的选择。

原创不易 如若转载 请注明作者和出处,谢谢!

猜你喜欢

转载自blog.csdn.net/MG1723054/article/details/81938633