不要在朋友圈晒你的火车票了,用python就能计算出你的身份证号码

前言

我们经常看到有朋友在朋友圈晒自己的行程,比如火车票信息:(人物、身份证号码纯属虚构,请勿当真)
在这里插入图片描述

分析

车票中暴露的身份证号码为: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

原文地址:https://www.cnblogs.com/ghgxj/p/14491421.html