引言
有个需求需要通过身份证号去获取一些用户信息,包括出生地(省、市、区),性别,生日,年龄,生肖,星座等,因此写了个通用的接口,下面分享下方法。这里是Python写的,原理都差不多。
二代身份证号由18位组成
(1) 前1、2位数字表示:所在省(直辖市、自治区)的代码;
(2) 第3、4位数字表示:所在地级市(自治州)的代码;
(3) 第5、6位数字表示:所在区(县、自治县、县级市)的代码;
(4) 第7 – 14位数字表示:出生年、月、日;
(5) 第15、16位数字表示:所在地的派出所的代码;
(6) 第17位数字表示性别:奇数表示男性,偶数表示女性;
(7) 第18位数字是校检码:校检码可以是0-9的数字,或X表示。
实现
截取位数
id_addr = id_number[0:6]
id_birth = id_number[6:14]
id_sex = id_number[16:17]
获取性别
sex = 2 if int(id_sex) % 2 == 0 else 1
sex_desc = '女' if sex == 2 else '男'
获取生日
year = id_birth[0:4]
month = id_birth[4:6]
day = id_birth[6:8]
birth = '{}-{}-{}'.format(year, month, day)
获取年龄
写了个通用方法,支持多种格式的日期。
def get_age(birthday):
"""
获取年龄
:param birthday: 出生日期 yyyymmdd / yyyy-mm-dd / yyyy年mm月dd日
:return: 年龄
"""
birthday = str(birthday).replace('-', '').replace('年', '').replace('月', '').replace('日', '')
if len(birthday) != 8:
return False
today = str(datetime.datetime.now().strftime('%Y-%m-%d')).split("-")
today_m_d = today[1] + today[2]
today_y = today[0]
birth_m_d = birthday[4:]
birth_y = birthday[:4]
if int(today_m_d) >= int(birth_m_d):
age = int(today_y) - int(birth_y)
else:
age = int(today_y) - int(birth_y) - 1
return age
获取生肖
def get_zodiac(year):
"""
获取生肖
:param year: 年
:return: 生肖
"""
animals = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
zodiac = animals[int(year) % 12]
return zodiac
获取星座
def get_constellation(month, day):
"""
获取星座
:param month: 月
:param day: 日
:return: 星座
"""
con_dict = ('摩羯座', '水瓶座', '双鱼座', '白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座')
con_day = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22), (7, 23), (8, 23), (9, 23), (10, 23), (11, 23), (12, 23))
constellation = con_dict[len(list(filter(lambda y: y < (int(month), int(day)), con_day))) % 12]
return constellation
地区字典
地区字典从网上找的,大概校对了下。 此处只放了省份的,全放会导致很卡,如需全部请查看文件。
province = {
"11": "北京市",
"12": "天津市",
"13": "河北省",
"14": "山西省",
"15": "内蒙古自治区",
"21": "辽宁省",
"22": "吉林省",
"23": "黑龙江省",
"31": "上海市",
"32": "江苏省",
"33": "浙江省",
"34": "安徽省",
"35": "福建省",
"36": "江西省",
"37": "山东省",
"41": "河南省",
"42": "湖北省",
"43": "湖南省",
"44": "广东省",
"45": "广西壮族自治区",
"46": "海南省",
"50": "重庆市",
"51": "四川省",
"52": "贵州省",
"53": "云南省",
"54": "西藏自治区",
"61": "陕西省",
"62": "甘肃省",
"63": "青海省",
"64": "宁夏回族自治区",
"65": "新疆维吾尔自治区",
"71": "台湾省",
"81": "香港特别行政区",
"82": "澳门特别行政区"
}
获取地区
def get_province(code):
"""
获取省
:param code: 地区码
:return: 省
"""
if len(code) < 2:
return ''
p_code = str(code)[:2]
return province[p_code] if p_code in province else ''
def get_city(code):
"""
获取市
:param code: 地区码
:return: 市
"""
if len(code) < 4:
return ''
c_code = str(code)[:4]
return city[c_code] if c_code in city else ''
def get_area(code):
"""
获取县区
:param code: 地区码
:return: 县区
"""
if len(code) < 6:
return ''
a_code = str(code)[:6]
return area[a_code] if a_code in area else ''
p_res = get_province(id_addr)
c_res = get_city(id_addr)
a_res = get_area(id_addr)
addr = '{}{}{}'.format(p_res, c_res if c_res != p_res else '', a_res if a_res != c_res else '')
返回结果
result = {
'Sex': sex,
'SexDesc': sex_desc,
'Birthday': birth,
'Age': get_age(birth),
'Zodiac': get_zodiac(year),
'Constellation': get_constellation(month, day),
'Province': p_res,
'City': c_res,
'Area': a_res,
'Address': addr,
}
主要核心代码就是以上。