一个身份证验证接口[4]
2018-02-08 00:00
387 查看
代码:
结果:
测试数据来源: http://shenfenzheng.293.net/?_t_t_t=0.9766452528640315 的前五条。
可以看到,数据匹配。同时,用于测试的数据由程序随机组合而成,这个也容易实现。若干年前全国联网没有之前,伪造身份证号码的算法就应该来自于此类程序。明天实现之。
#usr/bin/python # -*- coding: utf-8 -*- # Filename:idChecker.py import cityZoneDB import re class idChecker(): def __init__(self): self.db = cityZoneDB.CZDB() self.bigMonthes = (1, 3, 5, 7, 8, 10, 12) self.smallMonthes = (4, 6, 9, 11) self.weightList = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) self.validationList = (1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2) # 样式是否合法 def validation(self, idNumber): # 传参格式校验 # 正则(一共18位, 前17位为数字最后以为要么是数字要么是X) idNumber = idNumber.upper() pattern = '^[0-9]{18}|[0-9]{17}[X]{1}$' if not re.search(pattern, idNumber, re.M): print '身份证号码:%s格式错误' % idNumber return False self.db.connect() # 地区代码校验 zoneCode = self.checkZoneCode(idNumber[0:6]) if not zoneCode: print '身份证号码:%s行政编码错误' % idNumber return False self.db.dbConnection.close() # 出生年月日校验(平润年大小月日期) birthday = self.checkBirthDay(idNumber[6:14]) if not birthday: print '身份证号码:%s出生日期错误' % idNumber return False # 校验码校验 checkCode = self.checkCode(idNumber) if not checkCode: print '身份证号码:%s验证码错误' % idNumber return False genderAndSerial = self.genderAndSerial(idNumber[14:17]) addition = '是当时统计周期内该地区第%d派出所辖区内当天出生的第%d名%s性' % (genderAndSerial[0], genderAndSerial[1], '男' if genderAndSerial[2] else '女') print '身份证号码:%s合法,%s,%s,%s' % (idNumber, zoneCode, birthday, addition) return True # 行政编码校验 def checkZoneCode(self, zoneCode): try: cityCode = (int(zoneCode))/100*100 provinceCode = (int(zoneCode)/10000)*10000 sql = 'select address_name from %s where address_id in (%d, %d, %d)' % (self.db.newtable, provinceCode, cityCode, int(zoneCode)) # 执行SQL语句 self.db.cursor.execute(sql) # 获取所有记录列表 cityNames = self.db.cursor.fetchall() if len(cityNames) == 3: return '籍贯:'+cityNames[0][0]+cityNames[1][0]+cityNames[2][0] else: print '城市编号不存在' return False except Exception as e: print e.message print "Error: unable to fecth data" # 生日校验 def checkBirthDay(self, birthday): year = int(birthday[0:4]) month = int(birthday[4:6]) day = int(birthday[6:8]) isLeap = self.isLeapYear(year) if isLeap and (month == 2) and (day > 29): print '闰年出生日期不能超过2月29日' return False elif (not isLeap) and (month == 2) and (day>28): print '非闰年出生日期不能超过2月28日' return False elif (month in self.bigMonthes) and (day>31): print '大月出生日期不能超过31日' return False elif (month in self.smallMonthes) and (day>30): print '小月出生日期不能超过30日' return False elif not (month>0 and month<13): print '出生月份必须在1-12之间' return False elif not (day>0 and day<32): print '出生日期必须在1-31之间' return False else: return '出生日期:%d年%d月%d日' % (year,month,day) # 判断是否闰年 def isLeapYear(self,year): if year % 172800 == 0: return True elif year % 3200 != 0 and year % 400 == 0: return True elif year % 100 != 0 and year % 4 == 0: return True else: return False # 派出所代码,出生序号,性别校验 def genderAndSerial(self, gas): if int(gas[2]) % 2 == 0: return (int(gas[0:2]),int(gas[2])/2,0) else: return (int(gas[0:2]),(int(gas[2])+1)/2,1) # 验证身份证校验码 def checkCode(self, idNumber): i = sum = 0 while i < 17: sum += int(idNumber[i])*self.weightList[i] i += 1 key = sum % 11 code = self.validationList[key] if idNumber[-1] == str(code): return True else: return False id = idChecker() testNums = ['441225197608310342', '542224198002260419', '511529199111301159', '510108199204230658', '410211199307102667'] # 连接数据库 # id.db.connect() # 进行校验 for num in testNums: id.validation(num) # 关闭数据库连接 # id.db.dbConnection.close()
结果:
/usr/bin/python2.7 /home/c80k2/PycharmProjects/spider/idChecker.py 数据库连接成功 身份证号码:441225197608310342合法,籍贯:广东省肇庆市封开县,出生日期:1976年8月31日,是当时统计周期内该地区第3派出所辖区内当天出生的第2名女性 数据库连接成功 身份证号码:542224198002260419合法,籍贯:西藏自治区山南地区桑日县,出生日期:1980年2月26日,是当时统计周期内该地区第4派出所辖区内当天出生的第1名男性 数据库连接成功 身份证号码:511529199111301159合法,籍贯:四川省宜宾市屏山县,出生日期:1991年11月30日,是当时统计周期内该地区第11派出所辖区内当天出生的第3名男性 数据库连接成功 身份证号码:510108199204230658合法,籍贯:四川省成都市成华区,出生日期:1992年4月23日,是当时统计周期内该地区第6派出所辖区内当天出生的第3名男性 数据库连接成功 身份证号码:410211199307102667合法,籍贯:河南省开封市郊区,出生日期:1993年7月10日,是当时统计周期内该地区第26派出所辖区内当天出生的第3名女性 Process finished with exit code 0
测试数据来源: http://shenfenzheng.293.net/?_t_t_t=0.9766452528640315 的前五条。
可以看到,数据匹配。同时,用于测试的数据由程序随机组合而成,这个也容易实现。若干年前全国联网没有之前,伪造身份证号码的算法就应该来自于此类程序。明天实现之。
相关文章推荐
- 一个身份证号码验证接口[0]
- 一个身份证号码验证接口[2]
- 一个身份证验证接口[3]
- 一个身份证号码验证接口[1]
- 分享一个在线验证手机号码的接口
- 不要再喊“谁给我一个身份证号码验证的代码”了,脚本之家站长提供了
- 做一个牛XX的身份证号验证类(支持15位和18位)
- 一个验证身份证号码的javascript函数
- 【原创】贡献一个项目中用到的js身份证验证-超级准!!!
- 发一个身份证验证的javascript在此
- 实现一个对象验证库系列 -- 1) 接口介绍以及总体思路概述 (请大神批评)
- C#后台验证身份证号码的一个方法
- 一个Spring Boot, JWT,AugularJS接口安全验证的简单例子
- 身份证验证接口API(仅需一行代码,公安部实时接口)
- [转] 一个简单的身份证验证
- 一个用来验证身份证号码的JS
- java写的百度身份证验证接口使用
- 一个身份证验证的php函数
- 一个生成随机身份证号码的接口
- 使用sqlite3的接口函数完成一个用户登录验证功能模块设计 要封装成独立函数,在独立的main中调用测试;