重要节日与生日提醒-Python

发布于 2024-03-28  94 次阅读


需要安装lunardate和schedule

pip install lunardate
pip install schedule

完整代码:

import requests
from lunardate import LunarDate
import datetime
import schedule
import time

# 生日
birthdays = {
    # '生日示例': {
    #     'lunar_birthday': LunarDate(2000, 1, 1),
    #     'solar_birthday': datetime.date(2000, 1, 1)
    # },
    '生日示例': {'lunar_birthday': LunarDate(2000, 1, 1)},
    '生日示例': {'solar_birthday': datetime.date(2000, 1, 1)},
}

# 节日
festivals = {
    '农历示例': {'lunar_date': LunarDate(2000, 1, 1)},
    '公历示例': {'date': datetime.date(2000, 1, 1)},
}


# 发送请求的函数
def send_request(subject):
    apiUrl = 'http://xxx.com/send-post.php'
    sendkey = "xxx"

    data = {
        'sendkey': sendkey,
        "msgtype": "text",
        "text": 'Msg:\n'+subject
    }

    response = requests.post(apiUrl, data=data)

    if response.status_code == 200:
        print('请求发送成功')
    else:
        print(f'请求发送失败,状态码:{response.status_code}')

#


def check_and_send_birthday_msg():
    # 配置参数
    BIRTHDAY_REMIND_DAYS = 7  # 生日提前提醒天数
    FESTIVAL_REMIND_DAYS = 7  # 节日提前提醒天数

    # 获取当前日期
    now = datetime.datetime.now()
    today_solar = datetime.date.today()
    today_lunar = LunarDate.fromSolarDate(
        today_solar.year, today_solar.month, today_solar.day)

    # 日期偏移计算(使用配置参数)
    birthday_offset = datetime.timedelta(days=BIRTHDAY_REMIND_DAYS)
    festival_offset = datetime.timedelta(days=FESTIVAL_REMIND_DAYS)

    n_birthdayDays_later_solar = today_solar + birthday_offset
    n_birthdayDays_later_lunar = today_lunar + birthday_offset
    n_festivalDays_later_solar = today_solar + festival_offset
    n_festivalDays_later_lunar = LunarDate.fromSolarDate(
        n_festivalDays_later_solar.year, n_festivalDays_later_solar.month, n_festivalDays_later_solar.day)
    # 生日提醒处理

    def process_birthdays():
        for friend, info in birthdays.items():
            # 农历生日处理
            if 'lunar_birthday' in info:
                # 提前3天提醒
                if (info['lunar_birthday'].month == n_birthdayDays_later_lunar.month and
                        info['lunar_birthday'].day == n_birthdayDays_later_lunar.day):
                    send_request(
                        f'{BIRTHDAY_REMIND_DAYS}天后是 {friend} 的农历生日[蛋糕]')

                # 当天提醒
                if (info['lunar_birthday'].month == today_lunar.month and
                        info['lunar_birthday'].day == today_lunar.day):
                    send_request(f'今天是 {friend} 的农历生日[蛋糕]')

            # 阳历生日处理
            if 'solar_birthday' in info:
                # 提前3天提醒
                if (info['solar_birthday'].month == n_birthdayDays_later_solar.month and
                        info['solar_birthday'].day == n_birthdayDays_later_solar.day):
                    send_request(
                        f'{BIRTHDAY_REMIND_DAYS}天后是 {friend} 的阳历生日[蛋糕]')

                # 当天提醒
                if (info['solar_birthday'].month == today_solar.month and
                        info['solar_birthday'].day == today_solar.day):
                    send_request(f'今天是 {friend} 的阳历生日[蛋糕]')

    # 节日提醒处理
    def process_festivals():
        for festival, info in festivals.items():
            # 公历节日处理
            if 'date' in info:
                solar_date = info['date'].replace(year=today_solar.year)
                # 提前7天提醒
                if solar_date == n_festivalDays_later_solar:
                    send_request(f'{FESTIVAL_REMIND_DAYS}天后是 {festival}(公历)!')
                # 当天提醒
                if solar_date == today_solar:
                    send_request(f'今天是 {festival}(公历)!')

            # 农历节日处理
            if 'lunar_date' in info:
                # 提前7天提醒
                if (info['lunar_date'].month == n_festivalDays_later_lunar.month and
                        info['lunar_date'].day == n_festivalDays_later_lunar.day):
                    send_request(f'{FESTIVAL_REMIND_DAYS}天后是 {festival}(农历)!')
                # 当天提醒
                if (info['lunar_date'].month == today_lunar.month and
                        info['lunar_date'].day == today_lunar.day):
                    send_request(f'今天是 {festival}(农历)!')

    # 执行处理流程
    process_birthdays()
    process_festivals()


# 运行一次测试
check_and_send_birthday_msg()

让它每天执行就好了


参考原文: https://www.52pojie.cn/thread-1906430-1-1.html


THE END