EasyBotterとGoogleCalenderで自動告知Botを作った記録①

背景
  • 自分の所属している合唱団の練習スケジュールをGogogleCalenderで管理している。
  • 若い子はどうやらTwitter依存者が多いようだ。
  • ほかの合唱団は結構Twitterによる外部発信を積極的にしている模様
  • 久しぶりにPHPの勉強をしたくなった。
やりたいこと
  • カレンダーで公開している情報を勝手に毎日つぶやいてほしい。
  • とりあえず、次回の予定だけ言ってくれればいいや。
  • 場所と時間、あと内容(練習なのか会議なのか本番なのか)を報告してほしい。
やったこと
  とりあえず、スクリプトを以下に公開します。

##############################################################################

<?php
/**
指定した日から指定した日の中のGoogleCalenderのデータを取得
その内容を"data.txtに出力するPHPスクリプト"
 */

//=============================================================================
//変数の設定をするエリア
$days = 15; //取得範囲の日付
$nameOfGroup = "!!グループ名をここに記載してください!!";
$tweetTag = "!!ツイートの最後につけるタグを記載してください!!"; //省略可

//GoogleCalenderにアクセスするための設定
define('CALENDAR_ID', '!!カレンダーのIDをここに記載してください!!');
define('API_KEY', '!!GoogleAPIのAPI_KEYをここに記載してください!!');
define('API_URL', 'https://www.googleapis.com/calendar/v3/calendars/'.CALENDAR_ID.'/events?key='.API_KEY.'&singleEvents=true');

//変数の設定をするエリア終了
//=============================================================================

//取得開始日の設定
$sYear = date("Y");
$sMonth = date("m");
$sDay = date("d");

//取得終了日の設定
$eYear = date("Y",strtotime("+" . $days . "day"));
$eMonth = date("m",strtotime("+" . $days . "day"));
$eDay = date("d",strtotime("+" . $days . "day"));

//データ取得範囲の設定
echo ("取得開始日は" . $sYear . "年" . $sMonth . "月" . $sDay . "日です。</br>");
echo ("取得終了日は" . $eYear . "年" . $eMonth . "月" . $eDay . "日です。</br>");


// ここでデータを取得する範囲を決めています
$t = mktime(0, 0, 0, $sMonth, $sDay, $sYear);
$t2 = mktime(0, 0, 0, $eMonth, $eDay, $eYear);

//カレンダー情報取得範囲の設定
$params = array();
$params[] = 'orderBy=startTime';
$params[] = 'maxResults=10';
$params[] = 'timeMin='.urlencode(date('c', $t));
$params[] = 'timeMax='.urlencode(date('c', $t2));

//アクセスするURLの作成
$url = API_URL.'&'.implode('&', $params);

//取得データの設定
$results = file_get_contents($url);
$calData = json_decode($results, true);
//var_dump($calData);//デバッグ用

$dataNum = 0;//何番目の予定を出力するかのタグ(通常は0)

$filename = 'data.txt';//出力先のファイル名

$Location = $calData["items"][$dataNum]["location"];//場所情報の取得
$Summary = $calData["items"][$dataNum]["summary"];//内容情報の取得

//予定の有無の確認
if (array_key_exists ( '0' , $calData["items"] )){
    //1日中の予定と時間指定の予定の分離
    if (array_key_exists ( 'dateTime' , $calData["items"][$dataNum]["start"] )){
        $Starts = $calData["items"][$dataNum]["start"]["dateTime"];
        $outputDate = date('m月d日 G時i分', strtotime($Starts));
        echo "</br>次回は時間指定の予定です。</br>";
        $outputText = $nameOfGroup . "の次回の" . $Summary . "は" . $Location . "で" . $outputDate . "開始です。【自動投稿】 " . $tweetTag;
    }elseif (array_key_exists ( 'date' , $calData["items"][$dataNum]["start"] )){
        $Starts = $calData["items"][$dataNum]["start"]["date"];
        echo $Starts;
        $outputDate = date('m月d日', strtotime($Starts));
        echo "</br>次回は一日中の予定です。</br>";
        $outputText = $nameOfGroup . "の次回のイベントは" . $Summary . "です。" . $Location . "で" . $outputDate . "にあります。【自動投稿】 " . $tweetTag;
    }

}else{
    echo "</br>このさきしばらく予定が登録されていないようです。</br>";
    $outputText = $nameOfGroup . "のイベントはこの先" . $days . "日間予定されていません。【自動投稿】 " . $tweetTag;
}

//元のファイル情報の出力
echo "</br>下記内容が元のファイルには書いてありました。</br>";
echo file_get_contents($filename);

//書き込んだデータの出力
file_put_contents($filename, $outputText);
echo "</br></br>下記内容を出力しました。";
echo ("</br>" . $outputText . "</br></br>");

?>

##############################################################################


上記内容をそのままパクってもらって必要なところだけ変更してもらえれば動くと思います。
 このファイルをEasyBotterが動いている直下のフォルダに置くと、bot.phpが参照している"data.txt"につぶやきの内容を書き込みます。


更に、下記内容をbot.phpのEasyBotterを呼び出します。と書いてある場所の上に追記します。
これにより、bot.phpがつぶやきを生成する前にGoogleCalenderの情報を読み込むことができるので、毎回最新の情報をつぶやかせることができます。
##############################################################################


//=============================
//GoogleCalenderReaderを呼び出します
//=============================
require_once("GoogleCalenderReader.php");


##############################################################################


あとは、Cronの設定をして1日1回好きなタイミングでつぶやかせてあげれば完成です。

コメント