php GitApi 〜GitApiを使用する〜

GIt APIを使用する

〜API(WebAPI)を使用するのに、レンタルサーバーの都合でPHPを使用することになってしまったんでPHPでのGitAPIを使用します。

作成物は下のリンクです

https://zenryokuservice.com/mokuhyoAP.php

ツイッターが表示されています。

Gitにコミットした時に自動ツイートする処理を作成しました。

WebAPIはリクエストを送ればOK

PHPだろうが、PythonだろうがJavaだろうが。。。早い話が、WebAPIというのは以下の手順で使用します。

  1. WebAPIを提供してるURLにリクエストを送信。
  2. レスポンスを取得。

上記のような手順で使用します。。。なので使用する言語はリクエストが遅れればなんでもOKです。本当はJavaで実装したかった。。。がこれも今使っているレンタルサーバーでJavaが使えなかったので(もうちょっと調査すれば使えるかも?)後々に方法を考えることにします。

チュートリアル(コマンド実行)

参考にしたサイト
上のリンクにはGitAPIのチュートリアルが記載されています。(Githubのページなので英語です)
そして、そこにはコマンドでの使用方法が記載されています。
とりあえずはハローワールド的なコマンドを叩くような記載があったので、それを実行します。

curl https://api.github.com/users/ZenryokuService

これはcurl https://api.github.com/users/Gitユーザー名でコマンドを叩いた時のものです。
追伸:パスワードなしでアクセスできる情報ですので問題ありません。

レスポンスの内容は以下のようなものです。

{
  "login": "ZenryokuService",
  "id": 11029365,
  "node_id": "MDQ6VXNlcjExMDI5MzY1",
  "avatar_url": "https://avatars2.githubusercontent.com/u/11029365?v=4",
  "gravatar_id": "",
  "url": "https://api.github.com/users/ZenryokuService",
  "html_url": "https://github.com/ZenryokuService",
  "followers_url": "https://api.github.com/users/ZenryokuService/followers",
  "following_url": "https://api.github.com/users/ZenryokuService/following{/other_user}",
  "gists_url": "https://api.github.com/users/ZenryokuService/gists{/gist_id}",
  "starred_url": "https://api.github.com/users/ZenryokuService/starred{/owner}{/repo}",
  "subscriptions_url": "https://api.github.com/users/ZenryokuService/subscriptions",
  "organizations_url": "https://api.github.com/users/ZenryokuService/orgs",
  "repos_url": "https://api.github.com/users/ZenryokuService/repos",
  "events_url": "https://api.github.com/users/ZenryokuService/events{/privacy}",
  "received_events_url": "https://api.github.com/users/ZenryokuService/received_events",
  "type": "User",
  "site_admin": false,
  "name": "Takunoji",
  "company": "ZenryokuService",
  "blog": "https://zenryokuservice.com/wp",
  "location": "Japan",
  "email": null,
  "hireable": null,
  "bio": "My favorite word is \"Rock'n roll must not be a day\"\r\n好きな言葉は「ロッケンロールは一日にしてならず」です。",
  "public_repos": 23,
  "public_gists": 1,
  "followers": 2,
  "following": 3,
  "created_at": "2015-02-16T12:53:02Z",
  "updated_at": "2019-05-19T08:53:20Z"
}

見ての通りJSON形式でレスポンスを受け取りました。

PHPでのGit API

PHPの場合は。これをインストールしてやったほうが楽かも?

しかし、今作成しているプロジェクトサイトはツイッターAPIでコミットコメントを取得するので使わないかな?










TwitterAPI 〜PHPコードでツイートする手順〜

イントロダクション

TwoitterAPI(PHP版)を使用して、自分のプロジェクトサイトに以下の機能を追加しました。

  1. ツイートを表示する。
  2. GitからWebhookを受ける

TwitterAPIの使い方

実行結果

ツイートの実行結果

ソースコード

/** エンコード */
header("Content-Type: text/html; charset=UTF-8");
// TwitterOAuth
require_once("twitteroauth-master/autoload.php");
use Abraham\TwitterOAuth\TwitterOAuth;

// エラー出力
//ini_set('display_errors', 'On');
$access_token = "デベロッパ登録したときに表示されるアクセストークン";
$access_token_secret = "デベロッパ登録したときに表示されるアクセストークン_シークレット";

$connection = new TwitterOAuth("コンシューマ・キー"
        ,"コンシューマ_シークレット・キー"
        , $access_token, $access_token_secret);

// 自分のツイートの取得
// $content = $connection->get("account/verify_credentials");
// var_dump($content);

// ツイート検索
// $statuses = $connection->get("search/tweets", ["q" => "twitterapi"]);
// var_dump($statuses);

