1. 程式人生 > >打碼平臺破解驗證碼+session登陸豆瓣

打碼平臺破解驗證碼+session登陸豆瓣

上節部落格(連結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)
    

執行部分結果如下:

利用打碼平臺破解驗證碼相對於機器學習來說,學習時間短,不需要我們知道怎麼去識別,機器學習學習週期長,不易理解,所以使用打碼平臺是一個不錯的選擇。

原創不易 如若轉載 請註明作者和出處,謝謝!