揭秘!我是如何用python算出同事的身份證號(hào)碼
作者 |?朱小五
來(lái)源公眾號(hào) |?凹凸玩數(shù)據(jù)
一、一張火車(chē)票引發(fā)的賭局
事情的經(jīng)過(guò)是這樣的:
我的同事李大偉最近出差去了。
昨晚睡覺(jué)前翻了翻朋友圈,
就跟他愉快地 互懟 交流了起來(lái)。

估計(jì)是他想起了我朱小五從不打無(wú)把握之賭,后面就慫了。
一杯奶茶嘛,也可以接受,
像杰倫一樣快樂(lè)就好啦。
二、計(jì)算概率
開(kāi)工。
先看看李大偉的朋友圈中發(fā)的圖片。

(該火車(chē)票來(lái)自其他平行世界,掃描可能發(fā)生奇怪現(xiàn)象)
車(chē)票中暴露的個(gè)人信息為:
3302211993****4914? 李大偉
只缺少月份日期四位。
那么也就是一共365種可能。
科普時(shí)間:

根據(jù)李大偉的身份證信息的前6位“330221”
輕易可得:

浙江省寧波人,1993年滴
那我先用python生成1993年的所有日期吧
import?time
#生成出生當(dāng)年所有日期
def?dateRange(year):
????fmt?=?'%Y-%m-%d'
????bgn?=?int(time.mktime(time.strptime(year+'-01-01',fmt)))
????end?=?int(time.mktime(time.strptime(year+'-12-31',fmt)))
????list_date?=?[time.strftime(fmt,time.localtime(i))?for?i?in?range(bgn,end+1,3600*24)]
????return?[i.replace('-','')?for?i?in?list_date]
data_time??=?dateRange('1993')成功得到日期列表。

三、使用驗(yàn)證身份證庫(kù)
再用剛才的校驗(yàn)碼計(jì)算規(guī)則
反向驗(yàn)證哪個(gè)日期符合嘍!
自己寫(xiě)計(jì)算規(guī)則?
NONONO,太麻煩!
給大家隆重介紹一個(gè)庫(kù):id-validator
安裝:pip install id-validator
可以用來(lái)驗(yàn)證身份證號(hào)合法性、獲取身份證號(hào)信息、生成可通過(guò)校驗(yàn)的假數(shù)據(jù)、身份證升級(jí)。

那么我們利用?id-validator 來(lái)依次校驗(yàn)剛才生成的身份證號(hào)碼。
from?id_validator?import?validator
#遍歷所有日期,print通過(guò)校驗(yàn)的身份證號(hào)碼
def?vali_dator(id1,id2,id3):
????for?i?in?dateRange(id2):
????????theid?=?id1?+?i?+?id3
????????if?validator.is_valid(theid):
????????????print(theid)
vali_dator('330221','1993','4914')運(yùn)行結(jié)果:

額
有33個(gè)都符合校驗(yàn)邏輯,這只篩掉了90%啊
這就尷尬了
如何在33個(gè)日期中挑出來(lái)李大偉的真實(shí)出生日期呢?
四、12306助力?
思考了一下
(其實(shí)是百度了一波)
這里需要我們每個(gè)人都用過(guò)的12306。

打開(kāi)12306官網(wǎng),
在12306添加常用聯(lián)系人,
將李大偉+身份證號(hào)依次輸入。
若身份證和姓名一致,就會(huì)顯示校驗(yàn)通過(guò);
若不能通過(guò),則說(shuō)明身份證和姓名不一致。

最終可以測(cè)出李大偉的出生日期是:19930608
收工,
奶茶到手。
源碼地址:https://github.com/zpw1995/aotodata/tree/master/interest/ID_card
覺(jué)得不錯(cuò),點(diǎn)個(gè)在看唄!
