Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программное "хождение по сайту"

296
05 мая 2008 года
Virtuoso
331 / / 31.07.2005
Visual Basic 6.0

Здравствуйте!
У моего провайдера заведено так, что свой лицевой счёт нужно смотреть на сайте. Каждый раз открывать стартовую страницу, вводить логин и пароль, нажимать на одну ссылку, нажимать на вторую ссылку и ВОТ... Я вижу свой счёт. Это надоело уже.
Ну и я подумал, раз уж мы здесь занимаемся программированием))... Может есть способ программно эти все шаги выполнить? Чтобы я запустил программу - бац, счёт!
А ещё лучше - если найти строку со счётом, считать её ... Счёт бы регулярно обновлялся и висел где-нибудь на рабочем столе. Отлично было бы!
А сам сайт вообще не открывать :)
Вот такая замороченнаяа идея. Есть у кого мысли?
Спасибо!
Страницы:
296
06 мая 2008 года
Virtuoso
331 / / 31.07.2005
ААА!!! Заработало! :)
Спасибо великое за всю проделанную работу!!! Жалую Вам орден за заслуги перед Отечеством)
Теперь сделаю модную прогу для себя и друзей.

А вот строка:
 
Код:
pDisp.Document.Frames(1).Document.getElementsByTagName("TABLE").Item(3).tFoot.rows(0).cells(3).innerHTML
одноподобную ошибку выдаёт..
17K
06 мая 2008 года
HookEst
144 / / 27.03.2008
Цитата:
pDisp.Document.Frames(1).Document.getElementsByTagName("TABLE").Item(3).tFoot.rows(0).cells(3).innerHTML
одноподобную ошибку выдаёт..


так подразумевалось, что pDisp.Document.Frames(1) и есть фрейм MAIN,
сейчас же pDisp.Document - и есть document фрайма MAIN:
pDisp.Document.getElementsByTagName("TABLE").Item(3).tFoot.rows(0).cells(3).innerHTML

296
06 мая 2008 года
Virtuoso
331 / / 31.07.2005
Это я понял) Делал, выдаёт ошибку 445 "Object doesn't support this action"
17K
06 мая 2008 года
HookEst
144 / / 27.03.2008
какой Object? ты отладчиком пользуешься? где цепочка pDisp.Document.getElementsByTagName("TABLE").Item( 3).tFoot.rows(0).cells(3).innerHTML рвется?
296
06 мая 2008 года
Virtuoso
331 / / 31.07.2005
Эм... Чо-то я себя совсем .... этим.... чувствую. Жму я ОТЛАДКА в окне ошибок, он выделяет эту строку. Имеется ввиду посмотреть в каком конкретно месте строки? А как? С помощью наблюдателя? Я не умею это делать..
17K
06 мая 2008 года
HookEst
144 / / 27.03.2008
MENU->Debug->AddWatch.
пишешь pDisp.Document
жмешь OK
в Watches в столбце Expression будет pDisp.Document (раскрыв ветку можно посмотреть его свойства), в столбце Value будет [object]
теперь в Expression добавляешь getElementsByTagName("TABLE")(т.е. д/б pDisp.Document.getElementsByTagName("TABLE"))
в Value д/б [object]
добавляешь дольше по цепочке (Item(3) ... и так далее) пока ругаться не начнет(т.е. Value не [object]), вот где он ругается?
296
06 мая 2008 года
Virtuoso
331 / / 31.07.2005
Что-то я в стопор пришёл.
Делаю Отладка->Добавить наблюдателя->pDisp.Document->ОК
В Value написано <Out of context>
Как раскрыть ветку я тоже не понимаю))
17K
06 мая 2008 года
HookEst
144 / / 27.03.2008
все это д/б когда
Цитата:
Жму я ОТЛАДКА в окне ошибок, он выделяет эту строку.

?
в столбце Context д/б имя текущей процедуры, у меня Form1.WebBrowser1_DocumentComplete
или правой кнопкой на pDisp в коде, AddWatch(или как там у тебя Наблюдатель :))

