文档章节

一个身份证验证接口[4]

vinci321
 vinci321
发布于 02/08 21:30
字数 1163
阅读 42
收藏 0
点赞 0
评论 0

代码:

#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 的前五条。

可以看到,数据匹配。同时,用于测试的数据由程序随机组合而成,这个也容易实现。若干年前全国联网没有之前,伪造身份证号码的算法就应该来自于此类程序。明天实现之。

© 著作权归作者所有

共有 人打赏支持
vinci321
粉丝 6
博文 85
码字总数 205255
作品 0
一个身份证号码验证接口[0]

背景:之前在地铁站遇到有警察查身份证,没有带身份证报身份证号码也可以,实际上是调用公安部身份证数据库的接口进行查询的,他们能做,为什么我不能做来看看? 实现功能: 输入一个身份证号...

vinci321 ⋅ 01/23 ⋅ 0

在php中使用对称加密DES3,开发银行卡绑定,实名验证

对称加密:对称加密是一种数据加密算法,对一组数据的加密和解密都使用一样的密钥(key),可以有效保护金融数据,常见的对称加密有DES,3DES,AES、RC2、RC4、RC5。 DES3: 对DES算法的组合,指定...

皇冠小丑 ⋅ 06/03 ⋅ 0

互联网金融平台常见绑卡鉴权方式分析对比

1.背景 互联网金融平台账户进行开户或者支付业务时,绑卡鉴权环节是必经之路。 那么什么是绑卡鉴权?绑卡是将用户银行卡信息提供给金融平台,以后金融平台就用这个信息去银行完成支付。绑卡实...

萧竹 ⋅ 2017/07/13 ⋅ 0

jQuery进行简单验证的正则表达式

1、验证电话号码或者手机号码 1 2 3 4 5 6 7 8 9 10 \d{ ( 2、验证地址(中文、英文、数字) 1 2 3 4 5 6 7 8 9 3、验证用户名 1 2 3 4 5 6 7 8 9 10 4、验证密码 1 2 3 4 5 6 7 8 9 10 5、验...

笨小熊 ⋅ 2015/10/28 ⋅ 0

手机丢了,但是里面装了支付宝,后果会如何?

一定要看完,也别忘了跟朋友分享! 支付宝关联银行卡,如果手机丢了会发生什么关于支付宝安全的帖子不少,那些帖子说的都是手机身份证银行卡一起丢,光凭身份证和卡就可以取钱了,何必通过支...

BruceGao ⋅ 2014/12/16 ⋅ 7

收款收银台上快捷支付(无卡支付)方案说明

快捷支付 即首次支付时通过验证用户的银行卡信息(如银行卡号、开户姓名、身份证号以及银行开户手机号等),绑定银行卡进行支付,一次绑定后,即可快速支付,最安全快捷的支付方式。 收银台提...

燃烧NO1 ⋅ 2016/09/20 ⋅ 0

中国身份证号码验证

using System; /// /// Summary description for IDCardValid /// public class IDCardValid { public IDCardValid() { // // TODO: Add constructor logic here // } /// /// 验证身份证号码......

晨曦之光 ⋅ 2012/03/09 ⋅ 0

有道的查询IP,身份证,手机的API接口封掉了,你们验证身份证真伪用什么方法?

今天有用户给我说身份验证不能通过了,注册不了,发现有道的手机,IP,身份证的接口都疯了,你们怎么验证呢和查询归属地? http://www.youdao.com/smartresult-xml/search.s?type=ip&q=ip地址...

wrean2013 ⋅ 2013/08/12 ⋅ 17

全国首张微信身份证来袭 预计明年1月推向全国

1:前言 重磅好消息,12.25这天,广州南沙签出全国第一张“微信身份证”!广东试点“网证” 下月全国推广,在南沙政务服务中心引入“微警认证”人脸识别技术,开通了“网证”的群众,身份证“...

祈澈姑娘 ⋅ 2017/12/27 ⋅ 0

java中身份*号正则表达式

很多学员在测试的时候对于java编写的程序中身份*号码的正则表达式不太清楚,在此专门写一篇博文说明一下。 首先要明白身份*号码的编码规则,然后根据编码规则去写正则表达式: 18位身份*号编...

昊洋教育 ⋅ 2017/07/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法之SlopOne

一、 算法原理 有别于基于用户的协同过滤和基于item的协同过滤,SlopeOne采用简单的线性模型估计用户对item的评分。如下图,估计UserB对ItemJ的偏好 图(1) 在真实情况下,该方法有如下几个...

xiaomin0322 ⋅ 24分钟前 ⋅ 0

LVM讲解

LVM是什么 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地...

李超小牛子 ⋅ 34分钟前 ⋅ 0

mysql更改密码、连接mysql、mysql常用命令

1. 更改mysql的root账户密码: mysql中root账户和系统root不是一个账户 1.1 更改环境变量PATH,增加mysql绝对路径 由于mysql安装目录为/usr/local/mysql/,所以系统不能直接使用mysql,需把/...

laoba ⋅ 35分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

猫耳m ⋅ 35分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云云栖社区 ⋅ 39分钟前 ⋅ 0

1.03-Maven中使用ueditor富文本编辑器

起因:在maven仓库未找到百度的ueditor的jar包 操作: 1.下载百度的ueditor的jar包 2.打开命令行,切换到ueditor的下载位置,运行一下命令: mvn install:install-file -Dfile=ueditor-1.1....

静以修身2025 ⋅ 44分钟前 ⋅ 0

几道Spring 面试题

1、BeanFactory 接口和 ApplicationContext 接口有什么区别? ApplicationContext 接口继承BeanFactory接口 Spring核心工厂是BeanFactory BeanFactory采取延迟加载,第一次getBean时才会初始...

职业搬砖20年 ⋅ 53分钟前 ⋅ 0

包饺子

http://storage.slide.news.sina.com.cn/slidenews/77_ori/2018_24/74766_826131_625489.gif

霜叶情 ⋅ 55分钟前 ⋅ 0

xml解析

方法一: String s_xml1 = "<xml>" + "<head>lalalalal</head>" + "<body>1234</body>" + "</xml>"; try { DocumentBuilderFactory documentBuilderFactory......

GithubXD ⋅ 今天 ⋅ 0

reuse stream

Although Java streams were designed to be operated only once, programmers still ask how to reuse a stream. From a simple web search, we can find many posts with this same issue ......

idoz ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部