Как реально всё было
Как реально всё было

(ссылка на гитхаб и на готовый продукт - в конце статьи)

OpenAI добавляет водяной знак на все видео из Sora. Типа защита. Только вот оригиналы без водяных знаков лежат на тех же серверах — и забрать их может любой авторизованный пользователь. Я написал расширение, которое это делает в один клик. Рассказываю, как нашёл и почему это вообще работает.

С чего все началось

Я не такой частый юзер Sora, но когда увидел, что люди ПРОДАЮТ доступ к видео без водяных знаков — сначала подумал, что они сделали машинное обучение и фотошопом каждый кадр обрабатывают. Но когда я попробовал — результат был готов за 1 секунду. В тот момент я осознал: ЗНАЧИТ ВИДЕО ЛЕЖАТ НА СЕРВЕРАХ. Во мне проснулся инстинкт хакера, и я начал искать ДЫРУ.

Первым делом я полез изучать вкладку Network, пробуя различные методы тыка туда-сюда. Всё что удалось оттуда получить - это подтверждение, что да, оригинал видео без водяных знаков есть на сервере.

Например, при открытии видео мы видим запрос на получение медиафайла:/backend/project_y/post/s_69491ee99e408191addbc9b74004ebca/tree?limit=20&max_depth=1

Который и отдаёт URL для видео с водяным знаком, но в том же ответе присутствуют и другие поля:

...
"encodings": {
  "source": {
    "path": "https://videos.openai.com/az/files/00000000-3fc0-7280-a658-0386c8b0d4af%2Fraw?se=2026-01-01T00%3A00%3A00Z&sp=r&sv=2024-08-04&sr=b&skoid=cfbc986b-d2bc-4088-8b71-4f962129715b&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-12-27T01%3A09%3A39Z&ske=2026-01-03T01%3A14%3A39Z&sks=b&skv=2024-08-04&sig=aIewYW3/7HZGVUWwnvYnSUSplfd/WKOpvsaz0yC6wUw%3D&ac=oaisdsorprsouthcentralus"
  },
  "source_wm": {
    "path": "https://videos.openai.com/az/files/00000000-3fc0-7280-a658-0386c8b0d4af%2Fraw?se=2026-01-01T00%3A00%3A00Z&sp=r&sv=2024-08-04&sr=b&skoid=cfbc986b-d2bc-4088-8b71-4f962129715b&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-12-27T01%3A09%3A39Z&ske=2026-01-03T01%3A14%3A39Z&sks=b&skv=2024-08-04&sig=aIewYW3/7HZGVUWwnvYnSUSplfd/WKOpvsaz0yC6wUw%3D&ac=oaisdsorprsouthcentralus"
  },
  "endcard_wm": null,
  "thumbnail": {
    "path": "https://videos.openai.com/az/files/ec223ed8fe79a36_00000000-3fc0-7280-a658-0386c8b0d4af%2Fdrvs%2Fthumbnail%2Fraw?se=2026-01-01T00%3A00%3A00Z&sp=r&sv=2024-08-04&sr=b&skoid=cfbc986b-d2bc-4088-8b71-4f962129715b&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-12-27T01%3A09%3A39Z&ske=2026-01-03T01%3A14%3A39Z&sks=b&skv=2024-08-04&sig=eedTClrNLjxDF7aCW2CbU1TRras38CF%2BOgmpJ4wAW9U%3D&ac=oaisdsorprsouthcentralus"
  },
  "unfurl": {
    "path": "https://videos.openai.com/az/files/34780fbcd347644_00000000-3658-7284-9d9f-64947faf826b%2Fdrvs%2Flink_thumbnail%2Fraw?se=2026-01-01T00%3A00%3A00Z&sp=r&sv=2024-08-04&sr=b&skoid=cfbc986b-d2bc-4088-8b71-4f962129715b&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-12-27T01%3A10%3A43Z&ske=2026-01-03T01%3A15%3A43Z&sks=b&skv=2024-08-04&sig=3dx5D0VSb8YcK6Pf1VOuoM3s7%2BBaeGuUTqTnh9nAHQ4%3D&ac=oaisdsorprcentralus"
  },
  "md": {
    "path": "https://videos.openai.com/az/files/2fccbbc30a166d1_00000000-3fc0-7280-a658-0386c8b0d4af%2Fdrvs%2Fmd%2Fraw?se=2026-01-01T00%3A00%3A00Z&sp=r&sv=2024-08-04&sr=b&skoid=cfbc986b-d2bc-4088-8b71-4f962129715b&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-12-27T01%3A09%3A39Z&ske=2026-01-03T01%3A14%3A39Z&sks=b&skv=2024-08-04&sig=KfpzXrJ15F3/iti4/NMrWGyQVbKQNmD3LCa0RuAU1Gk%3D&ac=oaisdsorprsouthcentralus"
  },
  "gif": {
    "path": "https://videos.openai.com/az/files/ec3c5d130062958_00000000-3fc0-7280-a658-0386c8b0d4af%2Fdrvs%2Fgif%2Fraw?se=2026-01-01T00%3A00%3A00Z&sp=r&sv=2024-08-04&sr=b&skoid=cfbc986b-d2bc-4088-8b71-4f962129715b&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-12-27T01%3A09%3A39Z&ske=2026-01-03T01%3A14%3A39Z&sks=b&skv=2024-08-04&sig=ZLmnXWBXyptAIBFFjb8oSDZmkJgMIUWH9BUspSk3kvs%3D&ac=oaisdsorprsouthcentralus"
  }
},
...

