28
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

闇のプログラミングAdvent Calendar 2021

Day 1

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

Last updated at Posted at 2021-07-11

すぐ消すbotとは

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

すぐ消すbotの運用推定

  • Twitter APIを利用し、特定語句(すぐ消す filter:images/すぐ消す filter:videos)をCronで一定間隔で検索、収集して画像や動画をご紹介していたらしい。

作成方法

準備段階

  • Twitterアカウントの開設

    • 流石に解説しない
  • Twitter APIの取得

    • DeepLでも使ってなるべく「長く冗長にまどろっこしい表現」を翻訳すると一発で申請が通ることが多い、どうやら文字数が多くスパム的な連続文字が無ければ自動承認される模様、これをSetting.iniに書く。
  • Cronで動かすために適当な貸しサーバーを借りる、GCPとOracle Cloudは貧弱であるが永久無料である。

  • リポジトリのクローンと関連ライブラリのインストール

    • ファンサービスにはヘッドレスChromeを利用しているので、これも環境に合わせていれる、Debianでのコマンド例はREAD.mdに記載済み。
git clone https://github.com/dialoguedaisuki/DigitalTattooTwitterMedia.git
pip install tweepy twitter configparser selenium Pillow

DigitalTattooTwitterMediaの解説

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

フォルダ構造

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の関係)
python rePostImeges.py -w '$SearchWord' -e '$EnvName'

####動画のご紹介

  • 動画は帯域課金が結構大きい、馬鹿の動画を転載するのだから、Oracle Cloudなど回線があまり強くないが、ネットワークが無料のところでやると良いかもしれない(私が試験したGCPだと月100円いかない程度)
python rePostVideos.py -w '$SearchWord' -e '$EnvName'

####ファンサービス

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

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

  • いわゆる日次で出力したcsvに対しての日次処理であり、大量の検索をAPI上限を超えて検索するので、時々タイムアウトしたりして不安定な感じがある。
    • 再現環境で使用したクエリは"鍵 AND 引 OR リツ OR 率 OR RT"
python delTweetUserSearchQuoteService.py -e '$EnvName'
  • ただ大量のデータを処理するので、こういうことをしても面白いかもしれない。
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から取得できないので注意。
python replyAndQTService.py -e '$EnvName'

Cronでの運用

  • こんなシェルを作って画像と動画なら*/10 * * * *、ファンサービス系は*/30 * * * *程度で動かせば十分再現可能かと思われる。
#!/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
28
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?