Руководство для начинающих по last30days-Skill: Универсальный сборщик разведданных из Reddit/HN/Polymarket

March 25, 2026

Введение | 15 минут | Освойте кросс-платформенный сбор данных и удвойте эффективность исследований

TIP

last30days-Skill — это наиболее полный навык (Skill) для ИИ-исследований на платформе ClawHub. Он поддерживает параллельный поиск в 10+ источниках сигналов, автоматическое удаление дублей, ранжирование и генерацию фактологических отчетов с цитатами.

GitHub: mvanhorn/last30days-skill


Портрет целевой аудитории

  • Разработчики с опытом 1–5 лет.
  • Те, кому ежедневно нужно подбирать ИИ-инструменты, анализировать конкурентов или отслеживать технологические тренды.
  • Имеющие базовые навыки работы с командной строкой и знакомые с Claude Code или Codex CLI.
  • Желающие избавиться от фрагментированного процесса «пролистывания Reddit/HN в поисках информации».

Основные зависимости и среда

ЗависимостьОписаниеОбязательно
Node.js 18+Среда выполнения SkillДа
Python 3.10+Основной язык скриптовДа
ScrapeCreators API KeyТри-в-одном: Reddit/TikTok/InstagramДа
Claude Code или Codex CLIНоситель для запуска SkillДа
X AUTH_TOKEN / CT0Авторизация для поиска в X (опционально)Нет
Bluesky App PasswordПоиск в Bluesky (опционально)Нет
Polymarket Gamma APIДанные рынков предсказаний (бесплатно)Нет

Полная структура проекта

last30days-skill/
├── SKILL.md                    # Файл определения Skill (деплоится в ~/.claude/skills/)
├── SPEC.md                     # Полная техническая спецификация
├── CLAUDE.md                   # Руководство по разработке для Claude Code
├── scripts/
│   ├── last30days.py           # Основная точка входа Python (движок исследования)
│   ├── sync.sh                 # Скрипт синхронизации деплоя
│   └── lib/
│       ├── __init__.py         # Точка входа пакета
│       ├── env.py              # Загрузка переменных окружения
│       ├── dates.py            # Расчет временных диапазонов и достоверности
│       ├── cache.py            # Кэш с TTL 24 часа
│       ├── http.py             # Стандартный HTTP-клиент
│       ├── models.py           # Автовыбор моделей OpenAI/xAI
│       ├── openai_reddit.py    # Поиск в Reddit (OpenAI Responses API)
│       ├── xai_x.py            # Поиск в X (xAI Responses API)
│       ├── reddit_enrich.py    # Извлечение глубоких метрик постов Reddit
│       ├── hackernews.py       # Hacker News (бесплатный API Algolia)
│       ├── polymarket.py       # Рынки предсказаний Polymarket (Gamma API)
│       ├── bluesky.py          # Поиск в Bluesky/AT Protocol
│       ├── truthsocial.py      # Поиск в Truth Social
│       ├── normalize.py        # Преобразование сырых ответов в схему
│       ├── score.py            # Модель оценки по нескольким сигналам
│       ├── dedupe.py           # Обнаружение близких дубликатов
│       ├── render.py           # Рендеринг отчетов Markdown / JSON
│       └── schema.py           # Определение и валидация типов
├── skills/last30days/
│   └── last30days.sh            # Shell-обертка (вход для Claude Code Skill)
└── fixtures/                   # Тестовые данные (фиксаторы)

Шаг 1: Установка и настройка авторизации

1.1 Установка через плагин Claude Code (рекомендуется)

Если вы уже используете Claude Code, просто выполните команды плагина:

/plugin marketplace add mvanhorn/last30days-skill
/plugin install last30days@last30days-skill

Или используйте официальный инструмент ClawHub:

clawhub install last30days-official

WARNING

Метод установки через плагин требует версии Claude Code, поддерживающей команду /plugin. Убедитесь, что claude --version >= 1.0.

1.2 Ручная установка через Git Clone

Не хотите использовать плагины? Клонируйте репозиторий напрямую:

# Клонирование в директорию навыков Claude Code
git clone https://github.com/mvanhorn/last30days-skill.git \
  ~/.claude/skills/last30days

# Переход в директорию и проверка файлов
cd ~/.claude/skills/last30days
ls -la scripts/

1.3 Настройка ScrapeCreators API Key (обязательно)

Это единый вход для Reddit, TikTok и Instagram. Один ключ для всего:

  1. Зарегистрируйтесь на scrapecreators.com и получите API Key.
  2. Создайте конфигурационный файл:
mkdir -p ~/.config/last30days

cat > ~/.config/last30days/.env << 'EOF'
# ОБЯЗАТЕЛЬНО: Ключ 3-в-1 для Reddit + TikTok + Instagram
SCRAPECREATORS_API_KEY=sc_xxxxxxxxxxxxxxxxxxxx

# ОПЦИОНАЛЬНО: OpenAI API (можно пропустить после входа в Codex)
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx
EOF

chmod 600 ~/.config/last30days/.env  # Защита конфиденциального файла

1.4 Настройка опциональной авторизации для X / Bluesky

Поиск в X (рекомендуемый способ):

# 1. Войдите в x.com, откройте DevTools браузера (F12)
# 2. Application → Cookies → Скопируйте значения auth_token и ct0
# 3. Запишите в .env

cat >> ~/.config/last30days/.env << 'EOF'

# Авторизация X (через cookie)
AUTH_TOKEN=xxxxxxxxxxxxxxxxxxxx
CT0=xxxxxxxxxxxxxxxxxxxx

# Альтернатива X: xAI API (cookie не требуются)
XAI_API_KEY=xai-xxxxxxxxxxxxxxxxxxxx
EOF

Поиск в Bluesky:

# 1. Создайте пароль приложения в bsky.app/settings/app-passwords
# 2. Запишите в .env

cat >> ~/.config/last30days/.env << 'EOF'

# Bluesky/AT Protocol
BSKY_HANDLE=yourhandle.bsky.social
BSKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx
EOF

TIP

Cookie для X и пароль Bluesky опциональны. Если не хотите возиться, бесплатных источников вроде Polymarket, Hacker News и Reddit будет достаточно для большинства сценариев.

1.5 Проверка успешности установки

# Запустите простой тест (--mock использует локальные данные, не тратя квоту API)
python3 ~/.claude/skills/last30days/scripts/last30days.py "Claude Code tips" --mock --emit=compact

Если вы видите подобный вывод, значит все работает корректно:

=== last30days Report: Claude Code tips ===
Sources: reddit, hackernews | Time: 2026-03-25 | Mode: mock
[results...]

Шаг 2: Базовое использование

2.1 Командная строка /last30days

Внутри Claude Code введите команду напрямую:

/last30days best Claude Code prompts

Через Codex CLI:

python3 ~/.claude/skills/last30days/scripts/last30days.py "best Claude Code prompts" --emit=compact

TIP

По умолчанию поиск ведется по популярному контенту за последние 30 дней в 10+ источниках (Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, Bluesky и др.). Один поиск занимает от 2 до 8 минут, для узких нишевых тем — дольше.

2.2 Интерпретация структуры отчета

После завершения вы получите структурированный отчет примерно такого вида:

# last30days Report: best Claude Code prompts

## Sources Searched (6 active)
reddit | x | hackernews | polymarket | youtube | reddit_threads

## Top Findings (Основные находки)
...

## Best Practices (Методы, проверенные сообществом)
...

## Prompt Pack (Готовые промпты для копирования)
...

## Recent Developments (Последние события)
...

## References (Ссылки на источники)
...

Отчет автоматически:

  • Проверяет конвергенцию: контент, упомянутый на нескольких платформах, получает больший вес.
  • Удаляет дубликаты: из семантически похожих постов остается только лучший.
  • Учитывает актуальность: более свежий контент ранжируется выше.
  • Аннотирует ссылки: каждый вывод сопровождается ссылкой на оригинал.

2.3 Быстрый режим --quick

Спешите? Добавьте --quick, чтобы пропустить некоторые этапы глубокого поиска:

python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "Cursor AI vs Windsurf" \
  --quick \
  --emit=compact

2.4 Настройка временного окна --days=N

Можно задать любое количество дней, не только 30:

python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "OpenClaw latest news" \
  --days=7 \
  --emit=compact

2.5 Принудительное обновление кэша --refresh

Результаты кэшируются на 24 часа. Чтобы начать поиск заново:

python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "AI code editors comparison" \
  --refresh \
  --emit=compact

Шаг 3: Механизм параллельного поиска

3.1 Принцип поиска в Reddit

Reddit — важнейший источник. Skill работает в два этапа:

# scripts/lib/openai_reddit.py (упрощенно)
def search_reddit(query: str, days: int = 30) -> list[dict]:
    # Этап 1: Предварительный поиск через OpenAI Responses API + web_search
    response = openai.responses.create(
        model="gpt-4o",
        input=f"Find active Reddit discussions about: {query}",
        tools=[{"type": "web_search"}],
        max_tokens=2000
    )
    # Этап 2: Извлечение сырого JSON поста для получения реальных лайков/комментариев
    enriched = reddit_enrich.fetch_threads(response.urls, days)
    return enriched

TIP

Начиная с версии v2.9, Reddit по умолчанию работает через ScrapeCreators. Один ключ покрывает Reddit, TikTok и Instagram, что стабильнее предыдущих раздельных решений.

3.2 Интеграция Hacker News

Бесплатный доступ, ключ API не требуется:

# scripts/lib/hackernews.py
def search_hackernews(query: str, days: int = 30) -> list[dict]:
    # HN Algolia API открыт и бесплатен
    url = "https://hn.algolia.com/api/v1/search"
    params = {
        "query": query,
        "tags": "story",
        "numericFilters": f"created_at_i>{cutoff_timestamp(days)}"
    }
    resp = requests.get(url, params=params)
    items = resp.json()["hits"]
    # Сортировка по сумме points + num_comments * 2
    return sorted(items, key=lambda x: x["points"] + x["num_comments"] * 2, reverse=True)

3.3 Данные рынков предсказаний Polymarket

Это ключевая фишка last30days — инструмент смотрит не только на то, «что говорят», но и на то, «сколько денег ставят»:

# scripts/lib/polymarket.py
def search_polymarket(query: str) -> list[dict]:
    # Бесплатный доступ через Gamma API
    url = "https://gamma-api.polymarket.com/markets"
    resp = requests.get(url, params={"topic": query, "limit": 20})
    markets = resp.json()

    # Пятифакторная модель оценки
    for m in markets:
        m["composite_score"] = (
            m["text_relevance"] * 0.30 +
            m["volume_24h"] * 0.30 +
            m["liquidity"] * 0.15 +
            m["price_velocity"] * 0.15 +
            m["outcome_competitiveness"] * 0.10
        )
    return sorted(markets, key=lambda x: x["composite_score"], reverse=True)

Эффект на практике: при поиске «OpenClaw» вы увидите не только посты на Reddit, но и данные Polymarket о прогнозах количества активных пользователей. Коэффициенты от людей, ставящих реальные деньги, убедительнее любых обсуждений.

3.4 Разбор модели оценки по нескольким сигналам

Результаты из всех источников попадают в единый конвейер оценки:

# scripts/lib/score.py
def compute_composite_score(item: dict, query: str, days: int) -> float:
    # 1. Текстовая релевантность (двусторонняя схожесть + расширение синонимами)
    text_score = bidirectional_similarity(item["text"], query)

    # 2. Нормализация активности (лайки/репосты)
    engagement_score = normalize_velocity(item["engagement"])

    # 3. Вес авторитетности источника (HN > Reddit > X > TikTok)
    authority_score = SOURCE_WEIGHTS[item["source"]]

    # 4. Бонус за кросс-платформенную конвергенцию
    convergence_score = detect_convergence(item, all_results)

    # 5. Затухание актуальности (экспоненциальное затухание 0.98 в день)
    recency_score = 0.98 ** days_since_post(item["timestamp"])

    return (
        text_score * 0.35 +
        engagement_score * 0.25 +
        authority_score * 0.20 +
        convergence_score * 0.10 +
        recency_score * 0.10
    )

