最近GitHub GraphQL APIを利用する機会があったのでその備忘録です。
// 指定したユーザーのコントリビューションカレンダーを取得する
const getContributions = async (token, userName) => { const headers = { "Authorization": `bearer ${token}`, };
const body = { "query": ` query { user(login: ${userName}) { contributionsCollection { contributionCalendar { colors totalContributions weeks { contributionDays { color contributionCount date weekday } firstDay } } } } } ` };
const response = await fetch("https://api.github.com/graphql", { method: "POST", headers, body: JSON.stringify(body), });
const json = await response.json();
return json;};
指定したユーザーのコントリビューションカレンダーを取得する処理です。
関数の引数にpersonal access tokenとコントリビューションカレンダーを取得するユーザーを指定します。personal access tokenの発行方法は公式ドキュメントを参考にしてください。
引数で渡したトークンはAuthorization
リクエストヘッダーで使用します。
const headers = { "Authorization": `bearer ${token}`,};
body
にGraphQLのクエリーを渡します。
クエリーにはコントリビューションカレンダーの情報を取得するよう書かれています。
query { user(login: ${userName}) { contributionsCollection { contributionCalendar { colors totalContributions weeks { contributionDays { color contributionCount date weekday } firstDay } } } }}
取得できる情報は他にもたくさんあり、公式ドキュメントに取得できる情報が記載されています。
GraphQLのクエリーについて、公式がエクスプローラーを公開しているのでそちらでクエリーを検証してからプログラムに組み込むことをおすすめします。
最後にリクエストを発行します。
const response = await fetch("https://api.github.com/graphql", { method: "POST", headers, body: JSON.stringify(body),});
const json = await response.json();
return json;
{ "data": { "user": { "contributionsCollection": { "contributionCalendar": { "colors": [ "#9be9a8", "#40c463", "#30a14e", "#216e39" ], "totalContributions": 421, "weeks": [ { "contributionDays": [ { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-12T00:00:00.000+00:00", "weekday": 0 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-13T00:00:00.000+00:00", "weekday": 1 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-14T00:00:00.000+00:00", "weekday": 2 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-15T00:00:00.000+00:00", "weekday": 3 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-16T00:00:00.000+00:00", "weekday": 4 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-17T00:00:00.000+00:00", "weekday": 5 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-18T00:00:00.000+00:00", "weekday": 6 } ], "firstDay": "2023-11-12" }, { "contributionDays": [ { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-19T00:00:00.000+00:00", "weekday": 0 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-20T00:00:00.000+00:00", "weekday": 1 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-21T00:00:00.000+00:00", "weekday": 2 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-22T00:00:00.000+00:00", "weekday": 3 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-23T00:00:00.000+00:00", "weekday": 4 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-24T00:00:00.000+00:00", "weekday": 5 }, { "color": "#ebedf0", "contributionCount": 0, "date": "2023-11-25T00:00:00.000+00:00", "weekday": 6 } ], "firstDay": "2023-11-19" },
// ...
{ "contributionDays": [ { "color": "#40c463", "contributionCount": 5, "date": "2024-11-10T00:00:00.000+00:00", "weekday": 0 } ], "firstDay": "2024-11-10" } ] } } } }}