использование imgur api v3 для анонимной загрузки изображений с помощью php

Я планирую загружать изображения в imgur анонимно, используя его api, я зарегистрировал свое приложение в категории анонимной загрузки и получил идентификатор клиента и секрет клиента. Как использовать php для загрузки изображения в imgur и получения прямого URL-адреса изображения? кто-нибудь может предложить ссылки на любой пример? это то, что я пытался сделать, но получаю сообщение об ошибке «Неустранимая ошибка: превышено максимальное время выполнения 30 секунд»

<?php

$client_id = :client_id; //put your api key here
$filename = "images/q401x74ua3402.jpg";
$handle = fopen($filename, "r");
$data = fread($handle, filesize($filename));

//$data is file data
$pvars   = array('image' => base64_encode($data), 'key' => $client_id);
$timeout = 30;
$curl    = curl_init();

curl_setopt($curl, CURLOPT_URL, 'https://api.imgur.com/3/upload.json');
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $pvars);
$xml = curl_exec($curl);
$xmlsimple = new SimpleXMLElement($xml);
echo '<img height="180" src="';
echo $xmlsimple->links->original;
echo '">';

curl_close ($curl);

?>

person scottydelta    schedule 24.06.2013    source источник
comment
Столкнувшись с такой же проблемой, поделитесь, если вы можете найти решение.   -  person user434885    schedule 25.06.2013
comment
Вы пробовали открыть изображение в режиме rb?   -  person rr-    schedule 26.06.2013
comment
Если вы столкнулись с максимальным лимитом времени выполнения, потому что загрузка изображения занимает много времени, у вас есть два варианта: либо увеличить лимит на вашем сервере, если это возможно, либо найти другой способ загрузки изображения (возможно, просто указав URL-адрес изображения и попросите сервис загрузить его с вашего сервера, если они предлагают такую ​​возможность). Кстати, обычная загрузка изображения с разумным размером изображения вряд ли займет 30 секунд, если у вашего сервера есть достаточное соединение.   -  person CBroe    schedule 26.06.2013
comment
api.imgur.com/endpoints/image говорит image: двоичный файл, данные base64 или URL-адрес изображения - поэтому я бы попытался использовать URL-адрес, если изображение, которое вы пытаетесь загрузить, общедоступно через HTTP на вашем сервере. (Или попробуйте двоичный код вместо base64, потому что base64 увеличивает объем данных для загрузки - ›требуется больше времени.)   -  person CBroe    schedule 26.06.2013
comment
@CBroe, у меня есть изображение только в base64, я не могу это изменить, и да, он превышает максимальный тайм-аут   -  person scottydelta    schedule 26.06.2013
comment
Что ж, тогда ваш единственный вариант - увеличить тайм-аут. (Или вы пишете сценарий, который выводит изображение [соответствующий заголовок Content-Type, за которым следуют данные изображения в декодировании base64] и тем самым делает это изображение доступным через HTTP.)   -  person CBroe    schedule 26.06.2013
comment
У меня есть изображение только в base64 - если это так, то почему вы снова используете base64_encode для данных изображения снова?   -  person CBroe    schedule 26.06.2013
comment
@CBroe, это для тестовых целей, браузер отправляет изображение base64 в мой скрипт, и скрипт должен загрузить это изображение в imgur, я даже пробовал загружать изображения размером всего 54 КБ, и они все еще заканчиваются таймаутом, я не уверен, что я Я использую правильные ключи в почтовых данных.   -  person scottydelta    schedule 26.06.2013
comment
Что ж, вы все равно можете декодировать эти данные с помощью base64 и отправить их как двоичные. Кстати. Вы также пробовали установить параметр «тип»? Не уверен, что API самостоятельно распознает используемый тип.   -  person CBroe    schedule 26.06.2013
comment
Я попробовал двоичный файл вместе с параметром типа, я даже попытался поместить URL-адрес в параметр изображения, но он все еще дает фатальную ошибку: максимальное время выполнения 30 секунд превышено в C: \ xampp \ htdocs \ path \ imgur.php в строке 24   -  person scottydelta    schedule 26.06.2013


Ответы (3)


Проблема заключается в отправке client_id в переменной post. Его нужно отправить в заголовке запроса. Кроме того, вы запрашиваете ответ JSON, но пытаетесь разобрать его как XML.

<?php

$client_id = "FILLMEIN";
$image = file_get_contents("img/cool.jpg");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.imgur.com/3/image.json');
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Client-ID ' . $client_id));
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => base64_encode($image)));

$reply = curl_exec($ch);
curl_close($ch);

$reply = json_decode($reply);
printf('<img height="180" src="%s" >', $reply->data->link);

обновление 1

Живой функциональный пример с и исходный код на основе этого кода с выводом отладки.

person h0tw1r3    schedule 26.06.2013
comment
Он не переходит в состояние тайм-аута, но я получаю сообщение об ошибке «Попытка получить свойство не-объекта в C: \ xampp \ htdocs \ path \ imgur.php в строке 20, а строка 20 - это строка printf». - person scottydelta; 27.06.2013
comment
Добавьте error_reporting(E_ALL); в начало вашего скрипта. Запрос на завиток по какой-то причине не работает. - person h0tw1r3; 27.06.2013
comment
Проверьте ссылки обновить 1, чтобы увидеть живой пример. Похоже, что-то не так с вашей местной средой. - person h0tw1r3; 27.06.2013
comment
Ссылки вниз. Обновлять - person Luigi Lopez; 05.07.2017

обнаружил ошибку, мне нужно отправить данные авторизации в виде заголовка, например, код

<?php
$client_id = 'xxxxxxxx';

$file = file_get_contents("test-image.png");

$url = 'https://api.imgur.com/3/image.json';
$headers = array("Authorization: Client-ID $client_id");
$pvars  = array('image' => base64_encode($file));

$curl = curl_init();

curl_setopt_array($curl, array(
   CURLOPT_URL=> $url,
   CURLOPT_TIMEOUT => 30,
   CURLOPT_POST => 1,
   CURLOPT_RETURNTRANSFER => 1,
   CURLOPT_HTTPHEADER => $headers,
   CURLOPT_POSTFIELDS => $pvars
));

$json_returned = curl_exec($curl); // blank response
echo "Result: " . $json_returned ;

curl_close ($curl); 

?>
person scottydelta    schedule 27.06.2013
comment
Я думаю, вы имеете в виду, что обнаружили ошибку, посмотрев мой код. - person h0tw1r3; 27.06.2013
comment
на самом деле ошибки нигде нет, просто помещение заголовков в двойные кавычки без использования конкатенации строк работало странно;) ваш ответ мне помог и спасибо за это :) - person scottydelta; 28.06.2013
comment
@ h0tw1r3 lol Я оцениваю ваш тяжелый труд :) только что нашел это сегодня, и это мне очень помогло. документация Imgur API скудна с примерами, поэтому я надеялся найти подобную ветку стека, чтобы начать работу. Престижность. - person Jake; 27.07.2013
comment
Может кто-нибудь сказать мне, как мне получить ссылку на прямое изображение из imgur, если оно загружено? - person Sejoo; 19.12.2019

Если у вас возникли проблемы с приведенным выше сценарием, попробуйте curl пропустить проверенный SSL следующим образом:

curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, ложь);

person Phu    schedule 09.02.2014