masuTomo’s blog

競技プログラミングの勉強メモです.主にPythonを使用します.数学の記事も書くかもしれません.

自分がいいねしたツイートの一覧を取得してGoogle Spread Sheetに出力する

動機

ツイッターをやっていて気になったツイートには,備忘録の意味をこめて,いいね!をすることが良くあるのですが,結局見返さないままになってしまっていました.そこで,Twitter APIを利用して,自分が過去にいいね!したツイートの一覧を取得してみました.

使ったもの

作ったもの

基本的な動き

1.自分のUserIDを指定する 2.指定したUserIDが過去にいいね!したツイートの一覧を取得する 3.取得したツイート一覧をGoogle SpreadSheet に表示する

検索部分のコード

  var userId = "user id を指定"; //@からはじまるusernameではなく,ただの数字の羅列
  var url = "https://api.twitter.com/2/users/" + userId + "/liked_tweets"; //URLの末尾にliked_tweetsと指定することで,いいね!したツイートが取得できるようだ
  
  //検索の設定
  var options = {
    "method": "get",
    "headers": {
      "User-Agent": "v2LikedTweetsJS", //これもこのまま書いておけばOK
      "authorization": "Bearer BearerTokenと呼ばれるものをここに書く",
    },
  };

 //取得した結果をJSON形式に変換
 var response = JSON.parse(UrlFetchApp.fetch(url, options));

基本的にはこんな感じである.あまりわかっていないが動いているのでヨシ!とする.BearerTokenについては,Twitter APIの使用申請をすればわかる(もらえる).

user id について

自分がいいね!したツイートを取得したいので,自分のTwitter アカウントのuser idを指定する.調べ方は,ツイッターを開いてページソースから「id_str」の文字列を検索するとidが出てくる.

url について

上記のコードに記載したのが基本形である.ここにさらにオプションを付け加えたい場合は次のようにする.

var url = "https://api.twitter.com/2/users/" + userId + "/liked_tweets" + "?tweet.fields=author_id" + "&max_results=30";

検索オプションを1つだけつける場合は,末尾に?を付けてから,オプションtweet.fields=author_idなどをつける.2つ以上つける場合は&で連結する.

ちなみに,tweet.fields=author_idは,いいね!したツイートをしたユーザーのIDを取得しており,max_results=30は1回の検索で30件までしか取得しないというオプションである.

詳細はこちら

developer.twitter.com

取得結果をSpreadSheetに出力する

  //検索結果を出力するスプレッドシート
  const folderId = "**************"; //SpreadSheetが格納されているフォルダーのid
  const spreadSheetId = "**************";//結果を出力するSpreadSheetのid
  const sheet = SpreadsheetApp.openById(spreadSheetId);
  const ss = sheet.getSheetByName("シート1") //シートも名前で指定しておく(シートに対してでないと,getRangeが使えない)

  var nRow = 1;
  var col_author = 1;
  var col_text = 2;

   dat = response.data;
    for (let i = 0;  i < dat.length; i++){

      //レスポンスから値を取得
      author_id = dat[i]["author_id"];
      text = dat[i]["text"];

      //スプレッドシートに値をセット
      ss.getRange(nRow,col_author).setValue(author_id);
      ss.getRange(nRow,col_text).setValue(text);
      nRow++;
    }

おまけ

基本的には上述したような感じでOKだが,過去にいいね!したツイートがたくさんある場合は,一度には取得できない(おそらく一度に100件までしかツイートを取得できない).そのような場合には,responsenext_tokenと呼ばれるものがついてくる.それが検索結果についてきた場合は,それを使用して,再度リクエストを投げれば良い.その際にURLを次のように変更する.

var url = "https://api.twitter.com/2/users/" + userId + "/liked_tweets" + "?tweet.fields=author_id" + "&max_results=30"+"&pagination_token=" + nexttoken;

末尾のnexttokenresponseから取得したnext_tokenの値を格納している.また,オプションで指定するときはpagenation_tokenであることにも注意が必要(これに気づかずしばらくはまった).

おわりに

Webまわりのことは全く詳しくなく,いろいろ調べながら,まぁ動けばいいやというくらいの感じで作業しました.用語等にも誤りがあるかもしれませんし,この機能を使えばもっと簡単に実現できるというようなこともありそうです.例えばTweepyというサービス(ライブラリ?)がよく使われているようでした(何も知らない).

今後やりたいこと

いいね!したツイートを取得したら,そのツイートをだれがしたのか知りたいですよね(idではなく,名前が知りたい).ただ,一緒に取ってくる方法がわかりません.ツイートの取得とは別にuseridを指定すれば取得できるのですが,ツイートごとにその作業が必要なので,APIの呼び出し回数制限にひっかかってしまいます.