{"id":31907,"date":"2025-06-29T20:51:49","date_gmt":"2025-06-29T12:51:49","guid":{"rendered":"https:\/\/www.kdjingpai.com\/?p=31907"},"modified":"2025-06-29T20:51:49","modified_gmt":"2025-06-29T12:51:49","slug":"ai-qudongdeneirongbie","status":"publish","type":"post","link":"https:\/\/www.kdjingpai.com\/pt\/ai-qudongdeneirongbie\/","title":{"rendered":"AI \u9a71\u52a8\u7684\u5185\u5bb9\u521b\u4f5c\uff1a\u5728\u89c4\u8303\u4e0e\u521b\u610f\u4e4b\u95f4\u5bfb\u627e\u5e73\u8861"},"content":{"rendered":"<p>\u5bf9\u4e8e\u8bb8\u591a\u5185\u5bb9\u521b\u4f5c\u8005\u800c\u8a00\uff0c\u5c06\u539f\u59cb\u3001\u67af\u71e5\u7684 RSS \u65b0\u95fb\u6e90\u8f6c\u5316\u4e3a\u4e00\u7bc7\u7ed3\u6784\u6e05\u6670\u3001\u89c2\u70b9\u72ec\u5230\u4e14\u98ce\u683c\u4e00\u81f4\u7684\u4e13\u680f\u6587\u7ae0\uff0c\u662f\u4e00\u9879\u8017\u65f6\u8d39\u529b\u7684\u5de5\u4f5c\u3002\u4fe1\u606f\u6d2a\u6d41\u6bcf\u65e5\u6d8c\u6765\uff0c\u4f46\u771f\u6b63\u5c06\u5176\u6253\u78e8\u6210\u5438\u5f15\u8bfb\u8005\u7684\u5185\u5bb9\uff0c\u5f80\u5f80\u9700\u8981\u5728\u201c\u673a\u68b0\u642c\u8fd0\u201d\u4e0e\u201c\u521b\u610f\u67af\u7aed\u201d\u4e4b\u95f4\u6323\u624e\u3002<\/p>\n<p>\u672c\u6587\u5c06\u63a2\u8ba8\u4e00\u79cd\u81ea\u52a8\u5316\u5de5\u5177\u7684\u6784\u5efa\u601d\u8def\uff0c\u5b83\u80fd\u5c06\u8fd9\u4e00\u8fc7\u7a0b\u53d8\u5f97\u9ad8\u6548\u800c\u667a\u80fd\u3002\u8fd9\u4e2a\u5de5\u5177\u7684\u6838\u5fc3\u76ee\u7684\u5f88\u660e\u786e\uff1a\u5c06 RSS \u8ba2\u9605\u6e90\u4e2d\u672a\u7ecf\u52a0\u5de5\u7684\u4fe1\u606f\uff0c\u901a\u8fc7\u5927\u578b\u8bed\u8a00\u6a21\u578b\uff08LLM\uff09\u7684\u5904\u7406\uff0c\u91cd\u5851\u4e3a\u9002\u5408\u53d1\u5e03\u7684\u9ad8\u8d28\u91cf\u6587\u7ae0\u3002<\/p>\n<h3>\u63a7\u5236\u521b\u610f\u7684\u201c\u6e29\u5ea6\u201d<\/h3>\n<p>RSS \u8ba2\u9605\u6e90\u5c31\u50cf\u4e00\u4e2a\u5fe0\u5b9e\u7684\u4fe1\u4f7f\uff0c\u5b83\u51c6\u786e\u5730\u4f20\u9012\u4fe1\u606f\uff0c\u4f46\u7f3a\u4e4f\u89e3\u8bfb\u548c\u60c5\u611f\u3002\u800c\u4e00\u4e2a\u4f18\u79c0\u7684\u81ea\u52a8\u5316\u5de5\u5177\uff0c\u5219\u5e94\u626e\u6f14\u4e13\u680f\u4f5c\u5bb6\u7684\u89d2\u8272\uff0c\u4e0d\u4ec5\u5448\u73b0\u4e8b\u5b9e\uff0c\u66f4\u80fd\u8d4b\u4e88\u5176\u89c2\u70b9\u548c\u751f\u547d\u529b\u3002<\/p>\n<p>\u5b9e\u73b0\u8fd9\u4e00\u70b9\u7684\u5173\u952e\u5728\u4e8e\u5bf9 AI \u6a21\u578b\u521b\u9020\u6027\u7684\u7cbe\u786e\u63a7\u5236\u3002\u901a\u8fc7\u8c03\u6574\u00a0<code>temperature<\/code>\u00a0\u53c2\u6570\uff0c\u7528\u6237\u53ef\u4ee5\u9a7e\u9a6d\u6a21\u578b\u7684\u8f93\u51fa\u98ce\u683c\u3002\u8fd9\u662f\u4e00\u4e2a\u8303\u56f4\u901a\u5e38\u5728 0 \u5230 1 \u4e4b\u95f4\u7684\u503c\uff0c\u7528\u4e8e\u8c03\u8282\u6a21\u578b\u9884\u6d4b\u7684\u968f\u673a\u6027\u3002\u8f83\u4f4e\u7684\u00a0<code>temperature<\/code>\u00a0\u503c\uff08\u5982 0.2\uff09\u4f1a\u4f7f\u8f93\u51fa\u66f4\u5177\u786e\u5b9a\u6027\u548c\u4e00\u81f4\u6027\uff0c\u9002\u5408\u9700\u8981\u4e25\u8c28\u3001\u4e8b\u5b9e\u9a71\u52a8\u7684\u62a5\u9053\uff1b\u800c\u8f83\u9ad8\u7684\u503c\uff08\u5982 0.8\uff09\u5219\u4f1a\u6fc0\u53d1\u6a21\u578b\u7684\u201c\u60f3\u8c61\u529b\u201d\uff0c\u4ea7\u751f\u66f4\u591a\u6837\u5316\u3001\u66f4\u5177\u521b\u610f\u7684\u8868\u8fbe\u65b9\u5f0f\uff0c\u9002\u5408\u9700\u8981\u751f\u52a8\u6bd4\u55bb\u548c\u901a\u4fd7\u89e3\u91ca\u7684\u79d1\u666e\u5185\u5bb9\u3002<\/p>\n<h3>\u201c\u4e09\u4f4d\u4e00\u4f53\u201d\u7684\u5199\u4f5c\u52a9\u624b<\/h3>\n<p>\u4e3a\u4e86\u6ee1\u8db3\u4e0d\u540c\u573a\u666f\u7684\u9700\u6c42\uff0c\u8be5\u5de5\u5177\u5185\u7f6e\u4e86\u4e09\u79cd\u622a\u7136\u4e0d\u540c\u7684\u201c\u5199\u4f5c\u4eba\u683c\u201d\uff0c\u6bcf\u4e00\u79cd\u90fd\u4ee3\u8868\u7740\u4e25\u8c28\u4e0e\u521b\u610f\u7684\u4e0d\u540c\u5e73\u8861\u70b9\uff1a<\/p>\n<ul>\n<li><strong>\u65e5\u5e38\u7b80\u62a5\u4eba\u683c<\/strong>: \u6a21\u62df\u79d1\u6280\u535a\u4e3b\u7684\u4eb2\u5207\u53e3\u543b\uff0c\u5c06\u6bcf\u65e5\u7684 AI \u65b0\u95fb\u4e32\u8054\u6210\u8f7b\u677e\u7684\u7b80\u62a5\u3002\u5b83\u5728\u786e\u4fdd\u6838\u5fc3\u4fe1\u606f\u51c6\u786e\u7684\u540c\u65f6\uff0c\u4f1a\u4f7f\u7528\u751f\u6d3b\u5316\u7684\u6bd4\u55bb\u548c\u9002\u5f53\u7684 emoji\uff0c\u62c9\u8fd1\u4e0e\u8bfb\u8005\u7684\u8ddd\u79bb\u3002<\/li>\n<li><strong>\u6df1\u5ea6\u5206\u6790\u4eba\u683c<\/strong>: \u5207\u6362\u81f3\u884c\u4e1a\u5206\u6790\u5e08\u7684\u89c6\u89d2\uff0c\u6df1\u5165\u5256\u6790\u65b0\u95fb\u80cc\u540e\u7684\u6280\u672f\u672c\u8d28\u4e0e\u5e02\u573a\u5f71\u54cd\u3002\u5b83\u503e\u5411\u4e8e\u66f4\u4f4e\u7684\u00a0<code>temperature<\/code>\uff0c\u4ee5\u4fdd\u8bc1\u8f93\u51fa\u7684\u4e13\u4e1a\u6027\u4e0e\u903b\u8f91\u6027\uff0c\u540c\u65f6\u5728\u6846\u67b6\u5185\u5f62\u6210\u72ec\u5230\u89c1\u89e3\u3002<\/li>\n<li><strong>\u5c0f\u767d\u7ffb\u8bd1\u4eba\u683c<\/strong>: \u5b83\u7684\u6838\u5fc3\u4efb\u52a1\u662f\u5316\u7e41\u4e3a\u7b80\u3002\u4f8b\u5982\uff0c\u5f53\u9047\u5230\u201cMixture of Experts (MoE)\u201d\u8fd9\u6837\u7684\u4e13\u4e1a\u672f\u8bed\u65f6\uff0c\u5b83\u4e0d\u4f1a\u76f4\u63a5\u629b\u7ed9\u8bfb\u8005\uff0c\u800c\u662f\u5c06\u5176\u6bd4\u55bb\u4e3a\u201c\u4e00\u4e2a\u4e13\u5bb6\u56e2\u961f\u534f\u540c\u5de5\u4f5c\uff0c\u6bcf\u4e2a\u4e13\u5bb6\u53ea\u8d1f\u8d23\u81ea\u5df1\u6700\u64c5\u957f\u7684\u4e00\u5c0f\u90e8\u5206\u95ee\u9898\uff0c\u4ee5\u6b64\u63d0\u5347\u6574\u4f53\u6548\u7387\u548c\u51c6\u786e\u6027\u201d\uff0c\u8ba9\u96f6\u57fa\u7840\u7684\u8bfb\u8005\u4e5f\u80fd\u8f7b\u677e\u7406\u89e3\u3002<\/li>\n<\/ul>\n<p>\u8fd9\u4e09\u79cd\u4eba\u683c\u786e\u4fdd\u4e86\u8f93\u51fa\u5185\u5bb9\u5728\u98ce\u683c\u4e0a\u53ef\u4ee5\u7075\u6d3b\u591a\u53d8\uff0c\u4f46\u5728\u6587\u7ae0\u7ed3\u6784\u4e0a\u4fdd\u6301\u4e00\u81f4\uff0c\u5e2e\u52a9\u8bfb\u8005\u5f62\u6210\u7a33\u5b9a\u7684\u9605\u8bfb\u9884\u671f\u3002<\/p>\n<h3>\u7a33\u5065\u8fd0\u884c\u7684\u6280\u672f\u57fa\u77f3<\/h3>\n<p>\u4e00\u4e2a\u771f\u6b63\u53ef\u7528\u7684\u5de5\u5177\uff0c\u4e0d\u80fd\u4ec5\u4ec5\u662f API \u7684\u7b80\u5355\u8c03\u7528\uff0c\u5176\u80cc\u540e\u9700\u8981\u4e00\u5957\u7a33\u5065\u7684\u5de5\u7a0b\u8bbe\u8ba1\u6765\u786e\u4fdd\u6d41\u7a0b\u7684\u987a\u7545\u4e0e\u53ef\u9760\u3002<\/p>\n<ul>\n<li><strong>\u81ea\u52a8\u91cd\u8bd5\u673a\u5236<\/strong>: \u7f51\u7edc\u6ce2\u52a8\u6216 API \u4e34\u65f6\u6027\u6545\u969c\u662f\u5e38\u89c1\u95ee\u9898\u3002\u901a\u8fc7\u5f15\u5165\u6307\u6570\u9000\u907f\u7684\u91cd\u8bd5\u673a\u5236\uff0c\u7cfb\u7edf\u53ef\u4ee5\u5728\u906d\u9047\u5931\u8d25\u540e\u81ea\u52a8\u7b49\u5f85\u4e00\u6bb5\u65f6\u95f4\u518d\u91cd\u65b0\u5c1d\u8bd5\uff0c\u6781\u5927\u63d0\u5347\u4e86\u4efb\u52a1\u6210\u529f\u7387\u3002<\/li>\n<li><strong>\u7f13\u5b58\u7cfb\u7edf<\/strong>: \u5bf9\u4e8e\u66f4\u65b0\u9891\u7387\u4e0d\u9ad8\u7684 RSS \u6e90\uff0c\u53cd\u590d\u6293\u53d6\u76f8\u540c\u5185\u5bb9\u662f\u4e00\u79cd\u8d44\u6e90\u6d6a\u8d39\u3002\u4e00\u4e2a\u7b80\u5355\u7684\u7f13\u5b58\u7cfb\u7edf\u53ef\u4ee5\u6682\u5b58\u5df2\u83b7\u53d6\u7684\u6570\u636e\uff0c\u5728\u8bbe\u5b9a\u7684\u65f6\u95f4\u5185\u76f4\u63a5\u4ece\u672c\u5730\u8bfb\u53d6\uff0c\u6709\u6548\u964d\u4f4e\u4e86\u7f51\u7edc\u8bf7\u6c42\u548c\u5904\u7406\u65f6\u95f4\u3002<\/li>\n<li><strong>\u6d41\u5f0f\u8f93\u51fa (Streaming Output)<\/strong>: \u65e0\u9700\u7b49\u5f85\u6a21\u578b\u751f\u6210\u5168\u90e8\u5185\u5bb9\uff0c\u6d41\u5f0f\u8f93\u51fa\u53ef\u4ee5\u50cf\u89c6\u9891\u52a0\u8f7d\u4e00\u6837\uff0c\u5b9e\u65f6\u5730\u5c06\u751f\u6210\u7684\u6587\u5b57\u9010\u5b57\u6216\u9010\u53e5\u663e\u793a\u51fa\u6765\u3002\u8fd9\u4e0d\u4ec5\u8ba9\u7528\u6237\u80fd\u5373\u65f6\u9884\u89c8\u5185\u5bb9\u8d28\u91cf\uff0c\u4e5f\u65b9\u4fbf\u5728\u53d1\u73b0\u65b9\u5411\u504f\u79bb\u65f6\u53ca\u65f6\u4e2d\u6b62\u4efb\u52a1\u3002<\/li>\n<li><strong>\u7075\u6d3b\u914d\u7f6e<\/strong>: \u4e3a\u4e86\u9002\u5e94\u4e0d\u540c\u73af\u5883\uff0c\u5de5\u5177\u652f\u6301\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u3001\u73af\u5883\u53d8\u91cf\u548c\u914d\u7f6e\u6587\u4ef6\u7b49\u591a\u79cd\u65b9\u5f0f\u8fdb\u884c\u8bbe\u7f6e\uff0c\u7528\u6237\u65e0\u9700\u4fee\u6539\u6e90\u4ee3\u7801\u5373\u53ef\u8c03\u6574\u6a21\u578b\u3001API \u5bc6\u94a5\u6216\u8f93\u51fa\u76ee\u5f55\u7b49\u3002<\/li>\n<li><strong>\u5468\u5168\u7684\u5f02\u5e38\u5904\u7406<\/strong>: \u4ece\u5bb9\u5e94\u5bf9\u5404\u79cd\u610f\u5916\uff0c\u5982 API \u5bc6\u94a5\u7f3a\u5931\u3001RSS \u5730\u5740\u65e0\u6cd5\u8bbf\u95ee\u7b49\uff0c\u4fdd\u8bc1\u7cfb\u7edf\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\u90fd\u80fd\u6e05\u6670\u5730\u62a5\u544a\u9519\u8bef\uff0c\u800c\u4e0d\u662f\u76f4\u63a5\u5d29\u6e83\u3002<\/li>\n<\/ul>\n<h3>\u5b9e\u8df5\u4e2d\u7684\u6548\u679c<\/h3>\n<p>\u8bbe\u60f3\u4e00\u4e0b\uff0c\u5f53\u00a0<code>Google<\/code>\u00a0\u53d1\u5e03\u4e86\u540d\u4e3a\u00a0<code><a href=\"https:\/\/www.kdjingpai.com\/de\/geminibardgubu\/\">Gemini<\/a> 2.5 Pro<\/code>\u00a0\u5e76\u5e26\u6709\u00a0<code>DeepThink<\/code>\u00a0\u63a8\u7406\u529f\u80fd\u7684\u65b0\u6a21\u578b\u65f6\uff0c\u7ecf\u8fc7\u201c\u5c0f\u767d\u7ffb\u8bd1\u4eba\u683c\u201d\u7684\u5904\u7406\uff0c\u5b83\u53ef\u80fd\u4f1a\u88ab\u89e3\u91ca\u6210\uff1a<\/p>\n<p><code>Gemini 2.5 Pro<\/code>\u00a0\u5c31\u50cf\u4e00\u4e2a\u6781\u5176\u806a\u660e\u7684 AI \u4f19\u4f34\uff0c\u53ef\u4ee5\u5e2e\u4f60\u5904\u7406\u5404\u79cd\u4efb\u52a1\u3002\u800c\u65b0\u589e\u7684\u00a0<code>DeepThink<\/code>\u00a0\u6a21\u5f0f\uff0c\u5219\u8d4b\u4e88\u4e86\u5b83\u6df1\u5ea6\u601d\u8003\u7684\u80fd\u529b\u3002\u8fd9\u610f\u5473\u7740\u5b83\u4e0d\u518d\u4ec5\u4ec5\u56de\u7b54\u201c\u662f\u4ec0\u4e48\u201d\uff0c\u66f4\u80fd\u6e05\u6670\u5730\u89e3\u91ca\u201c\u4e3a\u4ec0\u4e48\u662f\u8fd9\u6837\u201d\uff0c\u50cf\u4e00\u4e2a\u80fd\u5e26\u4f60\u63a2\u7a76\u95ee\u9898\u672c\u8d28\u7684\u826f\u5e08\u76ca\u53cb\u3002<\/p>\n<p>\u8fd9\u79cd\u5904\u7406\u65b9\u5f0f\uff0c\u65e2\u4fdd\u7559\u4e86\u6280\u672f\u7684\u4e13\u4e1a\u6027\uff0c\u53c8\u5b9e\u73b0\u4e86\u8868\u8fbe\u7684\u901a\u4fd7\u5316\u3002\u5b83\u8bc1\u660e\u4e86\u521b\u610f\u5e76\u975e\u5929\u9a6c\u884c\u7a7a\u7684\u60f3\u8c61\uff0c\u800c\u662f\u5728\u660e\u786e\u89c4\u5219\u6846\u67b6\u4e0b\u7684\u6709\u5e8f\u521b\u65b0\uff0c\u5982\u540c\u7235\u58eb\u4e50\u7684\u5373\u5174\u6f14\u594f\uff0c\u770b\u4f3c\u81ea\u7531\u5954\u653e\uff0c\u5b9e\u5219\u6bcf\u4e00\u6b65\u90fd\u672a\u8131\u79bb\u548c\u58f0\u7684\u8f68\u9053\u3002<\/p>\n<p>\u5f53\u5185\u5bb9\u521b\u4f5c\u8005\u4e0d\u518d\u9700\u8981\u5728\u201c\u6280\u672f\u6df1\u5ea6\u201d\u4e0e\u201c\u5927\u4f17\u79d1\u666e\u201d\u4e4b\u95f4\u505a\u8270\u96be\u6289\u62e9\u65f6\uff0c\u6280\u672f\u7684\u4ef7\u503c\u624d\u771f\u6b63\u5f97\u4ee5\u5f70\u663e\u3002<\/p>\n<pre><code>#!\/usr\/bin\/env python3\r\n# -*- coding: utf-8 -*-\r\nimport feedparser\r\nimport datetime\r\nimport requests\r\nimport os\r\nimport json\r\nimport time\r\nimport logging\r\nimport traceback\r\nimport argparse\r\nimport configparser\r\nfrom pathlib import Path\r\nfrom datetime import timedelta\r\nfrom functools import wraps\r\nfrom typing import List, Dict, Any, Optional, Callable, TypeVar, Union\r\n# \u8bbe\u7f6e\u65e5\u5fd7\r\nlogging.basicConfig(\r\nlevel=logging.INFO,\r\nformat='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\r\nhandlers=[\r\nlogging.FileHandler(\"ai_news_generator.log\"),\r\nlogging.StreamHandler()\r\n]\r\n)\r\nlogger = logging.getLogger(\"ai_news_generator\")\r\n# \u7c7b\u578b\u58f0\u660e\r\nT = TypeVar('T')\r\nFeedEntry = Dict[str, Any]\r\nApiResponse = Dict[str, Any]\r\n# \u9ed8\u8ba4\u914d\u7f6e\r\nDEFAULT_CONFIG = {\r\n\"api\": {\r\n\"base_url\": \"https:\/\/xxxxxxxxxxxxx\/openai\",\r\n\"model\": \"xxxxxxxxx\",\r\n\"api_key\": os.environ.get(\"OPENAI_API_KEY\", \"\"),\r\n\"max_tokens\": 2000,\r\n\"timeout\": 60,\r\n\"temperature\": 0.7\r\n},\r\n\"rss\": {\r\n\"url\": \"https:\/\/news.smol.ai\/rss.xml\",\r\n\"days\": 7,\r\n\"cache_time\": 3600  # \u7f13\u5b58RSS\u5185\u5bb9\u7684\u65f6\u95f4\uff08\u79d2\uff09\r\n},\r\n\"output\": {\r\n\"directory\": \"ai_news_output\",\r\n\"format\": \"markdown\"\r\n}\r\n}\r\n# \u91cd\u8bd5\u88c5\u9970\u5668\r\ndef retry(max_attempts: int = 3, delay: int = 2, backoff: int = 2,\r\nexceptions: tuple = (Exception,)) -&gt; Callable:\r\n\"\"\"\r\n\u91cd\u8bd5\u88c5\u9970\u5668\uff0c\u7528\u4e8e\u5904\u7406\u53ef\u80fd\u5931\u8d25\u7684\u64cd\u4f5c\r\n\u53c2\u6570:\r\nmax_attempts: \u6700\u5927\u5c1d\u8bd5\u6b21\u6570\r\ndelay: \u521d\u59cb\u5ef6\u8fdf\u65f6\u95f4\uff08\u79d2\uff09\r\nbackoff: \u5ef6\u8fdf\u7684\u500d\u6570\uff08\u6307\u6570\u9000\u907f\uff09\r\nexceptions: \u8981\u6355\u83b7\u7684\u5f02\u5e38\u5143\u7ec4\r\n\"\"\"\r\ndef decorator(func):\r\n        @wraps(func)\r\ndef wrapper(*args, **kwargs):\r\nattempt = 0\r\ncurrent_delay = delay\r\nwhile attempt &lt; max_attempts:\r\ntry:\r\nreturn func(*args, **kwargs)\r\nexcept exceptions as e:\r\nattempt += 1\r\nif attempt == max_attempts:\r\nlogger.error(f\"\u6700\u5927\u5c1d\u8bd5\u6b21\u6570\u5df2\u7528\u5b8c ({max_attempts})\uff0c\u64cd\u4f5c\u5931\u8d25: {e}\")\r\nraise\r\nlogger.warning(f\"\u5c1d\u8bd5 {attempt}\/{max_attempts} \u5931\u8d25: {e}. \"\r\nf\"\u5c06\u5728 {current_delay} \u79d2\u540e\u91cd\u8bd5...\")\r\ntime.sleep(current_delay)\r\ncurrent_delay *= backoff\r\nreturn wrapper\r\nreturn decorator\r\nclass Config:\r\n\"\"\"\u914d\u7f6e\u7ba1\u7406\u7c7b\"\"\"\r\ndef __init__(self, config_file: Optional[str] = None):\r\n\"\"\"\r\n\u521d\u59cb\u5316\u914d\u7f6e\r\n\u53c2\u6570:\r\nconfig_file: \u914d\u7f6e\u6587\u4ef6\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u5219\u4f7f\u7528\u9ed8\u8ba4\u914d\u7f6e\r\n\"\"\"\r\nself.config = DEFAULT_CONFIG.copy()\r\nif config_file and os.path.exists(config_file):\r\nself._load_from_file(config_file)\r\nelse:\r\nlogger.info(\"\u672a\u627e\u5230\u914d\u7f6e\u6587\u4ef6\uff0c\u4f7f\u7528\u9ed8\u8ba4\u914d\u7f6e\")\r\n# \u73af\u5883\u53d8\u91cf\u4f18\u5148\u7ea7\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\r\nif os.environ.get(\"OPENAI_API_KEY\"):\r\nself.config[\"api\"][\"api_key\"] = os.environ.get(\"OPENAI_API_KEY\")\r\ndef _load_from_file(self, config_file: str) -&gt; None:\r\n\"\"\"\u4ece\u6587\u4ef6\u52a0\u8f7d\u914d\u7f6e\"\"\"\r\ntry:\r\nparser = configparser.ConfigParser()\r\nparser.read(config_file)\r\n# \u5c06\u914d\u7f6e\u6587\u4ef6\u503c\u66f4\u65b0\u5230\u9ed8\u8ba4\u914d\u7f6e\r\nfor section in parser.sections():\r\nif section in self.config:\r\nfor key, value in parser.items(section):\r\n# \u5c1d\u8bd5\u8f6c\u6362\u7c7b\u578b\u4ee5\u5339\u914d\u9ed8\u8ba4\u914d\u7f6e\r\nif key in self.config[section]:\r\noriginal_type = type(self.config[section][key])\r\nif original_type is int:\r\nself.config[section][key] = int(value)\r\nelif original_type is float:\r\nself.config[section][key] = float(value)\r\nelif original_type is bool:\r\nself.config[section][key] = value.lower() in (\"true\", \"yes\", \"1\")\r\nelse:\r\nself.config[section][key] = value\r\nlogger.info(f\"\u4ece {config_file} \u52a0\u8f7d\u914d\u7f6e\")\r\nexcept Exception as e:\r\nlogger.error(f\"\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6\u51fa\u9519: {e}\")\r\ndef save_config(self, file_path: str) -&gt; None:\r\n\"\"\"\u5c06\u5f53\u524d\u914d\u7f6e\u4fdd\u5b58\u5230\u6587\u4ef6\"\"\"\r\ntry:\r\nparser = configparser.ConfigParser()\r\nfor section, options in self.config.items():\r\nparser.add_section(section)\r\nfor key, value in options.items():\r\nparser.set(section, key, str(value))\r\nwith open(file_path, 'w') as f:\r\nparser.write(f)\r\nlogger.info(f\"\u914d\u7f6e\u5df2\u4fdd\u5b58\u5230 {file_path}\")\r\nexcept Exception as e:\r\nlogger.error(f\"\u4fdd\u5b58\u914d\u7f6e\u6587\u4ef6\u51fa\u9519: {e}\")\r\ndef get(self, section: str, key: str, default: Any = None) -&gt; Any:\r\n\"\"\"\u83b7\u53d6\u914d\u7f6e\u503c\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u5219\u8fd4\u56de\u9ed8\u8ba4\u503c\"\"\"\r\ntry:\r\nreturn self.config[section][key]\r\nexcept KeyError:\r\nlogger.warning(f\"\u914d\u7f6e {section}.{key} \u4e0d\u5b58\u5728\uff0c\u4f7f\u7528\u9ed8\u8ba4\u503c: {default}\")\r\nreturn default\r\nclass RssReader:\r\n\"\"\"RSS\u8ba2\u9605\u5185\u5bb9\u8bfb\u53d6\u7c7b\"\"\"\r\ndef __init__(self, config: Config):\r\n\"\"\"\r\n\u521d\u59cb\u5316RSS\u8bfb\u53d6\u5668\r\n\u53c2\u6570:\r\nconfig: \u914d\u7f6e\u5bf9\u8c61\r\n\"\"\"\r\nself.config = config\r\nself.cache = {}\r\nself.cache_time = {}\r\n    @retry(max_attempts=3, exceptions=(requests.RequestException,))\r\ndef fetch_rss_feed(self, url: Optional[str] = None) -&gt; Optional[bytes]:\r\n\"\"\"\r\n\u83b7\u53d6RSS\u8ba2\u9605\u5185\u5bb9\r\n\u53c2\u6570:\r\nurl: RSS\u8ba2\u9605\u5730\u5740\uff0c\u5982\u679c\u4e3aNone\u5219\u4f7f\u7528\u914d\u7f6e\u4e2d\u7684\u5730\u5740\r\n\u8fd4\u56de:\r\nRSS\u5185\u5bb9\u6216None\uff08\u5982\u679c\u83b7\u53d6\u5931\u8d25\uff09\r\n\"\"\"\r\nurl = url or self.config.get(\"rss\", \"url\")\r\ncache_time = self.config.get(\"rss\", \"cache_time\")\r\n# \u68c0\u67e5\u7f13\u5b58\r\nif url in self.cache and url in self.cache_time:\r\nif time.time() - self.cache_time[url] &lt; cache_time:\r\nlogger.debug(f\"\u4f7f\u7528\u7f13\u5b58\u7684RSS\u5185\u5bb9: {url}\")\r\nreturn self.cache[url]\r\ntry:\r\nlogger.info(f\"\u83b7\u53d6RSS\u8ba2\u9605: {url}\")\r\nresponse = requests.get(url, timeout=10)\r\nresponse.raise_for_status()\r\n# \u66f4\u65b0\u7f13\u5b58\r\nself.cache[url] = response.content\r\nself.cache_time[url] = time.time()\r\nreturn response.content\r\nexcept requests.exceptions.RequestException as e:\r\nlogger.error(f\"\u83b7\u53d6RSS\u5931\u8d25: {e}\")\r\nraise\r\ndef parse_feed(self, content: Optional[bytes]) -&gt; Optional[feedparser.FeedParserDict]:\r\n\"\"\"\r\n\u89e3\u6790RSS\u5185\u5bb9\r\n\u53c2\u6570:\r\ncontent: RSS\u5185\u5bb9\r\n\u8fd4\u56de:\r\n\u89e3\u6790\u540e\u7684Feed\u5bf9\u8c61\u6216None\uff08\u5982\u679c\u89e3\u6790\u5931\u8d25\uff09\r\n\"\"\"\r\nif not content:\r\nlogger.error(\"\u6ca1\u6709\u5185\u5bb9\u53ef\u4ee5\u89e3\u6790\")\r\nreturn None\r\ntry:\r\nreturn feedparser.parse(content)\r\nexcept Exception as e:\r\nlogger.error(f\"\u89e3\u6790RSS\u5185\u5bb9\u5931\u8d25: {e}\")\r\nreturn None\r\ndef get_recent_entries(self, feed: Optional[feedparser.FeedParserDict],\r\ndays: Optional[int] = None) -&gt; List[FeedEntry]:\r\n\"\"\"\r\n\u83b7\u53d6\u6700\u8fd1n\u5929\u7684\u8ba2\u9605\u5185\u5bb9\r\n\u53c2\u6570:\r\nfeed: \u89e3\u6790\u540e\u7684Feed\u5bf9\u8c61\r\ndays: \u5929\u6570\uff0c\u5982\u679c\u4e3aNone\u5219\u4f7f\u7528\u914d\u7f6e\u4e2d\u7684\u503c\r\n\u8fd4\u56de:\r\n\u6700\u8fd1\u7684\u6761\u76ee\u5217\u8868\r\n\"\"\"\r\nif not feed:\r\nlogger.warning(\"\u6ca1\u6709Feed\u53ef\u4ee5\u83b7\u53d6\u6761\u76ee\")\r\nreturn []\r\ndays = days or self.config.get(\"rss\", \"days\")\r\nnow = datetime.datetime.now()\r\ncutoff_date = now - timedelta(days=days)\r\nrecent_entries = []\r\nlogger.info(f\"\u83b7\u53d6\u6700\u8fd1 {days} \u5929\u7684\u8ba2\u9605\u5185\u5bb9\")\r\nfor entry in feed.entries:\r\n# \u89e3\u6790\u53d1\u5e03\u65e5\u671f\r\npub_date = None\r\nif hasattr(entry, 'published_parsed') and entry.published_parsed:\r\npub_date = datetime.datetime(*entry.published_parsed[:6])\r\nelif hasattr(entry, 'updated_parsed') and entry.updated_parsed:\r\npub_date = datetime.datetime(*entry.updated_parsed[:6])\r\nelse:\r\n# \u5982\u679c\u6ca1\u6709\u65e5\u671f\u4fe1\u606f\uff0c\u8df3\u8fc7\u8be5\u6761\u76ee\r\nlogger.debug(f\"\u8df3\u8fc7\u6ca1\u6709\u65e5\u671f\u4fe1\u606f\u7684\u6761\u76ee: {entry.get('title', 'Unknown')}\")\r\n<a href=\"https:\/\/www.kdjingpai.com\/de\/continue\/\">continue<\/a>\r\n# \u53ea\u4fdd\u7559\u6700\u8fd1n\u5929\u7684\u5185\u5bb9\r\nif pub_date &gt;= cutoff_date:\r\nrecent_entries.append({\r\n'title': entry.title,\r\n'link': entry.link,\r\n'published': pub_date.strftime('%Y-%m-%d %H:%M:%S'),\r\n'summary': entry.summary if hasattr(entry, 'summary') else \"\u65e0\u6458\u8981\",\r\n})\r\nlogger.info(f\"\u627e\u5230 {len(recent_entries)} \u7bc7\u6700\u8fd1\u7684\u6587\u7ae0\")\r\nreturn recent_entries\r\ndef display_entries(self, entries: List[FeedEntry]) -&gt; None:\r\n\"\"\"\r\n\u663e\u793a\u6761\u76ee\u5185\u5bb9\r\n\u53c2\u6570:\r\nentries: \u6761\u76ee\u5217\u8868\r\n\"\"\"\r\nif not entries:\r\nlogger.info(\"\u6ca1\u6709\u627e\u5230\u6700\u8fd1\u7684\u6587\u7ae0\")\r\nprint(\"\u6ca1\u6709\u627e\u5230\u6700\u8fd1\u7684\u6587\u7ae0\")\r\nreturn\r\nprint(f\"\u627e\u5230 {len(entries)} \u7bc7\u6700\u8fd1\u7684\u6587\u7ae0:\")\r\nprint(\"-\" * 80)\r\nfor i, entry in enumerate(entries, 1):\r\nprint(f\"{i}. {entry['title']}\")\r\nprint(f\"   \u53d1\u5e03\u65f6\u95f4: {entry['published']}\")\r\nprint(f\"   \u94fe\u63a5: {entry['link']}\")\r\nprint(f\"   \u6458\u8981: {entry['summary'][:200]}...\")  # \u53ea\u663e\u793a\u90e8\u5206\u6458\u8981\r\nprint(\"-\" * 80)\r\nclass ContentGenerator:\r\n\"\"\"\u5185\u5bb9\u751f\u6210\u7c7b\"\"\"\r\ndef __init__(self, config: Config):\r\n\"\"\"\r\n\u521d\u59cb\u5316\u5185\u5bb9\u751f\u6210\u5668\r\n\u53c2\u6570:\r\nconfig: \u914d\u7f6e\u5bf9\u8c61\r\n\"\"\"\r\nself.config = config\r\nself._load_prompt_templates()\r\ndef _load_prompt_templates(self) -&gt; None:\r\n\"\"\"\u52a0\u8f7d\u63d0\u793a\u8bcd\u6a21\u677f\"\"\"\r\nself.prompt_templates = {\r\n\"daily\": \"\"\"\r\n\u4f60\u662f\u56fd\u5185\u9876\u5c16\u7684AI\u79d1\u6280\u516c\u4f17\u53f7\u7f16\u8f91\uff0c\u64c5\u957f\u5c06\u590d\u6742\u6280\u672f\u65b0\u95fb\u8f6c\u5316\u4e3a\u901a\u4fd7\u6613\u61c2\u7684\u5185\u5bb9\u3002\r\n\u8bf7\u5c06\u63d0\u4f9b\u7684AI\u6280\u672f\u65b0\u95fb\u6574\u7406\u6210\u4e00\u7bc7\u5fae\u4fe1\u516c\u4f17\u53f7\"\u6bcf\u65e5AI\u7b80\u62a5\"\uff0c\u9075\u5faa\u4ee5\u4e0b\u8981\u6c42\uff1a\r\n\u3010\u5185\u5bb9\u8981\u6c42\u3011\r\n1. \u4f7f\u7528\u6807\u9898\"\u3010\u6bcf\u65e5AI\u7b80\u62a5\u3011YYYY\u5e74MM\u6708DD\u65e5\"\uff0c\u81ea\u52a8\u66ff\u6362\u4e3a\u5f53\u524d\u65e5\u671f\r\n2. \u5f00\u5934\u75282-3\u53e5\u8bdd\u603b\u7ed3\u4eca\u65e5AI\u9886\u57df\u7684\u6574\u4f53\u8d8b\u52bf\u6216\u4eae\u70b9\r\n3. \u4e3a\u6bcf\u6761\u65b0\u95fb\u8bbe\u8ba1\u7b80\u77ed\u9192\u76ee\u7684\u5c0f\u6807\u9898\uff0c\u5f62\u5f0f\u4e3a\"\u3010\u5173\u952e\u8bcd\u3011+\u6838\u5fc3\u5185\u5bb9\"\r\n4. \u6bcf\u6761\u65b0\u95fb\u5305\u542b\uff1a\r\n- \u4e8b\u4ef6\u6982\u8ff0\uff08\u7528\u6700\u7b80\u5355\u7684\u8bdd\u89e3\u91ca\u53d1\u751f\u4e86\u4ec0\u4e48\uff09\r\n- \u4e3a\u4ec0\u4e48\u91cd\u8981\uff08\u5bf9\u666e\u901a\u7528\u6237\u6216\u884c\u4e1a\u7684\u5f71\u54cd\uff09\r\n- \u76f8\u5173\u80cc\u666f\uff08\u5982\u5fc5\u8981\uff0c2-3\u53e5\u8bdd\u89e3\u91ca\u5173\u952e\u6280\u672f\u6982\u5ff5\uff09\r\n\u3010\u8868\u8fbe\u98ce\u683c\u3011\r\n1. \u50cf\"\u79d1\u6280\u535a\u4e3b\"\u800c\u975e\"\u65b0\u95fb\u8bb0\u8005\"\u7684\u8bed\u6c14\uff0c\u4eb2\u5207\u81ea\u7136\r\n2. \u4f7f\u7528\u751f\u52a8\u7684\u7c7b\u6bd4\u548c\u6bd4\u55bb\u89e3\u91ca\u6280\u672f\u6982\u5ff5\r\n3. \u9002\u5f53\u4f7f\u7528emoji\u589e\u5f3a\u8868\u8fbe\uff08\u6bcf\u6bb51-2\u4e2a\uff0c\u4e0d\u8981\u8fc7\u591a\uff09\r\n4. \u907f\u514d\u4e13\u4e1a\u672f\u8bed\u5806\u780c\uff0c\u5fc5\u987b\u4f7f\u7528\u65f6\u63d0\u4f9b\u7b80\u660e\u89e3\u91ca\r\n5. \u7528\"\u4f60\"\u76f4\u63a5\u5bf9\u8bfb\u8005\u8bf4\u8bdd\uff0c\u589e\u5f3a\u4eb2\u8fd1\u611f\r\n\u3010\u683c\u5f0f\u89c4\u8303\u3011\r\n1. \u901a\u7bc7\u91c7\u7528markdown\u683c\u5f0f\r\n2. \u6bcf\u6761\u65b0\u95fb\u4e4b\u95f4\u7528\u5206\u9694\u7ebf\u6216\u660e\u663e\u6807\u9898\u533a\u5206\r\n3. \u91cd\u70b9\u4fe1\u606f\u53ef\u7528\u52a0\u7c97\u3001\u659c\u4f53\u5f3a\u8c03\r\n4. \u603b\u7bc7\u5e45\u63a7\u5236\u57281000-1500\u5b57\u4e4b\u95f4\r\n5. \u7ed3\u5c3e\u6dfb\u52a0\"\u611f\u8c22\u9605\u8bfb\uff0c\u660e\u5929\u89c1~\"\u548c\u8ba2\u9605\u5f15\u5bfc\r\n\u8bb0\u4f4f\uff1a\u5199\u4f5c\u76ee\u6807\u662f\u8ba9\"\u5bf9AI\u611f\u5174\u8da3\u4f46\u6ca1\u6709\u6280\u672f\u80cc\u666f\u7684\u666e\u901a\u7528\u6237\"\u8f7b\u677e\u7406\u89e3\u8fd9\u4e9b\u6280\u672f\u8fdb\u5c55\u7684\u4ef7\u503c\u548c\u610f\u4e49\u3002\r\n\"\"\",\r\n\"deep\": \"\"\"\r\n\u4f60\u662f\u4e00\u4f4d\u8d44\u6df1AI\u9886\u57df\u5206\u6790\u5e08\uff0c\u64c5\u957f\u6df1\u5165\u5256\u6790\u6280\u672f\u8fdb\u5c55\u548c\u5e02\u573a\u5f71\u54cd\u3002\r\n\u8bf7\u5c06\u63d0\u4f9b\u7684AI\u6280\u672f\u65b0\u95fb\u6574\u7406\u6210\u4e00\u7bc7\u5fae\u4fe1\u516c\u4f17\u53f7\"AI\u6280\u672f\u6df1\u5ea6\u89e3\u6790\"\uff0c\u9075\u5faa\u4ee5\u4e0b\u8981\u6c42\uff1a\r\n\u3010\u5185\u5bb9\u67b6\u6784\u3011\r\n1. \u5f00\u7bc7\uff1a\u7528\u7b80\u660e\u8bed\u8a00\u6982\u8ff0\u672c\u671f\u65b0\u95fb\u7126\u70b9\uff0c\u6307\u51fa\u5171\u540c\u8d8b\u52bf\u6216\u4e3b\u9898\r\n2. \u5206\u6790\u6846\u67b6\uff1a\u5c06\u65b0\u95fb\u6309\u6280\u672f\u7c7b\u522b\u6216\u5e94\u7528\u9886\u57df\u5206\u7ec4\uff08\u5982LLM\u8fdb\u5c55\u3001\u591a\u6a21\u6001\u3001AI\u5e94\u7528\u7b49\uff09\r\n3. \u6bcf\u5219\u65b0\u95fb\u5305\u542b\uff1a\r\n- \u6280\u672f\u672c\u8d28\u89e3\u6790\uff08\u8fd9\u9879\u6280\u672f\/\u4ea7\u54c1\u7684\u6838\u5fc3\u673a\u5236\u662f\u4ec0\u4e48\uff09\r\n- \u8fdb\u6b65\u70b9\u8bc4\u4f30\uff08\u4e0e\u73b0\u6709\u6280\u672f\u76f8\u6bd4\u6709\u4f55\u7a81\u7834\uff09\r\n- \u884c\u4e1a\u5f71\u54cd\u5206\u6790\uff08\u5c06\u5982\u4f55\u6539\u53d8\u76f8\u5173\u884c\u4e1a\u683c\u5c40\uff09\r\n- \u6280\u672f\u8def\u7ebf\u5224\u65ad\uff08\u4ee3\u8868\u4e86\u4ec0\u4e48\u53d1\u5c55\u65b9\u5411\uff09\r\n\u3010\u6df1\u5ea6\u5316\u5904\u7406\u3011\r\n1. \u5256\u6790\u6838\u5fc3\u6280\u672f\u539f\u7406\uff0c\u4f46\u4f7f\u7528\u901a\u4fd7\u7c7b\u6bd4\u8ba9\u975e\u4e13\u4e1a\u4eba\u58eb\u7406\u89e3\r\n2. \u5173\u8054\u884c\u4e1a\u80cc\u666f\u548c\u5546\u4e1a\u6a21\u5f0f\uff0c\u89e3\u91ca\u4e3a\u4f55\u91cd\u8981\r\n3. \u9002\u5f53\u5f15\u5165\u76f8\u5173\u6280\u672f\u53d1\u5c55\u5386\u53f2\u548c\u7ade\u4e89\u683c\u5c40\r\n4. \u5bf9\u6280\u672f\u53d1\u5c55\u65b9\u5411\u505a\u51fa\u6709\u89c1\u5730\u7684\u63a8\u6d4b\r\n\u3010\u8868\u8fbe\u89c4\u8303\u3011\r\n1. \u4fdd\u6301\u5ba2\u89c2\u4e13\u4e1a\u7684\u5206\u6790\u8bed\u6c14\uff0c\u4f46\u907f\u514d\u5b66\u672f\u5316\u6666\u6da9\u8868\u8fbe\r\n2. \u4f7f\u7528\u7ed3\u6784\u5316\u6bb5\u843d\u548c\u5b50\u6807\u9898\u4fdd\u8bc1\u6e05\u6670\u5ea6\r\n3. \u590d\u6742\u6982\u5ff5\u7528\u56fe\u793a\u7c7b\u6bd4\u6216\u62c6\u89e3\u65b9\u5f0f\u89e3\u91ca\r\n4. \u9002\u5f53\u5f15\u7528\u6570\u636e\u6216\u8d8b\u52bf\u652f\u6301\u5206\u6790\r\n\u6700\u7ec8\u6210\u6587\u5e94\u5f53\u8ba9\u8bfb\u8005\u4e0d\u4ec5\u4e86\u89e3\"\u53d1\u751f\u4e86\u4ec0\u4e48\"\uff0c\u66f4\u7406\u89e3\"\u4e3a\u4ec0\u4e48\u91cd\u8981\"\u53ca\"\u672a\u6765\u8d70\u5411\"\uff0c\u4f53\u73b0\u4f60\u7684\u4e13\u4e1a\u6d1e\u5bdf\u3002\r\n\"\"\",\r\n\"beginner\": \"\"\"\r\n\u4f60\u662f\u4e00\u4f4d\u6781\u64c5\u957f\u6280\u672f\u79d1\u666e\u7684AI\u79d1\u6280\u535a\u4e3b\uff0c\u4f60\u7684\u8d85\u80fd\u529b\u662f\u628a\u6700\u524d\u6cbf\u7684AI\u6280\u672f\u89e3\u91ca\u5f97\u8ba9\u521d\u4e2d\u751f\u90fd\u80fd\u7406\u89e3\u3002\r\n\u8bf7\u5c06\u63d0\u4f9b\u7684AI\u6280\u672f\u65b0\u95fb\u6574\u7406\u6210\u4e00\u7bc7\u9762\u5411\u5b8c\u5168\u96f6\u57fa\u7840\u8bfb\u8005\u7684\u5fae\u4fe1\u516c\u4f17\u53f7\"AI\u65b0\u624b\u6751\u65e5\u62a5\"\uff0c\u9075\u5faa\u4ee5\u4e0b\u8981\u6c42\uff1a\r\n\u3010\u96f6\u95e8\u69db\u539f\u5219\u3011\r\n1. \u5047\u8bbe\u8bfb\u8005\u4ece\u672a\u63a5\u89e6\u8fc7AI\/ML\u76f8\u5173\u6982\u5ff5\uff0c\u9700\u8981\u4ece\u96f6\u5f00\u59cb\u89e3\u91ca\r\n2. \u6bcf\u4e2a\u6280\u672f\u672f\u8bed\u7b2c\u4e00\u6b21\u51fa\u73b0\u65f6\u5fc5\u987b\u7acb\u5373\u7528\u62ec\u53f7\u7ed9\u51fa\"\u5c0f\u767d\u89e3\u91ca\"\r\n3. \u4f7f\u7528\u65e5\u5e38\u751f\u6d3b\u4e2d\u7684\u5177\u4f53\u4f8b\u5b50\u548c\u7c7b\u6bd4\u89e3\u91ca\u6bcf\u4e2a\u6982\u5ff5\r\n4. \u628a\u590d\u6742\u7684\u6280\u672f\u8fdb\u5c55\u8f6c\u5316\u4e3a\"\u8fd9\u5bf9\u4f60\u7684\u751f\u6d3b\u610f\u5473\u7740\u4ec0\u4e48\"\r\n\u3010\u5185\u5bb9\u7ed3\u6784\u3011\r\n1. \u5f00\u573a\u767d\uff1a\u53cb\u597d\u95ee\u5019\u5e76\u7528\u4e00\u53e5\u8bdd\u6982\u62ec\"\u4eca\u5929AI\u754c\u53d1\u751f\u4e86\u4ec0\u4e48\u6709\u8da3\u7684\u4e8b\"\r\n2. \u65b0\u95fb\u4e3b\u4f53\uff1a\u6bcf\u6761\u65b0\u95fb\u4f7f\u7528\"\u4f60\u77e5\u9053\u5417\uff1f\"\u6216\"\u60f3\u8c61\u4e00\u4e0b\"\u7b49\u5f15\u5bfc\u5f0f\u5f00\u5934\r\n3. \u6bcf\u5219\u65b0\u95fb\u62c6\u89e3\u4e3a\uff1a\r\n- \u8fd9\u662f\u4ec0\u4e48\uff1f\uff08\u7528\u6700\u7b80\u5355\u7684\u7c7b\u6bd4\u89e3\u91ca\uff09\r\n- \u4e3a\u4ec0\u4e48\u5f88\u9177\uff1f\uff08\u7528\u65e5\u5e38\u573a\u666f\u5c55\u793a\u5e94\u7528\uff09\r\n- \u5c0f\u8d34\u58eb\uff1a\u63d0\u4f9b1-2\u4e2a\u5ef6\u4f38\u77e5\u8bc6\u70b9\uff0c\u4f46\u4fdd\u6301\u7b80\u5355\r\n\u3010\u8868\u8fbe\u7279\u8272\u3011\r\n1. \u4f7f\u7528\u8f7b\u677e\u6109\u5feb\u7684\u5bf9\u8bdd\u5f0f\u8bed\u6c14\uff0c\u4eff\u4f5b\u670b\u53cb\u95f4\u804a\u5929\r\n2. \u4e30\u5bcc\u4f7f\u7528emoji\u8868\u60c5\u548c\u751f\u52a8\u6bd4\u55bb\r\n3. \u9002\u5f53\u52a0\u5165\u5e7d\u9ed8\u5143\u7d20\uff0c\u8ba9\u6280\u672f\u5185\u5bb9\u53d8\u5f97\u6709\u8da3\r\n4. \u4f7f\u7528\"\u60f3\u8c61\u4e00\u4e0b...\"\u3001\"\u5c31\u597d\u6bd4...\"\u7b49\u5f15\u5bfc\u5f0f\u8868\u8fbe\r\n5. \u95ee\u7b54\u5f62\u5f0f\u5c55\u5f00\u89e3\u91ca\uff0c\u9884\u8bbe\u8bfb\u8005\u53ef\u80fd\u7684\u7591\u95ee\u5e76\u56de\u7b54\r\n\u3010\u89c6\u89c9\u8f85\u52a9\u3011\r\n1. \u5efa\u8bae\u5728\u6b63\u6587\u4e2d\u7a7f\u63d2\u4f7f\u7528\u7b80\u5355\u793a\u610f\u56fe\u7684\u4f4d\u7f6e\u6807\u8bb0\r\n2. \u5173\u952e\u6982\u5ff5\u7528\u7c97\u4f53\u6807\u8bb0\r\n3. \u4f7f\u7528\u9879\u76ee\u7b26\u53f7\u548c\u77ed\u6bb5\u843d\u63d0\u9ad8\u53ef\u8bfb\u6027\r\n\u8bb0\u4f4f\uff1a\u5982\u679c\u4e00\u4e2a10\u5c81\u5b69\u5b50\u90fd\u80fd\u542c\u61c2\u4f60\u7684\u89e3\u91ca\uff0c\u90a3\u4f60\u5c31\u6210\u529f\u4e86\uff01\r\n\"\"\"\r\n}\r\ndef _prepare_input_content(self, entries: List[FeedEntry]) -&gt; str:\r\n\"\"\"\r\n\u51c6\u5907\u8f93\u5165\u5185\u5bb9\r\n\u53c2\u6570:\r\nentries: \u6761\u76ee\u5217\u8868\r\n\u8fd4\u56de:\r\n\u683c\u5f0f\u5316\u7684\u8f93\u5165\u5185\u5bb9\r\n\"\"\"\r\ninput_content = \"\u4ee5\u4e0b\u662f\u6700\u8fd1\u7684AI\u6280\u672f\u65b0\u95fb\u52a8\u6001\uff0c\u8bf7\u5e2e\u6211\u6574\u7406\u6210\u9002\u5408\u5fae\u4fe1\u516c\u4f17\u53f7\u7684\u6bcf\u65e5AI News\u63a8\u9001\uff1a\\n\\n\"\r\nfor entry in entries:\r\ninput_content += f\"\u6807\u9898: {entry['title']}\\n\"\r\ninput_content += f\"\u65f6\u95f4: {entry['published']}\\n\"\r\ninput_content += f\"\u94fe\u63a5: {entry['link']}\\n\"\r\ninput_content += f\"\u6458\u8981: {entry['summary']}\\n\\n\"\r\nreturn input_content\r\n    @retry(max_attempts=3, delay=5, exceptions=(requests.RequestException,))\r\ndef _call_api(self, messages: List[Dict[str, str]], stream: bool = False) -&gt; Union[str, requests.Response]:\r\n\"\"\"\r\n\u8c03\u7528API\r\n\u53c2\u6570:\r\nmessages: \u6d88\u606f\u5217\u8868\r\nstream: \u662f\u5426\u6d41\u5f0f\u8f93\u51fa\r\n\u8fd4\u56de:\r\n\u751f\u6210\u7684\u5185\u5bb9\u6216\u6d41\u5f0f\u54cd\u5e94\u5bf9\u8c61\r\n\"\"\"\r\nbase_url = self.config.get(\"api\", \"base_url\")\r\nmodel = self.config.get(\"api\", \"model\")\r\napi_key = self.config.get(\"api\", \"api_key\")\r\ntimeout = self.config.get(\"api\", \"timeout\")\r\nmax_tokens = self.config.get(\"api\", \"max_tokens\")\r\ntemperature = self.config.get(\"api\", \"temperature\")\r\nif not api_key:\r\nraise ValueError(\"API\u5bc6\u94a5\u4e0d\u80fd\u4e3a\u7a7a\")\r\n# \u6784\u5efa\u8bf7\u6c42\u6570\u636e\r\npayload = {\r\n\"model\": model,\r\n\"messages\": messages,\r\n\"temperature\": temperature,\r\n\"max_tokens\": max_tokens,\r\n\"stream\": stream\r\n}\r\n# \u8bbe\u7f6e\u8bf7\u6c42\u5934\r\nheaders = {\r\n\"Content-Type\": \"application\/json\",\r\n\"Authorization\": f\"Bearer {api_key}\"\r\n}\r\n# API \u7aef\u70b9\r\nendpoint = f\"{base_url}\/chat\/completions\"\r\nlogger.info(f\"\u8c03\u7528 API: {endpoint}, \u6d41\u5f0f\u8f93\u51fa: {stream}\")\r\nif stream:\r\nresponse = requests.post(\r\nendpoint,\r\nheaders=headers,\r\njson=payload,\r\nstream=True,\r\ntimeout=timeout\r\n)\r\nelse:\r\nresponse = requests.post(\r\nendpoint,\r\nheaders=headers,\r\njson=payload,\r\ntimeout=timeout\r\n)\r\n# \u68c0\u67e5\u54cd\u5e94\u72b6\u6001\r\nif response.status_code != 200:\r\nerror_msg = f\"API \u8bf7\u6c42\u5931\u8d25: \u72b6\u6001\u7801 {response.status_code}, \u9519\u8bef\u4fe1\u606f: {response.text}\"\r\nlogger.error(error_msg)\r\nraise requests.RequestException(error_msg)\r\nif stream:\r\nreturn response\r\nelse:\r\nresult = response.json()\r\nif \"choices\" not in result or not result[\"choices\"]:\r\nraise ValueError(\"API\u54cd\u5e94\u683c\u5f0f\u9519\u8bef\uff0c\u627e\u4e0d\u5230\u5185\u5bb9\")\r\nreturn result[\"choices\"][0][\"message\"][\"content\"]\r\ndef format_with_openai(self, entries: List[FeedEntry], style: str = \"daily\",\r\nstream: bool = False) -&gt; Optional[str]:\r\n\"\"\"\r\n\u4f7f\u7528OpenAI API\u5bf9\u5185\u5bb9\u8fdb\u884c\u683c\u5f0f\u5316\u4e0e\u6da6\u8272\r\n\u53c2\u6570:\r\nentries: RSS\u6761\u76ee\u5217\u8868\r\nstyle: \u8f93\u51fa\u98ce\u683c\uff0c\u53ef\u9009 'daily'(\u65e5\u5e38\u7b80\u62a5), 'deep'(\u6df1\u5ea6\u89e3\u6790), 'beginner'(\u5c0f\u767d\u53cb\u597d)\r\nstream: \u662f\u5426\u4f7f\u7528\u6d41\u5f0f\u8f93\u51fa\r\n\u8fd4\u56de:\r\n\u683c\u5f0f\u5316\u540e\u7684\u5185\u5bb9\u6216None\uff08\u5982\u679c\u5931\u8d25\uff09\r\n\"\"\"\r\nif not entries:\r\nlogger.warning(\"\u6ca1\u6709\u627e\u5230\u6700\u8fd1\u7684\u6587\u7ae0\u53ef\u4ee5\u6da6\u8272\")\r\nreturn \"\u6ca1\u6709\u627e\u5230\u6700\u8fd1\u7684\u6587\u7ae0\u53ef\u4ee5\u6da6\u8272\"\r\ntry:\r\n# \u51c6\u5907\u8f93\u5165\u5185\u5bb9\r\ninput_content = self._prepare_input_content(entries)\r\n# \u9009\u62e9\u5bf9\u5e94\u98ce\u683c\u7684\u63d0\u793a\u8bcd\r\nsystem_prompt = self.prompt_templates.get(style, self.prompt_templates[\"daily\"])\r\n# \u6784\u5efa\u6d88\u606f\r\nmessages = [\r\n{\"role\": \"system\", \"content\": system_prompt},\r\n{\"role\": \"user\", \"content\": input_content}\r\n]\r\n# \u8c03\u7528API\r\nif stream:\r\n# \u6d41\u5f0f\u5904\u7406\r\nprint(\"\u6b63\u5728\u751f\u6210\u5185\u5bb9\uff0c\u8bf7\u7a0d\u5019...\")\r\nresponse = self._call_api(messages, stream=True)\r\n# \u5904\u7406\u6d41\u5f0f\u54cd\u5e94\r\nformatted_content = []\r\nclient = None\r\ntry:\r\n# \u5148\u5c1d\u8bd5\u5bfc\u5165sseclient\uff0c\u5931\u8d25\u5219\u4f7f\u7528\u81ea\u5b9a\u4e49\u89e3\u6790\r\nimport sseclient\r\nclient = sseclient.SSEClient(response)\r\nfor event in client.events():\r\nif event.data != \"[DONE]\":\r\ntry:\r\nchunk = json.loads(event.data)\r\ncontent = chunk.get(\"choices\", [{}])[0].get(\"delta\", {}).get(\"content\", \"\")\r\nif content:\r\nprint(content, end=\"\")\r\nformatted_content.append(content)\r\nexcept Exception as e:\r\nlogger.warning(f\"\u89e3\u6790\u4e8b\u4ef6\u5931\u8d25: {e}\")\r\nexcept ImportError:\r\n# \u624b\u52a8\u89e3\u6790SSE\r\nlogger.info(\"\u672a\u5b89\u88c5sseclient\uff0c\u4f7f\u7528\u81ea\u5b9a\u4e49SSE\u89e3\u6790\")\r\nfor line in response.iter_lines():\r\nif line:\r\nline = line.decode('utf-8')\r\nif line.startswith('data: '):\r\ndata = line[6:]\r\nif data == \"[DONE]\":\r\nbreak\r\ntry:\r\nchunk = json.loads(data)\r\ncontent = chunk.get(\"choices\", [{}])[0].get(\"delta\", {}).get(\"content\", \"\")\r\nif content:\r\nprint(content, end=\"\")\r\nformatted_content.append(content)\r\nexcept Exception as e:\r\nlogger.warning(f\"\u89e3\u6790\u4e8b\u4ef6\u5931\u8d25: {e}\")\r\nformatted_content = \"\".join(formatted_content)\r\nprint(\"\\n\\n\u751f\u6210\u5b8c\u6210\uff01\")\r\nelse:\r\n# \u975e\u6d41\u5f0f\u5904\u7406\r\nformatted_content = self._call_api(messages, stream=False)\r\n# \u6dfb\u52a0\u5143\u6570\u636e\r\nmetadata = {\r\n\"source\": self.config.get(\"rss\", \"url\"),\r\n\"processed_date\": datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\"),\r\n\"article_count\": len(entries),\r\n\"style\": style\r\n}\r\n# \u6dfb\u52a0\u5143\u6570\u636e\u5230\u5185\u5bb9\u9876\u90e8\u4f5c\u4e3aYAML\u524d\u7f6e\u5143\u6570\u636e\r\nyaml_metadata = \"---\\n\"\r\nfor key, value in metadata.items():\r\nyaml_metadata += f\"{key}: {value}\\n\"\r\nyaml_metadata += \"---\\n\\n\"\r\nreturn yaml_metadata + formatted_content\r\nexcept Exception as e:\r\nlogger.error(f\"\u5185\u5bb9\u751f\u6210\u5931\u8d25: {e}\")\r\nlogger.debug(traceback.format_exc())\r\nreturn None\r\ndef save_to_file(self, content: Optional[str], filename: Optional[str] = None) -&gt; Optional[str]:\r\n\"\"\"\r\n\u5c06\u5185\u5bb9\u4fdd\u5b58\u5230\u6587\u4ef6\r\n\u53c2\u6570:\r\ncontent: \u8981\u4fdd\u5b58\u7684\u5185\u5bb9\r\nfilename: \u6587\u4ef6\u540d\uff0c\u5982\u679c\u4e3aNone\u5219\u4f7f\u7528\u5f53\u524d\u65e5\u671f\u751f\u6210\r\n\u8fd4\u56de:\r\n\u4fdd\u5b58\u7684\u6587\u4ef6\u8def\u5f84\u6216None\uff08\u5982\u679c\u5931\u8d25\uff09\r\n\"\"\"\r\nif not content:\r\nlogger.warning(\"\u6ca1\u6709\u5185\u5bb9\u53ef\u4fdd\u5b58\")\r\nreturn None\r\n# \u786e\u4fdd\u8f93\u51fa\u76ee\u5f55\u5b58\u5728\r\noutput_dir = self.config.get(\"output\", \"directory\")\r\nos.makedirs(output_dir, exist_ok=True)\r\n# \u5982\u679c\u672a\u6307\u5b9a\u6587\u4ef6\u540d\uff0c\u4f7f\u7528\u5f53\u524d\u65e5\u671f\r\nif not filename:\r\ntoday = datetime.datetime.now().strftime(\"%Y-%m-%d\")\r\nfilename = f\"ai_news_{today}.md\"\r\n# \u786e\u4fdd\u6587\u4ef6\u8def\u5f84\r\nfile_path = os.path.join(output_dir, filename)\r\ntry:\r\nwith open(file_path, 'w', encoding='utf-8') as f:\r\nf.write(content)\r\nlogger.info(f\"\u5185\u5bb9\u5df2\u4fdd\u5b58\u5230 {file_path}\")\r\nreturn file_path\r\nexcept Exception as e:\r\nlogger.error(f\"\u4fdd\u5b58\u6587\u4ef6\u5931\u8d25: {e}\")\r\nreturn None\r\ndef parse_arguments() -&gt; argparse.Namespace:\r\n\"\"\"\u89e3\u6790\u547d\u4ee4\u884c\u53c2\u6570\"\"\"\r\nparser = argparse.ArgumentParser(description=\"AI News\u751f\u6210\u5668\")\r\nparser.add_argument(\"--config\", \"-c\", type=str, help=\"\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\")\r\nparser.add_argument(\"--rss\", \"-r\", type=str, help=\"RSS\u8ba2\u9605\u5730\u5740\")\r\nparser.add_argument(\"--days\", \"-d\", type=int, help=\"\u83b7\u53d6\u6700\u8fd1\u51e0\u5929\u7684\u5185\u5bb9\")\r\nparser.add_argument(\"--style\", \"-s\", type=str, choices=[\"daily\", \"deep\", \"beginner\"],\r\ndefault=\"daily\", help=\"\u751f\u6210\u5185\u5bb9\u7684\u98ce\u683c\")\r\nparser.add_argument(\"--stream\", action=\"store_true\", help=\"\u4f7f\u7528\u6d41\u5f0f\u8f93\u51fa\")\r\nparser.add_argument(\"--output\", \"-o\", type=str, help=\"\u8f93\u51fa\u6587\u4ef6\u8def\u5f84\")\r\nparser.add_argument(\"--verbose\", \"-v\", action=\"store_true\", help=\"\u663e\u793a\u8be6\u7ec6\u65e5\u5fd7\")\r\nreturn parser.parse_args()\r\ndef main() -&gt; None:\r\n\"\"\"\u4e3b\u51fd\u6570\"\"\"\r\n# \u89e3\u6790\u547d\u4ee4\u884c\u53c2\u6570\r\nargs = parse_arguments()\r\n# \u8bbe\u7f6e\u65e5\u5fd7\u7ea7\u522b\r\nif args.verbose:\r\nlogger.setLevel(logging.DEBUG)\r\n# \u52a0\u8f7d\u914d\u7f6e\r\nconfig = Config(args.config)\r\n# \u5982\u679c\u547d\u4ee4\u884c\u53c2\u6570\u63d0\u4f9b\u4e86\u503c\uff0c\u5219\u8986\u76d6\u914d\u7f6e\r\nif args.rss:\r\nconfig.config[\"rss\"][\"url\"] = args.rss\r\nif args.days:\r\nconfig.config[\"rss\"][\"days\"] = args.days\r\n# \u521d\u59cb\u5316RSS\u8bfb\u53d6\u5668\u548c\u5185\u5bb9\u751f\u6210\u5668\r\nrss_reader = RssReader(config)\r\ncontent_generator = ContentGenerator(config)\r\n# \u83b7\u53d6RSS\u5185\u5bb9\r\nrss_url = config.get(\"rss\", \"url\")\r\ndays = config.get(\"rss\", \"days\")\r\nlogger.info(f\"\u5f00\u59cb\u5904\u7406\uff0c\u83b7\u53d6 {rss_url} \u6700\u8fd1 {days} \u5929\u7684\u5185\u5bb9...\")\r\nprint(f\"\u6b63\u5728\u83b7\u53d6 {rss_url} \u6700\u8fd1 {days} \u5929\u7684\u5185\u5bb9...\")\r\ntry:\r\n# \u83b7\u53d6\u5e76\u89e3\u6790RSS\r\ncontent = rss_reader.fetch_rss_feed()\r\nfeed = rss_reader.parse_feed(content)\r\nif not feed:\r\nlogger.error(\"\u65e0\u6cd5\u89e3\u6790RSS\u5185\u5bb9\")\r\nprint(\"\u65e0\u6cd5\u89e3\u6790RSS\u5185\u5bb9\")\r\nreturn\r\n# \u83b7\u53d6\u6700\u8fd1\u7684\u6761\u76ee\r\nrecent_entries = rss_reader.get_recent_entries(feed, days)\r\nrss_reader.display_entries(recent_entries)\r\nif not recent_entries:\r\nlogger.warning(\"\u6ca1\u6709\u627e\u5230\u6700\u8fd1\u7684\u6587\u7ae0\")\r\nreturn\r\n# \u5982\u679c\u547d\u4ee4\u884c\u6ca1\u6709\u6307\u5b9a\u98ce\u683c\u548c\u6d41\u5f0f\u8f93\u51fa\uff0c\u5219\u4ea4\u4e92\u5f0f\u8be2\u95ee\r\nstyle = args.style\r\nstream = args.stream\r\nif not args.style and not sys.argv[1:]:  # \u5982\u679c\u6ca1\u6709\u63d0\u4f9b\u4efb\u4f55\u547d\u4ee4\u884c\u53c2\u6570\r\nprint(\"\\n\u9009\u62e9\u5185\u5bb9\u6da6\u8272\u98ce\u683c:\")\r\nprint(\"1. \u65e5\u5e38\u7b80\u62a5\u98ce\u683c (\u9ed8\u8ba4\uff0c\u9002\u5408\u4e00\u822c\u8bfb\u8005)\")\r\nprint(\"2. \u6df1\u5ea6\u5206\u6790\u98ce\u683c (\u5305\u542b\u66f4\u591a\u6280\u672f\u548c\u5e02\u573a\u5206\u6790)\")\r\nprint(\"3. \u5c0f\u767d\u53cb\u597d\u98ce\u683c (\u96f6\u57fa\u7840\u8bfb\u8005\u4e5f\u80fd\u8f7b\u677e\u7406\u89e3)\")\r\nstyle_choice = input(\"\u8bf7\u9009\u62e9 (1-3\uff0c\u9ed8\u8ba41): \").strip() or \"1\"\r\nstyle_options = {\r\n\"1\": \"daily\",\r\n\"2\": \"deep\",\r\n\"3\": \"beginner\"\r\n}\r\nstyle = style_options.get(style_choice, \"daily\")\r\nprint(\"\\n\u662f\u5426\u4f7f\u7528\u6d41\u5f0f\u8f93\u51fa? (\u5b9e\u65f6\u663e\u793a\u751f\u6210\u8fc7\u7a0b)\")\r\nprint(\"1. \u662f - \u5b9e\u65f6\u663e\u793a\u751f\u6210\u8fc7\u7a0b\")\r\nprint(\"2. \u5426 - \u7b49\u5f85\u5b8c\u6574\u751f\u6210\u540e\u663e\u793a\")\r\nstream_choice = input(\"\u8bf7\u9009\u62e9 (1-2\uff0c\u9ed8\u8ba42): \").strip() or \"2\"\r\nstream = stream_choice == \"1\"\r\n# \u4f7f\u7528OpenAI\u751f\u6210\u5185\u5bb9\r\nlogger.info(f\"\u4f7f\u7528OpenAI\u8fdb\u884c\u5185\u5bb9\u6da6\u8272 (\u98ce\u683c: {style}, \u6d41\u5f0f\u8f93\u51fa: {stream})\")\r\nprint(f\"\\n\u6b63\u5728\u4f7f\u7528OpenAI\u8fdb\u884c\u5185\u5bb9\u6da6\u8272 (\u98ce\u683c: {style})...\")\r\nformatted_content = content_generator.format_with_openai(\r\nrecent_entries, style=style, stream=stream\r\n)\r\nif formatted_content:\r\nif not stream:  # \u53ea\u6709\u975e\u6d41\u5f0f\u5904\u7406\u624d\u9700\u8981\u663e\u793a\u9884\u89c8\r\nprint(\"\\n\u6da6\u8272\u540e\u5185\u5bb9\u9884\u89c8 (\u524d500\u5b57):\")\r\nprint(\"-\" * 80)\r\nprint(formatted_content[:500] + \"...(\u66f4\u591a\u5185\u5bb9\u5df2\u4fdd\u5b58\u5230\u6587\u4ef6)\")\r\nprint(\"-\" * 80)\r\n# \u786e\u5b9a\u8f93\u51fa\u6587\u4ef6\u540d\r\noutput_file = args.output\r\nif not output_file:\r\ntoday = datetime.datetime.now().strftime(\"%Y-%m-%d\")\r\noutput_file = f\"ai_news_{style}_{today}.md\"\r\n# \u4fdd\u5b58\u5230\u6587\u4ef6\r\nsaved_file = content_generator.save_to_file(formatted_content, output_file)\r\nif saved_file:\r\nprint(f\"\u5b8c\u6574\u5185\u5bb9\u5df2\u4fdd\u5b58\u5230 {saved_file}\")\r\nelse:\r\nlogger.error(\"\u5185\u5bb9\u751f\u6210\u5931\u8d25\")\r\nprint(\"\u5185\u5bb9\u751f\u6210\u5931\u8d25\uff0c\u8bf7\u67e5\u770b\u65e5\u5fd7\u83b7\u53d6\u8be6\u7ec6\u4fe1\u606f\")\r\nexcept Exception as e:\r\nlogger.error(f\"\u5904\u7406\u8fc7\u7a0b\u4e2d\u51fa\u9519: {e}\")\r\nlogger.debug(traceback.format_exc())\r\nprint(f\"\u5904\u7406\u8fc7\u7a0b\u4e2d\u51fa\u9519: {e}\")\r\nprint(\"\u8bf7\u67e5\u770b\u65e5\u5fd7\u83b7\u53d6\u8be6\u7ec6\u4fe1\u606f\")\r\nif __name__ == \"__main__\":\r\ntry:\r\nimport sys\r\nmain()\r\nexcept KeyboardInterrupt:\r\nlogger.info(\"\u7528\u6237\u4e2d\u65ad\u6267\u884c\")\r\nprint(\"\\n\u7a0b\u5e8f\u5df2\u4e2d\u65ad\")\r\nexcept Exception as e:\r\nlogger.critical(f\"\u672a\u6355\u83b7\u7684\u5f02\u5e38: {e}\")\r\nlogger.debug(traceback.format_exc())\r\nprint(f\"\u7a0b\u5e8f\u9047\u5230\u9519\u8bef: {e}\")\r\nsys.exit(1)<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5bf9\u4e8e\u8bb8\u591a\u5185\u5bb9\u521b\u4f5c\u8005\u800c\u8a00\uff0c\u5c06\u539f\u59cb\u3001\u67af\u71e5\u7684 RSS \u65b0\u95fb\u6e90\u8f6c\u5316\u4e3a\u4e00\u7bc7\u7ed3\u6784\u6e05\u6670\u3001\u89c2\u70b9\u72ec\u5230\u4e14\u98ce\u683c\u4e00\u81f4\u7684\u4e13\u680f\u6587\u7ae0\uff0c\u662f\u4e00\u9879\u8017\u65f6\u8d39\u529b\u7684\u5de5\u4f5c\u3002\u4fe1\u606f\u6d2a\u6d41\u6bcf\u65e5\u6d8c\u6765\uff0c\u4f46\u771f\u6b63\u5c06\u5176\u6253\u78e8\u6210\u5438\u5f15\u8bfb\u8005\u7684\u5185\u5bb9\uff0c\u5f80\u5f80\u9700\u8981\u5728\u201c\u673a\u68b0\u642c\u8fd0\u201d\u4e0e\u201c\u521b\u610f\u67af\u7aed\u201d\u4e4b\u95f4\u6323\u624e\u3002 \u672c\u6587\u5c06\u63a2\u8ba8\u4e00\u79cd\u81ea&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[182],"tags":[],"class_list":["post-31907","post","type-post","status-publish","format-standard","hentry","category-shicao"],"_links":{"self":[{"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/posts\/31907","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/comments?post=31907"}],"version-history":[{"count":0,"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/posts\/31907\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/media?parent=31907"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/categories?post=31907"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/tags?post=31907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}