Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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はやはり強い。
テキスト形式でもちゃんと見れるようなメール内容だと更にありがたかった。

mozzz1100
高専 → 大学 → ?
https://www.mozzz.work/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away