Что нового

Программа - баланс счета интернет абонента

xmel-sera

Новичок
Сообщения
16
Репутация
0
Здравствуйте! Есть такая задача. Нужно из исходного кода страницы, которая располагается после страницы ввода номера модема и пароля, повыдергивать неопределенные слова и цифры, и вписать их вместо значения "текст" label-a в программе.
Для ясности это программа которая показывает баланс счета интернет абонента без видимого использования браузера. Залогиниться на сайте удается, получить исходный код тоже, а вот с поиском и присвоением значения проблема, особенно с поиском, потому как данные могут быть разные, как у каждого абонента.)
Поскольку пока не умею искать необходимый текст в памяти, решил временно создавать текстовый файл и сохранять его в текстовом документе на диске Д, который после закрытия программы удаляется.
Текст программы:

Код:
#include <GUIConstants.au3>
#include <Array.au3>
#include <File.au3>

GUICreate("Стан рахунку абонента Інтертелеком", 350, 450)

Opt("GUICoordMode",2)
GUICtrlCreateLabel ( "Номер:", 30, 30 ,40)
GUICtrlCreateLabel ( "Пароль:", 90, -1, 40)
$phone = GUICtrlCreateInput ("", -125,  -25, 80, 20)
$pass = GUICtrlCreateInput ("", 50, -20, 80, 20)
GUICtrlCreateLabel ( "Особовий рахунок.............................:", -270, 20, 190)
GUICtrlCreateLabel ( "Абонент..............................................:", -190, 0, 190)
GUICtrlCreateLabel ( "Номер.................................................:", -190, 0, 190)
GUICtrlCreateLabel ( "Стан....................................................:", -190, 0, 190)
GUICtrlCreateLabel ( "Пакет..................................................:", -190, 0, 190)
GUICtrlCreateLabel ( "Додаткова угода...............................:", -190, 0, 190)
GUICtrlCreateLabel ( "Дата підключення..............................:", -190, 0, 190)
GUICtrlCreateLabel ( "Абонентський стаж...........................:", -190, 0, 190)
GUICtrlCreateLabel ( "Лояльний стаж..................................:", -190, 0, 190)
GUICtrlCreateLabel ( "E-mail...................................................:", -190, 0, 190)
GUICtrlCreateLabel ( "- (грн.)..................................................:", -190, 0, 190)
GUICtrlCreateLabel ( "Сальдо................................................:", -190, 0, 190)
GUICtrlCreateLabel ( "Передплачені послуги на місяць......:", -190, 0, 190)
GUICtrlCreateLabel ( "Неактивовані бонуси (з 094).............:", -190, 0, 190)
GUICtrlCreateLabel ( "- (МБ)....................................................:", -190, 0, 190)
GUICtrlCreateLabel ( "Трафік (Отримано+Передано)...........:", -190, 0, 190)
GUICtrlCreateLabel ( "Пакетний трафік.................................:", -190, 0, 190)
; Лейблы ответов
$CTRL_lbl0 = GUICtrlCreateLabel ( "Особовий рахунок - ?", 5, -340, 140)
$CTRL_lbl1 = GUICtrlCreateLabel ( "Абонент - ?", -140, 0, 140)
$CTRL_lbl2 = GUICtrlCreateLabel ( "Номер - ?", -140, 0, 140)
$CTRL_lbl3 = GUICtrlCreateLabel ( "Стан - ?", -140, 0, 140)
$CTRL_lbl4 = GUICtrlCreateLabel ( "Пакет - ?", -140, 0, 140)
$CTRL_lbl5 = GUICtrlCreateLabel ( "Додаткова угода - ?", -140, 0, 140)
$CTRL_lbl6 = GUICtrlCreateLabel ( "Дата підключення - ?", -140, 0, 140)
$CTRL_lbl7 = GUICtrlCreateLabel ( "Абонентський стаж - ?", -140, 0, 140)
$CTRL_lbl8 = GUICtrlCreateLabel ( "Лояльний стаж - ?", -140, 0, 140)
$CTRL_lbl9 = GUICtrlCreateLabel ( "E-mail - ?", -140, 0, 140)
$CTRL_lbl10 = GUICtrlCreateLabel ( "- (грн.) - ?", -140, 0, 140)
$CTRL_lbl11 = GUICtrlCreateLabel ( "Сальдо - ?", -140, 0, 140)
$CTRL_lbl12 = GUICtrlCreateLabel ( "Передплачені послуги - ?", -140, 0, 140)
$CTRL_lbl13 = GUICtrlCreateLabel ( "Неактивовані бонуси - ?", -140, 0, 140)
$CTRL_lbl14 = GUICtrlCreateLabel ( "- (МБ) - ?", -140, 0, 140)
$CTRL_lbl15 = GUICtrlCreateLabel ( "Трафік - ?", -140, 0, 140)
$CTRL_lbl16 = GUICtrlCreateLabel ( "Пакетний трафік - ?", -140, 0, 140)
; кнопки
$CTRL_btn0 = GUICtrlCreateButton ("Отримати дані", -295, 10, 100, 25)
$CTRL_btn1 = GUICtrlCreateButton ( "Закрити",  25, -1, 100)

