【上學吧】繞過驗證碼,網站答案獲取

    在看網頁源代碼的時候,突然發現裏面有一個跳轉代碼,即遇到移動設備訪問的時候,會自動跳轉到 https://m.shangxueba.com/ask/ 頁面。

 

模擬移動設備訪問之後,在這個移動端頁面上點擊【查看答案】按鈕,居然不需要輸入驗證碼,直接出答案!!!Amazing~(不過親測仍然有三次查詢限制)

 

下面是完整的 Python 代碼:

# 繞過驗證碼無限次獲取上學吧題目答案
# 上學吧網址:https://www.shangxueba.com/ask
# by HeXu 2019.05.09
# 新增模擬瀏覽器的 header 來避免查詢失敗

import random
import time
import requests
import urllib3
urllib3.disable_warnings() # 這句和上面一句是爲了忽略 https 安全驗證警告,參考:https://www.cnblogs.com/ljfight/p/9577783.html
from bs4 import BeautifulSoup
import webbrowser

def get_question(session, dataid):
    link = "https://m.shangxueba.com/ask/" + dataid + ".html"
    r = session.get(link)
    soup = BeautifulSoup(r.content, "html.parser")
    try:
        description = soup.find(attrs={"name":"description"})['content'] # 抓取題幹內容
        if(description and description[0:5] != '上學吧提供'): # 頁面錯誤的話,顯示的內容是:上學吧提供考研、公務員、司法、會計、金融等各種資格考試認證學習資料,視頻課程,真題,模擬試題分享下載服務和培訓服務
            return description
        else:
            return "無法獲取題目內容!"
    except: # 有的時候網址出錯會彈JavaScript彈框:該問題不存在或未審覈
        return "該問題不存在或未審覈!"

def get_answer(session, dataid):
    millis = int(round(time.time() * 1000))
    data = {
        "id": dataid,
        "action": "showZuiJia",
        "t": millis
    }
    r = session.post("https://m.shangxueba.com/ask/ask_getzuijia.aspx", data=data) # 覈查驗證碼正確性
    soup = BeautifulSoup(r.content, "html.parser")
    ans = soup.select('.replyCon')
    if(ans):
        images = ans[0].select('img') # 有的題目答案中有圖片,例如:https://www.shangxueba.com/ask/9710781.html
        if(images): # 有的答案中圖片出錯,鏈接爲:http://www.shangxueba.com/exam/images/onErrorImg.jpg
            with open('shangxueba_answer.html','w') as f:
                f.write(str(ans[0]))
                f.close()
                webbrowser.open('shangxueba_answer.html')
                return "答案中有圖片,已自動打開答案網頁文件。如沒有自動打開網頁,可以手動打開 shangxueba_answer.html"
        return ans[0].text.strip()
    else:
        return "答案獲取失敗!請檢查鏈接是否正確。"

if __name__ == '__main__':
    s = requests.session()
    print("*"*45 + "\n上學吧答案神器(繞過驗證碼 + 破解IP限制)\nby HeXu  2019.05.29\n" + "*"*45)
    while True:
        s.headers.update({
            "X-Forwarded-For":"%d.%d.%d.%d"%(random.randint(120,125),random.randint(1,200),random.randint(1,200),random.randint(1,200)), # 這一句是整個程序的關鍵,通過修改 X-Forwarded-For 信息來欺騙 ASP 站點對於 IP 的驗證。
            "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1", # 這一句非常重要,不然獲取不了答案,2019.05.09 更新
        })
        link = input("\n請輸入上學吧網站上某道題目的網址,例如:https://www.shangxueba.com/ask/8952241.html\n\n請輸入:").strip() # 過濾首尾的空格
        if(link[0:31] != "https://www.shangxueba.com/ask/" or link[-4:] != "html"):
            print("\n網址輸入有誤!請重新輸入!\n")
            continue
        dataid = link.split("/")[-1].replace(r".html","") # 提取網址最後的數字部分
        if(dataid.isdigit()): # 根據格式,dataid 應該全部爲數字,判斷字符串是否全部爲數字,返回 True 或者 False
            print('\n' + '-'*45 + '\n題目:' + get_question(s, dataid) + '\n\n' + get_answer(s, dataid) + '\n' + '-'*45 + '\n\n\n')
        else:
            print("\n網址輸入有誤!請重新輸入!\n")
            continue
 

-------------------------------------------------------------------------------------------------------------------------------------------------------------

 

運行腳本之後,直接輸入上學吧網站上的題目鏈接,即可自動出答案:

 

分享下載鏈接:

下載鏈接:https://pan.baidu.com/s/1ysBaExwI2S8iV7h--0dz3g 提取碼:ud6t

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章