Skip to content

Instantly share code, notes, and snippets.

@tajuszk
Last active September 22, 2020 18:57
Show Gist options
  • Save tajuszk/8c122a5ffb2fa3753275ddfc8eef895d to your computer and use it in GitHub Desktop.
Save tajuszk/8c122a5ffb2fa3753275ddfc8eef895d to your computer and use it in GitHub Desktop.
// 認証用インスタンス
var twitter = TwitterWebService.getInstance(
'*****************', // 作成したアプリケーションのConsumer Key
'************************************************' // 作成したアプリケーションのConsumer Secret
);
// 認証
function authorize() {
twitter.authorize();
}
// 認証解除
function reset() {
twitter.reset();
}
// 認証後のコールバック
function authCallback(request) {
return twitter.authCallback(request);
}
// セルを取得
var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // 「シート1」はシート名
/**
いいね or RT 機能
① 検索ワードをスプレッドシートから取得する
② 検索ワードをTwitterで検索する(たくさん取れてしまうので「直近10分間」の検索を10分毎に行う)
③ ツイートに いいね or RT をする
④ 他に検索ワードがあれば②に戻る
*/
function main () {
// ① 検索ワードをスプレッドシートから取得する
var searchWords = pickUpSearchWords();
// searchWordsの中身は
// [ [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] ,....,]
// という形式になっているので1つずつ見ていく
for (var i = 0, il = searchWords.length; i < il; i++ ) {
var searchWord = searchWords[i][0];
var type = searchWords[i][1];
var lastTweetId = searchWords[i][2];
// ② Twitterで検索する
var tweetList = findTweets(searchWord, lastTweetId);
// ③ 複数件ツイートを取得されるので for を使って1つずつツイートを取り出し いいね or RT をする
for (var j = 0, jl = tweetList.length; j < jl; j++ ) {
var tweet = tweetList[j];
// 最新のツイートのIDを取る
if (tweet.id_str > lastTweetId) {
lastTweetId = tweet.id_str;
}
var status = getTweetStatus(tweet);
if (type == 'いいね') {
if (!status.favorited) {
putFavorite (tweet);
}
} else if (type == 'RT') {
if (!status.retweeted) {
putRetweet (tweet);
}
}
}
// 重複処理をしないように最新のツイートIDを保存する
var titleRow = 1; // 『検索ワード』とか書いている部分の行数
var lastTweetIdCol = 3; // 『最終TweetId』の列までなので3列目まで
var updateCell = sheetData.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1); // i = 0 の時1行目なので+1してる
updateCell.setValue(lastTweetId);
}
}
// 検索ワードをスプレッドシートから取得する
function pickUpSearchWords () {
var titleRow = 1; // 『検索ワード』とか書いている部分の行数
var startRow = 1 + titleRow; // 1行目は『検索ワード』とか書いているので2行目から
var startCol = 1;
var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している)
var endCol = 3; // 『最終TweetId』の列までなので3列目まで
// 一括で取得する
var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues();
// ちなみにcellsの中身は
// [ [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] ,....,]
// という形式になっている
return cells;
}
// ツイートを検索する
// 【参考】 https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets
function findTweets (searchWord, lastTweetId) {
var service = twitter.getService();
var query = {
q: searchWord, // 検索ワード
lang: 'ja', // 日本語検索
locale: 'ja', // 日本限定で検索
result_type: 'recent', // 直近のツイートを検索
since_id: lastTweetId // これ以前のツイートは見ない
}
// 検索の内容を queryStr にまとめていく
var queryStr = '';
for (var key in query) {
// URLに日本語や記号を付けると上手く検索できないことがあるので#も変換する encodeURIComponent をする
queryStr += key + '=' + encodeURIComponent(query[key]) + '&'
}
// &が余計に付いているので削除しておく
var queryStr = queryStr.slice(0, -1);
var response = service.fetch('https://api.twitter.com/1.1/search/tweets.json?' + queryStr);
var result = JSON.parse(response)
return result.statuses
}
// いいね/RTの状態を確認
// 【参考】 https://developer.twitter.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/get-statuses-lookup
function getTweetStatus (tweet) {
var service = twitter.getService();
var response = service.fetch('https://api.twitter.com/1.1/statuses/lookup.json?id=' + tweet.id_str);
var result = JSON.parse(response)
return result[0];
}
// いいね を付ける
// 【参考】 https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-favorites-create
function putFavorite (tweet) {
var service = twitter.getService();
var response = service.fetch('https://api.twitter.com/1.1/favorites/create.json', {
method: 'post',
payload: { id: tweet.id_str }
});
}
// RT を付ける
// 【参考】 https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-retweet-id
function putRetweet (tweet) {
var service = twitter.getService();
var response = service.fetch('https://api.twitter.com/1.1/statuses/retweet/' + tweet.id_str +'.json', {
method: 'post'
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment