質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.03%

GAS Twitter API json内のscreen_nameが取得出来ない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 257

score 0

前提

指定したキーワードでツイートを検索し、それをRTしてそのユーザをフォローする
Twitter botを作成したいです。

こちらの参考ブログを見て作っています。

実現したいこと

【screen_name(@hogehogeのこと)を取得したい】

発生している問題・エラーメッセージ

「jsonの中にあるscreen_nameの取得が出来ない」

③でフォローする関数の実行を追加したのですが、
【TypeError: undefined からプロパティ「screen_name」を読み取れません。】
とエラーメッセージが出てきてしまいます。

該当のソースコード

// 認証用インスタンス
var twitter = TwitterWebService.getInstance(
  '',       // 作成したアプリケーションのConsumer Key
  ''  // 作成したアプリケーションのConsumer Secret
);

// 認証
function authorize() {
  twitter.authorize();
}

// 認証解除
function reset() {
  twitter.reset();
}

// 認証後のコールバック
function authCallback(request) {
  return twitter.authCallback(request);
}






//ここからは{https://belltree.life/twitterapi-likes-retweet/}のコピペ

// セルを取得
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;
      }
      //7番目のuserを取り出せるように
      var screen = getTweetStatusN(tweet);

      var screenName=screen["screen_name"];


      var status = getTweetStatus(tweet);
      if (type == 'いいね') {
        if (!status.favorited) {
          putFavorite (tweet);
        }
      } else if (type == 'RT') {
        if (!status.retweeted) { 
          putFollow(screenName);
          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];
}

//

function getTweetStatusN (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[7];
}

// いいね を付ける
// 【参考】 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'
  });
}

//フォローする
function putFollow (screen_name) {
//  var service  = twitter.getService();
//  var response = service.fetch('https://api.twitter.com/1.1/friendships/create.json', {
//    method: 'post',
//    payload: { user_id:tweet.id_str}
//  });

  var service   = twitter.getService();
  var formData  = {
    'screen_name': screen_name,
    'follow':      true,
  };
  var options  = {
    'method' : 'post',
    'payload' : formData
  };
  var json      = service.fetch('https://api.twitter.com/1.1/friendships/create.json', options);
  var response  = JSON.parse(json);
}

私の解釈

putFollowで使用したAPIのリファレンス

こちらのExample Responseを見て、json配列の7番目(0から数えて)にuserというキーの中にscreen_nameがあると分かったので、putFollowで7番目の要素を返し,screen_nameを取得しようと考えました。

しかし、変数screenがundefined のようでうまく値を取得できません。

初心者なので聞いていることがおかしいかもしれませんが、是非皆様の知恵をお借りさせていただきたいです。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る