1 (изменено: adhocprog, 2015-09-09 20:13:27)

Тема: JS: Скачивание файла с интернета

Нынче файл с интернета скриптом уже не скачать?
Час бился, не получилось.
Касперский удаляет скрипт при выполнении SaveToFile.


function saveOnDisk(path, path2) {
    
    var http = new ActiveXObject("MSXML2.XMLHTTP");

    http.open("GET", path, false);
    http.send();

    var ado = new ActiveXObject("ADODB.Stream");
    ado.mode = 3;
    ado.type = 1;
    ado.open();
    ado.Write(http.responseBody);
    ado.SaveToFile(path2, 2);    
}

saveOnDisk('http://ib.8plus.ru/8a/sounds/monofrosch-mit-hall.wav', "c:\\AdminUse\\monofrosch-mit-hall.wav");

2

Re: JS: Скачивание файла с интернета

adhocprog пишет:

Нынче файл с интернета скриптом уже не скачать?

Вопрос некорректен. Все претензии к антивирусу.

3

Re: JS: Скачивание файла с интернета

Стоит задача написать скрипт, чтобы он работал у клиентов.
А он даже у меня не работает. Мой компьютер не уникальный, антивирусы у нормальных пользователей везде стоят.

Как эту проблему решают профессионалы написания скриптов?
На мой взгляд, "Все претензии к антивирусу" это не ответ.

4

Re: JS: Скачивание файла с интернета

Что значит "даже у меня"? Даже у Вас стоит программа, которая делает то, что не требуется?
А вот у меня не стоит. И что, я ненормальный пользователь в итоге?
Вопрос, как я уже подразумевал, решается на стороне антивируса/файрвола, например, занесением в белый список нужного скрипта/интерпретатора. И дело тут не в написании скриптов, а в ложном срабатывании из-за кривых сигнатур.

5 (изменено: adhocprog, 2015-09-10 10:38:29)

Re: JS: Скачивание файла с интернета

Что значит "даже у меня"?

Это значит, что я рядовой пользователь. У меня стоит типовой антивирус, установленный из коробки. Ничего специально не настраивал.

А вот у меня не стоит.

Вообще антивирус не стоит?

И что, я ненормальный пользователь в итоге?

Если антивирус не стоит, то да Если стоит какой-то другой, то нет.

Вопрос, как я уже подразумевал, решается на стороне антивируса/файрвола

Я понял. Это вы про разработку для собственных нужд пишите, для своей инфраструктуры.
Мой скрипт будет работать у случайных клиентов, я им ничего настроить не смогу.

дело тут не в написании скриптов, а в ложном срабатывании из-за кривых сигнатур

Дело тут в том, что использование ADODB.Stream Касперский считает опасным:
http://forum.kaspersky.com/lofiversion/index.php/t5633.html
Потому и вопрос возник, что же тогда использовать?...

6

Re: JS: Скачивание файла с интернета

adhocprog пишет:

Это значит, что я рядовой пользователь. У меня стоит типовой антивирус, установленный из коробки. Ничего специально не настраивал.

Это говорит только о вашем выборе, больше ни о чём. Нигде не определены критерии рядового пользователя.

Вообще антивирус не стоит?

Нет, я берегу свои нервы и время.

adhocprog пишет:

Если антивирус не стоит, то да

Ошибаетесь. Я себя считаю вполне нормальным.

adhocprog пишет:

Я понял. Это вы про разработку для собственных нужд пишите, для своей инфраструктуры.

Разработку? В чём же её суть?

Потому и вопрос возник, что же тогда использовать?

Допустим.

7

Re: JS: Скачивание файла с интернета

Нигде не определены критерии рядового пользователя

Я себя считаю вполне нормальным

Предлагаю тогда начать с определений "рядового" и "нормальный"
В моем понимании "рядовой" - это случайный пользователь (в нашем случай Windows).
Настройки ему сделать никакие не удастся. Какие есть, такие есть. Белый спектр.
Что такое "нормальный"?

