Google Apps Script(GAS)でスパムと思われるTwitterアカウントを自動的にブロックする

#はじめに
最近Twitter上の私のアカウントにて、フォロワーもおらず投稿数も0のアカウントから頻繁に次々とフォローされる事がありました。
さすがに鬱陶しかったので、Twitter APIの勉強がてらGASで自動的にブロックするスクリプトを作成したので、APIの簡単な紹介も含め記事にする事にしました。

#準備
GASにてTwitter APIを叩く準備については、以下の記事を参考にさせていただきました。
[Google Apps Script (GAS) でTwitterへ投稿するだけの機能を実装してみる](https://qiita.com/akkey2475/items/ad190a507b4a7b7dc17c)

Twitter APIでは現在CallbackURLの指定が必須となっています。今回は以下のURLを設定しました。

`https://script.google.com/macros/d/[GASのスクリプトID]/usercallback`

<img width="513" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211225/758ef4a4-cc41-04ae-e588-2a9b9b691f7e.png">
スクリプトIDに関しては、プロジェクトのプロパティ内に書いてあるので、そちらにて確認してくださいね。

ライブラリに関しては、上記記事にて紹介されていた[TwitterWebService](https://gist.github.com/M-Igashi/750ab08718687d11bff6322b8d6f5d90)を利用しました。
`ライブラリのプロジェクトキー: 1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF`

#利用したTwitter APIとコード

##followers/list[(Official Document)](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-followers-list)
フォロワーをJSONで各種情報と共に返してくれます。

```javascript

//フォロワーのリストを取得
function getFollowersList(){
  var service = twitter.getService();
  var endPoint = 'https://api.twitter.com/1.1/followers/list.json';
  
  var options = {
      method: 'GET',
  };
  
  var url = endPoint+"?skip_status=1&include_user_entities=0&count=10";
  var responce = service.fetch(url, options);
  
  return responce;
}
```
返ってくるJSONの内容については、こちらの記事を参考にさせていただきました。
[GET followers/list - フォロワーをオブジェクトの一覧で取得する](https://syncer.jp/Web/API/Twitter/REST_API/GET/followers/list/)

注意点としては、我々がTwitterのIDと呼んでいる@[ここの部分]に関しては、JSON内では`ID`ではなく`screen_name`として格納されている事でしょうか。

理想を言えばフォローされた日時の境界を指定して取得できるか、取得したJSON内にフォローされた日時も情報として含まれていれば良かったのですが、そういう事はないようです。
現状はとりあえず直近の10個を取得するようにしています。個数指定については、以下の`blocks/create`で**事故**が起きる可能性を考えた保険です。
##blocks/create[(Official Document)](https://developer.twitter.com/en/docs/accounts-and-users/mute-block-report-users/api-reference/post-blocks-create)
文字通り特定のユーザーをブロックするAPIです。今回は取得したフォロワーのリストに対して条件に引っかかったユーザーをブロックしていきますが、バグがあった場合友人達と根こそぎ絶縁する羽目になりますので、注意しましょう。

```javascript

//フォロワーをブロック
function blockFollower(screen_name){
  var service = twitter.getService();

  var payload = {
    "screen_name": screen_name
  };
  
  var responce = service.fetch('https://api.twitter.com/1.1/blocks/create.json', {
    method: 'post',
    payload: payload
  });
}
```

余談ですが、`blocks/destroy`という仰々しい名前のAPIを見つけて何をするんだと見てみましたが、ブロック解除のことでした。

#GASでの定期実行
今回は上記2つの関数を使って、以下の条件に合致するユーザーをブロックします。
1. フォロワー数が0
2. tweetのpost数が0
3. フォローしていない

とりあえず作った条件なので、可能性としてアカウントを作ったばかりの友人を無言で切り捨てる場合が考えられますので、改良が必要かもしれません。

```javascript

function main() {
  var getApiData = getFollowersList();
  var json = JSON.parse(decodeURIComponent(getApiData));
  var followersList = json.users;
  
  for(var i in followersList){
    var followers_num = followersList[i].followers_count; //フォロワー数
    var tweet_num = followersList[i].statuses_count;      //post数
    var isFollow = followersList[i].following;            //フォローしているか否か
    
    if((followers_num==0)&&(tweet_num==0)&&(isFollow==0)){
      blockFollower(followersList[i].screen_name)
    }
  }
}
```

今回はこれをGASで1時間毎に実行させることにしました。
やはり条件は一考が必要ですが、結果として今回私に来ている無人アカウントは一掃する事ができたので良しとします。ただし無人アカウントは最初に何かしら日常的なつぶやきをして誤魔化している事もあるので、FF比等も条件として採用できるかもしれません。
それ以上は既にあるブロックリストを共有するサービスを使うのが良いでしょうね。