{"id":1152,"date":"2026-02-11T23:27:19","date_gmt":"2026-02-11T15:27:19","guid":{"rendered":"https:\/\/www.coffecat.cn\/?p=1152"},"modified":"2026-02-11T23:33:46","modified_gmt":"2026-02-11T15:33:46","slug":"%e4%bd%bf%e7%94%a8agent%e6%99%ba%e8%83%bd%e4%bd%93%e5%bf%ab%e9%80%9f%e5%ae%9e%e7%8e%b0b%e7%ab%99%e5%a4%a7%e4%bc%9a%e5%91%98%e6%b4%bb%e5%8a%a8%e6%b6%88%e6%81%af%e6%8e%a8%e9%80%81","status":"publish","type":"post","link":"https:\/\/www.coffecat.cn\/index.php\/2026\/02\/11\/%e4%bd%bf%e7%94%a8agent%e6%99%ba%e8%83%bd%e4%bd%93%e5%bf%ab%e9%80%9f%e5%ae%9e%e7%8e%b0b%e7%ab%99%e5%a4%a7%e4%bc%9a%e5%91%98%e6%b4%bb%e5%8a%a8%e6%b6%88%e6%81%af%e6%8e%a8%e9%80%81\/","title":{"rendered":"\u4f7f\u7528Agent\u667a\u80fd\u4f53\u5feb\u901f\u5b9e\u73b0B\u7ad9\u5927\u4f1a\u5458\u6d3b\u52a8\u6d88\u606f\u63a8\u9001"},"content":{"rendered":"\n<p class=\"has-vivid-red-color has-text-color has-link-color wp-elements-94518b22f8aa6de1ad64c63652bc4d6b\"><strong>\u9996\u5148\u8bf4\u660e\uff1a\u672c\u7bc7\u6587\u7ae0\u4ec5\u5b66\u4e60\u4f7f\u7528\u667a\u80fd\u4f53\u8fdb\u884c\u529f\u80fd\u5b9e\u73b0\uff0c\u4e0d\u6d89\u53ca\u5546\u4e1a\u7528\u9014\u4ee5\u53ca\u5546\u4e1a\u76ee\u7684\uff0c\u4e25\u7981\u5546\u4e1a\u7528\u9014\u4ee5\u53ca\u975e\u6cd5\u76ee\u7684\u4e0e\u975e\u6cd5\u6d3b\u52a8\uff0c\u8bf7\u9075\u5b88\u5f53\u5730\u6cd5\u5f8b\u6cd5\u89c4\u3002<\/strong><\/p>\n\n\n\n<p>\u8d77\u56e0\uff1a\u975e\u5e38\u51d1\u5de7\u7684\u662f\u521a\u597d\u81ea\u5df1\u662fb\u7ad9\u5341\u5e74\u5927\u4f1a\u5458\uff0c\u53c8\u975e\u5e38\u5de7\u7684\u662fb\u7ad9\u6709\u5927\u4f1a\u5458\u7684\u7ebf\u4e0b\u89c2\u5f71\u6d3b\u52a8\uff0c\u53c8\u975e\u5e38\u5de7\u7684\u662f\u5341\u5e74\u5927\u4f1a\u5458\u6216\u767e\u5e74\u5927\u4f1a\u5458\u6709\u767e\u5206\u4e4b\u5341\u7684\u540d\u989d\u83b7\u53d6\u8d44\u683c\uff0c\u7531\u4e8e\u5e73\u65f6\u4e5f\u53ea\u662f\u4f11\u606f\u65f6\u95f4\u6216\u8005\u665a\u4e0a\u624d\u4f1a\u6253\u5f00b\u7ad9\u770b\u770bup\u4e3b\u7684\u89c6\u9891\u548cb\u7ad9\u7684\u6d3b\u52a8\uff0c\u524d\u6bb5\u65f6\u95f4\u53d1\u73b0\u73b0\u5728\u7684\u5404\u5927\u5e73\u53f0\u90fd\u5728\u505aAgent\u667a\u80fd\u4f53\u7684\u5e94\u7528\uff0c\u4e8e\u662f\u5c31\u6709\u4e86\u8fd9\u4e2a\u60f3\u6cd5\uff0c\u6211\u662f\u4e0d\u662f\u53ef\u4ee5\u501f\u52a9AI\u5feb\u901f\u5b9e\u73b0\u6211\u9700\u8981\u624b\u52a8\u53bb\u505a\u7684\u8fd9\u4ef6\u4e8b\uff1f<\/p>\n\n\n\n<p>\u8bf4\u5e72\u5c31\u5e72\uff0c\u56e0\u4e3a\u4e4b\u524d\u505a\u8fc7\u5fae\u4fe1\u516c\u4f17\u53f7\u6d88\u606f\u63a8\u9001\u7684\u529f\u80fd\uff0c\u6240\u4ee5\u63a8\u9001\u7684\u903b\u8f91\u53ef\u4ee5\u53c2\u8003\u4e4b\u524d\u7684[<a href=\"https:\/\/www.coffecat.cn\/index.php\/2024\/08\/17\/\u4f7f\u7528python\u5b9e\u73b0\u5fae\u4fe1\u516c\u4f17\u53f7\u5b9a\u65f6\u63a8\u9001\u6d88\u606f\/\">\u4f7f\u7528python\u5b9e\u73b0\u5fae\u4fe1\u516c\u4f17\u53f7\u5b9a\u65f6\u63a8\u9001\u6d88\u606f<\/a>]\u8fd9\u7bc7\u6587\u7ae0\uff0c\u5269\u4e0b\u7684\u90e8\u5206\u54b1\u4eec\u4e00\u6b65\u4e00\u6b65\u6765\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u5206\u89e3\u4efb\u52a1\uff1a<\/p>\n\n\n\n<p><br>1.\u83b7\u53d6\u9875\u9762\u4fe1\u606f\uff1a\u83b7\u53d6b\u7ad9\u5927\u4f1a\u5458\u9875\u6b63\u5728\u8fdb\u884c\u7684\u6d3b\u52a8\u4fe1\u606f<\/p>\n\n\n\n<p>2.\u89e3\u6790\u9875\u9762\u5185\u5bb9\uff1a\u83b7\u53d6\u54cd\u5e94\u5185\u5bb9\u4e2d\u7684enroll_detail\u4e2d\u7684city \u5982\u679c\u5305\u542b\u6240\u5728\u57ce\u5e02\u5219\u5c06\u83b7\u53d6\u5230\u7684\u8bb0\u5f55\u5b58\u5165\u8868\u4e2d<\/p>\n\n\n\n<p>3.\u6839\u636e\u8868\u4e2d\u8bb0\u5f55\u7684\u6570\u636e\u8fdb\u884c\u5b9a\u65f6\u63a8\u9001\uff1a\u5982\u679c\u4ece\u8868\u4e2d\u626b\u63cf\u5230\u4e86\u6570\u636e\uff08\u6761\u4ef6\u4e3a\u8868\u4e2d\u7684\u662f\u5426\u8bfb\u53d6\u6807\u8bc6\u4e3a\u672a\u8bfb\uff09\uff0c\u5c06\u8bfb\u53d6\u5230\u7684\u6570\u636e\u63a8\u9001\u5230\u5fae\u4fe1\u4e2d<\/p>\n\n\n\n<p>4.\u8868\u8bbe\u8ba1\uff1a\u5927\u6982\u9700\u8981\u77e5\u9053\u662f\u4ec0\u4e48\u6d3b\u52a8\uff0c\u6d3b\u52a8\u5730\u5740\u662f\u4ec0\u4e48\uff0c\u6d3b\u52a8\u5730\u70b9\u6d3b\u52a8\u65f6\u95f4\u8fd9\u4e9b\u4fe1\u606f<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\u7b2c\u4e00\u6b65\uff1a\u521b\u5efa\u6570\u636e\u5e93\u4e0e\u6570\u636e\u5e93\u8868\uff1a<\/p>\n\n\n\n<p>\u8fd9\u4e9b\u4fe1\u606f\u662f\u5c55\u793a\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\u7684\u63a8\u9001\u6d88\u606f\u4e2d\u7684\uff0c\u56e0\u4e3a\u6211\u8fd9\u91cc\u4f7f\u7528\u7684\u662f\u6d4b\u8bd5\u53f7\uff0c\u6240\u4ee5\u4e0d\u80fd\u6253\u5f00\u94fe\u63a5\u6216\u8005\u70b9\u51fb\u67e5\u770b\u4fe1\u606f\uff0c\u6240\u4ee5\u5bf9\u4e8e\u6211\u6765\u8bf4\u6700\u91cd\u8981\u7684\u4fe1\u606f\u662f\u4ec0\u4e48\u6d3b\u52a8\uff0c\u6d3b\u52a8\u5730\u5740\u548c\u6d3b\u52a8\u65f6\u95f4\u662f\u4ec0\u4e48\u5c31\u53ef\u4ee5\u4e86\uff0c\u5230\u65f6\u5019\u53ea\u8981\u63a8\u9001\u7ed9\u6211\u6211\u53bbb\u7ad9\u5904\u7406\u4fe1\u606f\u5373\u53ef\uff08\u5f53\u7136\u4e5f\u4fdd\u7559\u4e86\u6d3b\u52a8\u5730\u5740\uff0c\u4e4b\u524d\u662f\u60f3\u76f4\u63a5\u70b9\u51fb\u6d3b\u52a8\u5730\u5740\u8df3\u8f6c\u5230b\u7ad9\uff0c\u4f46\u662f\u540e\u9762\u53d1\u73b0\u6d4b\u8bd5\u516c\u4f17\u53f7\u4e0d\u652f\u6301\u70b9\u51fb\u63a8\u9001\u5185\u5bb9\uff0c\u6d4b\u8bd5\u53f7\u4ec5\u4e3a\u505a\u6d4b\u8bd5\u4f7f\u7528\uff09\uff0c\u8fd9\u91cc\u6211\u89c9\u5f97\u6ca1\u6709\u95ee\u9898\uff0c\u5f53\u7136\u4f60\u53ef\u4ee5\u505a\u6210\u81ea\u52a8\u5316\u7684\u8df3\u8f6c\u540e\u81ea\u52a8\u586b\u5199\u8868\u5355\u62a5\u540d\uff0c\u4f46\u662f\u8fd9\u5c31\u5931\u53bb\u4e86\u516c\u5e73\u6027\uff0c\u4e0d\u786e\u4fdd\u8fd9\u4e48\u5e72\u7684\u540e\u679c\u5305\u62ec\u4e0d\u9650\u4e8e\u5c01\u53f7\uff0c\u5f15\u8d77\u540e\u53f0\u98ce\u63a7\u4e8e\u6a21\u5757\u5b89\u5168\u5347\u7ea7\u7b49\uff0c\u6240\u4ee5\u6211\u5efa\u8bae\u5404\u4f4d\u4e0d\u8981\u8fd9\u4e48\u5e72\uff0c\u505a\u4ec0\u4e48\u90fd\u8981\u6709\u4e2a\u5ea6\uff0c\u4e0d\u8981\u505a\u7684\u592a\u8fc7\u4e86\u3002\u7136\u540e\u5c31\u662f\u9700\u8981\u4e00\u4e2a\u6807\u8bc6\uff0c\u5728\u6d88\u606f\u63a8\u9001\u540e\u5c06\u6807\u8bc6\u6539\u6210\u5df2\u8bfb\uff0c\u8fd9\u6837\u5728\u4e0b\u4e00\u6b21\u626b\u63cf\u65f6\u5c31\u4e0d\u4f1a\u91cd\u590d\u63a8\u9001\u5df2\u7ecf\u63a8\u9001\u8fc7\u7684\u6d88\u606f\u3002<\/p>\n\n\n\n<p>\u4e0b\u9762\u662f\u5efa\u8868\u8bed\u53e5\uff1a<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"CREATE TABLE movie_records (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    title TEXT,               -- \u6d3b\u52a8\u6807\u9898\n    city TEXT,                -- \u6d3b\u52a8\u57ce\u5e02\n    start_time TEXT,          -- \u5f00\u59cb\u65f6\u95f4\n    end_time TEXT,            -- \u7ed3\u675f\u65f6\u95f4\n    address TEXT,             -- \u6d3b\u52a8\u5730\u5740\n    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  -- \u521b\u5efa\u65f6\u95f4\n    is_read INTEGER DEFAULT 0 -- \u662f\u5426\u5df2\u63a8\u9001\uff080\uff1a\u672a\u63a8\u9001\uff0c1\uff1a\u5df2\u63a8\u9001\uff09\n)\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">CREATE<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">TABLE<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">movie_records<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    id <\/span><span style=\"color: #81A1C1\">INTEGER<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">PRIMARY KEY<\/span><span style=\"color: #D8DEE9FF\"> AUTOINCREMENT,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    title <\/span><span style=\"color: #81A1C1\">TEXT<\/span><span style=\"color: #D8DEE9FF\">,               <\/span><span style=\"color: #616E88\">-- \u6d3b\u52a8\u6807\u9898<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    city <\/span><span style=\"color: #81A1C1\">TEXT<\/span><span style=\"color: #D8DEE9FF\">,                <\/span><span style=\"color: #616E88\">-- \u6d3b\u52a8\u57ce\u5e02<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    start_time <\/span><span style=\"color: #81A1C1\">TEXT<\/span><span style=\"color: #D8DEE9FF\">,          <\/span><span style=\"color: #616E88\">-- \u5f00\u59cb\u65f6\u95f4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    end_time <\/span><span style=\"color: #81A1C1\">TEXT<\/span><span style=\"color: #D8DEE9FF\">,            <\/span><span style=\"color: #616E88\">-- \u7ed3\u675f\u65f6\u95f4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">address<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">TEXT<\/span><span style=\"color: #D8DEE9FF\">,             <\/span><span style=\"color: #616E88\">-- \u6d3b\u52a8\u5730\u5740<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    create_time <\/span><span style=\"color: #81A1C1\">TIMESTAMP<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">DEFAULT<\/span><span style=\"color: #D8DEE9FF\"> CURRENT_TIMESTAMP,  <\/span><span style=\"color: #616E88\">-- \u521b\u5efa\u65f6\u95f4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    is_read <\/span><span style=\"color: #81A1C1\">INTEGER<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">DEFAULT<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">-- \u662f\u5426\u5df2\u63a8\u9001\uff080\uff1a\u672a\u63a8\u9001\uff0c1\uff1a\u5df2\u63a8\u9001\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u7b2c\u4e8c\u6b65\uff0c\u7f16\u5199\u63d0\u793a\u8bcd\uff1a<\/p>\n\n\n\n<p>\u9700\u8981\u544a\u8bc9AI\u8981\u505a\u4ec0\u4e48\uff0c\u4ece\u54ea\u4e2a\u5730\u5740\u83b7\u53d6\u4fe1\u606f\uff0c\u4ece\u5730\u5740\u4e2d\u83b7\u53d6\u4ec0\u4e48\u4fe1\u606f\uff0c\u83b7\u53d6\u54ea\u91cc\u7684\u4fe1\u606f\uff0c\u9700\u8981\u660e\u786e\u5177\u4f53\u7684\u544a\u8bc9AI\uff0c\u7136\u540e\u8981\u544a\u77e5AI\u83b7\u53d6\u4fe1\u606f\u540e\u9700\u8981\u600e\u4e48\u505a\uff0c\u8fd9\u91cc\u53ef\u4ee5\u53c2\u8003\u7b2c\u4e09\u6761\u3002\u8fd9\u91cc\u53ef\u4ee5\u4f7f\u7528\u63d0\u524d\u51c6\u5907\u597d\u9700\u8981\u7528\u5230\u7684\u6570\u636e\u5e93\u4e0e\u6570\u636e\u5e93\u8868\uff0c\u8fd9\u91cc\u6709\u6570\u636e\u5e93\u4e0e\u8868\u540e\u53ef\u4ee5\u660e\u786e\u544a\u8bc9AI\u5c06\u54ea\u4e9b\u6570\u636e\u5b58\u5165\u54ea\u4e2a\u6570\u636e\u5e93\u4e2d\u7684\u54ea\u4e2a\u8868\u4e2d\u7684\u54ea\u4e9b\u5b57\u6bb5\u4e2d\uff08\u8fd9\u91cc\u53ef\u4ee5\u4f7f\u7528\u8131\u654f\u540e\u7684\u63cf\u8ff0\uff0c\u6bd4\u5982\u53ef\u4ee5\u5bf9\u6570\u636e\u5e93\u7684ip\u7aef\u53e3\u7b49\u4fe1\u606f\u8fdb\u884c\u8131\u654f\uff0c\u5230\u540e\u9762\u624b\u52a8\u4fee\u6539\uff09\uff0c\u5927\u6982\u5c31\u662f\u4e0a\u97621\uff0c2\uff0c3\u8fd9\u51e0\u6b65\u3002<\/p>\n\n\n\n<p>\u7b2c\u4e09\u6b65\uff0c\u5c06\u7f16\u5199\u597d\u7684\u63d0\u793a\u8bcd\u5582\u7ed9AI\uff1a<\/p>\n\n\n\n<p>\u6211\u8fd9\u91cc\u4f7f\u7528\u7684\u662f\u8c46\u5305\u7684\u5e94\u7528\u751f\u6210\uff0c\u5176\u5b9e\u5176\u4ed6\u7684\u5e94\u8be5\u4e5f\u5dee\u4e0d\u591a\uff0c\u4e4b\u540e\u5c31\u9700\u8981\u7b49\u5f85AI\u5e2e\u6211\u4eec\u7f16\u5199\u4ee3\u7801\uff0c\u4e00\u6bb5\u65f6\u95f4\u540eAI\u4f1a\u751f\u6210\u7b2c\u4e00\u7248\u4ee3\u7801\uff0c\u5927\u81f4\u4e3b\u4f53\u65b9\u5411\u6ca1\u6709\u95ee\u9898\uff0c\u4e0d\u4ec5\u662f\u4ee3\u7801\u8fd8\u7f16\u5199\u4e86\u5355\u6d4b\u5bf9\u4ee3\u7801\u8fdb\u884c\u4e86\u53ef\u7528\u6027\u6d4b\u8bd5\u4ee5\u53caREADME\u7684\u7f16\u5199\uff0c\u8fd9\u4e2a\u4efb\u52a1\u4f1a\u81ea\u52a8\u5206\u6790\u4f7f\u7528\u6700\u4f18\u7684\u7f16\u7a0b\u8bed\u8a00\uff08\u8fd9\u91cc\u4f7f\u7528\u7684\u662fpython\uff09\uff0c\u751f\u6210\u7684\u5185\u5bb9\u6709\uff1a\u65e5\u5fd7\u6587\u4ef6\uff0cREADME\u6587\u4ef6\uff0c\u4e3b\u7a0b\u5e8f\uff0c\u914d\u7f6e\u6587\u4ef6\uff0c\u5355\u5143\u6d4b\u8bd5\uff0c\u6837\u4f8b\u6587\u4ef6\u4ee5\u53ca\u6267\u884c\u811a\u672c\u3002<\/p>\n\n\n\n<p>\u5f97\u5230\u751f\u6210\u7684\u4ee3\u7801\u540e\u662f\u4e0d\u80fd\u591f\u76f4\u63a5\u4f7f\u7528\u7684\uff0c\u56e0\u4e3a\u6211\u4eec\u8fd8\u9700\u8981\u96c6\u6210\u63a8\u9001\u529f\u80fd\uff0c\u56e0\u4e3a\u8fd9\u4e2a\u529f\u80fd\u662f\u73b0\u6210\u7684\uff0c\u6240\u4ee5\u6ca1\u6709\u5fc5\u8981\u8ba9AI\u518d\u6b21\u751f\u6210\u6216\u8005\u4f7f\u7528AI\u751f\u6210\u7684\u90a3\u4e00\u5957\u63a8\u9001\u4ee3\u7801\uff0c\u56e0\u4e3a\u73b0\u6210\u7684\u4ee3\u7801\u65e0\u9700\u8c03\u8bd5\u5373\u53ef\u76f4\u63a5\u4f7f\u7528\uff0c\u8282\u7ea6\u65f6\u95f4\u548c\u7cbe\u529b\u6210\u672c\uff0c\u5728\u6253\u5f00\u751f\u6210\u7684\u4ee3\u7801\u540e\u53ef\u4ee5\u5148\u5bf9\u751f\u6210\u90e8\u5206\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0c\u5373\u4f7f\u544a\u8bc9\u4e86AI\u4ece\u4ec0\u4e48\u5730\u65b9\u83b7\u53d6\u6570\u636e\uff0c\u6709\u4e9b\u65f6\u5019\u53ef\u80fd\u4f1a\u56e0\u4e3a\u6211\u4eec\u7684\u63cf\u8ff0\u95ee\u9898\u5bfc\u81f4\u8fd9\u4e2a\u6a21\u578b\u4ea7\u751f\u7684\u7ed3\u679c\u4f1a\u6709\u90e8\u5206\u504f\u5dee\uff0c\u4f46\u662f\u4e0d\u5f71\u54cd\u6574\u7406\u529f\u80fd\uff0c\u5bf9\u4ee3\u7801\u8fdb\u884c\u5fae\u8c03\u540e\u6211\u4eec\u5c31\u83b7\u53d6\u5230\u4e86\u4eceb\u7ad9\u5927\u4f1a\u5458\u6d3b\u52a8\u9875\u83b7\u53d6\u5230\u8fdb\u884c\u4e2d\u7684\u6570\u636e\uff0c\u7136\u540e\u53c8\u5bf9\u6570\u636e\u5e93\u4ee5\u53ca\u6570\u636e\u8868\u8fdb\u884c\u521d\u59cb\u5316\u540e\u7684\u6570\u636e\u5165\u5e93\u8fdb\u884c\u4e86\u6d4b\u8bd5\uff0c\u6700\u7ec8\u8fd9\u5957\u4ee3\u7801\u4ece\u6709\u60f3\u6cd5\u5230\u6700\u7ec8\u5b9e\u73b0\u5e76\u8fd0\u884c\u53ea\u82b1\u4e86\u4e0d\u5230\u4e24\u9cb2\u5929\uff0c\u5e76\u4e14\u5c31\u5728\u672c\u5730\u6d4b\u8bd5\u7a33\u5b9a\u6027\u7684\u7b2c\u4e00\u5929\u5c31\u901a\u8fc7\u63a8\u9001\u53ca\u65f6\u6536\u5230\u4e86\u6d3b\u52a8\u6d88\u606f\uff0c\u5e76\u6210\u529f\u53c2\u52a0\u4e86\u6d3b\u52a8\uff08\u56e0\u4e3a\u6536\u5230\u6d88\u606f\u5c31\u76f4\u63a5\u53bbb\u7ad9\u67e5\u770b\u4e86\uff0c\u6700\u7ec8\u662f\u524d\u51e0\u540d\u53c2\u52a0\u7684\u6d3b\u52a8\uff0c\u6240\u4ee5\u6839\u636e\u5341\u5e74\u5927\u4f1a\u5458\u7684\u89c4\u5219\u662f\u767e\u5206\u767e\u83b7\u53d6\u5230\u4e86\u53c2\u4e0e\u8d44\u683c\uff09\uff0c\u4e5f\u662f\u975e\u5e38\u5e78\u8fd0\u7684\u3002<\/p>\n\n\n\n<p>\u90a3\u4e48\u4e0b\u9762\u6765\u62c6\u89e3\u4ee3\u7801\u5206\u6bb5\u8fdb\u884c\u8bb2\u89e3\uff1a<\/p>\n\n\n\n<p>\u9996\u5148\u662f\u914d\u7f6e\u6587\u4ef6\u90e8\u5206\uff08config.py\uff09<\/p>\n\n\n\n<p>\u914d\u7f6e\u6587\u4ef6\u6709\uff1a\u516c\u4f17\u53f7\u914d\u7f6e\uff0cb\u7ad9\u6d3b\u52a8url\uff0c\u89c2\u5f71\u57ce\u5e02\uff0c\u6570\u636e\u5e93\u914d\u7f6e\uff0c\u5927\u4f1a\u5458url\u8bf7\u6c42\u5934\u4ee5\u53ca\u5fae\u4fe1\u516c\u4f17\u53f7\u8bf7\u6c42\u5934\uff0c\u5b9a\u65f6\u4efb\u52a1\u914d\u7f6e\u76f8\u5173\uff08\u63a8\u9001\u65f6\u95f4\u914d\u7f6e\uff0c\u83b7\u53d6\u6570\u636e\u65f6\u95f4\u914d\u7f6e\uff09\uff0c\u56e0\u4e3a\u4ee3\u7801\u4e2d\u90fd\u6709\u6ce8\u91ca\u6240\u4ee5\u4e0d\u9700\u8981\u592a\u591a\u7684\u89e3\u91ca\uff0c\u90fd\u662f\u6240\u89c1\u5373\u6240\u5f97\u7684\u5185\u5bb9\uff0c\u76f4\u63a5\u4fee\u6539\u5373\u53ef\u3002<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# \u516c\u4f17\u53f7\u914d\u7f6e\n# \u516c\u4f17\u53f7appId\nAPP_ID = &quot;\u586b\u5199\u516c\u4f17\u53f7appId&quot;\n# \u516c\u4f17\u53f7appSecret\nAPP_SECRET = &quot;\u586b\u5199\u516c\u4f17\u53f7appSecret&quot;\n# \u6a21\u677f\u6d88\u606fid\nTEMPLATE_ID = &quot;\u586b\u5199\u6a21\u677f\u6d88\u606fid&quot;\n# \u8fd9\u662fopenid\nUSER = &quot;\u586b\u5199openid&quot;\n\n# B\u7ad9API URL\nAPI_URL = &quot;https:\/\/api.bilibili.com\/x\/vip\/web\/vip_center\/offlinemeeting?csrf=b73e1ac90734545514b1b5398e4345502&amp;t={}&quot;\n# B\u7ad9\u89c2\u5f71\u57ce\u5e02\nVIEW_CITY = '\u586b\u5199\u60a8\u6240\u5728\u7684\u57ce\u5e02'\n\n# \u7f51\u7edc\u6570\u636e\u5e93\u914d\u7f6e\uff08\u9700\u6839\u636e\u5b9e\u9645\u73af\u5883\u4fee\u6539\uff09\nDB_CONFIG = {\n    &quot;host&quot;: &quot;192.168.1.1&quot;,  # \u4f8b\u5982\uff1alocalhost\uff08\u672c\u5730\u7f51\u7edc\uff09\u3001192.168.1.1\uff08\u5c40\u57df\u7f51\uff09\u3001xxx.cloud.com\uff08\u516c\u7f51\uff09\n    &quot;port&quot;: 3306,  # MySQL \u9ed8\u8ba4\u7aef\u53e3\n    &quot;user&quot;: &quot;root&quot;,  # \u4f8b\u5982\uff1aroot\n    &quot;password&quot;: &quot;123456&quot;,  # \u4f60\u7684\u6570\u636e\u5e93\u5bc6\u7801\n    &quot;database&quot;: &quot;bilibili_movies_db&quot;,  # \u9700\u63d0\u524d\u521b\u5efa\u597d\u8be5\u6570\u636e\u5e93\uff08\u4f8b\u5982\uff1amovie_db\uff09\n    &quot;charset&quot;: &quot;utf8mb4&quot;,  # \u652f\u6301emoji\u7b49\u7279\u6b8a\u5b57\u7b26\n    &quot;cursorclass&quot;: pymysql.cursors.DictCursor  # \u53ef\u9009\uff1a\u8fd4\u56de\u5b57\u5178\u683c\u5f0f\u7ed3\u679c\n}\n\n\n# b\u7ad9\u5927\u4f1a\u5458\u89c2\u5f71\u8bf7\u6c42\u5934\u914d\u7f6e\nBL_HEADERS = {\n    &quot;User-Agent&quot;: &quot;Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/91.0.4472.124 Safari\/537.36&quot;,\n    &quot;Referer&quot;: &quot;https:\/\/www.bilibili.com\/&quot;,\n    # \u5982\u679c\u4f60\u9700\u8981\u767b\u5f55\u540e\u7684\u6570\u636e\uff0c\u53ef\u4ee5\u6dfb\u52a0Cookie\n    # &quot;Cookie&quot;: &quot;your_bilibili_cookie&quot;\n}\n\n# \u5fae\u4fe1\u516c\u4f17\u53f7\u8bf7\u6c42\u5934\u914d\u7f6e\nWX_HEADERS = {\n    'Content-Type': 'application\/json',\n    'User-Agent': 'Mozilla\/5.0 (Windows NT 10.0; Win64; x64) '\n                  'AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/103.0.0.0 Safari\/537.36'\n}\n\n# \u5b9a\u65f6\u4efb\u52a1\u914d\u7f6e\n# \u83b7\u53d6\u6570\u636e\u7684\u65f6\u95f4\u95f4\u9694\uff08\u5206\u949f\uff09\nFETCH_INTERVAL_MINUTES = 60\n\n# \u68c0\u67e5\u5e76\u63a8\u9001\u7684\u65f6\u95f4\u95f4\u9694\uff08\u5206\u949f\uff09\nPUSH_INTERVAL_MINUTES = 5\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\"># \u516c\u4f17\u53f7\u914d\u7f6e<\/span><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u516c\u4f17\u53f7appId<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">APP_ID <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u586b\u5199\u516c\u4f17\u53f7appId<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u516c\u4f17\u53f7appSecret<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">APP_SECRET <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u586b\u5199\u516c\u4f17\u53f7appSecret<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u6a21\u677f\u6d88\u606fid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">TEMPLATE_ID <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u586b\u5199\u6a21\u677f\u6d88\u606fid<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u8fd9\u662fopenid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">USER <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u586b\u5199openid<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># B\u7ad9API URL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">API_URL <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">https:\/\/api.bilibili.com\/x\/vip\/web\/vip_center\/offlinemeeting?csrf=b73e1ac90734545514b1b5398e4345502&amp;t=<\/span><span style=\"color: #EBCB8B\">{}<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># B\u7ad9\u89c2\u5f71\u57ce\u5e02<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">VIEW_CITY <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">\u586b\u5199\u60a8\u6240\u5728\u7684\u57ce\u5e02<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u7f51\u7edc\u6570\u636e\u5e93\u914d\u7f6e\uff08\u9700\u6839\u636e\u5b9e\u9645\u73af\u5883\u4fee\u6539\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">DB_CONFIG <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">host<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">192.168.1.1<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># \u4f8b\u5982\uff1alocalhost\uff08\u672c\u5730\u7f51\u7edc\uff09\u3001192.168.1.1\uff08\u5c40\u57df\u7f51\uff09\u3001xxx.cloud.com\uff08\u516c\u7f51\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">port<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">3306<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># MySQL \u9ed8\u8ba4\u7aef\u53e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">user<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">root<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># \u4f8b\u5982\uff1aroot<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">password<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">123456<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># \u4f60\u7684\u6570\u636e\u5e93\u5bc6\u7801<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">database<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">bilibili_movies_db<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># \u9700\u63d0\u524d\u521b\u5efa\u597d\u8be5\u6570\u636e\u5e93\uff08\u4f8b\u5982\uff1amovie_db\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">charset<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">utf8mb4<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># \u652f\u6301emoji\u7b49\u7279\u6b8a\u5b57\u7b26<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">cursorclass<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> pymysql<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">cursors<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">DictCursor  <\/span><span style=\"color: #616E88\"># \u53ef\u9009\uff1a\u8fd4\u56de\u5b57\u5178\u683c\u5f0f\u7ed3\u679c<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># b\u7ad9\u5927\u4f1a\u5458\u89c2\u5f71\u8bf7\u6c42\u5934\u914d\u7f6e<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">BL_HEADERS <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">User-Agent<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/91.0.4472.124 Safari\/537.36<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Referer<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">https:\/\/www.bilibili.com\/<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u5982\u679c\u4f60\u9700\u8981\u767b\u5f55\u540e\u7684\u6570\u636e\uff0c\u53ef\u4ee5\u6dfb\u52a0Cookie<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># &quot;Cookie&quot;: &quot;your_bilibili_cookie&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u5fae\u4fe1\u516c\u4f17\u53f7\u8bf7\u6c42\u5934\u914d\u7f6e<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">WX_HEADERS <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">Content-Type<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">application\/json<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">User-Agent<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">Mozilla\/5.0 (Windows NT 10.0; Win64; x64) <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/103.0.0.0 Safari\/537.36<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u5b9a\u65f6\u4efb\u52a1\u914d\u7f6e<\/span><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u83b7\u53d6\u6570\u636e\u7684\u65f6\u95f4\u95f4\u9694\uff08\u5206\u949f\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">FETCH_INTERVAL_MINUTES <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">60<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u68c0\u67e5\u5e76\u63a8\u9001\u7684\u65f6\u95f4\u95f4\u9694\uff08\u5206\u949f\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">PUSH_INTERVAL_MINUTES <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">5<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u7136\u540e\u5c31\u662f\u4e3b\u7a0b\u5e8f\uff08main.py\uff09<\/p>\n\n\n\n<p>\u8fd9\u90e8\u5206\u5728\u672c\u5730\u8fd0\u884c\u540e\u6ca1\u6709\u95ee\u9898\uff0c\u4f46\u662f\u5728\u670d\u52a1\u5668\u4e0a\u8fd0\u884c\u65f6\u51fa\u73b0\u4e86\u5b57\u7b26\u96c6\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\uff0c\u5728\u544a\u8bc9AI\u95ee\u9898\u540e\u8fdb\u884c\u4e86\u4f18\u5316<\/p>\n\n\n\n<p>\u6240\u4ee5\u5728\u5f00\u5934\u5148\u8ba9\u4ee3\u7801\u5f3a\u5236\u4f7f\u7528utf-8\uff1a<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')\nsys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">sys<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">stdout <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> io<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">TextIOWrapper<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">sys<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">stdout<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">buffer<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">encoding<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">utf-8<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">sys<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">stderr <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> io<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">TextIOWrapper<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">sys<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">stderr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">buffer<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">encoding<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">utf-8<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u5bf9\u65e5\u5fd7\u4e5f\u5f3a\u5236\u4f7f\u7528utf-8\uff1a<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# \u5f3a\u5236\u4f7f\u7528UTF-8\u7f16\u7801\ndef setup_logging():\n    &quot;&quot;&quot;\u914d\u7f6e\u65e5\u5fd7\uff0c\u89e3\u51b3\u4e2d\u6587\u7f16\u7801\u95ee\u9898&quot;&quot;&quot;\n    # \u521b\u5efa\u65e5\u5fd7\u683c\u5f0f\n    formatter = logging.Formatter(\n        '%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n        datefmt='%Y-%m-%d %H:%M:%S'\n    )\n\n    # \u6587\u4ef6\u5904\u7406\u5668\uff08\u5f3a\u5236UTF-8\u7f16\u7801\uff09\n    file_handler = logging.FileHandler(&quot;bilibili_notifier.log&quot;, encoding='utf-8')\n    file_handler.setFormatter(formatter)\n    file_handler.setLevel(logging.INFO)\n\n    # \u63a7\u5236\u53f0\u5904\u7406\u5668\uff08\u89e3\u51b3\u4e2d\u6587\u8f93\u51fa\u95ee\u9898\uff09\n    console_handler = logging.StreamHandler()\n    console_handler.setFormatter(formatter)\n    console_handler.setLevel(logging.INFO)\n\n    # \u914d\u7f6e\u6839\u65e5\u5fd7\u5668\n    logger = logging.getLogger(&quot;bilibili_movie_notifier&quot;)\n    logger.setLevel(logging.INFO)\n    logger.addHandler(file_handler)\n    logger.addHandler(console_handler)\n\n    return logger\n\n\n# \u521d\u59cb\u5316\u65e5\u5fd7\nlogger = setup_logging()\n\n\n# \u517c\u5bb9\u4ee3\u7801\u4e2d\u7684logger\u5f15\u7528\nlogger = logging.getLogger(&quot;bilibili_movie_notifier&quot;)\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\"># \u5f3a\u5236\u4f7f\u7528UTF-8\u7f16\u7801<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">setup_logging<\/span><span style=\"color: #ECEFF4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><span style=\"color: #A3BE8C\">\u914d\u7f6e\u65e5\u5fd7\uff0c\u89e3\u51b3\u4e2d\u6587\u7f16\u7801\u95ee\u9898<\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u521b\u5efa\u65e5\u5fd7\u683c\u5f0f<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    formatter <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> logging<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Formatter<\/span><span style=\"color: #ECEFF4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #EBCB8B\">%(asctime)s<\/span><span style=\"color: #A3BE8C\"> - <\/span><span style=\"color: #EBCB8B\">%(name)s<\/span><span style=\"color: #A3BE8C\"> - <\/span><span style=\"color: #EBCB8B\">%(levelname)s<\/span><span style=\"color: #A3BE8C\"> - <\/span><span style=\"color: #EBCB8B\">%(message)s<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">datefmt<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">%Y-%m-<\/span><span style=\"color: #EBCB8B\">%d<\/span><span style=\"color: #A3BE8C\"> %H:%M:%S<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u6587\u4ef6\u5904\u7406\u5668\uff08\u5f3a\u5236UTF-8\u7f16\u7801\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    file_handler <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> logging<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">FileHandler<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">bilibili_notifier.log<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">encoding<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">utf-8<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    file_handler<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">setFormatter<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">formatter<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    file_handler<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">setLevel<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">logging<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">INFO<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u63a7\u5236\u53f0\u5904\u7406\u5668\uff08\u89e3\u51b3\u4e2d\u6587\u8f93\u51fa\u95ee\u9898\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    console_handler <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> logging<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">StreamHandler<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    console_handler<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">setFormatter<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">formatter<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    console_handler<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">setLevel<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">logging<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">INFO<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u914d\u7f6e\u6839\u65e5\u5fd7\u5668<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    logger <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> logging<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">getLogger<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">bilibili_movie_notifier<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">setLevel<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">logging<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">INFO<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">addHandler<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">file_handler<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">addHandler<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">console_handler<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> logger<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u521d\u59cb\u5316\u65e5\u5fd7<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">logger <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">setup_logging<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u517c\u5bb9\u4ee3\u7801\u4e2d\u7684logger\u5f15\u7528<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">logger <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> logging<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">getLogger<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">bilibili_movie_notifier<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u5c06\u914d\u7f6e\u6587\u4ef6\u5185\u5bb9\u5f15\u5165\uff1a<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# \u4ece\u914d\u7f6e\u6587\u4ef6\u5bfc\u5165\u914d\u7f6e\u9879\nfrom config import (\n    API_URL,\n    BL_HEADERS,\n    WX_HEADERS,\n    APP_ID,\n    APP_SECRET,\n    TEMPLATE_ID,\n    USER,\n    VIEW_CITY,\n    DB_CONFIG,\n    FETCH_INTERVAL_MINUTES,\n    PUSH_INTERVAL_MINUTES\n)\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\"># \u4ece\u914d\u7f6e\u6587\u4ef6\u5bfc\u5165\u914d\u7f6e\u9879<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">from<\/span><span style=\"color: #D8DEE9FF\"> config <\/span><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    API_URL<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    BL_HEADERS<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    WX_HEADERS<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    APP_ID<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    APP_SECRET<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    TEMPLATE_ID<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    USER<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    VIEW_CITY<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    DB_CONFIG<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    FETCH_INTERVAL_MINUTES<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    PUSH_INTERVAL_MINUTES<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u8fd9\u91cc\u76f4\u63a5\u521d\u59cb\u5316\u6570\u636e\u5e93\u4e2d\u7684\u8868\u7ed3\u6784\uff0c\u4e5f\u5c31\u662f\u8bf4\u53ea\u9700\u8981\u63d0\u4f9b\u4e00\u4e2a\u80fd\u591f\u63a5\u6536\u6570\u636e\u7684\u6570\u636e\u5e93\u5373\u53ef\uff0c\u5728\u8fd0\u884c\u4e3b\u7a0b\u5e8f\u65f6\u4f1a\u5148\u5e2e\u4f60\u521b\u5efa\u6570\u636e\u5e93\u8868\uff08\u5982\u679c\u5df2\u7ecf\u5b58\u5728\u5219\u4e0d\u4f1a\u91cd\u590d\u521b\u5efa\u6216\u8005\u88ab\u8986\u76d6\uff09\uff0c\u80fd\u770b\u51fa\u5bf9\u4e8e\u7a0b\u5e8f\u53ef\u80fd\u5b58\u5728\u7684\u5f02\u5e38\u95ee\u9898AI\u4e5f\u5e2e\u6211\u4eec\u8fdb\u884c\u4e86\u515c\u5e95\u3002<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\ndef init_database():\n    &quot;&quot;&quot;\u521d\u59cb\u5316MySQL\u7f51\u7edc\u6570\u636e\u5e93\u548c\u8868\u7ed3\u6784&quot;&quot;&quot;\n    conn = None\n    try:\n        # \u8fde\u63a5\u7f51\u7edcMySQL\u6570\u636e\u5e93\n        conn = pymysql.connect(**DB_CONFIG)\n        cursor = conn.cursor()\n\n        # \u521b\u5efa\u8868\uff08\u9002\u914dMySQL\u8bed\u6cd5\uff1aAUTO_INCREMENT \u65e0\u9700\u52a0\u62ec\u53f7\uff0cTIMESTAMP\u9ed8\u8ba4\u503c\u8c03\u6574\uff09\n        cursor.execute('''\n                       CREATE TABLE IF NOT EXISTS movie_records\n                       (\n                           id\n                           INT\n                           PRIMARY\n                           KEY\n                           AUTO_INCREMENT,\n                           title\n                           VARCHAR\n                       (\n                           255\n                       ) NOT NULL, # MySQL\u63a8\u8350\u7528VARCHAR\u6307\u5b9a\u957f\u5ea6\n                           city VARCHAR\n                       (\n                           100\n                       ) NOT NULL,\n                           start_time VARCHAR\n                       (\n                           50\n                       ) NOT NULL,\n                           end_time VARCHAR\n                       (\n                           50\n                       ) NOT NULL,\n                           address VARCHAR\n                       (\n                           255\n                       ) NOT NULL,\n                           create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n                           is_read TINYINT DEFAULT 0 # MySQL\u7528TINYINT\u66ff\u4ee3SQLite\u7684INTEGER\uff08\u66f4\u7701\u7a7a\u95f4\uff09\n                       ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n                       ''')\n\n        conn.commit()\n        logger.info(&quot;\u7f51\u7edc\u6570\u636e\u5e93\u521d\u59cb\u5316\u6210\u529f\uff08\u8868\u7ed3\u6784\u5df2\u521b\u5efa\/\u9a8c\u8bc1\uff09&quot;)\n\n    except pymysql.MySQLError as e:\n        # \u66ff\u6362f-string\u4e3aformat\u65b9\u5f0f\uff0c\u517c\u5bb9\u66f4\u4f4e\u7248\u672cPython3\n        logger.error(&quot;\u7f51\u7edc\u6570\u636e\u5e93\u521d\u59cb\u5316\u5931\u8d25: \u9519\u8bef\u7801%s, \u9519\u8bef\u4fe1\u606f%s&quot;, e.args[0], e.args[1])\n        if conn:\n            conn.rollback()  # \u51fa\u9519\u65f6\u56de\u6eda\n    except Exception as e:\n        logger.error(&quot;\u672a\u77e5\u9519\u8bef: %s&quot;, str(e))\n    finally:\n        # \u786e\u4fdd\u8fde\u63a5\u5173\u95ed\n        if conn:\n            conn.close()\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">init_database<\/span><span style=\"color: #ECEFF4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><span style=\"color: #A3BE8C\">\u521d\u59cb\u5316MySQL\u7f51\u7edc\u6570\u636e\u5e93\u548c\u8868\u7ed3\u6784<\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    conn <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">None<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">try<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #616E88\"># \u8fde\u63a5\u7f51\u7edcMySQL\u6570\u636e\u5e93<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        conn <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> pymysql<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">connect<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">**<\/span><span style=\"color: #D8DEE9FF\">DB_CONFIG<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        cursor <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> conn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">cursor<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #616E88\"># \u521b\u5efa\u8868\uff08\u9002\u914dMySQL\u8bed\u6cd5\uff1aAUTO_INCREMENT \u65e0\u9700\u52a0\u62ec\u53f7\uff0cTIMESTAMP\u9ed8\u8ba4\u503c\u8c03\u6574\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        cursor<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">execute<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;&#39;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       CREATE TABLE IF NOT EXISTS movie_records<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           INT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           PRIMARY<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           KEY<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           AUTO_INCREMENT,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           title<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           VARCHAR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           255<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       ) NOT NULL, # MySQL\u63a8\u8350\u7528VARCHAR\u6307\u5b9a\u957f\u5ea6<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           city VARCHAR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           100<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       ) NOT NULL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           start_time VARCHAR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           50<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       ) NOT NULL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           end_time VARCHAR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           50<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       ) NOT NULL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           address VARCHAR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           255<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       ) NOT NULL,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                           is_read TINYINT DEFAULT 0 # MySQL\u7528TINYINT\u66ff\u4ee3SQLite\u7684INTEGER\uff08\u66f4\u7701\u7a7a\u95f4\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                       <\/span><span style=\"color: #ECEFF4\">&#39;&#39;&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        conn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">commit<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u7f51\u7edc\u6570\u636e\u5e93\u521d\u59cb\u5316\u6210\u529f\uff08\u8868\u7ed3\u6784\u5df2\u521b\u5efa\/\u9a8c\u8bc1\uff09<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">except<\/span><span style=\"color: #D8DEE9FF\"> pymysql<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">MySQLError <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #616E88\"># \u66ff\u6362f-string\u4e3aformat\u65b9\u5f0f\uff0c\u517c\u5bb9\u66f4\u4f4e\u7248\u672cPython3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">error<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u7f51\u7edc\u6570\u636e\u5e93\u521d\u59cb\u5316\u5931\u8d25: \u9519\u8bef\u7801<\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\">, \u9519\u8bef\u4fe1\u606f<\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">args<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #ECEFF4\">],<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">args<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> conn<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            conn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">rollback<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># \u51fa\u9519\u65f6\u56de\u6eda<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">except<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Exception<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">error<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u672a\u77e5\u9519\u8bef: <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">str<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">e<\/span><span style=\"color: #ECEFF4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">finally<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #616E88\"># \u786e\u4fdd\u8fde\u63a5\u5173\u95ed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> conn<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            conn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">close<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u83b7\u53d6b\u7ad9\u5927\u4f1a\u5458\u6d3b\u52a8\u6570\u636e\uff0c\u8fd9\u91cc\u4f1a\u5728url\u540e\u62fc\u63a5\u4e00\u4e2a\u65f6\u95f4\u6233\u6765\u786e\u4fdd\u94fe\u63a5\u7684\u53ef\u7528\u6027\uff08\u5176\u5b9e\u4e0d\u52a0\u4e5f\u4e0d\u5f71\u54cd\uff09\uff0c\u5f53\u83b7\u53d6\u5230\u6570\u636e\u540e\u4f1a\u8fd4\u56de\u54cd\u5e94\u6570\u636e\u3002<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"def fetch_bilibili_data():\n    &quot;&quot;&quot;\n    \u4eceB\u7ad9API\u83b7\u53d6\u5927\u4f1a\u5458\u7535\u5f71\u4fe1\u606f\n    \u8fd4\u56de: \u54cd\u5e94\u7684JSON\u6570\u636e\n    &quot;&quot;&quot;\n    try:\n        # \u4f7f\u7528\u5f53\u524d\u65f6\u95f4\u6233\n        timestamp = int(time.time() * 1000)\n        url = API_URL.format(timestamp)\n\n        response = requests.get(url, headers=BL_HEADERS, timeout=10)\n        response.raise_for_status()  # \u68c0\u67e5\u8bf7\u6c42\u662f\u5426\u6210\u529f\n\n        logger.info(&quot;\u6210\u529f\u83b7\u53d6B\u7ad9\u6570\u636e&quot;)\n        return response.json()\n    except requests.exceptions.RequestException as e:\n        # \u66ff\u6362f-string\u4e3aformat\u65b9\u5f0f\n        logger.error(&quot;\u83b7\u53d6\u6570\u636e\u5931\u8d25: %s&quot;, e)\n        return None\n    except Exception as e:\n        logger.error(&quot;\u5904\u7406\u54cd\u5e94\u6570\u636e\u65f6\u51fa\u9519: %s&quot;, e)\n        return None\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">fetch_bilibili_data<\/span><span style=\"color: #ECEFF4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">    \u4eceB\u7ad9API\u83b7\u53d6\u5927\u4f1a\u5458\u7535\u5f71\u4fe1\u606f<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">    \u8fd4\u56de: \u54cd\u5e94\u7684JSON\u6570\u636e<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">    <\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">try<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #616E88\"># \u4f7f\u7528\u5f53\u524d\u65f6\u95f4\u6233<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        timestamp <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">time<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">time<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1000<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        url <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> API_URL<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">format<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">timestamp<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        response <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> requests<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">url<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">headers<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\">BL_HEADERS<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">timeout<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #B48EAD\">10<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        response<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">raise_for_status<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># \u68c0\u67e5\u8bf7\u6c42\u662f\u5426\u6210\u529f<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u6210\u529f\u83b7\u53d6B\u7ad9\u6570\u636e<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> response<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">json<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">except<\/span><span style=\"color: #D8DEE9FF\"> requests<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">exceptions<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">RequestException <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #616E88\"># \u66ff\u6362f-string\u4e3aformat\u65b9\u5f0f<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">error<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u83b7\u53d6\u6570\u636e\u5931\u8d25: <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">None<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">except<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Exception<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">error<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u5904\u7406\u54cd\u5e94\u6570\u636e\u65f6\u51fa\u9519: <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">None<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u5c06\u83b7\u53d6\u7684\u6570\u636e\u8fdb\u884c\u89e3\u6790\u5e76\u83b7\u53d6\u6211\u4eec\u9700\u8981\u7684\u6570\u636e\uff0c\u7531\u4e8e\u540e\u4e0e\u6570\u636e\u843d\u5e93\u662f\u540c\u6b65\u7684\uff0c\u6240\u4ee5\u5728\u83b7\u53d6\u6570\u636e\u65f6\u83b7\u53d6\u4e86\u6570\u636e\u5e93\u8fde\u63a5\u5907\u7528\u3002<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\ndef parse_and_store_data(data):\n    &quot;&quot;&quot;\n    \u89e3\u6790\u6570\u636e\u5e76\u5b58\u50a8\u7b26\u5408\u6761\u4ef6\u7684\u8bb0\u5f55\n    \u53c2\u6570: data - \u4eceAPI\u83b7\u53d6\u7684JSON\u6570\u636e\n    &quot;&quot;&quot;\n    if not data or 'data' not in data:\n        logger.warning(&quot;\u65e0\u6548\u7684\u6570\u636e\u683c\u5f0f&quot;)\n        return\n\n    try:\n        conn = pymysql.connect(**DB_CONFIG)\n        cursor = conn.cursor()\n\n        new_records_count = 0\n\n        # \u89e3\u6790\u6b63\u5728\u8fdb\u884c\u7684\u6d3b\u52a8 (enroll_detail)\n        if 'offline_meeting' in data['data'] and 'enroll_detail' in data['data']['offline_meeting']:\n            enroll_detail = data['data']['offline_meeting']['enroll_detail']\n            if enroll_detail and 'items' in enroll_detail:\n                for item in enroll_detail['items']:\n                    # \u68c0\u67e5city\u662f\u5426\u5305\u542b\u60a8\u7684\u6240\u5728\u57ce\u5e02\n                    if 'city' in item and VIEW_CITY in item['city']:\n                        # \u63d0\u53d6\u9700\u8981\u7684\u5b57\u6bb5\n                        title = item.get('title', '')\n                        city = item.get('city', '')\n                        # \u5c06\u65f6\u95f4\u6233\u8f6c\u6362\u4e3a\u65e5\u671f\u65f6\u95f4\u5b57\u7b26\u4e32\n                        start_time = datetime.fromtimestamp(item.get('start_time', 0)).strftime('%Y-%m-%d %H:%M:%S')\n                        end_time = datetime.fromtimestamp(item.get('end_time', 0)).strftime('%Y-%m-%d %H:%M:%S')\n                        # \u83b7\u53d6\u6d3b\u52a8\u5730\u5740\n                        address = item.get('link', '')\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">parse_and_store_data<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">    \u89e3\u6790\u6570\u636e\u5e76\u5b58\u50a8\u7b26\u5408\u6761\u4ef6\u7684\u8bb0\u5f55<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">    \u53c2\u6570: data - \u4eceAPI\u83b7\u53d6\u7684JSON\u6570\u636e<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">    <\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">not<\/span><span style=\"color: #D8DEE9FF\"> data <\/span><span style=\"color: #81A1C1\">or<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">data<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">not<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">in<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">warning<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u65e0\u6548\u7684\u6570\u636e\u683c\u5f0f<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">try<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        conn <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> pymysql<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">connect<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">**<\/span><span style=\"color: #D8DEE9FF\">DB_CONFIG<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        cursor <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> conn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">cursor<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        new_records_count <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #616E88\"># \u89e3\u6790\u6b63\u5728\u8fdb\u884c\u7684\u6d3b\u52a8 (enroll_detail)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">offline_meeting<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">in<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">data<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">]<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">and<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">enroll_detail<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">in<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">data<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">][<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">offline_meeting<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">]:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            enroll_detail <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">data<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">][<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">offline_meeting<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">][<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">enroll_detail<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> enroll_detail <\/span><span style=\"color: #81A1C1\">and<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">items<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">in<\/span><span style=\"color: #D8DEE9FF\"> enroll_detail<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #81A1C1\">for<\/span><span style=\"color: #D8DEE9FF\"> item <\/span><span style=\"color: #81A1C1\">in<\/span><span style=\"color: #D8DEE9FF\"> enroll_detail<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">items<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">]:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #616E88\"># \u68c0\u67e5city\u662f\u5426\u5305\u542b\u60a8\u7684\u6240\u5728\u57ce\u5e02<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">city<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">in<\/span><span style=\"color: #D8DEE9FF\"> item <\/span><span style=\"color: #81A1C1\">and<\/span><span style=\"color: #D8DEE9FF\"> VIEW_CITY <\/span><span style=\"color: #81A1C1\">in<\/span><span style=\"color: #D8DEE9FF\"> item<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">city<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">]:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        <\/span><span style=\"color: #616E88\"># \u63d0\u53d6\u9700\u8981\u7684\u5b57\u6bb5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        title <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> item<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">title<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        city <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> item<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">city<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        <\/span><span style=\"color: #616E88\"># \u5c06\u65f6\u95f4\u6233\u8f6c\u6362\u4e3a\u65e5\u671f\u65f6\u95f4\u5b57\u7b26\u4e32<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        start_time <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> datetime<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">fromtimestamp<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">item<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">start_time<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #ECEFF4\">)).<\/span><span style=\"color: #88C0D0\">strftime<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">%Y-%m-<\/span><span style=\"color: #EBCB8B\">%d<\/span><span style=\"color: #A3BE8C\"> %H:%M:%S<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        end_time <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> datetime<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">fromtimestamp<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">item<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">end_time<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #ECEFF4\">)).<\/span><span style=\"color: #88C0D0\">strftime<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">%Y-%m-<\/span><span style=\"color: #EBCB8B\">%d<\/span><span style=\"color: #A3BE8C\"> %H:%M:%S<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        <\/span><span style=\"color: #616E88\"># \u83b7\u53d6\u6d3b\u52a8\u5730\u5740<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        address <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> item<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">link<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u7ec4\u88c5\u83b7\u53d6\u5230\u7684\u6570\u636e\u8fdb\u884c\u6570\u636e\u843d\u5e93\uff0c\u5e76\u5728\u64cd\u4f5c\u7ed3\u675f\u540e\u5173\u95ed\u6570\u636e\u5e93\u8fde\u63a5\uff0c\u56e0\u4e3a\u662f\u4e2a\u5c0f\u578b\u7684\u9879\u76ee\uff0c\u6240\u4ee5\u5e76\u4e0d\u9700\u8981\u8003\u8651\u6027\u80fd\u95ee\u9898\uff0c\u6240\u4ee5\u6ca1\u6709\u4f7f\u7528\u8fde\u63a5\u6c60\u3002<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"                        # \u68c0\u67e5\u662f\u5426\u5df2\u5b58\u5728\u76f8\u540c\u8bb0\u5f55\n                        cursor.execute(&quot;SELECT id FROM movie_records WHERE title=%s AND start_time=%s&quot;,\n                                       (title, start_time))\n                        if not cursor.fetchone():\n                            # \u63d2\u5165\u65b0\u8bb0\u5f55\n                            cursor.execute('''\n                                           INSERT INTO movie_records (title, city, start_time, end_time, address, is_read)\n                                           VALUES (%s, %s, %s, %s, %s, %s)\n                                           ''', (title, city, start_time, end_time, address, 0))\n                            logger.info(&quot;\u5df2\u6dfb\u52a0\u65b0\u8bb0\u5f55: %s&quot;, title)\n                            new_records_count += 1\n\n            if new_records_count &gt; 0:\n                logger.info(&quot;\u5171\u6dfb\u52a0 %s \u6761\u65b0\u8bb0\u5f55&quot;, new_records_count)\n            else:\n                logger.info(&quot;\u6ca1\u6709\u53d1\u73b0\u65b0\u7684%s\u6d3b\u52a8\u8bb0\u5f55&quot;, VIEW_CITY)\n        else:\n            logger.warning(&quot;\u6570\u636e\u4e2d\u6ca1\u6709\u627e\u5230enroll_detail\u5b57\u6bb5&quot;)\n\n        conn.commit()\n        conn.close()\n    except Exception as e:\n        logger.error(&quot;\u89e3\u6790\u548c\u5b58\u50a8\u6570\u636e\u65f6\u51fa\u9519: %s&quot;, e)\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">                        <\/span><span style=\"color: #616E88\"># \u68c0\u67e5\u662f\u5426\u5df2\u5b58\u5728\u76f8\u540c\u8bb0\u5f55<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        cursor<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">execute<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">SELECT id FROM movie_records WHERE title=<\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\"> AND start_time=<\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                                       <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">title<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> start_time<\/span><span style=\"color: #ECEFF4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">not<\/span><span style=\"color: #D8DEE9FF\"> cursor<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">fetchone<\/span><span style=\"color: #ECEFF4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                            <\/span><span style=\"color: #616E88\"># \u63d2\u5165\u65b0\u8bb0\u5f55<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                            cursor<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">execute<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;&#39;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                                           INSERT INTO movie_records (title, city, start_time, end_time, address, is_read)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                                           VALUES (<\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\">, <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\">, <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\">, <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\">, <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\">, <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A3BE8C\">                                           <\/span><span style=\"color: #ECEFF4\">&#39;&#39;&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">title<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> city<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> start_time<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> end_time<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> address<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #ECEFF4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                            logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u5df2\u6dfb\u52a0\u65b0\u8bb0\u5f55: <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> title<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                            new_records_count <\/span><span style=\"color: #81A1C1\">+=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> new_records_count <\/span><span style=\"color: #81A1C1\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u5171\u6dfb\u52a0 <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\"> \u6761\u65b0\u8bb0\u5f55<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> new_records_count<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u6ca1\u6709\u53d1\u73b0\u65b0\u7684<\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\">\u6d3b\u52a8\u8bb0\u5f55<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> VIEW_CITY<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">warning<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u6570\u636e\u4e2d\u6ca1\u6709\u627e\u5230enroll_detail\u5b57\u6bb5<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        conn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">commit<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        conn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">close<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">except<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Exception<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">error<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u89e3\u6790\u548c\u5b58\u50a8\u6570\u636e\u65f6\u51fa\u9519: <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u68c0\u67e5\u63a8\u9001\u6570\u636e\uff0c\u8fd9\u91cc\u7684\u903b\u8f91\u662f\uff0c\u9694\u4e00\u6bb5\u65f6\u95f4\u4f1a\u626b\u63cf\u4e00\u4e0b\u6570\u636e\u5e93\u8868\uff0c\u5f00\u8868\u4e2d\u662f\u5426\u5b58\u5728\u672a\u63a8\u9001\u7684\u6570\u636e\uff0c\u5982\u679c\u5b58\u5728\u5219\u8fdb\u884c\u6570\u636e\u63a8\u9001\uff0c\u5f53\u63a8\u9001\u6210\u529f\u540e\u5c06\u6570\u636e\u7684\u63a8\u9001\u72b6\u6001\u6539\u6210\u5df2\u63a8\u9001\uff0c\u5fae\u4fe1\u516c\u4f17\u53f7\u63a8\u9001\u7684\u4ee3\u7801\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\u5b9a\u65f6\u63a8\u9001\u6d88\u606f\u7684\u90a3\u7bc7\u6587\u7ae0\u4e2d\u6709\uff0c\u8fd9\u91cc\u5c31\u4e0d\u91cd\u590d\u5217\u4e3e\u4e86\uff0c\u903b\u8f91\u662f\u4e00\u6837\u7684\u3002<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\ndef check_and_push():\n    &quot;&quot;&quot;\u68c0\u67e5\u672a\u8bfb\u8bb0\u5f55\u5e76\u63a8\u9001&quot;&quot;&quot;\n    try:\n        conn = pymysql.connect(**DB_CONFIG)\n        cursor = conn.cursor()\n\n        # \u67e5\u8be2\u672a\u8bfb\u8bb0\u5f55\n        cursor.execute(&quot;SELECT id, title, city, start_time, end_time, address FROM movie_records WHERE is_read=0&quot;)\n        unread_records = cursor.fetchall()\n\n        if unread_records:\n            logger.info(&quot;\u53d1\u73b0 %s \u6761\u672a\u8bfb\u8bb0\u5f55&quot;, len(unread_records))\n\n            for record in unread_records:\n                # \u83b7\u53d6\u6d88\u606f\u5185\u5bb9\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u9ed8\u8ba4\u503c\uff0ckey\u4e0d\u5b58\u5728\u65f6\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n                id = record.get('id', '')\n                title = record.get('title', '')\n                city = record.get('city', '')\n                start_time = record.get('start_time', '')\n                end_time = record.get('end_time', '')\n                address = record.get('address', '')\n\n                # \u683c\u5f0f\u5316\u65f6\u95f4\n                try:\n                    start_dt = datetime.strptime(start_time, &quot;%Y-%m-%d %H:%M:%S&quot;)\n                    end_dt = datetime.strptime(end_time, &quot;%Y-%m-%d %H:%M:%S&quot;)\n                    formatted_start = start_dt.strftime(&quot;%Y\u5e74%m\u6708%d\u65e5 %H:%M&quot;)\n                    formatted_end = end_dt.strftime(&quot;%Y\u5e74%m\u6708%d\u65e5 %H:%M&quot;)\n                except ValueError:\n                    formatted_start = start_time\n                    formatted_end = end_time\n\n                # \u53d1\u9001\u5fae\u4fe1\u901a\u77e5\n                if send_wechat_notification(title, city, formatted_start, formatted_end, address):\n                    # \u66f4\u65b0\u4e3a\u5df2\u8bfb\n                    cursor.execute(&quot;UPDATE movie_records SET is_read=1 WHERE id=%s&quot;, (id,))\n                    logger.info(&quot;\u5df2\u63a8\u9001\u5e76\u6807\u8bb0\u4e3a\u5df2\u8bfb: %s&quot;, title)\n        else:\n            logger.info(&quot;\u6ca1\u6709\u53d1\u73b0\u672a\u8bfb\u8bb0\u5f55&quot;)\n\n        conn.commit()\n        conn.close()\n    except Exception as e:\n        logger.error(&quot;\u68c0\u67e5\u548c\u63a8\u9001\u8bb0\u5f55\u65f6\u51fa\u9519: %s&quot;, e)\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">check_and_push<\/span><span style=\"color: #ECEFF4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><span style=\"color: #A3BE8C\">\u68c0\u67e5\u672a\u8bfb\u8bb0\u5f55\u5e76\u63a8\u9001<\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">try<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        conn <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> pymysql<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">connect<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">**<\/span><span style=\"color: #D8DEE9FF\">DB_CONFIG<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        cursor <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> conn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">cursor<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #616E88\"># \u67e5\u8be2\u672a\u8bfb\u8bb0\u5f55<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        cursor<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">execute<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">SELECT id, title, city, start_time, end_time, address FROM movie_records WHERE is_read=0<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        unread_records <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> cursor<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">fetchall<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> unread_records<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u53d1\u73b0 <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #A3BE8C\"> \u6761\u672a\u8bfb\u8bb0\u5f55<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">len<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">unread_records<\/span><span style=\"color: #ECEFF4\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">for<\/span><span style=\"color: #D8DEE9FF\"> record <\/span><span style=\"color: #81A1C1\">in<\/span><span style=\"color: #D8DEE9FF\"> unread_records<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #616E88\"># \u83b7\u53d6\u6d88\u606f\u5185\u5bb9\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u9ed8\u8ba4\u503c\uff0ckey\u4e0d\u5b58\u5728\u65f6\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> record<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">id<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                title <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> record<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">title<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                city <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> record<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">city<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                start_time <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> record<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">start_time<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                end_time <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> record<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">end_time<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                address <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> record<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">address<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #616E88\"># \u683c\u5f0f\u5316\u65f6\u95f4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #81A1C1\">try<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    start_dt <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> datetime<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">strptime<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">start_time<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">%Y-%m-<\/span><span style=\"color: #EBCB8B\">%d<\/span><span style=\"color: #A3BE8C\"> %H:%M:%S<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    end_dt <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> datetime<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">strptime<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">end_time<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">%Y-%m-<\/span><span style=\"color: #EBCB8B\">%d<\/span><span style=\"color: #A3BE8C\"> %H:%M:%S<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    formatted_start <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> start_dt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">strftime<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">%Y\u5e74%m\u6708<\/span><span style=\"color: #EBCB8B\">%d<\/span><span style=\"color: #A3BE8C\">\u65e5 %H:%M<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    formatted_end <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> end_dt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">strftime<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">%Y\u5e74%m\u6708<\/span><span style=\"color: #EBCB8B\">%d<\/span><span style=\"color: #A3BE8C\">\u65e5 %H:%M<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #81A1C1\">except<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ValueError<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    formatted_start <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> start_time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    formatted_end <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> end_time<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #616E88\"># \u53d1\u9001\u5fae\u4fe1\u901a\u77e5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">send_wechat_notification<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">title<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> city<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> formatted_start<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> formatted_end<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> address<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #616E88\"># \u66f4\u65b0\u4e3a\u5df2\u8bfb<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    cursor<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">execute<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">UPDATE movie_records SET is_read=1 WHERE id=<\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #ECEFF4\">,))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u5df2\u63a8\u9001\u5e76\u6807\u8bb0\u4e3a\u5df2\u8bfb: <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> title<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u6ca1\u6709\u53d1\u73b0\u672a\u8bfb\u8bb0\u5f55<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        conn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">commit<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        conn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">close<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">except<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Exception<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">error<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u68c0\u67e5\u548c\u63a8\u9001\u8bb0\u5f55\u65f6\u51fa\u9519: <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u5b9a\u65f6\u8c03\u5ea6\uff0c\u5f53\u8c03\u5ea6\u5f00\u59cb\u65f6\u5148\u53bb\u83b7\u53d6b\u7ad9\u6d3b\u52a8\u6570\u636e\uff0c\u5982\u679c\u83b7\u53d6\u5230\u65b0\u7684\u6d3b\u52a8\u6570\u636e\u5219\u540c\u6b65\u5c06\u6570\u636e\u5b58\u50a8\u5230\u6570\u636e\u5e93\u4e2d\uff0c\u5426\u5219\u67e5\u770b\u6570\u636e\u5e93\u8868\u4e2d\u662f\u5426\u5b58\u5728\u672a\u63a8\u9001\u7684\u6570\u636e\uff0c\u5982\u679c\u5b58\u5728\u5219\u8fdb\u884c\u63a8\u9001\u53cd\u4e4b\u5219\u4e0d\u63a8\u9001\uff08\u8fd9\u90e8\u5206\u903b\u8f91\u53ea\u5728\u9879\u76ee\u7b2c\u4e00\u6b21\u8fd0\u884c\u65f6\u7acb\u5373\u6267\u884c\uff09\uff0c\u5206\u522b\u4e3a\u83b7\u53d6\u5b58\u50a8\u5927\u4f1a\u5458\u6d3b\u52a8\u4fe1\u606f\u4e0e\u6d88\u606f\u63a8\u9001\u8bbe\u7f6e\u8c03\u5ea6\u65f6\u95f4\uff0c\u8fd9\u91cc\u6211\u662f\u8bbe\u7f6e\u7684\u4e94\u5206\u949f\u626b\u63cf\u4e00\u4e0b\u5e93\u8868\uff0c\u4e00\u4e2a\u5c0f\u65f6\u83b7\u53d6\u4e00\u6b21b\u7ad9\u5927\u4f1a\u5458\u6570\u636e\uff0c\u6240\u4ee5\u53ef\u80fd\u4f1a\u5b58\u5728\u4e00\u4e9b\u95ee\u9898\uff08\u5373\u5f53\u6211\u6536\u5230\u516c\u4f17\u53f7\u6d88\u606f\u65f6\u8fd9\u4e2a\u6d3b\u52a8\u5df2\u7ecf\u5f00\u59cb\u4e00\u6bb5\u65f6\u95f4\u4e86\uff09\uff0c\u5176\u5b9e\u4e5f\u53ef\u4ee5\u6539\uff0c\u4f46\u662f\u4e00\u4e2a\u4e24\u4e2a\u5c0f\u65f6\u7684\u4fe1\u606f\u5dee\u5176\u5b9e\u65f6\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u6bd5\u7adf\u5927\u4f1a\u5458\u4e5f\u4e0d\u662f\u4eba\u4eba\u90fd\u4f1a\u5f00\uff0c\u4eba\u6570\u65f6\u95f4\u6bd4\u611f\u89c9\u4e5f\u6ca1\u4ec0\u4e48\u592a\u5927\u95ee\u9898\u3002<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"def run_scheduled_tasks():\n    &quot;&quot;&quot;\u8fd0\u884c\u5b9a\u65f6\u4efb\u52a1&quot;&quot;&quot;\n    # \u7acb\u5373\u83b7\u53d6\u4e00\u6b21\u6570\u636e\n    logger.info(&quot;\u5f00\u59cb\u9996\u6b21\u83b7\u53d6\u6570\u636e...&quot;)\n    data = fetch_bilibili_data()\n    if data:\n        parse_and_store_data(data)\n\n    # \u68c0\u67e5\u662f\u5426\u6709\u672a\u8bfb\u8bb0\u5f55\u9700\u8981\u63a8\u9001\n    check_and_push()\n\n    # \u8bbe\u7f6e\u5b9a\u65f6\u4efb\u52a1\n    # \u6bcfFETCH_INTERVAL_MINUTES\u5206\u949f\u83b7\u53d6\u4e00\u6b21\u6570\u636e\n    schedule.every(FETCH_INTERVAL_MINUTES).minutes.do(lambda: parse_and_store_data(fetch_bilibili_data()))\n\n    # \u6bcfPUSH_INTERVAL_MINUTES\u5206\u949f\u68c0\u67e5\u4e00\u6b21\u662f\u5426\u6709\u65b0\u8bb0\u5f55\u9700\u8981\u63a8\u9001\n    schedule.every(PUSH_INTERVAL_MINUTES).minutes.do(check_and_push)\n\n    logger.info(&quot;\u5b9a\u65f6\u4efb\u52a1\u5df2\u8bbe\u7f6e\uff0c\u5f00\u59cb\u8fd0\u884c...&quot;)\n\n    # \u6301\u7eed\u8fd0\u884c\u5b9a\u65f6\u4efb\u52a1\n    try:\n        while True:\n            schedule.run_pending()\n            time.sleep(1)\n    except KeyboardInterrupt:\n        logger.info(&quot;\u7a0b\u5e8f\u88ab\u7528\u6237\u4e2d\u65ad&quot;)\n    except Exception as e:\n        logger.error(&quot;\u8fd0\u884c\u5b9a\u65f6\u4efb\u52a1\u65f6\u51fa\u9519: %s&quot;, e)\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">run_scheduled_tasks<\/span><span style=\"color: #ECEFF4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><span style=\"color: #A3BE8C\">\u8fd0\u884c\u5b9a\u65f6\u4efb\u52a1<\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u7acb\u5373\u83b7\u53d6\u4e00\u6b21\u6570\u636e<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u5f00\u59cb\u9996\u6b21\u83b7\u53d6\u6570\u636e...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    data <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">fetch_bilibili_data<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">parse_and_store_data<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">data<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u68c0\u67e5\u662f\u5426\u6709\u672a\u8bfb\u8bb0\u5f55\u9700\u8981\u63a8\u9001<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #88C0D0\">check_and_push<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u8bbe\u7f6e\u5b9a\u65f6\u4efb\u52a1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u6bcfFETCH_INTERVAL_MINUTES\u5206\u949f\u83b7\u53d6\u4e00\u6b21\u6570\u636e<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    schedule<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">every<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">FETCH_INTERVAL_MINUTES<\/span><span style=\"color: #ECEFF4\">).<\/span><span style=\"color: #D8DEE9FF\">minutes<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">do<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">lambda<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">parse_and_store_data<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">fetch_bilibili_data<\/span><span style=\"color: #ECEFF4\">()))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u6bcfPUSH_INTERVAL_MINUTES\u5206\u949f\u68c0\u67e5\u4e00\u6b21\u662f\u5426\u6709\u65b0\u8bb0\u5f55\u9700\u8981\u63a8\u9001<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    schedule<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">every<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">PUSH_INTERVAL_MINUTES<\/span><span style=\"color: #ECEFF4\">).<\/span><span style=\"color: #D8DEE9FF\">minutes<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">do<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">check_and_push<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u5b9a\u65f6\u4efb\u52a1\u5df2\u8bbe\u7f6e\uff0c\u5f00\u59cb\u8fd0\u884c...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># \u6301\u7eed\u8fd0\u884c\u5b9a\u65f6\u4efb\u52a1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">try<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">while<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">True<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            schedule<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">run_pending<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            time<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">sleep<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">except<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">KeyboardInterrupt<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u7a0b\u5e8f\u88ab\u7528\u6237\u4e2d\u65ad<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">except<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Exception<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">error<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u8fd0\u884c\u5b9a\u65f6\u4efb\u52a1\u65f6\u51fa\u9519: <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> e<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u6700\u540e\u8fd9\u91cc\u6211\u8fd8\u4e3a\u8fd9\u4e2a\u7a0b\u5e8f\u6dfb\u52a0\u4e86\u83b7\u53d6\u8fdb\u7a0bid\u7684\u4ee3\u7801\uff0c\u4f46\u662f\u611f\u89c9\u4e0d\u662f\u592a\u597d\uff08\u53ea\u662f\u5728\u7a0b\u5e8f\u5f00\u5934\u5904\u6253\u5370\uff09\uff0c\u4f46\u662f\u76f8\u5bf9\u4e8e\u4e00\u53f0\u673a\u5668\u4e0a\u8fd0\u884c\u591a\u4e2a\u540c\u540dpython\u7a0b\u5e8f\u8fd8\u662f\u6709\u4e00\u5b9a\u5e2e\u52a9\u7684\uff0c\u5728kill\u7684\u65f6\u5019\u4f1a\u66f4\u52a0\u65b9\u4fbf\u3002<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"def get_pid():\n    &quot;&quot;&quot;\u83b7\u53d6\u5f53\u524d\u8fdb\u7a0bid&quot;&quot;&quot;\n    pid = os.getpid()\n    logger.info(&quot;\u5f53\u524d\u8fdb\u7a0bID\uff08PID\uff09: %s&quot;, pid)\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">get_pid<\/span><span style=\"color: #ECEFF4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><span style=\"color: #A3BE8C\">\u83b7\u53d6\u5f53\u524d\u8fdb\u7a0bid<\/span><span style=\"color: #ECEFF4\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    pid <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> os<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">getpid<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    logger<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u5f53\u524d\u8fdb\u7a0bID\uff08PID\uff09: <\/span><span style=\"color: #EBCB8B\">%s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> pid<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u8fd9\u5c31\u662f\u4e3b\u7a0b\u5e8f\u7684\u6574\u4f53\u5185\u5bb9\uff0c\u5176\u4ed6\u7684\u5c31\u662f\u65e5\u5fd7\u548c\u811a\u672c\u6587\u4ef6\u4e86\uff0c\u8fd9\u91cc\u5728\u4f7f\u7528\u5b9d\u5854\u81ea\u5e26\u7684python\u5e94\u7528\u90e8\u7f72\u5de5\u5177\u7684\u65f6\u5019\u56e0\u4e3a\u7248\u672c\u7b49\u539f\u56e0\uff08\u5e94\u7528\u81ea\u5e26\u7248\u672c\uff09\u65e0\u6cd5\u90e8\u7f72\uff0c\u4e8e\u662f\u5c31\u76f4\u63a5\u7b80\u5355\u7c97\u66b4\u7684\u5728\u670d\u52a1\u5668\u4e0a\u90e8\u7f72\u5e76\u540e\u53f0\u8fd0\u884c\u4e86<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# \u5148\u786e\u4fdd\u8bbe\u7f6e\u7f16\u7801\uff08\u907f\u514d\u4e2d\u6587\u65e5\u5fd7\u95ee\u9898\uff09\uff0c\u518d\u540e\u53f0\u8fd0\u884c\u7a0b\u5e8f\nexport PYTHONIOENCODING=utf-8 &amp;&amp; nohup python3 main.py &gt; bilibili_notifier.log 2&gt;&amp;1 &amp;\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\"># \u5148\u786e\u4fdd\u8bbe\u7f6e\u7f16\u7801\uff08\u907f\u514d\u4e2d\u6587\u65e5\u5fd7\u95ee\u9898\uff09\uff0c\u518d\u540e\u53f0\u8fd0\u884c\u7a0b\u5e8f<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">export<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">PYTHONIOENCODING<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #A3BE8C\">utf-8<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&amp;&amp;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">nohup<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">python3<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">main.py<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">bilibili_notifier.log<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">2&gt;&amp;1<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&amp;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u547d\u4ee4\u89e3\u91ca\uff1a<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"export PYTHONIOENCODING=utf-8 #\u8bbe\u7f6e Python \u8f93\u51fa\u7f16\u7801\u4e3a UTF-8\uff0c\u89e3\u51b3\u4e2d\u6587\u65e5\u5fd7\u95ee\u9898\nnohup #no hang up\uff08\u4e0d\u6302\u8d77\uff09\uff0c\u4fdd\u8bc1\u9000\u51fa\u7ec8\u7aef\u540e\u7a0b\u5e8f\u7ee7\u7eed\u8fd0\u884c\npython3 main.py #\u8fd0\u884c\u4f60\u7684\u7a0b\u5e8f\n&gt; bilibili_notifier.log #\u5c06\u7a0b\u5e8f\u6807\u51c6\u8f93\u51fa\u91cd\u5b9a\u5411\u5230\u6307\u5b9a\u65e5\u5fd7\u6587\u4ef6\uff08\u66ff\u4ee3\u9ed8\u8ba4\u7684 nohup.out\uff09\n2&gt;&amp;1 #\u5c06\u9519\u8bef\u8f93\u51fa\u4e5f\u91cd\u5b9a\u5411\u5230\u540c\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff08\u65b9\u4fbf\u6392\u67e5\u95ee\u9898\uff09\n&amp; #\u8ba9\u7a0b\u5e8f\u5728\u540e\u53f0\u8fd0\u884c\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">export<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">PYTHONIOENCODING<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #A3BE8C\">utf-8<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">#\u8bbe\u7f6e Python \u8f93\u51fa\u7f16\u7801\u4e3a UTF-8\uff0c\u89e3\u51b3\u4e2d\u6587\u65e5\u5fd7\u95ee\u9898<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">nohup<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">#no hang up\uff08\u4e0d\u6302\u8d77\uff09\uff0c\u4fdd\u8bc1\u9000\u51fa\u7ec8\u7aef\u540e\u7a0b\u5e8f\u7ee7\u7eed\u8fd0\u884c<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">python3<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">main.py<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">#\u8fd0\u884c\u4f60\u7684\u7a0b\u5e8f<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> bilibili_notifier.log <\/span><span style=\"color: #616E88\">#\u5c06\u7a0b\u5e8f\u6807\u51c6\u8f93\u51fa\u91cd\u5b9a\u5411\u5230\u6307\u5b9a\u65e5\u5fd7\u6587\u4ef6\uff08\u66ff\u4ee3\u9ed8\u8ba4\u7684 nohup.out\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">2&gt;&amp;1<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">#\u5c06\u9519\u8bef\u8f93\u51fa\u4e5f\u91cd\u5b9a\u5411\u5230\u540c\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff08\u65b9\u4fbf\u6392\u67e5\u95ee\u9898\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">&amp;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">#\u8ba9\u7a0b\u5e8f\u5728\u540e\u53f0\u8fd0\u884c<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u56e0\u4e3a\u5728\u65e5\u5fd7\u6587\u4ef6\u4e2d\u7684\u5f00\u5934\u4f1a\u7528\u8fd9\u4e2a\u8fdb\u7a0b\u7684\u8bb0\u5f55\uff0c\u6240\u4ee5\u53ef\u4ee5\u4f7f\u7528kill\u76f4\u63a5\u7ec8\u6b62\u8fd9\u4e2a\u7a0b\u5e8f\u3002<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# \u5148\u901a\u8fc7ps\u547d\u4ee4\u627e\u5230\u8fdb\u7a0bID\uff08PID\uff09\uff0c\u6bd4\u5982PID\u662f12345\nkill 12345\n\n# \u5982\u679c\u8fdb\u7a0b\u65e0\u6cd5\u6b63\u5e38\u505c\u6b62\uff0c\u5f3a\u5236\u6740\u6b7b\nkill -9 12345\n\n# \u9879\u76ee\u7684\u65e5\u5fd7\u4e2d\u4f1a\u8bb0\u5f55\u5f53\u524d\u542f\u52a8\u9879\u76ee\u7684pid\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4ece\u65e5\u5fd7\u4e2d\u83b7\u53d6pid\u4fe1\u606f\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\"># \u5148\u901a\u8fc7ps\u547d\u4ee4\u627e\u5230\u8fdb\u7a0bID\uff08PID\uff09\uff0c\u6bd4\u5982PID\u662f12345<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">kill<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">12345<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u5982\u679c\u8fdb\u7a0b\u65e0\u6cd5\u6b63\u5e38\u505c\u6b62\uff0c\u5f3a\u5236\u6740\u6b7b<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">kill<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">-9<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">12345<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u9879\u76ee\u7684\u65e5\u5fd7\u4e2d\u4f1a\u8bb0\u5f55\u5f53\u524d\u542f\u52a8\u9879\u76ee\u7684pid\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4ece\u65e5\u5fd7\u4e2d\u83b7\u53d6pid\u4fe1\u606f<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u65e5\u5fd7\u67e5\u770b\uff1a<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# \u5b9e\u65f6\u67e5\u770b\u65e5\u5fd7\uff08\u7c7b\u4f3ctail -f\uff09\ntail -f bilibili_notifier.log\n\n# \u67e5\u770b\u6700\u65b0100\u884c\u65e5\u5fd7\ntail -n 100 bilibili_notifier.log\n\n# \u67e5\u770b\u5168\u90e8\u65e5\u5fd7\ncat bilibili_notifier.log\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\"># \u5b9e\u65f6\u67e5\u770b\u65e5\u5fd7\uff08\u7c7b\u4f3ctail -f\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">tail<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">-f<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">bilibili_notifier.log<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u67e5\u770b\u6700\u65b0100\u884c\u65e5\u5fd7<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">tail<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">-n<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">100<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">bilibili_notifier.log<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># \u67e5\u770b\u5168\u90e8\u65e5\u5fd7<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">cat<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">bilibili_notifier.log<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u5728README\u4e2d\u4f1a\u6709\u8be6\u7ec6\u7684\u4f7f\u7528\u6559\u7a0b\uff0c\u6574\u4e2a\u9879\u76ee\u7684\u5b8c\u6574\u5ea6\u5f88\u9ad8\uff0c\u5b9e\u73b0\u8d77\u6765\u4e0d\u662f\u5f88\u590d\u6742\uff08\u56e0\u4e3a\u5927\u591a\u6570\u4ee3\u7801\u90fd\u662fAI\u63d0\u4f9b\u7684\uff09\uff0c\u5bf9\u4e8e\u73b0\u5728\u505aAgent\u5e94\u7528\u751f\u6210\u6765\u8bf4\u5f88\u591a\u4eba\u90fd\u4f1a\u8ba4\u4e3a\u4e0d\u9700\u8981\u81ea\u5df1\u4f1a\u5199\u4ee3\u7801\uff0c\u53ef\u80fd\u968f\u4fbf\u4e00\u4e2a\u4eba\u90fd\u80fd\u505a\u7684\u8fd9\u4e48\u4e00\u79cd\u611f\u89c9\uff0c\u4e2a\u4eba\u611f\u89c9\u7b80\u5355\u7684\u9759\u6001\u7f51\u7ad9\u662f\u5b8c\u5168\u6ca1\u6709\u95ee\u9898\u7684\uff0c\u4f46\u662f\u5982\u679c\u7275\u626f\u5230\u540e\u53f0\u63a5\u53e3\u8c03\u7528\uff0c\u4ee3\u7801\u8c03\u8bd5\u7b49\u95ee\u9898\uff0c\u8fd8\u662f\u9700\u8981\u80fd\u591f\u770b\u61c2\u4ee3\u7801\u624d\u53ef\u4ee5\u5b9e\u73b0\u7684\u81f3\u5c11\u5728\u76ee\u524d\u6765\u8bf4\u662f\u8fd9\u6837\u7684\uff0c\u4e0d\u77e5\u9053\u4ee5\u540e\u4f1a\u662f\u4ec0\u4e48\u6837\u7684\uff0c\u4e5f\u8bb8\u6709\u4e00\u5929\u7a0b\u5e8f\u5458\u771f\u7684\u4f1a\u6210\u4e3a\u4e0b\u4e00\u4e2a\u6d88\u5931\u7684\u804c\u4e1a\uff0c\u4e5f\u8bb8\u4f1a\u51fa\u73b0\u4e00\u4e2a\u65b0\u7684\u804c\u4e1a\u4f1a\u4ee3\u66ff\u7a0b\u5e8f\u5458\uff0c\u5728\u4e0b\u4e00\u4e2a\u98ce\u53e3\u4e0d\u77e5\u9053\u81ea\u5df1\u8fd8\u80fd\u8d70\u591a\u8fdc\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148\u8bf4\u660e\uff1a\u672c\u7bc7\u6587\u7ae0\u4ec5\u5b66\u4e60\u4f7f\u7528\u667a\u80fd\u4f53\u8fdb\u884c\u529f\u80fd\u5b9e\u73b0\uff0c\u4e0d\u6d89\u53ca\u5546\u4e1a\u7528\u9014\u4ee5\u53ca\u5546\u4e1a\u76ee\u7684\uff0c\u4e25\u7981\u5546\u4e1a\u7528\u9014\u4ee5\u53ca\u975e\u6cd5\u76ee\u7684\u4e0e\u975e\u6cd5\u6d3b\u52a8 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.coffecat.cn\/index.php\/2026\/02\/11\/%e4%bd%bf%e7%94%a8agent%e6%99%ba%e8%83%bd%e4%bd%93%e5%bf%ab%e9%80%9f%e5%ae%9e%e7%8e%b0b%e7%ab%99%e5%a4%a7%e4%bc%9a%e5%91%98%e6%b4%bb%e5%8a%a8%e6%b6%88%e6%81%af%e6%8e%a8%e9%80%81\/\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201c\u4f7f\u7528Agent\u667a\u80fd\u4f53\u5feb\u901f\u5b9e\u73b0B\u7ad9\u5927\u4f1a\u5458\u6d3b\u52a8\u6d88\u606f\u63a8\u9001\u201d<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[36,21,1],"tags":[],"class_list":["post-1152","post","type-post","status-publish","format-standard","hentry","category-ai","category-python","category-uncategorized"],"views":432,"_links":{"self":[{"href":"https:\/\/www.coffecat.cn\/index.php\/wp-json\/wp\/v2\/posts\/1152","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.coffecat.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.coffecat.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.coffecat.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.coffecat.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1152"}],"version-history":[{"count":44,"href":"https:\/\/www.coffecat.cn\/index.php\/wp-json\/wp\/v2\/posts\/1152\/revisions"}],"predecessor-version":[{"id":1196,"href":"https:\/\/www.coffecat.cn\/index.php\/wp-json\/wp\/v2\/posts\/1152\/revisions\/1196"}],"wp:attachment":[{"href":"https:\/\/www.coffecat.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1152"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.coffecat.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1152"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.coffecat.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}