Browse Source

Merge remote-tracking branch 'origin/master'

zhangyong 1 year ago
parent
commit
60cfeef540

+ 259 - 0
app/auto_send_to_flow_pool.py

@@ -0,0 +1,259 @@
+"""
+created on Thursday, February,29 2024
+@author: luojunhui
+"""
+import os
+import sys
+import json
+import time
+
+import requests
+import datetime
+import schedule
+from odps import ODPS
+
+sys.path.append(os.getcwd())
+
+from application.common.log import AliyunLogger
+
+
+def bot(success_list):
+    """
+    机器人
+    """
+    url = "https://open.feishu.cn/open-apis/bot/v2/hook/641c6849-8bdc-4781-a79e-deb4af50fa49"
+    headers = {"Content-Type": "application/json"}
+    payload = {
+        "msg_type": "interactive",
+        "card": {
+            "elements": [
+                {
+                    "tag": "div",
+                    "text": {
+                        "content": "**成功送入流量池的视频一共{}条**\n{}".format(
+                            len(success_list), success_list
+                        ),
+                        "tag": "lark_md",
+                    },
+                },
+            ],
+            "header": {"title": {"content": "自动送入流量池: 通知 ✅", "tag": "plain_text"}},
+        },
+    }
+    requests.request("POST", url=url, headers=headers, data=json.dumps(payload))
+
+
+class OdpsFunction(object):
+    """
+    odps function class
+    """
+
+    def __init__(self):
+        self.endpoint = "http://service.cn.maxcompute.aliyun.com/api"
+        self.access_id = "LTAIWYUujJAm7CbH"
+        self.access_key = "RfSjdiWwED1sGFlsjXv0DlfTnZTG1P"
+        self.project = "loghubods"
+
+        self.od = ODPS(
+            access_id=self.access_id,
+            secret_access_key=self.access_key,
+            endpoint=self.endpoint,
+            project=self.project,
+        )
+
+    def select(self, sql):
+        """
+        :param sql: 查询语句
+        :return: odps_obj{}
+        """
+        with self.od.execute_sql(sql).open_reader() as reader:
+            if reader:
+                return [item for item in reader]
+            else:
+                return []
+
+
+def generate_flow_pool_levels():
+    """
+    读取流量池 level_id表并且通过流量池层级来生成 id
+    :return:
+    """
+    url = "https://admin.piaoquantv.com/manager/flowpool/pageList"
+    payload = {
+        "pageNum": 1,
+        "pageSize": 10000
+    }
+    headers = {
+        'authority': 'admin.piaoquantv.com',
+        'accept': 'application/json',
+        'accept-language': 'en,zh;q=0.9',
+        'content-type': 'application/json',
+        'cookie': 'SESSION=ZDY1MTYxODgtNGQ2OS00YzA4LThlMzAtMmE3YzllNGQ4ODk5',
+        'origin': 'https://admin.piaoquantv.com',
+        'referer': 'https://admin.piaoquantv.com/cms/post-detail/19014920/detail',
+        'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
+        'sec-ch-ua-mobile': '?0',
+        'sec-ch-ua-platform': '"macOS"',
+        'sec-fetch-dest': 'empty',
+        'sec-fetch-mode': 'cors',
+        'sec-fetch-site': 'same-origin',
+        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
+    }
+    res = requests.request("POST", url, json=payload, headers=headers).json()
+    # print(res.json())
+    pool_list = res['content']['list']
+    for pool in pool_list:
+        if pool['id'] == -1:
+            levels = pool['levels']
+            return levels
+
+
+def generate_flow_map():
+    """
+    生成 level_id 映射表
+    :return:
+    """
+    try:
+        levels = generate_flow_pool_levels()
+        w = {}
+        for level in levels:
+            w[str(level['level'])] = level['id']
+        return w
+    except:
+        return {}
+
+
+class AutoSendToFlowPool(object):
+    """
+    定时任务方式
+    自动把优质视频送入流量池高层
+    方法:
+        定时从表中读取 待推荐的新视频的数据;
+        判断条件,满足规则的数据则自动送入流量池高层;
+    """
+
+    def __init__(self):
+        self.header = {
+            "authority": "admin.piaoquantv.com",
+            "accept": "application/json",
+            "accept-language": "zh,en;q=0.9,zh-CN;q=0.8",
+            "content-type": "application/json",
+            "cookie": "SESSION=NTk4MWQ5MDItZTI1ZS00YjI1LTllN2MtNThiY2M4MjhiZjVh",
+            "origin": "https://admin.piaoquantv.com",
+            "referer": "https://admin.piaoquantv.com/cms/post-detail/18811646/detail",
+            "sec-ch-ua": '"Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"',
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": '"macOS"',
+            "sec-fetch-dest": "empty",
+            "sec-fetch-mode": "cors",
+            "sec-fetch-site": "same-origin",
+            "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
+        }
+        self.enter_url = "https://api-internal.piaoquantv.com/flowpool/video/enter/abPool"
+        self.flow_pool_map = {
+            "1": 24,
+            "2": 25,
+            "3": 26,
+            "4": 27,
+            "5": 28,
+            "6": 29
+        }
+        self.odp = OdpsFunction()
+        self.aliyun_log = AliyunLogger(platform="home", mode="automatic")
+
+    def get_data_from_flow_pool(self):
+        """
+        get recommend videos from MySQL
+        :return: List [{}, {}, {}......]
+        """
+        t = datetime.datetime.now().strftime("%Y%m%d%H")
+        sql = f"""select videoid, target_level, uid from loghubods.auto_enter_flow_pool_videolist where dt = '{t}';"""
+        data = self.odp.select(sql)
+        return data
+
+    def send_to_flow_pool_level(self, obj, flow_pool_id=-1):
+        """
+        send video to different flow pool levels
+        :param obj: {
+            "videoid": video id,
+            "target_level": flow pool level, ranges from 1 to 4
+        }
+        :param flow_pool_id: flow pool id, define -1
+        :return: bool, False / True
+        """
+        pool_map = generate_flow_map()
+        if not pool_map:
+            pool_map = self.flow_pool_map
+        level = str(obj["target_level"])
+        level_id = pool_map[level]
+
+        o = {
+            "flowPoolId": flow_pool_id,
+            "startType": 2,
+            "uid": int(obj['uid']),
+            "videoId": int(obj["videoid"]),
+            "flowPoolLevelId": level_id
+        }
+        self.aliyun_log.logging(
+            code="4003",
+            message="请求地址: {}".format(self.enter_url),
+            data=o
+        )
+        response = requests.request("POST", self.enter_url, headers=self.header, json=o)
+        if response.json()['code'] == 0:
+            self.aliyun_log.logging(
+                code="4003",
+                message="返回",
+                data=response.json()
+            )
+            self.aliyun_log.logging(
+                code="4001", message="有一条视频成功送入流量池", data={"vid": obj['videoid'], "level": level_id}
+            )
+            return True
+        else:
+            self.aliyun_log.logging(
+                code="4004",
+                message=response.json()['msg'] if response.json().get('msg') else "操作失败",
+                data=response.json(),
+                account=int(obj["videoid"])
+            )
+            return False
+
+    def auto_process(self):
+        """
+        auto process this task in schedule
+        :return:
+        """
+        successful_list = []
+        for i in range(20):
+            data = self.get_data_from_flow_pool()
+            if data:
+                self.aliyun_log.logging(
+                    code=4001, message="该小时一共有 {} 条视频需要被送入流量池".format(len(data)),
+                    data=[item['videoid'] for item in data]
+                )
+                for obj in data:
+                    if self.send_to_flow_pool_level(obj):
+                        successful_list.append(obj['videoid'])
+
+                # robot send message to the group, notice the successful count and the fail count
+                if successful_list:
+                    bot(successful_list)
+                return
+            else:
+                self.aliyun_log.logging(
+                    code=4006,
+                    message="未扫描到数据, 等待 60s * {}".format(i + 1)
+                )
+                time.sleep(60)
+
+        # 本小时没有扫描到数据
+
+
+if __name__ == "__main__":
+    AS = AutoSendToFlowPool()
+
+    schedule.every().hour.at(":08").do(AS.auto_process)
+    while True:
+        schedule.run_pending()
+        time.sleep(10)

