Что нового

[Сеть, интернет] Извлечение HTML кода из iFrame

Crazy Kvace

Знающий
Сообщения
30
Репутация
8
Доброе время суток.
Столкнулся с проблемой: требуется каким-то образом извлечь HTML код который прячет в себе фрейм на сайте.
сам фрейм имеет следующий вид:
Код:
<iframe style="BACKROUND: none transparent scroll repeat 0% 0%" height=60 src="http://192.168.11.14/?hwn=MTY<случайно генерированная строка>" frameborder=no width=468 allowTransparency scrolling=no></iframe>
и генерируется скриптом:
Код:
<script language=JavaScript type=text/javascript src="http://192.168.11.14/16277/1/3/"></script>
Саму структуру фрейма прекрасно видит DebugBar:

а вот AutoIt добиться этого не могу. Для получения всех фреймов и их src использую код:

Код:
#include <IE.au3>

$oIE = _IECreate('192.168.10.11') ; сайт находится на локальном сервере и не доступен из интернета 

$oElements = _IETagNameAllGetCollection($oIE)
For $oElement In $oElements
    If StringInStr($oElement.tagname, 'frame') Then ;находим все элементы iFrame
        MsgBox(0, 'Element Info', 'Tagname: ' & $oElement.tagname & @CRLF & @CRLF & 'SRC: ' & $oElement.src & @CRLF & @CRLF & 'OuterHTML: ' & $oElement.outerHTML)
	$oHTML = _IETagNameGetCollection($oElement, 'html') ;попытки получить HTML код из фрейма, часть кода было удалено так как способ не подошел
    EndIf
Next

Если просто открыть в браузере ссылку из src то открывается пустая страница.
На данном форуме встречал подобные темы но подробного решения своей проблемы не нашел. Прошу вашей помощи!
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Зачем ты берёшь
Код:
_IETagNameAllGetCollection($oIE)

?

А почему не
Код:
$oFrame = _IEFrameGetCollection ($oIE)

?
 
Автор
C

Crazy Kvace

Знающий
Сообщения
30
Репутация
8
А почему не
Код:
$oFrame = _IEFrameGetCollection ($oIE)

?

Пытался, воспользовавшись кодом из примера в справке:
Код:
#include <IE.au3>

Local $oIE = _IECreate('192.168.10.11')
Local $oFrames = _IEFrameGetCollection($oIE)
Local $iNumFrames = @extended
For $i = 0 To ($iNumFrames - 1)
	Local $oFrame = _IEFrameGetCollection($oIE, $i)
	MsgBox(0, "Frame Info", _IEPropertyGet($oFrame, 'locationurl'))
	Next

Выдает ошибку ::smile:
Код:
C:\Program Files\AutoIt3\Include\IE.au3 (2705) : ==> The requested action with this object has failed.:
Return SetError($_IEStatus_Success, 0, $o_object.location.href())
Return SetError($_IEStatus_Success, 0, $o_object.location.href()^ ERROR
Хотя фреймы на сайте разположены так же как на тестовом сайте
Код:
_IE_Example("frameset")

из примера Autoit если верить DebugBar.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
$oFrames = _IEFrameGetCollection ($oIE)
For $oElement In $oFrames
    MsgBox(0, 'Element Info', 'Text: ' & $oElement.innertext & @CRLF & @CRLF & 'SRC: ' & $oElement.src & @CRLF & @CRLF & 'OuterHTML: ' & $oElement.outerHTML)
Next
 
Автор
C

Crazy Kvace

Знающий
Сообщения
30
Репутация
8
Код:
$oFrames = _IEFrameGetCollection ($oIE)
For $oElement In $oFrames
    MsgBox(0, 'Element Info', 'Text: ' & $oElement.innertext & @CRLF & @CRLF & 'SRC: ' & $oElement.src & @CRLF & @CRLF & 'OuterHTML: ' & $oElement.outerHTML)
Next

Ничего не происходит, скрипт открывает IE и выключается при этом никаких ошибок и сообщений.

Кстати страница на которой я "мучаю" фреймы не содержит тегов:
Код:
<frameset></frameset>
 
Автор
C

Crazy Kvace

Знающий
Сообщения
30
Репутация
8
Основная проблема была найдена.
На сайте скрипт генерирует iframe, и загружает туда HTML код из другого домена. Получить содержимое фрейма с другого домена сторонними программами и скриптами (кроме плагинов к браузерам) не возможно! политика безопасности браузера не позволит этого сделать. Следовательно ошибка:
Код:
C:\Program Files\AutoIt3\Include\IE.au3 (2705) : ==> The requested action with this object has failed.:
Return SetError($_IEStatus_Success, 0, $o_object.location.href())
Return SetError($_IEStatus_Success, 0, $o_object.location.href()^ ERROR

Проблему можно решить без браузера, с помощью AutoIt отправлять запросы GET серверу.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Crazy Kvace,
Дайте ссылку.
 
Автор
C

Crazy Kvace

Знающий
Сообщения
30
Репутация
8

Страница с iframe находится на локальном сервере и не доступна из интернета. Будет доступна в скором времени.


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

Кстати как пример страницы с iframe, можно взять ЭТУ страницу. HTML код баннера с рекламой генерируется скриптом, и находится в iframe, содержимое iframe берется с другого домена. Нужно получить содержимое iframe то есть HTML код рекламы, только у меня в место рекламы случайные цитаты, а так все одинаково.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
попробуйте считывать исходный код по такому принципу. А далее парсить нужный кусок. Если нужный кусок находится внутри js. То парсится аналогично.
Пример:

Код:
#include <IE.au3>
$s_URL = 'http://<ВАШ URL>'
$s_Sourse = InetRead($s_URL, 17)
If @error Then
    MsgBox(16, 'Error', 'InetRead')
    Exit
EndIf
$s_Sourse = BinaryToString($s_Sourse)
MsgBox (262208, 'исходный код', $s_Sourse, 10)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Crazy Kvace [?]
можно взять ЭТУ страницу
У меня работает.
Код:
#include <IE.au3>
#include <Array.au3>
;без проверок на ошибки.
_IEErrorHandlerRegister()

$sUrl = 'http://autoit-script.ru/'

$oIE = _IECreate($sUrl)

$oFrames = _IETagNameGetCollection($oIE, 'iframe')
Dim $aFrames[@extended + 1][2]
For $oFrame In $oFrames
	If StringInStr($oFrame.id, 'aswift') Then
		$oObj = $oFrame.contentWindow.document
		$oFrames_1 = _IETagNameGetCollection($oObj, 'iframe')
		For $oFrame_1 In $oFrames_1
			If StringInStr($oFrame_1.name, 'google_ads_frame') Then
				$aFrames[0][0] += 1
				$aFrames[$aFrames[0][0]][0] = $oFrame_1.src
				$aFrames[$aFrames[0][0]][1] = $oFrame_1.id
			EndIf
		Next
	EndIf
Next
ReDim $aFrames[$aFrames[0][0] + 1][2]
_ArrayDisplay($aFrames)
If Not $aFrames[0][0] Then Exit -3
$iRand = Random(1, $aFrames[0][0], 1)
ConsoleWrite($aFrames[$iRand][1] & @TAB & $aFrames[$iRand][0] & @LF)
_IENavigate($oIE, $aFrames[$iRand][0])
ConsoleWrite('================================' & @LF)
ConsoleWrite(_IEBodyReadHTML($oIE) & @LF)
_IEAction($oIE, 'back')
_IELoadWait($oIE)
 
Автор
C

Crazy Kvace

Знающий
Сообщения
30
Репутация
8
Код:
#include <IE.au3>
#include <Array.au3>
;без проверок на ошибки.
_IEErrorHandlerRegister()

$sUrl = 'http://autoit-script.ru/'

$oIE = _IECreate($sUrl)

$oFrames = _IETagNameGetCollection($oIE, 'iframe')
Dim $aFrames[@extended + 1][2]
For $oFrame In $oFrames
    If StringInStr($oFrame.id, 'aswift') Then
        $oObj = $oFrame.contentWindow.document
        $oFrames_1 = _IETagNameGetCollection($oObj, 'iframe')
        For $oFrame_1 In $oFrames_1
            If StringInStr($oFrame_1.name, 'google_ads_frame') Then
                $aFrames[0][0] += 1
                $aFrames[$aFrames[0][0]][0] = $oFrame_1.src
                $aFrames[$aFrames[0][0]][1] = $oFrame_1.id
            EndIf
        Next
    EndIf
Next
ReDim $aFrames[$aFrames[0][0] + 1][2]
_ArrayDisplay($aFrames)
If Not $aFrames[0][0] Then Exit -3
$iRand = Random(1, $aFrames[0][0], 1)
ConsoleWrite($aFrames[$iRand][1] & @TAB & $aFrames[$iRand][0] & @LF)
_IENavigate($oIE, $aFrames[$iRand][0])
ConsoleWrite('================================' & @LF)
ConsoleWrite(_IEBodyReadHTML($oIE) & @LF)
_IEAction($oIE, 'back')
_IELoadWait($oIE)

Спасибо, буду разбираться...





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

Рано радовался, переделал код под свою страницу :(
Код:
----> $IEComErrorScriptline = 13
----> $IEComErrorNumberHex = 80020009
----> $IEComErrorNumber = -2147352567
----> $IEComErrorWinDescription = Отказано в доступе.
----> $IEComErrorDescription = Отказано в доступе.
----> $IEComErrorSource = 
----> $IEComErrorHelpFile = C:\WINDOWS\system32\mshtml.hlp
----> $IEComErrorHelpContext = 0
----> $IEComErrorLastDllError = 0

Видимо проблема в политике безопасности браузера...
Просмотрев логи HttpAnalyzer'а я решил воспользоватся:

Код:
$oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
;код еще не написал
 
Автор
C

Crazy Kvace

Знающий
Сообщения
30
Репутация
8
Все! Проблему Решил! Без использования браузера! :smile:

Код:
; Код написан на основе полученой информации программой Http Analyzer.
; Код не универсальный, и для правильной работы должен быть отредактирован под конкретный случай.

$siteurl = "http://192.168.10.11/" ; url страницы на которой расположен фрейм
$scripturl = "http://192.168.11.14/16277/1/3/" ;url скрипта JS генерирующий фрейм

$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")

$oHTTP.Open("GET", $siteurl)
$oHTTP.SetRequestHeader("Accept", "*/*")
$oHTTP.SetRequestHeader("Accept-Language", "ru-RU")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)")
$oHTTP.SetRequestHeader("Connection", "Keep-Alive")
$oHTTP.Send("")
$oHTTP.WaitForResponse
$oHTTP.ResponseText

$oHTTP.Open("GET", $scripturl) 
$oHTTP.SetRequestHeader("Accept", "*/*")
$oHTTP.SetRequestHeader("Referer", $siteurl) ; Referer
$oHTTP.SetRequestHeader("Accept-Language", "ru-RU")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)")
$oHTTP.SetRequestHeader("Connection", "Keep-Alive")
$oHTTP.Send("")
$oHTTP.WaitForResponse
$oHTML=$oHTTP.ResponseText
$sHTML = BinaryToString($oHTML)

$string = StringRegExpReplace($sHTML, ".*(MTY([0-9a-zA-Z]+)MTY([0-9a-zA-Z]+)).*", "$1") ;Находим строку сгенерированную JS скриптом в фрейме

$oHTTP.Open("GET", "http://192.168.11.14/?hwn=" & $string) ; url полученый из JS скрипта
$oHTTP.SetRequestHeader("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, */*")
$oHTTP.SetRequestHeader("Referer", $siteurl) ; Referer
$oHTTP.SetRequestHeader("Accept-Language", "ru-RU")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)")
$oHTTP.SetRequestHeader("Connection", "Keep-Alive")
$oHTTP.Send("")
$oHTTP.WaitForResponse
$oHTML=$oHTTP.ResponseText
$sHTML = BinaryToString($oHTML)

MsgBox (0, "AutoIt", "Код фрейма: " & $sHTML) ;Получаем долгожданный код iFrame


Всем спасибо за оказание помощи, тема закрыта.
 

ssvih

Новичок
Сообщения
35
Репутация
1
Вылетает ошибка на 33 твроке!

Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")

$oHTTP.Open("GET", "http://parifinance.ru/foreks/") ;Страница на локальном сервере
$oHTTP.SetRequestHeader("Accept", "*/*")
$oHTTP.SetRequestHeader("Accept-Language", "ru-RU")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)")
$oHTTP.SetRequestHeader("Host", "62.109.6.215")
$oHTTP.SetRequestHeader("Connection", "Keep-Alive")
$oHTTP.Send("")
$oHTTP.WaitForResponse
$bHTML=$oHTTP.ResponseText

$oHTTP.Open("GET", "http://pagead2.googlesyndication.com/pagead/show_ads.js") ;Скрипт JS генерирующий фрейм
$oHTTP.SetRequestHeader("Accept", "*/*")
$oHTTP.SetRequestHeader("Referer", "http://parifinance.ru/foreks/")
$oHTTP.SetRequestHeader("Accept-Language", "ru-RU")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)")
$oHTTP.SetRequestHeader("Host", "62.109.6.215")
$oHTTP.SetRequestHeader("Connection", "Keep-Alive")
$oHTTP.Send("")
$oHTTP.WaitForResponse
$vHTML=$oHTTP.ResponseText
$sHTML = BinaryToString($vHTML)
$string = StringRegExpReplace($sHTML, ".*(MTY([0-9a-zA-Z]+)MTY([0-9a-zA-Z]+)).*", "$1") ;Находим строку сгенерированную JS скриптом в фрейме

