Что нового

[Сеть, интернет] WebDav - как использовать?

avmaksimov

Новичок
Сообщения
46
Репутация
4
Не могу понять, как правильно их использовать и можно ли, используя стандартные функции вроде TCPSend и TCPRecv ...

Пробовал подключаться и отправлять. Все уходит без проблем, но возвращается пустая строка (пытаюсь использовать API Яндекс.Диска).

Код:
Local $sHeader = 'MKCOL ' & $Folder & ' HTTP/1.1' & @CRLF & _
                'Host: webdav.yandex.ru' & @CRLF & _
                'Accept: */*' & @CRLF & _
                'Authorization: Basic ' & $Tocken & @CRLF & @CRLF

	TCPStartup()
    Local $iSocket = TCPConnect(('213.180.193.53'), 443)
    TCPSend($iSocket, $sHeader)

    Local $sRecv = "777"
	While 1
        $sRecv &= TCPRecv($iSocket, 20000)
        If @error Then ExitLoop
        Sleep(50)
    WEnd

    TCPShutdown()
    Return $sRecv


Всегда возвращается 777, т.е. сразу @error при TCPRecv . Приэтому, @error = -1 .

ip-адрес, взят посредством определения ip-адреса для webdav.yandex.ru .

Может неверно работаю для использования WebDav?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
avmaksimov [?]
пытаюсь использовать API Яндекс.Диска
Получение файла:
Код:
#include <Encoding.au3>

$sUrl = 'https://webdav.yandex.ru/<dir>/<file.ext>'
$sLogin	= '<login>'
$sPass	= '<pass>'
$sToken = _Encoding_Base64Encode($sLogin &':'& $sPass)

$sUserAgent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16'

$oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oHTTP.Open("GET", $sUrl, true)
$oHTTP.SetRequestHeader("User-Agent", $sUserAgent)
$oHTTP.SetRequestHeader("Authorization", 'Basic ' & $sToken)
$oHTTP.SetRequestHeader("Host", "webdav.yandex.ru")
$oHTTP.SetRequestHeader("Accept", "*/*")
;~ $oHTTP.SetRequestHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4")
;~ $oHTTP.SetRequestHeader("Connection", "Keep-Alive")
$oHTTP.Send()
$oHTTP.WaitForResponse()
$sHTML = $oHTTP.ResponseText()

ConsoleWrite('> ------------------------------------ Ответ ------------------------------------ <' & @CR)
ConsoleWrite($sHTML & @CR)
ConsoleWrite('> ------------------------------------ Ответ ------------------------------------ <' & @CR)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Всё прекрасно работает.

Код:
#include <Encoding.au3>

$sUrl = 'https://webdav.yandex.ru/<dir>/<file.ext>' ; грузит файл в <dir> диска
$sLogin = '<login>'
$sPass  = '<pass>'
$sToken = _Encoding_Base64Encode($sLogin &':'& $sPass)
$sUserAgent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16'

$hFile = FileOpen('<path>/<file.ext>', 16)
$bData = FileRead($hFile)
FileClose($hFile)

$sEtag = '<тут md5 сумма файла>'
$sSha256 = '<тут SHA-256 хэш файла>'
$iLen = BinaryLen($bData)

$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("PUT", $sUrl, true)
$oHTTP.SetRequestHeader("Host","webdav.yandex.ru")
$oHTTP.SetRequestHeader("Accept", "*/*")
$oHTTP.SetRequestHeader("Authorization", 'Basic ' & $sToken)
$oHTTP.SetRequestHeader("User-Agent", $sUserAgent)
$oHTTP.SetRequestHeader("Etag", $sEtag)
$oHTTP.SetRequestHeader("Sha256", $sSha256)
$oHTTP.SetRequestHeader("Expect","100-continue")
$oHTTP.SetRequestHeader("Content-Type","application/binary")
$oHTTP.SetRequestHeader("Content-Length", $iLen)
$oHTTP.Send($bData)

$oHTTP.WaitForResponse()
ConsoleWrite('!' & $oHTTP.StatusText &' : ' & $oHTTP.Status & @CRLF)


