Instagram-Downloader README

The project's README from github.com/hoaianle/Instagram-Downloader. As one markdown file: README.md.

Instagram-Downloader

icon

How this work

With regex and some ReactFiber magic, I'm able to know which post you wanna download and fetch the api to download the photos for you.

Browser compatibility

This extension should work fine on the following browsers with fetch() API and Chromium base browser, tested Browser:

Download and install

Chrome or other Chromium browsers

Firefox (Development)

Settings

Everything is configured in one dialog. Open it from the Downloader settings entry that the extension adds to the left sidebar, right below your profile link.

The dialog has two sections, described below: Download button style and File name templates. Preferences are saved per-browser in localStorage and apply immediately, no reload needed.

The dialog follows Instagram's light/dark theme automatically. There is no theme option because the extension mirrors whatever Instagram is already using.

Download button style

Controls which download controls the extension shows. Pick one of three modes:

Mode What you get
Modern (default) Download buttons rendered directly on each post and on stories. No floating panel.
Legacy The classic floating Download button plus the media panel.
Both Modern and Legacy controls at the same time.

The mode applies instantly - the buttons and panel appear or disappear without a page reload.

Modern (inline) buttons

Legacy media panel

The panel is the older interface, and it's what the keyboard shortcuts drive.

Multi select

Multi select lives in the media panel, so you need the panel open - Legacy or Both mode, or press D in Modern mode.

File name templates

The File name templates section controls how downloaded files are named. It's split into three independent scopes, because a story and a post don't have the same useful metadata:

Each scope has its own row of tokens, plus a live preview showing the resulting Single file name and ZIP archive name.

Building a template

Underscores are inserted automatically between values, so you never have to type them. Tokens that have no value for a given download are skipped instead of leaving a blank or a stray underscore.

Available variables

Variable Value
#original_filename The filename Instagram reports for the media.
#username The account that posted it.
#date Publication date, formatted with the date format chosen below.
#title Caption text, or the highlight name.
#id The post's shortcode.
#resolution Pixel dimensions, e.g. 1080x1920.
#video_bitrate Video bitrate, e.g. 4.2Mbps.
#video_codec Video codec, e.g. VP9.

Single-file only. #original_filename, #resolution, #video_bitrate and #video_codec describe one specific file, so they are used for individual media names but omitted from the ZIP archive name. A ZIP is named from the post, not from its files.

Date format

Applies to #date in every scope. Uses Instagram's publication date in UTC.

Option Example
YYYY-MM-DD (default) 2026-09-17
DD_MM_YYYY 17_09_2026
MM_DD_YYYY 09_17_2026
MMM DD, YYYY Sep 17, 2026

Default templates

Scope Default
Posts #username_#id_#date
Stories #username_#id_#date
Highlights #username_#title

Sanitizing

Names are cleaned up before they hit disk, so a caption or username can't produce an invalid file:

Features

Customize

You can modify anything you want except some constants start with "IG_" that definitely gonna break this extension.

Edit Hide / Show Transition effects

.display-container.hide {
    transform-origin: 85% bottom;
    transform: scale(0);
    pointer-events: none;
    opacity: 0.6;
}

Panel and Legacy button geometry live in src/style/style.css:

/* .display-container is the media panel */
width: calc(80vh / 5 * 3);
height: 75vh;
max-width: 480px;
max-height: 800px;
bottom: 140px;
inset-inline-end: 20px;

/* .download-button is the Legacy button */
width: 120px;
height: 30px;
bottom: 100px;
inset-inline-end: 34px;

Both use inset-inline-end, so they follow Instagram's layout direction automatically.

Keyboard shortcut

Some keyboard shortcuts will not work if you use an external application for typing.

These shortcuts drive the Legacy panel.

D works in every mode. It clicks the Download button programmatically, so it still opens the panel in Modern mode even though the button itself is hidden there.

esc/C closes the panel, and S toggles select mode. Both are no-ops while the panel is closed, which is always the case in Modern mode until you press D.

Shortcuts are disabled on DM pages (/direct).

Settings storage

Preferences live in localStorage under the instagram.com origin. Useful for scripting or resetting a broken preference:

Key Value
instagramDownloaderUiMode inline (default), panel, or both
instagramDownloaderFilenameTemplates JSON object keyed by scope: post, stories, highlights
instagramDownloaderDateFormat One of the four date formats above

For example, to force the Legacy panel without opening the dialog:

localStorage.setItem('instagramDownloaderUiMode', 'panel');
location.reload();

Deprecated features

These features was deprecated for some reason.

Here is Demo

Demo v6.0.0

Instagram-Downloader (hoaianle/Instagram-Downloader)

Searching Database…

这是什么?一个 Chrome 扩展,可以直接从你正在看的页面上下载 Instagram 帖子、TV、Reels、快拍和精选里的照片和视频。
这个工具只在 Chrome 上用,还是其他浏览器也能用?它是按 Chromium 扩展构建的,但在支持 fetch() API 的 Firefox 里也能用;已在 Chrome、MS Edge 和 Firefox 上测试过。
用它需要什么账号或 API 密钥吗?不需要,只要在浏览器里访问 Instagram,通过正则表达式和 ReactFiber 内部结构抓取数据就行;没有提到任何 API 密钥或登录设置。
安装上有什么我该知道的坑吗?如果你把扩展放在 Linux 发行版不会自动挂载的外部硬盘或分区上,它会消失,直到你重新挂载硬盘并重启浏览器。
它是扩展还是独立应用?它是一个浏览器扩展(不是独立的桌面应用),直接加载到 Chrome、Edge 或 Firefox 里。
装好之后,实际怎么下载内容?打开任意帖子、Reel、快拍或精选,点击出现的 Download 按钮抓取数据,然后点击单张照片/视频保存。
能一次下载多张照片吗?能,点击 Photos 开启多选模式,选中单个条目(或按住点击全选),然后点 Download,就能把所有内容保存成一个 zip 文件。
支持高质量视频下载吗?支持,它会下载质量最高的 DASH 视频和音频流,并在本地合并封装,不重新编码。
有键盘快捷键吗?有:D 下载,Esc 或 C 关闭,S 全选;这些快捷键只在焦点不在输入框、textarea 或 textbox 角色元素上时才生效。
Creator
hoaianle
Size
0.7 MB
Stars
442
Age
4y
Commits · 90 Days