Программное "хождение по сайту"
Здравствуйте!
У моего провайдера заведено так, что свой лицевой счёт нужно смотреть на сайте. Каждый раз открывать стартовую страницу, вводить логин и пароль, нажимать на одну ссылку, нажимать на вторую ссылку и ВОТ... Я вижу свой счёт. Это надоело уже.
Ну и я подумал, раз уж мы здесь занимаемся программированием))... Может есть способ программно эти все шаги выполнить? Чтобы я запустил программу - бац, счёт!
А ещё лучше - если найти строку со счётом, считать её ... Счёт бы регулярно обновлялся и висел где-нибудь на рабочем столе. Отлично было бы!
А сам сайт вообще не открывать :)
Вот такая замороченнаяа идея. Есть у кого мысли?
Спасибо!
Спасибо великое за всю проделанную работу!!! Жалую Вам орден за заслуги перед Отечеством)
Теперь сделаю модную прогу для себя и друзей.
А вот строка:
одноподобную ошибку выдаёт..
так подразумевалось, что pDisp.Document.Frames(1) и есть фрейм MAIN,
сейчас же pDisp.Document - и есть document фрайма MAIN:
pDisp.Document.getElementsByTagName("TABLE").Item(3).tFoot.rows(0).cells(3).innerHTML
пишешь pDisp.Document
жмешь OK
в Watches в столбце Expression будет pDisp.Document (раскрыв ветку можно посмотреть его свойства), в столбце Value будет [object]
теперь в Expression добавляешь getElementsByTagName("TABLE")(т.е. д/б pDisp.Document.getElementsByTagName("TABLE"))
в Value д/б [object]
добавляешь дольше по цепочке (Item(3) ... и так далее) пока ругаться не начнет(т.е. Value не [object]), вот где он ругается?
Делаю Отладка->Добавить наблюдателя->pDisp.Document->ОК
В Value написано <Out of context>
Как раскрыть ветку я тоже не понимаю))
?
в столбце Context д/б имя текущей процедуры, у меня Form1.WebBrowser1_DocumentComplete
или правой кнопкой на pDisp в коде, AddWatch(или как там у тебя Наблюдатель :))
[object] написано у всех кроме всей строки целиком, если целиком, то пишется -
Вот такие пироги
cells(0) - первая ячейка
cells(1) - вторая
и т.д.
Дело было всё в том, что я эту строку написал и всё, сижу жду результата, а слово MSGBOX за меня дед Мазай будет писать.
А Cells там 3-й. просто видимо границы невидимы между столбцами.
Всё. Большое спасибо за труды!!!
rows и cells - соответствено их строки и столбцы, подбирай индексы и получай любую ячейку, какую тебе надо, innerHTML - то что внутри ячейки.
и Наблюдатель тебе в помощь, как ты без него обходился, это в Basic-е то, не представляю.
отключаюсь
Успехов.
У меня похожая проблема.
Есть сайт внутри сетки, надо на него логиниться, и смотреть переодически статистику, и если что то меняется чтобы она мне сигналила.
Пытаюсь залогинится этим способом:
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>
Прошу помощи...
У тебя он ругается, я так понимаю, что нет такого объекта. Может он у тебя ещё не успевает страницу прогрузить, прежде чем начинает вводить логин....
Или попробуй для эксперимента не просто "alias.value", а как у меня "elements("alias").Value = login"....
И у меня перед вводом проверяется та ли вообще страница сейчас загружена и выглядит это так...
State = "page1"
With pDisp.Document.Frames(0).Document.Forms(0)
.elements("p_logname").Value = login
.p_pwd.Value = pwd
.submit
End With
End If
в посте 06.05.2008, 18:18, мы решили "будем юзать DocumentComplete, а не NavigateComplete, ждет полной загрузки страницы, вызывается для каждого фрейма", при NavigateComplete - форма еще может не загрузиться...
Я пошол вот этим методом:
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 в аттаче)
Заранее спасибо за помощ.
Можно увеличить, или может есть запрос который возвращает загрузилась страница или нет? но это не так важно можно проследить чтобы залогинелась. Самое главное вывести на форму то что надо и обновлять страницу(логиниться опять не нужно), и как то отслеживать изменения...
А для отслеживания изменений придётся через определённый интервал времени обновлять страницу (.Refresh) и снова считывать данные.
Я так понимаю, что у тебя не безлимит, раз нужно знать состояние счёта, а следовательно такое отслеживание изменений влетит в некоторую копеечку)
А для отслеживания изменений придётся через определённый интервал времени обновлять страницу (.Refresh) и снова считывать данные.
Я так понимаю, что у тебя не безлимит, раз нужно знать состояние счёта, а следовательно такое отслеживание изменений влетит в некоторую копеечку)
задача с успеет не успеет загрузится в принципе не важна логинится 1 раз прослежу. с обновлением страницы понятно, проблема в форму вставит что надо и отслеживать изменения...
Ну и это не состояние счета это статистика банкоматов надо отслеживать если с каким проблема, количество трафика значение не имеет:)
А страница, я понял, и так сама обновляется каждые 3 минуты. Если да то, не нужно делать Reload, а просто по таймеру вынимать с нее данные. Вот только возможно ссылка на document(и др.) может сломаться при перезагрузке, так что хранить их в переменных не нужно. А сами данные попробуйте вынимать не из HTML, а из объекта myData, это javascript array с данными таблицы, найдите его инициализацию в тексте страницы, там все есть. Единственно, этот объект должен быть доступен как атрибут window, а не document.
А страница, я понял, и так сама обновляется каждые 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 иесли находит то будет сообщать.
есть innerHTML, в нем и есть все содержимое страницы, но удобнее добраться к значениям через DOM.