Введение | 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. Один ключ для всего:
- Зарегистрируйтесь на scrapecreators.com и получите API Key.
- Создайте конфигурационный файл:
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
Полезные ресурсы
- GitHub: mvanhorn/last30days-skill
- ClawHub: last30days-official
- ScrapeCreators API: scrapecreators.com
- Официальный сайт OpenClaw: openclaw.ai
- Hacker News Algolia API: hn.algolia.com/api
- Polymarket Gamma API: gamma-api.polymarket.com