Нас интересует поля source и source_wm, URL на видео без водяного знака и с водяным знаком соответственно. Проблема в том, что OpenAI в оба поля вставляют одинаковый URL. Но само наличие поля source указывает на то, что изначально оригинал там был - а значит, вероятно, до сих пор где-то есть.

Первым делом я подумал - ха, так можно просто попробовать подобрать URL, вставляя нужный gen_id/task_id/post_id. OpenAI использует целых три идентификатора для обозначения видео. Но ничего из этого не получилось, потому что в каждом URL присутствует параметр подписи (signature), который генерируется на стороне сервера и который невозможно брутфорсить.

Значит проблема где-то в другом месте...

Возвращение к истокам

Спустя пару часов безуспешных попыток я вдруг вспоминаю: стоп, у них же был другой сайт! Не зря этот называется Sora2 - на первом я что-то не припомню водяных знаков, а аккаунт тот же!

И вот я иду на старый сайт Sora, открываю старое видео - запрос уже другой: /backend/generations/gen_01kbk5p1s5f9pb63q81sx9atax

В нем используется gen_id вместо post_id. Я подумал - это оно! Но когда я получил gen_id для видео из новой Sora и попытался выполнить запрос с ним - получил ошибку. Хм, значит снова мимо, едем дальше.

Дальше я начал смотреть - а что еще всплывает во вкладке network?
Я при открытии сайта я увидел странный запрос:/backend/notif?limit=10

Который возвращает всю нашу библиотеку (и Sora1, и Sora2) во всех возможных качествах, включая тот самый source, который Sora2 не хотела отдавать:

"encodings": {
    "source": {
        "path": "https://videos.openai.com/az/files/00000000-e9ac-7283-a06d-7e9688f1756f%2Fraw?se=2026-01-01T00%3A00%3A00Z&sp=r&sv=2024-08-04&sr=b&skoid=cfbc986b-d2bc-4088-8b71-4f962129715b&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-12-27T01%3A10%3A01Z&ske=2026-01-03T01%3A15%3A01Z&sks=b&skv=2024-08-04&sig=25ruxWAU/CxniQTJBn6Cvq8GD0sUzkx5MUi2QJouPSc%3D&ac=oaisdsorprwestus2",
        "size": 5938502,
        "width": 1280,
        "height": 704,
        "duration_secs": 10.1,
        "ssim": 0.9935621,
        "az_path": null,
        "codec": "h264"
    },
    "source_c2pa": null,
    "md": {...},
    "ld": null,
    "thumbnail": {...},
    "link_thumbnail": {...},
    "spritesheet": {...},
    "gif": {...},
    "mp3": {...},
    "source_wm": {
        "path": "https://videos.openai.com/az/files/00000000-c904-7284-9ac9-cb42fe88ec64%2Fraw?se=2026-01-01T00%3A00%3A00Z&sp=r&sv=2024-08-04&sr=b&skoid=cfbc986b-d2bc-4088-8b71-4f962129715b&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-12-27T01%3A10%3A43Z&ske=2026-01-03T01%3A15%3A43Z&sks=b&skv=2024-08-04&sig=l8CTaphMR1i/JxTvjR%2BhvhAt0Oi6RoHoRXnLjJRTs04%3D&ac=oaisdsorprcentralus",
        "size": 5929815,
        "width": 1280,
        "height": 704,
        "duration_secs": 10.1,
        "ssim": 0.9943679,
        "az_path": null,
        "codec": "h264"
    },
    "md_wm": {...},
    "ld_wm": null,
    "thumbnail_wm": {...},
    "link_thumbnail_wm": {...},
    "spritesheet_wm": {...},
    "gif_wm": {...},
    "endcard_wm": null
},

То есть endpoint для уведомлений отдаёт то, что основной API прячет. Классика.

Открываем видео по ссылке - да, это оно. Видео, сгенерированное на новом сайте Sora2 без водяного знака!

Ссылки

Chrome Web Store

GitHub