Что нового

[Сеть, интернет] Скачать капчу с динамическим именем

drugsextra

Новичок
Сообщения
11
Репутация
0
Скрипт доходит до страницы с капчой. Выполняется скрипт через библеотеку #include <IE.au3>. Надо её скачать , но имя постоянно меняется. Остается неизменной только первая часть: CaptchaType.ashx?id=
Вторая часть1f9982c8-a61e-45e8-9317-3fc1f6151d06 меняется.
Собственно код:
Код:
<img style="border-width: 0px;" id="Captcha" src="../CaptchaType.ashx?id=1f9982c8-a61e-45e8-9317-3fc1f6151d06">
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Ну можешь ее спарсить через
Код:
StringRegExp

c паттерном
Код:
'\QCaptcha\E.*?\Qsrc\E\s*=[\s"' & "']*([^<>\r\n'" & '"]+)'



на выходе будет ../CaptchaType.ashx?id=1f9982c8-a61e-45e8-9317-3fc1f6151d06
 
Автор
D

drugsextra

Новичок
Сообщения
11
Репутация
0
:stars: Сорри за тупость, я только начинаю, но для мне пока это абра-кадабра. Можно немного расписать? Как правильно спарсить ссылку и скачать её
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
В библиотеке IE.au3 есть функция
Код:
_IEDocReadHTML
, которая запишет в переменную содержание твоей страницы.

Например,
Код:
#include <IE.au3>

Local $oIE = _IECreate("адрес страницы")
Local $sHTML = _IEDocReadHTML($oIE)


$sHTML - тут вся страница.

Дальше ищешь с помощью StringRegExp твою ссылку.

Код:
$pattern = '\QCaptcha\E.*?\Qsrc\E\s*=[\s"' & "']*([^<>\r\n'" & '"]+)'
$aString=StringRegExp ( $sHTML, $pattern ,1 )


если ссылка нашлась (тут проверишь на ошибку после StringRegExp)

то она будет в нулевом элементе массива $aString

Скачать ее сможешь с помощью
Код:
InetGet


Код:
InetGet ($aString[0],"C:\downloads" )



(только нужно получить абсолютный путь к src капчи)
 
Автор
D

drugsextra

Новичок
Сообщения
11
Репутация
0
Вроде почти получилось (6 чувство :smile:), ошибок не выдает, но скачивание не происходит. Остался вопрос с абсолютным путём к капче. Через эксплорер пишет путь https://test.com/CaptchaType.ashx?id=8c7a3854-e6c1-4e14-9a5c-0ebe7b100b29. Как после https://test.com/CaptchaType.ashx?id= вставить код который спарсила команда
Код:
StringRegExp
.
Может я что-то путаю :scratch:. Поправьте
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Тебе надо вместо 2 точек вставить полный путь к каталогу с CaptchaType.ashx

Можешь попробывать так:
Код:
InetGet ("https://test.com"&StringTrimLeft($aString[0],2),"C:\downloads" )
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
drugsextra
Посмотрите, что покажет.
Код:
;...
$oCaptcha = _IEGetObjById($oIE, 'Captcha')
;ConsoleWrite($oCaptcha.src & @LF)
MsgBox(64, 'Info', $oCaptcha.src)
;...
 
Автор
D

drugsextra

Новичок
Сообщения
11
Репутация
0
Код:
InetGet ("https://test.com"&StringTrimLeft($aString[0],2),"C:\downloads" )


К сожалению это не помогло..всё проходит без ошибок, но папка пуста...
Я тут ради теста использовал команду вывода всех картинок на моей странице
Код:
$oIE = _IECreate ("http://www.autoitscript.com/")
$oImgs = _IEImgGetCollection ($oIE)
$iNumImg = @extended
MsgBox(0, "Img Info", "There are " & $iNumImg & " images on the page")
For $oImg In $oImgs
    MsgBox(0, "Img Info", "src=" & $oImg.src)
Next

Показало что есть 6 картинок и их пути...


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

Код:
$oCaptcha = _IEGetObjById($oIE, 'Captcha')
;ConsoleWrite($oCaptcha.src & @LF)
MsgBox(64, 'Info', $oCaptcha.src)

Если так то выдает ошибку: Warning from function _IEGetObjById, $_IEStatus_NoMatch (Captcha)
 
Автор
D

drugsextra

Новичок
Сообщения
11
Репутация
0
Вчера вечером мозг закипел так немного неправильно сделал...
вообщем вариант madmasles показал инфо табличку с полным путем к капче :scratch:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
drugsextra,
Код:
$oCaptcha.nameProp ;имя файла
 
Автор
D

drugsextra

