Reels Downloader(HTMLベース)

ご自身の権利がある動画のみダウンロードしてください。サービス規約・著作権を必ず遵守。

URLを入力して「チェック」を押してください。
判定: サイズ: ファイル名:

※ Instagramのページに直接アクセスしての取得はブラウザの CORS 制限や認証が必要なため、フロントのみでは失敗します。
このページは 直接のMP4 はそのまま取得し、InstagramのURLは /api/resolve?url=... のような任意バックエンドに委譲します。

使い方

  1. リールのURLを貼り付けて チェック を押します。
  2. URLが .mp4 で終わるなど直接ファイルなら、そのままダウンロードできます。
  3. Instagramの通常URLの場合、任意バックエンド /api/resolve に問い合わせて、ダウンロード可能な直リンクに解決してから保存します。
(任意)バックエンドの最小実装例(Node.js / Express)

※ 認証トークンやスクレイピングは必ず規約に従い自分の権利があるコンテンツのみ対象にしてください。アクセストークンはサーバ側のみに保存。

// server.js
import express from "express";
import fetch from "node-fetch"; // Node 18+なら不要
const app = express();

// 簡易CORS(必要に応じて制限を厳格化)
app.use((req, res, next) => { res.setHeader("Access-Control-Allow-Origin", "*"); next(); });

// InstagramのURLをダウンロード直リンクに解決する例(ダミー)
// 実運用では Meta Graph API を使い、
// 自分が権利を持つメディアに対して media_url を取得してください。
// https://developers.facebook.com/docs/instagram-api/
app.get("/api/resolve", async (req, res) => {
  const url = req.query.url?.toString() || "";
  if (!url) return res.status(400).json({ error: "url required" });

  // 1) 直接.mp4ならそのまま返す
  if (/\.mp4(\?|$)/i.test(url)) {
    return res.json({ downloadUrl: url, filename: "video.mp4" });
  }

  // 2) Graph API を使う(擬似コード/トークンは環境変数)
  // const token = process.env.IG_TOKEN;
  // const mediaId = await yourFunctionToLookupMediaId(url);
  // const resp = await fetch(`https://graph.facebook.com/v19.0/${mediaId}?fields=media_url,media_type&access_token=${token}`);
  // const data = await resp.json();
  // if (data.media_type === 'VIDEO' && data.media_url) {
  //   return res.json({ downloadUrl: data.media_url, filename: `${mediaId}.mp4` });
  // }

  // 3) 解決できない場合
  return res.status(422).json({ error: "このURLは直接解決できませんでした。" });
});

// バイナリをプロキシしてダウンロードさせる(オプション)
app.get("/api/proxy", async (req, res) => {
  const src = req.query.src?.toString();
  if (!src) return res.status(400).send("src required");
  try {
    const r = await fetch(src);
    if (!r.ok) return res.status(r.status).send("fetch failed");
    res.setHeader("Content-Type", r.headers.get("content-type") || "application/octet-stream");
    r.body.pipe(res);
  } catch (e) {
    res.status(500).send("proxy error");
  }
});

app.listen(8787, () => console.log("API ready on http://localhost:8787"));

注意(重要)

  • Instagramや他サイトの規約・著作権・利用条件に反するダウンロードは行わないでください。
  • DRM・アクセス制御の回避や非公開メディアの取得など、技術的保護手段の回避にあたる行為はしないでください。
  • 自分が権利を持つ動画(自分の投稿や投稿者が明確に許可した素材)だけを対象にしてください。
  • アクセストークンやCookieなど機密情報はフロントに置かないでください(サーバ側に保管)。