PHP
GitHub
GraphQL

GitHub API v4をPHPから呼んでみる

APIを「叩く」って言い方、よく聞くけど、痛そうだから好きじゃないのよね…。

さて、GitHubのAPI使って何かやろうと思ったら、今はv4のGraphQLなんてのがあるんですね。
https://developer.github.com/v4/

こいつをPHPから呼び出してみようというわけです。

GitHub API v4は、GraphQLのクエリを含んだJSONを、ベアラートークンを付けて、エンドポイントにPOSTすると、JSONデータが返ってくる、という仕組みになっています。QueryじゃなくMutationを投げたら更新らしいですが、今回は取得だけやってみます。

GraphQLのクエリを書いてみる

GraphQL API Explorerなんてのがあるので、ここで書いてみましょう。

とりあえず、よくあるパターンで、特定ユーザーのリポジトリの名前とURLの一覧を取得するクエリを書いてみました。

{
  user(login: "mifumi323") {
    repositories(first: 10) {
      nodes {
        name
        url
      }
    }
  }
}

GraphQL見たことのない人でも何となくわかるんじゃないでしょうか。「mifumi323」というユーザーのリポジトリの最初の10件の名前とURLを取得するクエリです。

返ってくるJSONも見りゃわかる内容なので、省略します。

ベアラートークンを取得する

GitHub APIの要件なのかGraphQLの要件なのか知りませんが、APIを呼び出すときにはベアラートークンが必要です。

settings.png

Settings→Developer settings→Personal access tokensと進んでいって、Generate new tokenしましょう。scopeはrepoでいいはず。発行したトークンは一度しか表示されないので、忘れずにメモしておきましょう。

POSTする

クエリとトークンがそろったので、POSTするPHPプログラムを書いてみます。\$tokenと\$queryにはさっき作ったやつを入れましょう。

<?php

$token = 'ここにトークンを書いてね';
$query = 'ここにクエリを書いてね';

$options = [
    'http' => [
        'method' => 'POST',
        'header' => [
            'User-Agent: My User Agent',
            'Authorization: bearer '.$token,
            'Content-type: application/json; charset=UTF-8',
        ],
        'content' => json_encode(['query' => $query]),
    ],
];
$context = stream_context_create($options);
$contents = file_get_contents('https://api.github.com/graphql', false, $context);
var_dump(json_decode($contents));

file_get_contentsって便利ですね。stream_context_createでPOSTするコンテンツやらヘッダやらを用意しています。

contentはクエリそのままだと受け付けないので、queryフィールドにクエリの内容を含んだJSONにしておきます。それに合わせて、Content-typeも指定しておきます。

そして、ベアラートークンをAuthorizationに入れてPOSTします。

GitHubはv3の頃もそうでしたが、ヘッダにUser-Agentを入れておかないとエラーになります。特に何かに使っているわけでもないようなので、適当に無難な文字列を入れておくといいかと思います。

エラー処理など

GraphQLのエラーは、dataフィールドがnullになってerrorsフィールドが入ってきます。ただし、GraphQLをパースする前のエラー、例えば認証エラーなどの場合は、HTTPのエラーコードが返ってきます。

理屈を考えれば当たり前ですが、区別して扱うようにしましょう。