Buzz Skill
Install, run, and manage a real-time news aggregator with Discord & Telegram push notifications. All configuration is done via REST API with hot-reload — no restarts needed.
Base URL: http://localhost:3848 (default, configurable via dashboard.port)
Quick Setup
CODEBLOCK0
The dashboard is at http://localhost:3848, settings page at /settings.html?lang=en.
Authentication
If a dashboard password is set, all /api/* endpoints require ?pw=PASSWORD:
CODEBLOCK1
If password is empty string, no authentication is needed.
IMPORTANT: All curl examples below omit ?pw= for brevity. If the server has a password configured, append ?pw=PASSWORD to every URL.
Auth failure response (HTTP 401):
CODEBLOCK2
API Endpoints
1. Get Current Config
CODEBLOCK3
Returns the full configuration JSON. Sensitive fields (apiKey, token, botToken, password) are redacted as "••••••" in the response.
2. Update Config (Partial, Hot-Reload)
INLINECODE9 accepts partial updates. Only send the sections you want to change.
Enable Jin10 with 10-second polling:
CODEBLOCK4
Disable Polymarket:
CODEBLOCK5
Set Discord webhook:
CODEBLOCK6
Enable Telegram:
CODEBLOCK7
Add an RSS source:
CODEBLOCK8
Note: rssFeeds is an array — sending it replaces the entire array, not appends.
Configure OpenNews AI filtering:
CODEBLOCK9
Configure Polymarket alerts:
CODEBLOCK10
Set AI translation model:
CODEBLOCK11
Success response:
CODEBLOCK12
Validation error response:
CODEBLOCK13
3. Get Source Status
CODEBLOCK14
Response:
CODEBLOCK15
Each key is a source identifier. RSS sources are prefixed with rss: followed by their feed URL.
4. Manage KOL Tracking List
List all tracked accounts:
CODEBLOCK16
Response:
CODEBLOCK17
Add a KOL:
CODEBLOCK18
Response:
CODEBLOCK19
If already exists:
CODEBLOCK20
Remove a KOL:
CODEBLOCK21
Response:
CODEBLOCK22
If username not found:
CODEBLOCK23
Username strings are trimmed and @ prefix is automatically stripped.
5. Health Check
CODEBLOCK24
Response:
CODEBLOCK25
- -
clients: number of active SSE connections - INLINECODE14 : number of events in memory
No authentication required.
6. Server-Sent Events (Live Stream)
CODEBLOCK26
Streams real-time news events as SSE. On connection, all historical events are sent first, then new events arrive in real-time. Heartbeat every 15 seconds.
Full Configuration Schema
jin10
| Field | Type | Default | Validation | Description |
|---|
| INLINECODE15 | boolean | INLINECODE16 | | Enable Jin10 flash news |
| INLINECODE17 |
number |
15000 | >= 5000 | Poll interval in milliseconds |
|
onlyImportant | boolean |
true | | Only push important items |
blockbeats
| Field | Type | Default | Validation | Description |
|---|
| INLINECODE21 | boolean | INLINECODE22 | | Enable BlockBeats |
| INLINECODE23 |
number |
30000 | >= 5000 | Poll interval |
|
onlyImportant | boolean |
true | | Only push important items |
|
lang | string |
"cht" | | Language:
cht (Trad. Chinese),
en,
cn (Simp. Chinese) |
rssFeeds (array)
| Field | Type | Default | Validation | Description |
|---|
| INLINECODE32 | boolean | INLINECODE33 | | Enable this feed |
| INLINECODE34 |
string | | | Display name |
|
feedUrl | string | | must start with
http(s):// | RSS/Atom feed URL |
|
pollIntervalMs | number |
300000 | >= 5000 | Poll interval |
|
color | number | | | Discord embed color as integer (e.g.
3447003 =
#3498DB) |
x6551
| Field | Type | Default | Validation | Description |
|---|
| INLINECODE42 | boolean | INLINECODE43 | | Enable X tweet monitoring |
| INLINECODE44 |
string |
"https://ai.6551.io" | must start with
http(s):// | API base URL |
|
token | string | | | API token from
6551.io/mcp |
|
pollIntervalMs | number |
3600000 | >= 5000 | Poll interval |
|
kolSyncIntervalMs | number |
300000 | | KOL list refresh interval |
|
kols | string[] |
[] | | Usernames to monitor (without @) |
opennews
| Field | Type | Default | Validation | Description |
|---|
| INLINECODE54 | boolean | INLINECODE55 | | Enable OpenNews AI news |
| INLINECODE56 |
number |
60000 | >= 5000 | Poll interval |
|
minScore | number |
70 | 0-100 | Minimum AI score to push |
|
signals | string[] |
[] | | Filter:
"long",
"short",
"neutral" (empty = all) |
|
coins | string[] |
[] | | Filter by coin symbols, e.g.
["BTC","ETH"] (empty = all).
OpenNews-only — other sources (Jin10, BlockBeats, RSS, Polymarket) cannot be coin-filtered. |
|
engineTypes | string[] |
[] | | Filter:
"news",
"listing",
"onchain",
"meme",
"market" (empty = all).
OpenNews-only. |
polymarket
| Field | Type | Default | Validation | Description |
|---|
| INLINECODE75 | boolean | INLINECODE76 | | Enable Polymarket monitoring |
| INLINECODE77 |
number |
180000 | >= 5000 | Price check interval |
|
marketRefreshMs | number |
600000 | >= 60000 | Market list refresh interval |
|
minChangePp | number |
5 | | Min percentage point change to alert |
|
zThreshold | number |
2.5 | > 0 | Z-Score anomaly threshold (0 = off) |
|
volSpikeThreshold | number |
2.0 | > 0 | Volume spike multiplier |
|
minLiquidity | number |
10000 | >= 0 | Min market liquidity in USD |
|
rollingWindowMinutes | number |
30 | | Window for price change calculation |
|
cooldownMs | number |
900000 | >= 60000 | Min interval before re-alerting same market |
|
tagIds | number[] |
[] | | Only track these categories (empty = all) |
|
excludeTagIds | number[] |
[] | | Exclude these categories |
Polymarket Tag IDs:
Politics |
| 120 | Finance |
| 1401 | Tech |
| 596 | Culture |
| 100265 | Geopolitics |
| 100639 | Sports |
grok (AI Translation)
| Field | Type | Default | Validation | Description |
|---|
| INLINECODE97 | string | | | API key for translation |
| INLINECODE98 |
string |
"grok-4.1-fast" | | Model name (any OpenAI-compatible) |
|
baseUrl | string |
"https://api.x.ai/v1" | must start with
http(s):// | API endpoint |
Supported models: grok-4.1-fast, gpt-4o-mini, gpt-4.1-mini, claude-sonnet-4-6, claude-haiku-4-5-20251001, gemini-2.0-flash, or any OpenAI-compatible model.
discord
| Field | Type | Default | Description |
|---|
| INLINECODE109 | string | INLINECODE110 | Discord webhook URL (simple mode) |
| INLINECODE111 |
string |
"" | Discord bot token (advanced mode) |
|
channelId | string |
"" | Discord channel ID (required for bot mode) |
Use either webhookUrl or botToken + channelId, not both.
telegram
| Field | Type | Default | Description |
|---|
| INLINECODE118 | boolean | INLINECODE119 | Enable Telegram notifications |
| INLINECODE120 |
string |
"" | Telegram bot token from @BotFather |
|
chatId | string |
"" | Target chat/group/channel ID |
dashboard
| Field | Type | Default | Validation | Description |
|---|
| INLINECODE124 | number | INLINECODE125 | 1024-65535 | HTTP server port (restart required) |
| INLINECODE126 |
string |
"" | | Access password (empty = no auth) |
Common Workflows
Check what's currently running
CODEBLOCK27
Enable a source and verify
CODEBLOCK28
Set up Discord + Telegram dual push
CODEBLOCK29
Add a new RSS feed (without losing existing ones)
IMPORTANT: rssFeeds is an array. POSTing it replaces the entire list. You must GET first, append, then POST back.
Step 1 — Get current feeds:
CODEBLOCK30
Step 2 — POST the full array with the new feed appended:
CODEBLOCK31
Same pattern applies when removing or editing an RSS feed — always send the complete updated array.
Remove an RSS feed
GET current list, remove the target, POST back the remaining array.
CODEBLOCK32
Add an item to any array field (general pattern)
When the user says "also add X", always follow GET → modify → POST:
CODEBLOCK33
Same pattern applies to opennews.signals, opennews.coins, opennews.engineTypes, polymarket.excludeTagIds.
Monitor high-impact crypto news only
CODEBLOCK34
Track new KOL and verify
CODEBLOCK35
Important Rules
Array fields are REPLACED, never merged
The config deep-merge only merges plain objects. All array fields are completely replaced when you POST them. If the user wants to add an item to an existing list, you MUST GET the current config first, modify the array, then POST back.
Array fields that require GET-first when adding/removing items:
| Field | Example "add" intent |
|---|
| INLINECODE133 | "Add CoinDesk RSS" — GET current feeds, append, POST full array |
| INLINECODE134 |
"Also track Sports" — GET current tagIds, append
100639, POST |
|
polymarket.excludeTagIds | "Also exclude Culture" — same pattern |
|
opennews.signals | "Also show long signals" — GET, append
"long", POST |
|
opennews.coins | "Also track SOL" — GET, append
"SOL", POST |
|
opennews.engineTypes | "Also include listings" — GET, append
"listing", POST |
Exception — KOLs have a safe endpoint: Use POST /api/kols with action: "add" or "remove". This does NOT require GET-first. Do NOT modify x6551.kols via POST /api/config — use the dedicated endpoint instead.
When the user says "set to" (replace entire list) instead of "add", you can POST directly without GET-first. Example: "I only want Crypto and Finance" → {"polymarket": {"tagIds": [21, 120]}} is fine.
Other rules
- 1. Object sections support partial update. You can POST just
{"jin10": {"enabled": false}} without affecting other jin10 fields or other sections. - Sensitive fields are redacted in GET responses as
"••••••". When POSTing, redacted values are automatically preserved (not overwritten). - All changes are hot-reloaded — no restart needed, except
dashboard.port. - The
x6551.token is shared between X tweet monitor and OpenNews. - Get your 6551 API token at https://6551.io/mcp
Error Responses
| HTTP Status | Body | Cause |
|---|
| 401 | INLINECODE153 | Missing or wrong ?pw= password |
| 400 |
{ "ok": false, "errors": [...] } | Validation failed (array of error strings) |
| 400 |
{ "ok": false, "error": "Invalid JSON" } | Malformed request body |
| 404 |
{ "error": "Not found" } | Unknown API route |
Buzz 技能
安装、运行并管理一个实时新闻聚合器,支持 Discord 和 Telegram 推送通知。所有配置均通过 REST API 完成,支持热重载——无需重启。
基础 URL: http://localhost:3848(默认,可通过 dashboard.port 配置)
快速设置
bash
git clone https://github.com/zxcnny930/buzz.git
cd buzz
npm install
cp config.example.json config.json
npm start
仪表盘位于 http://localhost:3848,设置页面位于 /settings.html?lang=en。
身份验证
如果设置了仪表盘密码,所有 /api/* 端点都需要 ?pw=PASSWORD:
bash
curl -s http://localhost:3848/api/config?pw=YOUR_PASSWORD
如果密码为空字符串,则无需身份验证。
重要提示:以下所有 curl 示例为简洁起见省略了 ?pw=。如果服务器配置了密码,请在每个 URL 后附加 ?pw=PASSWORD。
认证失败响应(HTTP 401):
json
{ ok: false, error: Unauthorized }
API 端点
1. 获取当前配置
bash
curl -s http://localhost:3848/api/config
返回完整的配置 JSON。敏感字段(apiKey、token、botToken、password)在响应中会被替换为 ••••••。
2. 更新配置(部分更新,热重载)
POST /api/config 接受部分更新。只需发送您想要更改的部分。
启用金十数据,轮询间隔 10 秒:
bash
curl -s -X POST http://localhost:3848/api/config \
-H Content-Type: application/json \
-d {jin10: {enabled: true, pollIntervalMs: 10000}}
禁用 Polymarket:
bash
curl -s -X POST http://localhost:3848/api/config \
-H Content-Type: application/json \
-d {polymarket: {enabled: false}}
设置 Discord webhook:
bash
curl -s -X POST http://localhost:3848/api/config \
-H Content-Type: application/json \
-d {discord: {webhookUrl: https://discord.com/api/webhooks/...}}
启用 Telegram:
bash
curl -s -X POST http://localhost:3848/api/config \
-H Content-Type: application/json \
-d {telegram: {enabled: true, botToken: 123456:ABC-DEF, chatId: -1001234567890}}
添加 RSS 源:
bash
curl -s -X POST http://localhost:3848/api/config \
-H Content-Type: application/json \
-d {rssFeeds: [{enabled: true, name: CoinDesk, feedUrl: https://www.coindesk.com/arc/outboundfeeds/rss/?outputType=xml, pollIntervalMs: 300000, color: 3447003}]}
注意:rssFeeds 是一个数组——发送它会替换整个数组,而不是追加。
配置 OpenNews AI 过滤:
bash
curl -s -X POST http://localhost:3848/api/config \
-H Content-Type: application/json \
-d {opennews: {enabled: true, pollIntervalMs: 60000, minScore: 70, signals: [long], coins: [BTC, ETH], engineTypes: [news, listing]}}
配置 Polymarket 警报:
bash
curl -s -X POST http://localhost:3848/api/config \
-H Content-Type: application/json \
-d {polymarket: {enabled: true, minChangePp: 5, zThreshold: 2.5, volSpikeThreshold: 2.0, minLiquidity: 10000, tagIds: [21, 120], excludeTagIds: [100639]}}
设置 AI 翻译模型:
bash
curl -s -X POST http://localhost:3848/api/config \
-H Content-Type: application/json \
-d {grok: {apiKey: xai-..., model: grok-4.1-fast, baseUrl: https://api.x.ai/v1}}
成功响应:
json
{ ok: true }
验证错误响应:
json
{
ok: false,
errors: [polymarket.zThreshold must be > 0, dashboard.port must be 1024-65535]
}
3. 获取源状态
bash
curl -s http://localhost:3848/api/status
响应:
json
{
jin10: { active: true, interval: 15000 },
blockbeats: { active: true, interval: 30000 },
polymarket: { active: true, interval: 180000 },
x6551: { active: true, interval: 3600000 },
opennews: { active: false, interval: 60000 },
rss:https://www.blocktempo.com/feed/: { active: true, interval: 300000 }
}
每个键是一个源标识符。RSS 源以 rss: 为前缀,后跟其 feed URL。
4. 管理 KOL 跟踪列表
列出所有跟踪的账户:
bash
curl -s -X POST http://localhost:3848/api/kols \
-H Content-Type: application/json \
-d {action: list}
响应:
json
{ ok: true, kols: [elonmusk, VitalikButerin] }
添加 KOL:
bash
curl -s -X POST http://localhost:3848/api/kols \
-H Content-Type: application/json \
-d {action: add, username: caboronli}
响应:
json
{ ok: true, kols: [elonmusk, VitalikButerin, caboronli] }
如果已存在:
json
{ ok: true, message: already exists, kols: [elonmusk, VitalikButerin, caboronli] }
移除 KOL:
bash
curl -s -X POST http://localhost:3848/api/kols \
-H Content-Type: application/json \
-d {action: remove, username: elonmusk}
响应:
json
{ ok: true, kols: [VitalikButerin, caboronli] }
如果用户名未找到:
json
{ ok: false, error: not found, kols: [VitalikButerin, caboronli] }
用户名字符串会被修剪,@ 前缀会自动去除。
5. 健康检查
bash
curl -s http://localhost:3848/health
响应:
json
{ ok: true, clients: 2, history: 150 }
- - clients:活跃的 SSE 连接数
- history:内存中的事件数
无需身份验证。
6. 服务器推送事件(实时流)
bash
curl -s -N http://localhost:3848/sse
以 SSE 格式流式传输实时新闻事件。连接时,首先发送所有历史事件,然后实时到达新事件。每 15 秒发送一次心跳。
完整配置模式
jin10
| 字段 | 类型 | 默认值 | 验证 | 描述 |
|---|
| enabled | boolean | true | | 启用金十数据快讯 |
| pollIntervalMs |
number | 15000 | >= 5000 | 轮询间隔(毫秒) |
| onlyImportant | boolean | true | | 仅推送重要项目 |
blockbeats
| 字段 | 类型 | 默认值 | 验证 | 描述 |
|---|
| enabled | boolean | true | | 启用 BlockBeats |
| pollIntervalMs |
number | 30000 | >= 5000 | 轮询间隔 |
| onlyImportant | boolean | true | | 仅推送重要项目 |
| lang | string |