我用python算出了同事的身份證號碼!

  • 2019 年 11 月 24 日
  • 筆記

文章轉載自:凹凸玩數據,作者:朱小五

事情的經過是這樣的:

我的同事李大偉最近出差去了。

昨晚睡覺前翻了翻朋友圈,

就跟他愉快地 互懟 交流了起來。

估計是他想起了我朱小五從不打無把握之賭,後面就慫了。

一杯奶茶嘛,也可以接受,

像杰倫一樣快樂就好啦。

開工。

先看看李大偉的朋友圈中發的圖片。

(該火車票來自其他平行世界,掃描可能發生奇怪現象)

車票中暴露的個人資訊為:

3302211993****4914 李大偉

只缺少月份日期四位。

那麼也就是一共365種可能。

科普時間:

根據李大偉的身份證資訊的前6位「330221」

輕易可得:

浙江省寧波人,1993年滴

那我先用python生成1993年的所有日期吧

import time    #生成出生當年所有日期  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')

成功得到日期列表。

再用剛才的校驗碼計算規則

反向驗證哪個日期符合嘍!

自己寫計算規則?

NONONO,太麻煩!

給大家隆重介紹一個庫:id-validator

安裝:pip install id-validator

可以用來驗證身份證號合法性、獲取身份證號資訊、生成可通過校驗的假數據、身份證升級。

那麼我們利用 id-validator 來依次校驗剛才生成的身份證號碼。

from id_validator import validator    #遍歷所有日期,print通過校驗的身份證號碼    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')

運行結果:

有33個都符合校驗邏輯,這隻篩掉了90%啊

這就尷尬了

如何在33個日期中挑出來李大偉的真實出生日期呢?

思考了一下

(其實是百度了一波)

這裡需要我們每個人都用過的12306。

打開12306官網,

在12306添加常用聯繫人,

將李大偉+身份證號依次輸入。

若身份證和姓名一致,就會顯示校驗通過;

若不能通過,則說明身份證和姓名不一致。

最終可以測出李大偉的出生日期是:19930608

收工,

奶茶到手。



大家是不是想知道我到底試了多少次才成功的?

剛剛回來的李大偉也表示很想知道。

其實一次也沒用試。

現在我喝著李大偉買的奶茶

碼著文

打開釘釘

看著李大偉的昵稱

心裡笑出豬叫。

文中人物、身份證號碼純屬虛構,如有雷同,就是抄我的。 作者:朱小五,某互聯網公司數據分析師,熱衷於爬蟲,數據分析,可視化,個人公眾號《凹凸玩數據》,帶給大家有趣好玩的文章。

本文相關程式碼已上傳github:

https://github.com/zpw1995/aotodata/tree/master/interest/ID_card