Установка аватара

голоса: 0

Контекст: реализую авторизацию на сайте с использованием аккаунта от стороннего сервиса. 

Задача: при регистрации пользователя подтягивать аватар с этого сервиса. 

Проблема:

Если указать url аватара со стороннего сервиса, то происходит что-то странное: http://joxi.ru/Rmzqo80cWVKD4r

Возможно, это из-за того, что там непрямая ссылка, а редирект. Но в любом случае, я решил загружать аватары к себе на сайт и указывать уже "локальную" ссылку.

Вопрос:

В каком виде нужно передавать картинку в uAPI методе [POST] Добавить материал (раздел Фотоальбомы)? (http://api.ucoz.net/ru/manual/photo/entry)

Пробовал так:

	$parametrs = array(		
		'oauth_consumer_key' => $GLOBALS['consumer_key'],
		'oauth_nonce' => md5(microtime().mt_rand()),
		'oauth_signature_method' => $GLOBALS['sig_method'],
		'oauth_timestamp' => $GLOBALS['timestamp'],
		'oauth_token' => $GLOBALS['oauth_token'],
		'oauth_version' => $GLOBALS['oauth_version'],
		'category' => '15',
		'photo' => @file('avatar.jpg')
	);

Ошибка:

{"error":{"msg":"Invalid signature","code":"INVALID_SIGNATURE"}}

Но все остальные параметры точно указаны правильно, потому что выше по коду выполняются другие запросы к API. Подскажите, как нужно загружать изображения через uAPI

Адрес сайта wowjp.net
Закрыто с пометкой: Все, нашлось решение. Проблема была в том, что использовался uAPImodule для ucoz PHP, а скрипт выполнялся на стороннем сервер. Спасибо за ответы!
| Автор: | Категория: PHP и API на uCoz
Закрыт | | Автор: Александр Слапогузов

Ответов: 1

голоса: +2
 
Лучший ответ

Для начала эту картинку нужно загрузить к себе на сервер, а потом уже передавать по uAPI. 

Допустим вы скопировали картинку к себе на сервер и она теперь лежит там же где и сам php файл, выполняющий отправку по api. Код будет таким

$file1 = '@star.png';

include 'uAPImodule.php';
$parametrs = array(
    'oauth_consumer_key' => $consumer_key,
    'oauth_nonce' => $oauth_nonce,
    'oauth_signature_method' => $sig_method,
    'oauth_timestamp' => $timestamp,
    'oauth_token' => $oauth_token,
    'oauth_version' => $oauth_version,
    'category' => '1',
    'title' => 'Название материала',
    'description' => 'Краткое описание материала',
    'message' => 'Полное описание материала',
    'file1' => $file1
);

ksort($parametrs);
$str = uAPIModule('/news', 'post', $parametrs, '');
$arr = json_decode ($str, true);

echo '<pre>';
var_dump ( $arr );
echo '</pre>';

 

| Автор:
Выбор ответа лучшим | | Автор: Yuri_Geruk
Ну и потом просто удаляете эту картинку с сервера unlink($file1);

Выполнил такой код: 

	$f1 = '@avatar.jpg';
	var_dump($f1);
	$parametrs = array(		
		'oauth_consumer_key' => $GLOBALS['consumer_key'],
		'oauth_nonce' => md5(microtime().mt_rand()),
		'oauth_signature_method' => $GLOBALS['sig_method'],
		'oauth_timestamp' => $GLOBALS['timestamp'],
		'oauth_token' => $GLOBALS['oauth_token'],
		'oauth_version' => $GLOBALS['oauth_version'],
		'category' => '15',
		'photo' => $f1
	);
	ksort($parametrs);
	echo uAPIModule('/photo', 'post', $parametrs, '');

Результат:

string(11) "@avatar.jpg" {"error":{"msg":"Не выбраны фотографии для загрузки"}}

Он не подгружает картинку в $f1. Вообще, почему-то ничего в интернете не могу найти про конструкцию '@filename'.

 

Александр Слапогузов,
В переменную ничего подгружаться и не должно. Вы присваиваете переменной ссылку на файл. Точнее @ перед именем файла означает, что вы создали что-то вроде ярлыка на файл как в виндоусе. Перечитайте все еще раз внимательно. Начните с простого. Закиньте на сервер фото avatar.jpg в тот же самый каталог где лежит исполняющий php файл и попробуйте передать это фот по api.
Александр Леонов,

Аватар лежит в директории со скриптом. Немного продвинулся в решении проблемы. Оказывается, что '@filename' в cUrl - это устаревшая конструкция, с PHP 5.5 используют curl_file_create(). Соответственно, сейчас делаю так:

 

	$cfile = curl_file_create('avatar.jpg','image/jpeg','photo');
	
	$parametrs = array(		
		'oauth_consumer_key' => $GLOBALS['consumer_key'],
		'oauth_nonce' => md5(microtime().mt_rand()),
		'oauth_signature_method' => $GLOBALS['sig_method'],
		'oauth_timestamp' => $GLOBALS['timestamp'],
		'oauth_token' => $GLOBALS['oauth_token'],
		'oauth_version' => $GLOBALS['oauth_version'],
		'category' => '15',
		'photo' => $cfile
	);
	ksort($parametrs);
	echo uAPIModule('/photo', 'post', $parametrs, '');

Ошибка:

{"error":{"msg":"Invalid signature","code":"INVALID_SIGNATURE"}}

 

Александр Слапогузов,

Немного продвинулся в решении проблемы

Проблемы никакой нет. Вы пытаетесь передать сам файл, а нужно лишь передать ссылку на него! Замените

'photo' => $cfile

на

'photo' => '@avatar.jpg'

И если файл лежит в той же директории, то он будет передан.

Александр Леонов,

Он лежит там, вот чтобы не быть голословным:

http://wjp-svc.ru/test/avatar.jpg - аватар

http://wjp-svc.ru/test/load_avatar.php - скрипт

Полный код скрипта: 

<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/uapi/uAPImodule.php');

	$parametrs = array(		
		'oauth_consumer_key' => $GLOBALS['consumer_key'],
		'oauth_nonce' => md5(microtime().mt_rand()),
		'oauth_signature_method' => $GLOBALS['sig_method'],
		'oauth_timestamp' => $GLOBALS['timestamp'],
		'oauth_token' => $GLOBALS['oauth_token'],
		'oauth_version' => $GLOBALS['oauth_version'],
		'category' => '15',
		'photo' => '@avatar.jpg'
	);
	
	ksort($parametrs);
	echo uAPIModule('/photo', 'post', $parametrs, '');
?>

Спасибо за ответы )

Александр Слапогузов,

все у вас передалось, а до этого была 500 ошибка. Значит, скорее всего, ошибка в синтаксисе

Александр Леонов,
Все, нашлось решение. Проблема была в том, что использовался uAPImodule для ucoz PHP, а скрипт выполнялся на стороннем сервер. Спасибо за ответы!
...