Last active
December 20, 2022 00:25
-
-
Save tajuszk/b1cad3d9eacb79298d53080775614030 to your computer and use it in GitHub Desktop.
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
'use strict'; | |
const consumerKey = 'XXXXXXXXXXXXXXXXXXXXXX' | |
const consumerSecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' | |
// 認証用インスタンス | |
var twitter = TwitterWebService.getInstance( | |
consumerKey, // 作成したアプリケーションのConsumer Key | |
consumerSecret // 作成したアプリケーションのConsumer Secret | |
); | |
// 認証 | |
function authorize() { | |
twitter.authorize(); | |
} | |
// 認証解除 | |
function reset() { | |
twitter.reset(); | |
} | |
// 認証後のコールバック | |
function authCallback(request) { | |
return twitter.authCallback(request); | |
} | |
// セルを取得 | |
var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("検索"); // 「シート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 service = twitter.getService(); | |
var response = service.fetch('https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=' + searchWord); | |
var tweetList = JSON.parse(response) | |
// ③ 複数件ツイートを取得されるので 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); | |
console.log(status); | |
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 // これ以前のツイートは見ない | |
} | |
console.log(query); | |
// 検索の内容を 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