Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Основы PHP...

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Открыть новую тему     Написать ответ в эту тему

Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sanatory

Цитата:
ТАКИЕ ССЫЛКИ НЕ ОБРАБАТЫВАЮТСЯ

Что выдаётся по таким ссылкам? file_get_contents следует 302 переадресации, значит нужно сначала понять что именно там возвращает сервер. Пример такой ссылки?

Всего записей: 15091 | Зарегистр. 20-09-2014 | Отправлено: 18:07 17-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
Что выдаётся по таким ссылкам?

Отдаётся веб-страница, на которой расположена ссылка.  
Например, файл называется "download.php_id=3509", а внутри <!DOCTYPE html><html><head>...
 
Пример ссылки

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 20:31 17-05-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sanatory

Цитата:
Отдаётся веб-страница, на которой расположена ссылка.  

ну так тогда нужно парсить содержимое страницы, вытаскивать ссылку и скачивать уже ее.

Всего записей: 15091 | Зарегистр. 20-09-2014 | Отправлено: 20:36 17-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
вытаскивать ссылку и скачивать уже ее

 
В коде страницы ссылка имеет вид:
Подробнее...
Я видимо туплю, поскольку не понимаю, что имеется в виду под
Цитата:
парсить содержимое страницы, вытаскивать ссылку и скачивать уже ее

Как получить прямую ссылку на файл, который сервер отдаёт через запрос вида download.php?id=блаблабла?

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 20:47 17-05-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sanatory

Цитата:
Как получить прямую ссылку на файл, который сервер отдаёт через запрос вида download.php?id=блаблабла?

значит сервер смотрит что то еще - куки/реферера/наличие заголовков браузера в http запросе (file_get_contents их не отправляет).
заголовки можно кидать и в file_get_contents, а можно воспользоваться CURL
 
скорее всего смотрит лишь реферера

Код:
$referer = "http://abc.info";
$opts = array(
       'http'=>array(
           'header'=>array("Referer: $referer\r\n")
       )
);
$context = stream_context_create($opts);
$content = file_get_contents($url, false, $context);  

возможно реферер должен быть даже страницей, на которой расположена ссылка.

Всего записей: 15091 | Зарегистр. 20-09-2014 | Отправлено: 20:49 17-05-2017 | Исправлено: Mavrikii, 20:54 17-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу пардону - случайно ввёл в заблуждение: отдаётся заглавная страница сайта, а не та, на которой лежала ссылка.
Отправлю данные по запросам в личку.

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 21:02 17-05-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sanatory

Цитата:
отдаётся заглавная страница сайта, а не та, на которой лежала ссылка

я знаю, потому что и в браузере если просто вставить ссылку - идет переадресация, а клик выдает torrent файл. в первом случае реферера нет, во втором - есть, вот и говорю - добавьте реферера и посмотрите
 

Код:
# loop through each file  
foreach ($files as $file) {  
    # download file  
    $temp = parse_url($file);
    $download_file =  file_get_contents($file, false, stream_context_create([
      'http' => ['header' => ['Referer: ' . $temp['scheme'] . "://" . $temp['host'] . "\r\n"]]
    ])
);  
 
    #add it to the zip  
    $zip->addFromString(basename($file), $download_file);  
}  

Всего записей: 15091 | Зарегистр. 20-09-2014 | Отправлено: 21:04 17-05-2017 | Исправлено: Mavrikii, 21:14 17-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Огромное спасибо! Единственная проблема - файлы называются по-прежнему а-ля "download.php_id=8736". Это можно как-то исправить?

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 21:20 17-05-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sanatory

Цитата:
Это можно как-то исправить?

берем
http://php.net/manual/en/reserved.variables.httpresponseheader.php
вытаскиваем оттуда название аттачмента
 
или используем CURL

Всего записей: 15091 | Зарегистр. 20-09-2014 | Отправлено: 21:22 17-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
вытаскиваем оттуда название аттачмента  

что-то я по ссылке вижу всё, окромя имени: тип сервера, протокол , дату последней модификации и т. д.
 
ЗЫ
Мне правда совестно, но в PHP я полный нуб. И начинать его осваивать сейчас нет времени. Хотя да, надо. Понимаю. Надеюсь когда-нибудь сам смогу здесь помочь кому-то ответами на очередное нубское нытьё. Но пока приходится ныть мне некузявому: дяденька, сделай так, чтоб заработало. Понимаю, как это выглядит со стороны...

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 21:29 17-05-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sanatory
ссылка показывает пример.
в вашем случае название будет в заголовке

Цитата:
Content-Disposition: attachment; filename="имя_файла.torrent"

потом регуляркой (или простым разбитием строки по "filename=") вытаскиваете его из кавычек и вуаля.
 

Код:
#add it to the zip
$filename = base($file);
foreach($http_response_header as $field)
  if (stripos($field, 'Content-Disposition') === 0) {
     $temp = explode('filename=', $field, 2);
     $filename = trim($temp[1], '"');
     break;
  }
$zip->addFromString($filename, $download_file);  

 
к примеру так. не проверял, но смысл понятен

Всего записей: 15091 | Зарегистр. 20-09-2014 | Отправлено: 21:32 17-05-2017 | Исправлено: Mavrikii, 21:45 17-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
 
 

Код:
#add it to the zip
$filename = base($file);
foreach($http_response_header as $field)
  if (stripos($field, 'Content-Disposition') === 0) {
     $temp = explode('filename=', $field, 2);
     $filename = trim($temp[1], '"');
     break;
  }
$zip->addFromString($filename, $download_file);  

 

Спасибо, код работает. Только очепятка в строке $filename = base($file);  
Надо $filename = basename($file);

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 21:53 17-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжаю разбираться с PHP...
Пишу скрипт, который скачивал бы файл в ответ на запрос (ссылку передаю в параметрах запроса). Не работает. Если указывать ту же ссылку, но уже в виде переменной в теле скрипта - всё срабатывает.
 
Примеры кода:
Рабочий
 
НЕ работает
 
Ссылка выглядит таким образом:
http://site/script.php?&files=https://downloader.disk.yandex.ru/disk/cac76a61954485fc56e9e8819cb38885e5526e2b7c7b67c3ab5f262184b3500e/592d911f/Jr3lRoM-Cug8QkiCden6fsJNXuVJvPH9aLlc3APeBYWDh_zVBxjkfkzetx9_fIwK-L-j9FA2_dWvmS_NsWAyTw%3D%3D?uid=0&filename=dpp1.7.2233.x86.portable%2829.05.17%29.exe&disposition=attachment&hash=%2B/qp2ITgWmJTmc13dyeLlcFYGrAY6WdYK8nME1eLyMs%3D%3A&limit=0&content_type=application%2Fx-msdownload&fsize=25466226&hid=ecf4ebd1f39f0faa1aa3e32909c750ff&media_type=executable&tknv=v2&nombre=dpp1.7.2233.x86.portable(29.05.17).exe
 
 
Подозреваю, проблема в "амперсандах", содержащихся в передаваемой ссылке. Но избавиться от них не получается.  
Пробовал передавать ссылку, предварительно пропустив через urlencode, а в скрипте декодировать её всячески. Не хочет работать и всё тут.

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 14:51 30-05-2017 | Исправлено: Sanatory, 14:59 30-05-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Подозреваю, проблема в "амперсандах", содержащихся в передаваемой ссылке. Н

Именно
Все содержимое после files= должно быть представлено определённым образом
Чтобы было понятнее, вот описание к такой функции в js
http://javascript.ru/encodeuricomponent
Есть она и в php, а также можете преобразовать в онлайне http://pressbin.com/tools/urlencode_urldecode/
 
PS: после ? амперсанд не нужен
 

Цитата:
скрипте декодировать её всячески

Не нужно ничего декодировать, php делает это автоматически. Вернее сам http сервер декодирует и передаёт в php уже в нормальном виде.

Всего записей: 15091 | Зарегистр. 20-09-2014 | Отправлено: 16:05 30-05-2017 | Исправлено: Mavrikii, 16:10 30-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Не нужно ничего декодировать, php делает это автоматически

Ах вот оно что... Спасибо!
 

Цитата:
Все содержимое после files= должно быть представлено определённым образом
Чтобы было понятнее, вот описание к такой функции в js
http://javascript.ru/encodeuricomponent

Естественно, я всё это пробовал. Просто пытался потом декодировать - в PHP-скрипте, а этого не надо было делать, как оказалось.
 
В общем, спасибо, с этим разобрался.
 
Ещё один вопрос напоследок. Теперь файл скачивается, но расширение у него ".htm". Т. е. название имеет вид: dpp1.7.2233.x86.portable(29.05.17).exe.htm. Это можно как-то поправить?

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 17:16 30-05-2017 | Исправлено: Sanatory, 17:18 30-05-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sanatory

Цитата:
Это можно как-то поправить?

Ок, кодировать нужно все до &nobre, если хотите получить это значение в скрипте и это не является частью запроса к яндексу
Да, ещё желательно не делать скрипт публичным или ограничивать его, иначе найдутся злопыхатели.

Всего записей: 15091 | Зарегистр. 20-09-2014 | Отправлено: 19:08 30-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Ок, кодировать нужно все до &nobre, если хотите получить это значение в скрипте и это не является частью запроса к яндексу

Я так и делаю.  

Цитата:
Да, ещё желательно не делать скрипт публичным или ограничивать его, иначе найдутся злопыхатели.

Оно вестимо.  
 
Mavrikii, спасибо ещё раз за помощь! Фиг с ним, с расширением. Переименовать не проблема, в принципе. Ну пострадает немного мой внутренний перфекционист. Это даже полезно временами

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 19:19 30-05-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sanatory
добавьте еще вывод заголовка Content-Type: application/octet-stream
иначе php выдает по умолчанию что это html, поэтому так и получается

Всего записей: 15091 | Зарегистр. 20-09-2014 | Отправлено: 20:08 30-05-2017 | Исправлено: Mavrikii, 20:08 30-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
добавьте еще вывод заголовка Content-Type: application/octet-stream
иначе php выдает по умолчанию что это html, поэтому так и получается  

Mavrikii, помогло. Мой внутренний перфекционист лучится счастьем и подпрыгивает от благодарности.
 

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 21:12 30-05-2017
Sanatory



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
del

Всего записей: 89 | Зарегистр. 21-04-2010 | Отправлено: 00:48 04-06-2017 | Исправлено: Sanatory, 13:28 14-06-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Компьютерный форум Ru.Board » Интернет » Web-программирование » Основы PHP...


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru