Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Как автоматически заливать изображения на обменники картинок? (http://forum.oszone.net/showthread.php?t=167569)

evg64 16-02-2010 19:03 1348780

Как автоматически заливать изображения на обменники картинок?
 
Добрый день! Допустим, на жестком диске есть 3 изображения ($sPicturePath1, $sPicturePath2, $sPicturePath3). Как средствами AutoIt загрузить их на один из обменников картинок? Пусть обменник будет http://ambrybox.com.
Можно, конечно, открыть сайт в IE и используя функции из IE.au3 написать скрипт, который будет одну за одной нажимать все кнопочки и проставлять все галочки, где надо. Однако дело это неблагодарное (то кнопочка не нажмется, то IE зависнет, то еще что-нибудь), да и скрипт получится громоздкий. Есть ли более рациональный вариант?
P.S. Не исключаю, что AutoIt - не лучшая среда для реализации подобных задач (хотя не знаю точно). Если так, то на чем лучше заниматься такими вещами?

Creat0R 16-02-2010 19:30 1348802

Вот тут есть решение: Нужна помощь с ImageShack API

evg64 21-02-2010 22:09 1352867

Спасибо! Работает!)

Цитата:

Local $Ret = DllCall(@ScriptDir & "\UploadFile.dll", _
"str", "UploadFile", _
"str", "http://www.imageshack.us/upload_api.php", _ ;Action
"str", "fileupload", _ ;Form Name
"str", "image/" & $sType, _ ;Content-Type
"str", $sFile) ;File path
Если нужно загружать изображения на обменники, примеров к которым нет в теме, где искать на их сайте параметр Action, чтобы вставить его в DllCall?

evg64 26-02-2010 20:59 1356793

Тема, вверх! )
Dll позволяет загружать на любые обменники картинок или только на те, где есть API? Можно ли написать скрипт для згрузок на FastPic.ru?

Creat0R 26-02-2010 21:59 1356862

Цитата:

Цитата evg64
Если нужно загружать изображения на обменники, примеров к которым нет в теме, где искать на их сайте параметр Action, чтобы вставить его в DllCall? »

В исходнике страницы, обычно в форме где есть «multipart/form-data» (значение «action=»).

Цитата:

Цитата evg64
Dll позволяет загружать на любые обменники картинок или только на те, где есть API? »

Вроде на те которые поддерживают «multipart/form-data».

Цитата:

Цитата evg64
Можно ли написать скрипт для згрузок на FastPic.ru? »

У меня не получается, видимо там стоит защита от подобных закачек:

Код:

Local $Ret = DllCall(@ScriptDir & "\UploadFile.dll", _
        "str", "UploadFile", _
        "str", "http://fastpic.ru/upload", _ ;Action
        "str", "file1", _ ;Form Name
        "str", "image/" & StringRight($sFile, 3), _ ;Content-Type
        "str", $sFile) ;File path

ConsoleWrite($Ret[0] & @LF)


evg64 27-02-2010 19:23 1357573

Хмм, кроме FastPic.ru пробовал настроить закачку на еще 2 обменника картинок:
1) pixshock.net
Код:

$Ret = DllCall(@ScriptDir & "\UploadFile.dll", _
        "str", "UploadFile", _
        "str", "http://www.pixshock.net/upfileim.html", _ ;Action
        "str", "mainform", _ ;Form Name
        "str", "image/" & StringRight($sFile, 3), _ ;Content-Type
        "str", $sFile) ;File path

$sFile=@DesktopDir & '\UploadImages.html'
$hFile=FileOpen($sFile,2)
FileWrite($hFile,$Ret[0])
FileClose($hFile)
ShellExecuteWait($sFile)
FileDelete($sFile)


2) imagevenue.com
Код:

$Ret = DllCall(@ScriptDir & "\UploadFile.dll", _
        "str", "UploadFile", _
        "str", "http://imagevenue.com/upload.php", _ ;Action
        "str", "uploadmain", _ ;Form Name
        "str", "image/" & StringRight($sFile, 3), _ ;Content-Type
        "str", $sFile) ;File path

$sFile=@DesktopDir & '\UploadImages.html'
$hFile=FileOpen($sFile,2)
FileWrite($hFile,$Ret[0])
FileClose($hFile)
ShellExecuteWait($sFile)
FileDelete($sFile)

В обоих случаях по идее ссылка на картинку должна содержаться в $Ret[0], однако в первом случае получал ошибку 400 (Bad request), во втором - некий HTML (типа ответ сервера), в котором ссылки не содержалось. Проблема в том, что в DllCall подставлены неправильные аргументы, или в том, что Dll неспособна работать с этими обменниками картинок?

Sp01LeR 27-02-2010 21:08 1357640

evg64 - лучше выучить схему отправки файлов через POST запрос на сервер и отсылать картинку через сокет, но это долгое занятие - у меня лично нет времени сидеть и парсить полученные данные с десятка картинко-обменников через снифер, так что сорри :not-me:

Creat0R 27-02-2010 22:19 1357692

Цитата:

Цитата evg64
Проблема в том, что в DllCall подставлены неправильные аргументы, или в том, что Dll неспособна работать с этими обменниками картинок? »

И то и другое. В первом случае я вообще не вижу имя формы, mainform это id а не имя.

Цитата:

Цитата Sp01LeR
лучше выучить схему отправки файлов через POST запрос на сервер и отсылать картинку через сокет, но это долгое занятие »

Многие пробовали, и ни у кого ничего не вышло, autoit просто не создан для этого :)
Буду рад ошибаться.

evg64 27-02-2010 22:30 1357704

Цитата:

Цитата Sp01LeR
лучше выучить схему отправки файлов через POST запрос на сервер »

Я скачивал демо-версии пары снифферов и в них смотрел, как проходит "общение" между компом и сервером при авторизации на некоторых сайтах. В итоге удавалось "научить" скрипты авторизовываться на сайте и получать исходник страницы. Проблема в том, что срок демок истек, а кряки к ним я не нашел.
P.S. Гипотетически можно найти еще 1 сниффер или кряку, однако перед этим нужно решить другую проблему:
Цитата:

Цитата Sp01LeR
отсылать картинку через сокет »

Я этим ни разу не занимался. Что для этого нужно? Что вбить в гугл, чтобы почитать об этом подробнее (не про сокеты вообще, а что-то ближе к данной задаче - отправке картинки через сокеты)? :)
Цитата:

Цитата Creat0R
mainform это id а не имя »

Ой, а я полагал, что ID - и есть имя формы. Оно там, похоже, не указано. На случай, если я ошибаюсь: можно ли получить имя формы, имея указатель на нее, полученный через _IEFormGetCollection?

Creat0R 27-02-2010 22:40 1357715

Цитата:

Цитата evg64
Проблема в том, что срок демок истек, а кряки к ним я не нашел »

Предупреждение за нарушение общих правил форума, пункт 3.18:
Цитата:

Обсуждать средства превращения лицензионного
программного обеспечения в нелицензионное. Публиковать ссылки на сайты (или прямые ссылки на файлы), которые содержат такие средства или программы, не распространяемые разработчиком публично
(т.н. warez, кряки,
серийные номера, генераторы серийных номеров, нелегальные способы активации системы и т. п.)
Цитата:

Цитата evg64
можно ли получить имя формы »

Нет, т.к оно не указано, обычно оставляется пустая строка, но т.к дизайнеры сайта не предусмотрели эту опцию, залить на этот сервис будет не просто (проще с ними поообщаться :) ).

Sp01LeR 28-02-2010 00:42 1357788

Цитата:

Цитата Creat0R
Многие пробовали, и ни у кого ничего не вышло, autoit просто не создан для этого »

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

Цитата:

Цитата evg64
Я скачивал демо-версии пары снифферов »

Какой толк качать демо, если есть фришный комбайн WireShark - там WinPcap в комплекте

Цитата:

Цитата evg64
Что вбить в гугл, чтобы почитать об этом подробнее »

Ничего вбивать не надо - есть хорошее описание на ru.wiki

Creat0R 28-02-2010 02:03 1357821

Цитата:

Цитата Sp01LeR
autoit не может быть "просто не создан для этого", так как использует стандартную либу wsock32.dll для функций работы с сокетами »

В теорий всё хорошо, на практике всё иначе ;).

Creat0R 28-02-2010 02:34 1357831

Вот что получилось на основе информаций с wiki:

Код:

Test()

