Войти

Показать полную графическую версию : Как автоматически заливать изображения на обменники картинок?


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

Creat0R
16-02-2010, 19:30
Вот тут есть решение: Нужна помощь с ImageShack API (http://autoit-script.ru/index.php?topic=860.msg6110#msg6110)

evg64
21-02-2010, 22:09
Спасибо! Работает!)

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

Creat0R
26-02-2010, 21:59
Если нужно загружать изображения на обменники, примеров к которым нет в теме, где искать на их сайте параметр Action, чтобы вставить его в DllCall? »
В исходнике страницы, обычно в форме где есть «multipart/form-data» (значение «action=»).

Dll позволяет загружать на любые обменники картинок или только на те, где есть API? »
Вроде на те которые поддерживают «multipart/form-data».

Можно ли написать скрипт для згрузок на FastPic.ru? »
У меня не получается, видимо там стоит защита от подобных закачек:

Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $Ret = DllCall (http://www.autoitscript.com/autoit3/docs/functions/DllCall.htm)(@ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ScriptDir) & "\UploadFile.dll", _
"str", "UploadFile", _
"str", "http://fastpic.ru/upload", _ ;Action
"str", "file1", _ ;Form Name
"str", "image/" & StringRight (http://www.autoitscript.com/autoit3/docs/functions/StringRight.htm)($sFile, 3), _ ;Content-Type
"str", $sFile) ;File path

ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)($Ret[0] & @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@LF))

evg64
27-02-2010, 19:23
Хмм, кроме 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
evg64 - лучше выучить схему отправки файлов через POST запрос на сервер и отсылать картинку через сокет, но это долгое занятие - у меня лично нет времени сидеть и парсить полученные данные с десятка картинко-обменников через снифер, так что сорри :not-me:

Creat0R
27-02-2010, 22:19
Проблема в том, что в DllCall подставлены неправильные аргументы, или в том, что Dll неспособна работать с этими обменниками картинок? »
И то и другое. В первом случае я вообще не вижу имя формы, mainform это id а не имя.

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

evg64
27-02-2010, 22:30
лучше выучить схему отправки файлов через POST запрос на сервер »
Я скачивал демо-версии пары снифферов и в них смотрел, как проходит "общение" между компом и сервером при авторизации на некоторых сайтах. В итоге удавалось "научить" скрипты авторизовываться на сайте и получать исходник страницы. Проблема в том, что срок демок истек, а кряки к ним я не нашел.
P.S. Гипотетически можно найти еще 1 сниффер или кряку, однако перед этим нужно решить другую проблему:
отсылать картинку через сокет »
Я этим ни разу не занимался. Что для этого нужно? Что вбить в гугл, чтобы почитать об этом подробнее (не про сокеты вообще, а что-то ближе к данной задаче - отправке картинки через сокеты)? :)
mainform это id а не имя »
Ой, а я полагал, что ID - и есть имя формы. Оно там, похоже, не указано. На случай, если я ошибаюсь: можно ли получить имя формы, имея указатель на нее, полученный через _IEFormGetCollection?

Creat0R
27-02-2010, 22:40
Проблема в том, что срок демок истек, а кряки к ним я не нашел »
Предупреждение за нарушение общих правил форума, пункт 3.18:
Обсуждать средства превращения лицензионного
программного обеспечения в нелицензионное. Публиковать ссылки на сайты (или прямые ссылки на файлы), которые содержат такие средства или программы, не распространяемые разработчиком публично (т.н. warez, кряки,
серийные номера, генераторы серийных номеров, нелегальные способы активации системы и т. п.)

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

Sp01LeR
28-02-2010, 00:42
Многие пробовали, и ни у кого ничего не вышло, autoit просто не создан для этого »

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

Я скачивал демо-версии пары снифферов »
Какой толк качать демо, если есть фришный комбайн WireShark (http://www.wireshark.org/download.html) - там WinPcap (http://www.winpcap.org/install/default.htm) в комплекте

Что вбить в гугл, чтобы почитать об этом подробнее »
Ничего вбивать не надо - есть хорошее описание на ru.wiki (http://ru.wikipedia.org/w/index.php?title=HTTP&stable=1#.D0.9C.D0.BD.D0.BE.D0.B6.D0.B5.D1.81.D1.82.D0.B2.D0.B5.D0.BD.D0.BD.D0.BE.D0.B5_.D1.81.D0.BE .D0.B4.D0.B5.D1.80.D0.B6.D0.B8.D0.BC.D0.BE.D0.B5)

Creat0R
28-02-2010, 02:03
autoit не может быть "просто не создан для этого", так как использует стандартную либу wsock32.dll для функций работы с сокетами »
В теорий всё хорошо, на практике всё иначе ;).

Creat0R
28-02-2010, 02:34
Вот что получилось на основе информаций с 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
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1") »
хех, я имел ввиду не отправку через обьект "winhttp", а напрямую через функции работы с сокетами - TCPSend() и TCPRecv() - это самый надежный способ...
файл заливается, но не очень корректно »
возможно, что неправильный реальный размер $sPost_Data в байтах, там нулевой байт(0x00) тоже должен учитыватся...
Цитата(источник: http://frolov-lib.ru/programming/articles/upload/index.html):

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

Creat0R
28-02-2010, 19:53
я имел ввиду не отправку через обьект "winhttp", а напрямую через функции работы с сокетами - TCPSend() и TCPRecv() - это самый надежный способ »
На данный момент разницы особой нету, если оно сработает с «winhttp» то переписать под TCP будет не сложно.

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

Sp01LeR
28-02-2010, 20:38
#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 байта...

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

Creat0R
28-02-2010, 23:49
простым чтением FileOpen($sFile, 0) из GIF-картинки пропадало 2 байта »
У меня тут png, и размеры совпадают, т.ч проблема не в этом.

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




© OSzone.net 2001-2012