X Twitter OSINTの実践

本章では、X(旧Twitter)から情報を収集するためのオープンソースOSINTツールを用いて、どのようにデータを効率的に取得し、分析を行うかを解説します。スクリーンネーム、特定のキーワードやユーザー名、ハッシュタグに基づいてツイートを収集し、それらを解析するための包括的なフレームワークを提供します。

方法

準備

twscrapeは、Pythonベースのツールであり、X上で公開されている情報に対して、法的に問題のない範囲で利用できる強力なデータ収集手段です。ターゲットのツイートやリプライ、フォロワー情報、リツイート履歴など、多岐にわたるデータの取得が可能です。本稿では、その基本的な使い方からプロキシの設定、データベースの活用方法までを網羅的に説明します。

Ref.:

twscrapeを使用するには、まず必要な環境を整える必要があります。以下の手順に従ってインストールを行います。

実践

インストール手順

  1. (任意) リポジトリをクローンする

    git clone https://github.com/vladkens/twscrape.git
  2. 必要なライブラリをインストールする

    pip install twscrape
  3. Twitter Developerアカウントを作成し、API認証情報を取得します。この認証情報を利用してツールの設定を行います。

  4. 使用するアカウントの情報をテキストファイルに保存します。以下はサンプルです。

    elonmusk:a&VhaxK:onmusk@email.com:_:_:_
    elonmusk2:hnK9&Ec:onmusk2@email.com:_:_:_

環境の設定

order-12345.txtファイルに必要なアカウント情報を保存した後、以下のコマンドを実行して認証情報を確認および設定します。

cd /$Userprofile/codes/github.com/vladkens/twscrape/
twscrape accounts
twscrape add_accounts ./order-12345.txt username:password:email:email_password:_:_
twscrape login_accounts
ログインと再ログイン

複数のアカウントを一括で管理できるため、エラーが発生したアカウントの再ログインも容易です。

twscrape relogin user1 user2
twscrape relogin_failed --manual

メール プロバイダーが IMAP プロトコルをサポートしていない場合 (ProtonMail、Tutanota など)、または設定で IMAP が無効になっている場合は、手動でログインすることが可能です。これを行うには、—manual フラグを使用します。

データの取得と検索方法

twscrapeは多様な検索方法をサポートしています。ここでは、キーワード検索やユーザー情報の取得方法について説明します。

キーワード検索

twscrapeを用いることで、特定のキーワードや期間に基づいたツイートの検索が可能です。

twscrape search 'tesla track'
twscrape search "elon musk since:2023-01-01 until:2023-05-31" --raw

特定のクエリを使った検索では、検索結果をJSON形式で返すことも可能です。jqコマンドを使用して、結果を解析することが推奨されます。

twscrape search "QUERY" --limit=20 | jq

ツイートやユーザー情報の取得

ツイートの詳細情報や、リプライ、リツイート、フォロワー、フォロー情報など、対象ユーザーに関するデータを取得できます。

twscrape tweet_details TWEET_ID
twscrape tweet_replies TWEET_ID --limit=20
twscrape retweeters TWEET_ID --limit=20
twscrape favoriters TWEET_ID --limit=20
twscrape user_by_id USER_ID
twscrape user_by_login USERNAME
twscrape following USER_ID --limit=20
twscrape followers USER_ID --limit=20
twscrape verified_followers USER_ID --limit=20
twscrape subscriptions USER_ID --limit=20
twscrape user_tweets USER_ID --limit=20
twscrape user_tweets_and_replies USER_ID --limit=20
twscrape liked_tweets USER_ID --limit=20

データベースの利用

大規模なデータを効率的に管理するために、データベースを利用した作業もサポートされています。SQLiteなどのデータベースを用いて、取得したアカウントやツイート情報を保存および管理できます。

twscrape --db test-accounts.db <command>

プロキシの設定

セキュリティやプライバシーの観点から、プロキシを使用することが可能です。socks5プロトコルを用いたプロキシの設定例を以下に示します。

TWS_PROXY=socks5://user:pass@127.0.0.1:1080 twscrape user_by_login elonmusk

プロキシの設定を行うことで、IPアドレスをマスキングしながら情報を取得でき、特定の地域制限などを回避することができます。

コマンド一覧

twscrapeには、さまざまな機能を呼び出すコマンドが用意されています。以下はその一部です。

