您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
从禁止下载的Telegram频道中下载图片、视频及语音消息
Обзор основных исправлений и улучшений:
Заголовок Userscript:
Удалено дублирование @match.
Добавлено @grant unsafeWindow для явного разрешения использования unsafeWindow.
Функции логирования logger:
Сделан более последовательным вызов logger.info/error с fileName по умолчанию пустой строкой.
Функции прогресс-бара (createProgressBar, updateProgress, completeProgress, abortProgress):
Создание контейнера: Теперь createProgressBar гарантирует, что контейнер для прогресс-баров (#tel-downloader-progress-bar-container) существует, вызывая setupProgressBar() при необходимости.
Начальный прогресс: createProgressBar теперь сразу вызывает updateProgress(videoId, fileName, 0) для отображения 0%.
Улучшения UX: Добавлены небольшие стили (скругление углов, отступы, text-overflow: ellipsis для длинных имен файлов), чтобы прогресс-бар выглядел лучше.
Автоматическое скрытие: После завершения (completeProgress) или отмены (abortProgress) прогресс-бар автоматически исчезает через 3 секунды.
Проверки наличия элемента: Добавлены проверки if (!innerContainer) return; и if (!progressBar) return; для предотвращения ошибок, если элемент по какой-то причине уже удален.
Использование .remove(): Более современный и чистый способ удаления элементов из DOM.
Функции загрузки (tel_download_video, tel_download_audio, tel_download_image):
Извлечение имени файла: Улучшена логика для tel_download_video и tel_download_audio для более надежного извлечения имени файла и расширения из URL, используя URL API и более строгий парсинг.
Обработка Content-Range: Добавлена обработка случаев, когда заголовок Content-Range отсутствует (например, при полной загрузке файла со статусом 200).
Прогресс-бар для всех типов: Теперь createProgressBar вызывается в начале каждой функции загрузки (_video, _audio, _image), чтобы все загрузки отображали прогресс.
writable.write Promise: writable.write(resBlob) теперь возвращает промис, который нужно вернуть, чтобы цепочка then работала корректно.
Типы файлов для showSaveFilePicker: Указаны более конкретные типы файлов для showSaveFilePicker, что улучшает опыт пользователя при сохранении.
Обработка ошибок showSaveFilePicker: Улучшена обработка ошибок, если пользователь отменяет диалог сохранения файла.
Функция addDownloadButton:
Унифицированный подход: Создана одна вспомогательная функция addDownloadButton для добавления кнопок загрузки, уменьшая дублирование кода.
Предотвращение дубликатов: Кнопки теперь имеют атрибут data-tel-download-url, и функция проверяет его наличие, чтобы не добавлять одну и ту же кнопку несколько раз для одного и того же медиафайла.
Гибкие стили: Функция адаптируется к классам стилей Telegram Webapp (webz vs webk).
Обработка клика: Упрощена логика onclick для кнопок.
Улучшенная стратегия поиска кнопок:
Вместо сложной логики if-else if для каждого типа медиа и положения кнопки, теперь используется addDownloadButton в различных местах DOM, где могут появиться медиафайлы. Это упрощает добавление кнопок.
Хотя setInterval остался для периодической проверки (что может быть менее оптимально, чем MutationObserver для сложных динамических страниц), addDownloadButton теперь эффективно предотвращает дублирование.
Код для раскрытия скрытых официальных кнопок в /k/ приложении также сохранен и теперь находится в общей логике.
Структура кода:
Логически разделены функции для логгирования, управления прогрессом, загрузки и добавления кнопок.
Как протестировать:
Обновите код в вашем Greasemonkey/Tampermonkey.
Откройте https://web.telegram.org/ (или /k/, /z/).
Откройте приватный канал, где запрещено скачивание медиа.
Попробуйте открыть видео, аудио или изображение. Вы должны увидеть новую кнопку загрузки, а при ее нажатии — прогресс-бар.
Эти изменения должны сделать скрипт более стабильным, удобным в использовании и легким для отладки.