Skip to content

Instantly share code, notes, and snippets.

@tajuszk
Last active July 3, 2020 19:37
Show Gist options
  • Save tajuszk/17021115dbf04756d84921a9056d2cee to your computer and use it in GitHub Desktop.
Save tajuszk/17021115dbf04756d84921a9056d2cee to your computer and use it in GitHub Desktop.
var accounts = ['account1', 'account2']
// 認証用インスタンス(複数入れられるように)
var twitterInstances = {};
for (var i in accounts) {
var instance = TwitterWebService.getInstance(
'XXXXXXXXXXXXXXXXXXXX', // 作成したアプリケーションのConsumer Key
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' // 作成したアプリケーションのConsumer Secret
);
// サービス名をアカウント名にしておく
var account = accounts[i]
// serviceNameが 『Twitter』 固定にならないようにライブラリの関数を上書き(あまり良くないけど…)
instance.service_name = account
instance.getService = function() {
return OAuth1.createService(this.service_name)
.setAccessTokenUrl('https://api.twitter.com/oauth/access_token')
.setRequestTokenUrl('https://api.twitter.com/oauth/request_token')
.setAuthorizationUrl('https://api.twitter.com/oauth/authorize')
.setConsumerKey(this.consumer_key)
.setConsumerSecret(this.consumer_secret)
.setCallbackFunction('authCallback')
.setPropertyStore(PropertiesService.getUserProperties())
}
// 作ったserviceインスタンスを保存しておく
twitterInstances[account] = instance
}
// 認証
function authorize() {
for (var key in twitterInstances) {
instance = twitterInstances[key]
instance.authorize();
}
}
// 認証解除
function reset() {
for (var key in twitterInstances) {
instance = twitterInstances[key]
instance.reset();
}
}
// 認証後のコールバック
function authCallback(request) {
instance = twitterInstances[request.parameter.serviceName]
return instance.authCallback(request);
}
// セルを取得
var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // 「シート1」はシート名
// ツイートを投稿
function postUpdateStatus() {
var message = pickUpTweet();
if (message == "") {
Logger.log("投稿しませんでした")
return;
}
for (var key in twitterInstances) {
instance = twitterInstances[key]
var service = instance.getService();
if (service.hasAccess()) {
var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
method: 'post',
payload: { status: message }
});
}
Logger.log(message)
Logger.log("投稿しました")
blockTime(3000); // とりあえず同時はNGらしいので3秒間待機
}
}
// 指定した`timeout`ミリ秒経過するまで同期的にブロックする関数
function blockTime(timeout) {
var startTime = Date.now();
while (true) {
var diffTime = Date.now() - startTime;
if (diffTime >= timeout) {
return;
}
}
}
/**
* ツイートを順番に選択する処理
* 処理の中で前回の番号を保持していくことは出来ないので
* 投稿された回数をシートに保存しておき、一番投稿された回数が少ない記事を次の記事にする
**/
function pickUpTweet() {
var titleRow = 1; // 『投稿内容』とか書いている部分の行数
var startRow = 1 + titleRow; // 1行目は『投稿内容』とか書いているので2行目から
var startCol = 1;
var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している)
var endCol = 2; // 『投稿回数』の列までなので2列目まで
// 投稿を一括で取得する
var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues();
// ちなみにcellsの中身は
// [ [ '投稿内容', '投稿回数'] , [ '投稿内容', '投稿回数'] , [ '投稿内容', '投稿回数'] ,....,]
// という形式になっている
// Logger.log(cells);
var postData = cells[0]; // postData = [ '投稿内容', '投稿回数'] なので postData[0] => 投稿内容, postData[1] => 投稿回数
var row = 1 // 行番号(選ばれたらその行の投稿された回数を+1するために持っておく)
for (var i = 0, il = cells.length; i < il; i++ ) {
// 投稿回数が少なかったら更新(回数が同じであればそのまま)
if (cells[i][1] < postData[1]) {
postData = cells[i]
row = 1 + i // 行は1から始まるので+1して保存しておく
}
}
var postMessage = postData[0];
// 投稿する内容の投稿回数の部分のセルだけ取得して、+1して更新する
var updateCell = sheetData.getRange(row + titleRow, 2, 1, 1);
updateCell.setValue(postData[1]+1);
return postMessage;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment