[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не дня без гавнокода
Эли4ка
На ночь глядя, чтобы икалось лучше ночью, выкладываю свой класс. Критикуем безжалостно. Что умеет, спрашиваете вы?-да файлы с инстаграма качать да и все. Стойте, ну куда же вы сразу пошли :lol: ах, вы за ведрами :lol:
//example url
$url = "https://www.instagram.com/p/BimQ4UUBOro/?utm_source=ig_share_sheet&igshid=t5gf4kno7ffm";
//other url
//$url = "https://www.instagram.com/p/BmLgAi8HnhB/?taken-by=_agilka";
//https://www.instagram.com/p/BmLgAi8HnhB/?__a=1

try {
$m = new Instagram($url);
$o = $m->getJson();
//получаем количество нод
$count = $m->countNode();
//итератор
$x = 0;
//устанавливаем путь откуда забирать информацию
$m->setPath($x);
//получаем имя этого пути,если требуется получить что-то специфическое
//$path = $m->getPath();
//устанавливаем диапазон скачиваемых медиафалов

$m->setRange("1,2");
//получаем основную информацию о файле
$commonInfo = $m->commonInfo();
//пробуем создать директорию
$m->createDir("q/",$commonInfo["username"]);
//обрабатываем ноды в цикле
while($x<$count){
//получаем информацию о медиафайле из ноды
$fileInfo = $m->getInfoFile($x);
//скачиваем файл и выводим его размер
echo $m->download($fileInfo["url"],"q/".$commonInfo["username"]."/",$commonInfo["username"]."_".time().".".$m->getExt($fileInfo["url"])) . "<br>";
//печатаем о нем всю нужную нам информацию
print_r($fileInfo);
$x++;
}
}
catch (NetworkFailException $e) {
echo 'Выброшено исключение: ', $e->errorMessage(true), "\n";
}catch (InstagramParseErrorException $e) {
echo 'Выброшено исключение1: ', $e->errorMessage(true), "\n";
} catch (DownloadException $e) {
echo 'Выброшено исключение: ', $e->errorMessage(true), "\n";
} catch (Exception $e) {
echo 'Выброшено исключение: ', $e->getMessage(), "\n";
}

/**
* InstagramParseErrorException class file.
* Данный класс предназначен для вывода ошибок связанных с невалидными инстаграм-ссылками.
*/

class InstagramParseErrorException extends Exception {
/**
* Возвращает ошибку в виде строки или JSON
*
@param boolean $responseType В каком виде возвращаем ответ об ошибке
*
*
@return string
*/

public function errorMessage($responseType = false) {
$message = $this->message;
$response = array(
"status" => "0",
"error" => $message
);
return $responseType ? json_encode( $response ) : "status:0 ".$message;
}
}


/**
* NetworkFailException class file.
* Данный класс предназначен для вывода сетевых ошибок.
*/

class NetworkFailException extends Exception {
/**
* Возвращает ошибку в виде строки или JSON
*
@param boolean $responseType В каком виде возвращаем ответ об ошибке
*
*
@return string
*/

public function errorMessage($responseType = false) {
$message = $this->message;
$response = array(
"status" => "0",
"error" => $message
);
return $responseType ? json_encode( $response ) : "status:0 ".$message;
}
}


/**
* DownloadException class file.
* Данный класс предназначен для вывода ошибок связанных с файлом.
* 1. Файла не существует
* 2. Ошибка открытия файла
*/

class DownloadException extends Exception {
/**
* Возвращает ошибку в виде строки или JSON
*
@param boolean $responseType В каком виде возвращаем ответ об ошибке
*
*
@return string
*/

public function errorMessage($responseType = false) {
$message = $this->message;
$response = array(
"status" => "0",
"msg" => $message
);
return $responseType ? json_encode( $response ) : "status:0 ".$message;
}
}


/**
* Instagram Class
* Данный класс предназначен для скачивания медиаматерилов из Instagram
* по переданной ссылке
*/

class Instagram {

/**
* Хранит полученный JSON
*
@var string
*/

protected $_json;

/**
* Хранит тело полученного JSON
*
@var string
*/

protected $_mainJson;

/**
* Хранит чистую Instagram-ссылку на медиафайл
*
@var string
*/

protected $_clear_url;

/**
* Хранит прямую ссылку для получения JSON-твета о медиафайле
*
@var string
*/

protected $_json_url;

/**
* Хранит диапазон разрешенных скачиваемых фотографий
*
@var array
*/

protected $_range = array();

/**
* Хранит количество нод в ссылке на медиафайл
*
@var string
*/

protected $_count;

/**
* Хранит текущий путь в ноде
*
@var string
*/

protected $_path;

/**
* Конструктор
* Получает любую ссылку, если она валидна, то очищается от мусора и далее получает JSON-ответ
*
*
@param string $url Подаем урл такой,какой есть
*
@throws InstagramParseErrorException
*
@throws NetworkFailException
*
@return void
*/

public function __construct($url) {
$this->getTrueUrls($url);
$detect_url = $this->detectUrl($this->getClearUrl());
if(!$detect_url){
throw new InstagramParseErrorException("Ссылка не является корректной");
}
$json = @file_get_contents($this->getJsonUrl());
if (!$json) {
throw new NetworkFailException('Страница недоступна');
}
$this->_json = json_decode($json);
$this->_mainJson = $this->_json->graphql->shortcode_media;
}

/**
* Возвращает тело JSON-ответа
*
*
@return string
*/

public function getJson() {
return $this->_mainJson;
}

/*
* Возвращает подготовленные для дальнейшей работы с url
*
* @param string $url
*
* @return void
*/

public function getTrueUrls($url) {
$chunk = explode("?", $url);
$this->_clear_url = $chunk[0];
$this->_json_url = $chunk[0]. "?__a=1";
}

/*
* Возвращает чистый урл
*
* @return string
*/

public function getClearUrl(){
return $this->_clear_url;
}

/**
* Возвращает прямую ссылку на JSON-ответ медиафайла
*
*
@return string
*/

public function getJsonUrl(){
return $this->_json_url;
}

/**
* Проверят ссылку на валидность
*
*
@param string $url
*
*
@return boolean
*/

public function detectUrl($url){
if(preg_match("/^(?:(?:http(s|)\:\/\/|)(?:www\.)|)instagram.com\/p\/[a-zA-Z0-9\._-]{9,}(?:(?:\/\?taken\-by=[a-zA-Z0-9\._-]{1,}|\/)|)$/is", $url)) {
return true;
}
else {
return false;
}
}

/*
* Возвращает тип материала
*
* @return string
*/

public function getTypename() {
return $this->_mainJson->__typename;
}

/*
* Устанавливает диапазон скачиваемых материалов
*
* @param string $range Строка с цифрами через запятую
*
* @return void
*/

public function setRange($range = false){
$this->_range = !empty($range) ? array_merge(explode(',', $range )) : array_merge(explode(',', "0,1,2,3,4,5,6,7,8,9,10" ));
}

/**
* Возвращает диапазон скачиваемых материалов
*
*
@return void
*/

public function getRange(){
return $this->_range;
}

/*
* Проверяет, есть ли такие свойства объекта или нет
* @
todo Сделать поддержку вложенных св-в
*
* @param string $properties Свойства переданные через запятую в строке
*
* @return array
*/

public function check($properties){
$resultArray = array();
$arrayProperties = explode(",", $properties);
foreach($arrayProperties as $propertie){
if(isset($this->_mainJson->{$propertie})){
$resultArray[$propertie] = true;
}
else{
$resultArray[$propertie] = false;
}
}

return $resultArray;
}

/**
* Подсчет количетсво нод в медиафайле
*
*
@return int
*/

public function countNode() {
$this->_count = isset($this->_mainJson->edge_sidecar_to_children->edges) ? count($this->_mainJson->edge_sidecar_to_children->edges) : 1;
return $this->_count;
}

/**
* Устанавливает текущий путь в ноде
*
*
@param int $iterator
*
*
@return void
*/

public function setPath($iterator) {
$this->_path = $this->_count > 1 ? $this->_mainJson->edge_sidecar_to_children->edges[isset($iterator) ? $iterator : 0]->node : $this->_mainJson;
}

/**
* Возвращает текущий указатель пути
*
*
@return object
*/

public function getPath() {
return $this->_path;
}

/**
* Возвращает общую и достаточную информацию о медиафайле
*
*
@return array
*/

public function commonInfo() {
return array("location" => isset($this->_mainJson->location->name) ? $this->_mainJson->location->name : "", "username" => $this->_mainJson->owner->username);
}

/**
* Создает директорию для загрузки файлов
*
*
@param string $path
*
@param string $dirName
*
@throws Exception
*
*
@return void
*/

public function createDir($path,$dirName){
if(!file_exists($path.$dirName)){
if (!mkdir($path.$dirName)) {
throw new Exception('Не удалось создать директорию');
}
file_put_contents($path.$dirName."/.htaccess","Options -Indexes");
}
}


/**
* Получает информацию о медиафайле из ноды
*
*
@param int $number
*
*
@return array
*/

public function getInfoFile($number) {
$this->setPath($number);
$url = (!empty($this->_path->video_url)) ? $this->_path->video_url : $this->_path->display_url;
//инста к видео добавляет кэширующую строку.
$pr_url = explode("?", $url);

return array("shortcode" => (!empty($this->_path->shortcode)) ? $this->_path->shortcode : '',
"url" => $pr_url[0],
"dimensions_h" =>$this->_path->dimensions->height,
"dimensions_w" =>$this->_path->dimensions->width
);
}

/**
* Скачивает файл и возвращает размер файла
*
*
@param string $fileName
*
@param string $dir
*
@param string $newName
*
@throws DownloadException
*
*
@retrn int
*/

public function download($fileName, $dir, $newName) {
$fp = fopen($fileName, "r");
if ( !$fp ) {
throw new DownloadException("Невозможно открыть файл ".$fileName);
}
$str = stream_get_contents($fp);
if ( !$str ) {
throw new DownloadException('Файл пуст.');
}
$path = $dir.$newName;
file_put_contents($path,$str);
fclose($fp);
return round(filesize($path)/1024,2);
}

/**
* Получает расширение файла
*
*
@param string $fileName
*
*
@return string
*/

public function getExt($fileName) {
return substr(strrchr($fileName, '.'), 1);
}

/**
* Очищает все переменные
*
*
@return void
*/

public function reset() {
$this->_clear_url = '';
$this->_count = 0;
$this->_json = '';
$this->_json_url = '';
$this->_mainJson = '';
$this->_path = '';
$this->_range = array();
}
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.