1. 程式人生 > >python生成二代有效身份證號及其核驗有效性

python生成二代有效身份證號及其核驗有效性

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @author simpelzhuo

import random,time

class IdCardGenerator():
""" 生成身份證號 """
def idCardRandomGeneratorRand(self):
""" 隨機生成新的18為身份證號碼 """
ARR = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
LAST = ('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2')
t = time.localtime()[0]
x = '%02d%02d%02d%04d%02d%02d%03d' % (random.randint(10, 99), random.randint(1, 99), random.randint(1, 99), random.randint(t - 80, t - 18), random.randint(1, 12), random.randint(1, 28), random.randint(1, 999))
y = 0
for i in range(17):
y += int(x[i]) * ARR[i]
IDCard = '%s%s' % (x, LAST[y % 11])
return IDCard

def checkTrue(self,x1):
""" 驗證身份證號碼是否真實號碼 """
ARR = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
LAST = ('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2')
xlen = len(x1)
if xlen != 18 and xlen != 15:
return '身份證號碼長度錯誤'
try:
if xlen == 18:
x2 = x1[6:14]
x3 = time.strptime(x2, '%Y%m%d')
if x2 < '19000101' or x3 > time.localtime():
return '時間錯誤,超過允許的時間範圍'
else:
x2 = time.strptime(x1[6:12], '%y%m%d')
except Exception as e:
return '時間錯誤,非合法時間' + str(e)
if xlen == 18:
y = 0
for i in range(17):
y += int(x1[i]) * ARR[i]
if LAST[y % 11] != x1[-1].upper():
return '驗證碼錯誤'
return 'YES'



if __name__ == '__main__':
icg = IdCardGenerator()
idCardNO = icg.idCardRandomGeneratorRand()
print(idCardNO)
print(icg.checkTrue(idCardNO))
# t = time.localtime()[0]
# print('%02d'% random.randint(t - 80, t - 18))