![fdfab9f6835ed9986b6111660409bd86.png](https://i-blog.csdnimg.cn/blog_migrate/6cedeea41cd496179303437877701443.png)
原文链接
周末带大家写个身份证信息查询小工具呀~mp.weixin.qq.com![80a5669b51e4d3e1a2dea88bf91ce262.png](https://i-blog.csdnimg.cn/blog_migrate/d8edf770a46be75ae12489efd68abec5.png)
导语
周末少躺会,早点起来给大家再更新一篇水文吧。
![62f19f1e49fb35492a4a3a850f9d9203.png](https://i-blog.csdnimg.cn/blog_migrate/759f5c25a7a8774b8ff785d81e8053cb.png)
昨天发现一个身份证信息查询的py包,感觉还算有点意思,于是过来分享一波,带大家用pyqt5写个身份证信息查询小工具,这个小工具大概包括以下两个功能吧:
- 验证输入的身份证号是否合法,如果合法则解析身份证号里包含的信息(地址,出生日期,性别,生肖等等);
- 根据输入信息(出生日期等)生成一个假的身份证号。
废话不多说,让我们愉快地开始吧~
开发工具
Python版本:3.6.4
相关模块:
PyQt5模块;
id-validator模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
原理其实蛮简单的,主要是借助id-validator这个第三方包来实现我们想要的功能。
首先pip安装一下:
pip install id-validator
接着,验证身份证号是否合法的话只需要这样做:
from id_validator import validator
validator.is_valid('8ddd00199408230021')
获取身份证号信息的话只需要这样做:
validator.get_info('8ddd00199408230021')
生成假的数据只需要这样子:
validator.fake_id(True, 出生地区, 出生日期, 性别)
![62f19f1e49fb35492a4a3a850f9d9203.png](https://i-blog.csdnimg.cn/blog_migrate/759f5c25a7a8774b8ff785d81e8053cb.png)
做个无情的调包机器人就ok了,不需要什么脑子。其实实现的原理也很简单,因为18位身份证号的构成是这样子的:
地址码:前6位, 比如北京的地址码是110000
出生日期码: 第7到14位, 比如20001001
顺序码: 第15到17位, 解释参见https://zhuanlan.zhihu.com/p/21286417
校验码: 第18位, 计算方式参见https://zhuanlan.zhihu.com/p/21286417
所以自己查点资料然后写个包实现上面那个包有的功能其实并不难,感兴趣的小伙伴可以自己试试。
接着,我们用PyQt封装一下上面的功能:
![b5388926841be5d9f28ca045662fe66a.png](https://i-blog.csdnimg.cn/blog_migrate/d59e4fe321b8d7791fe47036d926bd8c.png)
点击随机生成按钮会在身份证号栏的输入框中随机生成一个可以通过校验的身份证号。查询结果用来查看身份证号是否合法,以及如果合法的话,该身份证号所包含的信息的解析结果。
具体而言,核心代码如下:
'''验证并解析身份证号信息'''
def CheckAndParseID(self):
id_ = self.idcard_line_edit.text()
is_valid = validator.is_valid(id_)
if not is_valid:
self.result_text_edit.setText('身份证号是否合法: 否n身份证号信息: 无')
return
showinfo = '身份证号是否合法: 是n'
idinfos = validator.get_info(id_)
key_to_showtext = {
'address_code': '地址码',
'abandoned': '地址码是否废弃(1是废弃, 0是仍在使用)',
'address': '地址',
'birthday_code': '出生日期',
'constellation': '星座',
'chinese_zodiac': '生肖',
'sex': '性别',
}
for key, value in idinfos.items():
if key not in key_to_showtext: continue
showinfo += f'{key_to_showtext[key]}: {value}n'
self.result_text_edit.setText(showinfo)
'''生成假的身份证号'''
def generateID(self):
birthday = self.birthday_line_edit.text().replace('-', '')
birthday = birthday if birthday else None
address = self.address_line_edit.text()
address = address if address else None
sex = self.sex_combobox.currentText()
sex = 1 if sex == '男' else 0
try:
id_ = validator.fake_id(True, address, birthday, sex)
except:
id_ = validator.fake_id()
self.idcard_line_edit.setText(id_)
大功告成~完整源代码详见相关文件呗。
效果展示
在终端运行如下命令即可:
python idcardquer.py
效果如下:
知乎视频www.zhihu.com相关文件
https://github.com/CharlesPikachu/Tools