296
06 мая 2008 года
Virtuoso
331 / / 31.07.2005
Так. Если от меня требовалось делать наблюдатель для pDisp.Document, потом для pDisp.Document.getElementsByTagName("TABLE"), и так через каждую точку, то ...
[object] написано у всех кроме всей строки целиком, если целиком, то пишется - &nbsp;
Вот такие пироги
17K
06 мая 2008 года
HookEst
144 / / 27.03.2008
коллекция cells - это все ячейки данной строки, &nbsp; - значит ячейка пустая, поменяй индекс у cells, посмотри при каком покажет что нужно
cells(0) - первая ячейка
cells(1) - вторая
и т.д.
296
06 мая 2008 года
Virtuoso
331 / / 31.07.2005
блииин.... мучаю человека из-за собственной невнимательности, видимо устал уже, параллельно диплом пишу.
Дело было всё в том, что я эту строку написал и всё, сижу жду результата, а слово MSGBOX за меня дед Мазай будет писать.
А Cells там 3-й. просто видимо границы невидимы между столбцами.
Всё. Большое спасибо за труды!!!
17K
06 мая 2008 года
HookEst
144 / / 27.03.2008
вот в том же духе tBodies(1) - часть таблицы с данными, tFoot - подвал таблицы
rows и cells - соответствено их строки и столбцы, подбирай индексы и получай любую ячейку, какую тебе надо, innerHTML - то что внутри ячейки.
и Наблюдатель тебе в помощь, как ты без него обходился, это в Basic-е то, не представляю.
отключаюсь
Успехов.
296
06 мая 2008 года
Virtuoso
331 / / 31.07.2005
Да я просто отладку нажимал и сидел разбирался, что в строке не так. По шагам разве что не разбирал)
18K
22 июля 2008 года
rostov-ilya
29 / / 16.04.2007
Здравствуйте.
У меня похожая проблема.
Есть сайт внутри сетки, надо на него логиниться, и смотреть переодически статистику, и если что то меняется чтобы она мне сигналила.

Пытаюсь залогинится этим способом:

Цитата:

Option Explicit
Const login = "login"
Const pwd = "pas"
Dim State As String


Private Sub Command2_Click()
State = "login"
WebBrowser1.Navigate URL:="https://192.168.240.34/action_tw.php?mode_action=atm&pg=0"
End Sub


Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)



If State = "login" Then
State = "gostat"
With pDisp.Document.Forms(0)
.alias.Value = login
.password.Value = pwd
.submit
End With
ElseIf State = "gostat" Then


End If
End Sub



но ругается на alias.Value = login (Object variable or With block variable not set)

вот HTML код

Цитата:

<div id="loading" style="display:none">Wait...</div>
<div id="debug"></div>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<link rel="stylesheet" href="Style_Tw/style_login.css" type="text/css">
<script language="JavaScript" src="Public_tw/fullscreen.js"> </script>
<script>
function activate_page(start_page){
parent.parent.window.location.href=start_page+'?';
}
</script>

</head>
<body onLOAD="DocumentLoad()" leftmargin="0" topmargin="0" bgcolor="#EEEFF0">

<div style="position:absolute;width:250px;left:13px;top:0px">
<div align="center"><font color="#CC0000" face="Verdana, Arial, Helvetica, sans-serif"><b>FIMI OnLine</b></font></div>
<table border="0" width="325" bgcolor="#3D4569" cellspacing="0" cellpadding="2">
<tr>
<td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0" height="36">
<tr>
<td width="100%" align="center" height="10">
<ilayer width="100%" left="-295" top="-182">
<layer width="100%" style="padding:15px"><font face="Verdana"
color="#FFFFFF"><strong>User authorization</strong></font></layer></ilayer></td>
</tr>
<tr>
<td width="100%" class="white" style="padding:4px" colspan="2">


<!-- PUT YOUR CONTENT BETWEEN HERE ---->
<form name="login_form" onsubmit="return ValidateForm(this)" action="login_tw.php" method="post">
<script language="JavaScript">
// Контроль полей ввода
form_submitted=false
loaded_MD5=false
function ValidateForm(theform)
{
if(theform.alias.value==''
|| (theform.alias.value.search
&& theform.alias.value.search(new RegExp("^[a-zA-Z][a-zA-Z0-9]+$","g"))<0))
{
alert('The access name must only have letters and digits.')
theform.alias.focus()
form_submitted=false
return false
}
if(theform.password.value.value=='' || theform.password.value.length <6)
{
alert('Password length can not be less than6')
theform.password.focus()
form_submitted=false
return false
}
if(loaded_MD5)
{
theform.user_login.value=MD5(theform.password.value)
theform.password.value=''
}
return true
}