Допустим.

Спасибо, попробую.

8 (изменено: Flasher, 2015-09-11 19:47:10)

Re: JS: Скачивание файла с интернета

adhocprog пишет:

Настройки ему сделать никакие не удастся.

Если так, то не лишним было бы рассматривать ситуации, когда скрипт вообще не удаётся запустить. И что тогда?

adhocprog пишет:

Что такое "нормальный"?

Нормальный - это дружащий с головой и компьютером.

adhocprog пишет:

Спасибо, попробую.

Если конкретно, то вот код сохранения на vbs:

URL = "http://ib.8plus.ru/8a/sounds/monofrosch-mit-hall.wav"
Dir = "C:\NewFolder\NewFolder\NewFolder"  ' каталог сохранения

Set HTTP = CreateObject("MSXML2.XMLHTTP.6.0")
HTTP.open "GET", URL, False : HTTP.Send
If HTTP.Status <> 200 Then _
HTTP.Abort : MsgBox "Файл не доступен!", 48 : WScript.Quit

Set FSO = CreateObject("Scripting.FileSystemObject")
If Not FSO.FolderExists(Dir) Then _
   CreateObject("Shell.Application")._
   NameSpace(FSO.GetDriveName(Dir)).NewFolder(Mid(Dir, 4))

Path = FSO.BuildPath(Dir, FSO.GetFileName(URL))
With CreateObject("SAPI.SpFileStream")
  .Format.Type = 1 : .Open Path, 3, True
  .Write HTTP.ResponseBody : .Close
End With
CreateObject("WScript.Shell").Run "explorer.exe /select," & Path

9

Re: JS: Скачивание файла с интернета

Спасибо! Попробую

10

Re: JS: Скачивание файла с интернета

adhocprog, в основном антивири проверяют скрипты на целиковую строчку progid "опасных" объектов. В частности ADODB.Stream. Поэтому иногда достаточно сделать нечто:

var ado = new ActiveXObject("ADODB." + "Stream");

и скрипт перестанет быть опасным.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: JS: Скачивание файла с интернета

А мне помог рецепт из http://stackoverflow.com/questions/4164 … inary-file.
Пока проверял статус на 200 после выполнения send(), McAfee удалял скрипт как вирус. Но если повесить обработчик на onreadystatechange, то вполне прокатывало:


function download(qurl, qfile)
{
    var r= 0, o= new ActiveXObject('MSXML2.XMLHTTP'), ADO= {adTypeBinary: 1, adSaveCreateOverWrite: 2}

    o.onreadystatechange= function()
    {
        if (o.readyState !== 4) return; if ((r= o.Status) !== 200) return

        var a= new ActiveXObject('ADODB.Stream')

        a.Open()
        a.Type= ADO.adTypeBinary, a.Write(o.ResponseBody), a.Position= 0, a.SaveToFile(qfile, ADO.adSaveCreateOverWrite)
        a.Close()
    }
    o.open('GET', qurl, false)
    o.send()
    return r
}

12

Re: JS: Скачивание файла с интернета

Кто-то еще скачивал в последнее время? Мне кажется, изза использования мной прокси доступ к сайту вообще как то не очень корректно осуществляется.

13

Re: JS: Скачивание файла с интернета

Скачивали, скачиваем и будем скачивать, как и раньше.

14

Re: JS: Скачивание файла с интернета

А почему может не работать метод Write ? У меня на любые попытки (без антивирусов, интернетов и прочего) записать данные в файл, пишет ошибку. "Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом." Конкретно на строку с методом Write

var ado = new ActiveXObject("ADODB.Stream");
ado.mode = 3;
ado.type = 1;
ado.open();
ado.Write("строка"); //сюда подставлял и переменную со скрипта, результат один и тот же.
ado.SaveToFile(path2, 2);  

Перепробовал какие есть сорцы из инета, везде эта ошибка записи. Повторюсь, дело не в аверах, т.к. я просто хочу записать бинарный файл (не ехе).

15

Re: JS: Скачивание файла с интернета

bitcoin, покажите Ваш полный код.

P.S. Что такое «аверы»?

16 (изменено: bitcoin, 2018-09-17 11:59:04)

Re: JS: Скачивание файла с интернета

Код записи в файл примерно такой, и он не работает. WriteText работает, но файл нечитаемый, добавляются какие-то непонятные символы.

var ado = new ActiveXObject("ADODB.Stream");
ado.mode = 3;
ado.type = 1;
//ado.Charset = "windows-1251";
//ado.LineSeparator = 10;
ado.open();
//ado.WriteText(str);
ado.Write(str); //не идет сюда никакая переменная, пишет ошибку!
ado.SaveToFile("test.bin", 2);

Выше этого (это просто тест) , идет код вида

var hex = "тут_хекс_данные_файла, много текста",
    bytes = [],
    str;

for(var i=0; i< hex.length-1; i+=2)
{
    bytes.push(parseInt(hex.substr(i, 2), 16));
}
str = String.fromCharCode.apply(String, bytes);

Хранится в хекс формате, потому что бинарные не засунешь в скрипт. можно и base64, не суть. Проблема лишь в записи файла.

P.S. аверы = антивирусники, на которых выше жаловались.Тут дело совсем не в них, ибо файл не исполняемый.

17

Re: JS: Скачивание файла с интернета

stealzy, я взял с этой темы часть кода под записи бинарного файла. Спросил тут, чтобы не создавать новых тем на 1 вопрос. Если так нельзя, то прошу прощения.

18 (изменено: alexii, 2018-09-17 12:43:41)

Re: JS: Скачивание файла с интернета

bitcoin пишет:

Выше этого (это просто тест) , идет код вида

Вот так-то лучше.

Проблема не «лишь в записи файла». Проблема в том, что методу .Write() требуется аргумент типа ByteArray() — массив, каждый элемент которого является значением типа Byte: Write Method | Microsoft Docs. А у Вас тип переменной str какой? Я вижу — string. Отсюда и ошибка, насколько я понимаю.

Как правильно создать и пользовать такой массив на JScript — не подскажу, не «мой» язык, ждите более опытных коллег.

19

Re: JS: Скачивание файла с интернета

Коллеги, так вроде давно уже решённые проблемы ?

bitcoin, думаю Вам было бы проще использовать wsf файл (Windows Script File) и его тег resource для хранения тела файла.


// Константы для ADODB.Stream
var	adTypeBinary			= 1,
	adSaveCreateOverWrite	= 2;
// Содержимое файла в hex
var data = '53616d706c652066696c6520776974682064617461';
// Создание объекта кодировщика / декодировщика
var encoder = (function(){
	var e = new ActiveXObject('MSXML2.DOMDocument.6.0').createElement("e");
	// Функция кодирования данных
	return {
		encode: function(data, dataType){
			e.dataType			= dataType;
			e.nodeTypedValue	= data;
			return e.text;
		},
		// Функция декодирования данных
		decode: function(data, dataType){
			e.dataType	= dataType;
			e.text		= data;
			return e.nodeTypedValue;
		}
	}
})();
// Декодирование данных (вторым параметром можно указать bin.hex - для данных в hex кодировке / bin.base64 - для данных в кодировке base64)
data = encoder.decode(data,'bin.hex');
//Запись данных в файл
var stream = new ActiveXObject('ADODB.Stream');
// Режим записи двоичный
stream.Type = adTypeBinary;
stream.open();
stream.Write(data)
// Сохранение файла (второй параметр - adSaveCreateOverWrite разрешает перезапись поверх)
stream.SaveToFile('sample.txt', adSaveCreateOverWrite);
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !