Repository: yt-dlp/yt-dlp

Issue:
Instagram: Unable to extract additional data, username, & video URL.
### Checklist

- [X] I'm reporting a broken site
- [X] I've verified that I'm running yt-dlp version **2022.07.18** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
- [X] I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/ytdl-org/youtube-dl#video-url-contains-an-ampersand-and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
- [X] I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
- [X] I've read about [sharing account credentials](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#are-you-willing-to-share-account-details-if-needed) and I'm willing to share it if required

### Region

U.S.

### Provide a description that is worded well enough to be understood

Downloading from Instagram used to work properly about 99% of the time - but as of a little more than a week ago, it entirely stopped working.  I uninstalled the repo version, then downloaded & installed the up to date version from Github.  It worked for one day, but I've hit the same wall again.

-------------------------------

This is the verbose output of a failed download:

```
$ yt-dlp --verbose https://www.instagram.com/p/Cfo4kgugFV4/
[debug] Command-line config: ['--verbose', 'https://www.instagram.com/p/Cfo4kgugFV4/']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.07.18 [135f05e] (zip)
[debug] Python 3.9.2 (CPython 64bit) - Linux-5.10.57-antix.1-amd64-smp-x86_64-with-glibc2.31 (glibc 2.31)
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: ffmpeg 4.3.4-0, ffprobe 4.3.4-0, rtmpdump 2.4
[debug] Optional libraries: Cryptodome-3.9.7, certifi-2020.06.20, mutagen-1.45.1, pyxattr-0.7.2, sqlite3-2.6.0, websockets-8.1
[debug] Proxy map: {}
[debug] [Instagram] Extracting URL: https://www.instagram.com/p/Cfo4kgugFV4/
[Instagram] Cfo4kgugFV4: Downloading JSON metadata
WARNING: [Instagram] Cfo4kgugFV4: General metadata extraction failed
[Instagram] Cfo4kgugFV4: Downloading video info
[Instagram] Cfo4kgugFV4: Downloading embed webpage
WARNING: [Instagram] unable to extract additional data; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
WARNING: [Instagram] unable to extract username; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
ERROR: [Instagram] Cfo4kgugFV4: Unable to extract video url; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 644, in extract
    ie_result = self._real_extract(url)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/instagram.py", line 433, in _real_extract
    video_url = self._og_search_video_url(webpage, secure=False)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 1335, in _og_search_video_url
    return self._html_search_regex(regexes, html, name, **kargs)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 1230, in _html_search_regex
    res = self._search_regex(pattern, string, name, default, fatal, flags, group)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 1194, in _search_regex
    raise RegexNotFoundError('Unable to extract %s' % _name)
```
-------------------------


---------------------------
This is the output using the -vu flag:

```
$ yt-dlp -vu https://www.instagram.com/p/Cfo4kgugFV4/
[debug] Command-line config: ['-vu', 'https://www.instagram.com/p/Cfo4kgugFV4/']
Type account password and press [Return]: 
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.07.18 [135f05e] (zip)
[debug] Python 3.9.2 (CPython 64bit) - Linux-5.10.57-antix.1-amd64-smp-x86_64-with-glibc2.31 (glibc 2.31)
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: ffmpeg 4.3.4-0, ffprobe 4.3.4-0, rtmpdump 2.4
[debug] Optional libraries: Cryptodome-3.9.7, certifi-2020.06.20, mutagen-1.45.1, pyxattr-0.7.2, sqlite3-2.6.0, websockets-8.1
[debug] Proxy map: {}

Usage: yt-dlp [OPTIONS] URL [URL...]

yt-dlp: error: You must provide at least one URL.
Type yt-dlp --help to see a list of all options.
```
-------------------------

As you can see, I DID provide a URL.  But -vu couldn't recognize it.
NOTE:  -vu requests the user to type in the account password.  That's quite vague.  I tried my desktop user password, and my Instagram account password.  Neither worked.

The URL I was trying to download from was
https://www.instagram.com/p/Cfo4kgugFV4/

---------------------------



### Provide verbose output that clearly demonstrates the problem

- [X] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)
- [X] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below

### Complete Verbose Output

