GitHub APIでPrivate repositoryにコラボレーターを招待する(node.js fetch版)
GitHubのPrivate Repositoryにユーザーを招待するためのコードの実装方法についての覚え書きです。Google App Scriptを利用する場合、SDKを使用しない方法もあります。APIを呼び出すためにfetchを使用する方法や、User-Agentヘッダーの設定が必要なことなどが説明されています。エラーメッセージに関連して、User-Agentヘッダーが必要であることや、エラーレスポンスがJSONでない場合の処理についても説明があります。GitHubドキュメントの参考リンクも提供されています。
目次
GitHubのPrivate Repositoryにユーザーを招待するコードを作成する必要が出たため、実装方法を調べた時の覚書です。
API呼び出し部分だけPickしたもの
今回、Google App Scriptを利用するかもしれない前提だったため、あえてSDKを使いませんでした。
fetchを利用してAPIを呼び出すには、このようなコードになります。
await fetch(`https://api.github.com/repos/{USERNAME}/{REPO}/collaborators/{COLLABORATOR_USERNAME}`, {
method: 'PUT',
headers: {
Accept: 'application/vnd.github+json',
Authorization: `Bearer ghp_xxxxxx`,
'X-Github-Api-Version': '2022-11-28',
'User-Agent': '{USERNAME}'
},
})
はまったところ
API呼び出しをテストする中で、ちょっと調べる必要があった部分を簡単に紹介します。
UserAgentヘッダーは必須
await fetch(`https://api.github.com/repos/{USERNAME}/{REPO}/collaborators/{COLLABORATOR_USERNAME}`, {
method: 'PUT',
headers: {
Accept: 'application/vnd.github+json',
Authorization: `Bearer ghp_xxxxxx`,
'X-Github-Api-Version': '2022-11-28',
},
})
これだとエラーが出ます。
Request forbidden by administrative rules. Please make sure your request has a User-Agent header (https://docs.github.com/en/rest/overview/resources-in-the-rest-api#user-agent-required). Check https://developer.github.com for other possible causes.
Docsをみると、User-Agent
ヘッダーは必須とのことでした。
「APIリクエストを実行するGitHubアプリ名」か「実行者のユーザー名」を設定するとよいみたいです。
We request that you use your GitHub username, or the name of your application, for the
User-Agent
header value. This allows us to contact you if there are problems.
余談ですが、エラー文をChat GPTに渡して解説させるの、とても便利ですね。
GitHub APIを呼び出したときに、次のエラーメッセージが表示されました:
「リクエストは管理ルールによって禁止されています。リクエストにUser-Agentヘッダーが含まれていることを確認してください(https://docs.github.com/en/rest/overview/resources-in-the-rest-api#user-agent-required)。他の原因については https://developer.github.com を確認してください。」
これは、User-Agent ヘッダーがリクエストに含まれていないため、APIが受け入れなかったということです。エラーメッセージの指示に従って、リクエストにUser-Agentヘッダーを追加する必要があります。また、他の原因がないか https://developer.github.com をチェックしてください。
1行程度ならば翻訳アプリなどを使いつつざっと読むこともできますが、長いエラー文だったりすると、より威力が出そうです。
エラーレスポンスがJSONじゃないことがあるっぽい
上のエラーですが、result.json()
だとSyntaxError
を起こします。
成功時はJSONレスポンスを返すので、fetch
の結果でok === false
の場合は、result.text()
を返すのがよいかもしれません。
fetch(...)
.then(result => {
if (!result.ok) return result.text()
return result.json()
})
.catch(console.log)
ちなみに、「存在しないGitHubユーザー名」を送られたケースなど、エラーハンドリングはそこそこしっかりやる必要がありそうです。
参考URL
- https://docs.github.com/ja/rest/collaborators?apiVersion=2022-11-28
- https://docs.github.com/ja/free-pro-team@latest/rest/collaborators/collaborators?apiVersion=2022-11-28#add-a-repository-collaborator
- https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#user-agent-required