我们经常看到有朋友在朋友圈晒自己的行程,比如火车票信息:(人物、身份证号码纯属虚构,请勿当真)
车票中暴露的身份证号码为:3302211993****4914,只缺少月份日期四位。那么也就是365种可能,因为1993年不是闰年,只有365天。
那我们就先用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')
[
'19930101',
'19930102',
'19930103',
···
'19931229',
'19931230',
'19931231'
]
然后再校验由这些日期构成的身份证号码的有效性。校验身份证号码的有效性不需要自己写代码,这里推荐一个已经封装好的库id-validator。
安装:
pip install id-validator
利用id-validator来依次校验刚才生成的身份证号码:
from id_validator import validator
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]
#遍历所有日期,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')
筛选出了34种结果:
330221199301064914
330221199301144914
···
330221199312134914
330221199312214914
接下来就要通过身份证号码和姓名是否匹配来筛选最终的结果。以往的解决方案是:通过12306查询,在12306添加联系人,若身份证和姓名一致,就会显示校验通过。若不能通过,则说明身份证和姓名不一致。但现在这种方法已经不能用了。
然后我这里又找到了阿里云的实名认证接口,根据身份证姓名和身份证号码核对是身份信息是否一致。但只有企业用户才能使用,个人是没法用了,所以就不尝试了。
用python计算身份证号码的具体流程大概就是这样。当然出生月份和日期很多人都会在QQ或其它社交软件里面公开,一找就能找到。
https://zhuanlan.zhihu.com/p/101334480