P.S. kalugin66 Эта тема решена, пожалуйста создавайте новые темы для ваших вопросов.
 

biawraem

Новичок
Сообщения
2
Репутация
0
Не подскажите почему консоль пишет Unauthorized : 401?
В строке $sLogin = '<login>' втавлял как <логин@yandex.ru> так и просто '<логин>'.
Обновил Encoding.au3 , но все та же ошибка.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
biawraem
В строке нужно писать логин
Код:
$sUrl ="https://webdav.yandex.ru/"
$sLogin = "vasya"
$sPass  = "coolpass"
$sToken = _Encoding_Base64Encode($sLogin &':'& $sPass)

Проверьте свой код, может где лишний символ закрался.
 

biawraem

Новичок
Сообщения
2
Репутация
0
Код:
#include <Encoding.au3>

$sUrl ="https://webdav.yandex.ru/"  
$sLogin = '<*******>'
$sPass  = '<*******>'
$sToken = _Encoding_Base64Encode($sLogin &':'& $sPass)
$sUserAgent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16'

$hFile = FileOpen(@ScriptDir&'\file.ext', 16) ; файл для заливки
$bData = FileRead($hFile)
FileClose($hFile)

$sEtag = '<DDF470FE84631C95F82443E59AF3D3E7>'
$sSha256 = '<379C9C1274B93A377CCBE2AAC928190B5BB4DD4C3F4C03B4251BE02C9FB4E558>'
$iLen = BinaryLen($bData)

$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("PUT", $sUrl, true)
$oHTTP.SetRequestHeader("Host","webdav.yandex.ru")
$oHTTP.SetRequestHeader("Accept", "*/*")
$oHTTP.SetRequestHeader("Authorization", 'Basic ' & $sToken)
$oHTTP.SetRequestHeader("User-Agent", $sUserAgent)
$oHTTP.SetRequestHeader("Etag", $sEtag)
$oHTTP.SetRequestHeader("Sha256", $sSha256)
$oHTTP.SetRequestHeader("Expect","100-continue")
$oHTTP.SetRequestHeader("Content-Type","application/binary")
$oHTTP.SetRequestHeader("Content-Length", $iLen)
$oHTTP.Send($bData)

$oHTTP.WaitForResponse()
ConsoleWrite('!' & $oHTTP.StatusText &' : ' & $oHTTP.Status & @CRLF)


Что может быть не правильно? Если просто скопировал код выше и изменил:
$hFile = FileOpen('<path>/<file.ext>', 16) на $hFile = FileOpen(@ScriptDir&'\file.ext', 16)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
biawraem [?]
Что может быть не правильно? Если просто скопировал код выше и изменил
То, что, нужно быть внимательнее!
Код:
#include <Encoding.au3>

$sUrl ="https://webdav.yandex.ru/file.txt"  
$sLogin = 'ваш логин'
$sPass  = 'ваш пароль'
$sToken = _Encoding_Base64Encode($sLogin &':'& $sPass)
$sUserAgent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16'

$hFile = FileOpen(@ScriptDir & '\file.txt', 16) ; файл для заливки
$bData = FileRead($hFile)
FileClose($hFile)

$sEtag = 'DDF470FE84631C95F82443E59AF3D3E7'
$sSha256 = '379C9C1274B93A377CCBE2AAC928190B5BB4DD4C3F4C03B4251BE02C9FB4E558'
$iLen = BinaryLen($bData)
;...

Найдите отличие!
 

mrsoros

Новичок
Сообщения
20
Репутация
0
Garrett
Выложи пожалуйста код скрипта скачивания файла по webdav.
Пробовал использовать то, что в теме. Не получилось.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
mrsoros [?]
Выложи пожалуйста код
Если только вечером.


Добавлено:
Сообщение автоматически объединено:

mrsoros [?]
Пробовал использовать то, что в теме. Не получилось.

Ответ#1
Замените
Код:
;...
$sHTML = $oHTTP.ResponseText()

ConsoleWrite('> ------------------------------------ Ответ ------------------------------------ <' & @CR)
ConsoleWrite($sHTML & @CR)
ConsoleWrite('> ------------------------------------ Ответ ------------------------------------ <' & @CR)
;...


на следующие строки.
Код:
;...
$hFile = FileOpen("filename", 18)
FileWrite($hFile, $oHTTP.ResponseBody())
FileClose($hFile)
;...
 

mrsoros

Новичок
Сообщения
20
Репутация
0
<blockquote class="bbc_standard_quote">Заменить...</blockquote>

Это гениально :laugh:
eto-shedeeevr_39637422_orig_.jpeg


Осталось только придумать как можно наблюдать за процессом скачивания. :idea:
 

mrsoros

Новичок
Сообщения
20
Репутация
0
Разобрался с мониторингом процесса ProcessBar`ом, но качать приходится по 1 mb, но за-то предусмотрел докачку при обрыве соединения.
Если надо функцию, пишите в личку.
 

mrsoros

Новичок
Сообщения
20
Репутация
0
Garrett привет!

Как получить SHA-256 хэш файла для последующей отправки этого файла через
Код:
$oHTTP.Open("PUT", $sUrl, true)

?? :scratch:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
#include "Hash.au3"
ConsoleWrite(StringFormat("> SHA-256: %s\n", StringUpper(_Hash('Admin', 'SHA256'))))
 

Вложения

  • Hash.au3
    3.4 КБ · Просмотры: 11

Skif_off

Знающий
Сообщения
173
Репутация
12
Кто-нибудь может показать, как составить запрос на публикацию файлов и папок и как разобрать ответ? И пояснить, для чего там используется "Content-Length" и что значит его значение? Ещё не понял, как закрывается файл (изменние свойства понять могу, удаление - нет).
Страница документации.
К сожалению, не силён ни в этом объекте, ни в работе с сетью на подобном уровне в целом :(
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Всё оказалось проще, чем казалось, спасибо, что дали возможность самому покопаться :smile: Нужно отправлять XML как оно есть в документации, "Content-Length" - длина и судя по её размеру предполагается, что разделитель строк @CRLF (менять не стал).
Код:
$sUrl = 'https://webdav.yandex.ru/<dir>/<file.ext>'
$sLogin = '<login>'
$sPass  = '<pass>'
$sToken = _Encoding_Base64Encode($sLogin &':'& $sPass)
$sUserAgent = 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'
$sSend = '<propertyupdate xmlns="DAV:">' & @CRLF & _
         '  <set>' & @CRLF & _
         '    <prop>' & @CRLF & _
         '      <public_url xmlns="urn:yandex:disk:meta">true</public_url>' & @CRLF & _
         '    </prop>' & @CRLF & _
         '  </set>' & @CRLF & _
         '</propertyupdate>'

$oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oHTTP.Open("PROPPATCH", $sUrl, true)
$oHTTP.SetRequestHeader("User-Agent", $sUserAgent)
$oHTTP.SetRequestHeader("Authorization", 'Basic ' & $sToken)
$oHTTP.SetRequestHeader("Host", "webdav.yandex.ru")
$oHTTP.SetRequestHeader("Accept", "*/*")
$oHTTP.SetRequestHeader("Content-Length", 158)
$oHTTP.Send($sSend)
$oHTTP.WaitForResponse()

Далее - разбирать $oHTTP.ResponseText.
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Если кому интересно: дополнение для работы с Яндекс.диск для использования с файловыми менеджерами Total Commander и Double Commander и плагином WebDAV. Работает с выделенными файлами/папками: позволяет удалять, публиковать, закрывать публичные, проверять, открыты ли. Во втором и четвёртом случае показывает окно с результатом - ссылку(и) можно скопировать как есть или оформить: HTML (тег a) или BBcode (тег url).
Дополнительно может показать занятый и доступный размеры облака.

P.S. Хотя, когда начинаешь пользоваться "WinHttp.WinHttpRequest.5.1", то этот объект уже не кажется таким сложным ;)
 
Верх