ツイッターのbotに予定を教えてもらいたい。

カレンダーを開くのは予定を追加するときだけなのに、1日中ツイッターをみているので、ツイッターを見ているだけで予定を確認できるようにしようと思いました。

googleカレンダーから当日/翌日の予定を取得して自分にリプライを送るbotを作ります。IFTTTを使えば予定の直前にリプライを飛ばしてもらうことはできますが、あまり融通が利かないみたいなので今回はgasを使って見ることにしました。

アカウントの作成

何はともあれまずbotのアカウントがなければ始まらないのでtwitterでbotを鍵アカウントで作成します。Twitter APIのキーを取得するのに電話番号登録も必要なのでついでに済ませておきましょう。ここの作業で無駄に手間取ったので、困りポイントを一応書いておきます。
○なぜか認証番号の通知が来なかったので言語設定を英語にしたら届くようになりました。
○言語設定が英語のままだとなぜか認証できなかったので言語設定を日本語に戻すると認証が通りました。
ついでに鍵アカウントだと通知が見れないので自分の普段使っているtwitterアカウントにフォローさせておきましょう。

google apps script(gas)で新規プロジェクトを作成

中身はなんでもいいのでとりあえずプロジェクトを作成します。コールバックURLを設定するために先に作っているだけなので特に気にしなくていいです。

Twitter APIのキーの取得

twitter application manegementにアクセスしてAPIキーを取得します。

Consumer Key (API Key)とConsumer Secret (API Secret)が取得できたら大丈夫です。Create New Appを押すといくつか入力する項目が出てくるので適当に埋めていきます。
○[Name]にはアプリの名前を入れます。適当にイカす名前を入れといてください。
○[Description]にはアプリの説明を入れます。適当にフカしましょう。
○[Website]にはなんでもいいので適当に自分のtwitterページでも入れといてください。
○[Callback URLs]は入れないとエラー吐くのでちゃんと入れます。
https://script.google.com/macros/d/[スクリプトID]/usercallback
スクリプトIDはgoogle apps scriptのツールバーからファイル>プロジェクトのプロパティ>スクリプトのIDで見れるのでコピーしてください。

TwitterWebService ライブラリを導入

gasに戻って、ツールバーからリソース>ライブラリを開き、「ライブラリの追加」にプロジェクトキーを打ち込んで追加します。
プロジェクトキーは1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF
を入れます。
ライブラリのバージョンに最新のものを指定して保存します。

googleカレンダーのIDを取得

botと連携するカレンダーのIDを取得します。googleカレンダーを開いて設定>マイカレンダーの設定の下の方にあるカレンダーIDをどこかにコピーしておいてください。

実装

以下のコードをさっき作成したgasのプロジェクトに貼り付けてください。このとき、一番上にある認証用インスタンスにある項目は自分のConsumer KeyとConsumer Secretを使い、真ん中くらいにあるカレンダーIDを取得の部分には自分のカレンダーIDをはっつけてください。また、下の方にあるmakeTweet関数とmakeTweetWeek関数の中にある@~~~の部分には自分のアカウントのやつをはっつけます。また、それらのの中にある""部には好きなセリフを入れておくと毎朝が楽しくなると思います。

//認証用インスタンス
var twitter = TwitterWebService.getInstance(
  '---',       // 作成したアプリケーションのConsumer Key
  '---'  // 作成したアプリケーションのConsumer Secret
);

// 認証
function authorize() {
  twitter.authorize();
 }

// 認証解除
function reset() {
   twitter.reset();
 }

// 認証後のコールバック
 function authCallback(request) {
  return twitter.authCallback(request);
}

//朝にトリガーをセット
function setTrigger() {
  var triggerDay = new Date();
  triggerDay.setHours(6);
  triggerDay.setMinutes(30);
  ScriptApp.newTrigger("main").timeBased().at(triggerDay).create();
  
  if(triggerDay.getDay() === 0){
    triggerDay.setHours(9);
    triggerDay.setMinutes(00);
    ScriptApp.newTrigger("mainWeek").timeBased().at(triggerDay).create();
  }
}