function DocumentLoad()
{
document.login_form.alias.focus()
document.login_form.alias.select()
}
</script>
<br/>
<table width="100%" border="0" cellspacing="0" cellpadding="3" align="center" class="table_list" >
<tr>
<td width="45%" style="padding:5px"><!--<b><u>L</u></b>ogin: -->Login</td>
<td width="55%" align="left">
<input type="text" value="" name="alias" style=" width: 100%" autocomplete="off">
</td>
</tr>
<tr>
<td width="45%"><!--<b><u>P</u></b>assword:-->Password</td>
<td width="55%" align="left">
<input type="password" value="" name="password" style=" width: 100%" autocomplete="off">
</td>
</tr>
<tr>
<td colspan = 2 style="padding-top: 8px" align="center" >
<div align="center">
<!--<b><u>U</u></b>se this button-->
<input type="submit" name="ok" value='Enter'
onclick="if(this.disabled || typeof(this.disabled)=='boolean') this.disabled=true ; form_submitted_test=form_submitted ; form_submitted=true ; form_submitted=(!form_submitted_test || confirm('Are you sure you want to submit this form again?')) ; if(this.disabled || typeof(this.disabled)=='boolean') this.disabled=false ; sub_form='' ; return true"
>
</div>
</td>
</tr>
<tr>
<td colspan="2" style="padding:5px">Open in new window
<input type="checkbox" value="1" name="nw" >
</td>
</tr>

</table>

<input type="hidden" name="mode_action" value="atm" />

<input type="hidden" name="pg" value="0" />
</form>
<!-- END YOUR CONTENT HERE----->

</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<script>
// showimage.style.left=document.body.clientWidth/2 - showimage.offsetWidth/2;
// showimage.style.top=document.body.clientHeight/2 - showimage.offsetHeight/2;
</script>
</body>
</html>



Прошу помощи...

296
24 июля 2008 года
Virtuoso
331 / / 31.07.2005
Я тут точно ничем не помогу, это к HookEst :)
У тебя он ругается, я так понимаю, что нет такого объекта. Может он у тебя ещё не успевает страницу прогрузить, прежде чем начинает вводить логин....
Или попробуй для эксперимента не просто "alias.value", а как у меня "elements("alias").Value = login"....

И у меня перед вводом проверяется та ли вообще страница сейчас загружена и выглядит это так...
 
Код:
If pDisp.Document.Frames.length = 1 Then
      State = "page1"
        With pDisp.Document.Frames(0).Document.Forms(0)
             .elements("p_logname").Value = login
             .p_pwd.Value = pwd
             .submit
        End With
    End If
17K
24 июля 2008 года
HookEst
144 / / 27.03.2008
точно уже не помню, но
в посте 06.05.2008, 18:18, мы решили "будем юзать DocumentComplete, а не NavigateComplete, ждет полной загрузки страницы, вызывается для каждого фрейма", при NavigateComplete - форма еще может не загрузиться...
296
24 июля 2008 года
Virtuoso
331 / / 31.07.2005
Вот) ну я хоть частично был прав)
18K
24 июля 2008 года
rostov-ilya
29 / / 16.04.2007
Всем спасибо.
Я пошол вот этим методом:

Цитата:

Private Sub Command1_Click()

Set inet = CreateObject("InternetExplorer.Application")
inet.Visible = True
inet.Navigate "https://192.168.240.34/action_tw.php?mode_action=atm&pg=0"
Sleep 3000

Set inetForm = inet.document.Forms(0)

inetForm.elements("alias").Value = "login"
inetForm.elements("password").Value = "pas"
inetForm.elements("ok").Click


End Sub



Дальше страничка с которой часть (выделена на рисунке) надо вывести на форму и переодически обновлять, и как то отслеживать изменения. (скриншот и html в аттаче)
Заранее спасибо за помощ.

296
24 июля 2008 года
Virtuoso
331 / / 31.07.2005
Мне кажется использовать Sleep здесь не очень корректно. Если во время запуска этой проги другие проги будут совершать длительные операции, время загрузки страницы может быть и больше 3-х секунд, а следовательно опять вылезет ошибка.
18K
24 июля 2008 года
rostov-ilya
29 / / 16.04.2007
Цитата: Virtuoso
Мне кажется использовать Sleep здесь не очень корректно. Если во время запуска этой проги другие проги будут совершать длительные операции, время загрузки страницы может быть и больше 3-х секунд, а следовательно опять вылезет ошибка.



