Ищите идеи для продукта в GitHub Issues с помощью Python и GraphQL. Практический гайд с кодом и метриками. Начните анализировать прямо сейчас!
Если вы соло-фаундер с ограниченными ресурсами, строить продукт наугад — непозволительная роскошь. Вместо того чтобы полагаться на интуицию или количество звёзд в репозиториях, опирайтесь на реальные боли разработчиков. GitHub Issues — это золотая жила: там разработчики буквально пишут, что им мешает. В этой статье вы узнаете, как с помощью Python и GraphQL превратить issues в источник идей для вашего продукта.
Прежде чем запрашивать данные, разбейте ваш идеальный продукт на конкретные технические сигналы. Разработчики не пишут «нужна битемпоральная книга учёта» — они жалуются на «расхождение состояния» или «дедлок в пайплайне». Найдите точные формулировки, которые используют пользователи.
Ищите точные сообщения об ошибках, например ETIMEDOUT или state synchronization failed. Это прямые указания на проблемы, которые вы можете решить.
Если вы создаёте высоконагруженные системы, ищите жалобы на задержки: TTS latency, retrieval too slow, time to first byte LLM context.
Для агентной инфраструктуры ищите infinite loop, hallucinates state или manual override ignored.
Используйте не REST API, а GraphQL — он позволяет запросить только нужные поля и экономит лимиты. Вот готовый скрипт для поиска issues по ключевым словам и дате.
import os
import requests
from datetime import datetime, timedelta
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN", "ваш_персональный_токен")
GRAPHQL_URL = "https://api.github.com/graphql"
def fetch_filtered_issues(keywords, repo=None, days_ago=30, state="open", max_results=50):
"""
Запрашивает issues через GraphQL API по ключевым словам и свежести.
"""
# Динамический расчёт даты
cutoff_date = (datetime.now() - timedelta(days=days_ago)).strftime('%Y-%m-%d')
# Собираем строку поиска
query_parts = ["is:issue"]
if state:
query_parts.append(f"is:{state}")
if repo:
query_parts.append(f"repo:{repo}")
query_parts.append(f"created:>{cutoff_date}")
# Добавляем ключевые слова
if isinstance(keywords, list):
query_parts.extend(keywords)
else:
query_parts.append(keywords)
search_query = " ".join(query_parts)
print(f"Выполняем поиск: {search_query}\n")
# Шаблон GraphQL-запроса
graphql_query = """
query SearchIssues($queryString: String!, $first: Int!, $after: String) {
search(query: $queryString, type: ISSUE, first: $first, after: $after) {
pageInfo { hasNextPage, endCursor }
edges {
node {
... on Issue {
number
title
url
createdAt
state
repository { nameWithOwner }
comments { totalCount }
author { login }
}
}
}
}
}
"""
headers = {
"Authorization": f"Bearer {GITHUB_TOKEN}",
"Content-Type": "application/json"
}
issues = []
has_next_page = True
end_cursor = None
while has_next_page and len(issues) < max_results:
fetch_count = min(50, max_results - len(issues))
variables = {
"queryString": search_query,
"first": fetch_count,
"after": end_cursor
}
response = requests.post(GRAPHQL_URL, json={"query": graphql_query, "variables": variables}, headers=headers)
if response.status_code != 200:
raise Exception(f"Ошибка API: {response.status_code}")
data = response.json().get("data", {}).get("search", {})
if not data:
break
for edge in data.get("edges", []):
node = edge.get("node", {})
if node:
issues.append({
"repo": node.get("repository", {}).get("nameWithOwner"),
"number": node.get("number"),
"title": node.get("title"),
"comment_count": node.get("comments", {}).get("totalCount"),
"url": node.get("url")
})
page_info = data.get("pageInfo", {})
has_next_page = page_info.get("hasNextPage", False)
end_cursor = page_info.get("endCursor")
return issues
# Пример: ищем проблемы с состоянием в агентных воркфлоу
issues = fetch_filtered_issues(
keywords=['"infinite loop"', "state"],
repo="langchain-ai/langgraph",
days_ago=90,
max_results=10
)
for issue in issues:
print(f"[{issue['repo']}#{issue['number']}] {issue['title']} - {issue['url']}")
Не все issues одинаково полезны. Высокосигнальная проблема обычно имеет три признака:
Игнорируйте issues без комментариев — скорее всего, они не вызывают интереса.
Разработчики не выносят спама. Если вы нашли релевантную проблему, сначала решите её прямо в треде, и только потом упоминайте свой проект. Используйте трёхчастную схему:
Например: «Если вам нужно решение, которое работает без задержек, я поддерживаю [название репозитория]. Надеюсь, сниппет поможет вам прямо сегодня!»
Скопируйте скрипт, настройте под свои ключевые слова и запустите анализ. Начните с одного репозитория, где сосредоточена ваша целевая аудитория. Через неделю у вас будет список реальных болей, на основе которых можно строить продукт. Не гадайте — анализируйте.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →