{"id":967,"date":"2025-07-28T18:19:49","date_gmt":"2025-07-28T10:19:49","guid":{"rendered":"https:\/\/keyi.eu.org\/?p=967"},"modified":"2025-07-28T18:26:55","modified_gmt":"2025-07-28T10:26:55","slug":"%e9%87%9d%e5%b0%8d%e7%9b%ae%e6%a8%99%e7%be%a3%e7%b5%84%ef%bc%8c%e8%87%aa%e5%8b%95%e7%99%bc%e4%bd%88%e5%85%a7%e5%ae%b9%e7%9a%84bot%e3%80%82","status":"publish","type":"post","link":"https:\/\/keyi.eu.org\/?p=967","title":{"rendered":"\u91dd\u5c0d\u76ee\u6a19\u7fa3\u7d44\uff0c\u81ea\u52d5\u767c\u4f48\u5167\u5bb9\u7684bot"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" width=\"716\" height=\"297\" src=\"https:\/\/keyi.eu.org\/wp-content\/uploads\/2025\/07\/post_pic.png\" alt=\"\" class=\"wp-image-972\" srcset=\"https:\/\/keyi.eu.org\/wp-content\/uploads\/2025\/07\/post_pic.png 716w, https:\/\/keyi.eu.org\/wp-content\/uploads\/2025\/07\/post_pic-300x124.png 300w\" sizes=\"(max-width: 716px) 100vw, 716px\" \/><\/figure>\n\n\n<p>\u91dd\u5c0d\u76ee\u6a19\u7fa3\u7d44\uff0c\u81ea\u52d5\u767c\u4f48\u5167\u5bb9\u7684bot<\/p>\n<p>\u5efa\u7acb\u76ee\u6a19telegram\u7fa3\u7d44\u6216\u983b\u9053\u3002<\/p>\n<p>\u5efa\u7acbbot\u3002<\/p>\n<p>\u628abot\u52a0\u5165\u5230\u7fa3\u7d44\u6216\u983b\u9053\uff0c\u4f7f\u5b83\u6210\u7232\u7ba1\u7406\u54e1\u3002<\/p>\n<p>\u4f7f\u7528python\u8173\u672c\uff0c\u5c0d\u76ee\u6a19\u7fa3\u7d44\u767c\u4f48\u5167\u5bb9\u3002<\/p>\n<p>\u9032\u968e\u9700\u6c42\u4e00\uff1a<\/p>\n<p>\u8b80\u53d6\u6307\u5b9a\u76ee\u9304\u6240\u6709zip\u6587\u4ef6\u3002<\/p>\n<p>\u9010\u4e00\u5c07\u5176\u4e2d\u6bcf\u500bzip\u6587\u4ef6\uff0c\u89e3\u58d3\u7e2e\u5230\u81e8\u6642\u76ee\u9304\u3002<\/p>\n<p>\u5f9e\u81e8\u6642\u76ee\u9304\u4e2d\uff0c\u6309\u9806\u5e8f\u6392\u5217\u5176\u4e2d\u7684\u5716\u7247\u6587\u4ef6\u3002<\/p>\n<p>\u6bcf9\u5f35\u5716\u7247\u7232\u4e00\u7d44\uff0c\u5c07\u5716\u7247\u767c\u5f80\u76ee\u6a19telegram\u983b\u9053\u6216\u7fa3\u7d44\u3002\u767c\u9001\u7684\u6587\u672c\u5247\u4ee5\u5716\u7247\u4f86\u6e90\u7684zip\u6587\u4ef6\u540d\u7232\u5167\u5bb9\u3002<\/p>\n<p>\u9023\u7e8c\u767c\u90013\u7d44\uff0c\u7e3d\u517127\u5f35\u5716\u7247\u5f8c\uff0c\u505c\u6b62\u767c\u9001\u3002<\/p>\n<p>\u6e05\u9664\u81e8\u6642\u76ee\u9304\u4e2d\u7684\u6240\u6709\u5167\u5bb9\u3002<\/p>\n<p>\u5411\u76ee\u6a19\u7fa3\u7d44\u6216\u8005\u983b\u9053\uff0c\u767c\u9001\u6574\u500bzip\u6587\u4ef6\u3002<\/p>\n<p>\u522a\u9664\u767c\u9001\u5f8c\u7684zip\u6587\u4ef6\uff0c\u4ee5\u540c\u6a23\u6b65\u9a5f\uff0c\u8655\u7406\u4e0b\u4e00\u500b\u6587\u4ef6\u3002<\/p>\n<p>\u6bcf\u6b21\u767c\u9001\u52d5\u4f5c\u5b8c\u6210\uff0c\u9032\u884c\u5ef6\u6642\u7b49\u5f85\uff0c\u907f\u514dbot\u4f7f\u7528\u904e\u65bc\u983b\u7e41\uff0c\u88abtelegram\u9650\u6b0a\u3002<\/p>\n<p>\u9032\u968e\u9700\u6c42\u4e8c\uff1a<\/p>\n<p>\u652f\u6301OneDriver\u7db2\u76e4\u7684\u639b\u8f09\uff0c\u6e90zip\u6587\u4ef6\uff0c\u4f86\u81ea\u7db2\u76e4\uff0c\u81e8\u6642\u6587\u4ef6\u593e\u5728\u672c\u5730\u786c\u789f\uff0c\u4ee5\u907f\u514d\u983b\u7e41\u8b80\u5beb\u7db2\u76e4\u7684\u4f4e\u6548\u5ef6\u8aa4\u3002<\/p>\n<p>\u9032\u968e\u9700\u6c42\u4e09\uff1a<\/p>\n<p>\u6bcf\u6b21\u8173\u672c\u5553\u52d5\u6642\uff0c\u767c\u90013\u7d44\u5716\u7247\u4ee5\u53ca\u58d3\u7e2e\u5305\u5b8c\u6210\uff0c\u548c\u6700\u7d42\u7684\u5168\u90e8\u5b8c\u6210\uff0c\u5206\u5225\u5411\u9700\u8981\u901a\u77e5\u7684\u7528\u6236\u5011\uff0c\u767c\u9001\u9032\u5ea6\u901a\u77e5\u3002<\/p>\n<p>\u9032\u968e\u9700\u6c42\u56db\uff1a<\/p>\n<p>\u4f7f\u7528cron\u548cpm2\u914d\u5408\u4f86\u5b9a\u6642\u5553\u52d5\u8173\u672c\u3002\u7576\u5b9a\u6642\u7684\u6642\u9593\u9ede\u5230\u9054\uff0ccron\u6703\u8abf\u7528\u4e00\u500bsh\u8173\u672c\u4ee5\u6aa2\u6e2cpm2\u4e2d\u7684\u76f8\u95dc\u4efb\u52d9\u662f\u5426\u5728\u904b\u884c\u3002\u5982\u679c\u5728\u904b\u884c\uff0c\u5247\u4e0d\u4f5c\u4efb\u4f55\u8655\u7406\u3002\u5982\u679c\u672a\u5728\u904b\u884c\uff0c\u5247\u4e00\u6b21\u6027\u559a\u9192pm2\u4e2d\u7684\u76f8\u95dc\u4efb\u52d9\u3002pm2\u4e2d\u7684\u4efb\u52d9\u8173\u672c\u4e00\u7d93\u57f7\u884c\u5b8c\u7562\uff0c\u5373\u884c\u505c\u6b62\uff0c\u4e0d\u9700\u8981pm2\u53cd\u5fa9\u559a\u9192\u5b83\u3002\u4e5f\u5c31\u53ef\u4ee5\u907f\u514d\u56e0\u7232\u5132\u5b58\u5f85\u767c\u9001\u7684zip\u6587\u4ef6\u7684OneDrive\u7db2\u76e4\u76ee\u9304\u4e2d\u7121\u5167\u5bb9\uff0c\u800c\u53cd\u5fa9\u767c\u9001\u201c\u5553\u52d5\u201d\u548c\u201c\u5b8c\u6210\u201d\u7684\u901a\u77e5\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>\nimport os\nimport zipfile\nimport glob\nimport shutil\nimport asyncio\nimport time\nfrom datetime import datetime\nfrom telegram import Bot, InputMediaPhoto\nimport logging\nfrom pathlib import Path\nfrom telegram.error import TimedOut\n\n# \u914d\u7f6e Telegram Bot\nBOT_TOKEN = \"BOT\u7684API Token\"\nCHAT_ID = \"-10000000000\"  # \u7528\u65bc\u767c\u9001\u5716\u7247\u9810\u89bd\u7684\u7fa4\u7d44\nUPLOAD_CHAT_ID = \"-10000000000\"  # \u7528\u65bc\u4e0a\u50b3 ZIP \u6587\u4ef6\u7684\u7fa4\u7d44\nREPORT_USER_IDS = &#91;\"00000000\", \"00000000\"]  # \u901a\u77e5\u7528\u6236 ID\n\n# \u914d\u7f6e\u65e5\u8a8c\nLOG_FILE = \"\/var\/log\/telegram_bot.log\"\nlogging.basicConfig(\n    level=logging.INFO,\n    format='%(asctime)s - %(levelname)s - %(message)s',\n    handlers=&#91;\n        logging.FileHandler(LOG_FILE, mode='w', encoding='utf-8'),\n        logging.StreamHandler()\n    ]\n)\nlogger = logging.getLogger(__name__)\n\nasync def send_photos_in_groups(bot, chat_id, photos, caption):\n    \"\"\"\u5c07\u5716\u7247\u6309\u7d44\u767c\u9001\u5230 Telegram \u7fa4\u7d44\"\"\"\n    media_group = &#91;]\n    for i, photo in enumerate(photos):\n        try:\n            media_group.append(InputMediaPhoto(media=open(photo, \"rb\"), caption=caption if i == 0 else \"\"))\n        except OSError as e:\n            logger.error(f\"\u7121\u6cd5\u6253\u958b\u5716\u7247 {Path(photo).name}\uff1a{str(e)}\")\n            return False\n    try:\n        await bot.send_media_group(chat_id=chat_id, media=media_group)\n        logger.info(f\"\u6210\u529f\u767c\u9001\u4e00\u7d44\u5716\u7247\uff08\u5171 {len(photos)} \u5f35\uff09\uff0c\u6a19\u984c\uff1a{caption}\")\n        return True\n    except TimedOut as e:\n        logger.warning(f\"\u767c\u9001\u5716\u7247\u7d44\u6642\u8d85\u6642\uff1a{str(e)}\")\n        return False\n\nasync def send_report(bot, user_ids, message):\n    \"\"\"\u5411\u591a\u500b\u7528\u6236\u767c\u9001\u5831\u544a\"\"\"\n    for user_id in user_ids:\n        try:\n            await bot.send_message(chat_id=user_id, text=message)\n            logger.info(f\"\u5411\u7528\u6236 {user_id} \u767c\u9001\u5831\u544a\uff1a{message}\")\n        except Exception as e:\n            logger.error(f\"\u5411\u7528\u6236 {user_id} \u767c\u9001\u5831\u544a\u5931\u6557\uff1a{str(e)}\")\n\nasync def upload_zip_file(bot, chat_id, zip_file, caption):\n    \"\"\"\u4e0a\u50b3 ZIP \u6587\u4ef6\u5230 Telegram \u7fa4\u7d44\"\"\"\n    try:\n        with open(zip_file, \"rb\") as file:\n            await bot.send_document(chat_id=chat_id, document=file, caption=caption)\n        logger.info(f\"\u6210\u529f\u4e0a\u50b3 ZIP \u6587\u4ef6\uff1a{Path(zip_file).name} \u5230\u7fa4\u7d44 {chat_id}\")\n        return True\n    except Exception as e:\n        logger.error(f\"\u4e0a\u50b3 ZIP \u6587\u4ef6 {Path(zip_file).name} \u5931\u6557\uff1a{str(e)}\")\n        return False\n\nasync def main():\n    # \u521d\u59cb\u5316 Bot\n    bot = Bot(token=BOT_TOKEN)\n    logger.info(\"Telegram Bot \u521d\u59cb\u5316\u5b8c\u6210\")\n    \n    # \u8a2d\u7f6e\u5de5\u4f5c\u76ee\u9304\u548c\u81e8\u6642\u76ee\u9304\n    current_dir = Path(\"\/od\/mitalk\")\n    temp_dir = Path(\"\/root\/mitalk\/temp\")\n    \n    # \u6e05\u7a7a\u81e8\u6642\u76ee\u9304\n    try:\n        if temp_dir.exists():\n            shutil.rmtree(temp_dir)\n        temp_dir.mkdir(parents=True, exist_ok=True)\n        logger.info(f\"\u5df2\u6e05\u7a7a\u4e26\u5275\u5efa\u81e8\u6642\u76ee\u9304\uff1a{temp_dir}\")\n    except OSError as e:\n        logger.error(f\"\u6e05\u7a7a\u6216\u5275\u5efa\u81e8\u6642\u76ee\u9304\u5931\u6557\uff1a{str(e)}\")\n        await send_report(bot, REPORT_USER_IDS, f\"\u932f\u8aa4\uff1a\u7121\u6cd5\u6e05\u7a7a\u6216\u5275\u5efa\u81e8\u6642\u76ee\u9304 {temp_dir}\uff1a{str(e)}\")\n        return\n    \n    # \u8a18\u9304\u8173\u672c\u555f\u52d5\u6642\u9593\n    start_time = time.time()\n    start_time_str = datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n    \n    # \u7372\u53d6 ZIP \u6587\u4ef6\u5217\u8868\n    try:\n        zip_files = sorted(glob.glob(str(current_dir \/ \"*.zip\")))\n    except OSError as e:\n        logger.error(f\"\u7121\u6cd5\u8b80\u53d6 ZIP \u6587\u4ef6\u5217\u8868\uff1a{str(e)}\")\n        await send_report(bot, REPORT_USER_IDS, f\"\u932f\u8aa4\uff1a\u7121\u6cd5\u8b80\u53d6 ZIP \u6587\u4ef6\u5217\u8868\uff1a{str(e)}\")\n        return\n    \n    # \u767c\u9001\u555f\u52d5\u5831\u544a\n    zip_filenames = &#91;Path(z).name for z in zip_files]\n    startup_report = f\"\u8173\u672c\u65bc {start_time_str} \u555f\u52d5\uff0c\u5f85\u8655\u7406 ZIP \u6587\u4ef6\uff08{len(zip_files)} \u500b\uff09\uff1a\\n\" + \"\\n\".join(zip_filenames)\n    await send_report(bot, REPORT_USER_IDS, startup_report)\n    \n    # \u7d71\u8a08\u7e3d\u5716\u7247\u6578\u91cf\n    total_images = 0\n    processed_zips = &#91;]\n    \n    # \u8655\u7406\u6bcf\u500b ZIP \u6587\u4ef6\n    for zip_file in zip_files:\n        zip_name = Path(zip_file).name\n        logger.info(f\"\\n\u958b\u59cb\u8655\u7406 ZIP \u6587\u4ef6\uff1a{zip_name}\")\n        zip_start_time = time.time()\n        \n        # \u89e3\u58d3 ZIP \u6587\u4ef6\n        try:\n            with zipfile.ZipFile(zip_file, 'r') as zip_ref:\n                zip_ref.extractall(temp_dir)\n            logger.info(f\"\u6210\u529f\u89e3\u58d3 ZIP \u6587\u4ef6\uff1a{zip_name} \u5230 {temp_dir}\")\n        except (zipfile.BadZipFile, OSError) as e:\n            logger.error(f\"\u89e3\u58d3 ZIP \u6587\u4ef6 {zip_name} \u5931\u6557\uff1a{str(e)}\")\n            await send_report(bot, REPORT_USER_IDS, f\"\u932f\u8aa4\uff1a\u7121\u6cd5\u89e3\u58d3 ZIP \u6587\u4ef6 {zip_name}\uff1a{str(e)}\")\n            try:\n                os.remove(zip_file)\n                logger.info(f\"\u5df2\u522a\u9664\u5931\u6557\u7684 ZIP \u6587\u4ef6\uff1a{zip_name}\")\n                shutil.rmtree(temp_dir)\n                temp_dir.mkdir(parents=True, exist_ok=True)\n                logger.info(f\"\u5df2\u6e05\u7a7a\u81e8\u6642\u76ee\u9304\uff1a{temp_dir}\")\n            except OSError as e:\n                logger.error(f\"\u522a\u9664\u5931\u6557\u7684 ZIP \u6587\u4ef6\u6216\u6e05\u7a7a\u81e8\u6642\u76ee\u9304\u5931\u6557\uff1a{str(e)}\")\n            continue\n        \n        # \u7372\u53d6\u5716\u7247\u6587\u4ef6\n        image_extensions = ('.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp')\n        try:\n            images = sorted(&#91;f for f in glob.glob(str(temp_dir \/ \"*\")) if f.lower().endswith(image_extensions)])\n        except OSError as e:\n            logger.error(f\"\u7121\u6cd5\u8b80\u53d6\u5716\u7247\u6587\u4ef6\u5217\u8868\uff1a{str(e)}\")\n            await send_report(bot, REPORT_USER_IDS, f\"\u932f\u8aa4\uff1a\u7121\u6cd5\u8b80\u53d6 {zip_name} \u7684\u5716\u7247\u6587\u4ef6\u5217\u8868\uff1a{str(e)}\")\n            try:\n                os.remove(zip_file)\n                logger.info(f\"\u5df2\u522a\u9664\u5931\u6557\u7684 ZIP \u6587\u4ef6\uff1a{zip_name}\")\n                shutil.rmtree(temp_dir)\n                temp_dir.mkdir(parents=True, exist_ok=True)\n                logger.info(f\"\u5df2\u6e05\u7a7a\u81e8\u6642\u76ee\u9304\uff1a{temp_dir}\")\n            except OSError as e:\n                logger.error(f\"\u522a\u9664\u5931\u6557\u7684 ZIP \u6587\u4ef6\u6216\u6e05\u7a7a\u81e8\u6642\u76ee\u9304\u5931\u6557\uff1a{str(e)}\")\n            continue\n        \n        logger.info(f\"\u89e3\u58d3\u5f8c\u627e\u5230 {len(images)} \u5f35\u5716\u7247\uff1a\")\n        for img in images:\n            logger.info(f\"- {Path(img).name}\")\n        \n        total_images += len(images)\n        group_count = 0\n        \n        # \u6309\u6bcf\u7d44 9 \u5f35\u767c\u9001\u6700\u591a\u4e09\u7d44\u5716\u7247\n        group_size = 9\n        max_groups = 3  # \u4fee\u6539\u70ba 3 \u7d44\uff08\u5171\u6700\u591a 27 \u5f35\u5716\u7247\uff09\n        for i in range(0, min(len(images), group_size * max_groups), group_size):\n            group = images&#91;i:i + group_size]\n            caption = f\"#{zip_name}\"\n            logger.info(f\"\u6e96\u5099\u767c\u9001\u5716\u7247\u7d44\uff08{len(group)} \u5f35\uff09\uff1a{&#91;Path(p).name for p in group]}\")\n            \n            # \u767c\u9001\u5716\u7247\u7d44\n            success = await send_photos_in_groups(bot, CHAT_ID, group, caption)\n            group_count += 1\n            \n            # \u522a\u9664\u5df2\u767c\u9001\u7684\u5716\u7247\n            for photo in group:\n                try:\n                    os.remove(photo)\n                    logger.info(f\"\u5df2\u522a\u9664\u5716\u7247\uff1a{Path(photo).name}\")\n                except OSError as e:\n                    logger.warning(f\"\u522a\u9664\u5716\u7247 {Path(photo).name} \u5931\u6557\uff1a{str(e)}\")\n            \n            # \u6bcf\u7d44\u9593\u66ab\u505c 30 \u79d2\n            # \u82e5\u9700\u8abf\u6574\u7b49\u5f85\u5ef6\u6642\uff0c\u8acb\u4fee\u6539\u6b64\u8655\u7684\u79d2\u6578\uff08\u4f8b\u5982\u5c07 20 \u6539\u70ba\u5176\u4ed6\u503c\uff09\n            logger.info(\"\u958b\u59cb\u7b49\u5f85 30 \u79d2...\")\n            await asyncio.sleep(30)\n            logger.info(\"30 \u79d2\u7b49\u5f85\u7d50\u675f\")\n        \n        # \u767c\u9001\u9810\u89bd\u5b8c\u6210\u5831\u544a\n        preview_report = f\"ZIP \u6587\u4ef6 {zip_name} \u5df2\u767c\u9001\u4e09\u7d44\u9810\u89bd\u5716\u7247\uff08\u5171 {min(len(images), group_size * max_groups)} \u5f35\uff09\"\n        await send_report(bot, REPORT_USER_IDS, preview_report)\n        \n        # \u6e05\u7a7a\u81e8\u6642\u76ee\u9304\n        try:\n            shutil.rmtree(temp_dir)\n            temp_dir.mkdir(parents=True, exist_ok=True)\n            logger.info(f\"\u5df2\u6e05\u7a7a\u81e8\u6642\u76ee\u9304\uff1a{temp_dir}\")\n        except OSError as e:\n            logger.error(f\"\u6e05\u7a7a\u81e8\u6642\u76ee\u9304\u5931\u6557\uff1a{str(e)}\")\n            await send_report(bot, REPORT_USER_IDS, f\"\u932f\u8aa4\uff1a\u7121\u6cd5\u6e05\u7a7a\u81e8\u6642\u76ee\u9304 {temp_dir}\uff1a{str(e)}\")\n            continue\n        \n        # \u4e0a\u50b3 ZIP \u6587\u4ef6\n        upload_caption = f\"ZIP \u6587\u4ef6\uff1a{zip_name}\"\n        success = await upload_zip_file(bot, UPLOAD_CHAT_ID, zip_file, upload_caption)\n        if success:\n            await send_report(bot, REPORT_USER_IDS, f\"ZIP \u6587\u4ef6 {zip_name} \u5df2\u4e0a\u50b3\u5230\u7fa4\u7d44 {UPLOAD_CHAT_ID}\")\n        else:\n            await send_report(bot, REPORT_USER_IDS, f\"\u932f\u8aa4\uff1a\u7121\u6cd5\u4e0a\u50b3 ZIP \u6587\u4ef6 {zip_name} \u5230\u7fa4\u7d44 {UPLOAD_CHAT_ID}\")\n        \n        # \u6bcf\u500b ZIP \u6587\u4ef6\u8655\u7406\u5f8c\u66ab\u505c 20 \u79d2\n        # \u82e5\u9700\u8abf\u6574\u7b49\u5f85\u5ef6\u6642\uff0c\u8acb\u4fee\u6539\u6b64\u8655\u7684\u79d2\u6578\uff08\u4f8b\u5982\u5c07 20 \u6539\u70ba\u5176\u4ed6\u503c\uff09\n        logger.info(\"\u958b\u59cb\u7b49\u5f85 20 \u79d2...\")\n        await asyncio.sleep(20)\n        logger.info(\"20 \u79d2\u7b49\u5f85\u7d50\u675f\")\n        \n        # \u522a\u9664 ZIP \u6587\u4ef6\n        try:\n            os.remove(zip_file)\n            logger.info(f\"\u5df2\u522a\u9664 ZIP \u6587\u4ef6\uff1a{zip_name}\")\n        except OSError as e:\n            logger.error(f\"\u522a\u9664 ZIP \u6587\u4ef6 {zip_name} \u5931\u6557\uff1a{str(e)}\")\n            await send_report(bot, REPORT_USER_IDS, f\"\u932f\u8aa4\uff1a\u7121\u6cd5\u522a\u9664 ZIP \u6587\u4ef6 {zip_name}\uff1a{str(e)}\")\n        \n        processed_zips.append(zip_name)\n    \n    # \u767c\u9001\u7e3d\u7d50\u5831\u544a\n    total_duration = time.time() - start_time\n    summary_report = (f\"\u8173\u672c\u8655\u7406\u5b8c\u6210\uff1a\\n\"\n                      f\"\u8655\u7406\u7684 ZIP \u6587\u4ef6\uff08{len(processed_zips)} \u500b\uff09\uff1a\\n\" + \"\\n\".join(processed_zips) +\n                      f\"\\n\u7e3d\u5716\u7247\u6578\uff1a{total_images}\\n\u7e3d\u7528\u6642\uff1a{total_duration:.2f} \u79d2\")\n    # \u7e3d\u7d50\u5831\u544a\u524d\u66ab\u505c 1 \u79d2\n    # \u82e5\u9700\u8abf\u6574\u7b49\u5f85\u5ef6\u6642\uff0c\u8acb\u4fee\u6539\u6b64\u8655\u7684\u79d2\u6578\uff08\u4f8b\u5982\u5c07 1 \u6539\u70ba\u5176\u4ed6\u503c\uff09\n    await asyncio.sleep(1)\n    await send_report(bot, REPORT_USER_IDS, summary_report)\n\nif __name__ == \"__main__\":\n    logger.info(\"\u8173\u672c\u958b\u59cb\u904b\u884c\")\n    try:\n        asyncio.run(main())\n        logger.info(\"\u8173\u672c\u904b\u884c\u7d50\u675f\")\n    except Exception as e:\n        logger.error(f\"\u8173\u672c\u904b\u884c\u51fa\u932f\uff1a{str(e)}\")\n        asyncio.run(send_report(Bot(token=BOT_TOKEN), REPORT_USER_IDS, f\"\u8173\u672c\u904b\u884c\u51fa\u932f\uff1a{str(e)}\"))\n<\/code><\/pre>\n\n\n\n<p><\/p>\n<p>\u8f6c\u8f7d\u8bf7\u6ce8\u660e\uff1a<a href=\"https:\/\/keyi.eu.org\">\u5218\u592a\u76d1\u7684\u79c1\u85cf<\/a> &raquo; <a href=\"https:\/\/keyi.eu.org\/?p=967\">\u91dd\u5c0d\u76ee\u6a19\u7fa3\u7d44\uff0c\u81ea\u52d5\u767c\u4f48\u5167\u5bb9\u7684bot<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>\u5b66\u4e60\u7b14\u8bb0<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/keyi.eu.org\/index.php?rest_route=\/wp\/v2\/posts\/967"}],"collection":[{"href":"https:\/\/keyi.eu.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keyi.eu.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keyi.eu.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/keyi.eu.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=967"}],"version-history":[{"count":5,"href":"https:\/\/keyi.eu.org\/index.php?rest_route=\/wp\/v2\/posts\/967\/revisions"}],"predecessor-version":[{"id":973,"href":"https:\/\/keyi.eu.org\/index.php?rest_route=\/wp\/v2\/posts\/967\/revisions\/973"}],"wp:attachment":[{"href":"https:\/\/keyi.eu.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=967"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keyi.eu.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=967"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keyi.eu.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=967"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}