twscrape
usage: twscrape [--db DB] [--debug] <command> [...]
 
commands:
    version                  # バージョン情報を表示
    accounts                 # アカウント一覧を表示
    stats                    # 使用状況の統計を取得
    add_accounts             # アカウントの追加
    del_accounts             # アカウントの削除
    login_accounts           # アカウントへのログイン
    relogin                  # 選択したアカウントへの再ログイン
    relogin_failed           # 失敗したログインを再試行
    reset_locks              # すべてのロックをリセット
    delete_inactive          # 非アクティブアカウントの削除
#
search commands:#
    search                   # ツイートの検索
    tweet_details            # ツイートの詳細情報を取得
    tweet_replies            # ツイートへのリプライを取得
    retweeters               # リツイートしたユーザーを取得
    favoriters               # いいねしたユーザーを取得
    user_by_id               # ユーザーIDでユーザー情報を取得
    user_by_login            # ユーザー名でユーザー情報を取得
    following                # フォローしているユーザーを取得
    followers                # フォロワーを取得
    verified_followers       # 認証済みフォロワーを取得
    subscriptions            # サブスクリプションを取得
    user_tweets              # ユーザーのツイートを取得
    user_tweets_and_replies  # ユーザーのツイートとリプライを取得
    liked_tweets             # いいねしたツイートを取得

注意事項

レート制限

Ref.:

The rate limits reset every 15 minutes.

FunctionsLimitEndpoint
add_members_to_group-AddParticipantsMutation
block_user187blocks/create.json
get_user_verified_followers500BlueVerifiedFollowers
get_bookmarks500Bookmarks
delete_all_bookmarks-BookmarksAllDelete
change_group_name900{GroupID}/update_name.json
get_group_dm_history, get_dm_history900conversation/{ConversationID}.json
bookmark_tweet-CreateBookmark
create_poll-cards/create.json
follow_user15friendships/create.json
create_list-CreateList
retweet-CreateRetweet
create_scheduled_tweet-CreateScheduledTweet
create_tweet-CreateTweet
delete_bookmark-DeleteBookmark
delete_dm-DMMessageDeleteMutation
delete_list_banner-DeleteListBanner
delete_retweet-DeleteRetweet
delete_scheduled_tweet-DeleteScheduledTweet
delete_tweet-DeleteTweet
unfollow_user187friendships/destroy.json
edit_list_banner-EditListBanner
get_favoriters500Favoriters
favorite_tweet-FavoriteTweet
get_scheduled_tweets500FetchScheduledTweets
get_user_followers50Followers
get_user_followers_you_know500FollowersYouKnow
get_user_following500Following
get_guest_token-guest/activate.json
get_latest_timeline500HomeLatestTimeline
get_timeline500HomeTimeline
-450dm/inbox_initial_state.json
add_list_member-ListAddMember
get_list500ListByRestId
get_list_tweets500ListLatestTweetsTimeline
get_lists500ListsManagementPageTimeline
get_list_members500ListMembers
remove_list_member-ListRemoveMember
get_list_subscribers500ListSubscribers
logout187account/logout.json
add_reaction_to_message-/useDMReactionMutationAddMutation
remove_reaction_from_message-useDMReactionMutationRemoveMutation
--MuteList
mute_user187mutes/users/create.json
get_notifications[type=“All”]180notifications/all.json
get_notifications[type=“Mentions”]180notifications/mentions.json
get_notifications[type=“Verified”]180notifications/verified.json
get_retweeters500Retweeters
search_tweet, search_user50SearchTimeline
send_dm187dm/new2.json
user_id-account/settings.json
get_user_subscriptions500UserCreatorSubscriptions
login187onboarding/task.json
get_trends20000guide.json
get_tweet_by_id150TweetDetail
unblock_user187blocks/destroy.json
unfavorite_tweet-UnfavoriteTweet
--UnmuteList
unmute_user187mutes/users/destroy.json
edit_list-UpdateList
upload_media-media/upload.json
get_user_by_id500UserByRestId
get_user_by_screen_name95UserByScreenName
get_user_tweets[tweet_type=“Likes”]500Likes
get_user_tweets[tweet_type=“Media”]500UserMedia
get_user_tweets[tweet_type=“Tweets”]50UserTweets
get_user_tweets[tweet_type=“Replies”]50UserTweetsAndReplies
vote-capi/passthrough/1