Можно увеличить, или может есть запрос который возвращает загрузилась страница или нет? но это не так важно можно проследить чтобы залогинелась. Самое главное вывести на форму то что надо и обновлять страницу(логиниться опять не нужно), и как то отслеживать изменения...

296
24 июля 2008 года
Virtuoso
331 / / 31.07.2005
Легче как сказал HookEst - использовать DocumentComplete вместо NavigateComplete.
А для отслеживания изменений придётся через определённый интервал времени обновлять страницу (.Refresh) и снова считывать данные.

Я так понимаю, что у тебя не безлимит, раз нужно знать состояние счёта, а следовательно такое отслеживание изменений влетит в некоторую копеечку)
18K
24 июля 2008 года
rostov-ilya
29 / / 16.04.2007
Цитата: Virtuoso
Легче как сказал HookEst - использовать DocumentComplete вместо NavigateComplete.
А для отслеживания изменений придётся через определённый интервал времени обновлять страницу (.Refresh) и снова считывать данные.

Я так понимаю, что у тебя не безлимит, раз нужно знать состояние счёта, а следовательно такое отслеживание изменений влетит в некоторую копеечку)




задача с успеет не успеет загрузится в принципе не важна логинится 1 раз прослежу. с обновлением страницы понятно, проблема в форму вставит что надо и отслеживать изменения...
Ну и это не состояние счета это статистика банкоматов надо отслеживать если с каким проблема, количество трафика значение не имеет:)

296
24 июля 2008 года
Virtuoso
331 / / 31.07.2005
А вот это уже к HookEst) Я в html полный ноль.
17K
25 июля 2008 года
HookEst
144 / / 27.03.2008
Обработку ошибки загрузки надо ставить в любом случае, и по DocumentComplete сервер может вернуть не то, что надо. Я так понял, сеть местная, сбоев и "тормозов" там обычно гораздо меньше чем в интернете, Sleep может вполне пойти, т.к. гораздо проще да и торопится не нужно. Проще всего завернуть все в OnError ...
А страница, я понял, и так сама обновляется каждые 3 минуты. Если да то, не нужно делать Reload, а просто по таймеру вынимать с нее данные. Вот только возможно ссылка на document(и др.) может сломаться при перезагрузке, так что хранить их в переменных не нужно. А сами данные попробуйте вынимать не из HTML, а из объекта myData, это javascript array с данными таблицы, найдите его инициализацию в тексте страницы, там все есть. Единственно, этот объект должен быть доступен как атрибут window, а не document.
18K
25 июля 2008 года
rostov-ilya
29 / / 16.04.2007
Цитата: HookEst
Обработку ошибки загрузки надо ставить в любом случае, и по DocumentComplete сервер может вернуть не то, что надо. Я так понял, сеть местная, сбоев и "тормозов" там обычно гораздо меньше чем в интернете, Sleep может вполне пойти, т.к. гораздо проще да и торопится не нужно. Проще всего завернуть все в OnError ...
А страница, я понял, и так сама обновляется каждые 3 минуты. Если да то, не нужно делать Reload, а просто по таймеру вынимать с нее данные. Вот только возможно ссылка на document(и др.) может сломаться при перезагрузке, так что хранить их в переменных не нужно. А сами данные попробуйте вынимать не из HTML, а из объекта myData, это javascript array с данными таблицы, найдите его инициализацию в тексте страницы, там все есть. Единственно, этот объект должен быть доступен как атрибут window, а не document.



Я в этом не селен, подскажите каким образом мне это сделать?
Может можно как то текст скрипта сохранить в txt?, а там уже есть текст img src=\"Image_tw/ball/greenball.gif и img src=\"Image_tw/ball/blueball.gif в 4 местах это значит все хорошо, и сделать обычный поиск на img src="Image_tw/ball/redball.gif и img src="Image_tw/ball/whiteball.gif иесли находит то будет сообщать.

18K
30 июля 2008 года
rostov-ilya
29 / / 16.04.2007
Ну что нет не у кого идей как html сохранить в txt?
17K
30 июля 2008 года
HookEst
144 / / 27.03.2008
Зачем сохранять то?
есть innerHTML, в нем и есть все содержимое страницы, но удобнее добраться к значениям через DOM.
69K
01 марта 2011 года
OleaMM
1 / / 01.03.2011
А что это вообще за биллинговая система?, где ее можно найти?
69K
19 марта 2011 года
Edwin321
1 / / 07.03.2011
Glad to become a member of this forum.its rally nice.all code are really helpful.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог