Что нового

Сохранение img на диск из загруженной страницы

valdur2000

Знающий
Сообщения
155
Репутация
7
Здравствуйте уважаемые. Есть адрес: www.адрес.com, внизу капча, если я нажимаю на нее правой клавишей мышки, и сохраняю на диск, то сохраняется именно она. но, если использую
Код:
$oImg = _IEImgGetCollection($oIE, 7)
	InetGet($oImg.src, "C:\AutoIt\captcha\" & $i&$oImg.nameProp)
, то сохраняется другая. пробовал циклом сохранить двадцать капч, вдруг попадется нужная, но нет. если сохраняю саму страничку на диск File - Save As, то тоже сохраняется другая капча. _ScreenCapture_Capture конечно сработает, но тогда программу невозможно запустить в фоновом режиме. как можно сохранить картинку на диск? может есть еще какие-то возможности?
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
inververs
на форуме видел, что обсуждается передача кукис в InetGet, но не понимаю где их взять и как к запросу InetGet приписать.. debugger показывает кучу всего...
Код:
$oIE=_IECreate("www...")
$oImg = _IEImgGetCollection($oIE, 7)
$o=_IEDocGetObj($oIE)
InetGet($oImg.src&'?'&$o.cookie, "C:\AutoIt\captcha\" & $oImg.nameProp,1)


попробовал так, но все равно сохраняет не ту картинку... либо я не так кукис беру, либо неправильно формирую запрос InetGet...
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Все верно с куки. значит что то еще есть. Они в браузере включены? если включены, значит дело не только в них.


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

Стоп, меняйте ? на & и пробуйте.
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
inververs
зашел в настройки, включил куки все-все-все. перезагрузил IE , попробовал и с ? и с &, результат отрицательный. сохраняются другие картинки.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Не знаю чем вам помочь, если найдете решение, отпишите)
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
valdur2000
Может что-то типа:
Код:
#include <IE.au3> 
$oIE = _IECreate ("") 
_IEAction ($oIE, "printdefault")
Sleep(6000)
_IEQuit($oIE)

+ виртуальный принтер вроде PDF Creator, печать в картинку, оттуда вырезать.
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
WSWR
Печатать лучше, чем фоткать экран, если решение с кукисами не будет найдено, то буду либо фоткать либо печатать..
 

Nazgul666

Знающий
Сообщения
21
Репутация
9
Как я понял, нужно копировать именно то, что на экране. Совсем недавно сталкивался с подобной проблемой. Нашел по кусочкам то, что нужно, где-то здесь на форуме:
Код:
$oIE = _IEAttach("", "instance", 1)

Global $oMain = _IEFrameGetCollection($oIE, 0);основной фрейм
Global $File=@ScriptDir & "\captcha.jpg" ;Куда сохранять скриншот
; Копируем объект в данном случае каптчу где [id="capcha_img"]
_IECopyObjById($oMain, "capcha_img")
_ScreenCapture($File)

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

Func _ScreenCapture($sFile)
    Local $Result, $Timer, $hImage, $hBitmap = 0
    $Timer = TimerInit()
    While TimerDiff($Timer) < 1000
        _ClipBoard_Open(0)
        $hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
        _ClipBoard_Close()
        If $hBitmap Then
            ExitLoop
        EndIf
        Sleep(10)
    WEnd
    If Not $hBitmap Then
        Return 0
    EndIf
    _GDIPlus_Startup()
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    $Result = _GDIPlus_ImageSaveToFile($hImage, $sFile)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_DeleteObject ($hBitmap)
    _GDIPlus_Shutdown()
    ;Return $Result
EndFunc   ;==>_ScreenCapture

В вашем случае ID не указан, но все же думаю стоит копать в этом направлении. Нужно всего лишь научиться приклеиваться к объекту без использования ID
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Nazgul666
Отличный пример! Это то что нужно. :ok:
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
Nazgul666
Большое спасибо. Чуток модифицировал под конкретный случай, что бы работать без имени формы и ID, только по номеру объекта/картинки на страничке. При копировании данных в буфер, выходило окошко подтверждения доступа к оному. Соответственно в "Параметрах безопастности - зона Интернета" для пункта "Разрешить программный доступ к буферу обмена" выбрать "Разрешить". Вопрос решен.

Код:
$oIE = _IECreate ("...")
_IELoadWait($oIE)
Global $File=@ScriptDir & "\captcha.jpg" ;Куда сохранять скриншот
$oImg = _IEImgGetCollection($oIE, 7); в конкретном случае капча была седьмым img
_IECopyObjById($oIE, $oImg)
_ScreenCapture($File)

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
ConsoleWrite(@cr&"1"&@cr)
Func _ScreenCapture($sFile)
    Local $Result, $Timer, $hImage, $hBitmap = 0
    $Timer = TimerInit()
    While TimerDiff($Timer) < 1000
        _ClipBoard_Open(0)
        $hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
        _ClipBoard_Close()
        If $hBitmap Then
            ExitLoop
        EndIf
        Sleep(10)
    WEnd
    If Not $hBitmap Then
        Return 0
    EndIf
    _GDIPlus_Startup()
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    $Result = _GDIPlus_ImageSaveToFile($hImage, $sFile)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_DeleteObject ($hBitmap)
    _GDIPlus_Shutdown()
    ;Return $Result
EndFunc   ;==>_ScreenCapture
 

awerasf

Новичок
Сообщения
1
Репутация
0
valdur2000 сказал(а):
Nazgul666
Большое спасибо. Чуток модифицировал под конкретный случай, что бы работать без имени формы и ID, только по номеру объекта/картинки на страничке. При копировании данных в буфер, выходило окошко подтверждения доступа к оному. Соответственно в "Параметрах безопастности - зона Интернета" для пункта "Разрешить программный доступ к буферу обмена" выбрать "Разрешить". Вопрос решен.

Код:
$oIE = _IECreate ("...")
_IELoadWait($oIE)
Global $File=@ScriptDir & "\captcha.jpg" ;Куда сохранять скриншот
$oImg = _IEImgGetCollection($oIE, 7); в конкретном случае капча была седьмым img
_IECopyObjById($oIE, $oImg)
_ScreenCapture($File)

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
ConsoleWrite(@cr&"1"&@cr)
Func _ScreenCapture($sFile)
    Local $Result, $Timer, $hImage, $hBitmap = 0
    $Timer = TimerInit()
    While TimerDiff($Timer) < 1000
        _ClipBoard_Open(0)
        $hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
        _ClipBoard_Close()
        If $hBitmap Then
            ExitLoop
        EndIf
        Sleep(10)
    WEnd
    If Not $hBitmap Then
        Return 0
    EndIf
    _GDIPlus_Startup()
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    $Result = _GDIPlus_ImageSaveToFile($hImage, $sFile)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_DeleteObject ($hBitmap)
    _GDIPlus_Shutdown()
    ;Return $Result
EndFunc   ;==>_ScreenCapture
на сайте 2 вида капчи (переключаются кнопкой), оба изображения под номерами 1 и 2 в массиве который возвращает _IEImgGetCollection
вчера обе капчи сохранялись на диск нормально, сегодня номе 1 работает,а номер 2 нивкакую. ничего не менял. (капчи recaptcha и solvemedia)

PS и вот что заметил: на solvemedia даже в ручную не выскакивает меню по правой клавише. может дело в настройках IE?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
awerasf,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 
Верх