1 (изменено: pant-79, 2012-04-19 18:05:58)

Тема: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

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

<a href="javascript:" onclick="showModalPanelWithRequest('/pgz/public/action/signview/document?document_id=62132627');return false;"><img title="Подписи" alt="" src="/pgz/img/file.gif"/></a></div>
                                                                            </td>
                                                                            <td class="valignMiddle">
                                                                                <a id="prFrm62132627" class="iceOutLnk" href="javascript:" onclick="downloadDocument(62132627);return false;">
                                                                                    <script type="text/javascript">var $j=jQuery.noConflict();$j(document).ready(function(){$j('#prFrm62132627').qtip({content: 'Позволяет открыть печатную форму документа или скачать прикрепленный файл.',position:{target: 'mouse', adjust: {mouse: true, screen: true}},api: {onRender: function(){$j('#prFrm62132627').bind('mousedown', this.hide); $j('#prFrm62132627').bind('#keydown', this.hide);}}});});</script>
                                                                                    <span style="font-weight: bold;">
                                                                                        
                                                                                        документация № 0118300014212000001   от 18.04.2012
                                                                                    </span>
                                                                                </a>

Как отсюда правильно выдернуть адрес для скачивания файла?
Это '/pgz/public/action/signview/document?document_id=62132627' как я понимаю?
Или я ошибся?

2

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Вполне возможно, надо качать и смотреть URL при закачке документа. А как дергать собрались? Через адресную строку?

3

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Короче, браузер это воспринимает так - скачивать надо нечто с адреса
[адрес сайта]/pgz/public/action/signview/document?document_id=62132627
Вроде бы все классно, НО (!!!) каким Макаром браузер узнает, что итоговый файл будет иметь расширение rar doc или xls ? Телепатически догадается? А ведь в результате то скачиваются файлы с нужным расширением.
Мне же надо поставить это на автомат, причем не средствами браузера.
А входная инфа только такая:
адрес (см. выше)
место_куда_хочу_положить_файл\62132627.[хз какое расширение]
Дергать собрались не адресной строкой. Вообще средствами АНК, ну или НТА на крайняк...

4

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Тогда просто используйте XMLHTTP и читайте заголовки ответа сервера. Там указаны filename и тип контента.

5

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Что-то нарыл тут и тут
Но в силу полного отсутствия практики на javascript, не совсем понял где там что...
Никто не может привести пример кода с нужными запросами?

6

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

pant-79 пишет:

каким Макаром браузер узнает

Макар здесь ни при чем. Телепатия недопустима. Да ее и не существует. Все описано в спецификации протокола HTTP. Клиент узнает о типе и имени ресурса из заголовка отклика. Читайте RFC 2617

( 2 * b ) || ! ( 2 * b )

7

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Ну, я не такой маньяк в javascript и серверных запросах, чтобы сейчас вот проштудировав эту матчасть на англицком крикнуть "эврика" и написать нужный код. Кто-нибудь может привести пример кода для скачивания файла с такой страницы?

8 (изменено: Rumata, 2012-04-26 21:28:38)

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

pant-79 пишет:

Ну, я не такой маньяк в javascript и серверных запросах

Вы просто лентяй, который перекладывает решение своей задачи на чужие плечи. Посмотрите на тот пример. В нем уже содержатся ответы.


// адрес, взятый из приведенной Вами страницы
var url = 'http://zakupki.gov.ru/pgz/documentdownload?documentId=62795440';

// создаем объект XMLHttpRequest
var xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');

// инициализируем функцию, которая будет вызываться при выполнении запроса
xmlhttp.onreadystatechange = function()
{
	// ждем завершения выполнения запроса
	if ( xmlhttp.readyState != 4 ) {
		return;
	}

	// посмотрим статус ответа сервера
	WScript.Echo(xmlhttp.status, xmlhttp.statusText);

	// посмотрим заголовки ответа сервера
	var headers = xmlhttp.getAllResponseHeaders();
	WScript.Echo(headers);
};

// создать синхронный запрос к серверу
xmlhttp.open('GET', url, false);

// послать запрос на сервер
// будет вызвана созданная нами функция
xmlhttp.send();
( 2 * b ) || ! ( 2 * b )

9

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Чего уж сразу лентяй? Я просто javascript знаю только теоретически.
Вот без этих объяснений в комментариях вообще бы мало что понял.
В свое время чтобы освоить VBS самостоятельно на уровне не совсем последнего ламера мне понадобился месяц, пару тысяч строк кода и пяток тредов на этом форуме. Сейчас ситуация изменилась. На практическое освоение javascript вообще очень мало времени...

10

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Кстати, что-то у меня не пашет... насколько я правильно понимаю, код

WScript.Echo(xmlhttp.status, xmlhttp.statusText)

и

WScript.Echo(headers)

должен мне выдать msgbox'ы с инфой, полученной при запросе.
Но у меня скрипт пролетает "вхолостую". Может, я что-то не то делаю... я банально сохранил этот код в файл request.js, а потом запустил его.
Привычка у меня такая после АНК и VBS. Может быть, вредная....

11 (изменено: Rumata, 2012-04-26 18:05:16)

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

pant-79
запускайте в командной строке

cscript script.js

Должно вывести

200 OK
Раздел 5 Технич задание.doc
55296

Специально проверил

wscript script.js

так тоже работает

( 2 * b ) || ! ( 2 * b )

12

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Я поправил код в сообщении выше. Проверьте.

xmlhttp.open('GET', url, false);

Я забыл указать явно false, что значит не использовать асинхронные запросы; они выполняются "параллельно" работе основной программы. Так как после отправки запроса программа завершается, то и обработчик (функция onreadystatechange) не успевает выполниться и программа ничего не выводит. Такая ситуация была у Вас. И это правильно.

Другая ситуация была у меня. Перед тем как опубликовать тот пример, я уже выполнил запрос к заданному ресурсу, а данные скорее всего "закешировались" (возможно на прокси, возможно на моей машине). Всегда требуется время, пока запрос завершится. Так как данные в моем случае берутся из локального кеша, а не с удаленного сервера, то обработчик успевал выполниться, а программа - вывести результат.

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

( 2 * b ) || ! ( 2 * b )

13

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Вообще никаким боком не пашет. Запускал по всякому. Ничего не выводит в принципе.
Ни командной строкой, ни в переменных ничего не выводит.
Даже запихивал в АНК:

#NoEnv
#SingleInstance,off
#Include %A_ScriptDir%\ws4ahk.ahk
SetWorkingDir %A_ScriptDir%  
   WS_Initialize()
Variables =
 (
var url = 'http://zakupki.gov.ru/pgz/documentdownload?documentId=62795440';
var xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
xmlhttp.onreadystatechange = function()
{
    // ждем завершения выполнения запроса
    if ( xmlhttp.readyState != 4 ) {
        return;
    }
 
    // посмотрим статус ответа сервера
    WScript.Echo(xmlhttp.status, xmlhttp.statusText);
 var Status = xmlhttp.status
var Text = xmlhttp.statusText
    // посмотрим заголовки ответа сервера
    var headers = xmlhttp.getAllResponseHeaders();
    WScript.Echo(headers);
};
 
// создать запрос к серверу
xmlhttp.open('GET', url);
 
// послать запрос на сервер
// будет вызвана созданная нами функция
xmlhttp.send();
)
  WS_Exec(Variables)
WS_Eval(Status, "Status")
WS_Eval(Text, "Text")
WS_Eval(headers, "headers")
MsgBox "%Status%"`n"%Text%"`n"%headers%"
ExitApp

Выводит пустые значения....

14

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Я же уже сказал:

Rumata пишет:

Я поправил код в сообщении выше

Исправляйте, проверяйте.

pant-79 пишет:

Даже запихивал в АНК

Наверно, не буду больше помогать Вам. AHK-то тут при чем?

( 2 * b ) || ! ( 2 * b )

15

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Rumata пишет:

Я же уже сказал:

Rumata пишет:

Я поправил код в сообщении выше

Исправляйте, проверяйте.

Ой, извините, то ли я этот комментарий просто проглядел, то ли это глюк сайта...

16

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Получилось. Сам по себе этот код выполняется успешно.
Пытаюсь переделать этот код под VBA, чтобы посредством EXCEL все это делалось.
Начал переделывать код, и что-то застрял
Код

Dim URL
Dim xmlhttp
Dim Status
  Set URL = "http://zakupki.gov.ru/pgz/documentdownload?documentId=62795440"
  Set xmlhttp = CreateObject("Microsoft.XMLHTTP")

у меня еще получился, а вот дальше...
Если это возможно, то как правильно переделать функцию xmlhttp.onreadystatechange под VBA?
у меня строка

  xmlhttp.onreadystatechange = function()

сразу валидацию не проходит...

17

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

pant-79 пишет:

сразу валидацию не проходит

Не пройдет. Надо примерно так:

Function xmlhttp_onreadystatechange()
...
End Function
xmlhttp.onreadystatechange = GetRef("xmlhttp_onreadystatechange")

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

Вот еще один пример в помощь:


Dim url : url = "http://zakupki.gov.ru/pgz/documentdownload?documentId=62795440"

Dim xmlhttp : Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
xmlhttp.open "GET", url, False
xmlhttp.send

If xmlhttp.status <> 200 Then
	WScript.Echo xmlhttp.status, xmlhttp.statusText
	WScript.Quit
End If

Dim headers : headers = xmlhttp.getAllResponseHeaders()
WScript.Echo headers
( 2 * b ) || ! ( 2 * b )

18

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Rumata, в VBA нет GetRef().

19 (изменено: Rumata, 2012-05-02 20:15:02)

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

wisgest
Хмм... Тем хуже. Для меня это очередное "фи" в адрес редмондских волшебников. Реализовали букет несовместимых кривых диалектов одного языка.

Может быть существует аналог? Хотя в VBA работает механизм объявлений вида ИмяОбъекта_ИмяМетода. Может быть это прокатит.

( 2 * b ) || ! ( 2 * b )

20

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Хм. Товарищи. А ведь результат вдохновляет... Это я только что Экселем сделал запрос и получил нужную инфу с веб-страницы.
То бишь, код работоспособен. Теперь думаю вообще отказаться от участия АНК в этой авантюре...
Собственно, почему я начинал использовать его - там удобная команда: URLDownloadToFile - строчка кода и ты скачал нужный файл.
Вопрос знатокам - в какую сторону здесь удобнее копать, чтобы обеспечить загрузку файла с сайта? Теми же средствами VBА? Какой объект для этого нужно присобачить в код?

21

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Ничего не понял. А можно по подробнее

22

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Как это относится к теме?

23

Re: JavaScript: как получить по javascript-ссылке адрес для загрузки файла

Как это относится к теме?

Это был wink спам.