1 (изменено: Winand, 2010-01-18 00:13:22)

Тема: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Написал программу на бейсике, делающую то что в теме сказано. Для расширяемости и чинибельности, всё сделано на скриптах (VBScript или JScript). Скрипт должен содержать функцию upload(), получающую путь к файлу и выдающую ссылку на загруженный файл. Использовал WebFormClass3 Так вот. О чём я..

Взял с форума скрипт для zalil, написал такой же на js, еще для ргхост, ifile и filedropper. А с hotfile возникла проблема. Вот кот:

Function upload(ByVal filepath)
    Dim auth, xprogressid, action_url, p0, p1
    XMLHTTP.Open "GET", "http://hotfile.com", False
    Call XMLHTTP.send
    auth = XMLHTTP.responseText
    p0 = InStr(1, auth, "<form action=""http://", vbTextCompare)
    If p0 Then
        p0 = p0 + 14 '14 = "<form action=""
        p1 = InStr(p0, auth, """")
        If p1 > p0 Then
            action_url = Mid(auth, p0, p1 - p0)
        End If
    End If

    If action_url <> "" Then    
        WebForm.Action = action_url
        WebForm.Method = "POST"
        WebForm.Enctype = "multipart/form-data"
        WebForm.AddFile "uploads[]", filepath

        XMLHTTP.Open WebForm.Method, WebForm.Action, False
        XMLHTTP.setRequestHeader "Content-type", WebForm.Enctype
        XMLHTTP.send WebForm.VarBody
        Select Case XMLHTTP.Status
        Case 200 'OK
            MsgBox XMLHTTP.responseText
            'p0 = InStr(1, XMLHTTP.responseText, "http://rghost.ru/")
            'If p0 Then
            '    p1 = InStr(p0, XMLHTTP.responseText, "'")
            '    If p1 > p0 Then _
            '        upload = Mid(XMLHTTP.responseText, p0, p1 - p0)
            'End If
        Case Else 'Error
            MsgBox XMLHTTP.statusText, vbCritical, XMLHTTP.Status
        End Select
    End if
End Function

На строке send мне выдается сообщение: "Доступ запрещен". Что интересно, судя по данным сниффера приходит пакет с кодом 302, в котором содержится ссылка на страницу управления файлом. Что я делаю не так?)

Вот сама программа

2

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Даже не знаю в чём дело.
Если сделать так:

MsgBox "Поехали!"
        XMLHTTP.send WebForm.VarBody
MsgBox "Приехали!"

то «Поехали!» пишет, после чего сетевое соединение какое-то время активно, затем ничего не происходит, «Приехали!» не появляется, до проверки XMLHTTP.Status дело не доходит, процесс WScript.exe остаётся висеть.

(В целом делал так:

<?xml version='1.0' encoding='windows-1251'?>
<job>

<script language='VBScript' src='WebFormClass.vbs'/>
<script language='VBScript' src='upload.vbs'/>

<script language='VBScript'><![CDATA[
filepath = "C:\NTDETECT.COM"

Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")
Set WebForm = New WebFormClass

upload(filepath)
]]></script>
</job>

)

3

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

wisgest, так всё, я разобрался)

Таким образом, нужно банально заменить MSXML2.XMLHTTP на WinHttp.WinHttpRequest.5.1, функции там одинаковые.

Function upload(ByVal filepath)
    Dim auth, action_url, p0, p1, s0
    WinHttp.Open "GET", "http://hotfile.com", False
    Call WinHttp.send
    auth = WinHttp.responseText
    p0 = InStr(1, auth, "<form action=""http://", vbTextCompare)
    If p0 Then
        p0 = p0 + 14 '14 = "<form action=""
        p1 = InStr(p0, auth, """")
        If p1 > p0 Then
            action_url = Mid(auth, p0, p1 - p0)
        End If
    End If

    If action_url <> "" Then    
        WebForm.Action = action_url
        WebForm.Method = "POST"
        WebForm.Enctype = "multipart/form-data"
        WebForm.AddFile "uploads[]", filepath

        WinHttp.Open WebForm.Method, WebForm.Action, False
        WinHttp.setRequestHeader "Content-type", WebForm.Enctype
        WinHttp.send WebForm.VarBody
        Select Case WinHttp.Status
        Case 200 'OK
            s0 = WinHttp.responseText
            p0 = InStr(1, s0, "[URL=")
            If p0 Then
                p0 = p0 + 5 '5 = "[URL="
                p1 = InStr(p0, s0, "]")
                If p1 > p0 Then _
                    upload = Mid(s0, p0, p1 - p0)
            End If
        Case Else 'Error
            MsgBox WinHttp.statusText, vbCritical, WinHttp.Status
        End Select
    End if
End Function

4

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Действительно, заработало.
(

filepath = "C:\NTDETECT.COM"

'Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")
Set WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
Set WebForm = New WebFormClass

MsgBox upload(filepath)

)

5 (изменено: Chaosito, 2010-08-08 21:59:16)

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Здраствуйте.
Пробовал переделать скрипт под хостинг изображений pics.kz, ну вообще никак не получается
Уже все поперепробовал, возвращает мне ту же страницу на которую передаю данные.
Запрос проходит все нормально, статус ответа 200 ок. а в ответ то же самое.
Думаю наверно из-за ajax стоящего на пиксе...
Если нужно могу полностью выложить код скрипта, хотя он практически не отличается от выложенных здесь.

Что-нибудь можно придумать, или это не вариант!???


еще есть минипикс - pics.kz/mini но с ним тоже ничего не выходит..

6

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Лучше код покажите.

7 (изменено: Chaosito, 2010-08-09 00:11:10)

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

JSman, (pics_kz.vbs):

Dim CommonDialog 
Set CommonDialog = CreateObject("UserAccounts.CommonDialog") 
Set WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
Set WebForm = New WebFormClass

Const cdlOFNExplorer = &H80000 
Const cdlOFNFileMustExist = &H1000 
Const cdlOFNHideReadOnly = &H4 
Const cdlOFNPathMustExist = &H800 

With CommonDialog 
    .Flags = cdlOFNExplorer OR cdlOFNFileMustExist OR cdlOFNHideReadOnly OR cdlOFNPathMustExist 
    .Filter = "Файлы изображений (*.bmp;*.gif;*.jpg;*.jpeg;*.png)|*.bmp;*.gif;*.jpg;*.jpeg;*.png" 
    .ShowOpen 'Display dialog 
End With 

if Trim(CommonDialog.FileName) = "" Then WScript.Quit
result = upload(CommonDialog.FileName)
if Trim(result) = "" then WScript.Quit
MsgBox "Файл успешно загружен на сервер."+vbcrlf+"Ссылка на файл:"+vbcrlf+vbcrlf+result,vbInformation,"Upload Complete"

Function upload(ByVal filepath)
    Dim action_url, p0, p1, s0
       action_url="http://pics.kz/"' или http://pics.kz/mini
        WebForm.Action = action_url
        WebForm.Method = "POST"
        WebForm.Enctype = "multipart/form-data"
        WebForm.AddFile "file_0", filepath

        WinHttp.Open WebForm.Method, WebForm.Action, False
        WinHttp.setRequestHeader "Content-type", WebForm.Enctype
        WinHttp.send WebForm.VarBody
        Select Case WinHttp.Status
        Case 200 'OK
            s0 = WinHttp.responseText ' возвращает ту же страницу (обработчик)
            wscript.echo WinHttp.responseText ' debug
            p0 = InStr(1, s0, "[URL=")
            If p0 Then
                p0 = p0 + 5 '5 = "[URL="
                p1 = InStr(p0, s0, "]")
                If p1 > p0 Then _
                    upload = Mid(s0, p0, p1 - p0)
            End If
        Case Else 'Error
            MsgBox WinHttp.statusText, vbCritical, "Error" + WinHttp.Status
        End Select
End Function


'/// Класс формы 
Class WebFormClass
    Private Fields, Files
    Private PropertyEnctype, PropertyMethod, PropertyBoundary, PropertyAction

    Private Sub Class_Initialize()
        Fields = Array()
        Files = Array()
        PropertyEnctype = "application/x-www-form-urlencoded"
        PropertyMethod = "GET"
        PropertyBoundary = String(27, "-") & GenerateBoundary
        PropertyAction = "about:blank"
    End Sub

    Public Property Let Action(Value)
        PropertyAction = Value
    End Property

    Public Property Get Action()
        Action = PropertyAction
        If PropertyMethod = "GET" Then
            Dim Params
            Params = VarBody
            If VarBody <> "" Then Action = Action & "?" & Params
        End If
    End Property

    Public Property Get Boundary()
        Boundary = PropertyBoundary
    End Property

    Public Property Get Method()
        Method = PropertyMethod
    End Property

    Public Property Let Method(Value)
        Value = UCase(Value)
        If Value = "GET" Or Value = "POST" Then PropertyMethod = Value
    End Property

    Public Property Get Enctype()
        Enctype = PropertyEnctype
        If PropertyEnctype = "multipart/form-data" Then Enctype = Enctype & "; boundary=" & PropertyBoundary
    End Property

    Public Property Let Enctype(Value)
        Value = LCase(Value)
        If Value = "multipart/form-data" Or Value = "application/x-www-form-urlencoded" Then PropertyEnctype = Value
    End Property

    Public Sub AddField(Name, Value)
        ReDim Preserve Fields(UBound(Fields) + 1)
        Fields(UBound(Fields)) = Array(Name, Value)
    End Sub

    Public Sub AddFile(Name, Value)
        ReDim Preserve Files(UBound(Files) + 1)
        Files(UBound(Files)) = Array(Name, Value)
    End Sub
      

    Public Property Get VarBody()
        If PropertyMethod = "POST" And PropertyEnctype = "multipart/form-data" Then
            Const DefaultBoundary = "--"
            Dim Stream
            Set Stream = CreateObject("ADODB.Stream")
            Stream.Type = 2
            Stream.Mode = 3
            Stream.Charset = "Windows-1251"
            Stream.Open
            
            Dim FieldHeader, FieldsBody
            
            For Each Field In Fields
                FieldHeader = "Content-Disposition: form-data; name=""" & Field(0) & """"
                FieldsBody = FieldsBody & DefaultBoundary & PropertyBoundary & vbCrLf & FieldHeader & vbCrLf & Field(1) & vbCrLf
            Next
            
            Stream.WriteText FieldsBody
            
            Dim FileHeader
            
            For Each File In Files
                If LoadFile(File(1), Data) Then
                    FileHeader = DefaultBoundary & Boundary & vbCrLf & "Content-Disposition: form-data; name=""" & File(0) & """; filename=""" & File(1) & """" & vbCrLf & "Content-Type: octet/stream" & vbCrLf & vbCrLf
                    Stream.WriteText FileHeader
                    Stream.Position = 0
                    Stream.Type = 1
                    Stream.Position = Stream.Size
                    Stream.write Data
                    Stream.Position = 0
                    Stream.Type = 2
                    Stream.Position = Stream.Size
                End If
            Next
            
            Stream.Position = 0
            Stream.Type = 2
            Stream.Position = Stream.Size
            Stream.WriteText vbCrLf & DefaultBoundary & PropertyBoundary & DefaultBoundary
            
            Stream.Position = 0
            Stream.Type = 1
            
            VarBody = Stream.Read
        Else
            For Each Field In Fields
                VarBody = VarBody & URLEncode(Field(0)) & "=" & URLEncode(Field(1)) & "&"
            Next
            For Each File In Files
                VarBody = VarBody & URLEncode(File(0)) & "=" & URLEncode(File(1)) & "&"
            Next
            If Len(VarBody) > 0 Then VarBody = Left(VarBody, Len(VarBody) - 1)
        End If
    End Property

    Private Function URLEncode(Data)
        Dim CharPosition, CharCode
        For CharPosition = 1 To Len(Data)
            CharCode = Asc(Mid(Data, CharPosition, 1))
            If CharCode = 32 Then
                URLEncode = URLEncode + "+"
            ElseIf (CharCode < 48 Or CharCode > 126) Or (CharCode > 56 And CharCode <= 64) Then
                URLEncode = URLEncode + "%" + Right("0" & Hex(CharCode), 2)
            Else
                URLEncode = URLEncode + Chr(CharCode)
            End If
        Next
    End Function

    Private Function LoadFile(Path, Data)
        On Error Resume Next
        Dim Stream
        Set Stream = CreateObject("ADODB.Stream")
        Stream.Type = 1
        Stream.Mode = 3
        Stream.Open
        Stream.LoadFromFile Path
        If Err.Number <> 0 Then Exit Function
        Data = Stream.Read
        LoadFile = True
    End Function

    Private Function GenerateBoundary()
        Dim Char
        Dim N, Start
        Const Chars = "abcdefghijklmnopqrstuvxyz0123456789"
        Randomize
        For N = 1 To 12
            Start = CLng(Rnd * (Len(Chars) - 1)) + 1
            Char = Mid(Chars, Start, 1)
            If Start Mod 2 Then Char = UCase(Char)
            GenerateBoundary = GenerateBoundary & Char
        Next
    End Function
End Class

так же для дебага использовал объект ИЕ:

Dim InternetExplorer 
        Set InternetExplorer = CreateObject("InternetExplorer.Application") 
        InternetExplorer.Visible = True 
        InternetExplorer.Navigate "about:blank" 
        Do 
                        WScript.Sleep 100 
        Loop Until InternetExplorer.readystate = 4 
        InternetExplorer.document.write XMLHTTP.responsetext

8

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Пока я вижу, что пакеты в обратной последовательности отправляются.

9

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

JSMan, Отправляются от меня или с хостинга? В чем проблема получается? и как ее решить (обойти) ?

10

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

У меня пока вышло, что от Вас исходят пакеты на сайт в обратном порядке. Вечером постараюсь решить проблему.

11 (изменено: Chaosito, 2010-08-10 23:31:17)

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

хм... странно... с вышепредлженными все работает нормально, а это hotfile.com и zalil.ru

мне все же кажется что косяк в хостинге, он бы хоть в ответе ошибку выдавал. а то статус ОК 200 и туже страницу шлет..

12

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Больше не у кого нет никаких идей? или хотябы вот с этим сервисом image.kz

13 (изменено: kefi, 2010-09-12 14:34:51)

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Вот еще вопрос : есть всем известный  хостинг на narod.ru . Там  нужна авторизация. Как туда с помощью XMLHTTP заливать файлы (по HTTP и по FTP) ?

14

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Chaosito, возможно слишком поздно (эту тему вообще в гугле нашел хехе) но я нашел проблему. Надо указывать значение одного из дополнительных полей, например description

'Pics.kz upload script for Audica Upload Tool 0.2.1
'Rel. 10-09-26
Option Explicit
Function upload(ByVal filepath)
    Dim p0, p1, s0, mimetype
    WebForm.Action = "http://pics.kz/mini"
    WebForm.Method = "POST"
    WebForm.Enctype = "multipart/form-data"
    Select Case WebForm.PathExt(filepath)
    Case "gif": mimetype = "image/gif"        'GIF image
    Case "jpg", "jpe", "jpeg": mimetype = "image/jpeg"    'JPEG image
    Case "png": mimetype = "image/png"        'PNG image
    Case Else:
        upload = "Error: Imagebin accepts only PNG, JPG, GIF."
        Exit Function
    End Select
    WebForm.AddFile "file_0", filepath, mimetype, True
    WebForm.AddField "description", ""
    'WebForm.AddField "resize_value", ""
    'WebForm.AddField "rotate_value", ""
    'WebForm.AddField "preview_value", ""

    XMLHTTP.Open WebForm.Method, WebForm.Action, True
    XMLHTTP.setRequestHeader "Content-type", WebForm.Enctype
    XMLHTTP.send WebForm.VarBody
    WebForm.WaitForXMLHTTPResponse()
    Select Case XMLHTTP.Status
    Case 200 'OK
        s0 = XMLHTTP.responseText
        p0 = InStr(1, s0, "[img]")
        If p0 Then
            p0 = p0 + 5
            p1 = InStr(p0, s0, "[/img]")
            If p1 > p0 Then _
                upload = Mid(s0, p0, p1 - p0) _
            else upload = "Error: Unparseable response."
        else
            upload = "Error: Unparseable response."
        End If
    Case Else 'Error
        MsgBox XMLHTTP.statusText, vbCritical, XMLHTTP.Status
    End Select
End Function

Я переделывал webform3 для поддержки ассинхронных запросов и маймтайпов, поэтому надо чуть переделать скрипт
WebForm.AddFile "file_0", filepath
XMLHTTP.Open WebForm.Method, WebForm.Action
это выкинуть WebForm.WaitForXMLHTTPResponse()

15

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

kefi, думаю там winhttp как минимум нужен

16 (изменено: Мастеров, 2011-04-28 10:52:32)

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Скрипт грузит текст с сайта:

<job>
<script language="JScript">

    var xxx = WScript.CreateObject("Msxml2.XMLHTTP");
//    xxx.open("GET", "http://qptova.ru/tmp/src.jpg", false);
//    xxx.setRequestHeader('Content-Type', 'Image/Jpeg');
    xxx.open("GET", "http://qptova.ru/tmp/src.txt", false);
//    xxx.setRequestHeader('Content-Type', 'text/html; charset=windows-1251');
    xxx.send();

    var fso = WScript.CreateObject("Scripting.FileSystemObject")
    fso.CreateTextFile("dest.txt",true);
    var f = fso.OpenTextFile("dest.txt", 2, true)
    f.WriteLine(xxx.Responsetext)

</script>
</job>

ПРОБЛЕМА:
1. Грузит только латиницу. (На кириллицу ругается.)
2. Не грузит бинарные файлы.
Подскажите, ПОЖАЛУЙСТА, как мне переделать этот скрипт, чтобы он:
1. Тексты с кириллицей копировал с сайта.
2. Бинарные файлы (jpg) копировал с сайта.

17

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

1)

Мастеров пишет:

1. Грузит только латиницу. (На кириллицу ругается.)

http://forum.script-coding.com/viewtopic.php?id=5711
http://forum.script-coding.com/viewtopic.php?id=997
2)

Мастеров пишет:

2. Не грузит бинарные файлы.
Подскажите, ПОЖАЛУЙСТА, как мне переделать этот скрипт, чтобы он:
1. Тексты с кириллицей копировал с сайта.
2. Бинарные файлы (jpg) копировал с сайта.

http://forum.script-coding.com/viewtopic.php?id=40

Для получения бинарных данных так же можно использовать либо объекты ADODB.Stream либо SAPI.spFileStream, получая данные из свойства ResponseBody объектов XMLHTTP / WinHttpRequest
3) Учимся пользоватьсяпоиском. Очень полезный навык.

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

18 (изменено: Мастеров, 2011-04-28 15:12:52)

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

С кириллицей разобрался:

<job>
<script language="JScript">

    CopyTextFileFromURL("dest.txt","http://qptova.ru/tmp/src2.txt");

    function CopyTextFileFromURL(filename,url){
        save2File(filename,getStrFromByteArr(getByteArrayFromURL(url)));
    }
    function getByteArrayFromURL(url){
        with(WScript.CreateObject("Msxml2.XMLHTTP")){
            open("GET", url, false);
            send();
            return responseBody;
        }
    }
    function getStrFromByteArr(byteArray){
        with(WScript.CreateObject("ADODB.Stream")){
            Type = 1;
            Open();
            Write(byteArray);
            Position = 0;
            Type = 2;
            Charset = "windows-1251";
            return ReadText;
        }
    }
    function save2File(fName,str){
        with(new ActiveXObject("Scripting.FileSystemObject")){
            var f = OpenTextFile(fName,2,true);
            f.Write(str);
            f.Close();
        }
    }
</script>
</job>

Текстовый файл копирует с сайта.
Спасибо.

19 (изменено: Мастеров, 2011-04-28 19:09:23)

Re: VBS, JS: Загрузка файл на хостинг (XMLHTTP)

Этот скрипт копирует любой (текстовый или бинарный) файл:

<job>
<script language="JScript">

CopyFileFromURL("http://qptova.ru/tmp/src.jpg","dest.jpg");

function CopyFileFromURL(url,filename){
    with(WScript.CreateObject("Msxml2.XMLHTTP")){
        open("GET", url, false);
        send();
        saveFileToLocalDisk(responseBody,filename);
    }
}
function saveFileToLocalDisk(byteArray,filename){
    with(WScript.CreateObject("ADODB.Stream")){
        Mode = 3;
        Type = 1;
        Open();
        Write(byteArray);
        SaveToFile(filename,2);
    }
}
</script>
</job>