前提・実現したいこと
Google Apps Scriptで動作するTwitter Botを作成中、twitterとの連携認証のスクリプトどうしても動作しません。
最終的には、エラーを解消させて、スプレッドシートの検索ワードをtwitterで検索し、botがそのツイートに対して、RTないし、いいねをする、という動作を実行するようにしたいです。
発生している問題・エラーメッセージ
下記の記事を参考にさせていただき、動作させようとしています。
https://moripro.net/gas-twitter-bot/
https://teratail.com/questions/240990
『authorize』は、下記のメッセージで実行完了
23:59:55 お知らせ 実行開始
23:59:56 情報 Already authorized
23:59:57 お知らせ 実行完了
『reset』は、下記のメッセージで実行完了
0:00:55 お知らせ 実行開始
0:00:55 お知らせ 実行完了
『authCallback』で、下記のメッセージが出てしまいます。
0:01:41 お知らせ 実行開始
0:01:42 エラー
TypeError: undefined からプロパティ「parameter」を読み取れません。
(匿名) @ Service.gs:265
(匿名) @ TwitterWebService.gs:38
authCallback @ コード.gs:19
この状態で、『authorize』を再度実行すると、下記のメッセージが表示されます。
0:02:38 お知らせ 実行開始
0:02:38 情報 Open the following URL and re-run the script: https://api.twitter.com/oauth/authorize?oauth_token=xxxxxxxxxxxxxxxxxx
0:02:39 お知らせ 実行完了
URLから、認証後、再度『authorize』を実行すると実行完了しますが、『authCallback』で、また、同様のエラーが発生します。
このあと、下記の方のコードを参考にさせていただき、
https://gist.github.com/belltreeSzk/8c122a5ffb2fa3753275ddfc8eef895d
https://gist.github.com/cucmberium/e687e88565b6a9ca7039
//認証用インスタンスの生成 var twitter = TwitterWebService.getInstance( ' ',//API Key ' '//API secret key ); //アプリを連携認証する function authorize() { twitter.authorize(); } //認証を解除する function reset() { twitter.reset(); } //認証後のコールバック function authCallback(request) { return twitter.authCallback(request); } // セルを取得 var sheetData = SpreadsheetApp.getActi veSpreadsheet().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]; // ツイートを検索する // 【参考】 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 } // ② 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を保存する 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 = 4; // 『実行回数』の列までなので4列目まで // 一括で取得する var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues(); // cellsの中身は // [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,] // という形式になる return cells; } }
『authCallback』の実行を飛ばして、『main』について、実行すると下記のように実行完了しますが、動作はしません。
0:17:13 お知らせ 実行開始
0:17:15 お知らせ 実行完了
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]; // ツイートを検索する // 【参考】 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 } // ② 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を保存する 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 = 4; // 『実行回数』の列までなので4列目まで // 一括で取得する var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues(); // cellsの中身は // [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,] // という形式になる return cells; } }
該当のソースコード
//認証後のコールバック function authCallback(request) { return twitter.authCallback(request); }
こちらのコードを変更する必要があるのか、別に問題があるのかも検討が付かない状態です。
こちらについて、ご回答いただくために、不足情報が何かもわからない状況です。そのあたりから、ご教示いただきたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/14 02:28
退会済みユーザー
2021/11/14 02:35
2021/11/20 10:10
退会済みユーザー
2021/11/20 10:15 編集