先日作成したChatworkログ取得プログラムですが、こちらのプログラムだと1つのチャットのログしか取れません。今回は「たくさんあるグループチャットのログをとる」ことが求められているため、自分が所属している全てのグループチャットのログをとるように改良してみました。
目次
1. 自分が所属しているグループチャットの一覧を取得
まず、自分が所属しているグループチャットの一覧(room ID)を取得するプログラムです。
<?php //取得したAPIトークンを入れる $apiKey = "{APIトークン}"; // ヘッダ header("Content-type: text/html; charset=utf-8"); // cURLでPOST $ch = curl_init(); // cURLのオプション設定 {roomId}の箇所には取得したルームIDを入れる curl_setopt($ch, CURLOPT_URL, "https://api.chatwork.com/v2/rooms"); curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-ChatWorkToken: '. $apiKey)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 結果を文字列で返す curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // サーバー証明書の検証を行わない $rsp = curl_exec($ch); curl_close($ch); // 結果をコンソールに出力 $res = json_decode($rsp, true); //room_idを配列にいれる $room_id = array_column($res, 'room_id'); //room_idだけをファイルに書き込む $file = fopen("room_id.txt", "w"); foreach ($room_id as $key => $val ) { fwrite($file, $val."\n"); } fclose($file);
このプログラムを実行すると、「room_id.txt」というファイルが生成されます。
「room_id.txt」にはroom IDの一覧が書き込まれています。
2. roomIDを読み込みながらログを取得する
続いて、先ほどのプログラムで出力した「room_id.txt」を読み込みながら、チャットのログを取得するプログラムです。
「room_id.txt」を読み込みながら、配列に値を入れてループさせています。
<?php //取得したAPIトークンを入れる $apiKey = "{APIトークン}"; //room_idが出力されているファイル名 $filename = 'room_id.txt'; // ファイルを配列に格納し、さらに変数に格納 $roomid = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); //全てのroomidのログを取得 for ($i = 0 ; $i < count($roomid); $i++){ // ヘッダ header("Content-type: text/html; charset=utf-8"); // cURLでPOST $ch = curl_init(); // cURLのオプション設定 {roomId}の箇所には取得したルームIDを入れる curl_setopt($ch, CURLOPT_URL, 'https://api.chatwork.com/v2/rooms/'.$roomid[$i].'/messages?force=0'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-ChatWorkToken: '. $apiKey)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 結果を文字列で返す curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // サーバー証明書の検証を行わない $rsp = curl_exec($ch); curl_close($ch); if (!empty($rsp)) { // 結果をコンソールに出力 $res = json_decode($rsp); $res2 = json_encode($res, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); var_export($res2); // 結果をファイルに出力 ob_start(); var_export($res2."\n"); $data = ob_get_clean(); $fp = fopen('chatlog_'.$roomid[$i].'.json', "a"); fwrite($fp, $data); fclose($fp); } }
ループの処理を追加しただけで、それ以外は前回の内容をそのまま使っています。
3. 子ども向けプログラミングの知識は役にたったか?
今回は配列を使ってループ処理を行いました。
PHPの配列は、Scratchでは変数の「リスト」。
PHPのループは、Scratchでは「繰り返す」でおなじみですね。
やはりこの辺りのイメージを持っていたことが、「改良してみよう」とアイデアを思いつくきっかけになっています。Scratchは本格的なプログラミングをする上で役に立っていると思います。