ずっと5月

3日坊主してます

GithubのGraphQL API v4を使ってコミット数を取得&Twitterにツイートする

やっていき力が回復したのでやっていき。 Githubのコミット数をTwitterに投稿するなにやらを作った。

github.com

ggると同じものがすでにある。 blog.koogawa.com

丸パクリも嫌だったのでGithub APIの中でも最新のGraphQL API v4を使うことにした。 以下を参考にクエリを作成する

Query | GitHub Developer Guide

qiita.com

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

結果は以下。いい感じになった。
f:id:uminokaze521:20180610205055p:plain

これを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しました。" );

久しぶりにコードかけて楽しかった。