$oHTTP.Open("GET", "http://192.168.11.14/?hwn=" & $string)
$oHTTP.SetRequestHeader("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, */*")
$oHTTP.SetRequestHeader("Referer", "http://parifinance.ru/foreks/")
$oHTTP.SetRequestHeader("Accept-Language", "ru-RU")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)")
$oHTTP.SetRequestHeader("Host", "62.109.6.215")
$oHTTP.SetRequestHeader("Connection", "Keep-Alive")
$oHTTP.Send("")
$oHTTP.WaitForResponse
$bHTML=$oHTTP.ResponseText
$sHTML = BinaryToString($bHTML)
MsgBox (0, "AutoIt", "Код фрейма: " & $sHTML) ;Получаем долгожданный код iFrame


Я правильно дописал адреса и referer'ы
 
Автор
C

Crazy Kvace

Знающий
Сообщения
30
Репутация
8
Я правильно дописал адреса и referer'ы

Не в этом дело. Этот код не универсальный. Его надо подстроить под конкретный случай. я его писал основываясь на информации полученой при помощи Http Analyzer'a,

Код:
$oHTTP.Open("GET", "http://pagead2.googlesyndication.com/pagead/show_ads.js") ;Скрипт JS генерирующий фрейм
$oHTTP.SetRequestHeader("Accept", "*/*")
$oHTTP.SetRequestHeader("Referer", "http://parifinance.ru/foreks/")
$oHTTP.SetRequestHeader("Accept-Language", "ru-RU")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)")
$oHTTP.SetRequestHeader("Host", "62.109.6.215")
$oHTTP.SetRequestHeader("Connection", "Keep-Alive")
$oHTTP.Send("")
$oHTTP.WaitForResponse
$vHTML=$oHTTP.ResponseText
$sHTML = BinaryToString($vHTML)
$string = StringRegExpReplace($sHTML, ".*(MTY([0-9a-zA-Z]+)MTY([0-9a-zA-Z]+)).*", "$1") ;Находим строку сгенерированную JS скриптом в фрейме

Этот кусок кода загружает скрипт:
Код:
$oHTTP.Open("GET", "http://pagead2.googlesyndication.com/pagead/show_ads.js")


И ищет в нем строку по шаблону:
Код:
$string = StringRegExpReplace($sHTML, ".*(MTY([0-9a-zA-Z]+)MTY([0-9a-zA-Z]+)).*", "$1") ;Находим строку


Далее соединеется с сайтом учитывая эту строку:
Код:
$oHTTP.Open("GET", "http://192.168.11.14/?hwn=" & $string)


Вылетает ошибка на 33 твроке!

В скрипте который вы получаете:
Код:
$oHTTP.Open("GET", "http://pagead2.googlesyndication.com/pagead/show_ads.js")


Нету строки которая соответствует шаблону: ".*(MTY([0-9a-zA-Z]+)MTY([0-9a-zA-Z]+)).*"

Вы не полностью переделали код под свой случай
 
Верх