Skip to content

Instantly share code, notes, and snippets.

@blue0513
Last active February 3, 2024 09:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save blue0513/f276b71e59950dc1e18f89b203cbae12 to your computer and use it in GitHub Desktop.
Save blue0513/f276b71e59950dc1e18f89b203cbae12 to your computer and use it in GitHub Desktop.
Twitter Bot managed By Google App Script
// 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;
}
@blue0513
Copy link
Author

blue0513 commented Sep 7, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment