Python模擬登陸 —— 征服驗證碼 5 拉鉤

拉鉤使用了動態(tài)token,但是在源代碼中又寫出來了。。。

密碼采用了md5雙重加密

登錄界面

動態(tài)token
import os
import time
import json
import sys
import subprocess
import requests
import hashlib
from BeautifulSoup import BeautifulSoup

try:
    input = raw_input
except:
    pass

#請求對象
session = requests.session()

CaptchaImagePath = QRImgPath = os.path.split(os.path.realpath(__file__))[0] + os.sep + 'captcha.jpg'

#請求頭信息
HEADERS = {
    'Referer': 'https://passport.lagou.com/login/login.html',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0',
    # 'X-Anit-Forge-Token' : '35ed481a-e85c-45db-bf65-256546725c1c',
    #'X-Anit-Forge-Token': '636a61a6-885a-42f5-8031-bfc3c9c45073',
    # 'X-Anit-Forge-Code' : '99573313',
    #'X-Anit-Forge-Code': '99573313',
    'X-Requested-With': 'XMLHttpRequest'
}

#密碼加密
def encryptPwd(passwd):
    # 對密碼進行了md5雙重加密
    passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest()
    # veennike 這個值是在js文件找到的一個寫死的值
    passwd = 'veenike'+passwd+'veenike'
    passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest()
    return passwd


#獲取請求token
def getTokenCode():
    login_page = 'https://passport.lagou.com/login/login.html';

    data = session.get(login_page, headers=HEADERS)

    soup = BeautifulSoup(data.content, fromEncoding='utf-8')
    '''
        頁面新添加了下面這個東東, 所以要從登錄頁面提取token,code, 在頭信息里面添加
        <!-- 頁面樣式 --><!-- 動態(tài)token,防御偽造請求,重復提交 -->
        <script type="text/javascript">
            window.X_Anti_Forge_Token = 'dde4db4a-888e-47ca-8277-0c6da6a8fc19';
            window.X_Anti_Forge_Code = '61142241';
        </script>
    '''
    anti_token = {'X-Anit-Forge-Token' : 'None', 'X-Anit-Forge-Code' : '0'}

    anti_token['X-Anit-Forge-Token'], anti_token['X-Anit-Forge-Code'] = map(
        lambda x:
            x.split('=')[1].strip(' ;\'')
        ,
        soup.findAll('script')[1].getText().encode('utf-8').splitlines()
    )
    return anti_token


# 人工讀取驗證碼并返回
def getCaptcha():
    captchaImgUrl = 'https://passport.lagou.com/vcode/create?from=register&refresh=%s' % time.time()
    # 寫入驗證碼圖片
    f = open(CaptchaImagePath, 'wb')
    f.write(session.get(captchaImgUrl, headers=HEADERS).content)
    f.close()
    # 打開驗證碼圖片
    if sys.platform.find('darwin') >= 0:
        subprocess.call(['open', CaptchaImagePath])
    elif sys.platform.find('linux') >= 0:
        subprocess.call(['xdg-open', CaptchaImagePath])
    else:
        os.startfile(CaptchaImagePath)

    # 輸入返回驗證碼
    captcha = input("請輸入當前地址(% s)的驗證碼: " % CaptchaImagePath)
    print('你輸入的驗證碼是:% s' % captcha)
    return captcha


# 登陸操作
def login(user, passwd, captchaData=None, token_code=None):
    postData = {
        'isValidate' : 'true',
        'password' : passwd,
        # 如需驗證碼,則添加上驗證碼
        'request_form_verifyCode' : (captchaData if captchaData!=None else ''),
        'submit' : '',
        'username' : user
    }
    login_url = 'https://passport.lagou.com/login/login.json'

    #頭信息添加tokena
    login_headers = HEADERS.copy()
    token_code = getTokenCode() if token_code is None else token_code
    login_headers.update(token_code)

    # data = {"content":{"rows":[]},"message":"該帳號不存在或密碼錯誤,請重新輸入","state":400}
    response = session.post(login_url, data=postData, headers=login_headers)

    '''
    print('+++++++++++ login 請求 start +++++++++++')
    print('req.url :')
    print(response.request.url)
    print('req.headers : ')
    print(response.request.headers)
    print('req.body : ')
    print(response.request.body)
    print('res.headers : ')
    print(response.headers)
    print('res.content : ')
    print(response.content)
    print('+++++++++++ login 請求 end +++++++++++')
    '''

    data = json.loads(response.content.decode('utf-8'))

    if data['state'] == 1:
        return response.content
    elif data['state'] == 10010:
        print(data['message'])
        captchaData = getCaptcha()
        token_code = {'X-Anit-Forge-Code' : data['submitCode'], 'X-Anit-Forge-Token' : data['submitToken']}
        return login(user, passwd, captchaData, token_code)
    else:
        print(data['message'])
        return False


if __name__ == "__main__":

    username = input("請輸入你的手機號或者郵箱\n >>>:")
    passwd = input("請輸入你的密碼\n >>>:")

    passwd = encryptPwd(passwd)

    data = login(username, passwd)
    if data:
        print(data)
        print('登錄成功')
    else:
        print('登錄不成功')
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 所謂,君子性非異也,善假于物也!~ 那么,本文意在給大家提供快速、全面、高效的面試解決方案; 為大家節(jié)約尋找面試、...
    騎小豬看流星閱讀 4,190評論 13 100
  • 我怕我來不及 說那句我愛你 轉眼便十年矣 可當初那個你 現(xiàn)如今在哪里 十年后再相遇 要怎么開口呢 是說好久不見 還...
    夜子未央閱讀 277評論 0 1
  • 002、勇斗小偷 已經(jīng)被首都鐵路師范學校錄取了,心也踏實了。距離9月開學還有一個多月時間,武鋼和媽媽商量,想出去打...
    老吳同志簡書閱讀 214評論 0 0
  • 莊子認為人在肉體之外一定有個什么存在的。人有肉體,可以清清楚楚看到。除了肉體我們還有的這個不知道是什么的東西...
    lml宸閱讀 669評論 0 0
  • 前段時間看到朋友圈里有一個段子,關于讀書與不讀書的區(qū)別: 為會么要讀書?舉個簡單的例子吧,當你看到“雪打柿子”,你...
    于福芹美好生活更美好閱讀 1,202評論 0 0

友情鏈接更多精彩內容