こんにちは八号機です。
ロケッツでエンジニアを担当しています。
あるときはHTMLコーディング、あるときはシステム開発を行なっています。
とあるときに、サイト内にJSで埋め込んでいるInstagramが表示されない!
という発言がChatWorkに発言されました。
弊社で対応させて頂いている場合ですと下記の部分になります。

上記はInstagramのAPIを利用して、投稿内容を表示しているのですが、
ちょこちょこ表示されなくなります。エラーの内容はトークンのエラー
(おそらく有効期限切れ)なのでInstagramの管理画面から再発行すれば解決します。
念のためにInstagramのドキュメントを見に行きましたがどの様なタイミングで
トークンの有効期限が切れるのか具体的に記載はされていませんでした。
個人的な想像ですが、パスワード変更を行うとトークンが変わるのではと思っています。
原因はわかりません、
・それならば頻繁にAPIのURLをチェックしてエラーが発生するかどうかを調べれば良いじゃない!
・人間が行うのは手間なので、その様なチェックする様なツールを作れば良いじゃない!
というエンジニア発想になりました。
という事で、ぱぱぱっとチェックを行うプログラムをPHPで作成しました。
仕様は以下です。
・APIのURLにアクセスし、HTTPとレスポンスの内容をチェックする。
・チェックの結果がエラーの場合はChatWorkにお知らせメッセージを投稿する。
結果からお伝えするとこんな感じでお知らせメッセージを投稿する事ができました。

ソースコードは下記になります。
UrlCheker.php
<?php
class UrlCheker {
// Chatwork API トークン
// http://developer.chatwork.com/ja/ に取得方方法が詳しく記載されています。
protected $chatwork_api_token = 'xxxxxxxxxxxx';
protected $charwork;
protected $list = [
// チェックを行う URL情報
'XXX SHOP' => [
// インスタグラムの API URL
'api_url' => 'https://api.instagram.com/v1/users/self/media/recent?access_token=xxxx',
// Chatwork でメッセージを送信するグループチャットの ID、ID は URL から調べる事が出来ます。
'chatwork_room_id' => 'xxxxxxxx',
// Chatwork に送信するメッセージ
'chatwork_message' => "URL ガ エラー ノヨウデス\nページ ヲ カクニン シテクダサイ\n".
"https://www.rakuten.ne.jp/gold/xxxx/",
// Chatwork で通知を行う相手
'chatwork_to' => [
// To:xxxxx の内容は Chatwork のメッセージ入力の「To」から調べる事ができます。
'[To:xxxxx] XXXX サン',
'[To:xxxxx] XXXX サン',
]
],
];
// API の URL をチェックし、エラーの場合は Chatwork にメッセージを送信
public function doCheck() {
foreach ($this->list as $key => $value) {
$isError = false;
// API の URL をチェックするための準備
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $value['api_url']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// API の URL にアクセスして結果を取得
$response = curl_exec($ch);
// API の URL にアクセスした結果の伝送に関する情報を取得
$info = curl_getinfo($ch);
curl_close($ch);
// HTTP のステータスコードが 200 (成功結果) の場合
if (intval($info['http_code']) == 200) {
// API から取得した内容を JSON に変換
$json = json_decode($response);
if ($json != false) {
// API のステータスコードもチェックする
$isError = $json->meta->code == 200 ? false : true;
}
}
// HTTP のステータスコード、または API のステータスコードの結果がエラーの場合は
// Chatwork にメッセージを送信する
if (intval($info['http_code']) != 200 || $isError) {
$m = '';
$m .= implode("\n", $value['chatwork_to'])."\n";
$m .= $value['chatwork_message']."\n";
$m .= '[info][title]'.$key.'[/title]';
$m .= "URL\n";
$m .= $value['api_url']."\n";
$m .= "レスポンス内容\n";
$m .= '[code]'.$response.'[/code][/info]';
$this->room_message($value['chatwork_room_id'], $m);
}
}
}
// Chatwok にメッセージを送信するメソッド
protected function room_message ($id, $message) {
$headers = [
'X-ChatWorkToken: '.$this->chatwork_api_token
];
$option = [
'body' => $message
];
$ch = curl_init( 'https://api.chatwork.com/v2/rooms/'.$id.'/messages' );
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($option));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
}
$url = new UrlCheker();
$url->doCheck();
そして、定期的に実行するためにcronで下記の設定も行いました。
# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 0 10-21 * * * root /usr/bin/php /home/hoge/chatwork-bot/UrlCheker.php
上記設定は10時〜21時の間に1時間ごとに実行となります。
(土日もお知らせメッセージが来るのは意図してそうしてます!)
ChatWorkはスマホアプリを入れているとプッシュ通知が来るのでお知らせに使うにはとても便利ですね。
コンサルロケッツではデザイナーの他にエンジニア(コーダー)も募集してます!
・困ったらプログラム書いて解決すれば良いじゃない!
・プログラムで効率化できたら達成感を感じる!
・JSバリバリ書いちゃうよ!
・HTMLとCSSをバリバリ書いちゃうよ!
・CSVで商品移行できちゃいます!
・実はAIに興味があります!(最近、私はグループ会社のお多福ラボで研究開発しています)
・まだまだ技術力はないけど意気込みなら誰にも負けないよ!
上記に1つでも当てはまる方はコチラから是非ご応募ください。


