• Почему не парсится фрагмент сайта?

    @maxsharun Автор вопроса
    $return['chars'] =array();
    			if(preg_match_all('/<li class="b-properties__item">[^\w]+<span class="b-properties__label">[^\w]+<span>(.*?)<\/span>[^\w]+<\/span>[^\w]+<span class="b-properties__value">(.*?)<\/span>[^\w]+<\/li>/im', $out, $chars))
    			{
    				$return['charnames'] = $chars[1];
    				$return['charvals'] = $chars[2];
    			}
  • Почему не парсится фрагмент сайта?

    @maxsharun Автор вопроса
    Решение:
    $return['chars'] =array();
    			if(preg_match_all('/<li class="b-properties__item">[^\w]+<span class="b-properties__label">[^\w]+<span>(.*?)<\/span>[^\w]+<\/span>[^\w]+<span class="b-properties__value">(.*?)<\/span>[^\w]+<\/li>/im', $out, $chars))
    			{
    				$return['charnames'] = $chars[1];
    				$return['charvals'] = $chars[2];
    			}


    Ребята из Сима-ленд, не меняйте верстку специально )) Мой заказчик трудится над тем, чтобы продавать больше вашей продукции
  • Почему не парсится фрагмент сайта?

    @maxsharun Автор вопроса
    AaAAxzz, Увидел. Открыл мой $out. Интересно.... Спасибо
  • Почему не парсится фрагмент сайта?

    @maxsharun Автор вопроса
    AaAAxzz, view-source:https://www.sima-land.ru/2742033/nabor-bumagi-dlya...

    Что-то совсем не могу найти указанной разметки ((
  • Почему не парсится фрагмент сайта?

    @maxsharun Автор вопроса
    Ну, это присутствует на сайте доноре - участок текста, который надо найти и спарсить содержимое данного тега.
  • Почему не открывается страница именно в мобильном браузере Яндекс?

    @maxsharun Автор вопроса
    Шохрух Шаймардонов, С двух устройств. В итоге загрузилась страница. Мне подсказали, что может быть бесконечный цикл, но я просмотрел свой нехитрый код, не обнаружил. Данные подгружаются, всё конечно, в консоли отображаются все подгруженные объекты синхронным способом и асинхронным....
  • Как разместить пост в группе Одноклассники через API, c помощью php?

    @maxsharun
    Максим, здравствуйте,

    Я начал разрабатывать приложение для автопостинга. И на примере функции получения списка альбомов столкнулся с ошибкой генерации подписи (SIG). Подробно я описал это здесь же на Тостере Как сделать правильный SIG в API OK.RU?. Может, Вы подскажете, что не так с моей функцией? Бьюсь уже несколько дней.
  • Как сделать правильный SIG в API OK.RU?

    @maxsharun Автор вопроса
    Вот, как я пытался создавать SIG

    $sig = strtolower(
    				md5(
    				$paramsStr
    				. md5(
    				$userok->access_token
    				.$this->params['session_secret_key']
    				)
    				)
    				);
    			
    			
    			$sig = strtolower(
    				md5(
    			$paramsStr
    			.$this->params['session_secret_key']
    			)
    			);
  • Как сделать правильный SIG в API OK.RU?

    @maxsharun Автор вопроса
    maxsharun, Со 103 разобрался. Вот ошибка:
    $userok-access_token;
    А нужно $userok->access_token;

    Поэтому актуальной остается 104 ошика
  • Как сделать правильный SIG в API OK.RU?

    @maxsharun Автор вопроса
    Чуть переделал:

    protected $apiUrl = 'https://api.ok.ru/fb.do?';
    		
    		public function getalbums( Request $request ) {
    			
    			$userok = Userok::where('useroks.user_id', '=', $request->user_id)->first();
    
    			$paramsArray = array(
    				'application_key' => $this->params['application_key'],
    				'method' => 'photos.getAlbums',
    				'uid' => $userok->ok_id
    			);
    			ksort($paramsArray);
    			
    			foreach($paramsArray as $k=>$v) {
    				$paramsStr .= $k . "=" . $v;
    			}
    			$sig = strtolower(
    				md5(
    					$paramsStr
    					. md5(
    						$userok-access_token
    						. $this->connectionData['client_secret']
    					)
    				)
    			);
    			$paramsArray['access_token'] = $userok-access_token;
    			$paramsArray['sig'] = $sig;
    			
    			return $this->sendRequest(
    				$this->apiUrl,
    				$paramsArray,
    				'POST'
    			);
    			
    			print_r($paramsArray);
    		}
    		
    		
    		
    	
    		
    		
    		protected function sendRequest($url = '', $params = array(), $method = 'POST') {
    			if(is_array($params)) {
    				$params = http_build_query($params);
    			}
    			$ch = curl_init();
    			if($method == 'GET') {
    				$url .= $params;
    			} else if($method == 'POST') {
    				curl_setopt($ch, CURLOPT_POST, 1);
    				curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    			}
    			curl_setopt($ch, CURLOPT_URL, $url);
    			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    			$result = curl_exec($ch);
    			curl_close($ch);
    			return json_decode($result, true);
    		}


    Теперь 103 ошибка

    {"error_code":103,"error_msg":"PARAM_SESSION_KEY : Invalid session key","error_data":null}
  • Как правильно загружать картинки через VK API на PHP?

    @maxsharun
    Евгений, Понял. Я тут на хабре нашел одну статью. Можно, по идее и не со своего сервера фото отправлять. Вот ссылка на статью.

    Вот, как я чуть изменил классы:
    class oFileHelper extends Controller
    	{
    		//
    		
    		private $name;
    		private $mime;
    		private $content;
    		
    		public function __construct($name, $mime=null, $content=null)
    		{
    			// Проверяем, если $content=null, значит в переменной $name - путь к файлу
    			if(is_null($content))
    			{
    				// Получаем информацию по файлу (путь, имя и расширение файла)
    				$info = pathinfo($name);
    				// проверяем содержится ли в строке имя файла и можно ли прочитать файл
    				if(!empty($info['basename']) && is_readable($name))
    				{
    					$this->name = $info['basename'];
    					// Определяем MIME тип файла
    					$this->mime = mime_content_type($name);
    					// Загружаем файл
    					$content = file_get_contents($name);
    					// Проверяем успешно ли был загружен файл
    					if($content!==false) $this->content = $content;
    					else throw new Exception('Don`t get content - "'.$name.'"');
    				} else throw new Exception('Error param');
    			} else
    			{
    				// сохраняем имя файла
    				$this->name = $name;
    				// Если не был передан тип MIME пытаемся сами его определить
    				if(is_null($mime)) $mime = mime_content_type($name);
    				// Сохраняем тип MIME файла
    				$this->mime = $mime;
    				// Сохраняем в свойстве класса содержимое файла
    				$this->content = $content;
    			};
    		}
    		
    		// Метод возвращает имя файла
    		public function Name() { return $this->name; }
    		
    		// Метод возвращает тип MIME
    		public function Mime() { return $this->mime; }
    		
    		// Метод возвращает содержимое файла
    		public function Content() { return $this->content; }
    	}


    class BodyPost extends Controller
    	{
    		//
    		
    			//Метод формирования части составного запроса
    			public static function PartPost($name, $val)
    			{
    				$body = 'Content-Disposition: form-data; name="' . $name . '"';
    				// Проверяем передан ли класс oFile
    				if($val instanceof oFile)
    				{
    					// Извлекаем имя файла
    					$file = $val->Name();
    					// Извлекаем MIME тип файла
    					$mime = $val->Mime();
    					// Извлекаем содержимое файла
    					$cont = $val->Content();
    					
    					$body .= '; filename="' . $file . '"' . "\r\n";
    					$body .= 'Content-Type: ' . $mime ."\r\n\r\n";
    					$body .= $cont."\r\n";
    				} else $body .= "\r\n\r\n".urlencode($val)."\r\n";
    				return $body;
    			}
    			
    			// Метод формирующий тело POST запроса из переданного массива
    			public static function Get(array $post, $delimiter='-------------0123456789')
    			{
    				if(is_array($post) && !empty($post))
    				{
    					$bool = false;
    					// Проверяем есть ли среди элементов массива файл
    					foreach($post as $val) if($val instanceof oFile) {$bool = true; break; };
    					if($bool)
    					{
    						$ret = '';
    						// Формируем из каждого элемента массива, составное тело POST запроса
    						foreach($post as $name=>$val)
    						$ret .= '--' . $delimiter. "\r\n". self::PartPost($name, $val);
    						$ret .= "--" . $delimiter . "--\r\n";
    					} else $ret = http_build_query($post);
    				} else throw new \Exception('Error input param!');
    				return $ret;
    			}
    			
    		}


    Но при вызове этой функции получаю также пустой photos_list (хотя сервер приходит, хеш тоже)

    function get_curl_mp($url, $file) {
    			//use App\Http\Controllers\Apps\Helpers\oFileHelper;
    			//use App\Http\Controllers\Apps\Helpers\BodyPost;
    			
    			// Генерируем уникальную строку для разделения частей POST запроса
    			$delimiter = '-------------'.uniqid();
    			
    			// Формируем объект oFile содержащий файл
    			$file = new Apps\Helpers\oFileHelper($file, 'image/jpeg', 'Content file');
    			
    			// Формируем тело POST запроса
    			$post =  Apps\Helpers\BodyPost::Get(array('file1'=> $file), $delimiter);
    			
    			// Инициализируем  CURL
    			$ch = curl_init();
    			
    			// Указываем на какой ресурс передаем файл
    			curl_setopt($ch, CURLOPT_URL, $url);
    			// Указываем, что будет осуществляться POST запрос
    			curl_setopt($ch, CURLOPT_POST, 1);
    			// Передаем тело POST запроса
    			curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    			
    			/* Указываем дополнительные данные для заголовка:
    				Content-Type - тип содержимого, 
    				boundary - разделитель и 
    			Content-Length - длина тела сообщения */
    			curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; boundary=' . $delimiter,
    			'Content-Length: ' . strlen($post)));
    			
    			// Отправляем POST запрос на удаленный Web сервер
    			return curl_exec($ch);
    			
    		}


    Не могу понять, где я накосячил. Значение $file - произвольный URL jpg-картинки из сети. Например, https://sun9-35.userapi.com/c850416/v850416909/cc9...
  • Как правильно загружать картинки через VK API на PHP?

    @maxsharun
    Евгений, Приветствую, спасибо за скрипт, отправка фото в альбомы работает. Я его чуть расширил и добавил метод photoSave(), чтобы сохранять в альбом пользователя.
    Вот код, он не сложный, Вы всю работу сделали:

    public function photosSave($params)
        {
            return $this->request('photos.save', $params);
        }


    Вызывается так:

    $save = $vk->photosSave([
    				//'user_id' => $user_id,
    				'photos_list' => $upload['photos_list'],
    				'server' => $upload['server'],
    				'album_id'=>$album_id,
    				'hash' => $upload['hash']
    				]
    				);


    Но, вот, где я запнулся. Мнt нужно отправить несколько файлов. Вот функция, которую я дописал в Ваш класс:
    public function uploadFiles($url, $files)
        {
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_POST, true);
    		
    		$sendfiles = array();
    		$sendfilesalt = array();
    		
    		for( $i = 0; $i < count($files); $i++ ) {
    			$sendfiles[] = ['file'.($i+1) => new \CURLFile($file[$i]) ];
    			$sendfilesalt[] = ['file'.($i+1) => "@$file[$i]"];
    		}
    		
            if (class_exists('\CURLFile')) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, $sendfiles);
            } else {
                curl_setopt($ch, CURLOPT_POSTFIELDS, $sendfilesalt);
            }
    		
    
            $data = curl_exec($ch);
            curl_close($ch);
            return json_decode($data, true);
        }


    Вот, так я ее вызываю:
    $images[0] = '/var/www/broker/storage/app/public/cart/mg3s1YXErNg8L2i1bQ4bPJsrsoESwf7GWFhcZcvN.jpeg';
    			$images[1] = '/var/www/broker/storage/app/public/cart/x96X8d8G8ocE9xsmKfr3Xt5vA2NulY4v92PqTdbk.jpeg';
    $upload = $vk->uploadFiles($uploadurl, $images);


    Но ответ приходит с пустым photos_list:
    Array ( [server] => 850620 [photos_list] => [] [aid] => 268954506 [hash] => bb59d9dcfd33a4b6a8b3f45b82983598 )


    Я еще не совсем опытный разработчик. Подскажите решение. Спасибо.
  • Ошибка 28 VK API Application authorization failed: refresh service token?

    @maxsharun Автор вопроса
    Сейчас не перед компьютером, нет возможности проверить . Я кажется, увидел разницу. Это предлагаемая тобой ссылка с редиректом:

    https://oauth.vk.com/authorize?client_id=*&display=page&redirect_uri=https://api.vk.com/blank.html&scope=offline,wall,photos&response_type=token&v=5.101&state=


    Это та, что я использовал:
    https://oauth.vk.com/authorize?client_id=ID_ПРИЛОЖЕНИЯ&display=page
    &redirect_uri=https://api.vk.com/blank.html&scope=offline,wall,photos
    &response_type=code


    Разница в response_type. В итоге мне приходит ссылка сразу с access_token, который я и использую.
  • Ошибка 28 VK API Application authorization failed: refresh service token?

    @maxsharun Автор вопроса
    Антон Шаманов, В том-то и прикол, что так не сработало. Он редиректит, причем moysite/vkauth?code, по этому коду через curl получаю acess_token, и он не работает. А полученный вручную работает
  • Ошибка 28 VK API Application authorization failed: refresh service token?

    @maxsharun Автор вопроса
    Антон Шаманов, Вот, этот момент немного не понял снова.
    Давай по порядку
    1. Пользователь нажимает на ссылку
    https://oauth.vk.com/authorize?client_id=ID_ПРИЛОЖЕНИЯ&display=page
    &redirect_uri=https://api.vk.com/blank.html&scope=offline,wall,photos
    &response_type=code

    2. Попадает на страницу в VK
    https://api.vk.com/blank.html#code=577ccf6d547758816e8

    Соответственно, как мне выдернуть этот CODE на автомате. Ведь это на другом сайте.
  • Ошибка 28 VK API Application authorization failed: refresh service token?

    @maxsharun Автор вопроса
    Антон Шаманов, А здесь поподробнее, пожалуйста. Я с JS только начал работать.

    url - это наша первая ссылка?
    https://oauth.vk.com/authorize?client_id=ID_ПРИЛОЖЕНИЯ&display=page
    &redirect_uri=https://api.vk.com/blank.html&scope=offline,wall,photos
    &response_type=code


    Честно, не понял
  • Ошибка 28 VK API Application authorization failed: refresh service token?

    @maxsharun Автор вопроса
    Антон Шаманов, Попробую. Мне надо получать данные на автомате. Короче, сейчас поюзаю
  • Ошибка 28 VK API Application authorization failed: refresh service token?

    @maxsharun Автор вопроса
    Антон Шаманов,
    Собственно, эта функция получает access_token и мне его выводит:

    public function vkauth(Request $request) {
    			$data['user'] = Auth::user();
    			$data['session_id'] = $request->session()->all()['_token'];
    			if( !empty($data['user'] ) ) {
    				$data['user']->token = User::find($data['user']->id)->access_token->token;			
    				$data['api-string'] = 'data-ownerid='.$data['user']->id.' data-userid='.$data['user']->id.' data-token='.$data['user']->token.' data-stoken='.$data['session_id'];
    				} else {
    				$data['api-string'] = 'data-stoken='.$data['session_id'];
    			}
    			
    			$appID = '7132598';
    			$secretKEY = 'Секретный код';
    			if ( !empty($request->code) ) {
    				$code = $request->code;
    				$sURL = "https://oauth.vk.com/access_token?client_id={$appID}&client_secret={$secretKEY}&v=5.101&grant_type=client_credentials&scope=offline,photos,wall,audio,video,friends";
    				$oResponce = json_decode($this->get_curl($sURL));
    				
    				$check = UserVk::where('user_id', '=', $data['user']->id)->get();
    				
    				if ( count($check) == 0 ) {
    					$UserVk = new UserVk;
    					$UserVk->user_id = $data['user']->id;
    					$UserVk->access_token = $oResponce->access_token;
    					$UserVk->save();
    					} else {
    					
    					$UserVk = UserVk::find($check[0]->id);
    					$UserVk->access_token = $oResponce->access_token;
    					$UserVk->save();
    					
    				}
    				print_r($oResponce);
    				//return redirect('/collections');
    			}
    		}