【ライフハック】女子アナ応援botをTwitterAPIで

<img width="480" alt="スクリーンショット 2020-01-02 0.21.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/9172882c-993e-1b4f-92a0-2e6ffb134c6f.png">

## TL;DR
女子アナを応援する(写真、動画をリツイートする)botを作ります。
TwitterAPI、Google App Script(以下GAS)を使います。
[このアカウント](https://twitter.com/TamuraOenBot)をフォローすると幸せになれると思います＾＾

## はじめに
お正月、~~ゴロゴロしていたら~~ニュースを見ていたら田村真子さんという美女アナを見つけました。
Twitterフォローしようと思ったのですが公式もBotもなかったので自分で作ることにしました。

言語選定について。
僕のメインの言語はPythonなのですが、定期的に、かつ勝手に実行して欲しいので
今回はGASで書くことにしました。

## 前提
- やったことだけ話します(コンセプトを楽しんでいただければ幸いです)
- 細かいToDoは紹介した記事に任せています

## やったこと
1. TwitterAPIの申請
2. GASとTwitter連携
3. Twitterに投稿するGASを書く
4. トリガーを指定して自動的に実行されるようにする


1 は、[この記事](https://moripro.net/gas-twitter-developer-api/)を参考にして
2 は、[この記事](https://moripro.net/gas-twitter-bot/)を参考にします(圧倒的感謝)
この段階で、何か適当なことなら、GASからTweetできる状態になっていると思います。

3 ここからいい感じに書いていきます
今の所

```javascript
//認証用インスタンスの生成
var twitter = TwitterWebService.getInstance(
  'xxxx',//API Key
  'xxxx'//API secret key
);

//アプリを連携認証する
function authorize() {
  twitter.authorize();
}

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

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

//リツイートする
function retweet(tweetid){
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/statuses/retweet/'+tweetid+'.json', {
                               method: 'post',
                               payload: { id: tweetid}
                               });
  Logger.log(JSON.parse(response));
}

//ポストする
function doPost(){
  var id = 'xxx';
  retweet(id);
}
```

こんな感じになっています。
1.2.を終えた前提で、
doPost関数の'xxx'に適当なTweetid(投稿されたツイート画面のURLから分かる)を指定し、doPost関数を実行すると見事にリツイートされるはずです。


このid部分も自動でとって来られるようにしましょう。
以下のような感じになります。

```javascript

//24時間以内のツイートか確認【新規で追加した関数】
function within24(twt){
  var oneday = 1000 * 60 * 60 * 24
  var created = twt.created_at;
  var c = new Date(created);
  var today = new Date();
  var timeDelta = (today.getTime() - c.getTime())/oneday;
  Logger.log(timeDelta);
  if (timeDelta<1){
    return true;
  }else{
    return false;}
}

// 検索wordをもらい, 条件に一致するツイートidを配列で返す【新規で追加した関数】
function search(word){
  if (word == "") {
    return;
  }
  
  word = encodeURIComponent(word);
  
  var url, options, response, jsonString, json, tweets = [];

  // Twitter Search APIのURL
  var API_URL = "https://api.twitter.com/1.1/search/tweets.json?";
  
  try {
    
    url = API_URL + "count=100" + "&q=" + word;
    
    try {
      var service  = twitter.getService();
      var response = service.fetch(url, {method: 'get'});
      var array = JSON.parse(response)['statuses'];
      var leng = array.length;
      var output = [];
      //画像が存在するか確認
      for(var i=0; i<leng; i++){
        var twt = array[i];
        var ent = twt.entities;
        if ('media' in ent){
          if (within24(twt)){
            output.push(twt['id_str']);
          }
        }
      }
    } catch(e) {
      Logger.log(e);
      return;
    }
    return output;
  } catch(e){
    Logger.log(e);
  }
}

//ポストする【先ほどもあったが少しいじった関数】
//検索ワードを指定してsearch関数に投げ、結果の配列をretweet関数に投げて実行
function doPost(){
  var nums = search('田村真子');
  if (nums){
    nums.forEach(function(id){
      retweet(id);});
  }
}
```

それぞれの関数の説明はコメントアウトしている部分に書きました！

4 ここまできたらトリガーを指定するだけです！
「編集」->「現在のプロジェクトのトリガー」でトリガー管理画面に飛び、
「トリガーを追加する」を選択します。
<img width="686" alt="スクリーンショット 2020-01-02 3.53.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/a3234ff7-987c-fc0e-1909-96bf3e3f25b3.png">
条件はこのような形で、一日に一度、doPost関数が実行されるようにし、保存します。



ということで、誰向けの文章なのかまじでわからないので、
今後足りない部分を補足していこうと思います。

#### 追記1(20210313)
全くメンテしてないですが、まだ動いています。
フォロワーが700人強になっていました。現状の問題は、フィルタリングなど全くしていないので、ワードさえ含まれていれば、スパムぽいアカウントのものもリツイートするようになってしまったことです。気が向いたら対策します。

## 参考
[GAS×TwitterBot](https://moripro.net/gas-twitter-developer-api/)
[searchAPI(公式)](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-search)