Показать полную графическую версию : Как автоматически заливать изображения на обменники картинок?
Добрый день! Допустим, на жестком диске есть 3 изображения ($sPicturePath1, $sPicturePath2, $sPicturePath3). Как средствами AutoIt загрузить их на один из обменников картинок? Пусть обменник будет http://ambrybox.com.
Можно, конечно, открыть сайт в IE и используя функции из IE.au3 написать скрипт, который будет одну за одной нажимать все кнопочки и проставлять все галочки, где надо. Однако дело это неблагодарное (то кнопочка не нажмется, то IE зависнет, то еще что-нибудь), да и скрипт получится громоздкий. Есть ли более рациональный вариант?
P.S. Не исключаю, что AutoIt - не лучшая среда для реализации подобных задач (хотя не знаю точно). Если так, то на чем лучше заниматься такими вещами?
Вот тут есть решение: Нужна помощь с ImageShack API (http://autoit-script.ru/index.php?topic=860.msg6110#msg6110)
Спасибо! Работает!)
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?
Тема, вверх! )
Dll позволяет загружать на любые обменники картинок или только на те, где есть API? Можно ли написать скрипт для згрузок на FastPic.ru?
Если нужно загружать изображения на обменники, примеров к которым нет в теме, где искать на их сайте параметр 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))
Хмм, кроме 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 неспособна работать с этими обменниками картинок?
evg64 - лучше выучить схему отправки файлов через POST запрос на сервер и отсылать картинку через сокет, но это долгое занятие - у меня лично нет времени сидеть и парсить полученные данные с десятка картинко-обменников через снифер, так что сорри :not-me:
Проблема в том, что в DllCall подставлены неправильные аргументы, или в том, что Dll неспособна работать с этими обменниками картинок? »
И то и другое. В первом случае я вообще не вижу имя формы, mainform это id а не имя.
лучше выучить схему отправки файлов через POST запрос на сервер и отсылать картинку через сокет, но это долгое занятие »
Многие пробовали, и ни у кого ничего не вышло, autoit просто не создан для этого :)
Буду рад ошибаться.
лучше выучить схему отправки файлов через POST запрос на сервер »
Я скачивал демо-версии пары снифферов и в них смотрел, как проходит "общение" между компом и сервером при авторизации на некоторых сайтах. В итоге удавалось "научить" скрипты авторизовываться на сайте и получать исходник страницы. Проблема в том, что срок демок истек, а кряки к ним я не нашел.
P.S. Гипотетически можно найти еще 1 сниффер или кряку, однако перед этим нужно решить другую проблему:
отсылать картинку через сокет »
Я этим ни разу не занимался. Что для этого нужно? Что вбить в гугл, чтобы почитать об этом подробнее (не про сокеты вообще, а что-то ближе к данной задаче - отправке картинки через сокеты)? :)
mainform это id а не имя »
Ой, а я полагал, что ID - и есть имя формы. Оно там, похоже, не указано. На случай, если я ошибаюсь: можно ли получить имя формы, имея указатель на нее, полученный через _IEFormGetCollection?
Проблема в том, что срок демок истек, а кряки к ним я не нашел »
Предупреждение за нарушение общих правил форума, пункт 3.18:
Обсуждать средства превращения лицензионного
программного обеспечения в нелицензионное. Публиковать ссылки на сайты (или прямые ссылки на файлы), которые содержат такие средства или программы, не распространяемые разработчиком публично (т.н. warez, кряки,
серийные номера, генераторы серийных номеров, нелегальные способы активации системы и т. п.)
можно ли получить имя формы »
Нет, т.к оно не указано, обычно оставляется пустая строка, но т.к дизайнеры сайта не предусмотрели эту опцию, залить на этот сервис будет не просто (проще с ними поообщаться :) ).
Многие пробовали, и ни у кого ничего не вышло, 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)
autoit не может быть "просто не создан для этого", так как использует стандартную либу wsock32.dll для функций работы с сокетами »
В теорий всё хорошо, на практике всё иначе ;).
Вот что получилось на основе информаций с 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
файл заливается, но не очень корректно, видимо нужно найти способ получше для передачи в бинарном виде...
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1") »
хех, я имел ввиду не отправку через обьект "winhttp", а напрямую через функции работы с сокетами - TCPSend() и TCPRecv() - это самый надежный способ...
файл заливается, но не очень корректно »
возможно, что неправильный реальный размер $sPost_Data в байтах, там нулевой байт(0x00) тоже должен учитыватся...
Цитата(источник: http://frolov-lib.ru/programming/articles/upload/index.html):
Извлечение текстовых данных и файлов из полей формы следует выполнять в цикле. Соответствующий алгоритм должен применять бинарное сравнение для поиска разделителей, например при помощи функции memcpi. Заметим, что использование функции сравнения текстовых строк strcpi не приведет к успеху, так как в теле принятых файлов могут находиться нулевые байты.
я имел ввиду не отправку через обьект "winhttp", а напрямую через функции работы с сокетами - TCPSend() и TCPRecv() - это самый надежный способ »
На данный момент разницы особой нету, если оно сработает с «winhttp» то переписать под TCP будет не сложно.
возможно, что неправильный реальный размер $sPost_Data в байтах, там нулевой байт(0x00) тоже должен учитыватся... »
Пробовал по разному, размер файл вообще в два раза больше почему то, даже если указать его реальный размер.
#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..
простым чтением FileOpen($sFile, 0) из GIF-картинки пропадало 2 байта »
У меня тут png, и размеры совпадают, т.ч проблема не в этом.
лучше сразу писать под TCP - через wsock32.dll передача больших обьемов данных побыстрее будет »
Я не за скоростью гонюсь (пока), мне лично нужен рабочий вариант, чтобы не использовать dll'ку.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.