Skip to content

Instantly share code, notes, and snippets.

@AWtnb
Last active March 6, 2020 14:37
Show Gist options
  • Select an option

  • Save AWtnb/91d4f02bae26d4ed2669bee4122b9af9 to your computer and use it in GitHub Desktop.

Select an option

Save AWtnb/91d4f02bae26d4ed2669bee4122b9af9 to your computer and use it in GitHub Desktop.
send tweet log to slack
/*
1日前のツイートをエゴサーチして集約・報告
使用ライブラリ: Moment
*/
////////////////////////////////////////////////////////
// グローバル変数
////////////////////////////////////////////////////////
// token
var WEBHOOK_URL_YHK = PropertiesService.getScriptProperties().getProperty("WEBHOOK_URL_YHK");
// mail
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