DLE News API v4.0

Полноценный REST API для управления новостями DLE. Добавление, редактирование, удаление новостей, загрузка файлов и постеров, проверка дубликатов — всё через curl.

JSON UTF-8
DLE 13.x — 18.1+
PHP / MariaDB

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 https://site.com/api.php
bash
# Простой 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"}'
200 OK — Ответ
{
  "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).

POST action: add_news
bash
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 → «Публикация материалов».
POST action: add_news · approve: 0
bash
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

ПолеТипУмолчаниеОписание
approveint10 — не опубликована, 1 — опубликована
allow_commentsint1Разрешить комментарии
allow_mainint1Показывать на главной
allow_ratingint1Разрешить голосование
fixedint0Закреплённая новость
user_idint1ID пользователя-автора
categorystring"1"ID категории
authorstring"admin"Имя автора
alt_namestringавтоЧПУ-алиас (генерируется из заголовка)
tagsstring""Теги через запятую
keywordsstring""Meta keywords
descriptionstring""Meta description
metatitlestring""Meta title
xfieldsobject{}Дополнительные поля DLE

04 Новость с постером и xfields

Постер скачивается автоматически по URL из xfields.poster. Домен должен быть в белом списке. Изображение конвертируется в WebP 223×335 px.

POST action: add_news · xfields.poster: URL
bash
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": "Дублированный"
    }
  }'
200 OK — Ответ с информацией о постере
{
  "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.techKP API
st.kp.yandex.netКинопоиск
image.openmoviedb.comOpenMovieDB
image.tmdb.orgTMDB
media.themoviedb.orgTMDB

Настройки обработки постера (в api.php)

КонстантаЗначениеОписание
POSTER_FORMATwebpФормат: jpg, png, webp, original
POSTER_QUALITY85Качество (1–100)
POSTER_MAX_WIDTH223Макс. ширина px (0 = без ресайза)
POSTER_MAX_HEIGHT335Макс. высота px (0 = без ресайза)

05 Загрузка файла

📎
Загрузка файлов использует multipart/form-data (флаг -F), а не JSON!
FILE action: upload_file · multipart/form-data
bash
curl -X POST https://site.com/api.php \
  -F "action=upload_file" \
  -F "api_key=ВАШ_КЛЮЧ" \
  -F "file=@/path/to/archive.zip"
200 OK — Ответ
{
  "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

🛡️
PHP-файлы, исполняемые файлы и файлы с опасным содержимым автоматически блокируются. Максимальный размер: 100 МБ.

06 Загрузка файла + привязка к новости

Добавьте news_id и description для привязки файла к существующей новости.

FILE action: upload_file · news_id
bash
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 принимает один файл за запрос. Отправляйте последовательно:

bash — несколько файлов
# Файл 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 Обновление новости

Обновляет указанные поля. Не переданные поля остаются без изменений.

POST action: update_news
bash
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": 1
bash — публикация через API
curl -X POST https://site.com/api.php \
  -H "Content-Type: application/json" \
  -d '{
    "action": "update_news",
    "api_key": "ВАШ_КЛЮЧ",
    "news_id": 156,
    "approve": 1
  }'

Обновление xfields + постер

bash
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)
categoryID категории
authorИмя автора
keywordsMeta keywords
descriptionMeta description
metatitleMeta 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.

POST action: delete_news
bash
curl -X POST https://site.com/api.php \
  -H "Content-Type: application/json" \
  -d '{
    "action": "delete_news",
    "api_key": "ВАШ_КЛЮЧ",
    "news_id": 156
  }'

09 Список новостей

Без аутентификации. Пагинация, фильтрация по категории, сортировка.

POST action: get_news
bash
# Базовый запрос — 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}'

Параметры

ПараметрТипУмолчаниеОписание
limitint10Количество (макс. 100)
offsetint0Смещение для пагинации
categoryint0Фильтр по ID категории (0 = все)
approved_onlyint11 — только опубликованные
order_bystring"date"id, date, title, news_read, rating
order_directionstring"DESC"ASC или DESC

10 Новость по ID

Без аутентификации. Возвращает все поля включая xfields (как объект). Увеличивает счётчик просмотров.

POST action: get_news_by_id
bash
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.

POST action: search_news
bash
curl -X POST https://site.com/api.php \
  -H "Content-Type: application/json" \
  -d '{
    "action": "search_news",
    "query": "Нолан",
    "limit": 10,
    "offset": 0
  }'

12 Получение категорий

Без аутентификации.

POST action: get_categories
bash
curl -X POST https://site.com/api.php \
  -H "Content-Type: application/json" \
  -d '{"action": "get_categories"}'
200 OK
{
  "success": true,
  "data": {
    "categories": [
      {"id": 1, "name": "Фильмы", "alt_name": "films"},
      {"id": 2, "name": "Сериалы", "alt_name": "serials"}
    ]
  }
}

13 Добавление категории

POST action: add_category
bash
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 Статистика

POST action: get_stats
bash
curl -X POST https://site.com/api.php \
  -H "Content-Type: application/json" \
  -d '{"action": "get_stats", "api_key": "ВАШ_КЛЮЧ"}'
200 OK
{
  "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, категории, просмотры.

POST action: get_news_status
bash
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.

POST action: check_duplicate
bash
curl -X POST https://site.com/api.php \
  -H "Content-Type: application/json" \
  -d '{
    "action": "check_duplicate",
    "api_key": "ВАШ_КЛЮЧ",
    "kinopoisk_id": "447301"
  }'
200 OK — фильм найден
{
  "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 .
🎉
Готово! Новость ожидает в админке DLE → Публикация материалов → выбрать → Опубликовать.

ERR Коды ошибок

200Успешный запрос
400Некорректные данные / пустые поля
401Ошибка аутентификации
403Файл запрещён (опасный)
404Новость не найдена
429Превышен лимит запросов
500Внутренняя ошибка / БД

Формат ошибки

400 Bad Request
{
  "success": false,
  "error": "Поле 'title' обязательно",
  "code": 400,
  "timestamp": 1737456000,
  "api_version": "4.0"
}

Формат успеха

200 OK
{
  "success": true,
  "data": { /* ... */ },
  "message": "Описание (опционально)",
  "timestamp": 1737456000,
  "api_version": "4.0"
}

Лимиты

ПараметрЗначение
Rate limit500 запросов в час с одного IP
Макс. новостей за запрос100
Макс. размер загружаемого файла100 МБ
Макс. размер постера (по URL)5 МБ
Формат данныхJSON UTF-8
ПротоколHTTP / HTTPS POST (GET для test)