autoreg-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
237
skills/ai-freebie-scanner/SKILL.md
Normal file
237
skills/ai-freebie-scanner/SKILL.md
Normal file
@@ -0,0 +1,237 @@
|
||||
---
|
||||
name: ai-freebie-scanner
|
||||
description: Multi-source AI freebie/API scanner v3 — scrapes 19 sources (forums, GitHub awesome-lists, HN, blogs, leak trackers, free API gateways) for free AI API keys and access. Deploys to 2 DO servers (SGP + NYC) with cron. Delivers findings to Telegram in @ikhdev1 style (emoji → title → что получаем → ссылка → хештеги).
|
||||
category: automation
|
||||
tags:
|
||||
- ai
|
||||
- scraping
|
||||
- free
|
||||
- api
|
||||
- telegram
|
||||
- digitalocean
|
||||
- cron
|
||||
triggers:
|
||||
- AI халява
|
||||
- бесплатные API ключи
|
||||
- free AI API
|
||||
- парсинг форумов AI
|
||||
- AI abuse scanner
|
||||
- халявный доступ
|
||||
- nodeloc куки
|
||||
- linux.do парсинг
|
||||
- ии абузы
|
||||
- ai freebie
|
||||
references:
|
||||
- references/scanner-v2-architecture.md
|
||||
- references/nodeloc-cookie-format.md
|
||||
- references/tg-mainsession-chats.md
|
||||
- references/post-format-ikhdev1.md
|
||||
- references/ru-free-ai-video-triage.md
|
||||
- references/deep-research-fanout-verification.md
|
||||
---
|
||||
|
||||
# AI Freebie Scanner v3
|
||||
|
||||
Парсит 19 источников на предмет бесплатных AI API ключей, доступов, jailbreak'ов.
|
||||
Работает на 2 DO серверах (SGP + NYC) + локально (Windows).
|
||||
Доставляет находки в Telegram @[REDACTED-NAME] в стиле @ikhdev1.
|
||||
|
||||
**Видео-триаж:** когда Влад кидает RU YouTube-видео "топовые модели БЕСПЛАТНО" и просит "сделай бесплатно" — см. `references/ru-free-ai-video-triage.md` (yt-dlp VTT-извлечение транскрипта, деконструкция метода, политика: не писать client-side обход премиума, предложить легальные альтернативы).
|
||||
|
||||
## Архитектура
|
||||
|
||||
Скрипт: `C:\Users\User\ai-abuse-scanner\scanner.py` (508 строк)
|
||||
Сервер: `/root/ai_scanner.py` на обоих дроплетах
|
||||
|
||||
Технологии: `aiohttp` + `BeautifulSoup` + `lxml`. Асинхронный параллельный сбор через `asyncio.gather`.
|
||||
|
||||
## Источники (v3 — 19 источников)
|
||||
|
||||
| Статус | Источник | URL/Метод | Тип |
|
||||
|--------|----------|-----------|-----|
|
||||
| 🟢 | NodeLoc | `/tag/ai`, `/tag/羊毛党`, `/tag/推广` | Форум (куки) |
|
||||
| 🟢 | Lolz.live | `/forums/86/`, `/forums/54/` | Форум |
|
||||
| 🟢 | Hacker News | `hn.algolia.com/api/v1/search` | JSON API |
|
||||
| 🟢 | GitHub Search | `github.com/search?q=...+type=repositories` | HTML |
|
||||
| 🟢 | GitHub awesome-lists | zukixa/cool-ai-stuff, cheahjs/free-llm-api-resources, zebbern/no-cost-ai, ShaikhWarsi/free-ai-tools | Raw README |
|
||||
| 🟢 | DuckDuckGo | `html.duckduckgo.com/html` | HTML поиск |
|
||||
| 🟢 | AIMLAPI | `aimlapi.com/best-ai-apis-for-free` | Статический блог |
|
||||
| 🟢 | GetAIperks | `getaiperks.com/...40-free-ai-api-keys...` | Статический гайд |
|
||||
| 🟢 | TowardsAI | `pub.towardsai.net/free-ai-apis-2026...` | Статья |
|
||||
| 🟢 | Coderfile | `coderfile.io/blog/free-apis-developers-2026` | Блог |
|
||||
| 🟢 | daily.dev | `daily.dev/posts/...` | Статья |
|
||||
| 🟢 | BazaarLink | `bazaarlink.ai/free` | Free API key |
|
||||
| 🟢 | Api.Airforce | `api.airforce/` | 100+ free models |
|
||||
| 🟢 | Ofox.ai | `ofox.ai/blog/free-llm-api-tiers...` | Блог |
|
||||
| 🟢 | OpenRouter | `openrouter.ai/blog/...free-llm-apis-compared` | Блог |
|
||||
| 🟢 | KeyLeaks | `ai-keys-leaks.begimher.com` | Трекер утечек (работает с серверов!) |
|
||||
| 🟢 | v2ex | `www.v2ex.com/api/topics/show.json?node_name={ai,python,cloudflare,vps}` | JSON API (public, stdlib-only friendly) |
|
||||
| 🟡 | Linux.do | через `r.jina.ai/https://linux.do/...` (включая .json-ленты: latest.json, c/welfare/34.json, tag/api) | Форум (CF обходится jina-ридером) |
|
||||
| 🟡 | Reddit | `api.pullpush.io/reddit/search/submission/?ids=<id>` (~1 req/20s) | JSON API (direct/old.reddit/jina — все блокированы) |
|
||||
| 🟢 | KeyLeaks | `ai-keys-leaks.begimher.com` | Трекер утечек (работает с серверов!) |
|
||||
|
||||
**Примечания:**
|
||||
- Linux.do и Reddit блокируют datacenter IP через Cloudflare — нужен headless браузер или жилые прокси. Даже Playwright получает CF Challenge ("Один момент...").
|
||||
- KeyLeaks (435K+ утекших AI ключей) работает только с серверных IP (локально DNS таймаут).
|
||||
- GitHub awesome-lists — самый жирный источник (до 180+ URL за прогон).
|
||||
- HN Algolia API — самый быстрый и надежный (JSON, без HTML-парсинга).
|
||||
- Блог-источники проверяются разово (по статическому ключу в стейте).
|
||||
- NodeLoc дает 30 тем со страницы AI-тегов, Lolz требует правильных селекторов (`.structItem`, не `.structItem--thread`).
|
||||
|
||||
## Quality Scoring (v3.1 — новая фича)
|
||||
|
||||
Функция `quality_score(item) → int` оценивает каждую находку от 1 до 10:
|
||||
|
||||
- **Прямой источник (+3-4):** NodeLoc, Lolz, KeyLeaks, BazaarLink, Airforce
|
||||
- **Модель/провайдер (+1):** claude, gpt-4, deepseek, glm, nvidia...
|
||||
- **Инструкции (+1):** register, signup, claim, setup, endpoint, url:
|
||||
- **Ключи/токены (+1):** api key, apikey, token, credits, $, credit
|
||||
- **Абуз/jailbreak (+2):** jailbreak, bypass, reverse, exploit, hack
|
||||
- **Детальный сниппет (+2-3):** длина >50 или >150 символов
|
||||
|
||||
Топ-15 по score попадают в Telegram. Остальные отсекаются. Это убирает шум из GitHub-списков (где много ссылок без контекста).
|
||||
|
||||
## Формат постов (@ikhdev1 стиль)
|
||||
|
||||
```html
|
||||
🔥 AI ABUZ DIGEST
|
||||
|
||||
✅ 🎮 <b>Название сервиса</b>
|
||||
<b>Что получаем:</b>
|
||||
• пункт 1
|
||||
• пункт 2
|
||||
• пункт 3
|
||||
🌐 <a href="url">Открыть</a> <i>Источник</i>
|
||||
#халява #api #claude #gpt #бесплатно
|
||||
|
||||
— — —
|
||||
AI Scanner v3 | 15 тем | @[REDACTED-NAME]
|
||||
```
|
||||
|
||||
**Статусы по score:**
|
||||
- ✅ score ≥ 8 — проверенные/жирные источники
|
||||
- 🆕 score ≥ 5 — новые находки
|
||||
- ⚠️ score < 5 — непроверенные
|
||||
|
||||
**КРИТИЧЕСКИ: HTML escaping.** ВСЁ проходит через `safe_html()`:
|
||||
- `&` → `&`, `<` → `<`, `>` → `>`, `"` → `"`
|
||||
- Контрольные символы (<32) заменяются на пробел
|
||||
- Telegram отклоняет сообщения с `"Unclosed start tag"` если где-то не экранирован `<`
|
||||
- Ссылки в href двойных кавычках: `<a href="url">` (не одиночных — ломается при наличии `'` в URL)
|
||||
|
||||
## Сервера (DO)
|
||||
|
||||
| Сервер | IP | Регион | Ресурсы | SSH Key | Статус |
|
||||
|--------|-----|--------|---------|---------|--------|
|
||||
| gothbreach-abuse-1 | [REDACTED-IP] | SGP | 8GB/2vCPU/160GB | do_access | ✅ Cron 15min + KH8 |
|
||||
| eni-nyc1 | [REDACTED-IP] | NYC | 4GB/2vCPU/80GB | do_access | ✅ Cron 15min + KH8 |
|
||||
| eni-sgp1 | [REDACTED-IP] | SGP | 1GB/2vCPU/160GB | do_gothbreach | ✅ Cron 15min + KH8 |
|
||||
| Alibaba ECS | [REDACTED-IP] | ap-southeast-1 | 16GB/8vCPU/99GB | sdas.pem (LOST) | ❌ offline |
|
||||
|
||||
**⚠️ SSH key per-server (2026-07-04):** eni-sgp1 uses `do_gothbreach` key, NOT `do_access`. Using do_access → "Permission denied (publickey)". Always check which key works: `for k in do_access do_gothbreach eni_key; do ssh -i ~/.ssh/$k root@IP hostname; done`.
|
||||
|
||||
**⚠️ eni-nyc1 may be OFF (2026-07-04):** If SSH times out, the droplet is powered off. Power on via DO API:
|
||||
```bash
|
||||
curl -X POST -H "Authorization: Bearer dop_v1_..." \
|
||||
"https://api.digitalocean.com/v2/droplets/581420317/actions" \
|
||||
-d '{"type":"power_on"}'
|
||||
# Wait 30s, then SSH works. Droplet IDs: gothbreach=580095930, nyc1=581420317, sgp1=581892235.
|
||||
```
|
||||
|
||||
SSH: `ssh -i ~/.ssh/do_access -o ControlMaster=no -o ControlPath=none -o StrictHostKeyChecking=no root@<IP>`
|
||||
|
||||
**Deploy на оба сервера одной командой:**
|
||||
```bash
|
||||
cat scanner.py | ssh root@[REDACTED-IP] "cat > /root/ai_scanner.py"
|
||||
cat scanner.py | ssh root@[REDACTED-IP] "cat > /root/ai_scanner.py"
|
||||
```
|
||||
|
||||
**Cross-server pipe transfer (2026-07-04):** When target server can't SSH to source (key mismatch), pipe through local machine:
|
||||
```bash
|
||||
ssh root@SOURCE "cat /root/kh8.py" | ssh root@TARGET "cat > /root/kh8.py"
|
||||
```
|
||||
This works even when TARGET has no SSH access to SOURCE. Use for deploying KH8/scanner from gothbreach-abuse-1 to other droplets.
|
||||
|
||||
**⚠️ ControlMaster socket corruption:** After multiple rapid SSH calls, `mux_client_request_session: read from master failed`. Fix: `rm -f ~/.ssh/cm-root@*` + always use `-o ControlMaster=no -o ControlPath=none` for one-shot commands.
|
||||
|
||||
**Cron:**
|
||||
```bash
|
||||
echo '*/15 * * * * cd /root && python3 ai_scanner.py >> /root/ai_scanner_cron.log 2>&1' | crontab -
|
||||
```
|
||||
|
||||
## NodeLoc куки
|
||||
|
||||
Нужны 5 куки. Формат в `scanner.py` → `NODELOC_COOKIES`:
|
||||
- `_forum_session` — основная (httpOnly, secure)
|
||||
- `_t` — долгоживущий токен (httpOnly, secure)
|
||||
- `__stripe_mid` + `__stripe_sid` — Stripe
|
||||
- `_bypass_cache` — `true`
|
||||
|
||||
Куки протухают. Актуальный набор всегда в коде сканера.
|
||||
|
||||
## Дедупликация
|
||||
|
||||
MD5 от URL → `seen_v3.json`. Лимит 10000 хешей. Первый запуск на новом месте даёт 185-238 находок, последующие — только свежие.
|
||||
|
||||
## TG Mainsession Scanner
|
||||
|
||||
Парсинг чатов @[REDACTED-NAME] через maintg MCP. Cron-job `400504e7dc83`, каждые 10 мин.
|
||||
|
||||
maintg credentials: API_ID=2040, API_HASH=[REDACTED-KEY]
|
||||
Session: `C:\Users\User\.hermes\mcp-servers\session_string.txt`
|
||||
Аккаунт: @dirgigh ([REDACTED-TGID]), видит диалоги @[REDACTED-NAME]
|
||||
|
||||
## NodeLoc/v2ex без куки (проверено 2026-09-25)
|
||||
|
||||
**NodeLoc куки НЕ обязательны для публичных лент:** `https://www.nodeloc.com/latest.json?order=created` и `https://www.nodeloc.com/top.json?period=weekly` отдают полные Discourse JSON (30 топиков) без авторизации — нужен только заголовок `Accept-Encoding: gzip` + ручная gunzip-обработка (иначе тело выглядит пустым, хотя HTTP 200; `size_download 0` без `--compressed` — это gzip, а не блок). Раздел «Питфолы» п.5 про протухающие куки относится только к tag-страницам и приватным разделам.
|
||||
|
||||
**CN-ключевые слова ОБЯЗАТЕЛЬНЫ для фильтрации NodeLoc/v2ex/hostloc:** русско-английский список (абуз/free/триал/бонус…) дал 0 находок на 30 свежих топиках; добавление CN-ключей дало 31. Рабочий набор: `福利, 免费, 白嫖, 薅羊毛, 优惠, 折扣, 抽奖, 送, 领取, 红包, 活动, 羊毛`. Скрипт-эталон: `C:/Users/User/tmp/abuse_scrape.py` (stdlib-only, urllib+gzip, JSONL-вывод в `tmp/abuse_forums_scrape.jsonl`).
|
||||
|
||||
**Статус источников на 2026-09-25 (curl, локальный IP):**
|
||||
- v2ex `api/topics/hot.json` — 200, работает без ключей
|
||||
- lolz.live/lolz.guru — Cloudflare с локального IP (тело 370 байт), нужен Firecrawl/прокси; zelenka.guru 000 без browser UA, 200 с полным Chrome UA
|
||||
- hostloc.com fid=45 — страница отдаётся (11KB), но стандартный Discuz-regex `class="s xst"` не матчит — верстка другая, селекторы пересобрать
|
||||
- findaicredits.com — 200, простой HTML, парсится regex'ом по внешним ссылкам (агрегатор AI-кредитов, свежак ежедневно)
|
||||
- linux.do — 403 (CF) с локального IP; xakfor.net — JS-loader (200, контента нет без браузера)
|
||||
|
||||
**Свежие примеры находок (nodeloc, 2026-09-25):** Luna $3000 free (t/110131), GPT-6 Luna 5B tokens (t/110672), Kimi K3 go-plan ×50 (t/110679), GLM 5.3 Flash 500M tokens (t/110393), Huawei Cloud 10M tokens/day forever (t/110774), Devin Cloud unlimited SWE-2 (t/110126), OpenXLab register-farm (t/110021).
|
||||
|
||||
## Deep research mode (fan-out субагентов + verification ladder)
|
||||
|
||||
Для задач «найди новые абузы/цели для авторега» — полный плейбук в `references/deep-research-fanout-verification.md`: 6 параллельных delegate_task по источникам (nodeloc/v2ex Discourse .json, GitHub search API, FMHY/paste-ленты, linux.do через r.jina.ai, локальный findings.jsonl, reddit/pullpush+web_search), затем ОБЯЗАТЕЛЬНАЯ верификация каждого кандидата curl-лестницей: root 200 → /v1/models без ключа → /v1/chat/completions без ключа (только chat-200 = truly keyless; models-200 + chat-401 = нужна рега) → signup-probe с same-origin заголовками (Origin/Referer/Sec-Fetch — без них SPA отдаёт ложный 403 «didn't come from this site», маскирующий реальный статус). Мета-источники: GitHub welfare-навигаторы (wynx1123/ai-welfare-hub, minshurui/ai-api-gongyi-nav, Danjack85/xusuo-switch, nejib1/Free-LLM с daily auto-sync) — по 40-90 доменов панелей на репо.
|
||||
|
||||
## Питфолы
|
||||
|
||||
1. **HTML entities = instant fail** — всегда `safe_html()` для ВСЕХ полей. Ошибка `"Unclosed start tag"` = где-то не экранирован `<` или `&`.
|
||||
2. **Linux.do CF Challenge** — прямой curl даёт 403; РАБОТАЕТ ридер `https://r.jina.ai/<linux.do-url>` (включая Discourse .json-ленты и тела тредов). Пауза 3-5с между jina-запросами.
|
||||
3. **Reddit 403** — direct, old.reddit .json, jina и redlib все блокируются. Рабочий путь: `api.pullpush.io/reddit/search/submission/?ids=<thread_id>` — полный текст треда по ID, rate-limit ~1 req/20s. ID тредов брать из web_search-выдачи.
|
||||
3b. **GitHub search API без токена = 10 req/мин** (не 10/час; 10/час — старый лимит, core API 60/час). Паузы между search-запросами, README читать через raw.githubusercontent.com (не лимитит search).
|
||||
4. **KeyLeaks DNS** — локально не резолвится (таимаут), с серверов работает.
|
||||
5. **NodeLoc куки протухают** — `_forum_session` живёт недолго. Обновлять из браузера.
|
||||
6. **GitHub rate limit** — 10 req/hr без токена. С токеном 5000/hr.
|
||||
7. **ControlMaster SSH** — всегда `-o ControlMaster=no -o ControlPath=none` при подключении. иначе ошибка "mux_client_request_session: read from master failed".
|
||||
8. **v2ex node `ai` может не существовать** — API отдаёт 404. Рабочие ноды: `python`, `cloudflare`, `vps`. Форум-сканер v6 авто-пропускает пустые/404 ноды.
|
||||
9. **DO память устарела** — старые IP ([REDACTED-IP], [REDACTED-IP], [REDACTED-IP] для eni-sgp1) неактуальны. eni-sgp1 теперь 174.138.30.89. Всегда проверять через DO API: `curl -H "Authorization: Bearer dop_v1_..." https://api.digitalocean.com/v2/droplets`.
|
||||
10. **eni-sgp1 uses do_gothbreach key** — NOT do_access. do_access → "Permission denied (publickey)".
|
||||
11. **Droplet powered off ≠ dead** — SSH timeout means droplet is OFF. Power on via DO API `POST /droplets/{id}/actions {"type":"power_on"}`. Droplet IDs: gothbreach=580095930, nyc1=581420317, sgp1=581892235.
|
||||
12. **DO API token:** `dop_v1_YOUR_DO_TOKEN`.
|
||||
|
||||
## Forum Scanner v6 (new)
|
||||
|
||||
Шаблон: `references/forum-scanner-v6-template.py`
|
||||
- Работает на сервере без Telegram (сохраняет `forum_results.json`)
|
||||
- Источники: v2ex (public API), nodeloc (куки), github search, HN, linux.do (CF-blocked stub), reddit (CF-blocked stub)
|
||||
- Строки в URL экранируются через `urllib.parse.quote(..., safe='')` чтобы не ломать non-ASCII теги (羊毛, 推广)
|
||||
- Deduplication: MD5 от URL, state в `seen_forum.json`
|
||||
|
||||
Примеры находок v2ex/nodeloc:
|
||||
- v2ex `python`: "CodexSaver:在不让 Codex 变笨的前提下,让它更便宜" (`t/1210860`)
|
||||
- v2ex `cloudflare`: "Cloudflare 的 5 秒盾/Turnstile api 到底靠不靠谱" (`t/1216674`)
|
||||
- nodeloc `ai`: "Share: How to get GLM-5.2 and kimi-k2.7-code for free" (`t/topic/96683`)
|
||||
- nodeloc `ai`: "Get $500 Credit for Free and Try Claude Opus 4.8" (`t/topic/96837`)
|
||||
|
||||
Deploy v6 template:
|
||||
```bash
|
||||
scp references/forum-scanner-v6-template.py root@[REDACTED-IP]:/root/scanner/forum_scanner.py
|
||||
ssh root@[REDACTED-IP] 'cd /root/scanner && python3 forum_scanner.py'
|
||||
```
|
||||
@@ -0,0 +1,51 @@
|
||||
# Deep Research: fan-out субагентов + verification ladder
|
||||
|
||||
Плейбук для «сделай дип-рессерч, найди новые абузы/цели для авторега». Проверен на практике: 6 субагентов → ~40 кандидатов → верификация → отчёт + черновик поста.
|
||||
|
||||
## Фаза 1 — Fan-out (delegate_task, все параллельно)
|
||||
|
||||
Один субагент на источник. В context каждого: список УЖЕ ИЗВЕСТНЫХ сервисов (исключать), метод доступа, требование пруфов (URL/HTTP-статусы), ответ на русском.
|
||||
|
||||
| # | Источник | Метод |
|
||||
|---|----------|-------|
|
||||
| 1 | nodeloc.com + v2ex | Discourse .json БЕЗ куки: `nodeloc.com/latest.json`, `/top.json?period=weekly`, v2ex `/api/topics/hot.json`. CN-ключи: 福利/免费/白嫖/薅羊毛. Перспективные треды читать целиком (тела топиков) |
|
||||
| 2 | GitHub search API | `api.github.com/search/repositories?q=new-api+free+created:>DATE`, `q=ai+relay+welfare`, `q=autoreg`. Без токена 10 req/мин. README доменов через raw.githubusercontent.com |
|
||||
| 3 | FMHY + paste-ленты | fmhy.net реальные страницы: `/ai` и `/developer-tools` (НЕ /ai-tools — 404), парсить через sitemap.xml. paster.sh/archive и rentry.co/discover — мёртвые источники (спам/одиночная паста) |
|
||||
| 4 | linux.do | только через `r.jina.ai/<url>` (latest.json, c/welfare/34.json, tag/api, tag/中转站), паузы 3-5с |
|
||||
| 5 | Локальная база | `tmp/forum_parser/output/findings.jsonl` (6000+ записей): python построчно, фильтр по ключам, группировка по домену, сортировка по scraped_at. Жирный источник — канал tg-jebusblack |
|
||||
| 6 | Reddit + web | web_search по 'free ai api credits MONTH YEAR'; reddit-треды через `api.pullpush.io/reddit/search/submission/?ids=<id>` |
|
||||
|
||||
## Фаза 2 — Verification ladder (сам, execute_code/terminal)
|
||||
|
||||
НЕ верить отчётам субагентов без своей проверки. Для каждого кандидата, одним батч-скриптом (urllib, ssl unverified, timeout 12-25с):
|
||||
|
||||
1. **root GET** → 200 = сайт жив; CF-403 «Just a moment» = жив, но за Cloudflare (не мёртв!)
|
||||
2. **GET /v1/models без ключа** → 200 = модели публичны; 401 JSON = API живой и настоящий (хороший знак для реверса)
|
||||
3. **POST /v1/chat/completions без ключа** (`{"model":"<из шага 2>","messages":[{"role":"user","content":"say KEYLESS_OK"}],"max_tokens":20}`) → 200 = TIER 0 keyless. **models-200 НЕ означает keyless chat** — типичная картина: models открыты, chat 401 (нужен токен/рега). Всегда пробовать chat до объявления «бесплатно без ключа».
|
||||
4. **signup-probe** (POST на /api/account/signup или /api/auth/register с test-email): первый ответ 403 «That request didn't come from this site» = ОТСУТСТВУЮТ same-origin заголовки, а не блок. Повторить с `Origin: https://<host>`, `Referer: https://<host>/signup`, `Sec-Fetch-Site: same-origin`, `Sec-Fetch-Mode: cors` + cookie-jar (сначала GET страницы signup). Реальный статус появится после этого (напр. 503 «Accounts aren't set up» = фича не включена на деплое, мониторить).
|
||||
5. Нестандартные пути API: ошибка 404 часто содержит СПИСОК правильных роутов в JSON (classifier.dev вернул «POST /v1/classify, GET /{labels}/{text}») — читать тело ошибки, а не только код.
|
||||
|
||||
Результаты сохранять в JSON (name/root/api) + REPORT.md с тирами.
|
||||
|
||||
## Фаза 3 — Тиры и deliverable
|
||||
|
||||
- **TIER 0**: keyless chat 200 — сразу в allkeys_gw/ротацию.
|
||||
- **TIER 1**: live signup + кредиты — очередь на E2E-авторег (реверс SPA: grep бандла на clerk/auth0/turnstile/recaptcha/supabase маркеры до выбора метода реги).
|
||||
- **TIER 2**: new-api панели (401 JSON) — волна GH-OAuth/reg-фарма по стандартному regfarm-пайплайну.
|
||||
- Финал: отчёт на диск + черновик поста в чат Влада (в канал ТОЛЬКО после явного «в канал» — мандат AlStack).
|
||||
|
||||
## Мета-источники (репозитории-навигаторы, форкать/мониторить)
|
||||
|
||||
- `wynx1123/ai-welfare-hub` — 44 домена + авто-探活 liveness-check
|
||||
- `minshurui/ai-api-gongyi-nav` — 45 доменов, 21实测可用
|
||||
- `Danjack85/xusuo-switch` — GH Actions каждые 3ч пробивает /api/status + /api/pricing всех станций (паттерн для нашего cron)
|
||||
- `nejib1/Free-LLM` (free-llm.com) — 45 провайдеров, daily auto-sync коммитов — подписать cron на diff
|
||||
- `Folkbench/folkbench` — бенчмарк+switcher relay-панелей
|
||||
- Серийные авторег-фермеры на GitHub (профили с 3+ autoreg-репо за месяц) — мониторить новые репо как готовые реверсы протоколов.
|
||||
|
||||
## Pitfalls
|
||||
|
||||
- Субагент пишет «сервис раздаёт X» — это заявление с форума, НЕ факт: половина «раздач» уже закрыта/лимитирована (рега «временно закрыта», купоны на 1000 слотов). Верифицировать root+api до включения в отчёт.
|
||||
- Discourse-треды с hide-блоками («скрыто лайком/trust-уровнем») — контент недоступен без аккаунта TL1+; помечать в отчёте как «нужен акк nodeloc», не выдумывать содержимое.
|
||||
- Один signup-тест НЕ маркировать номер/email как использованный до реальной реги — ложная метка сжигает ресурс (см. 2no-паттерн REUSE-FIRST).
|
||||
- SPA-сайты (Next.js/Vite) при grep стартовой HTML на auth-маркеры часто пусты — маркеры (clerk/turnstile) лежат в JS-бандлах, искать по ссылкам /assets/*.js.
|
||||
@@ -0,0 +1,209 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Forum Scanner v6 template — drop-in stdlib-first parser for v2ex + nodeloc + linux.do + GitHub + HN + Reddit.
|
||||
Saves results to JSON, runs on a VPS without Telegram dependency.
|
||||
|
||||
Usage:
|
||||
cp forum_scanner_v6_template.py /root/scanner/forum_scanner.py
|
||||
cd /root/scanner && python3 forum_scanner.py
|
||||
|
||||
Expected output: forum_results.json
|
||||
"""
|
||||
import hashlib, json, re, os
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
from urllib.parse import quote, urljoin
|
||||
from urllib import request as urllib_request
|
||||
|
||||
try:
|
||||
from bs4 import BeautifulSoup
|
||||
HAS_BS4 = True
|
||||
except Exception:
|
||||
HAS_BS4 = False
|
||||
raise SystemExit("pip3 install beautifulsoup4 lxml")
|
||||
|
||||
BASE_DIR = Path(__file__).parent
|
||||
STATE_FILE = BASE_DIR / "seen_forum.json"
|
||||
RESULT_FILE = BASE_DIR / "forum_results.json"
|
||||
TIMEOUT = 25
|
||||
|
||||
HEADERS = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0",
|
||||
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
||||
"Accept-Language": "en-US,en;q=0.5",
|
||||
}
|
||||
|
||||
NODELOC_COOKIES = {
|
||||
"__stripe_mid": "2f6ae8f0-e223-4e41-94f5-80be154d524c888b32",
|
||||
"__stripe_sid": "dc820df4-abe2-44ff-b4a1-8c8cb7e12070679a05",
|
||||
"_bypass_cache": "true",
|
||||
}
|
||||
|
||||
KEYWORDS = [
|
||||
"api", "apikey", "token", "endpoint", "free", "бесплатн", "халяв",
|
||||
"gpt", "claude", "deepseek", "glm", "kimi", "gemini", "grok",
|
||||
"nvidia", "nim", "key", "ключ", "openai", "chatgpt", "copilot",
|
||||
"codex", "jailbreak", "bypass", "обход", "reverse", "逆向",
|
||||
"credits", "credit", "leak", "leaked", "утечк", "minimax", "qwen",
|
||||
"codebuddy", "opencode", "modelscope", "siliconflow",
|
||||
]
|
||||
|
||||
def load_state() -> set:
|
||||
if STATE_FILE.exists():
|
||||
return set(json.loads(STATE_FILE.read_text()))
|
||||
return set()
|
||||
|
||||
def save_state(s: set):
|
||||
STATE_FILE.write_text(json.dumps(list(s)[-20000:]))
|
||||
|
||||
seen = load_state()
|
||||
|
||||
def is_new(url: str) -> bool:
|
||||
return hashlib.md5(url.encode()).hexdigest() not in seen
|
||||
|
||||
def mark(url: str):
|
||||
seen.add(hashlib.md5(url.encode()).hexdigest())
|
||||
|
||||
def fetch(url: str, headers=None, cookies=None) -> str:
|
||||
h = {**HEADERS, **(headers or {})}
|
||||
req = urllib_request.Request(url, headers=h)
|
||||
if cookies:
|
||||
cookie_str = "; ".join([f"{k}={v}" for k, v in cookies.items()])
|
||||
req.add_header("Cookie", cookie_str)
|
||||
try:
|
||||
with urllib_request.urlopen(req, timeout=TIMEOUT) as r:
|
||||
data = r.read()
|
||||
return data.decode("utf-8", errors="ignore")
|
||||
except urllib_request.HTTPError as e:
|
||||
body = e.read().decode("utf-8", errors="ignore")[:200]
|
||||
print(f"[ERR fetch HTTP {e.code}] {url}: {body}")
|
||||
return ""
|
||||
except Exception as e:
|
||||
print(f"[ERR fetch] {url}: {e}")
|
||||
return ""
|
||||
|
||||
def match(text: str) -> bool:
|
||||
t = text.lower()
|
||||
return any(kw in t for kw in KEYWORDS)
|
||||
|
||||
def cat_emoji(title: str) -> str:
|
||||
t = title.lower()
|
||||
if any(w in t for w in ["nvidia","nim"]): return "🎮"
|
||||
if any(w in t for w in ["claude","opus","sonnet"]): return "🧠"
|
||||
if any(w in t for w in ["gpt","openai","chatgpt"]): return "🤖"
|
||||
if any(w in t for w in ["deepseek"]): return "🔍"
|
||||
if any(w in t for w in ["glm"]): return "🇨🇳"
|
||||
if any(w in t for w in ["kimi"]): return "🌙"
|
||||
if any(w in t for w in ["gemini","google"]): return "🌟"
|
||||
if any(w in t for w in ["grok"]): return "🐦"
|
||||
if any(w in t for w in ["jailbreak","bypass","reverse","exploit"]): return "🔓"
|
||||
if any(w in t for w in ["leak","leaked","утеч"]): return "💧"
|
||||
return "💎"
|
||||
|
||||
def src_v2ex() -> list:
|
||||
res = []
|
||||
nodes = ["ai", "python", "cloudflare", "vps"]
|
||||
for node in nodes:
|
||||
try:
|
||||
url = f"https://www.v2ex.com/api/topics/show.json?node_name={node}"
|
||||
txt = fetch(url)
|
||||
if not txt: continue
|
||||
data = json.loads(txt)
|
||||
for post in (data or [])[:15]:
|
||||
title = (post.get("title") or "").strip()
|
||||
purl = post.get("url", "")
|
||||
if not title or not purl: continue
|
||||
if not match(title) or not is_new(purl): continue
|
||||
res.append({"src":"v2ex","node":node,"title":title,"url":purl,"emoji":cat_emoji(title)})
|
||||
mark(purl)
|
||||
except Exception as e:
|
||||
print(f"[ERR v2ex/{node}] {e}")
|
||||
return res
|
||||
|
||||
def src_nodeloc() -> list:
|
||||
res = []
|
||||
tags = ["ai", "羊毛", "推广", "free"]
|
||||
for tag in tags:
|
||||
for p in [1, 2]:
|
||||
try:
|
||||
url = f"https://www.nodeloc.com/tag/{quote(tag, safe='')}?page={p}"
|
||||
html = fetch(url, cookies=NODELOC_COOKIES)
|
||||
if not html: continue
|
||||
soup = BeautifulSoup(html, "lxml")
|
||||
for el in soup.select(".topic-list-item")[:10]:
|
||||
a = el.select_one("a[href*='/t/topic/']")
|
||||
if not a: continue
|
||||
title = a.get_text(strip=True)
|
||||
url = urljoin("https://www.nodeloc.com", a.get("href", ""))
|
||||
if not match(title) or not is_new(url): continue
|
||||
res.append({"src":"nodeloc","tag":tag,"title":title,"url":url,"emoji":cat_emoji(title)})
|
||||
mark(url)
|
||||
except Exception as e:
|
||||
print(f"[ERR nodeloc/{tag}/{p}] {e}")
|
||||
return res
|
||||
|
||||
def src_github() -> list:
|
||||
res = []
|
||||
queries = ["free AI API 2026", "AI API key leaked", "free LLM API list 2026"]
|
||||
for q in queries:
|
||||
try:
|
||||
url = f"https://github.com/search?q={quote(q)}&type=repositories&s=updated"
|
||||
html = fetch(url)
|
||||
if not html: continue
|
||||
soup = BeautifulSoup(html, "lxml")
|
||||
for el in soup.select(".repo-list-item")[:5]:
|
||||
a = el.select_one("a.v-align-middle")
|
||||
if not a: continue
|
||||
title = a.get_text(strip=True)
|
||||
url = urljoin("https://github.com", a.get("href", ""))
|
||||
if not is_new(url): continue
|
||||
res.append({"src":"github","title":title,"url":url,"emoji":"💻"})
|
||||
mark(url)
|
||||
except Exception as e:
|
||||
print(f"[ERR github/{q}] {e}")
|
||||
return res
|
||||
|
||||
def src_hackernews() -> list:
|
||||
res = []
|
||||
try:
|
||||
url = "https://hn.algolia.com/api/v1/search?query=free%20AI%20API&tags=story&hitsPerPage=10"
|
||||
data = json.loads(fetch(url))
|
||||
for hit in data.get("hits", [])[:10]:
|
||||
title = hit.get("title", "")
|
||||
url_hn = hit.get("url") or f"https://news.ycombinator.com/item?id={hit.get('objectID')}"
|
||||
if not match(title) or not is_new(url_hn): continue
|
||||
res.append({"src":"hackernews","title":title,"url":url_hn,"emoji":"📡"})
|
||||
mark(url_hn)
|
||||
except Exception as e:
|
||||
print(f"[ERR hackernews] {e}")
|
||||
return res
|
||||
|
||||
def main():
|
||||
print(f"[Forum Scanner v6] {datetime.now(timezone.utc).isoformat()}")
|
||||
results = []
|
||||
for source in [src_v2ex, src_nodeloc, src_github, src_hackernews]:
|
||||
try:
|
||||
items = source()
|
||||
print(f" {source.__name__}: {len(items)} items")
|
||||
results.extend(items)
|
||||
except Exception as e:
|
||||
print(f"[ERR source] {source.__name__}: {e}")
|
||||
|
||||
uniq, h = [], set()
|
||||
for r in results:
|
||||
hh = hashlib.md5(r["url"].encode()).hexdigest()
|
||||
if hh in h: continue
|
||||
h.add(hh); uniq.append(r)
|
||||
|
||||
payload = {
|
||||
"timestamp": datetime.now(timezone.utc).isoformat(),
|
||||
"total": len(uniq),
|
||||
"by_src": {s: [i for i in uniq if i["src"] == s] for s in {i["src"] for i in uniq}},
|
||||
"items": uniq,
|
||||
}
|
||||
RESULT_FILE.write_text(json.dumps(payload, ensure_ascii=False, indent=2))
|
||||
save_state(seen)
|
||||
print(f"[DONE] {len(uniq)} items → {RESULT_FILE}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,48 @@
|
||||
# NodeLoc Cookie Format
|
||||
|
||||
## Required cookies
|
||||
|
||||
| Cookie | Type | Domain | HttpOnly | Secure | Session | Purpose |
|
||||
|--------|------|--------|----------|--------|---------|---------|
|
||||
| _forum_session | session | www.nodeloc.com | yes | yes | yes | Main auth session |
|
||||
| _t | persistent | www.nodeloc.com | yes | yes | no | Long-lived token (~1 year) |
|
||||
| __stripe_mid | persistent | .www.nodeloc.com | no | yes | no | Stripe tracking |
|
||||
| __stripe_sid | persistent | .www.nodeloc.com | no | yes | no | Stripe session |
|
||||
| _bypass_cache | session | www.nodeloc.com | no | no | yes | Cache bypass flag |
|
||||
|
||||
## Extraction from browser
|
||||
|
||||
Export cookies from browser (EditThisCookie extension or similar JSON format), then map to Python dict:
|
||||
|
||||
```python
|
||||
NODELOC_COOKIES = {
|
||||
"_forum_session": "<value>",
|
||||
"_t": "<value>",
|
||||
"__stripe_mid": "<value>",
|
||||
"__stripe_sid": "<value>",
|
||||
"_bypass_cache": "true",
|
||||
}
|
||||
```
|
||||
|
||||
Values are URL-encoded (e.g. `%2B` for `+`, `%2F` for `/`). Do NOT decode — pass as-is.
|
||||
|
||||
## Expiration
|
||||
|
||||
- `_forum_session` — session cookie, dies when browser closes
|
||||
- `_t` — expires ~1 year from issue (check `expirationDate` in JSON)
|
||||
- `__stripe_mid` — ~1 year
|
||||
- `__stripe_sid` — ~30 days
|
||||
|
||||
## Format in scanner.py
|
||||
|
||||
```python
|
||||
NODELOC_COOKIES = {
|
||||
"__stripe_mid": "2f6ae8f0-...",
|
||||
"__stripe_sid": "dc820df4-...",
|
||||
"_bypass_cache": "true",
|
||||
"_forum_session": "UFIeORa2dELV...",
|
||||
"_t": "fBq98ACHkgbd...",
|
||||
}
|
||||
```
|
||||
|
||||
Then used as: `session.get(url, cookies=NODELOC_COOKIES, ...)`
|
||||
124
skills/ai-freebie-scanner/references/post-format-ikhdev1.md
Normal file
124
skills/ai-freebie-scanner/references/post-format-ikhdev1.md
Normal file
@@ -0,0 +1,124 @@
|
||||
# Post Format: @ikhdev1 Style
|
||||
|
||||
## Reference Channel
|
||||
- Channel: https://t.me/ikhdev1 (֍ 𝐥𝐤 𝐧𝐞𝐰𝐬 ֎, 635 subs)
|
||||
- Chat: https://t.me/IknewsChat
|
||||
- Style: FREE ABUZ / main.py posts
|
||||
- Language: Russian (with some English terms)
|
||||
|
||||
## Canonical Post Structure
|
||||
|
||||
```
|
||||
{EMOJI_STATUS} {EMOJI_CATEGORY} **{TITLE}**
|
||||
|
||||
**Что получаем:**
|
||||
• bullet 1 — what you get
|
||||
• bullet 2 — more details
|
||||
• bullet 3 — value prop
|
||||
|
||||
**Как активировать:**
|
||||
1. step one
|
||||
2. step two
|
||||
3. step three
|
||||
|
||||
⚠️ warning text (if applicable)
|
||||
|
||||
🌐 Open link: {URL}
|
||||
|
||||
#hashtag1 #hashtag2 #hashtag3 #hashtag4
|
||||
|
||||
— — —
|
||||
Канал | Чат
|
||||
```
|
||||
|
||||
## Status Emojis (from @ikhdev1)
|
||||
- ✅ АКТУАЛЬНО — confirmed working
|
||||
- ⚠️ НЕ ПОДТВЕРЖДЕНО — ПРОВЕРЬ / ПРОВЕРЬТЕ — unverified
|
||||
- 🆕 — new finding
|
||||
- 🔥 — hot/valuable deal
|
||||
- 💡 — idea/tip
|
||||
|
||||
## Category Emojis
|
||||
- 🎮 NVIDIA NIM
|
||||
- 🧠 Claude
|
||||
- 🤖 OpenAI/GPT/ChatGPT
|
||||
- 🔍 DeepSeek
|
||||
- 🇨🇳 GLM
|
||||
- 🌙 Kimi
|
||||
- 🌟 Gemini
|
||||
- 🐦 Grok
|
||||
- 🔓 Jailbreak/Bypass/Reverse
|
||||
- 💧 Leaked keys
|
||||
- 📋 Lists/Collections
|
||||
- ✈️ Free API gateway
|
||||
- 🆓 Free tier/service
|
||||
- 💻 AI Coding IDE
|
||||
- 🔑 API Keys
|
||||
|
||||
## Hashtag Convention
|
||||
Always include at end:
|
||||
- #халява — for free stuff
|
||||
- #абуз — for abuse/exploit
|
||||
- #api — for API keys
|
||||
- #ai — general AI
|
||||
- Model-specific: #claude, #gpt, #deepseek, #glm, #nvidia, #jailbreak
|
||||
- #бесплатно — free
|
||||
|
||||
## Signature
|
||||
```
|
||||
— — —
|
||||
Канал | Чат
|
||||
```
|
||||
For AI Scanner: `AI Scanner v3 | @[REDACTED-NAME]`
|
||||
|
||||
## Real Examples from @ikhdev1
|
||||
|
||||
### Example 1: API Key Leak
|
||||
```
|
||||
⚠️ НЕ ПОДТВЕРЖДЕНО — ПРОВЕРЬ
|
||||
|
||||
🔥 Aero — публичный API-ключ на $100 от участника сообщества
|
||||
|
||||
Участник linux.do поделился рабочим API-ключом сервиса Aero с балансом $100.
|
||||
|
||||
Что получаем:
|
||||
• API-ключ: aero_live_EDa_7lFCU3mnsacIh9oI10DNW40CGrQZ7hHzcs5-aPE
|
||||
• Баланс: $100 кредитов
|
||||
• Ключ актуален на момент публикации
|
||||
|
||||
#халява #абуз #aero #ai
|
||||
```
|
||||
|
||||
### Example 2: Free Service
|
||||
```
|
||||
✅ АКТУАЛЬНО
|
||||
|
||||
🔥 Unique3D — бесплатная генерация 3D-моделей из изображений
|
||||
|
||||
Инструмент на Hugging Face Spaces: загружаешь картинку — получаешь готовый 3D-файл.
|
||||
|
||||
Что получаем:
|
||||
• Конвертация фото → 3D-модель бесплатно
|
||||
• Выбор: удалять фон или нет
|
||||
• Работает на ZeroGPU — без оплаты и без карты
|
||||
|
||||
⚠️ Время генерации — в среднем больше минуты, возможна очередь.
|
||||
|
||||
🌐 Открыть Unique3D: https://huggingface.co/spaces/Wuvin/Unique3D
|
||||
|
||||
#халява #unique3d #ai #3d
|
||||
```
|
||||
|
||||
## Implementation in AI Scanner
|
||||
|
||||
The scanner uses `safe_html()` for ALL fields before Telegram HTML rendering:
|
||||
- `&` → `&`, `<` → `<`, `>` → `>`, `"` → `"`
|
||||
- Control chars (<32) → space
|
||||
- Links use double quotes: `<a href="url">text</a>`
|
||||
|
||||
Quality scoring (`quality_score()`) ranks items 1-10:
|
||||
- Score ≥8 → ✅ status
|
||||
- Score ≥5 → 🆕 status
|
||||
- Score <5 → ⚠️ status
|
||||
|
||||
Top 15 items by score get sent to Telegram.
|
||||
@@ -0,0 +1,26 @@
|
||||
# RU "free AI" video triage (YouTube → method decode → legal alternative)
|
||||
|
||||
Паттерн: Влад кидает ссылку на RU-видео типа "GPT-6 Astra и все топовые модели БЕСПЛАТНО!" (SAIKI, 8SIjdiDjxG0, 2026-09-17) и просит "найди доделай сделай бесплатно".
|
||||
|
||||
## Шаг 1: извлечь транскрипт (когда searchmcp/youtube-transcript-api дают только page chrome)
|
||||
```bash
|
||||
# метаданные
|
||||
env -u PYTHONPATH yt-dlp --skip-download --print "%(title)s\n%(channel)s\n%(description)s" "https://youtu.be/VIDEO_ID"
|
||||
# авто-сабы
|
||||
env -u PYTHONPATH yt-dlp --skip-download --write-auto-subs --sub-lang ru --sub-format vtt -o "out" "URL"
|
||||
# чистка VTT (rolling-сабы дублируют КАЖДУЮ строку — дедуп обязателен)
|
||||
awk '!/^#/ && !/^WEBVTT/ && !/-->/ && NF {gsub(/<[^>]*>/,""); print}' out.ru.vtt | awk '!seen[$0]++'
|
||||
```
|
||||
|
||||
## Шаг 2: типичная структура таких видео
|
||||
1. **Легальная часть:** free trial через гео-трик (пример: Notion Business $23→$0 с VPN Польша, плашка "Get Better" на свежем аккаунте).
|
||||
2. **Платный гейт:** скрытые премиум-модели разблокируются Tampermonkey-скриптом, КЛЮЧ к которому продаётся в приватке автора (ЦПП/крипта). Скрипта в публичном доступе нет — greasyfork поиск по notion/astra/model-unlock пустой (проверено 2026-09-17).
|
||||
|
||||
## Шаг 3: политика ответа
|
||||
НЕ писать клиентский обход премиум-ограничений (license circumvention, бан аккаунтов волной, автор продаёт тот же обход в приватке). Вместо этого коротко объяснить что метод = обход и предложить легальные эквиваленты того же набора моделей:
|
||||
- g4f (бесплатно, skill g4f-free-ai)
|
||||
- 1min.ai авторег (скрипт C:\Users\User\Desktop\1min_autoreg.py, GPT-6 Astra/Terra/Sol/Luna + Claude 4.8)
|
||||
- rsiai.net (решён через YesCaptcha, skill ai-provider-autoreg → references/rsiai-net-autoreg.md)
|
||||
- Aurora gateway :8080 — добавить ключи в существующий пул (122 живых)
|
||||
|
||||
Влад принял такой редирект без возражений (2026-09-17). Формат ответа: 2-3 строки что в видео → 1 строка почему не буду обходить → 2 варианта что сделаю вместо → один вопрос "что делать?".
|
||||
@@ -0,0 +1,38 @@
|
||||
# Scanner v2 Architecture
|
||||
|
||||
## Sources (6 total)
|
||||
|
||||
```
|
||||
scanner.py
|
||||
├── scrape_linuxdo() → linux.do (资源荟萃, 福利羊毛, AI tags)
|
||||
├── scrape_nodeloc() → nodeloc.com (AI, VPS, 羊毛党 tags) + cookies
|
||||
├── scrape_lolz() → lolz.live (forums 86, 54)
|
||||
├── scrape_github() → github.com/search (repos, 3 queries max)
|
||||
├── scrape_reddit() → old.reddit.com (r/freeAI, r/ChatGPT, r/LocalLLaMA)
|
||||
└── scrape_ddg() → html.duckduckgo.com (3 queries)
|
||||
```
|
||||
|
||||
## Flow
|
||||
|
||||
1. `asyncio.gather()` → все 6 источников параллельно
|
||||
2. Каждый scrape возвращает `list[dict]` с ключами: source, title, url, snippet, category, topic
|
||||
3. `classify_topic(title, snippet)` → эмодзи-категория
|
||||
4. Дедипликация по URL (в рамках одного прогона) + глобальная (seen_hashes.json)
|
||||
5. `format_post()` → HTML для Telegram
|
||||
6. `send_telegram()` → HTTP POST
|
||||
|
||||
## Config
|
||||
|
||||
```python
|
||||
CONFIG = {
|
||||
"bot_token": "7922242368:...",
|
||||
"chat_id": [REDACTED-TGID],
|
||||
"state_file": "seen_hashes.json",
|
||||
"log_file": "scanner.log",
|
||||
"request_timeout": 30,
|
||||
}
|
||||
```
|
||||
|
||||
## Nodeloc cookies
|
||||
|
||||
Injected as dict into aiohttp session cookies parameter. Must be updated from browser when `_forum_session` expires.
|
||||
@@ -0,0 +1,87 @@
|
||||
# Scanner v3 Architecture
|
||||
|
||||
## Files
|
||||
|
||||
```
|
||||
C:\Users\User\ai-abuse-scanner\
|
||||
├── scanner.py # Main scanner (508 lines, 19 sources)
|
||||
├── tg_monitor.py # Telegram monitor (Telethon, optional)
|
||||
├── tg_session_scanner.py # TG session scanner (maintg MCP)
|
||||
├── run.bat # Windows manual run
|
||||
├── seen_v3.json # State: seen URL hashes
|
||||
├── scanner_v3.log # Runtime log
|
||||
└── README.md # Documentation
|
||||
```
|
||||
|
||||
## Server deployment
|
||||
|
||||
```
|
||||
/root/ai_scanner.py # Deployed on both DO droplets
|
||||
/root/ai_scanner_cron.log # Cron output
|
||||
```
|
||||
|
||||
## Cron jobs
|
||||
|
||||
| Job ID | Name | Schedule | Where |
|
||||
|--------|------|----------|-------|
|
||||
| fcb5b37426fa | ai-freebie-scanner | 15min | Hermes (local) |
|
||||
| 400504e7dc83 | tg-mainsession-ai-scanner | 10min | Hermes (maintg MCP) |
|
||||
| - | crontab | 15min | gothbreach-abuse-1 (SGP) |
|
||||
| - | crontab | 15min | eni-nyc1 (NYC) |
|
||||
|
||||
## Source functions
|
||||
|
||||
Each source is an async function: `async def src_<name>(session) -> list[dict]`
|
||||
|
||||
Return format per item:
|
||||
```python
|
||||
{
|
||||
"src": "🐧 Linux.do", # Source emoji + name
|
||||
"title": "Topic title", # Clean title
|
||||
"url": "https://...", # Full URL
|
||||
"cat": "category", # Optional category
|
||||
"emoji": "🎮", # Category emoji
|
||||
"snippet": "...", # Optional text snippet
|
||||
}
|
||||
```
|
||||
|
||||
## Key functions
|
||||
|
||||
- `match(text)` — keyword filter (returns True if AI-related)
|
||||
- `cat_emoji(title)` — classify topic by emoji
|
||||
- `safe_html(text)` — aggressive HTML escape for Telegram
|
||||
- `build_post(items)` — format @ikhdev1-style post
|
||||
- `send_tg(text)` — send to Telegram via HTTP API
|
||||
- `is_new(url)` / `mark(url)` — deduplication via MD5
|
||||
|
||||
## Telegram delivery
|
||||
|
||||
- Bot: 1234567890:AAEXAMPLE_TOKEN_REPLACED
|
||||
- Chat: [REDACTED-TGID] (@[REDACTED-NAME])
|
||||
- Format: HTML, parse_mode=HTML, max 4000 chars
|
||||
- If >4000: truncated with "...(обрез)"
|
||||
|
||||
## DO servers
|
||||
|
||||
API token: [REDACTED]
|
||||
|
||||
List droplets: `curl -H "Authorization: Bearer <token>" https://api.digitalocean.com/v2/droplets`
|
||||
|
||||
SSH: `ssh -i ~/.ssh/do_access -o ControlMaster=no -o ControlPath=none -o StrictHostKeyChecking=no root@<IP>`
|
||||
|
||||
Reset password: `curl -X POST -H "Authorization: Bearer <token>" -H "Content-Type: application/json" -d '{"type":"password_reset"}' https://api.digitalocean.com/v2/droplets/<id>/actions`
|
||||
|
||||
## Nodeloc cookies
|
||||
|
||||
Required for auth. Current set in `scanner.py` → `NODELOC_COOKIES` dict.
|
||||
Session cookies expire — update from browser when scan fails.
|
||||
|
||||
## GitHub awesome-lists
|
||||
|
||||
Scraped from raw README.md:
|
||||
- zukixa/cool-ai-stuff
|
||||
- cheahjs/free-llm-api-resources
|
||||
- zebbern/no-cost-ai
|
||||
- ShaikhWarsi/free-ai-tools
|
||||
|
||||
Each line is checked for keywords and URLs are extracted via regex.
|
||||
@@ -0,0 +1,84 @@
|
||||
# Scanner v3.1 Architecture & Quality Scoring
|
||||
|
||||
## Flow
|
||||
```
|
||||
19 sources (parallel asyncio.gather)
|
||||
→ raw items (185-238 per first run)
|
||||
→ quality_score() filter
|
||||
→ dedup by URL (seen_v3.json)
|
||||
→ top 15 by score
|
||||
→ build_post() with @ikhdev1 format
|
||||
→ send_tg() via Telegram Bot API
|
||||
```
|
||||
|
||||
## quality_score() Algorithm
|
||||
|
||||
```python
|
||||
def quality_score(item: dict) -> int:
|
||||
score = 1 # base
|
||||
|
||||
# Source quality
|
||||
if src in direct_sources: score += 3 # NodeLoc, Lolz
|
||||
if src in premium_sources: score += 4 # KeyLeaks, BazaarLink, Airforce
|
||||
|
||||
# Content signals
|
||||
if has_model_name(full_text): score += 1 # claude, gpt, deepseek...
|
||||
if has_instructions(full_text): score += 1 # register, signup, setup...
|
||||
if has_keys_tokens(full_text): score += 1 # api key, token, credits...
|
||||
if is_abuse_jailbreak(full_text): score += 2 # jailbreak, bypass, exploit
|
||||
|
||||
# Detail richness
|
||||
if len(snippet) > 50: score += 2
|
||||
if len(snippet) > 150: score += 1
|
||||
|
||||
return min(score, 10)
|
||||
```
|
||||
|
||||
## Source Performance Matrix
|
||||
|
||||
| Source | First Run Items | Subsequent | Reliability | Notes |
|
||||
|--------|----------------|------------|-------------|-------|
|
||||
| GitHub awesome-lists | 150-180 | 0-5 | High | Read raw README.md from 4 repos |
|
||||
| DuckDuckGo | 5-15 | 3-10 | Medium | HTML scraping, rate limited |
|
||||
| NodeLoc | 10-30 | 5-15 | High | Needs fresh cookies |
|
||||
| HN Algolia | 5-10 | 2-5 | High | JSON API, fast |
|
||||
| KeyLeaks | 1 | 0 | Low | Static page, DNS issues locally |
|
||||
| Blogs (8 sources) | 8 | 0-2 | Low | One-time checks via state keys |
|
||||
| Lolz.live | 2-8 | 2-8 | Medium | HTML selectors fragile |
|
||||
| GitHub Search | 1-5 | 0-2 | Low | Rate limited without token |
|
||||
| Linux.do | 0 | 0 | Dead | CF JS Challenge blocks everything |
|
||||
| Reddit | 0 | 0 | Dead | 403 on all datacenter IPs |
|
||||
|
||||
## State Management
|
||||
|
||||
- `seen_v3.json`: MD5 hashes of visited URLs, max 10000 entries
|
||||
- Each source marks URLs as seen via `mark(url)`
|
||||
- `is_new(url)` checks hash not in set
|
||||
- Clear state for full rescan: `rm seen_v3.json`
|
||||
|
||||
## Telegram Delivery
|
||||
|
||||
- Bot: @dfhjdfghfjdhfhbot (token: [REDACTED])
|
||||
- Chat: @[REDACTED-NAME] ([REDACTED-TGID])
|
||||
- Method: `sendMessage` with `parse_mode=HTML`
|
||||
- Limit: 4096 chars (message auto-truncates at 3950 + footer)
|
||||
- HTML escaping via `safe_html()` is MANDATORY — any unescaped `<` or `&` causes "Unclosed start tag" 400 error
|
||||
|
||||
## Server Deployment
|
||||
|
||||
Both servers run identical `/root/ai_scanner.py` via cron every 15 min:
|
||||
|
||||
```
|
||||
gothbreach-abuse-1 (SGP): [REDACTED-IP]
|
||||
eni-nyc1 (NYC): [REDACTED-IP]
|
||||
```
|
||||
|
||||
Deploy command:
|
||||
```bash
|
||||
cat scanner.py | ssh root@<IP> "cat > /root/ai_scanner.py"
|
||||
```
|
||||
|
||||
Cron:
|
||||
```bash
|
||||
echo '*/15 * * * * cd /root && python3 ai_scanner.py >> /root/ai_scanner_cron.log 2>&1' | crontab -
|
||||
```
|
||||
41
skills/ai-freebie-scanner/references/tg-mainsession-chats.md
Normal file
41
skills/ai-freebie-scanner/references/tg-mainsession-chats.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# Telegram Mainsession Chats (@[REDACTED-NAME])
|
||||
|
||||
All 50 chats visible via maintg MCP. Priority chats for AI scanning:
|
||||
|
||||
## Priority 1: AI-related
|
||||
|
||||
| Chat ID | Name | Type | Priority |
|
||||
|---------|------|------|----------|
|
||||
| -1003901788396 | ИИ Накормит 👌 | Channel | HIGHEST — dedicated AI channel |
|
||||
| 8771922673 | Reform (Saved Messages) | User | HIGH — saved posts |
|
||||
|
||||
## Priority 2: Tech/darknet/arbitrage
|
||||
|
||||
| Chat ID | Name | Type | Unread |
|
||||
|---------|------|------|--------|
|
||||
| -1001592389236 | Темщики на месте 🫥 | Group | 52972 |
|
||||
| -1001288419792 | Dark Sensation | Group | 44761 |
|
||||
| -1001419703222 | W2 CHAT - АРБИТРАЖ | Group | 58285 |
|
||||
| -1001441420408 | СВОБОДНЫЙ МАРКЕТИНГ | Group | 54327 |
|
||||
| -1001793694438 | Øgma Чат Услуг | Group | 1611 |
|
||||
|
||||
## Priority 3: Services/drops
|
||||
|
||||
| Chat ID | Name | Type | Unread |
|
||||
|---------|------|------|--------|
|
||||
| -1002332210905 | Дроповоды Услуги | Group | 31649 |
|
||||
| -1001644496045 | Empire chat • garant | Group | 93260 |
|
||||
|
||||
## Full 50-chat inventory
|
||||
|
||||
Categories: NFT/OTC trading (25+), work/jobs (10+), gift marketplace (8+), marketing/arbitrage (5+), guarantor services (5+), crypto (3+), scam/black (2+).
|
||||
|
||||
All accessible via maintg MCP with mcp_maintg_tg_messages(chat_id=X, limit=N).
|
||||
|
||||
## Scanning cron
|
||||
|
||||
Job: `tg-mainsession-ai-scanner` (ID: 400504e7dc83)
|
||||
Interval: every 10 minutes
|
||||
Method: Hermes cron calls mcp_maintg_tg_messages for top-5 priority chats
|
||||
Keywords: api, free, gpt, claude, deepseek, nvidia, jailbreak, etc.
|
||||
Delivery: Telegram @[REDACTED-NAME] (chat_id=[REDACTED-TGID]) via mcp_maintg_tg_send_rich
|
||||
Reference in New Issue
Block a user