Skip to content

Instantly share code, notes, and snippets.

@yyoshiki41
Last active December 30, 2020 04:42
Show Gist options
  • Save yyoshiki41/b0731357215dae87e25c299e3075fdbe to your computer and use it in GitHub Desktop.
Save yyoshiki41/b0731357215dae87e25c299e3075fdbe to your computer and use it in GitHub Desktop.
twitter の検索結果をspreadsheetに書き出す。
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++;
}
}
@yyoshiki41
Copy link
Author

yyoshiki41 commented Jan 2, 2017

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

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