MaHarder
Модератор
SkripTers TEAM
Кодеры
OLD SkripTers
- Регистрация
- 17 Дек 2019
- Сообщения
- 1,443
- Реакции
- 811
PHP:
<?php
/**
* @author Maxim Harder <dev@devcraft.club>
* @description Скрипт по проставлению изображений в базу данных с загрузкой и настройкой, согласно установленным параметрам в доп. поле
*/
/**
* Подключаем глобальные переменные
* $db - Подключение к базе данных
* $config - Конфигурация системы
* $user_group - Массив с информаций о группах пользователя
* $member_id - Массив информации о текущем пользователе
*/
global $db, $config, $user_group, $member_id;
/**
* Устанавливаем глобальные значения
*/
error_reporting(E_ALL^E_WARNING^E_DEPRECATED^E_NOTICE);
ini_set('error_reporting', E_ALL^E_WARNING^E_DEPRECATED^E_NOTICE);
define('DATALIFEENGINE', true);
define('ROOT_DIR', __DIR__);
define('ENGINE_DIR', ROOT_DIR . '/engine');
/**
* Подключаем класс плагинов
*/
require_once(ENGINE_DIR . '/classes/plugins.class.php');
/**
* Подключаем функции сайта
*/
require_once(DLEPlugins::Check(ENGINE_DIR . '/modules/functions.php'));
/**
* Подключаем класс загрузки файлов
*/
include_once(DLEPlugins::Check(ENGINE_DIR . '/classes/uploads/upload.class.php'));
/**
* Подключаем API внутренних функций
* Упрощаем работу
*/
include('engine/api/api.class.php');
/**
* Оформляем текстовой вид параметров доп. поля в массив
*
* @param $xfname Название доп. поля на латинском
* @return false|string[]
*/
function xfparamload($xfname) {
$path = ENGINE_DIR . '/data/xfields.txt';
$filecontents = file($path);
if (!is_array($filecontents)) {
return false;
}
foreach ($filecontents as $name => $value) {
$filecontents[$name] = explode("|", trim($value));
if ($filecontents[$name][0] == $xfname) return $filecontents[$name];
}
return false;
}
/**
* Функция ыводит ответ API по запросу постеров
*
* @param $id
* @return mixed
*/
function kpApi($id) {
global $apikey;
$headers = [];
$headers[] = "X-API-KEY: {$apikey}";
$headers[] = 'Content-Type: application/json';
$url = "https://kinopoiskapiunofficial.tech/api/v2.2/films/{$id}/images?type=POSTER&page=1";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$resp = curl_exec($curl);
curl_close($curl);
return json_decode($resp, true);
}
/**
* Функция проставления и загрузки постера в новость
*
* @param $news_id
* @return void
*/
function setPoster($news_id) {
global $area, $t_size, $t_seite, $make_thumb, $make_watermark, $m_size, $m_seite, $make_medium, $db, $member_id, $dle_api, $xfkpid, $xfposter;
/**
* Автор загрузки постера, текущий авторизованный пользователь
*/
$author = $db->safesql($member_id['name']);
/**
* Получаем данные новости
*/
$post = $dle_api->load_table(PREFIX . '_post', 'title, alt_name, xfields', "id = {$news_id}");
/**
* Достаём данные о доп. полях новости
*/
$xfieldsdata = xfieldsdataload($post['xfields']);
/**
* Получаем ID кинопоиска
*/
$kp_id = $xfieldsdata[$xfkpid];
/**
* Если ID присутствует, то функция продолжит работу, в противном случае - на этом всё
*/
if(!empty($kp_id)) {
/**
* Получаем данные с постерами
*/
$poster_data = kpApi($kp_id);
/**
* Берём первое изображение и проверяем на целостность переменной
* Если переменная пустая, то функция прекращает работу
*/
$poster = $poster_data['items'][0]['imageUrl'];
if (isset($poster)) {
/**
* Получаем данные изображения
*/
$poster_data = file_get_contents($poster);
/**
* Преобразуем название новости в название файла с окончанием .jpg
*/
$poster_title = totranslit(stripslashes( $post['title'] ), true, false) . '.jpg';
/**
* Путь постера на сервере
*/
$new_poster = ROOT_DIR . '/uploads/files/' . $poster_title;
/**
* Сохраняем изображение на сервер
*/
file_put_contents($new_poster, $poster_data);
/**
* Получаем мета-данные изображения
*/
$exif = exif_read_data($new_poster);
/**
* Имитируем загрузку файла через форму загрузки
*/
$_FILES['qqfile'] = [
'type' => $exif['MimeType'],
'name' => $exif['FileName'],
'tmp_name' => $new_poster,
'error' => 0,
'size' => $exif['FileSize']
];
/**
* Начинаем загрузку файла
*/
$uploader = new FileUploader($area, $news_id, $author, $t_size, $t_seite, $make_thumb, $make_watermark, $m_size, $m_seite, $make_medium);
$result = json_decode($uploader->FileUpload(), true);
/**
* Если при загрузке не было ошибок, то будем проставлять данные в базу данных
*/
if (!$result['error']) {
/**
* Новое значение для доп. поля постера / изображения
*/
$xfieldsdata[$xfposter] = $result['xfvalue'];
/**
* Оформляем массив, куда будут форматироваться доп. поля
*/
$new_xfields = [];
/**
* Сводим имя и значения вместе и заносим их в массив
*/
foreach($xfieldsdata as $n => $v) $new_xfields[] = "{$n}|{$v}";
/**
* Массив преобразуем в строку по феншую DLE
*/
$new_xfields = implode('||', $new_xfields);
/**
* Отправляем новые данные в базу данных
*/
$sql = "UPDATE " . PREFIX . "_post SET xfields = '{$new_xfields}' WHERE id = {$news_id}";
$db->query($sql);
echo "Новость #{$news_id} ({$post['title']}) обновлена<br>";
} else echo $result;
/**
* Удаляем временный файл
*/
@unlink($new_poster);
}
}
}
/**
* Вызываем класс DLE API в переменную
* Проставляем важные переменные
*/
$dle_api = new dle_api();
$dle_api->db = $db;
$dle_api->dle_config = $config;
/**
* Проверяем на целостность массива информации о группах
* При отсутствии - создаёт новый и сохраняет массив в кеш
*/
if(!$user_group) $user_group = get_vars( "usergroup" );
if( !$user_group ) {
$user_group = array ();
$us = $dle_api->load_table( USERPREFIX . "_usergroups", '*',1,true,0,0, 'id', 'asc');
foreach ( $us as $row) {
$user_group[$row['id']] = array ();
foreach ( $row as $key => $value ) {
$user_group[$row['id']][$key] = stripslashes($value);
}
}
set_vars( "usergroup", $user_group );
}
/**
* Проверяем на целостность массива информации о текущем пользователе
* При отсутствии - создаёт новый и сохраняет массив в кеш
*/
if (!$member_id) $member_id = get_vars( "member_id" );
if (!$member_id) {
if (!isset($_COOKIE['dle_user_id'])) die("Пройдите авторизацию на сайте!");
$member_id = $dle_api->load_table(USERPREFIX . '_users', '*', "user_id = {$_COOKIE['dle_user_id']}");
set_vars('member_id', $member_id);
}
/**
* Проверяем на целостность массива информации о языковых фразах
* При отсутствии - создаёт новый и сохраняет массив в кеш
*/
if (!$langs || !$langtranslit) {
$selected_language = $config['langs'];
if (isset($_COOKIE['selected_language'])) {
$_COOKIE['selected_language'] = trim(totranslit($_COOKIE['selected_language'], false, false));
if ($_COOKIE['selected_language'] != "" and @is_dir(ROOT_DIR . '/language/' . $_COOKIE['selected_language'])) {
$selected_language = $_COOKIE['selected_language'];
}
}
if (file_exists(DLEPlugins::Check(ROOT_DIR . '/language/' . $selected_language . '/website.lng'))) {
include_once(DLEPlugins::Check(ROOT_DIR . '/language/' . $selected_language . '/website.lng'));
}
}
/**
* Фильтруем введённые данные в URL
*/
$input_data = filter_input_array(INPUT_GET);
/**
* Параметр news_id
* Если нужно проставить изображение к определённой новости
*/
$news_id = (int)$input_data['news_id'] ?: 0;
/**
* Параметр area
* Тип поля
* Если не знаете для чего оно, то не трогайте и не добавляйте ничего
*/
$area = $input_data['area'] ? totranslit($input_data['area']) : "xfieldsimage";
/**
* Параметр image
* Название поля с изображением, куда будет проставляться новое изображение
*/
$xfposter = $input_data['image'] ? totranslit($input_data['image']) : "";
/**
* Параметр kpid
* Название поля с ID кинопоиска, откуда будет браться информация и по которому будет происходить запрос
*/
$xfkpid = $input_data['kpid'] ? totranslit($input_data['kpid']) : "";
/**
* Параметр api
* API ключ сервиса
*/
$apikey = $input_data['api'] ? totranslit($input_data['api']) : "";
if (empty($apikey)) die("В параметры URL добавьте параметр api и через = API неофициального API кинопоиска");
if (empty($xfkpid)) die("В параметры URL добавьте параметр kpid и через = укажите название поля с ID кинопоиска");
if (empty($xfposter)) die("В параметры URL добавьте параметр image и через = укажите название поля с изображением, которое будет обновляться");
/**
* Получаем параметры доп. поля с изображением
*/
$xfparam = xfparamload($xfposter);
if (!is_array($xfparam)) die("Создайте доп. поле {$xfposter}!");
/**
* Создаём конфигурацию
*/
$xfname = $xfparam[0];
$t_seite = (int)$config['t_seite'];
$m_seite = $t_seite;
$t_size = $xfparam[13];
$m_size = 0;
$config['max_up_side'] = $xfparam[9];
$config['max_up_size'] = $xfparam[10];
$config['min_up_side'] = $xfparam[22];
$make_watermark = (bool)$xfparam[11];
$make_thumb = (bool)$xfparam[12];
$make_medium = false;
$t_size = explode("x", $t_size);
if (count($t_size) == 2) {
$t_size = (int)$t_size[0] . "x" . (int)$t_size[1];
} else $t_size = (int)$t_size[0];
$m_size = explode("x", $m_size);
if (count($m_size) == 2) {
$m_size = (int)$m_size[0] . "x" . (int)$m_size[1];
} else $m_size = (int)$m_size[0];
/**
* Проставка новых изображений
* Если не указано определённое ID новости, то будет искать по всей базе данных
*/
if ($news_id === 0) {
$posts = $dle_api->load_table(PREFIX . '_post', '*', 1, true);
foreach ($posts as $p) {
setPoster($p['id']);
}
} else {
setPoster($news_id);
}
Написал функционал.
Инструкция:
- Создаём с любым названием файл в корне сайта и вставляем код выше в него.
- В браузере переходим по www.вашсайт.ру/файл.php?api=КЛЮЧ АПИ&image=НАЗВАНИЕ ПОЛЯ С ИЗОБРАЖЕНИЕМ&kpid=НАЗВАНИЕ ПОЛЯ С ID Кинопоиска
- Ждём