Что нового

[Автоматизация] Динамическая ссылка капчи.

Driver

Новичок
Сообщения
13
Репутация
0
Добрый день!
Прошу помочь в решении задачи:
Требуется получить капчу с сайта для ручного ввода в поле и последующей отправки в поле ввода на сайте.
Перечитал все темы какие нашел, вроде бы нашел на часть задачи решение, но затык в получении картинки капчи на ПК.
Адрес сайта с капчей: www.telexfree.com
Проблема в том, что адрес капчи динамический, поэтому те методы которые были на форме применить не смог. Попытки забирать путем использования не динамической части так к успеху и не привели.
Эксперименты с снятием скриншота указанной области окна IE пока так же без результата.
Буду премного благодарен любой помощи! :beer:



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

В общем, уже все сделал кроме сохранения картинки из этой капчи на ПК :'(
Даже кнопочку ACCESS удалось осилить :smile: (из-за отсутствия опыта, тоже долго ковырял)
Остался маленький шажок, но пока не получается одолеть.
Прошу помочь новичку :smile:

Может кому пригодится или кто-то подскажет оптимизацию (рабочие функции):
Заполнение полей:
Код:
Func _LogIn()

	Switch GUICtrlRead($capchaInput)
	  Case ""
	  MsgBox(48, "Error", 'Введите капчу!', 0)
	  Case Not ""
	  $rInput = GUICtrlRead($capchaInput)
	  $sCapcha = $rInput

	$oIE = _IECreate ("www.telexfree.com", 0, 1)
	_IELoadWait($oIE)

	$sLogin = "Логин"
	$sPass = "Пароль"

    $oLogin  = _IEGetObjByName($oIE,"log_usuario_sis")
    $oPass   = _IEGetObjByName($oIE,"pwd_usuario_sis")
    $oCapcha = _IEGetObjByName($oIE,"security_code")

    _IEFormElementSetValue($oLogin, $sLogin)
    _IEFormElementSetValue($oPass, $sPass)
    _IEFormElementSetValue($oCapcha, $sCapcha)

	
	EndSwitch
EndFunc


Нажатие на кнопку "Access":
Код:
Func _Click()

	$oForm = _IEFormGetCollection($oIE, 'form_login')
	$oInputs = _IETagNameGetCollection($oForm, 'input')

For $oInput In $oInputs
    If $oInput.type == 'image' And $oInput.src == 'http://www.telexfree.com/public/img/ingles/bt_acessar_bo.png' Then
        _IEAction($oInput, 'click')
        ExitLoop
    EndIf
Next

EndFunc
 
Автор
D

Driver

Новичок
Сообщения
13
Репутация
0
Продолжу соло переписку :smile:
По сохранению капчи на ПК.
Сделал пока так т.к. другого работающего способа пока не нашел.

Код:
$oIE = _IECreate ("www.telexfree.com", 0, 1)
_IELoadWait($oIE)
$hWind = WinGetHandle("TelexFREE - Windows Internet Explorer")
WinActivate($hWind)
Sleep (1300)
WinActivate($hWind)
Sleep (50)
$oCap = _ScreenCapture_CaptureWnd(".\1.png", $hWind, 838, 155, 899, 175 )


Слип такой т.к. сайт после открытия "сам" еще обновляет капчу.
 

SlavaS

Знающий
Сообщения
35
Репутация
5
У меня так получилось
Код:
#include <IE.au3>
#include <GUIConstantsEx.au3>
#include <Clipboard.au3>
#include <GDIPlus.au3>

Global $oIE
Global Const $STM_GETIMAGE = 0x0173
Global Const $STM_SETIMAGE = 0x0172

$Form1_1 = GUICreate("Form1", 199, 142, 255, 170)
GUICtrlCreateLabel("Login", 32, 16, 57, 20)
$sLogin = GUICtrlCreateInput("", 104, 16, 89, 21)
GUICtrlCreateLabel("Pass", 32, 40, 60, 20)
$sPass = GUICtrlCreateInput("", 104, 40, 89, 21)
$Pic1 = GUICtrlCreatePic("", 26, 64, 66, 26)
$capchaInput = GUICtrlCreateInput("", 104, 64, 89, 21)
$ButOK = GUICtrlCreateButton("OK", 8, 102, 50, 33)
$Cancel = GUICtrlCreateButton("Cancel", 144, 102, 50, 33)

GUISetState(@SW_SHOW)

$oIE = _IECreate ("www.telexfree.com", 0, 0)
_IELoadWait($oIE)

$oImg = _IEImgGetCollection($oIE, 1)
_IECopyObjById($oIE, $oImg)
_ScreenCapture_toBitmap($Pic1)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $Cancel
			_IEQuit($oIE)
			Exit
		Case $ButOK

	EndSwitch
WEnd

Func _IECopyObjById(ByRef $o_Object, $s_ID)
	Local $oCtlRange
	If IsObj($s_ID) Then
		$oCtlRange = $o_Object.document.body.createControlRange()
		$oCtlRange.add($s_ID)
		$oCtlRange.execCommand('Copy')
		Return SetError(0)
	Else
		Return SetError(1)
	EndIf
EndFunc   ;==>_IECopyObjById

Func _ScreenCapture_toBitmap($nPic)
	Local $Result, $Timer, $hBMP = 0
	$Timer = TimerInit()
	While TimerDiff($Timer) < 1000
		_ClipBoard_Open(0)
		$hBMP = _ClipBoard_GetDataEx($CF_BITMAP)
		_ClipBoard_Close()
		If $hBMP Then
			ExitLoop
		EndIf
		Sleep(10)
	WEnd
	If Not $hBMP Then
		Return 0
	EndIf
	$hPic = GUICtrlGetHandle($nPic)

	_GDIPlus_Startup()
	$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)

	$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hPic)
	$nBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)

	_GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)

	_SendMessage($hPic, $STM_SETIMAGE, 1, $nBitmap)
	$hObj = _SendMessage($hPic, $STM_GETIMAGE)
	If $hObj <> $nBitmap Then
		_WinAPI_DeleteObject($nBitmap)
	EndIf

	_WinAPI_DeleteObject($hBitmap)
	_GDIPlus_GraphicsDispose($hGraphic)
	_WinAPI_DeleteObject($nBitmap)
	_GDIPlus_Shutdown()
EndFunc   ;==>_ScreenCapture_toBitmap
 
Автор
D

Driver

Новичок
Сообщения
13
Репутация
0
:laugh: Спасибо!

Правда еще придется не мало "курить" справку, что бы понять ваш код:smile: :blink:

Еще раз спасибо! :beer:
 
Верх