中华人民共和国居民身份证、中华人民共和国港澳居民居住证以及中华人民共和国**居民居住证号码验证工具(Python 版)支持 15 位与 18 位号码。仅支持 Python 3。
pip install id-validator
440308199901101512
和610104620927690
示例大陆居民身份证均为随机生成的假数据,如撞车,请联系删除。810000199408230021
和830000199201300022
示例港澳台居民居住证为北京市公安局公布的居住证样式号码。
验证身份证号是否合法,合法返回 True
,不合法返回 False
:
from id_validator import validator
validator.is_valid('440308199901101512') # 大陆居民身份证 18 位
validator.is_valid('610104620927690') # 大陆居民身份证 15 位
validator.is_valid('810000199408230021') # 港澳居民居住证 18 位
validator.is_valid('830000199201300022') # **居民居住证 18 位
当身份证号合法时,返回分析信息(地区、出生日期、星座、生肖、性别、校验位),不合法返回
False
:
from id_validator import validator
validator.get_info('440308199901101512') # 18 位
validator.get_info('610104620927690') # 15 位
返回信息格式如下:
{
'address_code' : '440308', # 地址码
'abandoned' : 0, # 地址码是否废弃,1 为废弃的,0 为正在使用的
'address' : '广东省深圳市盐田区', # 地址
'address_tree' : ['广东省', '深圳市', '盐田区'] # 省市区三级列表
'age' : 21, # 年龄,当前的年份减去出生年份,例:2020-1999=21
'birthday_code' : '1999-01-10', # 出生日期
'constellation' : '摩羯座', # 星座
'chinese_zodiac' : '卯兔', # 生肖
'sex' : 1, # 性别,1 为男性,0 为女性
'length' : 18, # 号码长度
'check_bit' : '2' # 校验码
}
注:判断地址码是否废弃的依据是中华人民共和国行政区划代码历史数据集,本数据集的采集源来自:中华人民共和国民政部,每年更新一次。本数据集采用
csv 格式存储,方便大家进行数据分析或者开发其他语言的版本。
伪造符合校验的身份证:
from id_validator import validator
validator.fake_id() # 18 位
validator.fake_id(False) # 15 位
validator.fake_id(True, '上海市', '2000', 1) # 生成出生于 2000 年上海市的男性居民身份证
validator.fake_id(True, '南山区', '1999', 0) # 生成出生于 1999 年广东省深圳市南山区的女性居民身份证
validator.fake_id(True, '江苏省', '200001', 1) # 生成出生于 2000 年 1 月江苏省的男性居民身份证
validator.fake_id(True, '厦门市', '199701', 0) # 生成出生于 1997 年 1 月福建省厦门市的女性居民身份证
validator.fake_id(True, '**省', '20131010', 0) # 生成出生于 2013 年 10 月 10 日**省的女性居民居住证
validator.fake_id(True, '香港特别行政区', '19970701', 0) # 生成出生于 1997 年 7 月 1 日香港特别行政区的女性居民居住证
15 位号码升级为 18 位:
from id_validator import validator
validator.upgrade_id('610104620927690')
- 1.0.10: get_info 返回值添加省市区三级列表
- 1.0.13: get_info 返回值添加年龄信息
id-validator.py's People
Forkers
allensmile mldxsj aydgelee chantwei fakegit ferrero-zhang keyman9848 npc7 renyijiu awesome-archive maalah 1312655689 hhy5277 bbb31313 xuduofeng namelessuzer wcnma niulinlnc wyl-brucelong alanlonglong junyu1991 bingbohe stevenlianyi xilongpei codecopy songrat wheatmr ps465777545 follow-the-vine-to-get-to-the-melon allister123 illiso justoneme awesomelib happog somenzz ryan-2012 zhangxiangyang tanyufei tammyqian david-leon restley renlvda gao66bin cnspica mf1389004071 jc986 ariczh arvinlvc huiwu crackercat crazybull44 yaozhengjie chikulis outbegin tinyloop jaredzhangjilei lixm-cn kingdom111111 oasisjay gaost07 liuqijie6 lghxiayan skycloudly tyretan huzhuangwu piyangyangle mayouzi sunshinelist enxier redreamality putaozhi123 fzpixzj90h7baqieoop5hg charygao barlowhaydnb crystony victorli bei0 snailflying fudai test1213145 tankman649 jamchina acheng6688id-validator.py's Issues
提取信息速度有点慢,建议优化一下
在我机器上单次get_info需要10ms,处理大批量数据时有点影响速度,建议优化一下,主要是每次加载data.py耗时很长,把那几个dict复用一下速度就会快很多
建立增加省份信息
因为地址码里已经有省份信息了,建议增加省份字段,不然从address里面提取省份也不方便
请问能否实现按规则(日期、顺序码连续那种)批量生成身份证的功能?有需要但一直没找到合适的工具
请问能否实现按规则(日期、顺序码连续那种)批量生成全部可能的身份证的功能?有需要但一直没找到合适的工具
比如根据参数设定,生成山东省1994出生的男性身份证、生成2022年1月1日江苏18-60周岁的人口
正则表达式问题
id-validator.py/id_validator/helper.py
Line 39 in 9f0ea3f
按我想的是,只需排除末尾是00的地址码即可,但这个正则筛选出来的其实是末尾两位数字中不存在0的情况,下面是示例:
>>> reg = r'^\d{4}[^0]{2}$'
>>> pattern = re.compile(reg)
>>> print(re.match(pattern, '610112'))
<re.Match object; span=(0, 6), match='610112'>
>>> print(re.match(pattern, '610102'))
None
>>> print(re.match(pattern, '610120'))
None
因为对这个地址码的规则不太了解,不知道是规则如此还是代码考虑不全的问题?
取模运算
id-validator.py/id_validator/helper.py
Line 276 in 9f0ea3f
这边取模运算,计算的值一定是 >= 0的,所以这行代码其实没有必要
data文件中value=‘未曾使用‘的数据是什么意思?
有个bug,编号等于341123时,取到的值是"未曾使用",helper.py line:275 , 在比较时会报错。
java版本
能出个java版本的吗
ValueError: invalid literal for int() with base 10: '*'
获取地理位置没有判断有效结束时间
def get_address(address_code, birthday_code):
"""
通过地址码与出生日期码获取地址信息
:param address_code:
:param birthday_code:
:return:
"""
address = ''
address_code_timeline = data.get_address_code_timeline()
timeline = address_code_timeline.get(address_code, '')
if timeline != '':
year = int(birthday_code[0:4])
for key, val in enumerate(timeline):
start_year = 0 if val['start_year'] == '' else int(val['start_year'])
if (key == 0 and year < start_year) or year >= start_year:
address = val['address']
return address
只判断了start_year是否有效,没有判断end_year,导致有的地理位置错误
bug:无 321119 区划代码
321119197310306324是有效身份证,验证返回False
版本:1.0.20
请问您是怎么根据年份对地区码进行查找的?
返回全部可能性已经实现
出现bug
出生年份有字母、15-17位有字母时报错
test on python 3.9
get_info中建议增加年龄信息
当前年份减去身份证中的年份即可,希望能增加年龄的信息
请问直接用省/市直属区划代码的身份证号现实生活里真实存在吗?这种校验是否会出现误差
请问直接用省/市直属区划代码的身份证号现实里真实存在吗?
例如370000199910231161、370300199910231168。现实生活里从来没见到,这种校验是否会出现误差?
单元测试新增python版本
验证有点问题:12403、230119、632824、622961 不在官方的数据库中
比如612403196703110032、23011919850826001X、632824197703100119、622961198010012335这些都是正确的身份证号码
出现BUG:地址区划代码与年份不同的错误身份证也能通过
例如假身份证号370620199505100123,但是1995年威海地区压根没有370620的地址区划代码,但是却能校验通过
關於區劃代碼的問題
實際使用過程中發現部分區劃代碼為 xxxx01 的身份證號被判定為無效號碼,查詢民政部的數據後發現廣東省代碼中均無 xxxx01(圖1),但對比查詢其他政府網站數據(註1-2)(圖2)後發現 xxxx01 應為市轄區的代碼,所以 id-validator 中引用的數據會導致將有效證件號誤判為無效的情況。
註1: http://www.gov.cn/test/2009-03/30/content_1272354.htm
註2: http://gdii.gd.gov.cn/ywfl/jsgz/content/post_939420.html
有的身份证 正确的但是校验显示不通过
有的身份证 正确的但是校验显示不通过 不过我不能发出这类身份证 很尬尴
birthday参数可能有点问题
validator.fake_id 传了 birthday 的时候 会有一定几率返回非 要求的 birthday 的身份证号
校验错误python版本
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.