X(Twitter) のメディアタブに表示されている画像のURLを一括で取得する方法。 開発者ツールのコンソールで実行するだけで、オリジナル画質の画像URLを取得できる。
メディアタブとは
ユーザープロフィールページの「メディア」タブをクリックすると、 そのユーザーが投稿した画像や動画が一覧表示される。
https://x.com/username/media の形式でアクセスできる。
基本:画像URLを取得する
1. メディアタブを開く
対象ユーザーのプロフィールページで「メディア」タブをクリック。
2. 開発者ツールを開く
以下のいずれかの方法で開く:
- Macの場合:
Command + Option + J - Windowsの場合:
Ctrl + Shift + J - または右クリック → 検証 → Consoleタブ
3. コンソールにスクリプトを入力
以下のスクリプトをコピーして、コンソールに貼り付けて Enter。
// 現在表示されている画像URLを取得
const urls = Array.from(document.querySelectorAll('img[src*="pbs.twimg.com"]'))
.map(img => img.src.replace(/&name=\w+/, '&name=orig'))
.filter(url => url.includes('/media/'))
.filter((v, i, a) => a.indexOf(v) === i);
console.log(urls.join('\n'));
console.log(`取得件数: ${urls.length}件`);
現在表示されている画像のURLがコンソールに出力される。
&name=orig が付いているのでオリジナル画質で取得できる。
4. 出力されたURLをコピー
コンソールに出力されたURLをマウスでドラッグして選択し、コピー(Ctrl+C / Cmd+C)。
区切り線付きで見やすく出力するバージョン:
// コンソールでURLを全選択しやすく出力
const urls = Array.from(document.querySelectorAll('img[src*="pbs.twimg.com"]'))
.map(img => img.src.replace(/&name=\w+/, '&name=orig'))
.filter(url => url.includes('/media/'))
.filter((v, i, a) => a.indexOf(v) === i);
// 区切り線で見やすく出力
console.log('========== 画像URL一覧 ==========');
console.log(urls.join('\n'));
console.log('==================================');
console.log(`取得件数: ${urls.length}件`);
console.log('上記のURLをコピーしてください'); これだとURLの部分を選択しやすくなる。
ブックマークレット版(おすすめ)
毎回コンソールを開くのが面倒な場合、ブックマークレットにしておくとワンクリックで実行できる。 ブックマークレットならクリップボードへの自動コピーも動作する。
登録方法
- ブックマークバーを表示(
Ctrl+Shift+B/Cmd+Shift+B) - ブックマークバーの上で右クリック → 「ページを追加」
- 名前:
X画像URL取得(任意) - URL: 以下のコードをコピー
javascript:(function(){const u=Array.from(document.querySelectorAll('img[src*="pbs.twimg.com"]')).map(i=>i.src.replace(/&name=\w+/,'&name=orig')).filter(url=>url.includes('/media/')).filter((v,i,a)=>a.indexOf(v)===i);navigator.clipboard.writeText(u.join('\n')).then(()=>alert(u.length+'件の画像URLをコピーしました!'));})(); 登録後、メディアタブでブックマークレットをクリックすると、 画像URLが自動的にクリップボードにコピーされる。
- ワンクリックで実行できる
- クリップボードへの自動コピーが動作する(コンソールでは不可)
- 開発者ツールを開く必要がない
応用:自動スクロールで全画像を取得
メディアタブは最初に一部の画像しか表示されないので、 スクロールして追加読み込みする必要がある。 自動スクロールで全画像を読み込んでから取得するスクリプト:
// 自動スクロールして全画像を読み込む
async function loadAllMedia() {
let lastHeight = 0;
let scrollCount = 0;
const maxScrolls = 50; // 最大スクロール回数
while (scrollCount < maxScrolls) {
window.scrollTo(0, document.body.scrollHeight);
await new Promise(resolve => setTimeout(resolve, 1000));
const currentHeight = document.body.scrollHeight;
if (currentHeight === lastHeight) {
console.log('最後まで読み込みました');
break;
}
lastHeight = currentHeight;
scrollCount++;
}
// URL取得
const urls = Array.from(document.querySelectorAll('img[src*="pbs.twimg.com"]'))
.map(img => img.src.replace(/&name=\w+/, '&name=orig'))
.filter(url => url.includes('/media/'))
.filter((v, i, a) => a.indexOf(v) === i);
console.log(`取得件数: ${urls.length}件`);
console.log(urls.join('\n'));
return urls;
}
// 実行
loadAllMedia(); このスクリプトは自動的にスクロールして画像を読み込み、 最後まで到達したらURLを取得する。 大量の画像がある場合は時間がかかるので注意。
取得したURLをダウンロードする
Twitter の画像は別ドメイン(pbs.twimg.com)にあるため、 ブラウザのセキュリティ制約(CORS)により、JavaScriptから直接ダウンロードすることができません。
そのため、以下のいずれかの方法でダウンロードする必要があります。
方法1: タブで一括表示 → 手動保存
各画像を新しいタブで開いて、手動で保存する方法:
// 新しいタブで画像を一括表示
async function openAllMedia() {
// 1. URL取得
const urls = Array.from(document.querySelectorAll('img[src*="pbs.twimg.com"]'))
.map(img => img.src.replace(/&name=\w+/, '&name=orig'))
.filter(url => url.includes('/media/'))
.filter((v, i, a) => a.indexOf(v) === i);
console.log(`${urls.length}件の画像を新しいタブで開きます...`);
// 確認
if (!confirm(`${urls.length}件の画像を新しいタブで開きますか?`)) {
return;
}
// 2. 順次タブで開く
for (let i = 0; i < urls.length; i++) {
window.open(urls[i], '_blank');
console.log(`[${i + 1}/${urls.length}] タブを開きました`);
// ブラウザの制限を避けるため少し待機
await new Promise(resolve => setTimeout(resolve, 300));
}
console.log('完了!各タブで右クリック→「名前を付けて保存」でダウンロードしてください');
}
// 実行
openAllMedia(); 初回実行時、ブラウザのポップアップブロックが働いて1つ目のタブしか開かれません。 以下の手順でポップアップを許可してください:
- アドレスバーの右側に表示される ポップアップブロックのアイコンをクリック
- 「x.com のポップアップとリダイレクトを常に許可する」を選択
- スクリプトを再実行
許可後は全ての画像が新しいタブで開かれます。
各タブで右クリック → 「名前を付けて画像を保存」でダウンロード。
- 大量の画像がある場合、ブラウザが重くなる可能性がある
- 10〜20件ずつに分けて実行するのがおすすめ
方法2: wget で一括ダウンロード
wget を使ってターミナルから一括ダウンロード:
手順
- 上記のスクリプトでURLを取得してコピー
- テキストエディタで
urls.txtに保存(1行1URL) - ターミナルで以下を実行
wget -i urls.txt -P ./twitter_images ./twitter_images フォルダに全ての画像がダウンロードされる。
- Mac:
brew install wget - Windows: Git Bash または WSL で
wgetが使える
方法3: Python3 で一括ダウンロード(おすすめ)
Python3 を使った一括ダウンロードスクリプト:
準備
pip3 install requests スクリプト
download_twitter_images.py として保存:
import requests
import os
# urls.txt から URL を読み込んでダウンロード
def download_images(url_file='urls.txt', output_dir='twitter_images'):
# 出力ディレクトリを作成
os.makedirs(output_dir, exist_ok=True)
# URLs を読み込み
with open(url_file, 'r') as f:
urls = [line.strip() for line in f if line.strip()]
print(f'{len(urls)}件の画像をダウンロード開始...')
# 各URLをダウンロード
for i, url in enumerate(urls, 1):
try:
response = requests.get(url, timeout=30)
response.raise_for_status()
# ファイル名を生成
filename = f'twitter_image_{i:03d}.jpg'
filepath = os.path.join(output_dir, filename)
# 保存
with open(filepath, 'wb') as f:
f.write(response.content)
print(f'[{i}/{len(urls)}] {filename} ダウンロード完了')
except Exception as e:
print(f'[{i}/{len(urls)}] エラー: {e}')
print(f'\n完了!{output_dir}/ に保存されました')
if __name__ == '__main__':
download_images() 実行
- URLを取得して
urls.txtに保存(1行1URL) - スクリプトと同じフォルダに
urls.txtを配置 - ターミナルで実行
python3 download_twitter_images.py twitter_images/ フォルダに twitter_image_001.jpg、twitter_image_002.jpg... の形式で保存される。
- 進捗が表示されるので分かりやすい
- エラーが出てもスキップして続行する
- 連番でファイル名を整理できる
- Windows / Mac / Linux どこでも動く
注意事項
- 大量の画像を一気にダウンロードすると、Twitter側のレート制限に引っかかる可能性がある
- 他人の画像をダウンロードする場合、著作権に注意
- ブラウザによっては自動ダウンロードがブロックされる場合がある
- スクリプトはTwitterの仕様変更で動かなくなる可能性がある