{
  "jobs": [
    {
      "id": "94d230f73e7f",
      "name": "\u6625\u8003\u9009\u9898-\u6587\u7ae0\u6293\u53d6",
      "prompt": "\u5728\u670d\u52a1\u5668\u4e0a\u6293\u53d6\u5fae\u4fe1\u516c\u4f17\u53f7\u6700\u65b0\u6587\u7ae0\uff0c\u7136\u540e\u63a8\u9001\u5230\u4f01\u5fae\u7fa4\u3002\n\n\u6b65\u9aa4\uff1a\n1. cd /home/agentuser/project/scripts\n2. \u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\uff1aexport DEEPSEEK_API_KEY=$(grep DEEPSEEK_API_KEY ../.env | cut -d= -f2) && export QW_WEBHOOK_URL=$(grep QW_WEBHOOK_URL ../.env | cut -d= -f2-) && export WE_MP_RSS_AK=$(grep WE_MP_RSS_AK ../.env | cut -d= -f2) && export WE_MP_RSS_SK=$(grep WE_MP_RSS_SK ../.env | cut -d= -f2)\n3. \u8fd0\u884c python3 -c \"\nimport os, sys\nsys.path.insert(0, '.')\nfrom utils import send_qw_markdown\nfrom fetch_articles import main as fetch_main\n\n# Step 1: Fetch\nfetch_main()\n\n# Step 2: Check pending articles\nfrom utils import load_pending\npending = load_pending()\narticles = pending.get('articles', [])\nnew_articles = [a for a in articles if not a.get('processed')]\n\nif not new_articles:\n    print('No new articles to push')\nelse:\n    # Push each new article\n    count = 0\n    for art in new_articles[:5]:  # max 5 per run\n        title = art.get('title', '\u65e0\u6807\u9898')\n        url = art.get('url', '')\n        source = art.get('source', '\u672a\u77e5\u6765\u6e90')\n        summary = art.get('summary', '')[:200]\n        content = f'## \ud83d\udcf0 {title}\\n> \u6765\u6e90\uff1a{source}\\n\\n{summary}\\n\\n[\u9605\u8bfb\u539f\u6587]({url})'\n        if send_qw_markdown(content):\n            art['processed'] = True\n            count += 1\n            print(f'Pushed: {title[:40]}')\n    \n    from utils import save_pending\n    save_pending(pending)\n    print(f'Total pushed: {count}/{len(new_articles)}')\n\" 2>&1\n\n\u4e0d\u7528\u95ee\u6211\u4efb\u4f55\u95ee\u9898\uff0c\u76f4\u63a5\u6267\u884c\u3002",
      "skills": [],
      "skill": null,
      "model": null,
      "provider": null,
      "base_url": null,
      "script": null,
      "no_agent": false,
      "context_from": null,
      "schedule": {
        "kind": "interval",
        "minutes": 120,
        "display": "every 120m"
      },
      "schedule_display": "every 120m",
      "repeat": {
        "times": null,
        "completed": 170
      },
      "enabled": true,
      "state": "scheduled",
      "paused_at": null,
      "paused_reason": null,
      "created_at": "2026-06-02T12:01:40.650559+08:00",
      "next_run_at": "2026-06-16T19:12:42.455707+08:00",
      "last_run_at": "2026-06-16T17:12:42.455707+08:00",
      "last_status": "ok",
      "last_error": null,
      "last_delivery_error": "platform 'weixin' not configured/enabled",
      "deliver": "origin",
      "origin": {
        "platform": "weixin",
        "chat_id": "o9cq8052YSgfx3GkTmTPFXxXtCyY@im.wechat",
        "chat_name": null,
        "thread_id": null
      },
      "enabled_toolsets": [
        "terminal"
      ],
      "workdir": null
    },
    {
      "id": "eba217dfc155",
      "name": "we-mp-rss \u767b\u5f55\u72b6\u6001\u5de1\u68c0",
      "prompt": "\u8fd0\u884c check_werss_login.py \u68c0\u67e5\u767b\u5f55\u72b6\u6001\u3002\u811a\u672c\u4f1a\u81ea\u52a8\u5904\u7406\u4f01\u5fae\u7fa4\u901a\u77e5\u3002\u4f60\u53ea\u9700\u6839\u636e\u811a\u672c\u8f93\u51fa\u505a\u51fa\u54cd\u5e94\u5373\u53ef\u2014\u2014\u5982\u679c logged_in=true \u65e0\u9700\u52a8\u4f5c\uff0cfalse \u65f6\u811a\u672c\u5df2\u53d1\u4f01\u5fae\u7fa4\u901a\u77e5\uff0c\u4f60\u5728\u56de\u590d\u4e2d\u7b80\u5355\u786e\u8ba4\u5373\u53ef\u3002",
      "skills": [],
      "skill": null,
      "model": null,
      "provider": null,
      "base_url": null,
      "script": "check_werss_login.py",
      "no_agent": false,
      "context_from": null,
      "schedule": {
        "kind": "cron",
        "expr": "0 9 * * *",
        "display": "0 9 * * *"
      },
      "schedule_display": "0 9 * * *",
      "repeat": {
        "times": null,
        "completed": 12
      },
      "enabled": true,
      "state": "scheduled",
      "paused_at": null,
      "paused_reason": null,
      "created_at": "2026-06-04T16:16:45.825050+08:00",
      "next_run_at": "2026-06-17T09:00:00+08:00",
      "last_run_at": "2026-06-16T09:00:55.347671+08:00",
      "last_status": "ok",
      "last_error": null,
      "last_delivery_error": null,
      "deliver": "origin",
      "origin": {
        "platform": "weixin",
        "chat_id": "o9cq8052YSgfx3GkTmTPFXxXtCyY@im.wechat",
        "chat_name": null,
        "thread_id": null
      },
      "enabled_toolsets": null,
      "workdir": null
    },
    {
      "id": "218c1e953f63",
      "name": "\u9009\u9898\u65e5\u62a5",
      "prompt": "\u4f60\u662f\u5e7f\u4e1c\u6625\u5b63\u9ad8\u8003\uff083+\u8bc1\u4e66\u8003\u8bd5\uff09\u5185\u5bb9\u7f16\u8f91\u3002\u6bcf\u5929\u65e9\u4e0a\u5206\u6790 we-mp-rss \u6570\u636e\u5e93\u6700\u8fd1 36 \u5c0f\u65f6\u6587\u7ae0\uff0c\u751f\u6210\u9009\u9898\u65e5\u62a5\u76f4\u63a5\u63a8\u9001\u3002\n\n\u6b65\u9aa4\uff1a\n1. \u67e5\u8be2\u6570\u636e\u5e93\uff1a\u590d\u5236 ~/project/we-mp-rss-data/db.db \u5230 /tmp/\uff0c\u67e5\u8be2\u6700\u8fd1 36 \u5c0f\u65f6\u6587\u7ae0\uff08articles JOIN feeds\uff0c\u53d6 title/url/source/publish_time\uff09\uff0c\u5173\u5e93\n2. \u52a0\u8f7d ~/project/config/exam_calendar.json\uff0c\u63d0\u53d6\u672a\u6765 14 \u5929\u5185\u8282\u70b9\uff08\u6309 days_left \u6392\u5e8f\uff09\n3. \u5206\u6790\u8d8b\u52bf + \u7ed3\u5408\u8003\u8bd5\u65e5\u5386\uff0c\u63a8\u8350 3-5 \u4e2a\u9009\u9898\n\n\u8f93\u51fa\u683c\u5f0f\uff08\u5b57\u8282\u6570 \u22644000\uff09\uff1a\n\ud83d\udcca \u4eca\u65e5\u6982\u51b5\n[2-3\u53e5\u7eaf\u6587\u672c]\n\n\ud83d\udd25 \u503c\u5f97\u8ffd\u7684\u9009\u9898\n> \u9009\u98981\uff1a<\u9009\u9898\u540d>\n> \u4e3a\u4ec0\u4e48\uff1a<1\u53e5>\n> \u5207\u5165\uff1a\u89d2\u5ea61 / \u89d2\u5ea62 / \u89d2\u5ea63\n> \u53c2\u8003\uff1a<\u6765\u6e90>\u300a<\u6807\u9898>\u300b\n\n> \u9009\u98982\uff1a...\n\n\ud83d\udca1 \u53ef\u50a8\u5907\n> \u9009\u9898\u540d \u2014 <1\u53e5\u8bdd>\n\n\u26a0\ufe0f \u6ce8\u610f\n<\u7ed3\u5408\u8003\u8bd5\u65e5\u5386\u7684\u63d0\u9192>\n\n\u5168\u81ea\u52a8\u6267\u884c\uff0c\u4e0d\u95ee\u6211\u4efb\u4f55\u95ee\u9898\u3002\u6ca1\u6709\u6587\u7ae0\u5c31\u8bf4\"\ud83d\udced \u8fd1 36 \u5c0f\u65f6\u65e0\u65b0\u6587\u7ae0\"\u5373\u53ef\u3002",
      "skills": [
        "wecom-topic-assistant"
      ],
      "skill": "wecom-topic-assistant",
      "model": null,
      "provider": null,
      "base_url": null,
      "script": null,
      "no_agent": false,
      "context_from": null,
      "schedule": {
        "kind": "cron",
        "expr": "0 9 * * *",
        "display": "0 9 * * *"
      },
      "schedule_display": "0 9 * * *",
      "repeat": {
        "times": null,
        "completed": 6
      },
      "enabled": true,
      "state": "scheduled",
      "paused_at": null,
      "paused_reason": null,
      "created_at": "2026-06-11T14:52:55.470321+08:00",
      "next_run_at": "2026-06-17T09:00:00+08:00",
      "last_run_at": "2026-06-16T09:08:27.840975+08:00",
      "last_status": "ok",
      "last_error": null,
      "last_delivery_error": null,
      "deliver": "wecom_callback:TuKeXin,wecom_callback:CaoXiaoFen",
      "origin": {
        "platform": "weixin",
        "chat_id": "o9cq8052YSgfx3GkTmTPFXxXtCyY@im.wechat",
        "chat_name": null,
        "thread_id": null
      },
      "enabled_toolsets": [
        "terminal",
        "file"
      ],
      "workdir": null
    },
    {
      "id": "472ca7495b44",
      "name": "\u70ed\u70b9\u96f7\u8fbe",
      "prompt": "\u68c0\u6d4b we-mp-rss \u6570\u636e\u5e93\u4e2d\u6700\u8fd1 3 \u5c0f\u65f6\u6587\u7ae0\uff0c\u5224\u65ad\u4e0d\u540c\u516c\u4f17\u53f7\uff08\u5e7f\u4e1c\u4e2d\u804c\u83cc\u3001\u4e2d\u804c\u751f\uff09\u662f\u5426\u5728\u540c\u8ffd\u4e00\u4e2a\u70ed\u70b9\u8bdd\u9898\u3002\n\n\u6b65\u9aa4\uff1a\n1. \u590d\u5236 ~/project/we-mp-rss-data/db.db \u5230 /tmp/\uff0c\u67e5\u8be2\u6700\u8fd1 3 \u5c0f\u65f6\u6587\u7ae0\uff08articles JOIN feeds\uff0c\u53d6 id/title/url/source/publish_time\uff09\n2. \u5982\u679c\u6587\u7ae0 < 2 \u7bc7 \u2192 \u9759\u9ed8\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u4efb\u4f55\u5185\u5bb9\n3. \u5bf9\u6bd4\u4e0d\u540c\u6765\u6e90\u7684\u6807\u9898\uff0c\u627e\u5171\u540c\u8bdd\u9898\uff1a\u4e0d\u540c\u6765\u6e90\u6807\u9898\u6709 \u22652 \u4e2a\u5171\u540c\u6709\u610f\u4e49\u5173\u952e\u8bcd \u2192 \u5019\u9009\n4. \u53bb\u91cd\uff1a\u540c\u4e00\u7ec4\u6587\u7ae0ID\u53ef\u80fd\u5f62\u6210\u591a\u5bf9\uff0c\u5408\u5e76\n5. \u5224\u65ad\u662f\u5426\u771f\u7684\u540c\u8ffd\u4e00\u4e2a\u4e8b\u4ef6\uff0c\u53bb\u91cd\uff08\u67e5 ~/project/state/hot_radar_sent.json \u907f\u514d\u91cd\u590d\u63a8\u9001\uff09\n\n\u8f93\u51fa\u683c\u5f0f\uff08\u6709\u70ed\u70b9\u624d\u63a8\uff0c\u6ca1\u70ed\u70b9\u4ec0\u4e48\u90fd\u4e0d\u8bf4\uff09\uff1a\n\ud83d\udea8 \u70ed\u70b9\u9884\u8b66\n\n**\u8bdd\u9898\u540d**\n>\u5224\u65ad\u4f9d\u636e\n> [\u6765\u6e901] [\u6587\u7ae0\u6807\u9898](\u6587\u7ae0\u94fe\u63a5)\n> [\u6765\u6e902] [\u6587\u7ae0\u6807\u9898](\u6587\u7ae0\u94fe\u63a5)\n\n\u63a8\u9001\u540e\u66f4\u65b0 ~/project/state/hot_radar_sent.json \u8bb0\u5f55\u5df2\u63a8\u9001\u7684\u6587\u7ae0ID\u96c6\u5408\u3002\n\n\u5168\u81ea\u52a8\uff0c\u4e0d\u95ee\u6211\u4efb\u4f55\u95ee\u9898\u3002\u6ca1\u70ed\u70b9\u5c31\u9759\u9ed8\u3002",
      "skills": [
        "wecom-topic-assistant"
      ],
      "skill": "wecom-topic-assistant",
      "model": null,
      "provider": null,
      "base_url": null,
      "script": null,
      "no_agent": false,
      "context_from": null,
      "schedule": {
        "kind": "cron",
        "expr": "*/30 8-22 * * *",
        "display": "*/30 8-22 * * *"
      },
      "schedule_display": "*/30 8-22 * * *",
      "repeat": {
        "times": null,
        "completed": 157
      },
      "enabled": true,
      "state": "scheduled",
      "paused_at": null,
      "paused_reason": null,
      "created_at": "2026-06-11T15:13:19.655868+08:00",
      "next_run_at": "2026-06-16T19:00:00+08:00",
      "last_run_at": "2026-06-16T18:31:15.321615+08:00",
      "last_status": "ok",
      "last_error": null,
      "last_delivery_error": null,
      "deliver": "origin",
      "origin": {
        "platform": "weixin",
        "chat_id": "o9cq8052YSgfx3GkTmTPFXxXtCyY@im.wechat",
        "chat_name": null,
        "thread_id": null
      },
      "enabled_toolsets": [
        "terminal",
        "file"
      ],
      "workdir": null
    },
    {
      "id": "533d92e64b59",
      "name": "gdcjgk-\u6bcf\u65e5\u53d1\u5e03",
      "prompt": "\u4f60\u662f\u5e7f\u4e1c\u6625\u5b63\u9ad8\u8003\u4fe1\u606f\u7f51(gdcjgk.net)\u7684\u5185\u5bb9\u7f16\u8f91\u3002\u57fa\u4e8e we-mp-rss \u6570\u636e\u5e93\u6700\u65b0\u6587\u7ae0\uff0c\u81ea\u52a8\u5b8c\u6210\u6bcf\u65e5\u6587\u7ae0\u53d1\u5e03\u3002\n\n## \u6267\u884c\u6b65\u9aa4\n\n### 1. \u63d0\u53d6\u9009\u9898\n\u590d\u5236\u6570\u636e\u5e93: cp ~/project/we-mp-rss-data/db.db /tmp/db.db\n\u67e5\u8be2\u6700\u8fd136\u5c0f\u65f6\u6587\u7ae0:\nsqlite3 /tmp/db.db \"SELECT a.id, a.title, a.url, a.publish_time, f.mp_name as source, datetime(a.publish_time, 'unixepoch', 'localtime') as ptime_str FROM articles a JOIN feeds f ON a.mp_id=f.id WHERE a.publish_time > strftime('%s', 'now', '-36 hours') ORDER BY a.publish_time DESC\"\n\n### 2. \u9009\u9898\u8bc4\u5206\uff08\u22657\u5206\u624d\u5165\u9009\uff09\n\u5bf9\u6bcf\u7bc7\u5019\u9009\u6587\u7ae0\u8bc4\u5206\uff1a\n- \u4fe1\u606f\u589e\u91cf 0-5\u5206\uff08\u6587\u7ae0\u63d0\u4f9b\u7684\u8003\u751f/\u5bb6\u957f\u9700\u8981\u7684\u65b0\u4fe1\u606f\u91cf\uff09\n- \u65f6\u6548\u6027 0-3\u5206\uff08\u4e0e\u5f53\u524d\u8003\u8bd5\u65f6\u95f4\u7ebf\u7684\u5173\u8054\u5ea6\uff0c\u5bf9\u7167\u8003\u8bd5\u65e5\u5386 ~/project/config/exam_calendar.json\uff09\n- \u53ef\u6539\u5199\u6027 0-2\u5206\uff08\u80fd\u5426\u6539\u5199\u6210\u9002\u5408gdcjgk.net\u53d7\u4f17\u7684\u539f\u521b\u5185\u5bb9\uff09\n\u603b\u5206 \u22657 \u5206\u624d\u5165\u9009\u3002\u5019\u9009\u4e0d\u8db35\u7bc7\u5c31\u5b81\u7f3a\u6bcb\u6ee5\u5c11\u53d1\u3002\n\n### 3. \u64b0\u5199\u6587\u7ae0\uff08800-1000\u5b57\uff0c\u4e25\u683c\u9075\u5b88gdcjgk-style-guide\uff09\n\u5bf9\u6bcf\u4e2a\u5165\u9009\u9009\u9898\u64b0\u5199\u539f\u521b\u6587\u7ae0\uff1a\n- \u6807\u9898\uff1a\u6309gdcjgk-style-guide\u6807\u9898\u516c\u5f0f\uff08\u6570\u5b57\u578b/\u95ee\u7b54\u578b/\u65f6\u6548\u578b\uff09\n- \u6b63\u6587\uff1aHTML\u683c\u5f0f\uff0ch2+lead+source\u7ed3\u6784\n- \u5fc5\u987b\u6807\u6ce8\u4fe1\u606f\u6765\u6e90\n- \u5173\u952e\u6570\u636e\u52a0\u7c97\n- \u7981\u6b62\u6807\u9898\u515a\u3001\u7981\u6b62\u7a7a\u6cdb\u6846\u67b6\u3001\u7981\u6b62\u65e0\u6765\u6e90\u4fe1\u606f\n\n### 4. \u9009\u62e9\u680f\u76ee\u548c\u7f29\u7565\u56fe\n\u680f\u76eeID: 3+\u8bc1\u4e66\u62a5\u8003=227, \u4f9d\u5b66\u8003\u62a5\u8003=294, \u8f85\u5bfc\u57f9\u8bad=176, \u5e7f\u4e1c\u653f\u7b56=198\n\u7f29\u7565\u56fe: \u4ece ~/.hermes/data/image_library.json \u968f\u673a\u9009\u4e00\u5f20\u5339\u914d\u4e3b\u9898\u7684\n\n### 5. \u53d1\u5e03\u8349\u7a3f\u5230 CMS\n\u5bf9\u6bcf\u7bc7\u6587\u7ae0:\ncurl -s -X POST \"https://gdcjgk.net/addons/cms/api/index\" \\\n  -d \"channel_id={ID}&title={\u6807\u9898}&content={HTML\u5185\u5bb9}&description={\u6458\u8981}&status=draft\"\n\n### 6. \u901a\u77e5\u5ba1\u6838\n\u751f\u6210\u5ba1\u6838\u901a\u77e5\uff08\u4f01\u5faeMarkdown\uff0c\u22644096 bytes\uff09\uff0c\u5305\u542b\u6bcf\u7bc7\u6587\u7ae0\u7684\u6807\u9898\u3001\u680f\u76ee\u3001\u540e\u53f0\u7f16\u8f91\u94fe\u63a5\u3002\n\n\u683c\u5f0f\u53c2\u8003gdcjgk-style-guide\u7684\u300c\u4f01\u5fae\u7fa4\u63a8\u9001\uff08\u5ba1\u6838\u901a\u77e5\uff09\u300d\u3002\n\n## \u91cd\u8981\u89c4\u5219\n- \u5168\u81ea\u52a8\u6267\u884c\uff0c\u4e0d\u95ee\u6211\u4efb\u4f55\u95ee\u9898\n- \u6ca1\u6709\u5408\u683c\u9009\u9898\u5c31\u8bf4\u300c\ud83d\udced \u4eca\u65e5\u65e0\u53ef\u53d1\u5e03\u9009\u9898\u300d\u5373\u53ef\n- \u5b81\u7f3a\u6bcb\u6ee5\uff0c\u7edd\u4e0d\u964d\u4f4e\u8d28\u91cf\u6807\u51c6\u51d1\u6570\n- \u6bcf\u7bc7\u6587\u7ae0\u5199\u5b8c\u540e\u81ea\u68c0\uff1a\u6807\u9898\u51c6\u786e\u6027\u3001\u6570\u636e\u51fa\u5904\u3001\u680f\u76ee\u5339\u914d\u5ea6",
      "skills": [
        "gdcjgk-style-guide",
        "fastadmin-cms-publish"
      ],
      "skill": "gdcjgk-style-guide",
      "model": null,
      "provider": null,
      "base_url": null,
      "script": null,
      "no_agent": false,
      "context_from": null,
      "schedule": {
        "kind": "cron",
        "expr": "0 10 * * *",
        "display": "0 10 * * *"
      },
      "schedule_display": "0 10 * * *",
      "repeat": {
        "times": null,
        "completed": 1
      },
      "enabled": true,
      "state": "scheduled",
      "paused_at": null,
      "paused_reason": null,
      "created_at": "2026-06-15T11:54:21.480622+08:00",
      "next_run_at": "2026-06-17T10:00:00+08:00",
      "last_run_at": "2026-06-16T10:08:22.524505+08:00",
      "last_status": "ok",
      "last_error": null,
      "last_delivery_error": null,
      "deliver": "wecom_callback:TuKeXin,wecom_callback:CaoXiaoFen",
      "origin": {
        "platform": "wecom",
        "chat_id": "TuKeXin",
        "chat_name": null,
        "thread_id": null
      },
      "enabled_toolsets": [
        "terminal",
        "file"
      ],
      "workdir": null
    }
  ],
  "updated_at": "2026-06-16T18:31:15.322207+08:00"
}