Создание XML файлов серверов
Содержание
- Введение
- Быстрый старт
- Структура XML файла
- Узел Server
- Узел Info
- Узел Actions
- Узел Result
- Система переменных
- Регулярные выражения
- Полные примеры
- Отладка и тестирование
- Создание скриптов
- FAQ
Введение
Uptooda позволяет добавлять поддержку новых серверов через XML файлы конфигурации. Эта документация поможет вам создать собственные серверы для загрузки изображений и файлов.
Где размещать файлы
- Портативная версия:
Data\Servers\ - Установленная версия:
%appdata%\Uptooda\Servers\
⚠️ Важно: Не редактируйте файл
servers.xmlнапрямую - он перезаписывается при обновлениях.
Быстрый старт
Минимальный пример
Создайте файл myserver.xml с базовой структурой:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Servers>
<Server Name="Мой Сервер">
<Actions>
<Action Type="upload"
Url="https://api.example.com/upload"
PostParams="file=%filename%"
RegExp='"url":"([^"]+)"'
AssignVars="ImageUrl:0"/>
</Actions>
<Result ImageUrlTemplate="$(ImageUrl)"/>
</Server>
</Servers>
Пошаговое создание
- Изучите API целевого сервера
- Определите тип сервера (изображения/файлы/URL)
- Создайте действия для загрузки
- Настройте обработку ответов
- Протестируйте с параметром
Debug="1"
Структура XML файла
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Servers>
<Server Name="название_сервера" [атрибуты]>
<Info>
<SupportedFormats>
<!-- Поддерживаемые форматы файлов -->
</SupportedFormats>
</Info>
<Actions>
<!-- Действия для загрузки -->
</Actions>
<Result ImageUrlTemplate="..." ThumbUrlTemplate="..." DownloadUrlTemplate="..."/>
</Server>
</Servers>
📝 Примечание: Файл должен быть сохранен в кодировке UTF-8.
Узел Server
Обязательные атрибуты
Name- отображаемое название сервера
Основные атрибуты
| Атрибут | Значения | Описание |
|---|---|---|
DisplayName |
текст | Отображаемое имя сервера (версия ≥ 1.4.6) |
Type |
image, file, urlshortening, searchbyimage |
Тип сервера |
FileHost |
0, 1 |
0 - хостинг картинок, 1 - файловый хостинг (устаревший, используйте Type) |
Types |
file image urlshortening |
Список типов через пробел (версия ≥ 1.3.2) |
Authorize |
0, 1, 2 |
0 - без авторизации, 1 - поддерживает, 2 - обязательна |
MaxFileSize |
число в байтах | Максимальный размер файла (0 = без ограничений) |
Debug |
0, 1 |
Включить отладочную информацию |
MinVersion |
x.x.x или x.x.x.xxxx |
Минимальная версия программы (версия ≥ 1.3.1) |
Атрибуты авторизации
| Атрибут | Значения | Описание |
|---|---|---|
NeedPassword |
0, 1 |
1 - нужен пароль, 0 - не нужен |
LoginLabel |
текст | Подпись поля логина ("E-mail", "Login", "Username") |
PasswordLabel |
текст | Подпись поля пароля ("Password", "API Key", "Token") |
RegistrationUrl |
URL | Ссылка на страницу регистрации |
WebsiteUrl |
URL | Адрес веб-сайта сервера (версия ≥ 1.4.1) |
Технические атрибуты
| Атрибут | Значения | Описание |
|---|---|---|
Plugin |
имя файла | Имя скрипта (.nut файл) без расширения. Скрипт должен быть расположен в каталоге Data\Scripts, и иметь расширение .nut. Если данный атрибут не пустой, весь узел <Actions> игнорируется, и всё взаимодействие с серверами перекладывается на скрипт. Однако, узел Actions всё равно должен быть задан. |
Engine |
MegaNz и др. |
Встроенный движок загрузки (версия ≥ 1.3.2) |
UserAgent |
строка | Пользовательский User-Agent (версия ≥ 1.3.2.4432) |
MaxThreads |
число | Ограничение одновременных соединений (версия ≥ 1.3.2) |
SupportsFolders |
0, 1 |
Поддержка альбомов скриптом загрузки |
DefaultForTypes |
file image |
Типы серверов, для которых этот сервер по умолчанию (версия ≥ 1.3.3) |
UploadToTempServer |
0, 1 |
Загружать на промежуточный сервер для поиска по изображению (версия ≥ 1.4.1) |
Пример с атрибутами
<Server Name="Imgur"
Type="image"
Authorize="1"
MaxFileSize="10485760"
RegistrationUrl="https://imgur.com/register"
LoginLabel="Username"
PasswordLabel="Password">
Узел Info
Узел SupportedFormats
Определяет поддерживаемые форматы файлов (версия ≥ 1.4.1).
<SupportedFormats>
<FormatGroup MaxFileSize="10485760" UserTypes="anon">
<Format MimeType="image/jpeg,image/jpg">*.jpg,*.jpeg</Format>
<Format MimeType="image/png">*.png</Format>
<Format MimeType="image/gif">*.gif</Format>
</FormatGroup>
<FormatGroup MaxFileSize="52428800" UserTypes="reg">
<Format MimeType="video/*">*.mp4,*.avi,*.mov</Format>
</FormatGroup>
</SupportedFormats>
В атрибуте MimeType перечисляются (через запятую) разрешенные MIME-типы файлов, которые могут содержать подстановочные символы - wildcards, а в тексте узла перечисляются расширения файлов (через запятую), которые также могут содержать подстановочные символы. Если в одном узле Format указан только MIME-тип(ы), или только расширение(-ия), то проверка файлов будет производиться только по одному признаку.
Атрибуты FormatGroup
MaxFileSize- максимальный размер файлов в группе (в байтах)MinFileSize- минимальный размер файлов в группе (в байтах)UserTypes- содержит список типов пользователей через запятую. Может содержать wildcards. Если UserTypes не задан, эта группа применяется для любого типа пользователя. Предопределенные типы:reg- любой зарегистрированный пользователь,anon- аноним.
Пример с условиями
<SupportedFormats>
<!-- Для всех пользователей -->
<FormatGroup MaxFileSize="5242880">
<Format MimeType="image/jpeg,image/jpg">*.jpg,*.jpeg</Format>
<Format MimeType="image/png">*.png</Format>
<Format MimeType="image/gif">*.gif</Format>
</FormatGroup>
<!-- Для любых авторизованных -->
<FormatGroup MaxFileSize="52428800" UserTypes="reg">
<Format MimeType="video/mp4">*.mp4</Format>
<Format MimeType="video/avi">*.avi</Format>
<Format MimeType="application/*">*.zip,*.rar</Format>
</FormatGroup>
<!-- Только для премиум-пользователей -->
<FormatGroup MaxFileSize="1000000000" UserTypes="premium">
<Format MimeType="video/mp4">*.mp4</Format>
<Format MimeType="video/avi">*.avi</Format>
<Format MimeType="application/*">*.zip,*.rar</Format>
</FormatGroup>
</SupportedFormats>
Узел ForbiddenFormats
Определяет запрещенные форматы файлов (версия ≥ 1.4.4). Структура аналогична узлу SupportedFormats.
Узел Actions
Содержит последовательность действий для загрузки файла.
Типы действий
| Type | Описание | Использование |
|---|---|---|
get |
HTTP GET запрос | Получение токенов, страниц |
post |
HTTP POST запрос | Отправка данных |
login |
POST для авторизации | Вход в систему |
upload |
Multipart форма | Загрузка файлов |
put |
HTTP PUT / FTP | Прямая загрузка |
openurl |
Открыть URL | Переход на страницу в браузере по-умолчанию |
Полный список атрибутов Action
| Атрибут | Обязательность | Описание |
|---|---|---|
Url |
Обязательный | HTTP/HTTPS/FTP адрес, может содержать переменные |
Type |
Обязательный | Тип запроса (get, post, login, upload, put, openurl) |
PostParams |
Опциональный | Параметры POST через ; (param1=value1;param2=value2) |
RegExp |
Опциональный | Регулярное выражение в формате PCRE |
AssignVars |
Опциональный | Присвоение переменных (VarName:GroupNum;...) |
OnlyOnce |
Опциональный | Выполнить только раз за сессию (0 или 1) |
Referer |
Опциональный | Заголовок Referer |
Description |
Опциональный | Описание действия для отображения |
CustomHeaders |
Опциональный | Дополнительные заголовки (Header1:Value1;Header2:Value2) |
Примечания по атрибутам
PostParams:
- Разделитель параметров:
; - Экранирование точки с запятой:
\; - Специальное значение
%filename%= содержимое файла - Поддерживает переменные:
file=%filename%;token=$(token)
CustomHeaders (версия ≥ 1.3.2.4432):
- Формат:
Header1:Value1;Header2:Value2 - Для удаления стандартного заголовка передайте пустое значение
- Поддерживает переменные:
Authorization:Bearer $(token)
RegExp:
- Использует синтаксис PCRE
- Подмаски нумеруются с 0
- При неудаче генерирует предупреждение и повторяет запрос
Пример последовательности действий
<Actions>
<!-- 1. Получение токена -->
<Action Type="get"
Url="https://api.example.com/token"
RegExp='"token":"([^"]+)"'
AssignVars="token:0"
OnlyOnce="1"
Description="Получение токена авторизации"/>
<!-- 2. Загрузка файла -->
<Action Type="upload"
Url="https://api.example.com/upload"
PostParams="file=%filename%;token=$(token)"
RegExp='"url":"([^"]+)","thumb":"([^"]+)"'
AssignVars="ImageUrl:0;ThumbUrl:1"
Description="Загрузка файла"/>
</Actions>
Вложенные узлы Action
RegExp узел
Дополнительные регулярные выражения для обработки ответа:
<Action ...>
<RegExp Pattern='"delete_url":"([^"]+)"' AssignVars="DeleteUrl:0" Required="1"/>
<RegExp Pattern='"edit_url":"([^"]+)"' AssignVars="EditUrl:0" Data="$(CustomData)"/>
</Action>
Атрибуты RegExp:
Pattern- регулярное выражение (аналог атрибута RegExp у Action)AssignVars- присвоение переменныхRequired- генерировать ошибку при неудаче (по умолчанию 0)Data- текст для поиска, может содержать переменные (по умолчанию - ответ сервера)
Call узел (версия ≥ 1.4.0)
Используется для вызова встроенных функций:
<Action ...>
<Call Function="json" Arg1="data.files[0].url" AssignVars="ImageUrl:0" Required="1"/>
<Call Function="regexp" Arg1='"url":"([^"]+)"' AssignVars="ImageUrl:0"/>
</Action>
Атрибуты Call:
Function- название функции (json,regexp)Arg0,Arg1,Arg2- аргументы функции (Arg0 по умолчанию = тело ответа)AssignVars- присвоение переменных (как в Action)Required- генерировать ошибку при неудаче (по умолчанию 0)
Функция json:
- Извлекает данные из JSON по JSON Path
- Примеры путей:
data.url,files[0].thumbnail,response.data[0].link
Функция regexp:
- Применяет регулярное выражение к данным
- Аналогично атрибуту RegExp в Action
Узел Result
Определяет шаблоны для генерации ссылок.
<Result ImageUrlTemplate="$(ImageUrl)"
ThumbUrlTemplate="$(ThumbUrl)"
DownloadUrlTemplate="$(ViewUrl)"
DeleteUrl="$(DeleteUrl)"
EditUrl="$(EditUrl)"/>
Атрибуты Result
| Атрибут | Описание |
|---|---|
ImageUrlTemplate |
Прямая ссылка на файл |
ThumbUrlTemplate |
Ссылка на миниатюру |
DownloadUrlTemplate |
Ссылка на страницу просмотра |
DeleteUrl |
Ссылка для удаления |
EditUrl |
Ссылка для редактирования |
⚠️ Важно: Обязательно должен быть указан
ImageUrlTemplateилиDownloadUrlTemplate. Программа использует тот или иной атрибут в зависимости от настроек, и в зависимости от того, какой из атрибутов задан, а какой нет. По-умолчанию предпочтение отдается прямой ссылке. В случае использования скрипта (плагина - атрибут Plugin узла Server), все атрибуты всё равно должны иметь непустые значения.
Система переменных
Название переменной может содержать алфавитно-цифровые символы (A-z, 0-9) и символ подчеркивания. Имена переменных чувствительны к регистру. Если название переменной начинается с символа подчеркивания, это означает, что данная переменная не будет удалена после загрузки файла, и она останется в памяти на всю сессию загрузки. Однако это не означает, что её значение не может быть перезаписано.
Встроенные переменные
| Переменная | Описание | Пример |
|---|---|---|
_FILENAME |
Имя файла с расширением | photo.jpg |
_FILENAMEWITHOUTEXT |
Имя без расширения | photo |
_FILEEXT |
Расширение файла | jpg |
_FILESIZE |
Размер файла в байтах (версия ≥ 1.4.3) | 1048576 |
_THUMBWIDTH |
Ширина миниатюры | 150 |
_THUMBHEIGHT |
Высота миниатюры | 150 |
_THUMBCREATE |
Создавать миниатюру (версия ≥ 1.4.2) | 0 или 1 |
_THUMBADDTEXT |
Добавлять текст на миниатюру (версия ≥ 1.4.2) | 0 или 1 |
_THUMBUSESERVER |
Использовать серверные миниатюры (версия ≥ 1.4.2) | 0 или 1 |
_RAND16BITS |
Случайное число (генерируется один раз на файл) | 0-65535 |
_LOGIN |
Имя пользователя | user123 |
_PASSWORD |
Пароль пользователя | secretpass |
_THREADID |
ID потока (версия ≥ 1.3.2) | 1 |
_ORIGINALURL |
Ссылка для сокращения (только для urlshortening) | https://example.com |
_IMAGEURL |
Прямая ссылка на изображение для поиска (версия ≥ 1.4.1) | https://temp.host/img.jpg |
Использование переменных
<!-- Подстановка в URL --> <Action Url="https://api.example.com/upload?user=$(_LOGIN)&file=$(_FILENAME)"/> <!-- Подстановка в параметры --> <Action PostParams="filename=$(_FILENAME);size=$(_FILESIZE)"/> <!-- В шаблонах результата --> <Result ImageUrlTemplate="https://cdn.example.com/$(ImageId).$(_FILEEXT)"/>
Пользовательские переменные
<!-- Создание переменной --> <Action RegExp='"id":(\d+)' AssignVars="ImageId:0"/> <!-- Использование --> <Action Url="https://api.example.com/info/$(ImageId)"/>
Глобальные переменные
Переменные, начинающиеся с _, сохраняются на всю сессию:
<Action RegExp='"session":"([^"]+)"' AssignVars="_session:0" OnlyOnce="1"/>
Фильтры переменных
| Фильтр | Описание | Пример |
|---|---|---|
urlencode |
Процентное кодирование URL | $(_FILENAME|urlencode) |
htmldecode |
Декодирование HTML сущностей (версия ≥ 1.3.2) | $(ImageUrl|htmldecode) |
<!-- URL кодирование --> <Action Url="https://api.example.com/search?q=$(_FILENAME|urlencode)"/> <!-- HTML декодирование --> <Result ImageUrlTemplate="$(ImageUrl|htmldecode)"/>
Специальные значения
| Значение | Описание |
|---|---|
%filename% |
Загружаемый файл (не путать с _FILENAME) |
\; |
Экранированная точка с запятой в PostParams |
Регулярные выражения
Основы RegExp для извлечения данных
Простое извлечение
<!-- Извлечение ID из JSON --> RegExp='"id":(\d+)' AssignVars="ImageId:0" <!-- Извлечение URL --> RegExp='"url":"([^"]+)"' AssignVars="ImageUrl:0"
Множественное извлечение
<!-- Извлечение нескольких значений --> RegExp='"url":"([^"]+)","thumb":"([^"]+)","view":"([^"]+)"' AssignVars="ImageUrl:0;ThumbUrl:1;ViewUrl:2"
Работа с HTML
<!-- Извлечение из HTML атрибутов --> RegExp='src="([^"]+)"[^>]+class="image"' AssignVars="ImageUrl:0" <!-- Извлечение текста между тегами --> RegExp='<title>([^<]+)</title>' AssignVars="Title:0"
Частые паттерны
| Задача | Паттерн | Описание |
|---|---|---|
| Число | (\d+) |
Любое число |
| URL | (https?://[^\s"']+) |
HTTP/HTTPS ссылка |
| Текст в кавычках | "([^"]+)" |
Текст в двойных кавычках |
| Текст между тегами | <tag>([^<]+)</tag> |
Содержимое тега |
| Опциональный текст | ([^"]*)" |
Может быть пустым |
⚠️ Важно: Символы
<и>в паттернах при вставке в XML должны быть экранированы:<и>соответственно.
Советы по RegExp
- Тестируйте выражения на сайтах вроде regex101.com
- Используйте неадаптивные группы
(?:...)для группировки без захвата - Экранируйте специальные символы:
\.,\?,\+ - Будьте аккуратны с жадными квантификаторами
.*
Полные примеры
Пример 1: Простой хостинг изображений
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Servers>
<Server Name="SimpleHost" Type="image">
<Actions>
<Action Type="upload"
Url="https://simplehost.com/api/upload"
PostParams="image=%filename%"
RegExp='"success":true,"data":{"url":"([^"]+)","delete_hash":"([^"]+)"}'
AssignVars="ImageUrl:0;DeleteHash:1"/>
</Actions>
<Result ImageUrlTemplate="$(ImageUrl)"
DeleteUrl="https://simplehost.com/delete/$(DeleteHash)"/>
</Server>
</Servers>
Пример 2: Сервер с авторизацией
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Servers>
<Server Name="AuthHost" Type="image" Authorize="1"
LoginLabel="Username" PasswordLabel="Password">
<Actions>
<!-- Авторизация -->
<Action Type="login"
Url="https://authhost.com/api/login"
PostParams="username=$(_LOGIN);password=$(_PASSWORD)"
RegExp='"token":"([^"]+)"'
AssignVars="_token:0"
OnlyOnce="1"
Description="Авторизация"/>
<!-- Загрузка -->
<Action Type="upload"
Url="https://authhost.com/api/upload"
PostParams="file=%filename%;token=$(_token)"
CustomHeaders="Authorization:Bearer $(_token)"
RegExp='"url":"([^"]+)","thumb":"([^"]+)"'
AssignVars="ImageUrl:0;ThumbUrl:1"/>
</Actions>
<Result ImageUrlTemplate="$(ImageUrl)" ThumbUrlTemplate="$(ThumbUrl)"/>
</Server>
</Servers>
Пример 3: Файловый хостинг
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Servers>
<Server Name="FileHost" Type="file" FileHost="1" MaxFileSize="104857600">
<SupportedFormats>
<FormatGroup>
<Format MimeType="*/*">*.*</Format>
</FormatGroup>
</SupportedFormats>
<Actions>
<Action Type="upload"
Url="https://filehost.com/upload"
PostParams="file=%filename%;public=1"
RegExp='"file_url":"([^"]+)","download_url":"([^"]+)"'
AssignVars="FileUrl:0;DownloadUrl:1"/>
</Actions>
<Result ImageUrlTemplate="$(FileUrl)" DownloadUrlTemplate="$(DownloadUrl)"/>
</Server>
</Servers>
Пример 4: Сокращение URL
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Servers>
<Server Name="ShortURL" Type="urlshortening">
<Actions>
<Action Type="post"
Url="https://short.ly/api/shorten"
PostParams="url=$(_ORIGINALURL)"
RegExp='"short_url":"([^"]+)"'
AssignVars="ShortUrl:0"/>
</Actions>
<Result DownloadUrlTemplate="$(ShortUrl)"/>
</Server>
</Servers>
Отладка и тестирование
Включение отладки
<Server Name="TestServer" Debug="1">
При включенной отладке программа покажет:
- Отправляемые запросы
- Полученные ответы
- Результаты RegExp
- Значения переменных
Пошаговое тестирование
- Создайте минимальный XML с одним действием
- Включите Debug="1"
- Загрузите тестовый файл
- Изучите лог в окне программы
- Исправьте ошибки и повторите
Частые проблемы
| Проблема | Причина | Решение |
|---|---|---|
| "RegExp не найден" | Неверное регулярное выражение | Проверьте паттерн на тестовых данных |
| "Переменная пуста" | Неверный номер группы | Проверьте номера в AssignVars |
| "Файл не загружен" | Неверные параметры POST | Изучите документацию API |
| "Ошибка авторизации" | Неверный URL или параметры | Проверьте процесс авторизации |
Инструменты для отладки
- RegExr.com - тестирование регулярных выражений
- Browser DevTools - анализ сетевого трафика в браузере
- Fiddler Classic - анализ сетевого трафика с помощью прокси
- Postman - тестирование API запросов
Создание скриптов (плагинов)
Для расширенной поддержки серверов в программе используются скрипты на языке Squirrel 3 (до версии 1.3.2 использовался Squirrel 2).
Они должны быть сохранены в кодировке utf-8 в файлах с расширением .nut.
Документация языка Squirrel
Документация стандартной библиотеки языка Squirrel (PDF)
FAQ
Общие вопросы
Q: Где найти документацию API сервера? A: Обычно на сайте сервера в разделе "API", "Developers" или "Documentation".
Q: Как узнать формат запроса? A: Используйте инструменты разработчика браузера для анализа запросов при загрузке через веб-интерфейс.
Q: Можно ли использовать один XML для нескольких серверов?
A: Да, один файл может содержать несколько узлов <Server>.
Q: Поддерживается ли HTTPS? A: Да, Uptooda поддерживает HTTPS полностью.
Технические вопросы
Q: Как передать файл в POST запросе?
A: Используйте %filename% в параметре PostParams:
PostParams="file=%filename%;key=value"
Q: Как работать с cookies? A: Cookies автоматически сохраняются и передаются между запросами в рамках одной сессии.
Q: Можно ли изменить User-Agent?
A: Да, используйте атрибут UserAgent в узле Server.
Q: Как передать дополнительные заголовки?
A: Используйте атрибут CustomHeaders:
CustomHeaders="X-API-Key:mykey;Content-Type:application/json"
Регулярные выражения
Q: Как извлечь данные из JSON?
A: Используйте узел <Call Function="json"> (версия ≥ 1.4.0) или RegExp:
<!-- Через Call --> <Call Function="json" Arg1="data.url" AssignVars="ImageUrl:0"/> <!-- Через RegExp --> RegExp='"url":"([^"]+)"'
Q: Как работать с многострочными ответами?
A: Используйте флаг [\s\S]*? для захвата переносов строк:
RegExp='<script>([\s\S]*?)</script>'
Q: RegExp не находит совпадения A: Проверьте:
- Правильность экранирования символов
- Соответствие паттерна реальному ответу
- Используйте инструменты тестирования регулярных выражений
Переменные
Q: Переменная не сохраняется между запросами
A: Используйте префикс _ для глобальных переменных:
AssignVars="_token:0"
Q: Как использовать переменную в URL?
A: Заключите в $():
Url="https://api.example.com/user/$(UserId)/upload"
Q: Можно ли использовать переменные в RegExp? A: Нет, RegExp не поддерживает переменные. Используйте фиксированные паттерны.
Заключение
Создание XML файлов для Uptooda требует понимания API целевого сервера и базовых принципов HTTP. Следуйте этой документации, тестируйте каждый шаг и не бойтесь экспериментировать с отладкой.
Для получения дополнительной помощи:
- Изучите существующие XML файлы в папке серверов
- Используйте режим отладки для анализа запросов
- Обращайтесь к документации API серверов
Удачи в создании поддержки новых серверов! 🚀