Last active
March 6, 2020 14:37
-
-
Save AWtnb/91d4f02bae26d4ed2669bee4122b9af9 to your computer and use it in GitHub Desktop.
send tweet log to slack
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| 1日前のツイートをエゴサーチして集約・報告 | |
| 使用ライブラリ: Moment | |
| */ | |
| //////////////////////////////////////////////////////// | |
| // グローバル変数 | |
| //////////////////////////////////////////////////////// | |
| // token | |
| var WEBHOOK_URL_YHK = PropertiesService.getScriptProperties().getProperty("WEBHOOK_URL_YHK"); | |
| var ADDRESS = PropertiesService.getScriptProperties().getProperty("ADDRESS"); | |
| // シート | |
| var SHEET_ID = PropertiesService.getScriptProperties().getProperty("SHEET_ID"); | |
| var sht = SpreadsheetApp.openById(SHEET_ID).getSheets(); | |
| //////////////////////////////////////////////////////// | |
| // ログ数チェック | |
| //////////////////////////////////////////////////////// | |
| function checkLogCount () { | |
| var maxRow = sht[0].getLastRow(); | |
| if (maxRow > 1000) { | |
| var msg = "ログが1000件以上溜まっています。そろそろシートを整理しましょう。"; | |
| MailApp.sendEmail(ADDRESS, "log sheet warning", msg); | |
| } | |
| } | |
| //////////////////////////////////////////////////////// | |
| // slack 関連関数 | |
| //////////////////////////////////////////////////////// | |
| // slackに投稿する関数 | |
| function send2slack(hookURL, messageBlock) { | |
| var payload = { | |
| "text":"ツイート日報", | |
| "blocks": messageBlock | |
| } | |
| var options = { | |
| "method" : "POST", | |
| "payload": JSON.stringify(payload) | |
| } | |
| UrlFetchApp.fetch(hookURL, options); | |
| } | |
| // slack の block を作る関数 | |
| function makeBlockContent (author, iconUrl, tweet, source) { | |
| return { | |
| "type": "context", | |
| "elements": [ | |
| { | |
| "type": "image", | |
| "image_url": iconUrl, | |
| "alt_text": "images" | |
| }, | |
| { | |
| "type": "mrkdwn", | |
| "text": "<" + source + "|" + author + ">" | |
| }, | |
| { | |
| "type": "mrkdwn", | |
| "text": tweet + "\r\n------------------------------------------------------------------------------------------------------------------------" | |
| } | |
| ] | |
| } | |
| } | |
| //////////////////////////////////////////////////////// | |
| // 事前処理 | |
| //////////////////////////////////////////////////////// | |
| // シートから除外ユーザを取得する関数 | |
| function getExcludeUser () { | |
| var ret = []; | |
| var maxRow = sht[1].getLastRow(); | |
| var data = sht[1].getRange(2, 1, maxRow-1, 1).getValues(); | |
| for (var i = 0; i < data.length; i++) { | |
| ret.push(data[i][0]); | |
| } | |
| return ret; | |
| } | |
| // url が存在しているか確かめる関数 | |
| function isValidUrl (url) { | |
| try { | |
| UrlFetchApp.fetch(url); | |
| } | |
| catch (e) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| // slack への投稿の見出し作成する関数 | |
| function makeHeader (index, nUnit, totalItem) { | |
| return { | |
| "type": "section", | |
| "text": { | |
| "type": "mrkdwn", | |
| "text": "昨日は *" + totalItem + "* 件のツイートで言及されました![" + index + "/" + nUnit + "]" | |
| } | |
| }; | |
| } | |
| //////////////////////////////////////////////////////// | |
| // メイン処理 | |
| //////////////////////////////////////////////////////// | |
| // 前日に取得されたツイートを集計する関数 | |
| function checkTweet(hookURL) { | |
| // Momentで当日と1日前の日付を取得 | |
| var mmt = Moment.moment(); | |
| var today = mmt.date(); | |
| var lastDate = mmt.add(-1,"days").date(); | |
| // メッセージ内容の block | |
| var messageBlock = []; | |
| // 除外ユーザ取得 | |
| var excludeUsers = getExcludeUser(); | |
| // 全体を取得してループ数削減のために末尾から(=新しいものから古いものへ)行を遡る | |
| var maxRow = sht[0].getLastRow(); | |
| var data = sht[0].getRange(1,1,maxRow,5).getValues(); | |
| for(var r = maxRow-1; r >= 1; r--) { | |
| // 日付部分の文字列を取得 | |
| var day = data[r][0]; | |
| var m = day.match(/[A-Z][a-z]+ (\d{1,2}), \d{4}/); | |
| var date = m[1]; | |
| // その日になってからつぶやかれたツイートは飛ばす | |
| if (Number(date) == Number(today)) { | |
| continue; | |
| } | |
| // 2日以上前に入ったらループ打ち切り | |
| if (Number(date) != Number(lastDate)) { | |
| break; | |
| } | |
| // block に要素を追加(逆順なので新規のツイートが先頭になる) | |
| var author = data[r][1]; | |
| var iconUrl = data[r][2]; | |
| var tweet = data[r][3]; | |
| var source = data[r][4]; | |
| // 除外ユーザでなく、なおかつアカウントが消えていない場合のみ処理 | |
| if (excludeUsers.indexOf(author) < 0 && isValidUrl(iconUrl)) { | |
| messageBlock.push(makeBlockContent(author, iconUrl, tweet, source)) | |
| } | |
| } | |
| // ツイート件数 | |
| var nTweet = messageBlock.length; | |
| if (nTweet < 1) { | |
| return // 1件もつぶやかれなかった場合は何もしないで終了 | |
| } | |
| // 一度の投稿に付与できる block の上限は50のようなので安全策で45件ずつ投稿 | |
| var unit = 45; | |
| var nUnit = Math.ceil(nTweet/unit); | |
| var sendCount = 1; | |
| var unitBlock = []; | |
| for (var i = 0; i < messageBlock.length; i++) { | |
| unitBlock.push(messageBlock[i]); | |
| if ((i + 1) % unit == 0) { | |
| unitBlock.unshift(makeHeader(sendCount, nUnit, nTweet)); | |
| send2slack(hookURL, unitBlock); | |
| unitBlock = []; // reset blocks | |
| sendCount++ | |
| } | |
| } | |
| // 残りを投稿 | |
| if (unitBlock.length > 0) { | |
| unitBlock.unshift(makeHeader(sendCount, nUnit, nTweet)); | |
| send2slack(hookURL, unitBlock); | |
| } | |
| } | |
| // 各ワークスペースに投稿 | |
| function main () { | |
| checkTweet (WEBHOOK_URL_YHK); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment