00 Аутентификация
Действия на запись требуют аутентификации. Чтение (get_news, get_news_by_id, search_news, get_categories, test) доступно без ключа.
🔑 API-ключ рекомендуемый
Передайте секретный ключ в поле api_key
"api_key": "ВАШ_СЕКРЕТНЫЙ_КЛЮЧ"
👤 Логин / пароль DLE
Учётные данные пользователя из БД DLE
"username": "admin", "password": "пароль"
01 Тест соединения
Проверка работоспособности API, подключения к БД и версии DLE.
# Простой GET curl https://site.com/api.php # POST с явным action curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{"action": "test"}'
{
"success": true,
"data": {
"api_status": "working",
"version": "4.0",
"database_connected": true,
"dle_version": "17+",
"tables_found": {
"posts": "dle_post",
"categories": "dle_category",
"users": "dle_users"
},
"available_actions": [
"add_news", "update_news", "delete_news", "get_news_status",
"get_news", "get_news_by_id", "search_news",
"get_categories", "add_category", "get_stats", "upload_file"
]
}
}
02 Добавление новости
Обязательные поля: title, short_story, full_story. По умолчанию новость публикуется (approve=1).
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "add_news", "api_key": "ВАШ_КЛЮЧ", "title": "Заголовок новости", "short_story": "<p>Краткое описание новости</p>", "full_story": "<p>Полный текст с <b>HTML</b>-разметкой.</p>", "category": "1", "author": "admin", "tags": "тег1, тег2, тег3", "keywords": "ключевое слово 1", "description": "Meta-описание для SEO", "metatitle": "SEO-заголовок страницы" }'
03 Неопубликованная новость
«approve»: 0 — новость создаётся, но не отображается на сайте. Публикация — вручную из админки DLE → «Публикация материалов».curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "add_news", "api_key": "ВАШ_КЛЮЧ", "title": "Ожидает модерации", "short_story": "<p>Краткое описание.</p>", "full_story": "<p>Полный текст новости.</p>", "category": "2", "author": "admin", "approve": 0, "tags": "модерация, черновик", "keywords": "черновик", "description": "Эта новость ожидает публикации" }'
Все опциональные поля add_news
| Поле | Тип | Умолчание | Описание |
|---|---|---|---|
approve | int | 1 | 0 — не опубликована, 1 — опубликована |
allow_comments | int | 1 | Разрешить комментарии |
allow_main | int | 1 | Показывать на главной |
allow_rating | int | 1 | Разрешить голосование |
fixed | int | 0 | Закреплённая новость |
user_id | int | 1 | ID пользователя-автора |
category | string | "1" | ID категории |
author | string | "admin" | Имя автора |
alt_name | string | авто | ЧПУ-алиас (генерируется из заголовка) |
tags | string | "" | Теги через запятую |
keywords | string | "" | Meta keywords |
description | string | "" | Meta description |
metatitle | string | "" | Meta title |
xfields | object | {} | Дополнительные поля DLE |
04 Новость с постером и xfields
Постер скачивается автоматически по URL из xfields.poster. Домен должен быть в белом списке. Изображение конвертируется в WebP 223×335 px.
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "add_news", "api_key": "ВАШ_КЛЮЧ", "title": "Фильм: Начало (2010)", "short_story": "<p>Дом Кобб — талантливый вор...</p>", "full_story": "<p>Полное описание фильма...</p>", "category": "3", "author": "admin", "approve": 0, "tags": "фантастика, триллер, Нолан", "xfields": { "kinopoisk_id": "447301", "poster": "https://avatars.mds.yandex.net/.../orig", "year": "2010", "genre": "фантастика, боевик, триллер", "country": "США, Великобритания", "director": "Кристофер Нолан", "actors": "Леонардо ДиКаприо, Джозеф Гордон-Левитт", "quality": "HDRip", "duration": "148 мин.", "rating_kp": "8.7", "rating_imdb": "8.8", "translator": "Дублированный" } }'
{
"success": true,
"data": {
"news_id": 156,
"title": "Фильм: Начало (2010)",
"url": "https://site.com/156-film-nachalo-2010.html",
"rebuild": "ok",
"poster": {
"saved": true,
"url": "/uploads/posts/2026-02/poster_156_a3f1b2c4.webp",
"size": 28450
}
},
"message": "Новость успешно добавлена"
}
Разрешённые хосты для постеров
| Хост | Источник |
|---|---|
avatars.mds.yandex.net | Кинопоиск |
kinopoiskapiunofficial.tech | KP API |
st.kp.yandex.net | Кинопоиск |
image.openmoviedb.com | OpenMovieDB |
image.tmdb.org | TMDB |
media.themoviedb.org | TMDB |
Настройки обработки постера (в api.php)
| Константа | Значение | Описание |
|---|---|---|
POSTER_FORMAT | webp | Формат: jpg, png, webp, original |
POSTER_QUALITY | 85 | Качество (1–100) |
POSTER_MAX_WIDTH | 223 | Макс. ширина px (0 = без ресайза) |
POSTER_MAX_HEIGHT | 335 | Макс. высота px (0 = без ресайза) |
05 Загрузка файла
multipart/form-data (флаг -F), а не JSON!curl -X POST https://site.com/api.php \ -F "action=upload_file" \ -F "api_key=ВАШ_КЛЮЧ" \ -F "file=@/path/to/archive.zip"
{
"success": true,
"data": {
"file_url": "/uploads/files/2026-02/archive_a3f1b2c4.zip",
"filename": "archive_a3f1b2c4.zip",
"original_name": "archive.zip",
"size": 5242880,
"size_human": "5 МБ",
"extension": "zip",
"news_id": null,
"linked_to_news": false
}
}
Разрешённые расширения
zip rar 7z tar gz pdf doc docx xls xlsx txt csv
06 Загрузка файла + привязка к новости
Добавьте news_id и description для привязки файла к существующей новости.
curl -X POST https://site.com/api.php \ -F "action=upload_file" \ -F "api_key=ВАШ_КЛЮЧ" \ -F "file=@document.pdf" \ -F "news_id=156" \ -F "description=Инструкция к фильму в PDF"
Несколько файлов к одной новости
API принимает один файл за запрос. Отправляйте последовательно:
# Файл 1 — субтитры curl -X POST https://site.com/api.php \ -F "action=upload_file" \ -F "api_key=ВАШ_КЛЮЧ" \ -F "file=@subtitles.zip" \ -F "news_id=156" \ -F "description=Субтитры (RUS)" # Файл 2 — саундтрек curl -X POST https://site.com/api.php \ -F "action=upload_file" \ -F "api_key=ВАШ_КЛЮЧ" \ -F "file=@soundtrack.zip" \ -F "news_id=156" \ -F "description=Саундтрек (MP3)"
07 Обновление новости
Обновляет указанные поля. Не переданные поля остаются без изменений.
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "update_news", "api_key": "ВАШ_КЛЮЧ", "news_id": 156, "title": "Обновлённый заголовок", "short_story": "<p>Обновлённое описание</p>", "category": "5", "tags": "новый тег1, новый тег2" }'
Публикация из API
"approve": 1curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "update_news", "api_key": "ВАШ_КЛЮЧ", "news_id": 156, "approve": 1 }'
Обновление xfields + постер
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "update_news", "api_key": "ВАШ_КЛЮЧ", "news_id": 156, "xfields": { "kinopoisk_id": "447301", "poster": "https://avatars.mds.yandex.net/.../new-poster/orig", "year": "2010", "quality": "BDRip 1080p" } }'
Все обновляемые поля
| Поле | Описание |
|---|---|
title | Заголовок |
short_story | Краткое описание (HTML) |
full_story | Полный текст (HTML) |
category | ID категории |
author | Имя автора |
keywords | Meta keywords |
description | Meta description |
metatitle | Meta title |
approve | Статус публикации (0/1) |
allow_comments | Комментарии (0/1) |
allow_main | Показывать на главной (0/1) |
allow_rating | Голосование (0/1) |
fixed | Закреплённая (0/1) |
tags | Теги через запятую |
xfields | Дополнительные поля (объект) |
08 Удаление новости
Полностью удаляет новость и все связанные данные: extras, теги, xfsearch, комментарии, related_ids.
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "delete_news", "api_key": "ВАШ_КЛЮЧ", "news_id": 156 }'
09 Список новостей
Без аутентификации. Пагинация, фильтрация по категории, сортировка.
# Базовый запрос — 10 последних curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{"action": "get_news"}' # С фильтрами curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "get_news", "limit": 20, "offset": 0, "category": 3, "order_by": "date", "order_direction": "DESC", "approved_only": 1 }' # Все новости включая неопубликованные curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{"action": "get_news", "approved_only": 0, "limit": 50}'
Параметры
| Параметр | Тип | Умолчание | Описание |
|---|---|---|---|
limit | int | 10 | Количество (макс. 100) |
offset | int | 0 | Смещение для пагинации |
category | int | 0 | Фильтр по ID категории (0 = все) |
approved_only | int | 1 | 1 — только опубликованные |
order_by | string | "date" | id, date, title, news_read, rating |
order_direction | string | "DESC" | ASC или DESC |
10 Новость по ID
Без аутентификации. Возвращает все поля включая xfields (как объект). Увеличивает счётчик просмотров.
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{"action": "get_news_by_id", "news_id": 156}'
11 Поиск новостей
Без аутентификации. Ищет по: title, short_story, full_story, keywords.
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "search_news", "query": "Нолан", "limit": 10, "offset": 0 }'
12 Получение категорий
Без аутентификации.
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{"action": "get_categories"}'
{
"success": true,
"data": {
"categories": [
{"id": 1, "name": "Фильмы", "alt_name": "films"},
{"id": 2, "name": "Сериалы", "alt_name": "serials"}
]
}
}
13 Добавление категории
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "add_category", "api_key": "ВАШ_КЛЮЧ", "name": "Мультфильмы", "alt_name": "cartoons", "description": "Категория мультфильмов", "sort": 5 }'
14 Статистика
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{"action": "get_stats", "api_key": "ВАШ_КЛЮЧ"}'
{
"success": true,
"data": {
"total_news": 1250,
"approved_news": 1230,
"pending_news": 20,
"total_categories": 8,
"total_views": 450000,
"total_comments": 3200,
"dle_version": "17+"
}
}
15 Статус новости
Подробная информация о статусе: публикация, extras, категории, просмотры.
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "get_news_status", "api_key": "ВАШ_КЛЮЧ", "news_id": 156 }'
16 Проверка дубликата
Ищет существующую новость по kinopoisk_id через xfsearch и xfields.
curl -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "check_duplicate", "api_key": "ВАШ_КЛЮЧ", "kinopoisk_id": "447301" }'
{
"success": true,
"data": {
"exists": true,
"news_id": 156,
"title": "Фильм: Начало (2010)",
"url": "https://site.com/156-film-nachalo-2010.html"
},
"message": "Фильм уже существует в базе"
}
★ Полный пример
Сценарий: проверка дубликата → создание неопубликованной новости с постером → загрузка файлов → проверка статуса.
Проверка дубликата
curl -s -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "check_duplicate", "api_key": "ВАШ_КЛЮЧ", "kinopoisk_id": "447301" }' | jq '.data.exists'
Создание неопубликованной новости
NEWS_RESPONSE=$(curl -s -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d '{ "action": "add_news", "api_key": "ВАШ_КЛЮЧ", "title": "Начало / Inception (2010)", "short_story": "<p>Дом Кобб — талантливый вор...</p>", "full_story": "<p>Полный текст описания...</p>", "category": "3", "author": "admin", "approve": 0, "tags": "фантастика, триллер, Нолан, 2010", "keywords": "начало, inception, смотреть онлайн", "description": "Смотреть онлайн Начало (2010)", "metatitle": "Начало (2010) — смотреть онлайн", "xfields": { "kinopoisk_id": "447301", "poster": "https://avatars.mds.yandex.net/.../orig", "year": "2010", "genre": "фантастика, боевик", "country": "США, Великобритания", "director": "Кристофер Нолан", "quality": "BDRip 1080p", "rating_kp": "8.7", "rating_imdb": "8.8" } }') # Извлекаем ID NEWS_ID=$(echo "$NEWS_RESPONSE" | jq -r '.data.news_id') echo "Создана новость ID: $NEWS_ID"
Загрузка файлов к новости
# Субтитры curl -X POST https://site.com/api.php \ -F "action=upload_file" \ -F "api_key=ВАШ_КЛЮЧ" \ -F "file=@subtitles_rus.zip" \ -F "news_id=$NEWS_ID" \ -F "description=Субтитры (Русские)" # Бонусные материалы curl -X POST https://site.com/api.php \ -F "action=upload_file" \ -F "api_key=ВАШ_КЛЮЧ" \ -F "file=@bonus.rar" \ -F "news_id=$NEWS_ID" \ -F "description=Бонусные материалы"
Проверка статуса
curl -s -X POST https://site.com/api.php \ -H "Content-Type: application/json" \ -d "{ \"action\": \"get_news_status\", \"api_key\": \"ВАШ_КЛЮЧ\", \"news_id\": $NEWS_ID }" | jq .
ERR Коды ошибок
Формат ошибки
{
"success": false,
"error": "Поле 'title' обязательно",
"code": 400,
"timestamp": 1737456000,
"api_version": "4.0"
}
Формат успеха
{
"success": true,
"data": { /* ... */ },
"message": "Описание (опционально)",
"timestamp": 1737456000,
"api_version": "4.0"
}
ℹ Лимиты
| Параметр | Значение |
|---|---|
| Rate limit | 500 запросов в час с одного IP |
| Макс. новостей за запрос | 100 |
| Макс. размер загружаемого файла | 100 МБ |
| Макс. размер постера (по URL) | 5 МБ |
| Формат данных | JSON UTF-8 |
| Протокол | HTTP / HTTPS POST (GET для test) |