はじめに
本ドキュメントは、DiscordのCDN(Content Delivery Network)でホストされている添付ファイルに関する最新の仕様変更と、その共有・ダウンロード方法をわかりやすく解説することを目的としています。特に2023年末以降に導入された認証付きパラメータによるリンク有効期限の問題や、CDNプロキシを使った対策、一括ダウンロードの手法に重点を置いています。
対象読者
- Discord上のファイル管理やバックアップに関心がある方
- ボットや外部サービスで添付ファイルを扱う開発者
- 過去のチャット添付ファイルを保存したい一般ユーザー
本書で得られること
- Discord CDNの基本的な仕組みの理解
- 新しいCDNリンク仕様がもたらす制約の把握
- APIやプロキシを使った実用的な回避策の例
読み方のヒント
各章は実践的な順序で並べています。まず概念を押さえ、次に取得方法、最後に保存・運用の対策へ進むと理解しやすいです。必要に応じて第4章以降の手順を参照してください。
Discord CDNとは何か?添付ファイルの保存とリンク仕様
概要
Discord CDNは、Discordでユーザーがアップロードした画像や動画、添付ファイルを保存し、配信する仕組みです。ファイルをチャンネルに投稿すると、自動でCDN上にファイルが配置され一意のURLが発行されます。例:
https://cdn.discordapp.com/attachments/チャンネルID/メッセージID/ファイル名.ext
このURLを使えば、ブラウザや他のサービスから直接ファイルを取得できます。
保存の仕組み(簡単な説明)
ユーザーがファイルをアップロードすると、Discordは内部でファイルを受け取りCDNストレージへ保管します。保存はサーバー(チャンネル)とメッセージに紐づきますので、元のメッセージを削除するとファイルへのアクセスも失われることがあります。公開されたURLを知っていれば誰でもアクセスできる場合があり、プライバシーには注意が必要です。
リンクの形式と意味
CDNのURLは一般に次の構成になります。
– attachments:添付ファイル用のパス
– チャンネルID:どのチャンネルに投稿されたかを示す識別子
– メッセージID:その投稿(メッセージ)固有の識別子
– ファイル名.ext:実際のファイル名と拡張子
この形式により、どの投稿のどのファイルかを特定できます。
注意点
添付ファイルの保持状態はメッセージの有無やアカウントの状態に依存します。公開URLは簡単に共有できるため、機密性の高いファイルはアップロードしないことをおすすめします。
2023年末以降の新しいCDNリンク仕様と制約
概要
2023年12月以降、DiscordのCDNに配信される添付ファイルURLに認証付きパラメータが付くようになりました。目的はアクセス制御で、無期限に同じURLで公開し続けることを難しくしています。
主なパラメータ
- ex: 有効期限(Unix時刻で指定)
- is: 発行時刻(参照用)
- hm: チェックサムや署名に相当する値
例: https://cdn.discordapp.com/attachments/12345/abc.png?ex=1700000000&is=1690000000&hm=abcdef
動作と影響
これらのパラメータが無い、あるいはexが過ぎると、アクセスは404となり「This content is no longer available.」が表示されます。従来のように長期間同一リンクを配布しておく運用は困難になりました。結果として、外部サイトに貼った古いURLや、過去のチャットエクスポートに含まれるリンクが参照できなくなることがあります。
対処のヒント(簡単に)
- 常に最新のメッセージをAPIで取得して、新しいURLを得る必要があります。
- 長期保存が必要な場合は、自前のストレージへファイルを保存するか、後章で扱うCDNプロキシなどを検討してください。
次章では、APIを使った添付ファイルURLの取得方法を解説します。
Discord CDN添付ファイルリンクの取得方法(API活用例)
前提と準備
DiscordのAPIを使うには、Botトークンとアップロード先のチャンネルIDが必要です。Botにメッセージ送信権限があることを確認してください。ファイルサイズ制限やレート制限に注意します。
curlでのアップロード例
次のコマンドでファイルを送信できます。返り値のJSONにattachments配列が含まれ、その中のurlがCDNリンクです。
curl -s -H "Authorization: Bot YOUR_BOT_TOKEN" \
-F "content=アップロードテスト" \
-F "file=@/path/to/image.png" \
"https://discord.com/api/v10/channels/CHANNEL_ID/messages"
取得したJSONから直接URLを取り出すにはjqを使います。
... | jq -r '.attachments[0].url'
JavaScript(fetch)の例
ブラウザやNode.jsでFormDataを作り、fetchで送信します。返り値をJSON.parseしてattachments[0].urlを参照してください。
注意点
attachmentsにはurl(CDN直リンク)とproxy_urlが含まれます。用途に応じて使い分けてください。レート制限・サイズ上限は守ってください。
Discord CDNリンクの有効期限問題と解決策(CDN Proxyの活用)
問題の概要
Discordの添付ファイルリンクは一定期間で有効期限が切れる場合があります。公開URLをそのまま使うと、時間がたってアクセスできなくなることがあり、ウェブやサービスでの安定した公開に支障が出ます。
CDNプロキシの仕組み
CDNプロキシは元のDiscord CDNリンクを受け取り、以下のように動作します。
1. 受け取ったリクエストでリンクの有効性を確認します。必要ならDiscord APIやボットを使って新しいリンクを取得します。
2. 新しいリンクが取得できたら、クライアントにリダイレクトするか、プロキシ経由でコンテンツを返します。
3. 一定時間だけプロキシ内でキャッシュし、次回はキャッシュを返します。
実装上の注意点
- レート制限:Discord APIの制限に注意し、取得頻度を抑えます。
- セキュリティ:HTTPSとアクセス制御を必須にします。公開トークンの扱いに注意してください。
- キャッシュ設計:TTLを短めにして無駄な再取得を避けます。ファイル更新時はキャッシュを無効化できる仕組みを用意します。
- ログと監査:誰がいつアクセスしたかを記録し、プライバシーに配慮します。
推奨フロー(簡単な例)
- サイトの公開URLをプロキシに指す。
- プロキシはキャッシュを確認。存在すれば直接返す。
- 無ければDiscordから最新URLを取得してリダイレクトまたは配信し、キャッシュする。
この方法で、添付ファイルを時間経過に強い形で公開できます。
過去のDiscordチャットエクスポート添付ファイルの一括ダウンロード
概要
DiscordChatExporterなどで得たエクスポートに含まれるCDNリンクは、新仕様で期限切れになることがあります。過去ログの添付を確実に残すには、リンクを抽出してローカルに一括保存する手順が便利です。
手順(簡潔)
- エクスポートファイル(HTML/JSON)を用意します。
- ファイルからCDNのURLを抽出します(公開プログラムや簡単なスクリプトを利用)。
- 抽出したURLをまとめてダウンロードします(wgetやcurlの一括実行、専用ツールが便利です)。
- ダウンロード後、元のエクスポート内のURLをローカルパスに置換して保存します。
実用ポイント
- フォルダ構成を統一するとリンク置換が楽になります。
- 大量ダウンロード時は一度に接続を開きすぎない設定にしてください。負荷対策になります。
注意点
- 公開ツールは信頼できる配布先から入手してください。著作権やプライバシーに配慮して利用してください。
まとめ:Discord CDN添付ファイルの現状と対策
現状のポイント
DiscordのCDN添付ファイルは、直接の長期公開が難しくなってきています。リンクの有効期限やアクセス制限が増え、無制限に共有する運用は危険です。利用者は今の仕様を前提に設計する必要があります。
利用者向け短期対策
- 大事なファイルは早めにダウンロードして手元に保存してください。例:エクスポートしたチャットの画像をローカルやクラウド(Google Drive等)へ移す。
- 公開用途には永続的なストレージ(S3や専用のCDNプロキシ)を使うと安全です。
技術者・運用者向けの対策
- CDNプロキシを導入して、署名付きURLやキャッシュ制御で安定公開を実現します。簡単なプロキシは自前で立てられますし、既存のホスティングサービスを利用することも可能です。
- 自動バックアップと有効期限の監視を組み合わせ、切れる前に再発行や移行を行ってください。
過去データの扱い
過去のチャットエクスポートは、できるだけ早く一括ダウンロードして保存してください。エクスポート後はリンクが変わることがあるため、定期的に点検する運用をおすすめします。
実践チェックリスト(短く)
1) 重要ファイルはローカル/クラウドへ保存
2) 公開は署名付きURLまたはCDNプロキシで
3) 自動バックアップと期限監視を設定
これらを取り入れれば、Discordの仕様変化にも柔軟に対応できます。