Для тех, кому побыстрее, то инструкция ниже.
Если использовать вкладку Network в DevTools, то там естественно будут ссылки на mp4. Много ссылок, на разное качество.
Но прикол в том, что на один размер видео две ссылки. Одна на видео, а другая на аудио. То есть, видео без аудио, и аудио без видео.
А вот ссылка на полноценное видео уже есть в коде искомой страницы, по ключу video_versions.
Но мне нужно поудобнее.
Все конфиги JSON находятся в теге с аттрибутом data-sjs. Но как сейчас модно, там переизбыток данных, с многочисленными вложениями массивов.
Нужный конфиг можно идентифицировать с помощью ScheduledServerJS, но это не уникальный маркер.
Поэтому, чтоб не перегружать код (и не пугать незнающих), рекурсивный поиск video_versions происходит по всем данным.
Внимание! Этот код сработает если открыта именно страница видео-поста/сторис/рилс. URL в адресной строке должны быть вида:
https://www.instagram.com/p/<id>/ - пост доступен как повезет\nhttps://www.instagram.com/reels/<id>/ - рилс доступен без регистрации\nhttps://www.instagram.com/stories/<username>/<id>/ - сторис только с авторизациейИ если URL подходит - нужно перегрузить страницу (F5) и только тогда использовать метод. Ибо адрес при серфинге меняется с помощью javascript, без полной перезагрузки страницы.
function search(data, needle) {\n\tfor (let key in data) {\n\t\tif (key === needle) {\n\t\t\treturn data[key];\n\t\t}\n\t\tif (data[key] !== null\n\t\t\t&& typeof data[key] === 'object'\n\t\t\t&& (video = search(data[key], needle))) {\n\t\t\treturn video;\n\t\t}\n\t}\n\treturn undefined;\n}\n\ndocument.querySelectorAll('[data-sjs]').forEach(e => {\n\tvar data = JSON.parse(e.innerText);\n\tif (video = search(data, 'video_versions')) {\n\t\tconsole.log(video);\n\t}\n});
Не знаю, что хотят сказать разработчики, но эти три ссылки одинаковые...