Last active
December 30, 2020 04:42
-
-
Save yyoshiki41/b0731357215dae87e25c299e3075fdbe to your computer and use it in GitHub Desktop.
twitter の検索結果をspreadsheetに書き出す。
This file contains hidden or 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 TWITTER_CONSUMER_KEY = ''; | |
var TWITTER_CONSUMER_SECRET = ''; | |
var SHEET_NAME = ''; | |
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) | |
.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 = [], | |
firstId, lastRow, row = 0, id, result, col, dd; | |
var as = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME); | |
var cell = as.getRange('A2'); | |
// スプレットシートの最終行 | |
lastRow = as.getLastRow(); | |
var since_id = as.getRange(lastRow, 4).getValue(); | |
var WEB_URL = 'https://twitter.com/'; | |
// Twitter Search APIのURL | |
var url = 'https://api.twitter.com/1.1/search/tweets.json?q=' + query + '&count=100'; | |
if (lastRow > 1) { | |
url += '&since_id=' + since_id; | |
} | |
Logger.log('%s', url); | |
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; | |
}); | |
// 取得したツイートの最初のID | |
firstId = tweets[tweets.length - 1].id_str; | |
// 出力開始行を保持する | |
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--) { | |
col = 0; | |
result = tweets[j]; | |
// date | |
dd = new Date(result.created_at); | |
cell.offset(row, col++).setValue(dd.toLocaleString()); | |
// twitter ID | |
var link1 = '=Hyperlink("' + WEB_URL + result.user.screen_name + '","@'+ result.user.screen_name + '")'; | |
cell.offset(row, col++).setFormula(link1); | |
// follower | |
cell.offset(row, col++).setValue(result.user.followers_count); | |
// tweet ID | |
var link2 = '=Hyperlink("' + WEB_URL + result.user.screen_name + '/status/' + result.id_str + '", "' + result.id_str + '")'; | |
cell.offset(row, col++).setFormula(link2); | |
// cell.offset(row, col++).setValue(WEB_URL + result.user.screen_name + '/status/' + result.id_str); | |
// cell.offset(row, col++).setValue(result.id_str); | |
// tweet | |
cell.offset(row, col++).setValue(result.text); | |
row++; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Original: https://blog.hika69.com/blog/2016/04/20/google-apps-script-v2/
using: https://github.com/googlesamples/apps-script-oauth1
※ Callback URL settings
https://script.google.com/macros/d/{SCRIPT ID}/usercallback