文章目录
文章中出现的身份证号,皆为虚拟信息
文章只用作于学习交流,不得用于其他用途
文章纯属虚构,如有雷同,但是不会有雷同
1.假想前提
朋友去旅游,发了一条带车票信息的朋友圈,我对他说很危险,你的ID_Card Number会暴露的,他不信,嘿嘿,还不信,嘿嘿。看我如何利用python获取你的完整身份证号码。
2.实现方法
方法一 利用人际关系
第一个方法最简单!直接问他本人:你的身份证号码是多少??快告诉我!
如此,本章完。
方法二 利用微信朋友圈
翻看他的朋友圈,看看他什么时候发过庆祝生日的朋友圈。
如此,本章完。
方法三 利用腾讯QQ
查看他的QQ的个人信息,看到没??图片中划红框的地方。
如此,本章完。
方法四 python技术手段
好了,上面玩笑开完,准备真正上猛料了。
车票上的缺省的身份证号 4401011985****2171
众所周知,一年有365天,也就是说身份证缺省的四位(****)有着365种可能,那我们首要的就是将1985年的365天全部遍历出来。
然后再将 日期填充到缺省的身份证中去。
获取1985年的所有日期思路。主要用到time模块
# 获取1985年第一天(19850101)和最后一天(19851231)的时间戳
# 然后用一个for循环第一天到最后一天,步长为3600*24(一天的秒数)
# 最后转换时间戳为符合身份证的格式即可
1.time.mktime() [接收struct_time对象作为参数,返回用秒数来表示时间的浮点数]
2.time.localtime() [作用是格式化时间戳为本地的时间]
3.time.strptime() [函数根据指定的格式把一个时间字符串解析为时间元组]
4.time.strftime() [接收以struct_time,并返回以可读字符串表示的当地时间,格式由参数format决定]
代码实现
# 因为身份证的年日月格式为1985****
layout = '%Y%m%d'
# 1.获取时间元祖
first_day = time.strptime(str(year)+'0101', layout) # 第一天的时间元祖
last_day = time.strptime(str(year)+'1231', layout) # 最后一天的时间元祖
# time.struct_time(tm_year=2018, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)
# time.struct_time(tm_year=2018, tm_mon=12, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=365, tm_isdst=-1)
# 2.转换为时间戳
first_day = time.mktime(first_day) # 1514736000.0
last_day = time.mktime(last_day) # 1546185600.0
# 3.时间戳转换为 类19850101格式的日期
# 将日期填充到**4401011985****2171**,即为完整的身份证号
Id_number = []
for i in range(int(first_day), int(last_day) + 1, 3600 * 24):
# 先localtime转换为时间元祖,然后strftime转换为需要的时间格式
print(time.strftime(layout, time.localtime(i))) # 20180101 20180102 ... 20181231
date = time.strftime(layout, time.localtime(i))
# 将365种可能的身份证号码添加到列表
Id_number.append('440101' + str(date) + '2171')
好了,身份证获取到此就完成了。
剩下来的是验证身份证号是否为真正的或说为是否合法了!!
3.验证身份证是否合法
好了,身份证已经提取完成了。但是这里还有一个问题。一共有这么多个身份证号,我怎么才能知道确切的是哪一个呢??
这里用到id-validator模块,下图是写该模块的大佬的主页。
安装
pip install id-validator
验证身份证合法性
验证身份证号是否合法,合法返回 True,不合法返回 False:
from id_validator import validator
validator.is_valid('440101198501012171') # 大陆居民身份证 18 位 False
validator.is_valid('440101198501062171') # 大陆居民身份证 18 位 True
获取身份证号信息
当身份证号合法时,返回分析信息(地区、出生日期、星座、生肖、性别、校验位),不合法返回 False:
from id_validator import validator
validator.get_info('440101198501062171') # 18 位
{ 'address_code': '440101', # 地址码
'abandoned': 1, # 地址码是否废弃,1 为废弃的,0 为正在使用的
'address': '广东省广州市', # 地址
'address_tree': ['广东省', '广州市', ''], # 省市区三级列表
'birthday_code': '1985-01-06', # 出生日期
'constellation': '摩羯座', # 星座
'chinese_zodiac': '丑牛', # 生肖
'sex': 1, # 性别,1 为男性,0 为女性
'length': 18, # 号码长度
'check_bit': '1' # 校验码
}
注:判断地址码是否废弃的依据是 中华人民共和国行政区划代码历史数据集,本数据集的采集源来自: 中华人民共和国民政部,每年更新一次。本数据集采用 csv 格式存储,方便大家进行数据分析或者开发其他语言的版本。
- id_validator模块的介绍就到这里。下面说一下应用到我们验证身份证合法性的这里。
- 一年有365天,所以有365个身份证号码,在使用了validator.is_valid(身份证号码)过滤了不合法的身份证后,只剩下30个左右是合法的
- 剩下的问题就是从这30个身份证号码中挑选出正确的一个。
由于个人觉得这部分不大符合咱们国家的社会主义核心价值观,这里就不做具体介绍,只给两个思路。
思路一:
某些软件注册时候需要输入姓名和身份证号,如果姓名和身份证号不相符合,则会注册不成功。
思路二
中国铁路12306。在个人中心-常用信息管理-常用联系人这里,添加常用联系人时候,如果姓名和身份证号不相符合是审核不通过的。
完整代码
import time
from id_validator import validator
Id_number = []
def get_date(year):
# 因为身份证的格式为年日月为1985****
layout = '%Y%m%d'
# 获取第一天你和最后一天的时间元祖
first_day = time.strptime(str(year) + '0101', layout)
last_day = time.strptime(str(year) + '1231', layout)
# 转换为时间戳
first_day = time.mktime(first_day) # 1514736000.0
last_day = time.mktime(last_day) # 1546185600.0
# for循环第一天到最后一天,步长为3600*24(一天的秒数)
for i in range(int(first_day), int(last_day) + 1, 3600 * 24):
# 先localtime转换为时间元祖,然后strftime转换为需要的时间格式
date = time.strftime(layout, time.localtime(i)) # 19850101 19850102..19851231
# 将365种可能的身份证号码添加到列表
Id_number.append('440101' + str(date) + '2171')
return Id_number
def get_legal_Id_num(year):
Id_number = get_date(year)
for Id_num in Id_number:
# 验证身份证的合法性
result = validator.is_valid(Id_num)
# 将合法的打印出来
if result:
print(Id_num)
get_legal_Id_num(1985)
好了,本次的文章分享就到这里。
本着学习交流的态度,小伙伴们可千万不要用在不该用的地方。
有任何问题欢迎在下方留言。