Ответы пользователя по тегу PHP
  • Как правильно использовать прямую ссылку с Яндекс.диска?

    Яндекс начал блокировать частые запросы с сайтов.

    Решением оказалось включить в html заголовок head метатег:
    <meta name="referrer" content="no-referrer" />
    Это чтобы ваш сайт не передавал откуда идет запрос к картинке или к файлу.

    Альтернатива указывать не глобально как сказано выше, а указывать для каждой ссылки rel="noreferrer", как в примере ниже:
    <a href="http://example.com/" rel="noreferrer">ssilka</a>


    На нашем сервисе https://getfile.dokpub.com/yandex/ реализован именно точно такой же механизм.

    Связанные вопросы:
    Как программно скачать файл с Яндекс.Диск?
    Ответ написан
  • Как программно скачать файл с Яндекс.Диск?

    вот пример реализации на php:

    function get_stat( $url, $headers )
    {
        $handle = curl_init();
        curl_setopt( $handle, CURLOPT_URL, $url );
        curl_setopt( $handle, CURLOPT_HTTPHEADER, $headers );
        curl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, false );
        curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true );
        $response = curl_exec( $handle );
        $code = curl_getinfo( $handle, CURLINFO_HTTP_CODE );
        return array( "code" => $code, "response" => $response );
    }
    
    $url_yandex_disk = "https://yadi.sk/i/byMUqoSLiw3Ki";
    
    $result = get_stat( "https://cloud-api.yandex.net:443/v1/disk/public/resources/download?public_key=" . urlencode( $url_yandex_disk ), array() );
    if( $result["code"] == 200 )
    {
    	$result["response"] = json_decode( $result["response"], true );
    	echo '<a href="' . $result["response"]["href"] . '">Скачать</a>';
    }
    else
    {
    	echo "error";
    }


    а здесь работающий пример:
    https://getfile.dokpub.com/yandex/

    А здесь публикация и получение списка своих файлов на Яндекс диске:
    https://getfile.dokpub.com/yandex/publish/

    Для тех кто желает генерировать постоянно обновляемые ссылки передаваемые ,например в GET параметре, можно сделать так:

    $url_yandex_disk = $_GET["ya_url"];
    
    $result = get_stat( "https://cloud-api.yandex.net:443/v1/disk/public/resources/download?public_key=" . urlencode( $url_yandex_disk ), array() );
    if( $result["code"] == 200 )
    {
    	$result["response"] = json_decode( $result["response"], true );
    	header( "Location: " . $result["response"]["href"], true, 302 );
    	exit( 0 );
    }


    а вот на Питоне:
    import requests
    import pprint
    import urllib.parse
    
    targetUrl = "https://yadi.sk/i/03bE933n3PqpG2"
    url = "https://cloud-api.yandex.net/v1/disk/public/resources?public_key=" + urllib.parse.quote(targetUrl, safe="")
    
    responseData = requests.get(url)
    if responseData.headers["content-type"] in ["application/json; charset=utf-8", "application/json"]:
        print(pprint.pformat(responseData.json()))
    else:
        print(responseData)


    В некоторых случаях могут возникать ошибки.
    Ниже связанные вопросы с текущим ответом:
    Как правильно использовать прямую ссылку с Яндекс.диска?
    Ответ написан
    4 комментария