Интеграция GitHub API с сайтом
GitHub API открывает данные публичных и приватных репозиториев: коммиты, PR, issues, релизы, контрибьюторы. Используется для портфолио разработчиков, документации проектов, отображения статуса Open Source библиотек.
Аутентификация
import { Octokit } from '@octokit/rest';
const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
Personal Access Token или GitHub App для более высоких rate limits (5 000 req/hr vs 60 req/hr для неаутентифицированных).
Типичные сценарии
Отображение активности Open Source проекта:
async function getRepoStats(owner: string, repo: string) {
const [repoData, contributors, releases] = await Promise.all([
octokit.repos.get({ owner, repo }),
octokit.repos.listContributors({ owner, repo, per_page: 10 }),
octokit.repos.listReleases({ owner, repo, per_page: 5 }),
]);
return {
stars: repoData.data.stargazers_count,
forks: repoData.data.forks_count,
openIssues: repoData.data.open_issues_count,
contributors: contributors.data.map(c => ({
login: c.login,
avatar: c.avatar_url,
commits: c.contributions,
})),
latestRelease: releases.data[0]?.tag_name,
};
}
Автообновление Changelog из GitHub Releases:
async function getChangelog(owner: string, repo: string): Promise<Release[]> {
const releases = await octokit.repos.listReleases({ owner, repo, per_page: 20 });
return releases.data
.filter(r => !r.prerelease && !r.draft)
.map(r => ({
version: r.tag_name,
date: r.published_at!,
description: r.body ?? '', // Markdown
url: r.html_url,
}));
}
GitHub Webhooks
Route::post('/webhooks/github', function (Request $request) {
$signature = $request->header('X-Hub-Signature-256');
$payload = $request->getContent();
$expected = 'sha256=' . hash_hmac('sha256', $payload, config('services.github.webhook_secret'));
if (!hash_equals($expected, $signature)) abort(401);
$event = $request->header('X-GitHub-Event');
match($event) {
'push' => HandleGithubPush::dispatch($request->json()),
'release' => UpdateChangelog::dispatch($request->json()),
'pull_request' => NotifyPRActivity::dispatch($request->json()),
default => null,
};
return response('ok');
});
Сроки
Отображение статистики репозитория: 1–2 дня. Полная интеграция с webhooks: 3–4 дня.