// その日のトリガーを削除する関数(消さないと残る)
function deleteTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "main") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

function deleteTriggerWeek() {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "mainWeek") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

//カレンダーのIDを取得
function getCal(){
  var cal = CalendarApp.getCalendarById('---');
  return cal;
}

//今日の予定を取得するメインの関数
function getToday(){
  var cal = getCal();
  var dateNow = new Date();
  var events = getEvents(dateNow);
  return events;
}

//明日の予定を取得するメインの関数
function getNextday(){
  var cal = getCal();
  var dateNow = new Date();
  var date = new Date();
  date.setDate(dateNow.getDate()+1);
  var events = getEvents(date);
  return events;
}

//来週の予定を取得するメインの関数
function getWeek(){
  var arrCals = getCal();
  var date = new Date();
  var dateDisplay = new Date();
  var events ='';
  for (var j = 1; j < 8 ; j++ ){
    date.setDate(date.getDate() + 1); 
    dateDisplay.setMonth(date.getMonth() + 1)
    events = events + dateDisplay.getMonth() + "月"+ date.getDate() + '日\n' + getEvents(date) + "\n";
  }
  return events;
}

//カレンダーのイベント取得
function getEvents(getDate){
  var cal = getCal();
  var arrEvents = cal.getEventsForDay(getDate);
  var strEvents ="";
  var eventSize = arrEvents.length;
  if(arrEvents.length === 0){
    strEvents = "特にありません。";
  }else{
    for (var i=0; i<arrEvents.length - 1; i++){
      var strTitle = arrEvents[i].getTitle();
      strEvents = strEvents + strTitle + ' と ';
    }
    if(strEvents){
      strEvents = strEvents + arrEvents[arrEvents.length - 1].getTitle() + "です。";
    }else{
      strEvents = arrEvents[0].getTitle();
    }
  }
  return strEvents;
}

function makeTweet(){
  var tweet = "@~~~ 今日の予定は\n" + getToday() + "明日の予定は\n"+ getNextday();
  return tweet;
}

function makeTweetWeek(){
  var tweet = "@~~~ 明日以降の今週の予定は\n" +getWeek(); + "\nです。"
  return tweet;
}

//投稿
function postTweet(tweet) {
  var service  = twitter.getService();
  var url = 'https://api.twitter.com/1.1/statuses/update.json';
  var payload = {
     status: tweet
  };
  var response = service.fetch(url, {
  method: 'post',
  payload: payload
  });
  var result = JSON.parse(response.getContentText());
  Logger.log(JSON.stringify(result, null, 2));
} 

//ツイートするメインの関数
function main() {
  deleteTrigger();
  var tweet = makeTweet()
  postTweet(tweet);
}

function mainWeek() {
  deleteTriggerWeek();
  var tweet = makeTweetWeek()
  postTweet(tweet);
}

認証

スクリプトエディタの上部にある関数の実行からauthorizeを選んで実行します。その後、メニューから表示>ログを選んでそこに表示されたURLに飛んで認証を完了します。

トリガーのセット

スクリプトエディタ上部の編集>現在のプロジェクトのトリガーでトリガーを設定するための関数を毎朝実行するようにします。新しいトリガーから、実行する関数にsetTrigger、イベントに時間主導型/日タイマー/通知させるより前の時間(午前4-5時とか)を選んで保存します。

最後に

以上で設定が完了です。たぶん毎日botが当日/翌日の予定と、週末の朝に来週の予定を通知してくれるbotができたと思います。みなさんも好きなアニメキャラのアイコンに好きなセリフを付け加えて、アニメキャラに自分の予定を管理される気持ち悪いオタクとして生きていきましょう。
最後に参考にさせてもらったサイトを並べておくので、何か困った時に参考にしてください。

以上です。






この記事が気に入ったらサポートをしてみませんか?