```shell
$ yt-dlp --verbose https://www.instagram.com/p/Cfo4kgugFV4/
[debug] Command-line config: ['--verbose', 'https://www.instagram.com/p/Cfo4kgugFV4/']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.07.18 [135f05e] (zip)
[debug] Python 3.9.2 (CPython 64bit) - Linux-5.10.57-antix.1-amd64-smp-x86_64-with-glibc2.31 (glibc 2.31)
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: ffmpeg 4.3.4-0, ffprobe 4.3.4-0, rtmpdump 2.4
[debug] Optional libraries: Cryptodome-3.9.7, certifi-2020.06.20, mutagen-1.45.1, pyxattr-0.7.2, sqlite3-2.6.0, websockets-8.1
[debug] Proxy map: {}
[debug] [Instagram] Extracting URL: https://www.instagram.com/p/Cfo4kgugFV4/
[Instagram] Cfo4kgugFV4: Downloading JSON metadata
WARNING: [Instagram] Cfo4kgugFV4: General metadata extraction failed
[Instagram] Cfo4kgugFV4: Downloading video info
[Instagram] Cfo4kgugFV4: Downloading embed webpage
WARNING: [Instagram] unable to extract additional data; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
WARNING: [Instagram] unable to extract username; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
ERROR: [Instagram] Cfo4kgugFV4: Unable to extract video url; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 644, in extract
    ie_result = self._real_extract(url)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/instagram.py", line 433, in _real_extract
    video_url = self._og_search_video_url(webpage, secure=False)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 1335, in _og_search_video_url
    return self._html_search_regex(regexes, html, name, **kargs)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 1230, in _html_search_regex
    res = self._search_regex(pattern, string, name, default, fatal, flags, group)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 1194, in _search_regex
    raise RegexNotFoundError('Unable to extract %s' % _name)
```

[instagram] "url" field is missing or empty - skipping format, there is an error in extractor
### Checklist

- [X] I'm reporting a bug unrelated to a specific site
- [X] I've verified that I'm running yt-dlp version **2022.07.18** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
- [X] I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/ytdl-org/youtube-dl#video-url-contains-an-ampersand-and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
- [X] I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)

### Provide a description that is worded well enough to be understood

Not sure if this is critical or not, but figured it need to be reported.

Test link:
https://www.instagram.com/p/CgH0HgMt7hg/




### Provide verbose output that clearly demonstrates the problem

- [X] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)
- [X] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below

### Complete Verbose Output

```shell
./yt-dlp -vU -F "https://www.instagram.com/p/CgH0HgMt7hg/"
[debug] Command-line config: ['-vU', '-F', 'https://www.instagram.com/p/CgH0HgMt7hg/']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.06.29 [9d339c41e] (zip)
[debug] Plugins: ['SamplePluginIE', 'SamplePluginPP']
[debug] Python 3.9.13 (CPython 64bit) - macOS-12.4-arm64-arm-64bit 
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: avconv -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] Checking exe version: avprobe -bsfs
[debug] exe versions: none
[debug] Optional libraries: sqlite3-2.6.0
[debug] Proxy map: {}
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2022.07.18, Current version: 2022.06.29
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/download/2022.07.18/_update_spec
Current Build Hash 2af833b5e770b0df2492c728d3c3e809a0ab221fd508b44610827255c5a8c8d1
Updating to version 2022.07.18 ...
[debug] Downloading yt-dlp from https://github.com/yt-dlp/yt-dlp/releases/download/2022.07.18/yt-dlp
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp/releases/download/2022.07.18/SHA2-256SUMS
Updated yt-dlp to version 2022.07.18
WARNING: Restart yt-dlp to use the updated version
[debug] [Instagram] Extracting URL: https://www.instagram.com/p/CgH0HgMt7hg/
[Instagram] CgH0HgMt7hg: Downloading JSON metadata
WARNING: [Instagram] CgH0HgMt7hg: General metadata extraction failed
[Instagram] CgH0HgMt7hg: Downloading video info
[Instagram] CgH0HgMt7hg: Downloading embed webpage
[download] Downloading playlist: <Untitled>
[Instagram] Playlist <Untitled>: Downloading 7 videos of 7
[download] Downloading video 1 of 7
[info] Available formats for CgHzApVjip4:
ID EXT RESOLUTION │ PROTO │ VCODEC  ACODEC
───────────────────────────────────────────
0  mp4 750x750    │ https │ unknown unknown
[download] Downloading video 2 of 7
WARNING: "url" field is missing or empty - skipping format, there is an error in extractor
CgHzLMNDqRt has no formats
[download] Downloading video 3 of 7
[info] Available formats for CgHzWWAji3i:
ID EXT RESOLUTION │ PROTO │ VCODEC  ACODEC
───────────────────────────────────────────
0  mp4 750x750    │ https │ unknown unknown
[download] Downloading video 4 of 7
[info] Available formats for CgHzcY9jO5K:
ID EXT RESOLUTION │ PROTO │ VCODEC  ACODEC
───────────────────────────────────────────
0  mp4 750x750    │ https │ unknown unknown
[download] Downloading video 5 of 7
[info] Available formats for CgHzqYMDPGL:
ID EXT RESOLUTION │ PROTO │ VCODEC  ACODEC
───────────────────────────────────────────
0  mp4 750x750    │ https │ unknown unknown
[download] Downloading video 6 of 7
[info] Available formats for CgHz3yuDAkc:
ID EXT RESOLUTION │ PROTO │ VCODEC  ACODEC
───────────────────────────────────────────
0  mp4 750x750    │ https │ unknown unknown
[download] Downloading video 7 of 7
[info] Available formats for CgH0Ci_DslF:
ID EXT RESOLUTION │ PROTO │ VCODEC  ACODEC
───────────────────────────────────────────
0  mp4 750x750    │ https │ unknown unknown
[download] Finished downloading playlist: <Untitled>
```



Discussion:

Resolving patch:
diff --git a/yt_dlp/extractor/instagram.py b/yt_dlp/extractor/instagram.py
--- a/yt_dlp/extractor/instagram.py
+++ b/yt_dlp/extractor/instagram.py
@@ -39,37 +39,42 @@ class InstagramBaseIE(InfoExtractor):
     _NETRC_MACHINE = 'instagram'
     _IS_LOGGED_IN = False
 
+    _API_BASE_URL = 'https://i.instagram.com/api/v1'
+    _LOGIN_URL = 'https://www.instagram.com/accounts/login'
+    _API_HEADERS = {
+        'X-IG-App-ID': '936619743392459',
+        'X-ASBD-ID': '198387',
+        'X-IG-WWW-Claim': '0',
+        'Origin': 'https://www.instagram.com',
+        'Accept': '*/*',
+        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
+    }
+
     def _perform_login(self, username, password):
         if self._IS_LOGGED_IN:
             return
 
         login_webpage = self._download_webpage(
-            'https://www.instagram.com/accounts/login/', None,
-            note='Downloading login webpage', errnote='Failed to download login webpage')
+            self._LOGIN_URL, None, note='Downloading login webpage', errnote='Failed to download login webpage')
 
-        shared_data = self._parse_json(
-            self._search_regex(
-                r'window\._sharedData\s*=\s*({.+?});',
-                login_webpage, 'shared data', default='{}'),
-            None)
-
-        login = self._download_json('https://www.instagram.com/accounts/login/ajax/', None, note='Logging in', headers={
-            'Accept': '*/*',
-            'X-IG-App-ID': '936619743392459',
-            'X-ASBD-ID': '198387',
-            'X-IG-WWW-Claim': '0',
-            'X-Requested-With': 'XMLHttpRequest',
-            'X-CSRFToken': shared_data['config']['csrf_token'],
-            'X-Instagram-AJAX': shared_data['rollout_hash'],
-            'Referer': 'https://www.instagram.com/',
-        }, data=urlencode_postdata({
-            'enc_password': f'#PWD_INSTAGRAM_BROWSER:0:{int(time.time())}:{password}',
-            'username': username,
-            'queryParams': '{}',
-            'optIntoOneTap': 'false',
-            'stopDeletionNonce': '',
-            'trustedDeviceRecords': '{}',
-        }))
+        shared_data = self._parse_json(self._search_regex(
+            r'window\._sharedData\s*=\s*({.+?});', login_webpage, 'shared data', default='{}'), None)
+
+        login = self._download_json(
+            f'{self._LOGIN_URL}/ajax/', None, note='Logging in', headers={
+                **self._API_HEADERS,
+                'X-Requested-With': 'XMLHttpRequest',
+                'X-CSRFToken': shared_data['config']['csrf_token'],
+                'X-Instagram-AJAX': shared_data['rollout_hash'],
+                'Referer': 'https://www.instagram.com/',
+            }, data=urlencode_postdata({
+                'enc_password': f'#PWD_INSTAGRAM_BROWSER:0:{int(time.time())}:{password}',
+                'username': username,
+                'queryParams': '{}',
+                'optIntoOneTap': 'false',
+                'stopDeletionNonce': '',
+                'trustedDeviceRecords': '{}',
+            }))
 
         if not login.get('authenticated'):
             if login.get('message'):