Func Test()
    $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")

    $sBoundary = Hex(Random(1, 2^30, 1), 8) & '_Synapse_boundary'

    $sFile = @ScriptDir & "\test.png"
    $sServer = "http://turboupload.com/cgi-bin/upload.cgi?upload_id="

    $sFileName = StringRegExpReplace($sFile, "^.*\\", "")
    $sFileExt = StringRegExpReplace($sFile, "^.*\.", "")
    $sHost = StringRegExpReplace($sServer, "http://(.*?)/.*", "\1")

    $hFile = FileOpen($sFile, 16)
    $sReadFile = StringTrimLeft(FileRead($hFile), 2)
    FileClose($hFile)

    $sPost_Data = ""
    $sPost_Data &= "--" & $sBoundary & @CRLF
    $sPost_Data &= 'Content-Disposition: form-data; name="file"; filename="' & $sFileName & '"' & @CRLF
    $sPost_Data &= 'Content-Type: image/' & $sFileExt & @CRLF & @CRLF & @CRLF
    $sPost_Data &= $sReadFile & @CRLF
    $sPost_Data &= "--" & $sBoundary & @CRLF

    $oHTTP.Open("POST", $sServer)
    $oHTTP.setTimeouts(5000, 5000, 15000, 15000)
    $oHTTP.SetRequestHeader("Host", $sHost)
    $oHTTP.SetRequestHeader("Referer", $sServer)
    $oHTTP.SetRequestHeader("User-Agent", "AutoIt/3")
    $oHTTP.SetRequestHeader("Content-Type", 'multipart/form-data; boundary="' & $sBoundary & '"')
    $oHTTP.SetRequestHeader("Content-Length", StringLen($sPost_Data))

    $oHTTP.Send($sPost_Data)
    $oHTTP.WaitForResponse

    If Not @error Then
        $sResponse = $oHTTP.Responsetext
        ConsoleWrite($sResponse)
        ShellExecute(StringRegExpReplace($sResponse, "(?s).*(http://.*)\n.*", "\1"))
    EndIf
EndFunc

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

Sp01LeR 28-02-2010 18:06 1358203

Цитата:

Цитата Creat0R
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1") »

хех, я имел ввиду не отправку через обьект "winhttp", а напрямую через функции работы с сокетами - TCPSend() и TCPRecv() - это самый надежный способ...
Цитата:

Цитата Creat0R
файл заливается, но не очень корректно »

возможно, что неправильный реальный размер $sPost_Data в байтах, там нулевой байт(0x00) тоже должен учитыватся...
Цитата(источник: http://frolov-lib.ru/programming/art...oad/index.html):
Цитата:

Извлечение текстовых данных и файлов из полей формы следует выполнять в цикле. Соответствующий алгоритм должен применять бинарное сравнение для поиска разделителей, например при помощи функции memcpi. Заметим, что использование функции сравнения текстовых строк strcpi не приведет к успеху, так как в теле принятых файлов могут находиться нулевые байты.

Creat0R 28-02-2010 19:53 1358260

Цитата:

Цитата Sp01LeR
я имел ввиду не отправку через обьект "winhttp", а напрямую через функции работы с сокетами - TCPSend() и TCPRecv() - это самый надежный способ »

На данный момент разницы особой нету, если оно сработает с «winhttp» то переписать под TCP будет не сложно.

Цитата:

Цитата Sp01LeR
возможно, что неправильный реальный размер $sPost_Data в байтах, там нулевой байт(0x00) тоже должен учитыватся... »

Пробовал по разному, размер файл вообще в два раза больше почему то, даже если указать его реальный размер.

Sp01LeR 28-02-2010 20:38 1358292

Код:

#include <string.au3>
$sFile = "твоя картинка"
$size = FileGetSize($sFile)
$hFile = FileOpen($sFile, 16)
    $sReadFile = StringTrimLeft(FileRead($hFile), 2)
FileClose($hFile)
$sReadFile=_HexToString($sReadFile)
MsgBox(0, "Оригинальный размер:", $size, 45)
MsgBox(0, "Размер $sReadFile:", StringLen($ReadFile), 45)
MsgBox(0, "Начальные байты:", $sReadFile, 45)

простым чтением FileOpen($sFile, 0) из GIF-картинки пропадало 2 байта...

Цитата:

Цитата Creat0R
На данный момент разницы особой нету, если оно сработает с «winhttp» то переписать под TCP будет не сложно. »

лучше сразу писать под TCP - через wsock32.dll передача больших обьемов данных побыстрее будет, если хочешь - сравни передачу файла весом 5-7mb через сокет и через обьект winhttp..

Creat0R 28-02-2010 23:49 1358434

Цитата:

Цитата Sp01LeR
простым чтением FileOpen($sFile, 0) из GIF-картинки пропадало 2 байта »

У меня тут png, и размеры совпадают, т.ч проблема не в этом.

Цитата:

Цитата Sp01LeR
лучше сразу писать под TCP - через wsock32.dll передача больших обьемов данных побыстрее будет »

Я не за скоростью гонюсь (пока), мне лично нужен рабочий вариант, чтобы не использовать dll'ку.


Время: 18:13.

Время: 18:13.
© OSzone.net 2001-