《奇巧淫技》 系列-Python根据车票信息算出完整身份证Number

文章中出现的身份证号,皆为虚拟信息

文章只用作于学习交流,不得用于其他用途

文章纯属虚构,如有雷同,但是不会有雷同

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)

好了,本次的文章分享就到这里。
本着学习交流的态度,小伙伴们可千万不要用在不该用的地方。
有任何问题欢迎在下方留言。

发布了34 篇原创文章 · 获赞 210 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_45081575/article/details/102734432
今日推荐