RGPerson – 随机身份信息生成脚本

RGPerson 随机身份信息

做测试的时候经常遇到一些模拟注册的业务场景,要填写的东西很多,一般都是临时去百度信息,这样很繁琐所以决定造轮子撸了个随机身份生成的,如果是非测试场景,可参考社会工程学相关。

该脚本生成信息:姓名\年龄\性别\身份证\手机号

生成的信息都是模拟的假数据,仅限用于业务测试使用。

本编写原理

脚本的三大函数: genMobile()、genIdCard()、genName()

genMobile() 为随机生成手机号的函数

genName() 为随机生成姓名的函数

genIdCard() 为随机生成身份证的函数

genMobile()

随机生成手机号:需要知道国内手机号的构成

1.长度为十一位

2.前三位表示运营商

现在我们只需要做到收集手机号号段的前三位以及对应的运营商:

获取该数组的长度:len(prelist) -> 42

随机生成下标获取三位数:prelist.keys()[random.randint(0,41)]

然后再随机填补后8位即可:

genName()

随机生成姓名:中文名字通常为2、3位汉字组成

1.收集常用的姓氏随机取其一个:

2.这里一开始想搜罗常用的名字,但参考了其他师傅的代码发现随机生成中文字符更好一点:

3.随机生成名字的第二个字:(这里用一个list做一个空值,随机取生成的汉字或空值,用于成为随机生成2位名字或3位名字)

4.随机生成名字的最后一个字:(用于满足三个汉字的名字)

5.拼接

genIdCard()

随机生成身份证:公民身份号码是由17位数字码和1位校验码组成

18位数字组合的方式是:

1 1 0 1 0 2Y Y Y Y M M D D8 88X
区域码(6位)出生日期码(8位)顺序码(2位)性别码(1位)校验码(1位)
  • 6位区域码爬取http://www.360doc.com/content/12/1010/21/156610_240728293.shtml,存到了districtcode.py

区域码 指的是公民常住户口所在县(市、镇、区)的行政区划代码,如110102是北京市-西城区。但港澳台地区居民的身份号码只精确到省级。

  • 8位出生日期码,具体Python代码如下:

出生日期码 表示公民出生的公历年(4位)、月(2位)、日(2位)。

  • 2位顺序码

顺序码 表示在同一区域码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号。

  • 1位性别码

性别码 奇数表示男性,偶数表示女性。

  • 最后一位是校验码,这里采用的是ISO 7064:1983,MOD 11-2校验码系统。校验码为一位数,但如果最后采用校验码系统计算的校验码是“10”,碍于身份证号码为18位的规定,则以“X”代替校验码“10”。

最难的还是校验码的算法,参考师傅的解说:

  1. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
  2. 将这17位数字和系数相乘的结果相加。
  3. 用加出来和除以11,得余数
  4. 余数只可能是0 1 2 3 4 5 6 7 8 9 10这11个数字,其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
  5. 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ,如果余数是10,身份证的最后一位号码就是2。

测试代码如下,取了几个真实的身份证号码发现可用:

整合一下(Copy)就变成了如下完整的代码: