测试工程师之【python】随机生成验真通过躲过校验的假身份证号

  • 时间:
  • 浏览:
  • 来源:互联网

1.脚本需求:
再写接口自动化脚本时候有个身份证录入的输入框,前端有计算验真规则若是假的会被校验,每次都是百度身份证网站复制很麻烦,接口层没有拦截校验但是会和数据库中校验是否已存在,刚开始使用random随机生成18位,再去调是否存在的接口判断是否存在若存在继续生成,若不存在数据插入成功但业务上这条数据后续在另外一个页面也会被校验假身份证号拦截直接GG了,所以从根源上不去复制还要自己生成真实的身份证号码

插曲:
百度了半天也没找到有对外的获取身份证号码的接口,又想用selenium身份证号码网站去爬取但是效率低输入年月日地区也比较麻烦有一定几率获取的是相同的

3.代码实现及思路
身份证前6位是市区如:北京-昌平,续8位如:出生年月日,续2位如:当地派出所代码,续1位如:男女,续1位也就是最后一位如:拿到前17位相加后余11,结果对应的拿到最后一位如:2、5、X等,市区是把北京全区维护写死了暂不需要全国范围,年份是随机取给了一个起始日期截至为当前年份在减去21也就是不能小于21岁,月份是12个月内随机取,日是28天内随机取怕遇到平年闰年有些年月没有30和31号,生成前17位后进入计算规则求和余11结果拿到对应的第18位,在自动化脚本中加上这个函数,实例化放到对应json串中Key的Value处

4.代码

import random

def ID():
    Area_code_list = [110100,110101,110102,110103,110104,110105,
                    110106,110107,110108,110109,110111,110112,110113,
                    110114,110115,110116,110117,110200,110228,110229]
    new_Area_code = str(random.choice(Area_code_list)) #列表中随机获取市区编码
    new_year = str(random.randint(1949,int(time.strftime('%Y'))-21))  #随机获取年份
    month = random.randint(1,12)  #随机获取月份
    day = random.randint(1,28)   #随机获取日
    reciprocal3 = str(random.randint(100,999))  #随机获取派出所代码及男女
    if month < 10:  #如果月份小于10加0如08、02
        month = '0' + str(month)
    if day < 10:  #如果日小于10加0如09、01
        day = '0' + str(day)
    id = new_Area_code + new_year + str(month) + str(day) + reciprocal3
    id_17_close = (int(id[0])*7)+(int(id[1])*9)+(int(id[2])*10)+(int(id[3])*5)+(int(id[4])*8)+(int(id[5])*4)+(int(id[6])*2)+(int(id[7])*1)+(int(id[8])*6)+(int(id[9])*3)+(int(id[10])*7)+(int(id[11])*9)+(int(id[12])*10)+(int(id[13])*5)+(int(id[14])*8)+(int(id[15])*4)+(int(id[16])*2)  #求和
    last_1_dict = {'0':'1','1':'0','2':'X','3':'9','4':'8','5':'7','6':'6','7':'5','8':'4','9':'3','10':'2'}
    for last_1 in last_1_dict:  #迭代循环字典中Key
        if id_17_close % 11 == int(last_1):  #如果余11等于字典中Key则终止生成身份证号码
            return id + last_1_dict[last_1]

if __name__ == "__main__":
	print(ID())

本文链接http://www.hatan.cn/news/show-69552.html