A scheduled cybersecurity intelligence pipeline that aggregates threat data from RSS feeds, APIs, and web scraping, then distributes structured alerts into five categorized Discord channels.
No server needed. No paid subscriptions. Just push to GitHub and it runs itself.
Video coming soon β will showcase live intelligence posts flowing into each Discord channel.
Demo1.mp4
Join the public Discord server to see the system in action:
| Channel | What you'll see |
|---|---|
π° #daily-news |
Daily security news digest |
π¨ #cve-updates |
CVE alerts β CVSS 3.0 to 10.0, color coded by severity |
π― @threat-intel |
APT reports, breach analysis, threat intelligence |
π #bug-bounty |
Public exploits, PoCs, and vulnerability research |
π οΈ #tools-resources |
New security tools and research papers |
Updates are automatically collected, categorized, and published multiple times per day from 20+ trusted cybersecurity sources.
The bot wakes up 5 times a day on GitHub Actions, pulls from 20+ sources across RSS feeds, public APIs, and web scraping, deduplicates everything so you never see the same article twice, and posts rich embed cards into your Discord channels. Each card shows a color-coded severity, the article title, a real summary, a clickable URL, and a native Discord link preview below it.
All CVEs from CVSS 3.0 and above are posted β color coded by severity so you can tell at a glance what needs immediate attention:
| Color | Emoji | Severity | CVSS Range |
|---|---|---|---|
| π΄ Red | π΄ | CRITICAL | 9.0 β 10.0 |
| π Orange | π | HIGH | 7.0 β 8.9 |
| π‘ Yellow | π‘ | MEDIUM | 4.0 β 6.9 |
| π΅ Blue | π΅ | LOW | 3.0 β 3.9 |
| βͺ Grey | βͺ | PENDING | Score not yet assigned |
Critical CVEs (9.0+) trigger an @everyone ping. All others post silently.
APT campaigns, nation-state activity, breach post-mortems, and in-depth malware analysis.
RSS feeds:
- Krebs on Security
- Schneier on Security
- ESET Research
- Check Point Research
- WeLiveSecurity
Scraped (no RSS):
- Mandiant Blog
- Unit42 by Palo Alto Networks
- Recorded Future Blog
- CrowdStrike Blog
- Microsoft Security Blog
Every CVE published in the last 24 hours with a CVSS score of 3.0 or above, sorted by severity. CISA-confirmed actively exploited vulnerabilities get a separate @everyone alert the moment they hit the KEV catalog.
Primary source:
- NVD / NIST CVE API v2.0 (with free API key for reliability)
Automatic fallback when NVD is down:
- CVEProject/cvelistV5 - official MITRE CVE list on GitHub (delta zip, updated every few hours)
- Packet Storm vulnerabilities feed
Always running alongside:
- CISA Known Exploited Vulnerabilities (KEV) catalog
Public PoC exploits, bug bounty disclosures, and cutting-edge vulnerability research.
RSS feeds:
- Exploit-DB
- HackerOne Hacktivity
- PortSwigger Research
- Chromium Bug Tracker
- Intigriti Blog
- Medium BugBountyWriteup
Scraped (no RSS):
- Google Project Zero
- watchTowr Labs
- Zero Day Initiative (ZDI)
The daily news cycle β breaches, ransomware, industry news, government advisories.
RSS feeds:
- Bleeping Computer
- The Hacker News
- SANS ISC Diary
- Dark Reading
- SecurityWeek
- Threatpost
- CIS Advisories
- Cyber Security News
Scraped (no RSS):
- Help Net Security
Newly created security repositories on GitHub + latest academic security research from ArXiv.
Sources:
- GitHub API β new repos tagged:
cybersecurity,penetration-testing,osint,bug-bounty - ArXiv cs.CR β cryptography and security research papers
git clone https://github.com/Errorcode-14/CyberIntel_Discord_System.git
cd CyberIntel_Discord_SystemWithout a key, the NVD API is rate-limited and often returns empty responses. The bot has a fallback (CVEProject GitHub) but the key keeps NVD reliable.
- Go to https://nvd.nist.gov/developers/request-an-api-key
- Enter your email β key arrives instantly in your inbox
- Add it as a GitHub secret named
NVD_API_KEY(see step 4)
For each of your 5 channels:
- Right-click the channel β Edit Channel
- Go to Integrations β Webhooks β New Webhook
- Name it
CyberIntel name* - Click Copy Webhook URL
Go to your repo β Settings β Secrets and variables β Actions β New repository secret
| Secret name | Value |
|---|---|
DISCORD_THREAT_INTEL |
Webhook URL for @threat-intel |
DISCORD_CVE_UPDATES |
Webhook URL for #cve-updates |
DISCORD_BUG_BOUNTY |
Webhook URL for #bug-bounty |
DISCORD_DAILY_NEWS |
Webhook URL for #daily-news |
DISCORD_TOOLS_RESOURCES |
Webhook URL for #tools-resources |
NVD_API_KEY |
Your NVD API key (free) |
GITHUB_TOKENis automatically provided by GitHub Actions β you don't need to add it.
Go to Actions tab β CyberIntel Discord System β Run workflow
First run takes about 5 minutes. Check your Discord - everything should start flowing in.
β οΈ GitHub Actions free tier does not guarantee exact run times. Actual runs may be delayed by 1β4 hours depending on GitHub's server load. This is normal and outside our control.
| Scheduled (IST) | Targets | Cron (UTC) |
|---|---|---|
| ~6:30 AM | CVE check + threat intel | 0 1 * * * (prev. day) |
| ~9:30 AM | Daily news digest | 0 4 * * * |
| ~1:30 PM | Full sweep β all channels | 0 8 * * * |
| ~5:30 PM | Bug bounty + tools | 0 12 * * * |
| ~9:30 PM | Research papers + wrap-up | 0 16 * * * |
Find the right feed list in src/bot.py and add your site:
DAILY_NEWS_FEEDS = [
# ... existing feeds ...
("https://yoursite.com/feed/", "Your Site Name"),
]Feed list β channel mapping:
DAILY_NEWS_FEEDSβ#daily-newsTHREAT_INTEL_FEEDSβ@threat-intelBUG_BOUNTY_FEEDSβ#bug-bounty
Step 1: Open the site in Chrome, press F12, click the arrow icon, hover over an article card to find the repeating wrapper, title element, and link element.
Step 2: Add a scrape block to the right function:
def fetch_daily_news_scraped() -> list:
items = []
# ... existing blocks ...
items += scrape(
url = "https://example.com/news/",
article_sel = "article", # repeating wrapper
title_sel = "h2", # title element
link_sel = "a", # link element
base_url = "https://example.com",
label = "Example Blog",
webhook_key = "daily_news",
color = "news",
)
return itemsFunction β channel:
fetch_daily_news_scraped()β#daily-newsfetch_threat_intel_scraped()β@threat-intelfetch_bug_bounty_scraped()β#bug-bounty
Common CSS patterns that work on most blogs:
# WordPress
article_sel = ".post, article"
title_sel = ".entry-title, h2.post-title"
link_sel = ".entry-title a"
# Card-based layouts
article_sel = ".card, .blog-card, .post-card"
title_sel = "h2, h3, .card-title"
link_sel = "a"
# Year-based archive pages (e.g. Help Net Security)
url = f"https://www.helpnetsecurity.com/{datetime.now().year}/"If scraping returns 0 items, the site is likely JavaScript-rendered (Cloudflare). Check if they have an RSS feed instead - most do.
Change the CVSS threshold β edit in run():
# Show only HIGH and above (7.0+)
nvd_items = fetch_nvd_cves(min_cvss=7.0, hours=24)
# Show everything from LOW (3.0+) β current default
nvd_items = fetch_nvd_cves(min_cvss=3.0, hours=24)Filter by keyword:
# Add inside run(), just before the send_embed call
KEYWORDS = ["ransomware", "zero-day", "rce", "actively exploited"]
if not any(k in item["title"].lower() for k in KEYWORDS):
skipped += 1
continueChange the schedule:
Edit cron lines in .github/workflows/cyber_intel.yml. Use crontab.guru to build a custom schedule. Times are UTC - subtract 5:30 for IST.
Every time the bot posts something, it saves a fingerprint of that item to sent_ids.json. GitHub Actions caches this file between runs using actions/cache. So even if an article stays in a feed for a week, it only ever gets posted once. Cache holds the last 2,000 items.
Check logs: Actions tab β click the latest run β click run-bot
| Log line | Meaning | Fix |
|---|---|---|
NVD empty response |
NVD API is down or rate-limited | Bot auto-switches to CVEProject fallback |
CVEProject GitHub failed: name 'zipfile' is not defined |
Missing imports in your file | Add import io and import zipfile at the top of bot.py |
β Failed |
Discord rejected the post | Check webhook URL is correct in secrets |
Webhook not configured |
Secret not set | Add the missing secret in GitHub Settings |
Scraped X: 0 items |
Selectors didn't match or site uses JS | Re-inspect HTML or switch to RSS |
403 Client Error |
Site blocked scraper (Cloudflare) | Use their RSS feed instead |
Rate limited |
Too many Discord posts at once | Bot handles this automatically |
$0. GitHub Actions free tier gives 2,000 minutes/month. This bot uses roughly 900 minutes/month (5 runs/day Γ ~6 min each).
CyberIntel_Discord_System/
βββ .github/
β βββ workflows/
β βββ cyber_intel.yml β schedule, secrets, Node.js 24
βββ src/
β βββ bot.py β all logic lives here
βββ requirements.txt β requests, feedparser, beautifulsoup4, lxml
βββ .gitignore
βββ README.md