StavEitam/VeriCheckyBot

GitHub: StavEitam/VeriCheckyBot

一款多源威胁情报驱动的 Telegram 机器人,为以色列用户实时分析可疑链接和截图中的 URL 是否为钓鱼或诈骗。

Stars: 0 | Forks: 0

# Veri — Telegram 钓鱼检测机器人 🛡️ 一款可实时检测钓鱼和诈骗链接的 Telegram 机器人,支持以**希伯来语**回复清晰的判定结果:安全、可疑或危险——并提供应对建议。 专为通过 WhatsApp、SMS、电子邮件或 Telegram 收到可疑链接,并希望获得快速、可靠的二次验证意见的以色列用户打造——无需安装应用,无需注册账号。 ## 功能 - **多源威胁情报** — 交叉比对 VirusTotal、URLScan.io、Google Safe Browsing、PhishTank、OpenPhish 和 AbuseIPDB - **短链接解析** — 在扫描前自动展开 bit.ly、t.co、did.li 及其他短链接 - **品牌仿冒检测** — 识别针对 PayPal、Bank Hapoalim、Apple、Amazon 及其他 15 多个品牌的冒充行为 - **截图 OCR** — 使用 Tesseract 从图像中提取 URL - **希伯来语 AI 判定** — Claude 生成通俗易懂的希伯来语安全分析报告 - **智能缓存** — SQLite 缓存可避免重复扫描已知 URL,保护免费层 API 配额 - **快速路径短路** — 检测到已确认的威胁时,跳过响应缓慢的 API ## 工作原理 ``` User sends message / photo ↓ bot.py — Telegram handler ↓ Extract URLs (regex or OCR from screenshot) ↓ For each URL: ├── Unshorten (if bit.ly / t.co / etc.) │ ├── Wave 1 — fast checks (~1-2s each) │ ├── Google Safe Browsing │ ├── PhishTank │ ├── OpenPhish │ ├── AbuseIPDB │ ├── Brand lookalike detection │ └── Heuristic flags │ └── Wave 2 — deep checks (15-70s) — skipped if Wave 1 confirms threat ├── VirusTotal API (malicious / suspicious / harmless engine counts) ├── URLScan.io (redirect chain, final URL, risk score, tags) └── WHOIS domain age check ↓ translator.py — sends all signals to Claude API ↓ Claude responds in Hebrew: target domain + risk level + findings + recommendation ↓ Bot replies to user ``` ## 技术栈 | 组件 | 技术 | |-----------|------------| | 机器人框架 | python-telegram-bot 22.7 | | URL 威胁扫描 | VirusTotal API v3 | | 重定向 / 沙盒分析 | URLScan.io API | | 已知钓鱼数据库 | PhishTank API | | 实时钓鱼信息源 | OpenPhish(公共信息源) | | 安全浏览查询 | Google Safe Browsing API v4 | | IP 信誉 | AbuseIPDB API | | 域名年龄与仿冒检测 | python-whois + 自定义启发式算法 | | OCR(截图 → URL) | pytesseract + Pillow | | 希伯来语判定生成 | Anthropic Claude API (`claude-haiku-4-5`) | | 缓存 | 通过 `cache.py` 使用 SQLite(1 小时 TTL) | | HTTP 客户端 | httpx (异步) | | 密钥管理 | python-dotenv | | 运行时 | Python 3.11+ | ## 项目结构 ``` Veri/ ├── .env ← API keys (gitignored — never commit) ├── .env.example ← template for required keys ├── .gitignore ├── requirements.txt ├── bot.py ← Telegram handlers, main entry point ├── config.py ← loads .env into named constants ├── cache.py ← SQLite cache with TTL ├── translator.py ← builds prompt + calls Claude API → Hebrew verdict ├── test_sources.py ← manual integration test harness ├── tests/ ← automated test suite └── analyzer/ ├── url_checker.py ← VirusTotal, URLScan, GSB, PhishTank, OpenPhish, AbuseIPDB ├── domain_intel.py ← WHOIS age check + brand lookalike detection + heuristics └── ocr.py ← extract URLs from screenshot images ``` ## 安装说明 ### 前置条件 - Python 3.11+ - 系统已安装 [Tesseract OCR](https://github.com/UB-Mannheim/tesseract/wiki) - 所需语言包:`eng` + `heb` ### 1. 克隆并创建虚拟环境 ``` git clone cd Veri python -m venv venv venv\Scripts\activate # Windows # source venv/bin/activate # macOS / Linux ``` ### 2. 安装依赖 ``` pip install -r requirements.txt ``` ### 3. 配置 API 密钥 将 `.env.example` 复制到 `.env` 并填入您的密钥: ``` TELEGRAM_TOKEN=your_telegram_token_here VIRUSTOTAL_KEY=your_virustotal_key_here ANTHROPIC_KEY=your_anthropic_key_here URLSCAN_KEY=your_urlscan_key_here GOOGLE_SAFE_BROWSING_KEY=your_google_safe_browsing_key_here ``` #### 获取 API 密钥 | 密钥 | 来源 | 免费层 | |-----|--------|-----------| | `TELEGRAM_TOKEN` | Telegram 上的 [@BotFather](https://t.me/BotFather) | 免费 | | `VIRUSTOTAL_KEY` | [virustotal.com](https://www.virustotal.com) → API | 500 次/天 | | `ANTHROPIC_KEY` | [console.anthropic.com](https://console.anthropic.com) | 按量付费 | | `URLSCAN_KEY` | [urlscan.io](https://urlscan.io) → 账户 | 免费层 | | `GOOGLE_SAFE_BROWSING_KEY` | Google Cloud Console → Safe Browsing API | 免费层 | PhishTank 和 AbuseIPDB 密钥为可选项——如果没有配置,机器人会自动降级处理。 ### 4. 运行机器人 ``` python bot.py ``` 机器人将开始轮询 Telegram。向其发送任何包含 URL 或截图的消息即可。 ## 机器人行为 | 输入 | 响应 | |-------|----------| | 包含 URL 的文本 | 最多扫描 3 个 URL,并针对每个 URL 回复希伯来语判定结果 | | 照片 / 截图 | 通过 OCR 提取 URL,然后按上述方式进行扫描 | | 不包含 URL 的文本 | 提示用户粘贴消息或发送截图 | | `/start` | 希伯来语的问候与使用说明 | ## 希伯来语判定格式 系统会将 Claude 设置为以色列网络安全专家进行提示,其返回内容为: ``` 🔗 יעד הקישור: [final domain or "unknown"] ⚠️ רמת סיכון: גבוהה / בינונית / לא ניתן לאמת 📋 ממצאים: [2–3 lines summarising what was found] 🛑 המלצה: [specific action — e.g., "אל תלחץ על הקישור"] ``` 嵌入在 Claude 提示词中的关键规则: - 绝不表述为“该链接是安全的”——仅说明“未发现已知威胁” - 短链接始终被标记为无法验证 - 存在疑虑时,以警告代替安抚 ## 品牌仿冒检测 `analyzer/domain_intel.py` 会在与品牌列表进行比对之前,标准化常见的字符替换: | 替换 | 示例 | |---|---| | `0 → o` | `paypa0.com` | | `1 → l` | `app1e.com` | | `3 → e` | `n3tflix.com` | | `vv → w` | `vvhatsapp.com` | **监控的品牌:** PayPal, Apple, Google, Microsoft, Amazon, Facebook, Instagram, Netflix, Bank Hapoalim, Bank Leumi, Isracard, Max, Bit, Pepper, Poalim. ## 缓存 - **存储:** SQLite(`veri_cache.db`,首次运行时自动创建) - **TTL:** 1 小时 - **键值:** `vt:`, `us:`, `gsb:`, `pt:`, `abuse:`, `openphish:feed` - **目的:** 避免在同一小时内重复扫描相同 URL,保护免费 API 配额 ## 已知限制 - VirusTotal 免费层:每天 500 次请求 - URLScan 深度扫描需要 10–70 秒(内置异步轮询) - OCR 准确度取决于截图质量 - 机器人将每条消息的 URL 数量限制为 3 个,以保护 API 配额 - 按消息无状态处理——不保留持久的用户历史记录 ## 部署 (Render) 1. 推送到 GitHub 2. 在 [render.com](https://render.com) 创建新的 **Web Service**(免费层) 3. 设置启动命令:`python bot.py` 4. 在 Render 面板中将所有 `.env` 密钥添加为环境变量 5. 部署——机器人将持续轮询 Telegram ## 路线图 - [ ] 部署到 Render(免费层,全天候运行) - [ ] 针对 URLScan 超时的重试逻辑 - [ ] 群聊支持(仅在 @提及时响应) - [ ] 用户级速率限制 - [ ] `/report` 命令以标记漏报
标签:OCR, Python, SQLite, 威胁情报, 开发者工具, 无后门, 运行时操纵, 逆向工具, 钓鱼检测