Новичок
Сообщения
11
Репутация
0
Сделал вот так, но все равно тупик:
Код:
$oIE = _IECreate ("https://site.com", 1)
$oCaptcha = _IEGetObjById ($oIE, 'Captcha')
MsgBox(64, 'Info', $oCaptcha.src)  ; выладо табличку с линком на капчу
InetGet ($oCaptcha.nameProp,"d:\555" ) ; в папке пусто



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

Да еще не могу найти инфу про .src и .nameProp что это такое и откуда берется? Если можно линк, либо так обьяснить


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

Изменил строку
Код:
InetGet ("https://site.com" & $oCaptcha.nameProp, "d:\555" )

не помогло
 
Автор
D

drugsextra

Новичок
Сообщения
11
Репутация
0
Буду разбираться. Если решу то отпишусь тут.
 
Автор
D

drugsextra

Новичок
Сообщения
11
Репутация
0
Вообщем, ситуация такая: мой сайт работает с куками, и поэтому InetGEt не может скачать мою капчу. Читал много статей, и нарисовалось несколько вариантов:
1. Сделать скриншот капчи и сохранить в файл ( не подходит т.к. скрипт должен работать автономно, не мешая мне)
2. Передача кук (вариант теоретичности возможен, но решения пока не нашел)
3. Посоветовали забрать капчу через TCP (Вариант отличный, но для меня это просто темный лес, и в силу моих знаний я закопаюсь по горло).
4. И вот наконец в мою голову пришла простая мысль - темпы.

И в самом деле, капча скачивается в темпы эксплорера Temporary Internet Files.
Теперь возник вопрос поиска файлов в подпапках директории Temporary Internet Files, по шалбону и времени создания файла.

В директории Temporary Internet Files создаются рандомные папки (5EAOSJDL, P5FC5A0E и т.д.), надо сделать в них поиск файла CaptchaType???.bmp, у которого будет самая свежая дата создания. И после скачивался в папку скрипта
Выручайте. Искал по форуму о поиске файлов.....Много скриптов но переделать под себя не смог... :(
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
drugsextra
Могу показать более сложный способ скачать картинку с сайта. Только тебе нужно с официального форума autoIt скачать WinINet.au3

Код:
#include "WinINet.au3"

Local $User_Agent = "AutoIt/" & @AutoItVersion
Local $sURIScheme = $INTERNET_SERVICE_HTTP
$sServerName = "img.tyt.by"
$hInternetOpen = _WinINet_InternetOpen($User_Agent)
$hInternetConnect = _WinINet_InternetConnect($hInternetOpen, $sURIScheme, $sServerName)

$hOpenRequest = _WinINet_HttpOpenRequest($hInternetConnect, "GET", "/321x240c/n/0b/2/korea_razval.jpg")
$SendRequest = _WinINet_HttpSendRequest($hOpenRequest, Default, Default)

Local $readfile = Binary("")
Do
	$readfile &= _WinINet_InternetReadFile($hOpenRequest, 5000)
Until @error Or Not @extended

$h_file=FileOpen("korea_razval.jpg",2+16)
FileWrite($h_file,$readfile)
FileClose($h_file)

_WinINet_InternetCloseHandle($hOpenRequest)
_WinINet_InternetCloseHandle($hInternetConnect)
_WinINet_InternetCloseHandle($hInternetOpen)
_WinINet_Shutdown()


Я думаю как получить ссылку на картинку и имя файла ты уже разобрался ;)
(только один момент: если будешь скачивать капчи с https сайтов - этот код нужно немного менять)


P.S Я вот тоже не могу понять, почему в IE библиотеке среди большого выбора функций нету таких которые скачивают картинки...
 
Автор
D

drugsextra

Новичок
Сообщения
11
Репутация
0
Очень интересно :laugh:, думаю этот вариант будет то что надо - без всяких танцев с бубном.
Подскажи плиз где можно описания найти WinINet.au3, на форуме не нашел.
Качать буду с HTTPS
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
http://msdn.microsoft.com/en-us/library/windows/desktop/aa385331(v=vs.85).aspx - описание

Если Https то добавляешь/меняешь в нужных местах следующий код
Код:
Local $iServerPort = $INTERNET_DEFAULT_HTTPS_PORT
$hInternetConnect = _WinINet_InternetConnect($hInternetOpen, $sURIScheme, $sServerName, $iServerPort)

$hOpenRequest = _WinINet_HttpOpenRequest($hInternetConnect, "GET", "тут ссылка на нужный ресурс относительно servername", $INTERNET_FLAG_SECURE + $SECURITY_FLAG_IGNORE_CERT_DATE_INVALID)
 
Верх