Last active
June 7, 2022 10:03
-
-
Save atiek/cf2ba5bcc91ad994f77f551327ff2c79 to your computer and use it in GitHub Desktop.
Hacker Newsを日本語訳してSlackに通知(Google Apps Script)
This file contains 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
// 使用ライブラリ | |
// https://github.com/soundTricker/SlackApp | |
// https://github.com/roana0229/spreadsheets-sql | |
// SpreadSheet設定 | |
var spreadSheetId = ''; | |
var sheetName = ''; | |
var sheetObj = SpreadSheetsSQL.open(spreadSheetId, sheetName); | |
// Slack設定 | |
var slackToken = ""; | |
var targetChannelName = ''; | |
var botUserName = ''; | |
// ハッカーニュースをSlackに送る | |
function postNewHackerNews() { | |
var storyIds = getTopStoryIds(); | |
var stories = []; | |
var postStr = ""; | |
var existStoryIds = getExistStoryIds(storyIds); | |
for each(var id in storyIds){ | |
if(existStoryIds.indexOf(id) == -1) { | |
var story = getStory(id); | |
if(story.url !== undefined) | |
{ | |
stories.push(deleteStoryElem(story)); | |
postStr += "<https://translate.google.co.jp/translate?u=" + story.url + "|" + LanguageApp.translate(story.title, 'en', 'ja') + ">" | |
+ "(<" + story.url + "|" + story.title +">)\n" | |
+ "score:*" + story.score + "* date:" + new Date(story.time * 1000).toLocaleString() + "\n\n"; | |
// translate連続実行制限を避けるため | |
Utilities.sleep(100) | |
} | |
} | |
} | |
// 記事を保存 | |
addStory(stories); | |
// Slackに送信 | |
postMessage(postStr); | |
} | |
// すでに取得済みの記事IDを取得 | |
function getExistStoryIds(storyIds) { | |
var idStr = storyIds.join(','); | |
var rows = sheetObj.select(['id']).filter('id IN ' + idStr).result(); | |
return rows.map(function(row, index){ | |
return row.id; | |
}); | |
} | |
// 記事データの不要な要素を削除 | |
function deleteStoryElem(story) { | |
delete story['deleted']; | |
delete story['type']; | |
delete story['text']; | |
delete story['dead']; | |
delete story['parent']; | |
delete story['kids']; | |
delete story['parts']; | |
delete story['descendants']; | |
return story; | |
} | |
// 記事を取得 | |
function getStory(id) { | |
var url = "https://hacker-news.firebaseio.com/v0/item/" + id + ".json"; | |
var json = UrlFetchApp.fetch(url).getContentText(); | |
var jsonData = JSON.parse(json); | |
return jsonData; | |
} | |
// 記事を保存 | |
function addStory(stories) { | |
sheetObj.insertRows(stories); | |
} | |
// 最新人気記事IDを取得 | |
function getTopStoryIds() { | |
var url = "https://hacker-news.firebaseio.com/v0/topstories.json"; | |
var json = UrlFetchApp.fetch(url).getContentText(); | |
var jsonData = JSON.parse(json); | |
return jsonData; | |
} | |
// 1週間以上前の保存した記事を削除 | |
function deleteStory() { | |
var today = new Date(); | |
var beforeWeek = new Date(); | |
beforeWeek.setDate(today.getDate() - 7); | |
var beforeWeekTime = Math.floor(beforeWeek.getTime() / 1000); | |
sheetObj.deleteRows('time < ' + beforeWeekTime); | |
} | |
// Slackにメッセージを送る | |
function postMessage(mssage) { | |
var slackApp = SlackApp.create(slackToken); | |
var channels = slackApp.channelsList().channels; | |
var targetChannel = channels.filter(function(row, index){ | |
return row.name === targetChannelName; | |
})[0]; | |
slackApp.postMessage(targetChannel.id, mssage, { | |
username : botUserName | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment