Что нового

собрать в IE из 16 картинок одну

Trans

Знающий
Сообщения
257
Репутация
6
Ребят кто подкиньте пожалуйста мысль, как собрать каптчу из 16 картинок в одну...
Скриншот по относительным координатам не подходит :(

Код:
        <tr><td style="padding:0px"><img src="captcha_view.php?num=00&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=10&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=20&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=30&amp;uni=1319145689" border="0" /></td></tr><tr><td style="padding:0px"><img src="captcha_view.php?num=01&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=11&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=21&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=31&amp;uni=1319145689" border="0" /></td></tr><tr><td style="padding:0px"><img src="captcha_view.php?num=02&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=12&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=22&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=32&amp;uni=1319145689" border="0" /></td></tr><tr><td style="padding:0px"><img src="captcha_view.php?num=03&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=13&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=23&amp;uni=1319145689" border="0" /></td><td style="padding:0px"><img src="captcha_view.php?num=33&amp;uni=1319145689" border="0" /></td></tr>        </table>

Под сполером хтмл код картинок:smile:
 

eropov

Jury
Сообщения
195
Репутация
25
Можно перебирать src в цикле до нужной тебе или находить нужную по num=(10) используй библиотеку IE
 
Автор
T

Trans

Знающий
Сообщения
257
Репутация
6
eropov [?]
Можно перебирать src в цикле до нужной
не подойдёт это, сама каптча сделана из 16 картинок, вот надо придумать, как скачать полностью картинку, чтоб потом отправить на обработку...
Есть затея вывести на GUI, затем сделать скриншот и его отправлять на обработку, но как бы вывести их на GUI, чтоб после каждой загрузки каптчи, они обновлялись:smile:
 

eropov

Jury
Сообщения
195
Репутация
25
Можно и на GUI вывести, но картинки нужно собирать через IE, для начала
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Trans,
С Вашим кодом картинок у меня так работает (без проверок на ошибки) (IE8). То, что получаю, прикрепил.
Код:
#include <IE.au3>
#include <Array.au3>
#include <ScreenCapture.au3>

Dim $aResult[1][5] = [['', 'browserx', 'browsery', 'width', 'height']]
$iCount = 0
$oIE = _IECreate(@ScriptDir & '\test.html')
$hWin = _IEPropertyGet($oIE, 'hwnd')
$oIMGs = _IEImgGetCollection($oIE)
ReDim $aResult[@extended + 1][5]
For $oIMG In $oIMGs
	If StringInStr($oIMG.src, 'captcha_view.php?num=') Then
		$iCount += 1
		$aResult[$iCount][0] = $oIMG.src ;ссылки на картинки (на всякий случай)
		For $i = 1 To 4
			$aResult[$iCount][$i] = _IEPropertyGet($oIMG, $aResult[0][$i])
		Next
	EndIf
Next
If Not $iCount Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
ReDim $aResult[$iCount + 1][5]
$aResult[0][0] = $iCount
_ArrayDisplay($aResult, $hWin)
$iX_L = $aResult[1][1]
$iY_L = $aResult[1][2]
$iX_R = $aResult[$aResult[0][0]][1] + $aResult[$aResult[0][0]][3]
$iY_B = $iY_L + $aResult[1][4]
$aPos = ControlGetPos($hWin, '', '[CLASS:Internet Explorer_Server; INSTANCE:1]')
$aWinPos = WinGetPos($hWin)
$aClient = WinGetClientSize($hWin)
$iX_shift = $aWinPos[2] - $aClient[0]
$iY_shift = $aWinPos[3] - $aClient[1] + $aPos[1]

If Not WinActive($hWin) Then WinActivate($hWin)
If WinWaitActive($hWin, '', 3) Then
	_ScreenCapture_CaptureWnd(@ScriptDir & '\captcha.jpg', $hWin, $iX_L + $iX_shift, $iY_L + $iY_shift, $iX_R + $iX_shift * 2, $iY_B + $iY_shift, False)
Else
	MsgBox(16, 'Error', 'WinWaitActive')
EndIf
 
Автор
T

Trans

Знающий
Сообщения
257
Репутация
6
madmasles [?]
С Вашим кодом картинок у меня так работает (без проверок на ошибки) (IE8). То, что получаю, прикрепил.
Ваш, вариант у меня только верх каптчи делает, но не полностью



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

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Trans [?]
Ваш, вариант у меня только верх каптчи делает, но не полностью
Я проверял только с тем куском кода страницы, который у Вас в первом посте. Попробуйте, например, их скачать или дайте ссылку на страницу.
 
Автор
T

Trans

Знающий
Сообщения
257
Репутация
6
вот архив, со всеми картинками и нужным расположением:smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Trans,
С Вашим test.7z:
Код:
#include <IE.au3>
#include <Array.au3>
#include <ScreenCapture.au3>

Dim $aResult[1][5] = [['', 'browserx', 'browsery', 'width', 'height']]
$iCount = 0
$oIE = _IECreate(@ScriptDir & '\test.html')
$hWin = _IEPropertyGet($oIE, 'hwnd')
$oIMGs = _IEImgGetCollection($oIE)
ReDim $aResult[@extended + 1][5]
For $oIMG In $oIMGs
	$iCount += 1
	$aResult[$iCount][0] = $oIMG.src ;ссылки на картинки (на всякий случай)
	For $i = 1 To 4
		$aResult[$iCount][$i] = _IEPropertyGet($oIMG, $aResult[0][$i])
	Next
Next
If Not $iCount Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
ReDim $aResult[$iCount + 1][5]
$aResult[0][0] = $iCount
_ArrayDisplay($aResult, $hWin)
$iX_L = $aResult[1][1]
$iY_L = $aResult[1][2]
$iX_R = $aResult[$aResult[0][0]][1] + $aResult[$aResult[0][0]][3]
$iY_B = $aResult[$aResult[0][0]][2] + $aResult[$aResult[0][0]][4]
$aPos = ControlGetPos($hWin, '', '[CLASS:Internet Explorer_Server; INSTANCE:1]')
$aWinPos = WinGetPos($hWin)
$aClient = WinGetClientSize($hWin)
$iX_shift = $aWinPos[2] - $aClient[0]
$iY_shift = $aWinPos[3] - $aClient[1] + $aPos[1]

If Not WinActive($hWin) Then WinActivate($hWin)
If WinWaitActive($hWin, '', 3) Then
	_ScreenCapture_CaptureWnd(@ScriptDir & '\captcha.jpg', $hWin, $iX_L + $iX_shift, $iY_L + $iY_shift, $iX_R + $iX_shift, $iY_B + $iY_shift, False)
Else
	MsgBox(16, 'Error', 'WinWaitActive')
EndIf
 
Автор
T

Trans

Знающий
Сообщения
257
Репутация
6
У меня каптча почему-то по другому получается на примере с test.html

и ещё одна проблема, решил "прикрутить" ваш код к своему, он выдает такую ошибку:
Код:
C:\Program Files\AutoIt3_v3.3.6.1\Include\IE.au3 (2674) : ==> The requested action with this object has failed.:
Return SetError($_IEStatus_Success, 0, HWnd($o_object.HWnd()))
Return SetError($_IEStatus_Success, 0, HWnd($o_object.HWnd()^ ERROR
подозреваю, что из-за этого:
Код:
Func Win_Wor()
    Local  $GUIActiveX, $GUI_Button_Back, $GUI_Button_Forward
    Local $GUI_Button_Home, $GUI_Button_Stop, $msg
	Global $oIE
	Global $WinIE
    $oIE = ObjCreate("Shell.Explorer.2")
	$WinIE = GUICreate("Браузер", 480, 320, 0 , 0)
   $GUIActiveX = GUICtrlCreateObj ($oIE, -2, -2, 502, 324)
    GUISetState(@SW_HIDE, $WinIE)
EndFunc
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Trans [?]
подозреваю, что из-за этого:
Да. Вы должны выбрать, или вы используете IE.au3 или вызываете Shell.Explorer.2. Оба метода будут конфликтовать.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Trans [?]
И как тогда сделать под второй вариант?
Попробуйте так.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
#include <ScreenCapture.au3>
#include <WinAPI.au3>

Dim $aResult[1][4] = [['browserx', 'browsery', 'width', 'height']]
$iCount = 0
$iX = 5
$iY = 5

$oIE = ObjCreate('Shell.Explorer.2')
$hGui = GUICreate('Test', 300, 200, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS, $WS_CLIPCHILDREN))
$nObj = GUICtrlCreateObj($oIE, $iX, $iY, 290, 160)
$nButton = GUICtrlCreateButton('Go', 100, 170, 100, 25)
GUISetState()
_IENavigate($oIE, @ScriptDir & '\test.html')

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			$oIMGs = _IEImgGetCollection($oIE)
			ReDim $aResult[@extended + 1][4]
			For $oIMG In $oIMGs
				$iCount += 1
				For $i = 0 To 3
					$aResult[$iCount][$i] = _IEPropertyGet($oIMG, $aResult[0][$i])
				Next
			Next
			If Not $iCount Then
				MsgBox(16, 'Error', 'Error')
				Exit
			EndIf
			ReDim $aResult[$iCount + 1][4]
			$iX_L = $aResult[1][0] + $iX
			$iY_L = $aResult[1][1] + $iY
			$iX_R = $aResult[$iCount][0] + $aResult[$iCount][2]
			$iY_B = $aResult[$iCount][1] + $aResult[$iCount][3]
			;$aWinPos = WinGetPos($hGui)
			;$aClient = WinGetClientSize($hGui)
			;$iX_shift = $aWinPos[2] - $aClient[0]
			;$iY_shift = $aWinPos[3] - $aClient[1]
			$iX_shift = _WinAPI_GetSystemMetrics($SM_CXFRAME) * 2
			;$iY_shift = _WinAPI_GetSystemMetrics($SM_CYCAPTION) + $iX_shift
			$iY_shift = _WinAPI_GetSystemMetrics($SM_CYCAPTION) + _WinAPI_GetSystemMetrics($SM_CYFRAME) * 2
			_ScreenCapture_CaptureWnd(@ScriptDir & '\captcha.jpg', $hGui, $iX_L + $iX_shift, $iY_L + $iY_shift, $iX_R + $iX_shift, $iY_B + $iY_shift, False)
	EndSwitch
WEnd
 
Автор
T

Trans

Знающий
Сообщения
257
Репутация
6
Решил проблему с размером скриншота.
Теперь осталось решить другую проблему
- если окно "перекрыто" другом окном, то делать скрин другого окна, а надо сделать чтоб он делался только в GUICreate('Test',100,100) и чтоб можно было "спрятать окно под GUISetState(@SW_HIDE)
 

defens

Знающий
Сообщения
89
Репутация
5
как отправить сохранение captcha на antigate.com
 
Верх