VK Photo Upload Fix

Исправляет ошибку загрузки фотографий в альбомы VK, создавая последовательную очередь. Предотвращает сбой "быстрого" аплоадера при загрузке пачкой и добавляет опцию заполнения описания из имени файла.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

作者
Идзуми Сэна
今日安裝
0
安裝總數
2
評價
0 0 0
版本
0.1
建立日期
2025-11-03
更新日期
2025-11-03
尺寸
25.5 KB
授權條款
未知
腳本執行於

Скрипт предназначен для исправления критической ошибки "быстрого" загрузчика фотографий в альбомы vk.com. Стандартный загрузчик VK при перетаскивании (Drag-and-Drop) большого количества файлов (пачкой) пытается обработать их параллельно, что часто приводит к сбоям, ошибкам сети или "зависанию" процесса.

Данный скрипт решает эту проблему, фундаментально изменяя логику загрузки: он перехватывает все перетаскиваемые файлы и вместо параллельной обработки создает из них строго последовательную очередь. Файлы загружаются один за другим, причем следующий файл не отправляется до тех пор, пока сервер VK не пришлет подтверждение об успешной обработке предыдущего.

В качестве дополнительной функции скрипт предлагает опцию автоматического заполнения поля "Описание" для каждой загруженной фотографии, используя имя файла.

Ключевые функции

Архитектура скрипта основана на перехвате и модификации нативных функций браузера и скриптов VK.

  1. Патчинг EventTarget.prototype.addEventListener (Перехват Drop-зоны):

    • Это первая и ключевая точка перехвата. Скрипт не просто добавляет свой listener, он "патчит" саму функцию addEventListener в unsafeWindow.
    • Он отслеживает, когда скрипт VK пытается повесить свой собственный обработчик 'drop' на зону загрузки (#photos_upload_area_drop).
    • Обнаружив "родной" обработчик (идентифицируя его по коду), скрипт сохраняет на него ссылку (originalDropListener), но подменяет его собственным (customDropHandler).
    • Результат: Когда пользователь перетаскивает файлы, срабатывает customDropHandler, а не оригинальный обработчик VK.
  2. customDropHandler (Формирование очереди):

    • Эта функция получает все файлы из event.dataTransfer.files.
    • Если скрипт выключен, она передает управление "родному" обработчику VK.
    • Если скрипт включен, она не загружает файлы. Вместо этого она собирает их в массив uploaderQueue, обновляет UI (updateQueueIndicator) и вызывает processQueue() для запуска последовательной обработки.
  3. processQueue (Последовательный обработчик):

    • Это "сердце" скрипта, работающее как машина состояний, управляемая флагом isProcessingQueue.
    • Если очередь занята (isProcessingQueue === true), функция немедленно завершается.
    • Если очередь свободна:
      1. Блокирует очередь (isProcessingQueue = true).
      2. Извлекает один файл из uploaderQueue (.shift()).
      3. Сохраняет его имя в currentFileName (для функции описания).
      4. Создает фальшивое событие (new DragEvent('drop', ...)).
      5. Помещает в это событие только этот один файл.
      6. "Скармливает" это фальшивое событие "родному" обработчику VK (originalDropListener.call(...)).
    • Результат: VK думает, что пользователь перетащил один файл, и обрабатывает его в штатном режиме. Скрипт переходит в режим ожидания.
  4. Патчинг XMLHttpRequest (Обратная связь и разблокировка):

    • Это вторая точка перехвата, необходимая для создания "обратной связи" от сервера.
    • Скрипт следит за всеми XHR-запросами. Его интересует один конкретный URL: /al_photos.php?act=finish_add. Этот запрос VK отправляет после того, как файл не просто загружен, но и успешно сохранен на сервере.
    • Когда этот запрос (finish_add) успешно завершается:
      1. Разблокирует очередь: Устанавливает isProcessingQueue = false.
      2. Запускает следующий: Немедленно вызывает processQueue(), который берет следующий файл из очереди.
    • Этот механизм "запрос -> finish_add -> разблокировка -> следующий запрос" и создает надежную последовательную очередь.
  5. Авто-заполнение описания:

    • В том же перехватчике XHR (finish_add), если опция fillDescriptionEnabled включена, скрипт:
      1. Парсит JSON-ответ сервера, чтобы извлечь photoId только что загруженного файла.
      2. Находит на странице соответствующий DOM-элемент (#photo_edit_row_...).
      3. Находит в нем <textarea>.
      4. Вставляет в textarea значение currentFileName.
      5. Программно имитирует событие blur на textarea, чтобы VK зафиксировал и сохранил изменение.
  6. UI и Управление (createControlPanel, MutationObserver):

    • Скрипт добавляет плавающую панель (#gm-script-panel) с главным переключателем (ВКЛ/ВЫКЛ) и чекбоксом для опции описания. Настройки сохраняются через GM_setValue.
    • Панель также служит индикатором очереди, показывая статус (напр., "Очередь: 15/40") и список оставшихся файлов.
    • MutationObserver следит за DOM, чтобы заново отрисовать панель, если VK уничтожит ее при SPA-переходе.

Как использовать

  1. Установите скрипт в Violentmonkey или аналогичный менеджер.
  2. Перейдите в альбом vk.com/album* и откройте окно загрузки фотографий.
  3. В левом нижнем углу появится панель "Fix Photo Uploader". Убедитесь, что главный переключатель включен.
  4. (Опционально) Включите чекбокс "Заполнять описание".
  5. Перетащите на зону загрузки большую пачку фотографий (например, 50-100 штук).
  6. Вместо "зависания", вы увидите, как на панели скрипта появится очередь (напр., "Очередь: 49/50").
  7. Скрипт начнет загружать файлы по одному. Если включена опция, поле "Описание" для каждой новой фотографии будет автоматически заполняться именем файла.

Особенности

  • Патчинг addEventListener: Это продвинутый и надежный метод перехвата, который "бесшовно" встраивается в логику страницы, подменяя обработчик до его вызова.
  • Патчинг XMLHttpRequest: Использование XHR-перехвата для получения "сигнала" от сервера (finish_add) является единственным надежным способом узнать, что файл действительно обработан, и можно приступать к следующему.
  • Имитация DragEvent: Скрипт не использует внутренние функции VK (которые могут измениться), а вместо этого "обманывает" оригинальный обработчик, имитируя нативное событие перетаскивания одного файла.
  • Использование isProcessingQueue: Этот флаг-замок (mutex) — центральный элемент, превращающий хаотичный процесс в упорядоченную очередь и предотвращающий любые "гонки состояний".
  • Использование unsafeWindow: Необходимо для доступа к нативным прототипам EventTarget.prototype и XMLHttpRequest.prototype, которые находятся в контексте страницы, а не в "песочнице" UserScript.

Пример выходных данных

Данный скрипт не генерирует файл или текстовый вывод. Его результатом является успешная загрузка всех перетащенных файлов.

Визуальным результатом является:

  1. Появление панели управления в углу экрана.
  2. Обновление этой панели во время загрузки, показывающее статус очереди: Очередь: 14/20 IMG_0015.jpg IMG_0016.jpg ...
  3. Автоматическое заполнение полей "Описание" на странице редактирования загруженных фото:

    <textarea class="photos_photo_edit_row_desc_input" ...></textarea>
    
    <textarea class="photos_photo_edit_row_desc_input" ...>My-Awesome-Picture-001.jpg</textarea>