GUISetState ()   

$b = True
If $b = True Then FileInstall("C:\data.txt", "D:\data.txt", 1)

While 1
  $msg = GUIGetMsg()

  Select
  Case $msg = $CTRL_btn0
	  
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST","https://assa.intertelecom.ua/ru/login")
$oHTTP.setTimeouts(5000, 5000, 15000, 15000)
$oHTTP.SetRequestHeader("Accept", "*/*")
$oHTTP.SetRequestHeader("Accept-Language", "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3")
$oHTTP.SetRequestHeader("Referer","https://assa.intertelecom.ua/ru/statistic")
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1")
$oHTTP.SetRequestHeader("Host","assa.intertelecom.ua")
$oHTTP.SetRequestHeader("Proxy-Connection", "Keep-alive")
$oHTTP.Send("phone=" & GUICtrlRead($phone) & "&pass=" & GUICtrlRead($pass))
$oHTTP.WaitForResponse

; Получаем исходный код страницы, когда мы уже авторизовались.
$oHTTP.Open("GET","https://assa.intertelecom.ua/ru/statistic")
$oHTTP.Send()
$oHTTP.WaitForResponse
;ConsoleWrite($oHTTP)


$File=FileOpen ("D:\data.txt", 2)
FileWrite($File, $oHTTP.ResponseText)
FileClose($File)

;MsgBox(0,0,$oHTTP.ResponseText)

    Case $msg = $CTRL_btn1
      MsgBox(0, "Вихід з програми", "Закриття...")
	   FileDelete ( "D:\data.txt" )
	 ExitLoop
	Case $msg = $GUI_EVENT_CLOSE
      MsgBox(0, "Вихід з програми", "Закриття...")
	   FileDelete ( "D:\data.txt" )
	 ExitLoop
	   
  EndSelect
WEnd

И еще прикрепляю файл data.txt с исходный текстом страницы на которой будет производиться поиск

И вид страницы для ясности, поскольку без наличия номера модема, на сайт не войти.

Требуется выбрать значения

1111105
Мобільний абонент - -
389111171
Активен
3G Адреналин
Нет
02.06.2011
0.0
0.0
[email protected]
(грн.)
11.67
0.00
0.00
(МБ)
479
(МБ)
584.0605

Конфиденциальные данные заменены просто набором цифр, платные придложения не рассматриваются. )
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
xmel-sera,
Код:
#include <Array.au3>

$sText = FileRead(@ScriptDir & '\data.txt')
$aTemp = StringRegExp($sText, '(?s)color:.*?;">\s*(.*?)\s*<', 3)
Dim $aResult[UBound($aTemp)]
$j = -1
For $i = 0 To UBound($aTemp) - 1
	If $aTemp[$i] Then
		$j += 1
		$aResult[$j] = $aTemp[$i]
	EndIf
Next
ReDim $aResult[$j + 1]
_ArrayDisplay($aResult)
 
Автор
X

xmel-sera

Новичок
Сообщения
16
Репутация
0
Возвращает ошибку...

>"C:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\1.au3"
D:\1.au3 (90) : ==> Array variable subscript badly formatted.:
Dim $aResult [UBound($aTemp)]
Dim $aResult [^ ERROR
>Exit code: 1 Time: 12.417
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Код:
$sText = FileRead(@ScriptDir & '\data.txt')

замени на
Код:
if FileExists (@ScriptDir & '\data.txt') = 0 then
	MsgBox (0,0,'Нет файла. Срочно его скопировать в директорию со скриптом')
	$var = FileOpenDialog('Ищем файл data.txt', @ScriptDir & "\", "Text (*.txt)", 1 )
	FileCopy ( $var, @ScriptDir & '\data.txt' )
	$sText = FileRead($var)
Else
	$sText = FileRead(@ScriptDir & '\data.txt')
endif
 
Автор
X

xmel-sera

Новичок
Сообщения
16
Репутация
0
Ох спасибо, не думал что будет так быстро. Получилось, данные есть. :ok:
Результат на рисунке в окне справа.
Но есть еще одна задача, можно ли эти данные влепить сразу в окно программы вместо текста с вопросительными знаками (это отдельные лейблы), или как то иначе прописать чтобы было понятно. Можно ли как то разбить массив на строчки, и каждому лейблу присвоить свою строку текста?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
А смысл? там еще пилить и пилить.
Код:
$CTRL_lbl0 = GUICtrlCreateLabel ( "Особовий рахунок - ?", 5, -340, 140)

заменяй на
Код:
$CTRL_lbl0 = GUICtrlCreateLabel ($aResult[0], 5, -340, 140)


только.. лучше $CTRL_lbl делать с пустыми текстами, а по получению результата устраивать
Код:
GUICtrlSetData($CTRL_lbl0, $aResult[0])

но можно почитать здесь
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
361
Но есть еще одна задача, можно ли эти данные влепить сразу в окно программы вместо текста с вопросительными знаками (это отдельные лейблы), или как то иначе прописать чтобы было понятно. Можно ли как то разбить массив на строчки, и каждому лейблу присвоить свою строку текста?
Может это подойдет http://www.autoitscript.com/forum/topic/105814-table-udf/page__hl__table ?
 
Автор
X

xmel-sera

Новичок
Сообщения
16
Репутация
0
Спасибо, на форме нужное значение появилось!!! Дальше буду усовершенствовать!

Кстати сделал без использования файла data.txt...

Код:
[code]; Получаем исходный код страницы, когда мы уже авторизовались.
$oHTTP.Open("GET","https://assa.intertelecom.ua/ru/statistic")
$oHTTP.Send()
$oHTTP.WaitForResponse

$sText = $oHTTP.ResponseText      ;FileRead(@ScriptDir & '\data.txt')
$aTemp = StringRegExp($sText, '(?s)color:.*?;">\s*(.*?)\s*<', 3)
Dim $aResult [UBound($aTemp)]
$j = -1
For $i = 0 To UBound($aTemp) - 1
    If $aTemp[$i] Then
        $j += 1
        $aResult[$j] = $aTemp[$i]
    EndIf
Next
ReDim $aResult[$j + 1]
_ArrayDisplay($aResult)[/code]
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
xmel-sera [?]
данные влепить сразу в окно программы
Попробуйте как-то так:
Код:
#include <GUIConstantsEx.au3>

$j = 0
$q = 0
Dim $aLabel[19][2] = [[18],['Лицевой счет'],['Абонент'],['Номер телефона'],['Состояние'],['Пакет'], _
		['Дополнительное соглашение'],['Дата подключения'],['Абонентский стаж (гг.мм)'], _
		['Лояльный стаж (гг.мм)'],['E-Mail'],['-'],['Сальдо'],['Предоплаченые услуги на месяц'], _
		['Неактивированные бонусы (с 094)'],['-'],['Трафик (получено+передано)'],['Трафик'],['пакетный трафик']]

GUICreate('Test', 360, $aLabel[0][0] * 23 + 50)
For $i = 1 To $aLabel[0][0]
	GUICtrlCreateLabel($aLabel[$i][0], 10, 10 + ($i - 1) * 23, 200, 18)
	GUICtrlSetBkColor(-1, 0xEBEBEB)
	GUICtrlSetFont(-1, 9, 400, 1, 'Comic Sans MS')
	$aLabel[$i][1] = GUICtrlCreateLabel('', 220, 10 + ($i - 1) * 23, 120, 18)
	GUICtrlSetBkColor(-1, 0xDCDCDC)
	GUICtrlSetFont(-1, 9, 600, 1, 'Comic Sans MS')
Next
$nButton = GUICtrlCreateButton('Get', 130, $aLabel[0][0] * 23 + 20, 100, 20)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			GUICtrlSetState($nButton, $GUI_DISABLE)
			If $q < 5 Then
				$sText = FileRead(@ScriptDir & '\data.txt'); или как Вам надо
				$aTemp = StringRegExp($sText, '(?s)color:.*?;">\s*(.*?)\s*<', 3)
				If Not @error Then
					$q += 1
					For $i = 0 To UBound($aTemp) - 1
						If $aTemp[$i] Then
							$j += 1
							GUICtrlSetData($aLabel[$j][1], $aTemp[$i])
						EndIf
					Next
				Else
					For $i = 0 To $aLabel[0][0]
						GUICtrlSetData($aLabel[$i][1], 'Error')
					Next
				EndIf
				$j = 0
				GUICtrlSetState($nButton, $GUI_ENABLE)
			Else
				For $i = 0 To $aLabel[0][0]
					GUICtrlSetData($aLabel[$i][1], 'Хватит уже :)')
				Next
				GUICtrlSetState($nButton, $GUI_DISABLE)
			EndIf
	EndSwitch
WEnd
Или так:
Код:
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>

$j = 0
$q = 0
Dim $aLabel[19][2] = [[18],['Лицевой счет'],['Абонент'],['Номер телефона'],['Состояние'],['Пакет'], _
		['Дополнительное соглашение'],['Дата подключения'],['Абонентский стаж (гг.мм)'], _
		['Лояльный стаж (гг.мм)'],['E-Mail'],['-'],['Сальдо'],['Предоплаченые услуги на месяц'], _
		['Неактивированные бонусы (с 094)'],['-'],['Трафик (получено+передано)'],['Трафик'],['пакетный трафик']]

$hGui = GUICreate('Test', 360, $aLabel[0][0] * 23 + 75, -1, -1, -1, $WS_EX_TOOLWINDOW)
For $i = 1 To $aLabel[0][0]
	GUICtrlCreateLabel($aLabel[$i][0], 10, 10 + ($i - 1) * 23, 200, 18)
	GUICtrlSetBkColor(-1, 0xEBEBEB)
	GUICtrlSetFont(-1, 9, 400, 1, 'Comic Sans MS')
	$aLabel[$i][1] = GUICtrlCreateLabel('', 220, 10 + ($i - 1) * 23, 120, 18)
	GUICtrlSetBkColor(-1, 0xDCDCDC)
	GUICtrlSetFont(-1, 9, 600, 1, 'Comic Sans MS')
Next
$nButton = GUICtrlCreateButton('Get', 130, $aLabel[0][0] * 23 + 20, 100, 20)
$hStatus = _GUICtrlStatusBar_Create($hGui)
_GUICtrlStatusBar_SetText($hStatus, @TAB & 'Нажмите кнопку "Get"', 0)
$nProgress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH)
GUICtrlSetState($nProgress, $GUI_HIDE)
$hProgress = GUICtrlGetHandle($nProgress)
_GUICtrlStatusBar_EmbedControl($hStatus, 0, $hProgress)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			GUICtrlSetState($nButton, $GUI_DISABLE)
			If $q < 5 Then
				GUICtrlSetData($nProgress, 0)
				GUICtrlSetState($nProgress, $GUI_SHOW)
				For $i = 0 To $aLabel[0][0]
					GUICtrlSetData($aLabel[$i][1], '')
				Next
				$sText = FileRead(@ScriptDir & '\data.txt'); или как Вам надо
				$aTemp = StringRegExp($sText, '(?s)color:.*?;">\s*(.*?)\s*<', 3)
				If Not @error Then
					$q += 1
					For $i = 0 To UBound($aTemp) - 1
						If $aTemp[$i] Then
							$j += 1
							GUICtrlSetData($aLabel[$j][1], $aTemp[$i])
						EndIf
						Sleep(100)
						GUICtrlSetData($nProgress, 100 * $j / $aLabel[0][0])
					Next
					_GUICtrlStatusBar_SetText($hStatus, @TAB & 'OK', 0)
				Else
					For $i = 0 To $aLabel[0][0]
						GUICtrlSetData($aLabel[$i][1], 'Error')
					Next
					_GUICtrlStatusBar_SetText($hStatus, @TAB & 'ERROR!', 0)
				EndIf
				$j = 0
				GUICtrlSetState($nButton, $GUI_ENABLE)
			Else
				GUICtrlSetData($nProgress, 0)
				GUICtrlSetState($nProgress, $GUI_SHOW)
				For $i = 0 To $aLabel[0][0]
					GUICtrlSetData($aLabel[$i][1], 'Хватит уже :)')
				Next
				_GUICtrlStatusBar_SetText($hStatus, @TAB & 'Хватит уже :)', 0)
				GUICtrlSetState($nButton, $GUI_DISABLE)
			EndIf
			GUICtrlSetState($nProgress, $GUI_HIDE)
	EndSwitch
WEnd
 
Верх