Git Webhook 〜リクエストの中身一覧〜

イントロダクション

Githubにコミット(PUSH)したときなどにWebhookを使用してGithubからリクエストを飛ばすことができます。

このWebhookを使用してたシステム(アプリケーション)との連携を行うことができます。

これを受信して処理を行うのに自分はPHPを使用しました。PHPで受信したリクエストの中身をメモがてらに記載します。

Githookから送られるデータ

前提として以下のコードでGitからの送信されたデータ(JSON)を取得します。

 $json_string = file_get_contents('php://input');
 $json = json_decode($json_string,true);

取得したデータをvar_dumpできれば良いのですが、ブラウザで開くリクエストではないのでファイル出力して確認しました。重要であろう部分を抜粋しました。

// JSONからキーを指定して取得
キー: head_commit / 中身: Array
// 中身を取り出しました。
 中身のキー: distinct /値: 1
 中身のキー: message /値: テスト27(コミットコメント)
 中身のキー: timestamp /値: 2019-06-09T18:07:35+09:00
 中身のキー: url /値: https://github.com/ZenryokuService/GoalAchievement/commit/74adcfaf088fd0cf2955cea0769b369d2f76f156
キー: repository / Value: Array
 中身のキー: name / ArrayValue: GoalAchievement
 中身のキー: full_name / ArrayValue: ZenryokuService/GoalAchievement
 中身のキー: html_url / ArrayValue: https://github.com/ZenryokuService/GoalAchievement
 中身のキー: description / ArrayValue: 目標を達成するためのフローを作り上げる、Javaでテスト用のプログラムを作成。

しかし、シークレットキーなどがみつかりませんでした。。。まぁ当然か(笑)

PHP コマンド実行 〜MacOSでphpコマンドを叩く(環境変数の設定と暗号化)〜

イントロダクション

TwitterAPIを使用するのに、ユーザー名とパスワードを使用します。しかし、このような情報はインターネット上に公開するとよろしくないので。。。

暗号化します

phpをテストするのに今まではウェブサーバー上でやっていましたが、ローカル(自分のパソコン上)で実行したい場合があります(今回のように)。なのでphpコマンドを実行する方法を記載します。

Macの場合はすでにコマンドが使用できるようです。しかし使えない場合にはどうしたら良いのか?自分の端末では再現できませんが、要点だけ。。。

早い話が、「php.exe」などの起動ファイルを環境変数に通せばOKです。環境変数とはシンプルに示すと以下のようになります。

REM Windowsの場合以下のコマンドで表示される
>path

# Macの場合は以下のコマンドで表示される
$ echo $PATH

このコマンドで表示される、パスが環境変数に設定がされている状態です。

とりあえず、Windowsの場合は、php.exeがあるフォルダを環境変数に加えればOKです。 Macの場合はHome brewを使用するようです。詳細は本家サイトを参照ください。

PHPコマンドで暗号化

今回はJavaを使いたいのでJarファイルを作成してPHPコマンンドでjarを実行してみます。

この動画では「Hello Java」を出力しているだけですが、Javaの処理を変えてやれば「Java呼び出し」はできているのでphpから起動できることの証明になります。

ちなみにphpでjavaを起動した時は環境変数などが読み込まれていないのでパスをそのまま実装します。

そして実行したコマンドは以下の通りです。

JDKへのパス/bin/java -jar 起動するJARファイル

<実行結果>

------- output ------------array(1) {
  [0]=>
  string(10) "Hello Java"
}

純粋なJavaの起動する方法はJavaBasic〜Hello World〜を参照ください。

そして、phpから起動するときに暗号化したパスワードを下のようにプログラム引数に渡します。

java -jar Cription.jar 暗号化したパスワード

phpのコードは以下のようになります。

<?php
$result = null;
$output = null;
exec('/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/bin/java -jar Cryption.jar 暗号化したパスワード 0123456789012345', $output, $result);

print("------- output ------------");
var_dump($output);
print("-------- result -----------");
var_dump($result);
?>

実行結果

php test.php # コマンドの実行
------- output ------------array(4) {
  [0]=>
  string(54) "プログラム引数:暗号化したパスワード"
  [1]=>
ڀ}"ng(33) "暗号化:
  [2]=>
  string(40) ".Jpą!"
  [3]=>
  string(45) "復号号化:暗号化したパスワード"
}
-------- result -----------int(0)

とシンプルな感じです。

Javaのコードに関してはGitにあげてあります。

実際にテスト

作成したJARファイルをサーバーにアップします。URLは下に示します。

Githookのリクエストパラメータを取得します。

とりあえずテストします。

GitのWebhookからリクエストを受けて、リクエストの内容を出力して見ました。ファイルのパーミッション(権限)の部分で手こずりましたが、何とか。。。

下のようなコード(PHP)でログを取得しました。

 // Gitから(Webhookで)送信されたJSON
 $json_string = file_get_contents('php://input');
 // 送信されたJSONを読める形に変換する
 $json = json_decode($json_string,true);
 $fileName = chmod('githookLog.txt', 0666);
 $outData;
 foreach ($json as $key => $value) {
 $outData =$outData . "Key: " . $key . " / Value: " . $value;
 }
 file_put_contents('githookLog.txt', '--JSON:' . $_SERVER['REMOTE


悲報

レンタルサーバー上ではコマンドでjavaの実行ができませんでした。。。。

<実行手順>

  1. JDKの中身をサーバー上にアップロード
  2. PHPからexec関数を実行
    exec('../java/bin/java -jar Cryption.jar 暗号化したパスワード 0123456789012345', $output, $result);

 



PHP Git 連携方法〜暗号化と復号化、GitとTwitterの連携〜

イントロダクション

レンタルサーバーでWebAPI(TwitterAPIなど)を使用する時にユーザー名とパスワードが必要な時があります。しかしユーザー名とパスワードは機密情報なので公開したくありません。ではどーしたら良いでしょうか?

ここでは、暗号化と複合化の処理方法と、Githubのウェブフックをレンタルサーバーで受け取り、それを処理するというものを作成します。

暗号化と復号化

よく世間で耳にするのはSSL通信とか暗号化通信とか、セキュリティ。。。なんて言葉がよく聞かれます。

では、どのようにして機密情報を保護したら良いでしょうか?無難な方法としては暗号化です。これを使用するためには復号も必要ですがこれらをワンセットにしておけば問題ありません。

PHPでの暗号化と復号化

Mcrypt関数を使用するのが簡単だと(たまたま見つけたソース)思うのでこれを使用します。

自分の使用する端末では各関数への参照を探すのが面倒なのでレンタルサーバーの環境でテストします。つまりファイルをアップロードしてテストします。他の人が皆居場所なら問題ないでしょう(笑)

PHPコードを作成します。

参考サイトのコードをコピって起動してみます。出力されたデータは以下のようなものでした。
「string(18) "證怜捷蛹悶ョ繝シ繧ソ" string(24) "\c2ElE袿q刔]5�ーイnェツ表" string(24) "證怜捷蛹悶ョ繝シ繧ソ" ok」まぁ文字化けしています。
とりあえずはエンコード処理を追加します。

/** エンコード */
header("Content-Type: text/html; charset=UTF-8");

改めて実行します。出力結果は下に。。。

「string(18) "暗号化データ" string(24) "\��c2ElE��q��]5���n�•\" string(24) "暗号化データ" ok」

エンコードの問題でした。。。

ここから使用したいように変更を加えます。PHPコードは下のようになっています。

/** エンコード(追加した部分) */
header("Content-Type: text/html; charset=UTF-8");
/** 追加終わり */
$key = "暗号化キー";
$plain_text = "暗号化データ";
/* モジュールをオープンし、IV を作成 */
$td = mcrypt_module_open('des', '', 'ecb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

/* 暗号化ハンドルを初期化 */
if (mcrypt_generic_init($td, $key, $iv) != -1) {

    /* データを暗号化 */
    $c_t = mcrypt_generic($td, $plain_text);
    mcrypt_generic_deinit($td);

    /* 復号のため、バッファを再度初期化 */
    mcrypt_generic_init($td, $key, $iv);
    $p_t = mdecrypt_generic($td, $c_t);

    /* 後始末 */
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
}

/* 結果 */
var_dump($plain_text, $c_t, $p_t);

/* 元の文字と比較する場合 */
if (strncmp($p_t, $plain_text, strlen($plain_text)) == 0) {
    echo 'ok';
} else {
    echo 'error';
}

設計をする

今回はTwitterAPIを使用してgithubから飛んでくるリクエスト(webhook)を受けてツイートするというシンプルな実装です。下準備として以下のことを行います。

GithubのWebhook設定を行う。

手順はリンク先にあります。そしてこの設定を行う時に「Secret」という項目があるのでそこに値を入れます。そしてこれを変換するときのキーとするもよし、アクセスしてきたURLが想定通りの(Github)からのリクエストか判断するためのものでもよし。設定しておくと便利です。

<サンプル設計>

これは、自分が簡単に設計したものになります。

  1. GithubよりWebhookを受けたかどうか判定。
  2. Githubよりのリクエストでない場合は、処理をしない。
  3. Githubよりのリクエストだった場合は4〜の処理を行う。
  4. ユーザー情報ファイルを読み込む(暗号化済み)
  5. TwitterAPIのライブラリを読み込む。
  6. 上記のファイルより取得したユーザー名とパスワードでTwitterにログインしてツイート
  7. あと処理が必要ならやる(実装後に判断)

あとは実装あるのみです。。。

でわでわ。。。

 
 





Git 使い方 〜TwitterAPIと連携するには?〜

イントロダクション

TwitterAPIを利用して、GitへPUSHした時にツイートする仕組みを作ろうと考えました。結論

  1. GitでWebhookを設定
  2. リクエストを受けて起動するアプリを作ればOK!

GitでWebhook設定

対象のリポジトリからsettings -> webhook ->必要な項目を入力

上が入力した例です。ちなみにこの設定を使用しようとしています。
そして、登録しました。
なのでこのURLを叩けばコミットした通知をツイートすることができます。詳細は後ほど。。。

次はツイッターAPIを使うための準備を始めたいと思います。

続きを読む Git 使い方 〜TwitterAPIと連携するには?〜

Git 使い方〜Twitter連携の方法〜

イントロダクション

プロジェクトの情報を発信するためのサイトを作成しようとしています、そこで現在使用しているGitリポジトリとTwitterを連携させようと考え、その方法を調べたので記載します。

参考にしたのはこちらのサイト

とりあえずは、ぱっと見でSettingのとこからいけそうかと思ったけど、手順を踏んで見るとちょっと違う感じだったので、ほかの方法を使用することにします。

GithubWebHookを使う

この方法は、王道な方法だと思います。しかし、Twitterと連携する方法としてはほかにもあるのでそちらも調べてみようと思います。

など、色々とある様ですがGithubのWebHookをしようしようと思います。

そして、GitにもGithub, gitコマンド、Git Labなど色々とあるのでここでは「Github」のことをGitと呼びます。

Github WebHookの使い方

まずは、ページを開きます(Githubのリポジトリ)

1.自分のリポジトリページを開きます。

2.そして、右端にある「Setting」をクリックします。

3.左のリストになっているとこにある「Webhook」をクリックします。

そして、詳細なところはガイドを参照しながらやるとして

ここでパスワードを聞かれますので入力します。すると以下のような画面が表示されます。

入力する項目

  1. Payload URL
  2. Content type
  3. Secret

上記の項目を入力して、以下のイベントをトリガーにして起動するように設定するみたいです。起動するというのはPayload URLへリクエストを飛ばすという意味です。

Which events would you like to trigger this webhook?

ここで、Payload URLにTwitter APIを起動するプログラムへのリクエストを設定してやればおっけ!というわけです。
自分の場合は、使用しているレンタルサーバー(ミニムサーバ)に配置したphp ファイルのURLを指定して、コミットした時に、php が動くように設定しました。
でわでわ。。。