Получить содержимое Web-страницы, используя WinInet API

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Получить содержимое Web-страницы, используя WinInet API

Сообщение Scorry_1 » 07.06.2006 (Ср) 10:11

Есть такая вот ссылка http://vbnet.ru/faq/showtopic.asp?id=380 - нашел ее на этом форуме, посмотрел и теперь нахожусь в легком (слабо сказано) замешательстве...
Не мог бы кто-то подсказать как это работает и как отследить событие, когда HTML код страницы уже загружен полностью?.
Вот код программки:
Код: Выделить всё
Private Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Private Const INTERNET_OPEN_TYPE_DIRECT = 1
Private Const INTERNET_OPEN_TYPE_PROXY = 3
Private Const scUserAgent = "VB Project"
Private Const INTERNET_FLAG_RELOAD = &H80000000
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hOpen As Long, ByVal sUrl As String, ByVal sHeaders As String, ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer

Private Function OpenURL(ByVal sUrl As String) As String
Dim hOpen As Long
Dim hOpenUrl As Long
Dim bDoLoop As Boolean
Dim bRet As Boolean
Dim sReadBuffer As String * 2048
Dim lNumberOfBytesRead As Long
Dim sBuffer As String
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
hOpenUrl = InternetOpenUrl(hOpen, sUrl, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
bDoLoop = True
While bDoLoop
sReadBuffer = vbNullString
bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
sBuffer = sBuffer & Left$(sReadBuffer, lNumberOfBytesRead)
If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
Wend
If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
If hOpen <> 0 Then InternetCloseHandle (hOpen)
OpenURL = sBuffer
End Function

Private Sub Command1_Click()
Text1 = OpenURL("http://vbnet.ru/faq/showall.asp")
End Sub

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.06.2006 (Ср) 10:27

Интересно, кто умудрился дать такую ссылку? :roll:

Вот нормальная. http://bbs.vbstreets.ru/viewtopic.php?t=19857
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 07.06.2006 (Ср) 15:14

Нет, нет, тот пример, который мне предлагаете вы использует Winsock, а тот про который спрашиваю я - нет, поэтому он мне более интересен - давно искал способ менять код страници на лету, а тут я такую перспективу вижу

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.06.2006 (Ср) 15:21

В примере, который я предлагаю, винсока нет.
Способ менять код страницы на лету - вопрос неясен.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 07.06.2006 (Ср) 15:57

для смены кода страницы на сервере налету , как вы изволили выразиться, существуют другие технологии и , как правило, для клиентов они недоступны. но все-таки можете, например, посмотреть в сторону хотя бы WebDAV http://www.codenet.ru/webmast/iis/htm/core/wcwdcp.php

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 07.06.2006 (Ср) 18:01

GSerg, сори - бегло просмотрел обсуждение и сделал неправильные выводы, винсока и правда нет, буду изучать код.

Konst_One, на сервере ничего менять и не надо, нужно получить код страници с сервера не загружая саму страницу со всеми ее элементами, отредактировать код и представить пользователю уже в обработанном виде, т.е. убрав/добавив нужные/ненужные элементы.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 07.06.2006 (Ср) 18:51

Страницу по любому грузить придётся-другое дело, что картинки подгрузить можно и после редактирования. Т. е. грузишь страницу, редактируешь, потом показываешь, подгрузив картинки.
Изображение

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 07.06.2006 (Ср) 19:05

keks-n, а как запретить показ картинок именно в одном нужном webbrowser? а потом догрузить? точнее как догрузить я где-то тут на форуме код встречал, а вот с запретом... такой вопрос я уже задавал когда-то - ответили, что VB это не может...

PS.. вот нашел догрузку: http://bbs.vbstreets.ru/viewtopic.php?t=25271

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 07.06.2006 (Ср) 19:13

Сначала отдельно качаешь код, потом вырезаешь из него нужные <img>, затем вставляешь его в WebBrowser.
Изображение

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 07.06.2006 (Ср) 19:23

Так в данный момент и пытыюсь делать, только что-то моему VB команда doc.Write ненравиться... скорее всего ошибаюсь в где-то... или компонент какой не подключил :(. не сможешь подсказать? пишу
Код: Выделить всё
Dim a As String
Dim doc As HTMLDocument
a = txtOut.Text
doc.open
doc.Write a
doc.Close
Set WebBrowser1.Document = doc

Результат:
Compile error:
Function or interface marced as restricted? or the function uses an Automation type not supported in Visual Basic

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.06.2006 (Ср) 19:25

Ну, например неплохо бы создать экземпляр HTMLDocument, прежде чем работать с объектом doc...
Изображение

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 07.06.2006 (Ср) 19:35

tyomitch, как это сделать?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 07.06.2006 (Ср) 19:37

Set doc = New HTMLDocument
Lasciate ogni speranza, voi ch'entrate.

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 07.06.2006 (Ср) 19:41

Вставил в код - ничего не изменилось :( то же сообщение...

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 07.06.2006 (Ср) 20:38

В общем ничего так и не работает... не нравиться ему команда Write... надеюсь, что кто-то сможет помочь.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 07.06.2006 (Ср) 20:51

Надо, что бы там была хотя-бы пустая страница. Сделай сначала Navigate в сторону about:blank, и только потом Document.write...
Изображение

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 07.06.2006 (Ср) 21:16

keks-n, сделал - бесполезно: Function or interface marced as restricted, or the function uses an Automation type not supported in Visual Basic

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 07.06.2006 (Ср) 21:55

Бред... Ну работала же она... А в каком контексте всё это выполняется? Отдельный объект или в WebBrowser/IE?
Изображение

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 07.06.2006 (Ср) 22:00

Вот полный код, который я использую:
Код: Выделить всё
Private Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Private Const INTERNET_OPEN_TYPE_DIRECT = 1
Private Const INTERNET_OPEN_TYPE_PROXY = 3
Private Const scUserAgent = "VB Project"
Private Const INTERNET_FLAG_RELOAD = &H80000000
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hOpen As Long, ByVal sUrl As String, ByVal sHeaders As String, ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer

Private Function OpenURL(ByVal sUrl As String) As String
Dim hOpen As Long
Dim hOpenUrl As Long
Dim bDoLoop As Boolean
Dim bRet As Boolean
Dim sReadBuffer As String * 2048
Dim lNumberOfBytesRead As Long
Dim sBuffer As String
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
hOpenUrl = InternetOpenUrl(hOpen, sUrl, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
bDoLoop = True
While bDoLoop
sReadBuffer = vbNullString
bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
sBuffer = sBuffer & Left$(sReadBuffer, lNumberOfBytesRead)
If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
Wend
If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
If hOpen <> 0 Then InternetCloseHandle (hOpen)
OpenURL = sBuffer
End Function


Private Sub Command1_Click()
Dim doc As HTMLDocument
Dim a As String
Set doc = WebBrowser1.document
a = Text1.Text
doc.open
doc.write a
doc.Close
End Sub

Private Sub Form_Load()
Text1 = OpenURL("http://vbstreets.ru/")
WebBrowser1.navigate "about:blank"
End Sub

До того момента как я нажимаю кнопку все работает, после... в общем все то же сообщение... я уж и незнаю что и думать... Настявьте на путь истинный, плииииз :oops:

P.S. Это код последних пяти-шести попыток, до этого экспириментировал с кодом качалки из кирпичей, но там все было по аналогии с текущим, соответственно и результат неизменен :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.06.2006 (Чт) 5:10

Private Sub Command1_Click()
WebBrowser1.document.write text1.text
WebBrowser1.document.close
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 08.06.2006 (Чт) 6:01

Спасибо - работает :)

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 08.06.2006 (Чт) 18:33

В интересные дебри забрался :)
Кто-нибудь может мне подсказать, как можно, если можно, методы WebBrowser прописать для TextBox'а? Например интересует метод navigate а также событие DocumentComplete. Если можно, то придельно простым языком :) или ссылку на рускоязычную литературу - с английским, к сожалению туго :oops:

PS. Перефразарую:
Есть ли возможность передать методы WebBrowser простому TextBox'у посредством интерфейса? Были у кого-то такие опыты? Подскажите с какой стороны к этой теме подходить?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.06.2006 (Пт) 5:39

Вопрос не ясен ни в первом, ни во втором изложении...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 09.06.2006 (Пт) 6:50

GSerg, вопрос: возможно ли использование стороннего метода (в данном слечии метода navigate объекта WebBrowser) для строковой переменной?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.06.2006 (Пт) 6:59

Вопрос снова неясен.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 09.06.2006 (Пт) 7:14

Хм...
Я незнаю как еще перефразировать, к сожалению :(...
В одщем мне нужно, чтобы при использовании такого кода:
Код: Выделить всё
Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
Text1.Navigate(URL, Flags, TargetFrameName, PostData, Headers)
Cancel = True
End Sub

Код страницы загружался в Text1.
Но это только то что мне нужно, а интересно мне было бы узнать как передавать методы от одного стандартного объекта, для использования их другим объектом.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.06.2006 (Пт) 7:23

Это новое слово в программировании.

Может вместо этого загрузить страницу в wb и потом скопировать её в text?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 09.06.2006 (Пт) 7:31

GSerg, нет, в том то и дело, что как только код попдет в wb, wb начнет слать запросы на получение картинок и загрузку фреймов из интернета, а мне это не нужно, пока я не отредактирую код.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.06.2006 (Пт) 7:38

Значит код нужно получить иным способом. Одним из представленных выше в этом топике.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scorry_1
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 10.11.2005 (Чт) 11:11
Откуда: Находка

Сообщение Scorry_1 » 09.06.2006 (Пт) 7:48

GSerg, пытаюсь в данный момент заставить работать на меня качалку, пока получается не очень :(... Не могу разобраться как с ее помошью передавать PostData, вроде бы такая возможность предусмотрена, но не пойму как реализована...

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList  
cron