Skip to content

Instantly share code, notes, and snippets.

@hikarock
Last active December 30, 2020 04:42
Show Gist options
  • Save hikarock/e4d549ddbae5d9d67a1d93b56d69e129 to your computer and use it in GitHub Desktop.
Save hikarock/e4d549ddbae5d9d67a1d93b56d69e129 to your computer and use it in GitHub Desktop.
twitter-gas.js
var PROJECT_KEY = '';
var TWITTER_CONSUMER_KEY = '';
var TWITTER_CONSUMER_SECRET = '';
function trigger() {
search('東京オリンピック', 0);
}
function reset() {
var service = getService();
service.reset();
}
function getService() {
return OAuth1.createService('Twitter')
.setAccessTokenUrl('https://api.twitter.com/oauth/access_token')
.setRequestTokenUrl('https://api.twitter.com/oauth/request_token')
.setAuthorizationUrl('https://api.twitter.com/oauth/authorize')
.setConsumerKey(TWITTER_CONSUMER_KEY)
.setConsumerSecret(TWITTER_CONSUMER_SECRET)
.setProjectKey(PROJECT_KEY)
.setCallbackFunction('authCallback')
.setPropertyStore(PropertiesService.getUserProperties());
}
function authCallback(request) {
var service = getService();
var authorized = service.handleCallback(request);
if (authorized) {
return HtmlService.createHtmlOutput('認証が完了しました。このタブは閉じても問題ありません。');
} else {
return HtmlService.createHtmlOutput('認証に失敗しました。');
}
}
/**
* Twitterでキーワード検索したツイートをスプレッドシートに展開する
*
* @param query 検索キーワード
* @param sheetNum シート番号
*/
function search(query, sheetNum) {
if (query == '') {
return;
}
query = encodeURIComponent(query);
var response, json, tweets = [],
ss, as, cell, firstId, lastRow, row = 0, id, result, col, dd;
// Twitter Search APIのURL
var url = 'https://api.twitter.com/1.1/search/tweets.json?q=' + query + '&count=100';
var WEB_URL = 'https://twitter.com/';
var service = getService();
if (!service.hasAccess()) {
var authorizationUrl = service.authorize();
Logger.log('このURLを開いて認証してください: %s', authorizationUrl);
return;
}
var response = service.fetch(url, {
muteHttpExceptions: true,
method: 'get'
});
var json = JSON.parse(response.getContentText());
tweets = json.statuses;
if (tweets.length === 0) {
Logger.log('ツイートがありませんでした。');
return;
}
// 念のため id_str の降順にソートする
tweets.sort(function(a, b) {
return (a.id_str > b.id_str) ? -1 : 1;
});
// 保存するシートを指定する
ss = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(ss.getSheets()[sheetNum]);
as = SpreadsheetApp.getActiveSheet();
cell = as.getRange('A2');
// 取得したツイートの最初のID
firstId = tweets[tweets.length - 1].id_str;
// スプレットシートの最終行
lastRow = as.getLastRow();
// 出力開始行を保持する
row = 0;
// 取得済みのツイートを上書きしないように出力開始行を設定する
for (var i = 0; i < lastRow; i++) {
id = cell.offset(i, 0).getValue();
if (!id) {
Logger.log('id:' + id);
break;
}
if (firstId == id) {
Logger.log(id + '==' + firstId);
break;
}
// 出力開始行を1行下げる
row++;
}
// スプレッドシートに出力
for (var j = tweets.length - 1; j >= 0; j--) {
result = tweets[j];
col = 0;
dd = new Date(result.created_at);
cell.offset(row, col++).setValue(result.id_str);
cell.offset(row, col++).setValue(dd.toLocaleString());
cell.offset(row, col++).setValue(result.text);
cell.offset(row, col++).setValue(WEB_URL + result.user.screen_name + '/status/' + result.id_str);
cell.offset(row, col++).setValue(WEB_URL + result.user.screen_name);
row++;
}
}
@hikarock
Copy link
Author

素敵

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