// ツイート送信
$statues = $connection->post("statuses/update", ["status" => "Testing hello world"]);
var_dump($statues);

関連ページ

Tweetボタンの追加方法
ツイッターデベロッパ登録
Githookのリクエスト内容一覧










Twitter APIを使うために〜Twitterへのデベロッパ登録〜

イントロダクション

TwitterAPIを使用してツイッター連携を実装しようとしています。現状は

PHPでGithookからのリクエストを受けてツイートする

というプログラムを作成しようとしています。そんなわけで。。、

Twitterへのデベロッパ登録

早い話が、Twitterへの開発者登録を行い、TwitterAppと登録(作成したアプリのあるURL場所を登録)します。

まずは下のサイトにアクセスします。

ツイッターのデベロッパサイト

そして、アプリケーションの登録のために、下ようなインデックスの部分をGoogleに翻訳してもらって読みます。

Creating a Twitter app

そうすると、デベロッパ登録のページに誘導されるのでそちらに移動します。

操作は画面の指示に従う感じでスムーズに完了できました。

入力するときに、アプリケーションの用途や目的などを説明してください(discribe your app)なんて文言がありますので、ちょっと考えておくと入力が楽です。
でわでわ。。。

<参考>

TwitterAPIライブラリの使い方





<meta property="og:description" content=“Git + TwitterAPIの連携を実装するためにTwitterデベロッパ登録を行いました。” />




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

イントロダクション

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

これを受信して処理を行うのに自分は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など)を使用する時にユーザー名とパスワードが必要な時があります。しかしユーザー名とパスワードは機密情報なので公開したくありません。ではどーしたら良いでしょうか?

暗号化と復号化

よく世間で耳にするのは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から飛んでくるリクエスト(hook)を受けてツイートするというシンプルな実装です。下準備として以下のことを行います。

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 が動くように設定しました。
でわでわ。。。

 








Git リポジトリをフォークする〜U16-プログラミングコンテスト〜

イントロダクション

ちょいと縁があり、北海道は、旭川のプログラミングコンテストのプログラムに触れる機会があったのでメモがてらに記載いたします。

記載すること

  1. Gitでフォークする方法
  2. 実際に対象のリポジトリからフォークした時の手順
  3. Mac環境でのC++をコンパイル〜実行

U16-旭川プログラミングコンテストで使用する、CHaserServerをフォークしてMac用にコンパイル、実行してみようと思います。参照するリポジトリはこちらです。

CHaserサーバー起動画面

Forkする

あまりにも簡単だったので記載することがほとんどないのですが、以下に示します。(ちなみに下の画像はフォーク後です)

<手順>

  1. 一度、自分のGithubにログインしておく
  2. フォークしたいリポジトリへ移動
  3. 下の様な「Fork」と書いてあるボタンを押下する

※フォークした後なので非活性状態になっています。

これだけでフォークされました。

余談

U16-プログラミングコンテストは旭川で行われているという記載がありますが、昨年などは札幌の方で予選を行い、決勝戦を旭川で。。。という様な流れで行われました。

実際に中学生〜高校1年生かな?(16歳以下)が参加して行います。札幌大会の優勝者はハイスペックなパソコンをもらっていました。

そして、プログラミングコンテストで使用する。競技用プログラムは「CHaserServer」というサーバーにアクセスしてプログラムでCool,「C」とHot「H」を操作して勝敗をつけます。ちょっとみづらいですが下に「C」と「H」がいます。

サーバーの起動ファイル(Windowsならexeファイル)を実行すると下の様な画面が出てきます。ここの「TCPユーザー」が実際にプレイヤーにあたります。

これを選択した状態で右にある「待機開始」ボタンを押下すると待機が始まります。つまり、クライアントアプリでのアクセスを待ちます。

クライアントアプリを作る

プログラミングコンテストの競技部門では、上記のサーバーを使用して(多分。。。)クライアントアプリでルールに則り勝敗を決します。

まぁダイヤモンドをとったり、相手を壁に挟んだり。。。ってな感じです。

実際のクライアント「H」のプログラムがこちらのZIPファイルです。

こいつをカスタムして、ゲームをやるもよし、競技に出場するのもよし!

でわでわ。。。









Github 使い方〜リポジトリにライセンスを設定する〜

ライセンスの設定手順

ライセンスを取得したいリポジトリに移動する。

「Create New File」をクリック、テキストボックスに「LICENSE」と入力する

そして、ライセンスのテンプレートがあるのでそれをクリックする

今回はApache2.0を選択しました。そして「Review amd submit」をクリック

細かいところを入力して「Commit New file」をクリック

こんな感じでライセンスの設定(LICENSEファイルの作成)ができました。

でわでわ。。。