どういったものを作成したか
slackの指定したチャンネルにDMが来た場合にお知らせをするslackアプリを作成しました。
作成した経緯
- グループ間で共有しているtwitterアカウントがあったが、DMの対応などが遅れがちだった
- slackをチャットツールとして主に使っており、そこで通知できればいいという話に
- 公式で提供されているものだと、タイムラインやツイートはできるみたいだが、DMの操作まではできなかった
- 転送メールだと特定のチャンネルに送信することができなかった
- メール転送だとタッチして開く必要があった
- 特定のチャンネルにメールを通知できるアプリは、有料のワークスペースのみ使用可能だったため
作成する上で使ったもの
- twitterメール設定
- DMの通知を受け取るに設定
- gmailのフィルターの作成
- DMの通知メールにlabelをつけるため
- 参考:gmail-フィルタの作成
- GAS
- labelがついてかつ☆をつけていない場合、slackに通知し、☆をつけるプログラムの作成
- twitterのDM通知メールがhtml形式できていたので、正規表現を用いて欲しい情報を抽出
- 参考:GAS-Class GmailMessage
- slackのincoming webhooks
- これを用いて特定のチャンネルに通知を行う
- 参考: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はやはり強い。
テキスト形式でもちゃんと見れるようなメール内容だと更にありがたかった。