语言 / Language: 中文 | English
aiv123.com · AI tools directory, 600+ tools in one place
🚀 Recommended: ofox.ai
In short: One account for the latest GPT / Claude / Gemini and 100+ top models. First top-up gets an extra $3 credit.
Text, image, video, and embeddings in one place. Caching supported — repeat calls stay cheaper and faster.
👉 Sign up · Global dedicated lines · Enterprise SLA · No conversation retention
| ⚡️ Faster & Leaner | 🧠 Models & Modalities | 🛡️ Privacy |
|---|---|---|
| Global lines, enterprise SLA, plus caching | 100+ models · text / image / video / embeddings | No conversation retention |
Open source takes effort — sponsorship is welcome:
👉 爱发电 / Afdian
Security news RSS daily digest: aggregation, archive, search, and per-item AI analysis
Repo: github.com/shellsec/SECDaily · Issues: Issues
SECDaily aggregates security-related RSS feeds, produces Markdown/HTML daily digests, and supports optional AI summaries plus multi-channel push. The archive site supports date browsing, site-wide title search (including CVE / source), in-page filters for a single day, and one-click AI analysis per article (ChatGPT / Gemini / DeepSeek, with the analysis prompt copied automatically). You can publish it on GitHub Pages.
- 🔄 RSS auto-update: Checks and refreshes RSS OPML sources so stale remotes do not wipe local data
- 📰 Multi-source aggregation: Collects security news from multiple RSS feeds
- 🤖 AI daily summary (optional): When enabled, writes
AISummaryYYYY-MM-DD.mdand can push it; requires AI API settings in.env - 🔍 Requirement keyword analysis (optional API):
oneapi.analyze_security_report_fenleimatches 8 security-requirement categories; falls back to keywords without AI; call it yourself — not wired into the daily crawl - 📄 Multi-format output: Generates Markdown and HTML digests
- 🔎 Archive & search: Static site under
archive/; home page has date archive + title search; daily pages support title/CVE filters - 🧠 Per-item AI analysis: ChatGPT → Gemini → DeepSeek next to each title; copies “title + original URL + structured analysis prompt” and opens the AI
- 🌐 GitHub Pages: Deploy the archive via Actions with no extra secrets (see deploy section below)
- 📤 Multi-channel push: Feishu, WeCom, DingTalk, Telegram, email, etc. (
config.json→bot) - ⏰ Scheduling: Run on a cron-like daily schedule
- 🛡️ Safe RSS updates: Validates remote content before replacing local OPML files
- 🔌 REST API / MCP: Query digests, search articles and CVEs from scripts or Cursor / Claude (see API调用说明.md)
Archive home (date browse / title search):
Daily page (source nav, title filter, word cloud, CVE stats, etc.):
Per-item AI analysis (ChatGPT → Gemini → DeepSeek on each title; copy prompt and jump):
yarb.py: Main program (scheduling + AI summary)yarb_one.py: Simplified main entryconfig.json/config.example.json,.env.example: Config and secret templates (do not commitconfig.jsonor.env).github/workflows/pages.yml: GitHub Pages deploy workflowconvert_today.py: Markdown → HTML; builds archive index and search dataindex_template.html/template.html: Archive home and daily page templates (header/footer link to the GitHub repo; URL isSITE_GITHUB_URLinconvert_today.py)archive/: Historical digests (HTML/Markdown) andsearch-index.json(generated in CI)scripts/build_archive_site.py: Local/CI builder for the archive site and search indexoneapi.py: AI summary helpersbot.py: Push botssecdaily_data.py: Archive query layer shared by API and MCPapi_server.py: REST API and HTTP MCP (http://127.0.0.1:8765/mcp)mcp_server.py: MCP server (stdio fallback)connect_panel.html: One-click API / MCP panel on archive pagesAPI调用说明.md/mcp.example.json: API docs and MCP config templaterss/: RSS OPML sources
pip install -r requirements.txtMain dependencies:
feedparser: RSS parsinglistparser: OPML parsingrequests: HTTPschedule: Schedulingmarkdown: Markdown conversionjinja2: HTML templating
# Default: every day at 10:30; startup prints the next run time
python yarb.py
# Run once immediately (for testing)
python yarb.py --force
# Custom time
python yarb.py --cron "11:00"
# Force-refresh RSS sources
python yarb.py --updatepython convert_today.pyBuilds today’s HTML and updates archive/index.html, search-index.json (site-wide search), etc.
# Same process: REST http://127.0.0.1:8765/api/v1 MCP http://127.0.0.1:8765/mcp
python api_server.py
curl http://127.0.0.1:8765/api/v1/healthMCP defaults to a local URL. Cursor / Claude config:
{
"mcpServers": {
"secdaily": {
"url": "http://127.0.0.1:8765/mcp"
}
}
}On a LAN, replace 127.0.0.1 with the machine IP and start with --host 0.0.0.0. Use stdio (python mcp_server.py) only when HTTP is unavailable. Full endpoints: API调用说明.md.
| Capability | Where | Notes |
|---|---|---|
| Date archive | Repo root index.html (and archive/index.html) |
Browse past digests by year/month |
| Site-wide title search | Archive home → “Title search” | Searches titles, sources, CVE (needs search-index.json) |
| Jump to search from a daily page | Search box in daily HTML header | Opens archive home with the query |
| In-page filter | Daily HTML toolbar | Filters current page titles / CVE only; no index file |
| Word cloud & CVE stats | Daily HTML | Computed by convert_today.py from that day’s content |
| Per-item AI analysis | Daily list / title search results | ChatGPT → Gemini → DeepSeek; copies prompt then opens the AI |
| One-click API / MCP setup | Repo root index.html #connect panel |
Copy clone command, Cursor / Claude config, and REST examples |
Each article title has three buttons (fixed order):
| Button | Behavior |
|---|---|
| ChatGPT | Copies the full prompt; for short content also prefills via chatgpt.com/?q= |
| Gemini | Copies the full prompt, opens Gemini; paste with Ctrl+V |
| DeepSeek | Copies the full prompt, opens DeepSeek; paste with Ctrl+V |
After a click the button briefly shows “Copied” (~2s) on success; on failure a dialog shows the full text for manual copy.
Prompt includes: source, date, title, original URL (if any), and 7 analysis tasks (event classification, threat techniques, CVE/impact, defense response, related topics, reading tips, etc.). The AI is asked for Markdown output with a TL;DR first.
Notes:
- AI cannot read local
file://pages or digest HTML URLs, so we pass title + outbound article URL, not the page URL. - When opening HTML by double-click, clipboard falls back to
execCommand(usually works in Chrome / Edge). Preferhttp.serveror GitHub Pages for better compatibility. - Regenerate historical HTML to get the buttons:
python convert_today.py(today) orpython md_to_html.py(all archives).
Local preview (search works without GitHub deploy):
pip install markdown jinja2
python scripts/build_archive_site.py
cd archive && python -m http.server 8080
# Open http://127.0.0.1:8080/{
"rss": {
"auto_update": {
"enabled": true, // enable auto-update
"update_interval_days": 7 // interval in days
},
"CustomRSS": {
"enabled": true,
"filename": "CustomRSS.opml"
},
"CyberSecurityRSS": {
"enabled": true,
"url": "https://...",
"filename": "CyberSecurityRSS.opml"
}
}
}- Auto check: On startup, checks whether RSS source files need refresh
- Age check: Uses file mtime and
update_interval_days - Validation: Verifies downloaded content before replacing local files
- Failure safety: Keeps the local file if the remote is down or invalid
- When: Before each scheduled task run
- Conditions:
- File missing, or
- File older than
update_interval_days
- Validation:
- Non-empty content
- Valid OPML
- Contains usable feeds
- Safety:
- Write to a temp file first
- Replace only after validation
- Keep local file on failure
auto_update.enabled: enable/disable (default:true)auto_update.update_interval_days: interval in days (default:7)
Copy .env.example to .env and fill push secrets plus optional AI settings: AI_API_URL, AI_API_KEY, AI_MODEL, etc.
config_loader.py merges config.json with environment variables.
{
"AISummary": {
"enabled": false, // true: after digest, call AI to write AISummaryYYYY-MM-DD.md
"wechat": {
"enabled": false,
"corpid": "...",
"corpsecret": "...",
"agentid": "..."
},
"dingtalk": {
"enabled": false,
"access_token": "...",
"secret": "..."
}
}
}enabled: false(default): no AI summary file; RSS + HTML archive still run.enabled: true: configure AI in.env; on failure, skip summary and continue the main flow.wechat/dingtalk: optional separate push for the AI summary.
oneapi.analyze_security_report_fenlei() scores requirement-style text across 8 security categories (sensitive data, auth, payment, etc.).
With AISummary.enabled=true and a complete AI config it uses the model; otherwise (or on failure) it falls back to keywords. Call it from your own scripts, e.g.:
from oneapi import analyze_security_report_fenlei
result = analyze_security_report_fenlei(content)
result = analyze_security_report_fenlei(content, use_keyword_analysis=True) # force keywordsMultiple push channels are supported; see the bot and AISummary sections in config.json.
- Per-item AI analysis: ChatGPT / Gemini / DeepSeek one-click prompt copy + jump from digests and archive title search
- Archive site: GitHub Pages, site-wide title search, daily-page layout and filters
- RSS auto-update: Refresh sources on a configurable interval
- Safe updates: Validate remote OPML before replacing local data
- AI daily summary (optional):
AISummarygeneration and push - Keyword analysis API (optional): 8-category matching with keyword fallback
- Multi-channel push: Feishu, WeCom, DingTalk, Telegram, email, etc.
- Push cleanup: Removed QQ / go-cqhttp dependencies and config
- REST API / MCP: Query local digests, articles, and CVEs; see API调用说明.md
yarb.log: Main program logconvert_today.log: HTML conversion log
- Keep local RSS files when remote update fails
- Reject updates when content validation fails
- Network request timeout (30s)
- Markdown parse errors
- HTML generation errors
- Automatic fallback when AI analysis fails (keyword analysis)
- Silent fallback when AI config is missing (keywords, no noisy prompt)
- Content validation: Non-empty, correct format after download
- OPML parsing: Validate structure and feed count
- Atomic replace: Temp file → replace only after validation
- Rollback: Keep local file on failure
[+] File older than 7 days, updating: CyberSecurityRSS (last update: 2025-01-15 10:00:00)
[+] Update done: CyberSecurityRSS (150 feeds)
On failure:
[-] Update failed (OPML parse error: ...), keeping old file: CyberSecurityRSS
The archive can be published as a static site via GitHub Actions. Title search and date archive both work on Pages.
No. The workflow only publishes static files under archive/ and builds search-index.json from existing Markdown in CI.
GitHub provides GITHUB_TOKEN automatically; you do not need extra secrets for Pages.
If you later want Actions to run the daily crawl (yarb.py), configure DingTalk / WeCom / AI secrets separately — that is unrelated to Pages deploy.
- Push the code to GitHub (
mainormaster). - Repo Settings → Pages → Build and deployment → Source → GitHub Actions.
- Push a commit that includes
archive/, or manually run Deploy GitHub Pages under Actions. - After deploy: https://shellsec.github.io/SECDaily/ (archive index; repo: https://github.com/shellsec/SECDaily).
| Feature | Notes |
|---|---|
| Date archive | Year/month filter on the home page; no extra files |
| Title search | Needs CI-built search-index.json (~16MB; first load may be slow) |
| In-page filter | “Filter title or CVE” on a daily HTML page is local-only and always available |
| Per-item AI analysis | Available on daily pages and title-search results; copy prompt then open ChatGPT / Gemini / DeepSeek |
archive/search-index.json stays in .gitignore and is generated in CI before each deploy so the large file is not kept in Git history.
Local preview steps are under “Archive site & search” above.
Issues and PRs are welcome: Issues · Pull Requests.
- Follow PEP 8
- Add useful comments and docs
- Include tests where appropriate
- Run tests before submitting
Based on VulnTotal-Team/yarb. Thanks to the original authors.
MIT