GithubのGraphQL API v4を使ってコミット数を取得&Twitterにツイートする
やっていき力が回復したのでやっていき。 Githubのコミット数をTwitterに投稿するなにやらを作った。
ggると同じものがすでにある。 blog.koogawa.com
丸パクリも嫌だったのでGithub APIの中でも最新のGraphQL API v4を使うことにした。 以下を参考にクエリを作成する
Query | GitHub Developer Guide
query{ viewer { repositories(first: 100) { nodes { defaultBranchRef { target { ... on Commit { history(since: "2018-05-01T11:31:28+00:00") { totalCount } } } } } } } }
作成したクエリを試しに動かしてみる
以下のページで試しに動かせる。
GraphQL API Explorer | GitHub Developer Guide
結果は以下。いい感じになった。
これをPHPで実行する。
<?php require_once __DIR__.'/vendor/autoload.php'; use Dotenv\Dotenv; class GithubAPI { private $accessToken; private $client; public function __construct() { $dotenv = new Dotenv(__DIR__); $dotenv->load(); $this->accessToken = getenv('GITHUB_ACCESS_TOKEN'); } public function GetCountsCommits(){ $date = date("c",strtotime("-1 week")); $query = <<<EOT query{ viewer { repositories(first: 100) { nodes { defaultBranchRef { target { ...on Commit { history(since: "{$date}") { totalCount } } } } } } } } EOT; $contents = $this->postApi($query); return json_decode($contents); } public function postApi($query){ $options = [ 'http' => [ 'method' => 'POST', 'header' => [ 'User-Agent: My User Agent', 'Authorization: bearer '.$this->accessToken, 'Content-type: application/json; charset=UTF-8', ], 'content' => json_encode(['query' => $query]), ], ]; $context = stream_context_create($options); return $contents = file_get_contents('https://api.github.com/graphql', false, $context); } public function countCommits($datas) { $repos = $datas->data->viewer->repositories->nodes; foreach($repos as $repo){ $counts += $repo->defaultBranchRef->target->history->totalCount; } return $counts; } }
こんな感じになった。あとはTwitterAPIを使ってツイートしてやればいい。
TwitterAPIの使い方は以下の通り
<?php require_once __DIR__.'/vendor/autoload.php'; use Dotenv\Dotenv; use Abraham\TwitterOAuth\TwitterOAuth; class TwitterAPI { private $connection; public function __construct() { $dotenv = new Dotenv(__DIR__); $dotenv->load(); //.envが無いとエラーになる $consumerKey = getenv('TWITTER_CONSUMER_KEY'); $consumerSecret = getenv('TWITTER_CONSUMER_SECRET'); $accessToken = getenv('TWITTER_ACCESS_TOKEN'); $accessTokenSecret = getenv('TWITTER_ACCESS_TOKEN_SECRET'); $this->connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret); } public function PostToTwitter($message){ $result = $this->connection->post("statuses/update", array("status" => $message)); } }
実行の仕方は以下の通り。
<?php require_once "GithubAPI.php"; require_once "TwitterAPI.php"; $github = new GithubAPI(); $result = $github->GetCountsCommits(); $counts = $github->countCommits($result); $twitter = new TwitterAPI(); $twitter->PostToTwitter("今週は" . $counts . "回commitしました。" );
久しぶりにコードかけて楽しかった。