Last active
December 30, 2020 04:42
-
-
Save hikarock/e4d549ddbae5d9d67a1d93b56d69e129 to your computer and use it in GitHub Desktop.
twitter-gas.js
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
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++; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
素敵