ソースを参照

MySQL 服务上线

罗俊辉 11 ヶ月 前
コミット
6a2b200be4

+ 22 - 14
app.py

@@ -2,24 +2,32 @@
 @author: luojunhui
 """
 from quart import Quart
-from applications.functions.log import logging
-from applications.routes import my_blueprint
+from applications.routes import Routes
+from applications.functions.async_mysql import AsyncMySQLClient
 
 # 初始化 App
 app = Quart(__name__, static_folder='applications/static')
-logging(
-    code="0000",
-    info="APP Initialization Complete",
-    function="app"
-)
+AsyncMySQL = AsyncMySQLClient(app)
+app_routes = Routes(AsyncMySQL)
+app.register_blueprint(app_routes)
 
-# 注册蓝图
-app.register_blueprint(my_blueprint)
-logging(
-    code="0000",
-    info="Blue Print Initialization Complete",
-    function="app"
-)
+
+@app.before_serving
+async def init_db():
+    """
+    初始化
+    :return:
+    """
+    await AsyncMySQL.init_pool()
+
+
+@app.after_serving
+async def close_db():
+    """
+    关闭连接
+    :return:
+    """
+    await AsyncMySQL.close_pool()
 
 
 if __name__ == '__main__':

+ 1 - 1
applications/functions/async_etl.py

@@ -217,4 +217,4 @@ class AsyncETL(object):
         os.remove(cover_path)
         b = time.time()
         print(b - a)
-        return result["data"]["id"], result['data']['videoPath']
+        return result["data"]["id"]

+ 59 - 0
applications/functions/async_mysql.py

@@ -0,0 +1,59 @@
+"""
+@author: luojunhui
+"""
+import aiomysql
+
+
+class AsyncMySQLClient(object):
+    """
+    Async MySQL
+    """
+
+    def __init__(self, app):
+        self.app = app
+
+    async def init_pool(self):
+        """
+        初始化连接
+        :return:
+        """
+        self.app.mysql_pool = await aiomysql.create_pool(
+            host='rm-bp1159bu17li9hi94.mysql.rds.aliyuncs.com',
+            port=3306,
+            user='crawler',
+            password='crawler123456@',
+            db='piaoquan-crawler',
+            charset='utf8mb4'
+        )
+        print("mysql init successfully")
+
+    async def close_pool(self):
+        """
+        关闭 mysql 连接
+        :return:
+        """
+        self.app.mysql_pool.close()
+        await self.app.mysql_pool.wait_closed()
+
+    async def async_select(self, sql):
+        """
+        select method
+        :param sql:
+        :return:
+        """
+        async with self.app.mysql_pool.acquire() as conn:
+            async with conn.cursor() as cursor:
+                await cursor.execute(sql)
+                result = await cursor.fetchall()
+                return result
+
+    async def async_insert(self, sql):
+        """
+        insert and update method
+        :param sql:
+        :return:
+        """
+        async with self.app.mysql_pool.acquire() as coon:
+            async with coon.cursor() as cursor:
+                await cursor.execute(sql)
+                await coon.commit()

+ 2 - 48
applications/functions/video_item.py

@@ -2,10 +2,8 @@
 @author: luojunhui
 """
 import time
-from applications.functions.mq import MQ
-from applications.functions.log import logging
+
 from applications.functions.common import Functions
-from applications.functions.async_etl import AsyncETL
 
 
 class VideoItem(object):
@@ -200,48 +198,4 @@ class VideoProducer(object):
         item.add_video_info("strategy", "search")
         item.add_video_info("session", "{}-{}".format(platform, int(time.time())))
         mq_obj = item.produce_item()
-        return mq_obj
-
-
-async def video_mq_sender(video_obj, user, trace_id, platform):
-    """
-    异步处理微信 video_obj
-    公众号和站内账号一一对应
-    :param platform:
-    :param user:
-    :param trace_id:
-    :param video_obj:
-    :return:
-    """
-    # ETL_MQ = MQ(topic_name="topic_crawler_etl_prod")
-    Video = VideoProducer()
-    if platform == "xg_search":
-        mq_obj = Video.xg_video_producer(
-            video_obj=video_obj,
-            user=user,
-            trace_id=trace_id,
-        )
-    elif platform == "baidu_search":
-        mq_obj = Video.baidu_video_producer(
-            video_obj=video_obj,
-            user=user,
-            trace_id=trace_id,
-        )
-    elif platform == "wx_search":
-        mq_obj = Video.wx_video_producer(
-            video_obj=video_obj,
-            user=user,
-            trace_id=trace_id,
-        )
-    else:
-        mq_obj = {}
-    AE = AsyncETL(video_obj=mq_obj)
-    video_id, video_url = await AE.etl_deal()
-    # ETL_MQ.send_msg(params=mq_obj)
-    logging(
-        code="6002",
-        info="视频下载完成",
-        data=mq_obj,
-        trace_id=trace_id
-    )
-    return video_id, video_url
+        return mq_obj

+ 0 - 63
applications/match_alg/rank.py

@@ -29,66 +29,3 @@ def jac_score(d1, d2):
     score_3 = len(extra_keys_intersection) / len(extra_keys_union)
     return score_1 * 0.4 + score_2 * 0.4 + score_3 * 0.2, d2['video_id']
 
-
-async def best_choice(params_obj, trace_id, search_videos):
-    """
-    计算,返回出最合适的 video_id
-    :return: video_id
-    """
-    pq_list, search_list = await recall_videos(trace_id=trace_id, s_videos=search_videos)
-
-    def best_video_id(target_list):
-        """
-        :param target_list:
-        :return:
-        """
-        score_list = []
-        for video_obj in target_list:
-            try:
-                score, video_id = jac_score(d1=params_obj, d2=video_obj)
-                score_list.append((video_id, score))
-            except Exception as e:
-                print(e)
-        sorted_list = sorted(score_list, key=lambda x: x[1], reverse=True)
-        return sorted_list[0] if sorted_list else (0, 0)
-
-    if search_list:
-        logging(
-            code="1003",
-            info="Return Best Search Video",
-            data=search_list,
-            trace_id=trace_id
-        )
-        return search_list[0]
-        # return best_video_id(search_list)[0]
-        # best_search_tuple = best_video_id(search_list)
-        # if best_search_tuple[1] > 0:
-        #     logging(
-        #         code="1003",
-        #         info="search_score---{}".format(best_search_tuple[1]),
-        #         trace_id=trace_id
-        #     )
-        #     return best_search_tuple[0]
-        # else:
-        #     best_pq_tuple = best_video_id(pq_list)
-        #     if best_pq_tuple[1] > 0:
-        #         logging(
-        #             code="1003",
-        #             info="pq_score---{}".format(best_pq_tuple[1]),
-        #             trace_id=trace_id
-        #         )
-        #         return best_pq_tuple[0]
-        #     else:
-        #         return None
-    else:
-        best_pq_tuple = best_video_id(pq_list)
-        if best_pq_tuple[1] > 0:
-            logging(
-                code="1003",
-                info="pq_score---{}".format(best_pq_tuple[1]),
-                trace_id=trace_id
-            )
-            return best_pq_tuple[0]
-        else:
-            return None
-

+ 93 - 102
applications/routes.py

@@ -7,117 +7,108 @@ import uuid
 from quart import Blueprint, jsonify, request
 
 from applications.functions.log import logging
-from applications.schedule import ProcessParams, search_videos
-from applications.functions.common import MySQLServer
+from applications.schedule import recall_videos, search_videos
 from applications.functions.kimi import KimiServer
-from applications.schedule.main_schedule import AskForInfo
 
 my_blueprint = Blueprint('kimi', __name__)
 
 
-@my_blueprint.route('/healthcheck')
-def hello():
+def Routes(mysql_client):
     """
-    Hello World Test
-    :return:
+    路由代码
     """
-    logging(
-        code="1001",
-        info="请求接口成功",
-        port="healthcheck"
-    )
-    return jsonify({'message': 'Hello, World!'})
 
-
-@my_blueprint.route('/title_to_search', methods=['POST'])
-async def search_videos_from_the_web():
-    """
-    从web 搜索视频并且存储到票圈的视频库中
-    :return:
-    """
-    params = await request.get_json()
-    K = KimiServer()
-    gh_id = params['ghId']
-    trace_id = "search-{}-{}".format(str(uuid.uuid4()), str(int(time.time())))
-    params['trace_id'] = trace_id
-    logging(
-        code="2000",
-        info="搜索视频内容接口请求成功",
-        port="title_to_search",
-        function="search_videos_from_the_web",
-        trace_id=trace_id
-    )
-    try:
-        kimi_info = await K.search_kimi_schedule(params=params)
-        video_id, video_url = await search_videos(
-            kimi_info=kimi_info,
-            trace_id=trace_id,
-            gh_id=gh_id
+    @my_blueprint.route('/healthcheck')
+    def healthcheck():
+        """
+        Hello World Test
+        :return:
+        """
+        logging(
+            code="1001",
+            info="请求接口成功",
+            port="healthcheck"
         )
-        print(json.dumps(kimi_info, ensure_ascii=False, indent=4))
-        res = {
-            "trace_id": trace_id,
-            "code": 0,
-            "kimi_title": kimi_info['k_title'],
-            "search_video_id": video_id,
-            "video_url": video_url
-
-        }
-    except Exception as e:
-        res = {
-            "trace_id": trace_id,
-            "code": 1,
-            "message": str(e)
-        }
-    return jsonify(res)
-
-
-@my_blueprint.route('/out_videos', methods=['POST'])
-async def find_in_mysql():
-    """
-    搜索是否存在外站视频 video_list, 如果存在,则返回成功
-    :return:
-    """
-    data = await request.get_json()
-    trace_id = data['traceId']
-    logging(
-        code="2000",
-        info="请求接口成功",
-        port="title_to_video",
-        trace_id=trace_id,
-        function="find_in_mysql"
-    )
-    res = MySQLServer().select_download_videos(trace_id=trace_id)
-    return jsonify(res)
+        return jsonify({'message': 'Hello, World!'})
 
+    @my_blueprint.route('/search_videos', methods=['POST'])
+    async def search_videos_from_the_web():
+        """
+        从web 搜索视频并且存储到票圈的视频库中
+        :return:
+        """
+        params = await request.get_json()
+        K = KimiServer()
+        gh_id = params['ghId']
+        trace_id = "search-{}-{}".format(str(uuid.uuid4()), str(int(time.time())))
+        params['trace_id'] = trace_id
+        title = params['title'].split("@@")[-1]
+        contents = params['content']
+        account_name = params['accountName']
+        logging(
+            code="2000",
+            info="搜索视频内容接口请求成功",
+            port="title_to_search",
+            function="search_videos_from_the_web",
+            trace_id=trace_id
+        )
+        insert_sql = f"""
+            INSERT INTO long_articles_video_dev 
+                (trace_id, gh_id, article_title, article_text, account_name)
+            VALUES 
+                ('{trace_id}', '{gh_id}', '{title}', '{contents}', '{account_name}');"""
+        await mysql_client.async_insert(insert_sql)
+        try:
+            kimi_info = await K.search_kimi_schedule(params=params)
+            print(json.dumps(kimi_info, ensure_ascii=False, indent=4))
+            kimi_title = kimi_info['k_title']
+            content_title = kimi_info['content_title']
+            content_keys = json.dumps(kimi_info['content_keys'], ensure_ascii=False)
+            update_kimi_sql = f"""
+                UPDATE long_articles_video_dev SET
+                kimi_title = '{kimi_title}',
+                kimi_summary = '{content_title}',
+                kimi_keys = '{content_keys}'
+                WHERE trace_id = '{trace_id}';
+            """
+            await mysql_client.async_insert(update_kimi_sql)
+            await search_videos(
+                kimi_info=kimi_info,
+                trace_id=trace_id,
+                gh_id=gh_id,
+                mysql_client=mysql_client
+            )
+            res = {
+                "status": "success",
+                "code": 0,
+                "traceId": trace_id
+            }
+        except Exception as e:
+            res = {
+                "status": "fail",
+                "code": 1,
+                "message": str(e)
+            }
+        return jsonify(res)
 
-@my_blueprint.route('/find_video', methods=['POST'])
-async def post_data():
-    """
-    请求接口代码
-    :return:
-    """
-    data = await request.get_json()
-    trace_id = data['traceId']
-    logging(
-        code="1001",
-        info="请求接口成功",
-        port="title_to_video",
-        trace_id=trace_id
-    )
-    p = ProcessParams(t_id=trace_id)
-    processed_data = await p.deal(data)
-    return jsonify(processed_data)
-
+    @my_blueprint.route('/recall_videos', methods=['POST'])
+    async def find_videos():
+        """
+        请求接口代码
+        :return:
+        """
+        data = await request.get_json()
+        trace_id = data['traceId']
+        logging(
+            code="1001",
+            info="请求接口成功",
+            port="recall_videos",
+            trace_id=trace_id
+        )
+        result = await recall_videos(
+            trace_id=trace_id,
+            mysql_client=mysql_client
+        )
+        return jsonify(result)
 
-@my_blueprint.route('/title_to_video', methods=['POST'])
-async def delay_response():
-    """
-    main
-    :return:
-    """
-    # 从请求体中解析 JSON 数据
-    data = await request.get_json()
-    A = AskForInfo(data)
-    res = await A.schedule()
-    return jsonify(res)
+    return my_blueprint

+ 1 - 1
applications/schedule/__init__.py

@@ -1,5 +1,5 @@
 """
 @author: luojunhui
 """
-from .process_schedule import ProcessParams
+from .process_schedule import recall_videos
 from .search_schedule import search_videos

+ 2 - 20
applications/schedule/main_schedule.py

@@ -1,10 +1,8 @@
-"""
-@author: luojunhui
-"""
 # encoding: utf-8
 """
 @author: luojunhui
 """
+
 import time
 import requests
 
@@ -23,23 +21,7 @@ class AskForInfo:
         :return:
         """
         url = "{}/title_to_search".format(self.base_url)
-        body = {
-            "title": self.params["title"],
-            "content": self.params['content'],
-            "ghId": self.params["ghId"]
-        }
-        res = requests.post(url, json=body, timeout=120)
-        return res.json()
-
-    async def check_out_videos(self, trace_id):
-        """
-        :return:
-        """
-        url = "{}/out_videos".format(self.base_url)
-        body = {
-            "traceId": trace_id
-        }
-        res = requests.post(url, json=body, timeout=120)
+        res = requests.post(url, json=self.params, timeout=120)
         return res.json()
 
     async def ask_for_info(self, res_obj, kt):

+ 69 - 103
applications/schedule/process_schedule.py

@@ -3,123 +3,89 @@
 对请求进行操作
 """
 import json
-import os
 
-from applications.match_alg import best_choice
 from applications.functions.common import Functions
 from applications.functions.log import logging
 
 
-class ProcessParams(object):
+async def recall_videos(trace_id, mysql_client):
     """
-    Params Analysis
+    从 mysql 读取数据
+    :param trace_id:  唯一 id
+    :param mysql_client: mysql 服务
+    :return:
     """
-
-    def __init__(self, t_id):
-        self.trace_id = t_id
-
-    def get_params(self, data):
-        """
-        "accountName": "公众号名称",
-        "content": "文章正文",
-        "title": "文章标题",
-        "cover": "封面链接"
-        :param data:
-        :return: title
-        """
+    select_sql = f"""
+        SELECT recall_video_id1, kimi_title 
+        FROM long_articles_video_dev
+        WHERE trace_id = '{trace_id}';
+    """
+    info_tuple = await mysql_client.async_select(select_sql)
+    best_video_id, kimi_title = info_tuple[0]
+    print(best_video_id)
+    if best_video_id:
         logging(
             code="1002",
-            info="处理请求参数",
-            function="get_params",
-            trace_id=self.trace_id,
-            data=data
-        )
-        return data
-
-    async def deal(self, data):
-        """执行代码"""
-        params = self.get_params(data)
-        title = params['title'].split("@@")[-1]
-        kimi_title = params['kimi_title']
-        # account_name = params['accountName']
-        # ghId = params['ghId']
-        video_list = params['videoList']
-
-        title_p = os.path.join(os.getcwd(), 'applications', 'static', "titles", "{}.json".format(title))
-
-        with open(title_p, encoding="utf-8") as f:
-            params_obj = json.loads(f.read())
-
-        best_video_id = await best_choice(
-            params_obj=params_obj,
-            trace_id=self.trace_id,
-            search_videos=video_list
+            info="best video_id --{}".format(best_video_id),
+            function="process",
+            trace_id=trace_id
         )
+        print("best video id", best_video_id)
+        response = Functions().request_for_info(best_video_id)
+        productionCover = response['data'][0]['shareImgPath']
+        productionName = kimi_title
+        videoUrl = response['data'][0]['videoPath']
+        user_id = response['data'][0]['user']['uid']
+        programAvatar = "https://rescdn.yishihui.com/0temp/lehuo.png"
+        programId = "wxe8f8f0e23cecad0f"
+        programName = "票圈乐活"
+        source = "Web"
+        root_share_id, productionPath = Functions().create_gzh_path(video_id=best_video_id, shared_uid=user_id)
         logging(
             code="1002",
-            info="best video_id --{}".format(best_video_id),
+            info="root_share_id --{}, productionPath -- {}".format(root_share_id, productionPath),
             function="process",
-            trace_id=self.trace_id
+            trace_id=trace_id
         )
-
-        if best_video_id:
-            print("best video id", best_video_id)
-            response = Functions().request_for_info(best_video_id)
-            # print(json.dumps(response, ensure_ascii=False, indent=4))
-            productionCover = response['data'][0]['shareImgPath']
-            # productionName = response["data"][0]['title']
-            productionName = kimi_title
-            videoUrl = response['data'][0]['videoPath']
-            user_id = response['data'][0]['user']['uid']
-            programAvatar = "https://rescdn.yishihui.com/0temp/lehuo.png"
-            programId = "wxe8f8f0e23cecad0f"
-            programName = "票圈乐活"
-            source = "Web"
-            root_share_id, productionPath = Functions().create_gzh_path(video_id=best_video_id, shared_uid=user_id)
-            logging(
-                code="1002",
-                info="root_share_id --{}, productionPath -- {}".format(root_share_id, productionPath),
-                function="process",
-                trace_id=self.trace_id
-            )
-            result = {
-                "productionCover": productionCover,
-                "productionName": productionName,
-                "programAvatar": programAvatar,
-                "programId": programId,
-                "programName": programName,
-                "source": source,
-                "rootShareId": root_share_id,
-                "productionPath": productionPath,
-                "videoUrl": videoUrl
-            }
-            logging(
-                code="2000",
-                info="统计 root_share_id && video_id",
-                function="process",
-                trace_id=self.trace_id,
-                data={
-                    "rootShareId": root_share_id,
-                    "videoId": best_video_id
-                }
-            )
-        else:
-            result = {
-                "productionCover": None,
-                "productionName": None,
-                "programAvatar": None,
-                "programId": None,
-                "programName": None,
-                "source": None,
-                "rootShareId": None,
-                "productionPath": None,
-                "videoUrl": None
-            }
+        result = {
+            "productionCover": productionCover,
+            "productionName": productionName,
+            "programAvatar": programAvatar,
+            "programId": programId,
+            "programName": programName,
+            "source": source,
+            "rootShareId": root_share_id,
+            "productionPath": productionPath,
+            "videoUrl": videoUrl
+        }
+        update_result_sql = f"""
+            UPDATE long_articles_video_dev
+            SET
+                result1 = '{json.dumps(result, ensure_ascii=False)}'
+            WHERE
+                trace_id = '{trace_id}'
+        """
+        await mysql_client.async_insert(update_result_sql)
         logging(
-            code="1002",
-            info="返回结果",
+            code="2000",
+            info="统计 root_share_id && video_id",
             function="process",
-            data=result,
-            trace_id=self.trace_id
+            trace_id=trace_id,
+            data={
+                "rootShareId": root_share_id,
+                "videoId": best_video_id
+            }
         )
-        return result
+    else:
+        result = {
+            "traceId": trace_id,
+            "Message": "No Videos Found now, Please try again in one minute"
+        }
+    logging(
+        code="1002",
+        info="返回结果",
+        function="process",
+        data=result,
+        trace_id=trace_id
+    )
+    return result

+ 56 - 4
applications/schedule/search_schedule.py

@@ -6,7 +6,8 @@
 from applications.search import *
 from applications.static.config import gh_id_dict, ab_test_config
 from applications.functions.log import logging
-from applications.functions.video_item import video_mq_sender
+from applications.functions.video_item import VideoProducer
+from applications.functions.async_etl import AsyncETL
 
 
 class SearchABTest(object):
@@ -210,9 +211,53 @@ class SearchABTest(object):
         return {"platform": "baidu_search", "result": result[0] if result else []}
 
 
-async def search_videos(kimi_info, trace_id, gh_id):
+async def video_sender(video_obj, user, trace_id, platform):
+    """
+    异步处理微信 video_obj
+    公众号和站内账号一一对应
+    :param platform:
+    :param user:
+    :param trace_id:
+    :param video_obj:
+    :return:
+    """
+    # ETL_MQ = MQ(topic_name="topic_crawler_etl_prod")
+    Video = VideoProducer()
+    if platform == "xg_search":
+        mq_obj = Video.xg_video_producer(
+            video_obj=video_obj,
+            user=user,
+            trace_id=trace_id,
+        )
+    elif platform == "baidu_search":
+        mq_obj = Video.baidu_video_producer(
+            video_obj=video_obj,
+            user=user,
+            trace_id=trace_id,
+        )
+    elif platform == "wx_search":
+        mq_obj = Video.wx_video_producer(
+            video_obj=video_obj,
+            user=user,
+            trace_id=trace_id,
+        )
+    else:
+        mq_obj = {}
+    AE = AsyncETL(video_obj=mq_obj)
+    video_id = await AE.etl_deal()
+    logging(
+        code="6002",
+        info="视频下载完成",
+        data=mq_obj,
+        trace_id=trace_id
+    )
+    return video_id
+
+
+async def search_videos(kimi_info, trace_id, gh_id, mysql_client):
     """
     search and send msg to ETL
+    :param mysql_client:
     :param kimi_info:
     :param gh_id: 通过账号 id 来控制实验策略
     :param trace_id:
@@ -250,13 +295,20 @@ async def search_videos(kimi_info, trace_id, gh_id):
                 trace_id=trace_id,
                 data=recall_video,
             )
-            video_id, video_url = await video_mq_sender(
+            video_id = await video_sender(
                 video_obj=recall_video,
                 user=gh_id_dict.get(gh_id),
                 trace_id=trace_id,
                 platform=platform,
             )
-            return video_id, video_url
+            update_id_sql = f"""
+            UPDATE long_articles_video_dev
+            SET
+            recall_video_id1 = {video_id}
+            WHERE
+            trace_id = '{trace_id}'
+            """
+            await mysql_client.async_insert(update_id_sql)
     else:
         logging(code="7003", info="视频搜索失败", trace_id=trace_id)
         return None

+ 74 - 0
applications/static/official_accounts

@@ -0,0 +1,74 @@
+gh_2b8c6aa035ae	魔法美学馆
+gh_9e559b3b94ca	票圈大事件
+gh_084a485e859a	生活情感叁读
+gh_1ee2e1b39ccf	票圈最新消息
+gh_4c058673c07e	探马再探再报
+gh_de9f9ebc976b	赵师傅厨房秘笈
+gh_058e41145a0c	小琪故事馆
+gh_7b4a5f86d68c	八卦不断线
+gh_538f78f9d3aa	张阿姨爱美食
+gh_fe6ef3a65a48	心灵智慧馆
+gh_484de412b0ef	充电宝宝
+gh_4568b5a7e2fe	王小八娱乐
+gh_adca24a8f429	兔子爱蹬鹰
+gh_e24da99dc899	缘来养心厅
+gh_e0eb490115f5	心灵情感驿站
+gh_d2cc901deca7	票圈极速版
+gh_45beb952dc74	票圈乐活
+gh_b8baac4296cb	票圈原创视频精选
+gh_26a307578776	票圈美文速递
+gh_183d80deffb8	生活良读
+gh_9cf3b7ff486b	票圈热门
+gh_b32125c73861	票圈奇闻
+gh_5ff48e9fb9ef	祝福养心厅
+gh_9161517e5676	宝娃趣味游戏
+gh_9f8dc5b0c74e	音药金曲厅
+gh_3ac6d7208961	异次元玩家
+gh_6d9f36e3a7be	音药养心馆
+gh_ac43e43b253b	小阳看天下
+gh_d5f935d0d1f2	半仙社评
+gh_171cec079b2a	观察家王小姐
+gh_be8c29139989	心灵书局
+gh_c91b42649690	心理调色盘
+gh_93e00e187787	小惠爱厨房
+gh_744cb16f6e16	美味在人间
+gh_9877c8541764	退休老年圈
+gh_0c89e11f8bf3	幸福启示
+gh_6d205db62f04	指尖奇文
+gh_7bca1c99aea0	慧行社
+gh_c69776baf2cd	老友欢聚地
+gh_234ef02cdee5	姜子丫
+gh_56a6765df869	婉央女子
+gh_e2576b7181c6	六八评价
+gh_40a0ad154478	所见畅谈
+gh_34318194fd0e	老新说事
+gh_901b0d722749	壹姐八卦
+gh_3c7d38636846	圈内侃八卦
+gh_01f8afd03366	奇闻有约
+gh_a307072c04b9	生活智慧正能量
+gh_424c8eeabced	爱姨生活妙招
+gh_671f460c856c	日日有妙招
+gh_b9b99173ff8a	实在妙招
+gh_e9d819f9e147	热血军中事
+gh_da76772d8d15	娱乐在前
+gh_bd57b6978e06	八点说故事
+gh_6b7c2a257263	幸福晚年知音
+gh_bfe5b705324a	奇趣百味生活
+gh_29074b51f2b7	老来生活家
+gh_0921c03402cd	俏生活秘籍
+gh_7e5818b2dd83	便捷生活好方法
+gh_89ef4798d3ea	生活百态观
+gh_bff0bcb0694a	喜乐生活派
+gh_a2901d34f75b	畅聊奇闻
+gh_b15de7c99912	人生百事观
+gh_73be0287bb94	军莫愁
+gh_56ca3dae948c	老友闲谈
+gh_a182cfc94dad	冀中轶事
+gh_a6351b447819	冀中精彩生活
+gh_3df10391639c	冀中生活谈
+gh_e75dbdc73d80	票圈正能量
+gh_5e543853d8f0	票圈精彩
+gh_f4594783f5b8	俏丽音乐相册
+gh_3845af6945d0	新品女装特价
+gh_b3ffc1ca3a04	票圈内容精选
+gh_efaf7da157f5	票圈热议

+ 1 - 1
hypercorn_config.toml

@@ -1,6 +1,6 @@
 reload = true
 bind = "0.0.0.0:8111"
-workers = 2
+workers = 4
 keep_alive_timeout = 120  # 保持连接的最大秒数,根据需要调整
 graceful_timeout = 30    # 重启或停止之前等待当前工作完成的时间
 loglevel = "debug"  # 日志级别