@@ -134,7 +139,7 @@ def _extract_nodes(self, nodes, is_direct=False):
             }
 
     def _extract_product_media(self, product_media):
-        media_id = product_media.get('code') or product_media.get('id')
+        media_id = product_media.get('code') or _pk_to_id(product_media.get('pk'))
         vcodec = product_media.get('video_codec')
         dash_manifest_raw = product_media.get('video_dash_manifest')
         videos_list = product_media.get('video_versions')
@@ -179,7 +184,7 @@ def _extract_product(self, product_info):
 
         user_info = product_info.get('user') or {}
         info_dict = {
-            'id': product_info.get('code') or product_info.get('id'),
+            'id': product_info.get('code') or _pk_to_id(product_info.get('pk')),
             'title': product_info.get('title') or f'Video by {user_info.get("username")}',
             'description': traverse_obj(product_info, ('caption', 'text'), expected_type=str_or_none),
             'timestamp': int_or_none(product_info.get('taken_at')),
@@ -360,49 +365,74 @@ def _extract_embed_urls(cls, url, webpage):
 
     def _real_extract(self, url):
         video_id, url = self._match_valid_url(url).group('id', 'url')
-        general_info = self._download_json(
-            f'https://www.instagram.com/graphql/query/?query_hash=9f8827793ef34641b2fb195d4d41151c'
-            f'&variables=%7B"shortcode":"{video_id}",'
-            '"parent_comment_count":10,"has_threaded_comments":true}', video_id, fatal=False, errnote=False,
-            headers={
-                'Accept': '*',
-                'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
-                'Authority': 'www.instagram.com',
-                'Referer': 'https://www.instagram.com',
-                'x-ig-app-id': '936619743392459',
-            })
-        media = traverse_obj(general_info, ('data', 'shortcode_media')) or {}
+        media, webpage = {}, ''
+
+        api_check = self._download_json(
+            f'{self._API_BASE_URL}/web/get_ruling_for_content/?content_type=MEDIA&target_id={_id_to_pk(video_id)}',
+            video_id, headers=self._API_HEADERS, fatal=False, note='Setting up session', errnote=False) or {}
+        csrf_token = self._get_cookies('https://www.instagram.com').get('csrftoken')
+
+        if not csrf_token:
+            self.report_warning('No csrf token set by Instagram API', video_id)
+        elif api_check.get('status') != 'ok':
+            self.report_warning('Instagram API is not granting access', video_id)
+        else:
+            if self._get_cookies(url).get('sessionid'):
+                media = traverse_obj(self._download_json(
+                    f'{self._API_BASE_URL}/media/{_id_to_pk(video_id)}/info/', video_id,
+                    fatal=False, note='Downloading video info', headers={
+                        **self._API_HEADERS,
+                        'X-CSRFToken': csrf_token.value,
+                    }), ('items', 0))
+                if media:
+                    return self._extract_product(media)
+
+            variables = {
+                'shortcode': video_id,
+                'child_comment_count': 3,
+                'fetch_comment_count': 40,
+                'parent_comment_count': 24,
+                'has_threaded_comments': True,
+            }
+            general_info = self._download_json(
+                'https://www.instagram.com/graphql/query/', video_id, fatal=False,
+                headers={
+                    **self._API_HEADERS,
+                    'X-CSRFToken': csrf_token.value,
+                    'X-Requested-With': 'XMLHttpRequest',
+                    'Referer': url,
+                }, query={
+                    'query_hash': '9f8827793ef34641b2fb195d4d41151c',
+                    'variables': json.dumps(variables, separators=(',', ':')),
+                })
+            media = traverse_obj(general_info, ('data', 'shortcode_media'))
+
         if not media:
-            self.report_warning('General metadata extraction failed', video_id)
-
-        info = self._download_json(
-            f'https://i.instagram.com/api/v1/media/{_id_to_pk(video_id)}/info/', video_id,
-            fatal=False, note='Downloading video info', errnote=False, headers={
-                'Accept': '*',
-                'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
-                'Authority': 'www.instagram.com',
-                'Referer': 'https://www.instagram.com',
-                'x-ig-app-id': '936619743392459',
-            })
-        if info:
-            media.update(info['items'][0])
-            return self._extract_product(media)
-
-        webpage = self._download_webpage(
-            f'https://www.instagram.com/p/{video_id}/embed/', video_id,
-            note='Downloading embed webpage', fatal=False)
-        if not webpage:
-            self.raise_login_required('Requested content was not found, the content might be private')
-
-        additional_data = self._search_json(
-            r'window\.__additionalDataLoaded\s*\(\s*[^,]+,\s*', webpage, 'additional data', video_id, fatal=False)
-        product_item = traverse_obj(additional_data, ('items', 0), expected_type=dict)
-        if product_item:
-            media.update(product_item)
-            return self._extract_product(media)
-
-        media.update(traverse_obj(
-            additional_data, ('graphql', 'shortcode_media'), 'shortcode_media', expected_type=dict) or {})
+            self.report_warning('General metadata extraction failed (some metadata might be missing).', video_id)
+            webpage, urlh = self._download_webpage_handle(url, video_id)
+            shared_data = self._search_json(
+                r'window\._sharedData\s*=', webpage, 'shared data', video_id, fatal=False)
+
+            if self._LOGIN_URL not in urlh.geturl():
+                media.update(traverse_obj(
+                    shared_data, ('entry_data', 'PostPage', 0, 'graphql', 'shortcode_media'),
+                    ('entry_data', 'PostPage', 0, 'media'), expected_type=dict) or {})
+            else:
+                self.report_warning('Main webpage is locked behind the login page. Retrying with embed webpage')
+                webpage = self._download_webpage(
+                    f'{url}/embed/', video_id, note='Downloading embed webpage', fatal=False)
+                additional_data = self._search_json(
+                    r'window\.__additionalDataLoaded\s*\(\s*[^,]+,\s*', webpage, 'additional data', video_id, fatal=False)
+                if not additional_data:
+                    self.raise_login_required('Requested content was not found, the content might be private')
+
+                product_item = traverse_obj(additional_data, ('items', 0), expected_type=dict)
+                if product_item:
+                    media.update(product_item)
+                    return self._extract_product(media)
+
+                media.update(traverse_obj(
+                    additional_data, ('graphql', 'shortcode_media'), 'shortcode_media', expected_type=dict) or {})
 
         username = traverse_obj(media, ('owner', 'username')) or self._search_regex(
             r'"owner"\s*:\s*{\s*"username"\s*:\s*"(.+?)"', webpage, 'username', fatal=False)
@@ -649,12 +679,8 @@ def _real_extract(self, url):
 
         story_info_url = user_id if username != 'highlights' else f'highlight:{story_id}'
         videos = traverse_obj(self._download_json(
-            f'https://i.instagram.com/api/v1/feed/reels_media/?reel_ids={story_info_url}',
-            story_id, errnote=False, fatal=False, headers={
-                'X-IG-App-ID': 936619743392459,
-                'X-ASBD-ID': 198387,
-                'X-IG-WWW-Claim': 0,
-            }), 'reels')
+            f'{self._API_BASE_URL}/feed/reels_media/?reel_ids={story_info_url}',
+            story_id, errnote=False, fatal=False, headers=self._API_HEADERS), 'reels')
         if not videos:
             self.raise_login_required('You need to log in to access this content')
 


Test patch: