X Twitter OSINTの実践
本章では、X(旧Twitter)から情報を収集するためのオープンソースOSINTツールを用いて、どのようにデータを効率的に取得し、分析を行うかを解説します。スクリーンネーム、特定のキーワードやユーザー名、ハッシュタグに基づいてツイートを収集し、それらを解析するための包括的なフレームワークを提供します。
方法
準備
twscrapeは、Pythonベースのツールであり、X上で公開されている情報に対して、法的に問題のない範囲で利用できる強力なデータ収集手段です。ターゲットのツイートやリプライ、フォロワー情報、リツイート履歴など、多岐にわたるデータの取得が可能です。本稿では、その基本的な使い方からプロキシの設定、データベースの活用方法までを網羅的に説明します。
Ref.:
twscrapeを使用するには、まず必要な環境を整える必要があります。以下の手順に従ってインストールを行います。
実践
インストール手順
-
(任意) リポジトリをクローンする
git clone https://github.com/vladkens/twscrape.git -
必要なライブラリをインストールする
pip install twscrape -
Twitter Developerアカウントを作成し、API認証情報を取得します。この認証情報を利用してツールの設定を行います。
-
使用するアカウントの情報をテキストファイルに保存します。以下はサンプルです。
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.
| Functions | Limit | Endpoint |
|---|---|---|
| add_members_to_group | - | AddParticipantsMutation |
| block_user | 187 | blocks/create.json |
| get_user_verified_followers | 500 | BlueVerifiedFollowers |
| get_bookmarks | 500 | Bookmarks |
| delete_all_bookmarks | - | BookmarksAllDelete |
| change_group_name | 900 | {GroupID}/update_name.json |
| get_group_dm_history, get_dm_history | 900 | conversation/{ConversationID}.json |
| bookmark_tweet | - | CreateBookmark |
| create_poll | - | cards/create.json |
| follow_user | 15 | friendships/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_user | 187 | friendships/destroy.json |
| edit_list_banner | - | EditListBanner |
| get_favoriters | 500 | Favoriters |
| favorite_tweet | - | FavoriteTweet |
| get_scheduled_tweets | 500 | FetchScheduledTweets |
| get_user_followers | 50 | Followers |
| get_user_followers_you_know | 500 | FollowersYouKnow |
| get_user_following | 500 | Following |
| get_guest_token | - | guest/activate.json |
| get_latest_timeline | 500 | HomeLatestTimeline |
| get_timeline | 500 | HomeTimeline |
| - | 450 | dm/inbox_initial_state.json |
| add_list_member | - | ListAddMember |
| get_list | 500 | ListByRestId |
| get_list_tweets | 500 | ListLatestTweetsTimeline |
| get_lists | 500 | ListsManagementPageTimeline |
| get_list_members | 500 | ListMembers |
| remove_list_member | - | ListRemoveMember |
| get_list_subscribers | 500 | ListSubscribers |
| logout | 187 | account/logout.json |
| add_reaction_to_message | - | /useDMReactionMutationAddMutation |
| remove_reaction_from_message | - | useDMReactionMutationRemoveMutation |
| - | - | MuteList |
| mute_user | 187 | mutes/users/create.json |
| get_notifications[type=“All”] | 180 | notifications/all.json |
| get_notifications[type=“Mentions”] | 180 | notifications/mentions.json |
| get_notifications[type=“Verified”] | 180 | notifications/verified.json |
| get_retweeters | 500 | Retweeters |
| search_tweet, search_user | 50 | SearchTimeline |
| send_dm | 187 | dm/new2.json |
| user_id | - | account/settings.json |
| get_user_subscriptions | 500 | UserCreatorSubscriptions |
| login | 187 | onboarding/task.json |
| get_trends | 20000 | guide.json |
| get_tweet_by_id | 150 | TweetDetail |
| unblock_user | 187 | blocks/destroy.json |
| unfavorite_tweet | - | UnfavoriteTweet |
| - | - | UnmuteList |
| unmute_user | 187 | mutes/users/destroy.json |
| edit_list | - | UpdateList |
| upload_media | - | media/upload.json |
| get_user_by_id | 500 | UserByRestId |
| get_user_by_screen_name | 95 | UserByScreenName |
| get_user_tweets[tweet_type=“Likes”] | 500 | Likes |
| get_user_tweets[tweet_type=“Media”] | 500 | UserMedia |
| get_user_tweets[tweet_type=“Tweets”] | 50 | UserTweets |
| get_user_tweets[tweet_type=“Replies”] | 50 | UserTweetsAndReplies |
| vote | - | capi/passthrough/1 |