Last active
February 3, 2024 09:51
-
-
Save blue0513/f276b71e59950dc1e18f89b203cbae12 to your computer and use it in GitHub Desktop.
Twitter Bot managed By Google App 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
// ref: https://gist.github.com/M-Igashi/750ab08718687d11bff6322b8d6f5d90 | |
// 認証用インスタンス | |
var twitter = TwitterWebService.getInstance( | |
'', // 作成したアプリケーションのConsumer Key | |
'' // 作成したアプリケーションのConsumer Secret | |
); | |
/// main methods /// | |
// 認証 | |
function authorize() { | |
twitter.authorize(); | |
} | |
// 認証解除 | |
function reset() { | |
twitter.reset(); | |
} | |
function init() { | |
const time = getNextTime(0); | |
ScriptApp.newTrigger("createEveryHoursScheduler").timeBased().at(time).create(); | |
} | |
function postTweet() { | |
const service = twitter.getService(); | |
const tweet = selectRandomTweet(); | |
const response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', { | |
method: 'post', | |
payload: { status: tweet } | |
}); | |
} | |
function deleteAllTriggers() { | |
var triggers = ScriptApp.getProjectTriggers(); | |
for(var i=0; i < triggers.length; i++) { | |
ScriptApp.deleteTrigger(triggers[i]); | |
} | |
} | |
//// sub methods //// | |
function authCallback(request) { | |
return twitter.authCallback(request); | |
} | |
function createEveryHoursScheduler() { | |
ScriptApp.newTrigger("schedulePost").timeBased().everyHours(1).create(); | |
} | |
function schedulePost() { | |
const scheduledTime = getScheduledTime(); | |
if (!validateHourRange(scheduledTime.getHours())) return; | |
ScriptApp.newTrigger('execute').timeBased().at(scheduledTime).create(); | |
} | |
// 投稿は9:00~21:00の間 | |
function validateHourRange(hour) { | |
if (hour >= 9 || hour <= 21) return true; | |
return false; | |
} | |
// 現在から最大59分後の時間が返る | |
function getScheduledTime() { | |
var setTime = new Date(); | |
const minutes = setTime.getMinutes(); | |
const randomMinute = Math.floor(Math.random() * 59); | |
setTime.setMinutes(minutes + randomMinute); | |
return setTime; | |
} | |
// NOTE: 例えば実行時刻が「12:11」だった場合、「13:引数」を返す | |
function getNextTime(minute) { | |
var setTime = new Date(); | |
setTime.setHours(setTime.getHours() + 1); | |
setTime.setMinutes(minute); | |
return setTime; | |
} | |
function execute() { | |
postTweet(); | |
// 実行後、自身の不要なトリガーを削除する | |
deleteTrigger("execute"); | |
} | |
function deleteTrigger(targetTrigger) { | |
var triggers = ScriptApp.getProjectTriggers(); | |
for(var i=0; i < triggers.length; i++) { | |
if (triggers[i].getHandlerFunction() == targetTrigger) { | |
ScriptApp.deleteTrigger(triggers[i]); | |
} | |
} | |
} | |
function selectRandomTweet() { | |
const sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tweet"); | |
const lastRow = sheetData.getLastRow(); | |
const selectedRow = Math.floor(Math.random() * lastRow) + 1; // 1 ~ 最終行までのどれか | |
const selectedTweet = sheetData.getRange(selectedRow, 1).getValue(); | |
return selectedTweet; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Japanese Document: Qiita