В слепых тестах оценка версии v2.5 выросла до 4.38/5.0 по сравнению с 3.73/5.0 в v1 (прирост около 17%).


Шаг 4: Режим сравнения (X vs Y)

4.1 Пример «Cursor vs Windsurf»

Одна из крутейших функций last30days — прямое сравнение двух инструментов:

/last30days cursor vs windsurf

Или через командную строку:

python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "cursor vs windsurf" \
  --emit=compact

4.2 Механизм трехстороннего параллельного исследования

Режим сравнения запускает три независимых потока:

# scripts/lib/score.py (ветка режима сравнения)
def run_comparative_mode(query_a: str, query_b: str, base_query: str):
    # Три параллельных поиска
    results_a = run_research(query_a)       # Поток 1: Только Cursor
    results_b = run_research(query_b)       # Поток 2: Только Windsurf
    results_base = run_research(base_query) # Поток 3: Обсуждения сравнения обоих

    # Генерация сравнительного отчета
    return render_comparison(results_a, results_b, results_base)

4.3 Интерпретация сравнительного отчета

Формат вывода выглядит примерно так:

## Comparative Analysis: Cursor vs Windsurf

### Strengths (Сильные стороны)

| Dimension | Cursor | Windsurf |
|---|---|---|
| Скорость автодополнения | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| Понимание контекста | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Редактирование файлов | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| Экосистема сообщества | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |

### Weaknesses (Слабые стороны)

| Dimension | Cursor | Windsurf |
|---|---|---|
| Потребление памяти | Высокое | Среднее |
| Оффлайн-поддержка | Плохая | Хорошая |

### Community Sentiment (Настроения сообщества за 30 дней)
- Cursor: 78% позитивно (1,240 обсуждений)
- Windsurf: 65% позитивно (890 обсуждений)

### Data-Driven Verdict (Вердикт на основе данных)
Cursor лидирует по вовлеченности сообщества и качеству автодополнения.
Windsurf превосходит в понимании контекста для сложных рефакторингов.
**Рекомендация**: Используйте Cursor для ежедневного кодинга; Windsurf — для архитектурного планирования.

Шаг 5: Встраивание в другие навыки / CI-пайплайны

5.1 Инъекция контекста

Другие навыки могут напрямую ссылаться на результаты исследований last30days:

## Recent Research Context
!python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "your research topic" \
  --emit=context

5.2 Чтение контекста из файла

## Research Context
!cat ~/.local/share/last30days/out/last30days.context.md

5.3 Интеграция JSON-вывода в CI/CD

Внедрение результатов в автоматизированные цепочки:

# Вывод в формате JSON для программного использования
python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "best LLM for code review 2026" \
  --emit=json > research.json

# Проверка топ-3 рекомендованных моделей
python3 -c "
import json
data = json.load(open('research.json'))
for r in data['top_results'][:3]:
    print(f\"- {r['title']} (score: {r['score']:.2f})\")
"

5.4 Переопределение .env на уровне проекта

Не хотите глобальных настроек? Разместите .claude/last30days.env в корне проекта, и он перекроет глобальный конфиг:

mkdir -p .claude

cat > .claude/last30days.env << 'EOF'
# API-ключи только для этого проекта
SCRAPECREATORS_API_KEY=sc_project_specific_key
OPENAI_API_KEY=sk-project-specific-key
EOF

TIP

Это особенно полезно при командной работе: каждый может использовать свои ключи, сохраняя единое поведение Skill.

5.5 Автоматическая проверка при запуске сессии

В v2.9.5 добавлена проверка конфигурации при старте сессии. Claude Code будет автоматически проверять полноту вашего .env при каждом запуске:

# Ручной запуск валидации
python3 ~/.claude/skills/last30days/scripts/last30days.py \
  --validate-config

При отсутствии ключей вы увидите четкие уведомления:

❌ SCRAPECREATORS_API_KEY is missing (required)
✅ OPENAI_API_KEY found
⚠️  BSKY_HANDLE is missing (optional)

Поиск и устранение неисправностей

В1: Ошибка отсутствия SCRAPECREATORS_API_KEY

Причина: Переменные окружения не загружены должным образом.

Решение:

# Проверьте наличие ключа
cat ~/.config/last30days/.env | grep SCRAPECREATORS_API_KEY

# Если установлен как плагин, попробуйте ручную синхронизацию
bash ~/.claude/skills/last30days/scripts/sync.sh

В2: Поиск в X всегда возвращает пустой результат

Причина: Срок действия cookie AUTH_TOKEN / CT0 истек или они недействительны.

Решение:

# 1. Перезайдите на x.com
# 2. Скопируйте свежие auth_token и ct0
# 3. Обновите .env

# Или используйте xAI API (cookie не нужны)
echo "XAI_API_KEY=xai-ваш-ключ" >> ~/.config/last30days/.env

В3: Поиск идет очень медленно (более 10 минут)

Причина: По умолчанию опрашивается до 10 источников параллельно; нишевые темы требуют больше повторных попыток API.

Решение:

# 1. Используйте --quick, чтобы пропустить глубокий поиск
python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "niche topic" \
  --quick

# 2. Проверьте, не «висит» ли какой-то конкретный источник
python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "topic" \
  --sources=reddit  # Только Reddit для отладки скорости

В4: Polymarket возвращает нерелевантные рынки

Причина: Соответствие тем на Polymarket основано на ключевых словах; для некоторых тем нет активных рынков.

Решение:

# Укажите расширение ключевых слов вручную
python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "AI coding assistant" \
  --polymarket-tags="artificial intelligence,llm,gpt" \
  --emit=compact

В5: Ошибка Permission denied для скриптов в Claude Code

Причина: У shell-скриптов нет прав на выполнение.

Решение:

chmod +x ~/.claude/skills/last30days/skills/last30days.sh
chmod +x ~/.claude/skills/last30days/scripts/last30days.py

В6: В отчете мало постов из Reddit, хотя обсуждений там много

Причина: С v2.9 используется ScrapeCreators; ключ указан, но формат может быть неверным.

Решение:

# Проверьте валидность ключа ScrapeCreators
curl -H "x-api-key: sc_ваш_ключ" \
  https://api.scrapecreators.com/v1/reddit/search?q=test

# Если ключ валиден, но данных нет, попробуйте форсировать использование ScrapeCreators в .env
echo "FORCE_SCRAPECREATORS=1" >> ~/.config/last30days/.env

Дополнительное чтение / Продвинутые направления

1. Тонкая настройка модели ранжирования

Веса в scripts/lib/score.py жестко закодированы. Если вы предпочитаете конкретный источник, вы можете форкнуть проект и изменить их:

# Поднять вес авторитетности Hacker News с 0.20 до 0.35
SOURCE_WEIGHTS = {
    "hackernews": 0.35,   # ↑ Изменено с 0.20
    "reddit": 0.25,
    "x": 0.15,
    "polymarket": 0.15,
    "youtube": 0.10,
}

2. Подключение собственных источников

Хотите добавить GitHub Issues или LinkedIn? Следуйте спецификации интерфейса в hackernews.py, создайте новый модуль в scripts/lib/ и зарегистрируйте его в last30days.py. Полное определение интерфейса есть в SPEC.md.

3. Автоматизация регулярных исследований

Используйте cron для регулярного обновления вашей базы знаний:

# Запуск еженедельного исследования "AI tools weekly" каждый день в 8 утра
0 8 * * * python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "AI developer tools weekly" \
  --days=7 \
  --emit=md \
  --output ~/Documents/Last30Days/ai-tools-weekly-$(date +\%Y-\%m-\%d).md

4. Интеграция с базой знаний (RAG)

Направляйте результаты исследования напрямую в персональную базу знаний:

# Генерация контекста с цитатами для другого навыка
python3 ~/.claude/skills/last30days/scripts/last30days.py \
  "Claude Code advanced techniques" \
  --emit=context > ~/.knowledge/last30_context.md

Полезные ресурсы

Updated March 25, 2026