Не могу скопировать изображения с Tumblr на мой сайт, ошибка тайм-аута соединения - PullRequest
0 голосов
/ 30 октября 2018

Пример изображения Tumblr:

https://69.media.tumblr.com/ec3874e541a767ab578495b762201a53/tumblr_ph9je0Akck1r89eh5o1_1280.jpg

Код:

<form method="get">
    <input type="text" name="url"/>
    <input type="submit" value=" загрузить "/>
</form>

<?php
 $name = md5(date('Y-m-d H:i:s').rand(0, 1000));
 $folder = 'upload/';
 $source = ($_GET['url']);
 $dest = $folder.$name.'.png';

 copy($source, $dest);
 echo 'http://mysite.example/'.$folder.$name.'.png';
?>

Я нашел это в другом вопросе на этом сайте:

Если вы можете просматривать изображение в браузере, который находится на том же компьютере, что и ваша программа, возможно, сервер не отправит изображение, если вы не похожи на пользователя, а не на программу. В этом случае изменение строки идентификации браузера может решить вашу проблему. Если вы не можете просмотреть изображение из браузера, запущенного на ПК программы, вам нужно будет найти источник вашей проблемы в другом месте.

Я думаю, у меня проблема похожа на эту. Tumblr дает изображение для просмотра в браузере, но не позволяет копировать его с помощью скрипта.

Как это исправить? Например, такие сайты, как imgur, могут загружать изображения Tumblr по URL без каких-либо проблем.

P.S. Для изображений с других сайтов копирование с помощью этого скрипта проходит нормально.

Дополнение 01:

Как оказалось, проблема с моим сайтом. Когда я запускаю этот код на другом сайте, он нормально работает с изображениями Tumblr. У меня есть бесплатный домен .ml и бесплатный хостинг Byethost. У меня есть два предположения. Во-первых, мой домен или хостинг находится в черном списке на Tubmlr. Во-вторых, у меня неправильные настройки на моем сайте. Если первое предположение верно, есть ли способ заставить его работать без изменения домена или хостинга? Если второе верно, какие настройки я должен проверить и изменить?

1 Ответ

0 голосов
/ 30 октября 2018

Tumblr, похоже, проверяет HTTP-запрос и генерирует разные ответы в зависимости от того, как вы его получаете. Ваш код подходит, как вы знаете, для большинства сайтов. Когда я запускаю его как есть, я получаю сообщение об ошибке 403.

Изменение кода для использования Curl вместо этого позволило мне загрузить ваш файл. Я предполагаю, что заголовки по умолчанию, используемые в PHP copy(), заблокированы.

<?php
function grab_image($url,$saveto){
    $ch = curl_init ($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $raw=curl_exec($ch);
    curl_close ($ch);
    if(file_exists($saveto)){
        unlink($saveto);
    }
    $fp = fopen($saveto,'x');
    fwrite($fp, $raw);
    fclose($fp);
}

$name = md5(date('Y-m-d H:i:s').rand(0, 1000));
$folder = 'upload/';
$source = ($_GET['url']);
$dest = $folder.$name.'.png';

grab_image($source, $dest);

Функция grab_image() была SO ответом для другого вопроса.

...