python 身份证号的有效性、生日(阴历阳历)、星座、生肖、性别、年龄、户籍所在地测试

python 身份证号的有效性、生日(阴历阳历)、星座、生肖、性别、年龄、户籍所在地测试

0x01 前言

本项目,仅用来学习使用,不可用作非法用途,项目主要用来解析身份证号码。

0x02 身份证号码格式

来自于网友,具体可百度,如何计算有效位,自行百度。

1.前1、2位数字表示:所在省(直辖市、自治区)的代码;
2.第3、4位数字表示:所在地级市(自治州)的代码;
3.第5、6位数字表示:所在区(县、自治县、县级市)的代码;
4.第7-14位数字表示:出生年、月、日;
5.第15、16位数字表示:所在地的派出所的代码;
6.第17位数字表示性别:奇数表示男性,偶数表示女性;
7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生, 用来检验身份证的正确性。校检码可以是0—9的数字,有时也用x表示。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现x,但如果尾号是10,那么就得用x来代替,因为如果用10做尾号,那么此人的身份证就变成了19位。x是罗马数字的10,用x来代替10,可以保证公民的身份证符合国家标准。

0x03 地区

关于身份证号前六位所代表的具体地区,数据来源于网络,本次数据来源于网站:https://www.cnblogs.com/sunbingqiang/p/9273362.html,我是写了个爬虫脚本,把这些数据爬了下来,然后构造成了json格式。

{
    "110000": {
        "addressID": "110000",
        "ProvinceID": "11",
        
        "ProvinceName": "北京市",
        "townName": "北京市",
        "RegionName": "华北地区"
    },
    "110100": {
        "addressID": "110100",
        "ProvinceID": "11",
        "ProvinceName": "北京市",
        "townName": "市辖区",
        "RegionName": "华北地区"
    },
    "110101": {
        "addressID": "110101",
        "ProvinceID": "11",
        "ProvinceName": "北京市",
        "townName": "东城区",
        "RegionName": "华北地区"
    },
    ...
}

在这里插入图片描述

0x04 代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/5/29 10:20
# @Author  : H
# @File    : checkID.py
# https://www.cnblogs.com/sunbingqiang/p/9273362.html

import json
import sxtwl
import datetime

id = '18位身份证号码'

"""校验省份证号时候有效"""


def checkID(id):
    xishu_17 = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    xishu_18 = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]
    sum = 0
    for i in range(17):
        sum = xishu_17[i] * int(id[i]) + sum
    if id[17] == 'x' or id[17] == 'X':
        flag = 10
    else:
        flag = int(id[17])
    if flag == xishu_18[sum % 11]:
        return "身份证号校验正确"
    else:
        return "error"


"""校验省份证号时候有效:百度百科给出的方法"""


def checkID01(id):
    flag = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'][
        sum([int(id[i]) * [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2][i] for i in range(17)]) % 11]
    if id[17] == flag:
        return "身份证号校验正确"
    else:
        return "error"


"""check men or women"""


def checkGender(id):
    if int(id[16]) % 2 == 1:
        return "男"
    else:
        return "女"


"""检测所在城市"""


def checkCity(id):
    cityNum = int(id[:4]) * 100
    areaNum = int(id[:6])
    cityID = json.load(open("city.json", encoding="utf-8"))
    if cityID.get(str(areaNum)) != None:
        city = f"{cityID[str(areaNum)]['RegionName'] + ' ' + cityID[str(areaNum)]['ProvinceName'] + ' ' + cityID[str(cityNum)]['townName'] + ' ' + cityID[str(areaNum)]['townName']}"
        return city
    else:
        return "error"


"""检测出生年月"""


def checkBirthday(id):
    year = int(id[6:10])
    month = int(id[10:12])
    day = int(id[12:14])
    return f"{year}年 {month}月 {day}日"


"""计算星座"""


def Zodiac(id):
    month = int(id[10:12])
    day = int(id[12:14])
    names = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座', u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')
    days = (
        (1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22), (7, 23), (8, 23), (9, 23), (10, 23), (11, 23), (12, 23))
    return names[len(list(filter(lambda y: y <= (month, day), days))) % 12]


"""阳历转阴历,并求生肖"""


def Solar2Lunar(id):
    year = int(id[6:10])
    month = int(id[10:12])
    day = int(id[12:14])
    lunar = sxtwl.Lunar()
    data = {}
    # 日历中文索引
    ymc = ["十一", "腊", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十"]
    rmc = ["初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八",
           "十九",
           "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十", "卅一"]
    # 通过阳历获取查询日期信息
    days = lunar.getDayBySolar(year, month, day)

    data['公历'] = str(days.y) + "年 " + str(days.m) + "月 " + str(days.d) + "日"
    if days.Lmc < 2:
        y = days.y - 1
    else:
        y = days.y
    data['生肖'] = "猴鸡狗猪鼠牛虎兔龙蛇马羊"[y % 12]

    if days.Lleap:

        data['阴历'] = str(y) + "年 " + "润" + str(ymc[days.Lmc]) + "月" + str(rmc[days.Ldi]) + "日"
    else:
        data['阴历'] = str(y) + "年 " + str(ymc[days.Lmc]) + "月" + str(rmc[days.Ldi]) + "日"
    return data


"""计算年龄"""


# 判断是否为闰年
def is_leap(year):
    if year % 400 == 0 or year % 40 == 0 or year % 4 == 0:
        return True
    else:
        return False


def howOldAreYou(id):
    year = int(id[6:10])
    month = int(id[10:12])
    day = int(id[12:14])
    birthday = datetime.datetime(year, month, day)
    today = datetime.date.today()
    month_days = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}
    y = today.year - birthday.year
    m = today.month - birthday.month
    d = today.day - birthday.day
    if d < 0:
        if birthday.month == 2:
            if is_leap(birthday.year):
                month_days[2] = 29
        d += month_days[birthday.month]
        m -= 1
    if m < 0:
        m += 12
        y -= 1
    if y == 0:
        if m == 0:
            return ('{}天'.format(d))
        else:
            return ('{}月 {}天'.format(m, d))
    else:
        return ('{}岁 {}月 {}天'.format(y, m, d))


def check(id):
    if checkID(id) != "error":
        print("*" * 100)
        print(f"身份证号:\t{id}")
        print(f"性别:\t{checkGender(id)}")
        print(f"生肖:\t{Solar2Lunar(id)['生肖']}")
        print(f"星座:\t{Zodiac(id)}")
        print(f"生日:\t{checkBirthday(id)}")
        print(f"公历:\t{Solar2Lunar(id)['公历']}")
        print(f"阴历:\t{Solar2Lunar(id)['阴历']}")
        print(f"年龄:\t{howOldAreYou(id)}")
        print(f"地区:\t{checkCity(id)}")
        print("*" * 100)
    else:
        print("身份证号校验错误!")

0x05 效果

在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值