+ 392 - 0
app/festival_reminder.py

@@ -0,0 +1,392 @@
+"""
+节日提醒, festival reminder
+"""
+import json
+import datetime
+import time
+
+import requests
+import schedule
+
+
+def bot(festival_info, days_count, date_str):
+    """
+    机器人
+    """
+    level = festival_info["level"]
+    festival = festival_info["festival"]
+    category = festival_info["category"]
+    url = "https://open.feishu.cn/open-apis/bot/v2/hook/8eda2f73-e6f5-4fcd-944e-5a34579e1049"
+    # url = "https://open.feishu.cn/open-apis/bot/v2/hook/f32c0456-847f-41f3-97db-33fcc1616bcd"
+    headers = {"Content-Type": "application/json"}
+
+    if level == "P0":
+        payload = {
+            "msg_type": "interactive",
+            "card": {
+                "elements": [
+                    {
+                        "tag": "div",
+                        "text": {
+                            "content": "📣热点内容节点通知,请注意查收<at id=all></at>\n",
+                            "tag": "lark_md"
+                        }
+                    },
+                    {
+                        "tag": "div",
+                        "text": {
+                            "content": "节日类型: **{}**\n距离**{}**还有**{}天**,请提前做好内容准备哦\n**{}日期: \t{}**".format(
+                                category, festival, days_count, festival, date_str
+                            ),
+                            "tag": "lark_md",
+                        },
+                    },
+                ],
+                "header": {"title": {"content": "【🔥P0重点关注】", "tag": "plain_text"}},
+            },
+        }
+        requests.request("POST", url=url, headers=headers, data=json.dumps(payload))
+    if level == "P1":
+        payload = {
+            "msg_type": "interactive",
+            "card": {
+                "elements": [
+                    {
+                        "tag": "div",
+                        "text": {
+                            "content": "📣热点内容节点通知,请注意查收<at id=all></at>\n",
+                            "tag": "lark_md"
+                        }
+                    },
+                    {
+                        "tag": "div",
+                        "text": {
+                            "content": "节日类型: **{}**\n距离**{}**还有**{}天**,请提前做好内容准备哦\n**{}日期: \t{}**".format(
+                                category, festival, days_count, festival, date_str
+                            ),
+                            "tag": "lark_md",
+                        },
+                    },
+                ],
+                "header": {"title": {"content": "【💡P1关注】", "tag": "plain_text"}},
+            },
+        }
+        requests.request("POST", url=url, headers=headers, data=json.dumps(payload))
+
+
+class FestivalReminder(object):
+    """
+    节日提醒对象
+    """
+
+    def __init__(self):
+        self.festival_dict = {
+            "2024": {
+                "2024-01-01": [{"level": "P0", "festival": "元旦", "category": "节假日"}],
+                "2024-01-18": [{"level": "P0", "festival": "腊八节", "category": "节假日"}],
+                "2024-02-02": [{"level": "P0", "festival": "小年", "category": "节假日"}],
+                "2024-02-03": [{"level": "p0", "festival": "小年", "category": "节假日"}],
+                "2024-02-09": [{"level": "P0", "festival": "除夕", "category": "节假日"}],
+                "2024-02-10": [
+                    {"level": "P0", "festival": "春节", "category": "节假日"},
+                    {"level": "P0", "festival": "正月初一", "category": "节假日"},
+                ],
+                "2024-02-11": [{"level": "P0", "festival": "正月初二", "category": "节假日"}],
+                "2024-02-12": [{"level": "P0", "festival": "正月初三", "category": "节假日"}],
+                "2024-02-13": [{"level": "P0", "festival": "正月初四", "category": "节假日"}],
+                "2024-02-14": [
+                    {"level": "P0", "festival": "正月初五", "category": "节假日"},
+                    {"level": "P1", "festival": "情人节", "category": "节假日"},
+                ],
+                "2024-02-24": [{"level": "P0", "festival": "元宵节", "category": "节假日"}],
+                "2024-03-11": [{"level": "P0", "festival": "龙抬头", "category": "节假日"}],
+                "2024-03-08": [{"level": "P1", "festival": "妇女节", "category": "节假日"}],
+                "2024-05-01": [{"level": "P0", "festival": "劳动节", "category": "节假日"}],
+                "2024-05-12": [{"level": "P0", "festival": "母亲节", "category": "节假日"}],
+                "2024-06-01": [{"level": "P1", "festival": "儿童节", "category": "节假日"}],
+                "2024-06-10": [{"level": "P0", "festival": "端午节", "category": "节假日"}],
+                "2024-06-16": [{"level": "P0", "festival": "父亲节", "category": "节假日"}],
+                "2024-07-01": [{"level": "P0", "festival": "建党节", "category": "节假日"}],
+                "2024-07-07": [{"level": "P0", "festival": "七七事变", "category": "节假日"}],
+                "2024-08-01": [{"level": "P1", "festival": "建军节", "category": "节假日"}],
+                "2024-08-10": [{"level": "P0", "festival": "七夕节", "category": "节假日"}],
+                "2024-08-18": [{"level": "P1", "festival": "中元节", "category": "节假日"}],
+                "2024-09-17": [{"level": "P0", "festival": "中秋节", "category": "节假日"}],
+                "2024-10-01": [{"level": "P0", "festival": "国庆节", "category": "节假日"}],
+                "2024-10-11": [{"level": "P0", "festival": "重阳节", "category": "节假日"}],
+                "2024-11-28": [{"level": "P1", "festival": "感恩节", "category": "节假日"}],
+                "2024-12-13": [{"level": "P0", "festival": "公祭日", "category": "节假日"}],
+                "2024-12-24": [{"level": "P1", "festival": "平安夜", "category": "节假日"}],
+                "2024-12-25": [{"level": "P1", "festival": "圣诞节", "category": "节假日"}],
+                "2024-01-06": [{"level": "P1", "festival": "小寒", "category": "节气"}],
+                "2024-01-20": [{"level": "P1", "festival": "大寒", "category": "节气"}],
+                "2024-02-04": [{"level": "P0", "festival": "立春", "category": "节气"}],
+                "2024-02-19": [
+                    {"level": "P1", "festival": "雨水", "category": "节气"},
+                    {"level": "P0", "festival": "邓小平逝世", "category": "纪念日"},
+                ],
+                "2024-03-05": [
+                    {"level": "P1", "festival": "惊蛰", "category": "节气"},
+                    {"level": "P0", "festival": "周恩来诞辰", "category": "纪念日"},
+                    {"level": "P1", "festival": "学雷锋纪念日", "category": "纪念日"},
+                ],
+                "2024-03-20": [{"level": "P1", "festival": "春分", "category": "节气"}],
+                "2024-04-04": [{"level": "P0", "festival": "清明", "category": "节气"}],
+                "2024-04-19": [{"level": "P1", "festival": "谷雨", "category": "节气"}],
+                "2024-05-05": [{"level": "P0", "festival": "立夏", "category": "节气"}],
+                "2024-05-20": [{"level": "P1", "festival": "小满", "category": "节气"}],
+                "2024-06-05": [{"level": "P1", "festival": "芒种", "category": "节气"}],
+                "2024-06-21": [{"level": "P1", "festival": "夏至", "category": "节气"}],
+                "2024-07-06": [
+                    {"level": "P1", "festival": "小暑", "category": "节气"},
+                    {"level": "P1", "festival": "朱德逝世", "category": "纪念日"},
+                ],
+                "2024-07-22": [{"level": "P1", "festival": "大暑", "category": "节气"}],
+                "2024-08-07": [{"level": "P0", "festival": "立秋", "category": "节气"}],
+                "2024-08-22": [
+                    {"level": "P1", "festival": "处暑", "category": "节气"},
+                    {"level": "P0", "festival": "邓小平诞辰", "category": "纪念日"},
+                ],
+                "2024-09-07": [
+                    {"level": "P1", "festival": "白露", "category": "节气"},
+                    {"level": "P1", "festival": "袁隆平诞辰", "category": "纪念日"},
+                ],
+                "2024-09-22": [{"level": "P1", "festival": "秋分", "category": "节气"}],
+                "2024-10-08": [{"level": "P1", "festival": "寒露", "category": "节气"}],
+                "2024-10-23": [{"level": "P1", "festival": "霜降", "category": "节气"}],
+                "2024-11-07": [{"level": "P0", "festival": "立冬", "category": "节气"}],
+                "2024-11-22": [{"level": "P1", "festival": "小雪", "category": "节气"}],
+                "2024-12-06": [{"level": "P1", "festival": "大雪", "category": "节气"}],
+                "2024-12-21": [{"level": "P0", "festival": "冬至", "category": "节气"}],
+                "2024-11-12": [{"level": "P1", "festival": "孙中山诞辰", "category": "纪念日"}],
+                "2024-03-12": [{"level": "P1", "festival": "孙中山逝世", "category": "纪念日"}],
+                "2024-12-26": [{"level": "P0", "festival": "毛主席诞辰", "category": "纪念日"}],
+                "2024-09-09": [{"level": "P0", "festival": "毛主席逝世", "category": "纪念日"}],
+                "2024-01-08": [{"level": "P0", "festival": "周恩来逝世", "category": "纪念日"}],
+                "2024-07-03": [{"level": "P0", "festival": "李克强诞辰", "category": "纪念日"}],
+                "2024-10-27": [
+                    {"level": "P0", "festival": "李克强逝世", "category": "纪念日"},
+                    {"level": "P1", "festival": "吴尊友逝世", "category": "纪念日"},
+                ],
+                "2024-05-22": [{"level": "P1", "festival": "袁隆平逝世", "category": "纪念日"}],
+                "2024-10-24": [{"level": "P1", "festival": "彭德怀诞辰", "category": "纪念日"}],
+                "2024-11-29": [{"level": "P1", "festival": "彭德怀逝世", "category": "纪念日"}],
+                "2024-12-01": [{"level": "P1", "festival": "朱德诞辰", "category": "纪念日"}],
+            },
+            "2025": {
+                "2025-01-01": [{"level": "P0", "festival": "元旦", "category": "节假日"}],
+                "2025-01-07": [{"level": "P0", "festival": "腊八节", "category": "节假日"}],
+                "2025-01-22": [{"level": "P0", "festival": "小年", "category": "节假日"}],
+                "2025-01-23": [{"level": "p0", "festival": "小年", "category": "节假日"}],
+                "2025-01-28": [{"level": "P0", "festival": "除夕", "category": "节假日"}],
+                "2025-01-29": [
+                    {"level": "P0", "festival": "春节", "category": "节假日"},
+                    {"level": "P0", "festival": "正月初一", "category": "节假日"},
+                ],
+                "2025-01-30": [{"level": "P0", "festival": "正月初二", "category": "节假日"}],
+                "2025-01-31": [{"level": "P0", "festival": "正月初三", "category": "节假日"}],
+                "2025-02-01": [{"level": "P0", "festival": "正月初四", "category": "节假日"}],
+                "2025-02-02": [{"level": "P0", "festival": "正月初五", "category": "节假日"}],
+                "2025-02-14": [{"level": "P1", "festival": "情人节", "category": "节假日"}],
+                "2025-02-22": [{"level": "P0", "festival": "元宵节", "category": "节假日"}],
+                "2025-03-01": [{"level": "P0", "festival": "龙抬头", "category": "节假日"}],
+                "2025-03-08": [{"level": "P1", "festival": "妇女节", "category": "节假日"}],
+                "2025-05-01": [{"level": "P0", "festival": "劳动节", "category": "节假日"}],
+                "2025-05-11": [{"level": "P0", "festival": "母亲节", "category": "节假日"}],
+                "2025-06-01": [{"level": "P1", "festival": "儿童节", "category": "节假日"}],
+                "2025-05-31": [{"level": "P0", "festival": "端午节", "category": "节假日"}],
+                "2025-06-15": [{"level": "P0", "festival": "父亲节", "category": "节假日"}],
+                "2025-07-01": [{"level": "P0", "festival": "建党节", "category": "节假日"}],
+                "2054-07-07": [{"level": "P0", "festival": "七七事变", "category": "节假日"}],
+                "2025-08-01": [{"level": "P1", "festival": "建军节", "category": "节假日"}],
+                "2025-08-29": [{"level": "P0", "festival": "七夕节", "category": "节假日"}],
+                "2025-09-06": [{"level": "P1", "festival": "中元节", "category": "节假日"}],
+                "2025-10-06": [{"level": "P0", "festival": "中秋节", "category": "节假日"}],
+                "2025-10-01": [{"level": "P0", "festival": "国庆节", "category": "节假日"}],
+                "2025-10-29": [{"level": "P0", "festival": "重阳节", "category": "节假日"}],
+                "2024-11-27": [{"level": "P1", "festival": "感恩节", "category": "节假日"}],
+                "2025-12-13": [{"level": "P0", "festival": "公祭日", "category": "节假日"}],
+                "2025-12-24": [{"level": "P1", "festival": "平安夜", "category": "节假日"}],
+                "2025-12-25": [{"level": "P1", "festival": "圣诞节", "category": "节假日"}],
+                "2025-01-05": [{"level": "P1", "festival": "小寒", "category": "节气"}],
+                "2025-01-20": [{"level": "P1", "festival": "大寒", "category": "节气"}],
+                "2025-02-03": [{"level": "P0", "festival": "立春", "category": "节气"}],
+                "2025-02-18": [{"level": "P1", "festival": "雨水", "category": "节气"}],
+                "2025-03-05": [
+                    {"level": "P1", "festival": "惊蛰", "category": "节气"},
+                    {"level": "P0", "festival": "周恩来诞辰", "category": "纪念日"},
+                    {"level": "P1", "festival": "学雷锋纪念日", "category": "纪念日"},
+                ],
+                "2025-03-20": [{"level": "P1", "festival": "春分", "category": "节气"}],
+                "2025-04-04": [{"level": "P0", "festival": "清明", "category": "节气"}],
+                "2025-04-20": [{"level": "P1", "festival": "谷雨", "category": "节气"}],
+                "2025-05-05": [{"level": "P0", "festival": "立夏", "category": "节气"}],
+                "2025-05-21": [{"level": "P1", "festival": "小满", "category": "节气"}],
+                "2025-06-05": [{"level": "P1", "festival": "芒种", "category": "节气"}],
+                "2025-06-21": [{"level": "P1", "festival": "夏至", "category": "节气"}],
+                "2025-07-07": [{"level": "P1", "festival": "小暑", "category": "节气"}],
+                "2025-07-22": [{"level": "P1", "festival": "大暑", "category": "节气"}],
+                "2025-08-07": [{"level": "P0", "festival": "立秋", "category": "节气"}],
+                "2025-08-23": [{"level": "P1", "festival": "处暑", "category": "节气"}],
+                "2025-09-07": [
+                    {"level": "P1", "festival": "白露", "category": "节气"},
+                    {"level": "P1", "festival": "袁隆平诞辰", "category": "纪念日"},
+                ],
+                "2025-09-23": [{"level": "P1", "festival": "秋分", "category": "节气"}],
+                "2025-10-08": [{"level": "P1", "festival": "寒露", "category": "节气"}],
+                "2025-10-23": [{"level": "P1", "festival": "霜降", "category": "节气"}],
+                "2025-11-07": [{"level": "P0", "festival": "立冬", "category": "节气"}],
+                "2025-11-22": [{"level": "P1", "festival": "小雪", "category": "节气"}],
+                "2025-12-07": [{"level": "P1", "festival": "大雪", "category": "节气"}],
+                "2025-12-21": [{"level": "P0", "festival": "冬至", "category": "节气"}],
+                "2025-11-12": [{"level": "P1", "festival": "孙中山诞辰", "category": "纪念日"}],
+                "2025-03-12": [{"level": "P1", "festival": "孙中山逝世", "category": "纪念日"}],
+                "2025-12-26": [{"level": "P0", "festival": "毛主席诞辰", "category": "纪念日"}],
+                "2025-09-09": [{"level": "P0", "festival": "毛主席逝世", "category": "纪念日"}],
+                "2025-01-08": [{"level": "P0", "festival": "周恩来逝世", "category": "纪念日"}],
+                "2025-08-22": [{"level": "P0", "festival": "邓小平诞辰", "category": "纪念日"}],
+                "2025-02-19": [{"level": "P0", "festival": "邓小平逝世", "category": "纪念日"}],
+                "2025-07-03": [{"level": "P0", "festival": "李克强诞辰", "category": "纪念日"}],
+                "2025-10-27": [
+                    {"level": "P0", "festival": "李克强逝世", "category": "纪念日"},
+                    {"level": "P1", "festival": "吴尊友逝世", "category": "纪念日"},
+                ],
+                "2025-05-22": [{"level": "P1", "festival": "袁隆平逝世", "category": "纪念日"}],
+                "2025-10-24": [{"level": "P1", "festival": "彭德怀诞辰", "category": "纪念日"}],
+                "2025-11-29": [{"level": "P1", "festival": "彭德怀逝世", "category": "纪念日"}],
+                "2025-12-01": [{"level": "P1", "festival": "朱德诞辰", "category": "纪念日"}],
+                "2025-07-06": [{"level": "P1", "festival": "朱德逝世", "category": "纪念日"}],
+            },
+            "2026": {
+                "2026-01-01": [{"level": "P0", "festival": "元旦", "category": "节假日"}],
+                "2026-01-26": [{"level": "P0", "festival": "腊八节", "category": "节假日"}],
+                "2026-02-10": [{"level": "P0", "festival": "小年", "category": "节假日"}],
+                "2026-02-11": [{"level": "p0", "festival": "小年", "category": "节假日"}],
+                "2026-02-16": [{"level": "P0", "festival": "除夕", "category": "节假日"}],
+                "2026-02-17": [
+                    {"level": "P0", "festival": "春节", "category": "节假日"},
+                    {"level": "P0", "festival": "正月初一", "category": "节假日"},
+                ],
+                "2026-02-18": [
+                    {"level": "P0", "festival": "正月初二", "category": "节假日"},
+                    {"level": "P1", "festival": "雨水", "category": "节气"},
+                ],
+                "2026-02-19": [
+                    {"level": "P0", "festival": "正月初三", "category": "节假日"},
+                    {"level": "P0", "festival": "邓小平逝世", "category": "纪念日"},
+                ],
+                "2026-02-20": [{"level": "P0", "festival": "正月初四", "category": "节假日"}],
+                "2026-02-21": [{"level": "P0", "festival": "正月初五", "category": "节假日"}],
+                "2026-02-14": [{"level": "P1", "festival": "情人节", "category": "节假日"}],
+                "2026-03-03": [{"level": "P0", "festival": "元宵节", "category": "节假日"}],
+                "2026-03-20": [
+                    {"level": "P0", "festival": "龙抬头", "category": "节假日"},
+                    {"level": "P1", "festival": "春分", "category": "节气"},
+                ],
+                "2026-03-08": [{"level": "P1", "festival": "妇女节", "category": "节假日"}],
+                "2026-05-01": [{"level": "P0", "festival": "劳动节", "category": "节假日"}],
+                "2026-05-10": [{"level": "P0", "festival": "母亲节", "category": "节假日"}],
+                "2026-06-01": [{"level": "P1", "festival": "儿童节", "category": "节假日"}],
+                "2026-06-19": [{"level": "P0", "festival": "端午节", "category": "节假日"}],
+                "2026-06-21": [
+                    {"level": "P0", "festival": "父亲节", "category": "节假日"},
+                    {"level": "P1", "festival": "夏至", "category": "节气"},
+                ],
+                "2026-07-01": [{"level": "P0", "festival": "建党节", "category": "节假日"}],
+                "2026-07-07": [
+                    {"level": "P0", "festival": "七七事变", "category": "节假日"},
+                    {"level": "P1", "festival": "小暑", "category": "节气"},
+                ],
+                "2026-08-01": [{"level": "P1", "festival": "建军节", "category": "节假日"}],
+                "2026-08-19": [{"level": "P0", "festival": "七夕节", "category": "节假日"}],
+                "2026-08-27": [{"level": "P1", "festival": "中元节", "category": "节假日"}],
+                "2026-09-25": [{"level": "P0", "festival": "中秋节", "category": "节假日"}],
+                "2026-10-01": [{"level": "P0", "festival": "国庆节", "category": "节假日"}],
+                "2026-10-18": [{"level": "P0", "festival": "重阳节", "category": "节假日"}],
+                "2026-11-26": [{"level": "P1", "festival": "感恩节", "category": "节假日"}],
+                "2026-12-13": [{"level": "P0", "festival": "公祭日", "category": "节假日"}],
+                "2026-12-24": [{"level": "P1", "festival": "平安夜", "category": "节假日"}],
+                "2026-12-25": [{"level": "P1", "festival": "圣诞节", "category": "节假日"}],
+                "2026-01-05": [{"level": "P1", "festival": "小寒", "category": "节气"}],
+                "2026-01-20": [{"level": "P1", "festival": "大寒", "category": "节气"}],
+                "2026-02-04": [{"level": "P0", "festival": "立春", "category": "节气"}],
+                "2026-03-05": [
+                    {"level": "P1", "festival": "惊蛰", "category": "节气"},
+                    {"level": "P0", "festival": "周恩来诞辰", "category": "纪念日"},
+                    {"level": "P1", "festival": "学雷锋纪念日", "category": "纪念日"},
+                ],
+                "2026-04-05": [{"level": "P0", "festival": "清明", "category": "节气"}],
+                "2026-04-20": [{"level": "P1", "festival": "谷雨", "category": "节气"}],
+                "2026-05-05": [{"level": "P0", "festival": "立夏", "category": "节气"}],
+                "2026-05-21": [{"level": "P1", "festival": "小满", "category": "节气"}],
+                "2026-06-05": [{"level": "P1", "festival": "芒种", "category": "节气"}],
+                "2026-07-23": [{"level": "P1", "festival": "大暑", "category": "节气"}],
+                "2026-08-07": [{"level": "P0", "festival": "立秋", "category": "节气"}],
+                "2026-08-23": [{"level": "P1", "festival": "处暑", "category": "节气"}],
+                "2026-09-07": [
+                    {"level": "P1", "festival": "白露", "category": "节气"},
+                    {"level": "P1", "festival": "袁隆平诞辰", "category": "纪念日"},
+                ],
+                "2026-09-23": [{"level": "P1", "festival": "秋分", "category": "节气"}],
+                "2026-10-08": [{"level": "P1", "festival": "寒露", "category": "节气"}],
+                "2026-10-23": [{"level": "P1", "festival": "霜降", "category": "节气"}],
+                "2026-11-07": [{"level": "P0", "festival": "立冬", "category": "节气"}],
+                "2026-11-22": [{"level": "P1", "festival": "小雪", "category": "节气"}],
+                "2026-12-07": [{"level": "P1", "festival": "大雪", "category": "节气"}],
+                "2026-12-22": [{"level": "P0", "festival": "冬至", "category": "节气"}],
+                "2026-11-12": [{"level": "P1", "festival": "孙中山诞辰", "category": "纪念日"}],
+                "2026-03-12": [{"level": "P1", "festival": "孙中山逝世", "category": "纪念日"}],
+                "2026-12-26": [{"level": "P0", "festival": "毛主席诞辰", "category": "纪念日"}],
+                "2026-09-09": [{"level": "P0", "festival": "毛主席逝世", "category": "纪念日"}],
+                "2026-01-08": [{"level": "P0", "festival": "周恩来逝世", "category": "纪念日"}],
+                "2026-08-22": [{"level": "P0", "festival": "邓小平诞辰", "category": "纪念日"}],
+                "2026-07-03": [{"level": "P0", "festival": "李克强诞辰", "category": "纪念日"}],
+                "2026-10-27": [
+                    {"level": "P0", "festival": "李克强逝世", "category": "纪念日"},
+                    {"level": "P1", "festival": "吴尊友逝世", "category": "纪念日"},
+                ],
+                "2026-05-22": [{"level": "P1", "festival": "袁隆平逝世", "category": "纪念日"}],
+                "2026-10-24": [{"level": "P1", "festival": "彭德怀诞辰", "category": "纪念日"}],
+                "2026-11-29": [{"level": "P1", "festival": "彭德怀逝世", "category": "纪念日"}],
+                "2026-12-01": [{"level": "P1", "festival": "朱德诞辰", "category": "纪念日"}],
+                "2026-07-06": [{"level": "P1", "festival": "朱德逝世", "category": "纪念日"}],
+            },
+        }
+
+    def date_checker(self):
+        """
+        check date of reminder
+        :return:
+        """
+        year = datetime.datetime.today().strftime("%Y")
+        today = datetime.datetime.today()
+        tomorrow = today + datetime.timedelta(days=1)
+        tomorrow = tomorrow.strftime("%Y-%m-%d")
+        in_three_days = today + datetime.timedelta(days=3)
+        in_three_days = in_three_days.strftime("%Y-%m-%d")
+        if self.festival_dict[year].get(tomorrow):
+            festival_list = self.festival_dict[year][tomorrow]
+            for festival_ in festival_list:
+                bot(festival_info=festival_, days_count=1, date_str=tomorrow)
+                time.sleep(30)
+        if self.festival_dict[year].get(in_three_days):
+            festival_list = self.festival_dict[year][in_three_days]
+            for festival_ in festival_list:
+                bot(festival_info=festival_, days_count=3, date_str=in_three_days)
+                time.sleep(30)
+
+    def run(self):
+        """
+        执行定时任务
+        :return:
+        """
+        schedule.every().day.at("10:00").do(self.date_checker)
+
+        while True:
+            schedule.run_pending()
+            time.sleep(10)
+
+
+if __name__ == "__main__":
+    F = FestivalReminder()
+    F.run()

+ 2 - 1
requirements.txt

@@ -106,4 +106,5 @@ wsproto==1.2.0
 you-get==0.4.1650
 zstandard==0.19.0
 
-aiohttp~=3.9.1
+aiohttp~=3.9.1
+odps~=3.5.1

+ 3 - 3
spider/crawler_offline/xiaoniangao_plus.py

@@ -148,9 +148,9 @@ class XiaoNianGaoPlusRecommend(object):
         #     200,
         # )
         action = TouchAction(self.driver)
-        action.press(x=int(size["width"] * 0.5), y=int(size["height"] * 0.8))
-        action.wait(ms=200)  # 可以调整等待时间
-        action.move_to(x=int(size["width"] * 0.5), y=int(size["height"] * 0.442))
+        action.press(x=int(size["width"] * 0.5), y=int(size["height"] * 0.85))
+        action.wait(ms=1300)  # 可以调整等待时间
+        action.move_to(x=int(size["width"] * 0.5), y=int(size["height"] * 0.2))
         action.release()
         action.perform()
         self.swipe_count += 1

+ 0 - 74
spider/crawler_search/__init__.py

@@ -1,74 +0,0 @@
-import requests
-
-
-def search_user(keyword):
-    url = 'https://wxmini-api.uyouqu.com/rest/wd/wechatApp/search/user?'
-    data = {
-        "keyword": keyword,
-        "pcursor": "",
-        "ussid": ""
-    }
-    return requests.post(url, headers=headers, json=data).text
-
-
-def search_video(keyword):
-    url = 'https://wxmini-api.uyouqu.com/rest/wd/wechatApp/search/feed?'
-    data = {
-        "keyword": keyword,
-        "pcursor": "",
-        "ussid": "",
-        "pageSource": 1
-
-    }
-    return requests.post(url, headers=headers, json=data).text
-
-
-def video_info():
-    url = 'https://wxmini-api.uyouqu.com/rest/wd/wechatApp/photo/info?'
-    data = {
-        "kpn": "WECHAT_SMALL_APP",
-        "photoId": "5254293468891588895",
-        "authorId": "1346454001",
-        "usePrefetch": True,
-        "pageType": 1,
-        "pageSource": 3
-    }
-    return requests.post(url, headers=headers, json=data).text
-
-
-def video_comment():
-    url = 'https://wxmini-api.uyouqu.com/rest/wd/wechatApp/photo/comment/list?'
-    data = {
-        "photoId": "5254293468891588895",
-        "count": 20
-    }
-    return requests.post(url, headers=headers, json=data).text
-
-
-def user_profile():
-    url = 'https://wxmini-api.uyouqu.com/rest/wd/wechatApp/user/profile?'
-    data = {
-        "eid": "1084678836"
-    }
-    return requests.post(url, headers=headers, json=data).text
-
-
-user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat'
-referer = 'https://servicewechat.com/wx79a83b1a1e8a7978/591/page-frame.html'
-cookie = 'did=填入你的'
-
-headers = {
-    'Host': 'wxmini-api.uyouqu.com',
-    # 'referer':referer,
-    'User-Agent': user_agent,
-    'cookie': cookie
-}
-data = {
-    "keyword": "河南到底有多热",
-    "pcursor": "",
-    "ussid": "",
-    "pageSource": 1
-
-}
-
-print(search_video('lx'))

+ 54 - 0
spider/crawler_search/baidu_search.py

@@ -0,0 +1,54 @@
+
+"""
+好看视频搜索爬虫
+"""
+import json
+
+import requests
+import urllib.parse
+import time
+import hashlib
+
+
+def hksp_search(key):
+    """
+    好看视频搜索爬虫
+    """
+    timestamp_seconds = time.time()
+    timestamp_milliseconds = int(timestamp_seconds * 1000)
+    url = 'https://haokan.baidu.com/haokan/ui-search/pc/search/video'
+    # 定义请求的参数
+    strings = "{}_{}_{}_{}_{}".format(1, urllib.parse.quote(key), 10, timestamp_milliseconds, 1)
+    sign = hashlib.md5(strings.encode()).hexdigest()
+    params = {
+        'pn': 1,
+        'rn': 10,
+        'type': 'video',
+        'query': key,
+        'sign': sign,
+        'version': 1,
+        'timestamp': timestamp_milliseconds
+    }
+    # 定义请求头
+    headers = {
+        'authority': 'haokan.baidu.com',
+        'accept': '*/*',
+        'accept-language': 'zh,en;q=0.9,zh-CN;q=0.8',
+        'cookie': "BIDUPSID='",
+        # 'referer': 'https://haokan.baidu.com/web/search/page?query=%E8%80%81%E4%BA%BA',
+        'sec-ch-ua': '"Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"',
+        'sec-ch-ua-mobile': '?0',
+        'sec-ch-ua-platform': '"macOS"',
+        'sec-fetch-dest': 'empty',
+        'sec-fetch-mode': 'cors',
+        'sec-fetch-site': 'same-origin',
+        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
+        'x-requested-with': 'xmlhttprequest',
+    }
+    # 发送GET请求
+    response = requests.get(url, headers=headers, params=params).json()
+    print(json.dumps(response, ensure_ascii=False, indent=4))
+
+
+if __name__ == '__main__':
+    hksp_search("王雪珂")