Pythonですぐ消すbotを再現する

# すぐ消すbotとは

https://github.com/dialoguedaisuki/DigitalTattooTwitterMedia

- 悪意あるものが[↑私のリポジトリ](https://github.com/dialoguedaisuki/DigitalTattooTwitterMedia)を悪用し、ネット上でボヤ騒ぎを起こしたbotのことである。
  - [まとめ記事](http://blog.esuteru.com/archives/9705492.html)が顛末に詳しい、[こちらの記事](https://matomebu.com/enjyou/twitterbot20210604/)も間違いがあるがまとまっている。 

https://twitter.com/takigare3/status/1400496437599739908

- 敵を知るためにどう悪用されたか再現してみよう。

## すぐ消すbotの運用推定

- Twitter APIを利用し、特定語句(すぐ消す filter:images/すぐ消す filter:videos)をCronで一定間隔で検索、収集して画像や動画をご紹介していたらしい。
  - 1度イナゴが増え過ぎたのかアカウントを消した後に[ファンサービス機能](https://github.com/dialoguedaisuki/DigitalTattooTwitterMedia/issues/10)が搭載されたらしい。
  - 凍結直前には[追撃ファンサービスシステム](https://github.com/dialoguedaisuki/DigitalTattooTwitterMedia/issues/15)として実際にツイートを消した人のツイートを検索しご紹介する機能も搭載されたらしい。

# 作成方法
## 準備段階

- Twitterアカウントの開設
  - 流石に解説しない 
- [Twitter APIの取得](https://auto-worker.com/blog/?p=3157)
  - DeepLでも使ってなるべく「長く冗長にまどろっこしい表現」を翻訳すると一発で申請が通ることが多い、どうやら文字数が多くスパム的な連続文字が無ければ自動承認される模様、これをSetting.iniに書く。
- Cronで動かすために[適当な貸しサーバー](https://www.publickey1.jp/blog/21/free_tier2021.html)を借りる、GCPとOracle Cloudは貧弱であるが永久無料である。

- リポジトリのクローンと関連ライブラリのインストール
  - ファンサービスには[ヘッドレスChrome](https://qiita.com/derodero24/items/9e9567790bde9e4b9d0c)を利用しているので、これも環境に合わせていれる、Debianでのコマンド例はREAD.mdに記載済み。

```bash
git clone https://github.com/dialoguedaisuki/DigitalTattooTwitterMedia.git
pip install tweepy twitter configparser selenium Pillow
```

## DigitalTattooTwitterMediaの解説

- csvはenvNameによって異なるので環境に合わせて`touch/new-item`する。

### フォルダ構造
```bash
DigitalTattooTwitterMedia
|   .gitignore #キャッシュファイルとクレデンシャルは除外
|   args.py #引数関連のモジュール
|   delTweetUserSearchQuoteService.py #追撃ファンサービス
|   fanScreenShot.py #ファンサービスコアモジュール
|   fanService.py #ファンサービス対象検索モジュール
|   LICENSE #MITライセンス
|   README.md #使い方
|   replyAndQTService.py #リプライと引用RTした人をファンサービスする
|   rePostImeges.py #画像のご紹介
|   rePostVideos.py #動画のご紹介
|   setting.ini #Twitter APIのキー
|   $[envName]_del_tweeted_fans.csv #追撃ファンサービスで使用
|   $[envName]_faned.cs #ファンサービスで使用
|   $[envName]_quotedIds.csv #replyAndQTServiceで使用
|   $[envName]_tweeted.csv #ご紹介済みツイートを記録
|   $[envName]_tweeted_movie.csv #ご紹介済み動画を記録
|   $[envName]_user_id_tweeted.csv #ご紹介済みユーザを記録(画像)
|   $[envName]_user_id_tweeted_movie.csv #ご紹介済みユーザを記録(動画)
|   tweetUtil.py #モジュール類
\---csv
        日次で吐かれる処理済みユーザーのcsv
```

####画像のご紹介
- 既に投稿したID、既に投稿したユーザー、自分、フォロワーのIDを検索結果から除外してご紹介している。これで荒らし防止になるし、既に投稿したユーザーを一定期間でクリアしても良い。
  - 日次で貯めたcsvは追撃ファンサービスにて使用する。
  - また、ご紹介後にブロックすることで、引用RTの通知を抑制している（ご紹介者とwin-winの関係）

```bash
python rePostImeges.py -w '$SearchWord' -e '$EnvName'
```

####動画のご紹介
- 動画は帯域課金が結構大きい、馬鹿の動画を転載するのだから、Oracle Cloudなど回線があまり強くないが、ネットワークが無料のところでやると良いかもしれない（私が試験したGCPだと月100円いかない程度）

```bash
python rePostVideos.py -w '$SearchWord' -e '$EnvName'
```

####ファンサービス
- コアモジュールは、スクリーンネームを元にスクショ4枚撮影し、トリミングし、ByteIO型で返す。
  - トリミングのサイズは環境によって異なるかもしれないのでcropを変更しないと切れる可能性がある 。
- fanServiceでは2回検索して、ファンを特定している、1回目の検索は「すぐ消す」等のワードを2回以上連投している(=荒らし)を特定し、2回目の検索は任意に設定できる語句`$fanWord`を検索している、例えば悪用者は「すぐ消すbot」等明らかにこちらを意識しているファンをご紹介していた。
- ファンリストの作成は、リストを作成して、Pythonインタプリタで[IDを出す](https://qiita.com/yushun/items/0c7cd8ec6b4d4bae8208)といい。

```bash
python fanService.py -w '$SearchWord' -e '$EnvName' -l '$ListSlugId'
```

####追撃ファンサービス

- いわゆる日次で出力したcsvに対しての日次処理であり、大量の検索をAPI上限を超えて検索するので、時々タイムアウトしたりして不安定な感じがある。
  - 再現環境で使用したクエリは`"鍵 AND 引 OR リツ OR 率 OR RT"` 

```bash
python delTweetUserSearchQuoteService.py -e '$EnvName'
```

- ただ大量のデータを処理するので、こういうことをしても面白いかもしれない。

```python
def statsTweet(noDelTw, delTw) -> int:
    sumTw = noDelTw + delTw
    noDelPer = noDelTw / sumTw * 100
    delPer = delTw / sumTw * 100
    tw = f'本日の統計\n\n消されていないツイート:{noDelPer:.2f}%\n消されたツイート:{delPer:.2f}%\n#す消B統計'
    return tw
```

####リプライ、引用RTに対してのファンサービス

- 自分に対しての引用RTはTwitterの仕様でIDに記号が入ってると検索APIから取得できないので注意。

```bash
python replyAndQTService.py -e '$EnvName'
```

### Cronでの運用

- こんなシェルを作って画像と動画なら`*/10 * * * *`、ファンサービス系は`*/30 * * * *`程度で動かせば十分再現可能かと思われる。

```bash
#!/bin/sh
echo "envName=" $1
echo "listId=" $2
mkdir -p ~/log/$1
python3 ~/rePostImeges.py -e $1 -w "すぐ消す filter:images" 2>&1 | tee ~/log/$1/`date "+%Y%m%d_%H%M%S"`.image.log
```

##再現してみて

- 私はあくまで個人的な画像と動画収集のためにこのスクリプトを書いたのであって、すぐ消すbotのような悪意の塊を生み出したのは私ではないと、最後に捕捉しておく。
- 予想以上に地獄の絵図が集まってきた
  - 犯人は自白しているので、すぐ消すbotに関して分からないこと、詳しいことは彼に聞くと良いかもしれない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354194/b78d206c-ecd0-cb50-9825-c3817fd9802c.png)