LoginSignup
6
3

More than 3 years have passed since last update.

slackにtwitterDMが来たことを知らせるツールを無料で作った

Last updated at Posted at 2019-05-29

どういったものを作成したか

Screen Shot 2019-05-30 at 0.19.32.png

slackの指定したチャンネルにDMが来た場合にお知らせをするslackアプリを作成しました。

作成した経緯

  • グループ間で共有しているtwitterアカウントがあったが、DMの対応などが遅れがちだった
  • slackをチャットツールとして主に使っており、そこで通知できればいいという話に
  • 公式で提供されているものだと、タイムラインやツイートはできるみたいだが、DMの操作まではできなかった
  • 転送メールだと特定のチャンネルに送信することができなかった
  • メール転送だとタッチして開く必要があった
  • 特定のチャンネルにメールを通知できるアプリは、有料のワークスペースのみ使用可能だったため

作成する上で使ったもの

  • twitterメール設定
    • DMの通知を受け取るに設定
  • gmailのフィルターの作成
  • GAS
    • labelがついてかつ☆をつけていない場合、slackに通知し、☆をつけるプログラムの作成
    • twitterのDM通知メールがhtml形式できていたので、正規表現を用いて欲しい情報を抽出
    • 参考:GAS-Class GmailMessage
  • slackのincoming webhooks

ソースコード

main.gs
function fetchContactMail() {

  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var strTerms = 'label:twitterdm';
  var myThreads = GmailApp.search(strTerms, 0, 10); //条件にマッチしたスレッドを取得
  var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納  var valMsgs = [];

  var br = /[\r\n]+/g; //改行
  var rep = ""; //置換文字列
  /* 各メールから日時、送信元、件名、内容を取り出す*/
  for(var j =0;j<myMsgs.length;j++){
  for(var i =0;i<myMsgs[j].length;i++){
    if(!myMsgs[j][i].isStarred()){
      valMsgs[i] = myMsgs[j][i].getBody().replace(br,""); //html形式の取得と空白削除
      var myRegexp = /<td class=\"preheader\" style=\"padding:0;margin:0;line-height:1px;font-size:1px;font-size:1px;color:#ffffff;\">([\s\S]*?)<d><\/d><\/td>/;
      //↑tdタグで囲われた場所を抽出するための正規表現。gmailだとstyleで書かれるため大変汚い。
      var text = valMsgs[i].match(myRegexp);// matchを用いると0に素のテキスト1に抽出したテキストが入る 
      var date = myMsgs[j][i].getDate();
      var formatD = Utilities.formatDate(date, "Asia/Tokyo", "yyyy-MM-dd HH:mm"); //見やすいようにフォーマットをかける
      myMsgs[j][i].star();// starをつけることで次回以降引っかからないように
      notice_slack(text[1],formatD);
      }
    }
  }
}

// slackへの通知
var postUrl = 'web hook URL';
var username = 'twitterDM';  // 通知時に表示されるユーザー名
var icon = ':bird:';  // 通知時に表示されるアイコン
var message = 'test';  // 投稿メッセージ

function notice_slack(text,date) {
  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "attachments":[
      {
         "fallback":"fallback Test",
         "pretext":"DMが届きました\n"+date,
         "color":"#4169e1",
         "fields":[
            {
               "value":text
            }
         ]
      }
   ]
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}

結論

無料で同等のものを作れた。GASはやはり強い。
テキスト形式でもちゃんと見れるようなメール内容だと更にありがたかった。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3