Что нового

[Сеть, интернет] Скрипт уведомление о свободных талончиках

artpluss

Новичок
Сообщения
21
Репутация
0
Здравствуйте уважаемые форумчане!

Помогите пожалуйста написать скрипт, который будет отслеживать на сайте: https://registratura96.ru свободные талончики и выводить уведомление

Конкретно интересует талончик к хирургам по этому адресу: https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1181&DocId=20559

Например при появлении на страничке (см выше ссылку) слов Ближайшее время: (это значит есть свободный талон) скрипт должен вывести уведомление.
 

homesad

Новичок
Сообщения
2
Репутация
0
Вот набросок, в конце работы если все ОК, показывает массив с именами врачей и их кабинетов.
слов "ближайшее время" пока не видел.

Код:
#include <Array.au3>

 local  $sAB = "А,Б,В,Г,Д,Е,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я"
 local  $aAB = StringSplit($sAB,',',2)

 local  $sLNK = 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1181&DocId=20559'
 local  $sBuf = InetRead($sLNK,1+2)
        If @error Then
          MsgBox(0,1,@error)
          Exit
        EndIf
        $sBuf = BinaryToString($sBuf,4)
        ;FileWrite('1.txt',$sBuf)
 local  $aDim = StringRegExp($sBuf,'<p style.*>(.*)</p>',3)
 local  $aKab = StringRegExp($sBuf,'<div style.*>(.*)</div>',3)
        If IsArray($aDim) Then
          For $i=0 to UBound($aDim)-1
            $aDim[$i] = GetQuotingStr($aDim[$i])
          Next
          If IsArray($aKab) Then
            For $i=0 to UBound($aDim)-1
              $aDim[$i]&= ' - ' & $aKab[$i]
            Next
          EndIf
          _ArrayDisplay($aDim)
        Else
          MsgBox(0,UBound($aDim),$sBuf)
        EndIf

Func GetQuotingStr($sStr,$iDebug=0)
 local  $aDim = StringSplit($sStr,';',2)
 local  $sNum
 local  $sRet = ''
        If $iDebug Then _ArrayDisplay($aDim)
        For $i=0 to UBound($aDim)-2
          $sNum = $aDim[$i]
          If StringLeft($sNum,1)=' ' Then
            $sRet&= ' '
            $sNum = StringMid($sNum,2)
          EndIf
          $sNum = Int('0' & StringMid($sNum,3))
          $aDim[$i] = $sNum
          ;MsgBox(0,$sNum,$sRet)
          $sRet&=  ( $sNum=1025 ? 'Ё' : $aAB[$sNum-1040] )
        Next
        If $iDebug Then _ArrayDisplay($aDim,$sRet)
        Return $sRet
EndFunc
 
Автор
A

artpluss

Новичок
Сообщения
21
Репутация
0
Спасибо за ваши старания. Но мне нужно немного другое, хотя ваш код мне тоже пригодится

Вот пример того, что у меня вышло

1. Просьба поправить код, если что не так
2. Не работает функция отправки уведомления на почту
3. Хотелось бы прерывать выполнение кода например сочетанием клавиш Ctrl + Alt + P

Попробуйте выбрать дерматолога и запустить код. У дерматолога всегда есть талончики

Код:
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <WindowsConstants.au3>
#Include <IE.au3>

Local $msg, $sVer, $hGUI, $start, $hDoctor, $oIE, $index, $link, $str, $hMAIL, $exit

$sVer="версия 2019.04.18"

If WinExists(@ScriptName) Then Exit
	AutoItWinSetTitle(@ScriptName)

Opt("TrayIconHide", 1)

; Создать окно
$hGUI=GUICreate("Registratura96", 500, 500, -1, -1, BitOR($ws_minimizebox, $ws_group, $ws_caption, $ws_popup, $ws_sysmenu))

GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)

$hDoctor = GUICtrlCreateCombo ( "Терапевт", 180, 30, 90, 20)
GUICtrlSetData(-1, "Хирург" , "Терапевт") ; добавляет другие пункты и устанавливает новый по умолчанию
GUICtrlSetData(-1, "Невролог" , "Терапевт") ; добавляет другие пункты и устанавливает новый по умолчанию
GUICtrlSetData(-1, "Окулист" , "Терапевт") ; добавляет другие пункты и устанавливает новый по умолчанию
GUICtrlSetData(-1, "Дерматолог" , "Терапевт") ; добавляет другие пункты и устанавливает новый по умолчанию

$start = GUICtrlCreateButton ( "Пуск", 300, 30, 40, 20)
$exit = GUICtrlCreateButton ( "Выход", 360, 30, 40, 20)

While 1
   $msg = GUIGetMsg()
        Select
        Case $msg = -3 Or $msg = -1 Or $msg = $exit Or $msg = $GUI_EVENT_CLOSE
            ExitLoop
		Case $msg = $start

			$index = GUICtrlSendMsg($hDoctor, $CB_GETCURSEL, 0, 0)

			If $index = 0 Then
;~ 					 Терапевт
			   		 $link = "https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1177"
					 _Progress ($link)
			EndIf

			If $index = 1 Then
;~ 					 Хирург
					 $link = "https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1181"
					 _Progress ($link)
			EndIf

			If $index = 2 Then
;~ 					 Невролог
			   		 $link = "https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1167"
					 _Progress ($link)
			EndIf

			If $index = 3 Then
;~ 					 Окулист
			   		 $link = "https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1170"
					 _Progress ($link)
			EndIf

			If $index = 4 Then
;~ 					 Дерматолог
					 $link = "https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1163"
					 _Progress ($link)
			EndIf
	  EndSelect
   WEnd

Func _Progress ($link)
   $i = 0
   Do
	  $oIE = _IECreate ($link, 0, 1)
		 If StringInStr(_IEBodyReadHTML($oIE),'<zzz class="text-primary">Ближайшее время:</zzz>') Then
			MsgBox(262208, "Информация", "Есть талончик")
			$i = 1
			_IEQuit($oIE)
;~ 			Здесь нужно отправить уведомление на почту, о том что появился талончик
;~ 			_SendMail()
		 Else
;~ 			MsgBox(262208, "Информация", "Талончика нет")
			_IEQuit($oIE)
		 EndIf

   Until $i = 1
EndFunc   ;==>_Progress

Func _SendMail()
   $str = "http://schemas.microsoft.com/cdo/configuration/"
   $hMAIL = ObjCreate ("CDO.Message")
	   With $hMAIL
		   .From = "[email protected]"
		   .To = "[email protected]"
		   .Subject = "Test"
		   .TextBody = "Test"
;~ 		   .AddAttachment ("C:\boot.ini") ;файл для отправки
	   EndWith
	   With $hMAIL.Configuration.Fields
		   .Item ($str & "sendusing") = 2
		   .Item ($str & "smtpserver") = "smtp.inbox.ru" ;SMTP Server
		   .Item ($str & "smtpauthenticate") = 1
		   .Item ($str & "sendusername") = "login"
		   .Item ($str & "sendpassword") = "password" ;Пароль SMTP-сервер
		   .Item ($str & "smtpserverport") = 465 ;Порт
		   .Update
	   EndWith
   $hMAIL.Send
EndFunc   ;==>_SendMail
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Привет, вот что у меня получилось:

Код:
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <WindowsConstants.au3>
#include <INet.au3>

Func _Exit()
   Exit
EndFunc
HotKeySet('^!p', '_Exit')  			; Выход на CTRL + ALT + P

Local $msg, $sVer, $hGUI, $start, $hDoctor, $oIE, $index, $link, $str, $hMAIL, $exit, $sVer="версия 2019.04.18"

Dim $aLinks[5][2] = [['Терапевт', 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1177'], _
					 ['Хирург', 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1181'], _
					 ['Невролог', 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1167'], _
					 ['Окулист', 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1170'], _
					 ['Дерматолог', 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1163']]

If WinExists(@ScriptName) Then Exit AutoItWinSetTitle(@ScriptName)

Opt("TrayIconHide", 1)

; Создать окно
$hGUI=GUICreate("Registratura96", 500, 500, -1, -1, BitOR($ws_minimizebox, $ws_group, $ws_caption, $ws_popup, $ws_sysmenu))

GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)

$hDoctor = GUICtrlCreateCombo ( "Терапевт", 180, 30, 90, 20)
For $i = 1 To UBound($aLinks) -1
   GUICtrlSetData(-1, $aLinks[$i][0] , "Терапевт") ; добавляет другие пункты и устанавливает новый по умолчанию
Next

$start = GUICtrlCreateButton ( "Пуск", 300, 30, 40, 20)
$exit = GUICtrlCreateButton ( "Выход", 360, 30, 40, 20)

While 1
   $msg = GUIGetMsg()
   Select
	  Case $msg = -3 Or $msg = -1 Or $msg = $exit Or $msg = $GUI_EVENT_CLOSE
		 ExitLoop
	  Case $msg = $start
		 $iIndex = GUICtrlSendMsg($hDoctor, $CB_GETCURSEL, 0, 0)
		 If _Check($aLinks[$iIndex][1]) Then
			$sMessage = "Есть талончик к " & $aLinks[$iIndex][0] & 'у!'
			ConsoleWrite($sMessage & @CRLF)
			_SendMail($sMessage)
		 Else
			ConsoleWrite('Нет свободных талончиков :(' & @CRLF)
		 EndIf
   EndSelect
WEnd

Func _Check($sLink)
   $sPage = InetRead($sLink, 3)
   Return StringInStr(BinaryToString($sPage, 4), 'Ближайшее время:')			; Проверяем, есть ли в тексте страницы строка "Ближайшее время:"
EndFunc

Func _SendMail($sMessage)
   $str = "http://schemas.microsoft.com/cdo/configuration/"
   $hMAIL = ObjCreate ("CDO.Message")

   With $hMAIL
	  .From = "мойлогин@gmail.com"
	  .To = "комулогин@gmail.com"
	  .Subject = "Test"
	  .TextBody = $sMessage
	  ;.AddAttachment ("C:\boot.ini") ;файл для отправки
   EndWith
   With $hMAIL.Configuration.Fields
	  .Item ($str & "sendusing") = 2
	  .Item ($str & "smtpserver") = "smtp.gmail.com" ;SMTP Server
	  .Item ($str & "smtpauthenticate") = 1
	  .Item ($str & "sendusername") = "мойлогин"
	  .Item ($str & "sendpassword") = "мойпароль" ;Пароль SMTP-сервер
	  .Item ($str & "smtpusessl") = 1
	  .Item ($str & "smtpserverport") = 465 ;Порт
	  .Update
   EndWith
   $hMAIL.Send
EndFunc

Не работает функция отправки уведомления на почту
Добавил опцию smtpusessl, получилось отправить письмо с gmail

Хотелось бы прерывать выполнение кода например сочетанием клавиш Ctrl + Alt + P
Добавил

Также заменил проверку с помощью IE на InetRead
 
Автор
A

artpluss

Новичок
Сообщения
21
Репутация
0
gunter123 сказал(а):
Привет, вот что у меня получилось:

Код:
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <WindowsConstants.au3>
#include <INet.au3>

Func _Exit()
   Exit
EndFunc
HotKeySet('^!p', '_Exit')  			; Выход на CTRL + ALT + P

Local $msg, $sVer, $hGUI, $start, $hDoctor, $oIE, $index, $link, $str, $hMAIL, $exit, $sVer="версия 2019.04.18"

Dim $aLinks[5][2] = [['Терапевт', 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1177'], _
					 ['Хирург', 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1181'], _
					 ['Невролог', 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1167'], _
					 ['Окулист', 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1170'], _
					 ['Дерматолог', 'https://rish.registratura96.ru/Doctor?CityId=city20&OrgId=13003694&DepId=99560005714&ServId=1163']]

If WinExists(@ScriptName) Then Exit AutoItWinSetTitle(@ScriptName)

Opt("TrayIconHide", 1)

; Создать окно
$hGUI=GUICreate("Registratura96", 500, 500, -1, -1, BitOR($ws_minimizebox, $ws_group, $ws_caption, $ws_popup, $ws_sysmenu))

GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)

$hDoctor = GUICtrlCreateCombo ( "Терапевт", 180, 30, 90, 20)
For $i = 1 To UBound($aLinks) -1
   GUICtrlSetData(-1, $aLinks[$i][0] , "Терапевт") ; добавляет другие пункты и устанавливает новый по умолчанию
Next

$start = GUICtrlCreateButton ( "Пуск", 300, 30, 40, 20)
$exit = GUICtrlCreateButton ( "Выход", 360, 30, 40, 20)

While 1
   $msg = GUIGetMsg()
   Select
	  Case $msg = -3 Or $msg = -1 Or $msg = $exit Or $msg = $GUI_EVENT_CLOSE
		 ExitLoop
	  Case $msg = $start
		 $iIndex = GUICtrlSendMsg($hDoctor, $CB_GETCURSEL, 0, 0)
		 If _Check($aLinks[$iIndex][1]) Then
			$sMessage = "Есть талончик к " & $aLinks[$iIndex][0] & 'у!'
			ConsoleWrite($sMessage & @CRLF)
			_SendMail($sMessage)
		 Else
			ConsoleWrite('Нет свободных талончиков :(' & @CRLF)
		 EndIf
   EndSelect
WEnd

Func _Check($sLink)
   $sPage = InetRead($sLink, 3)
   Return StringInStr(BinaryToString($sPage, 4), 'Ближайшее время:')			; Проверяем, есть ли в тексте страницы строка "Ближайшее время:"
EndFunc

Func _SendMail($sMessage)
   $str = "http://schemas.microsoft.com/cdo/configuration/"
   $hMAIL = ObjCreate ("CDO.Message")

   With $hMAIL
	  .From = "мойлогин@gmail.com"
	  .To = "комулогин@gmail.com"
	  .Subject = "Test"
	  .TextBody = $sMessage
	  ;.AddAttachment ("C:\boot.ini") ;файл для отправки
   EndWith
   With $hMAIL.Configuration.Fields
	  .Item ($str & "sendusing") = 2
	  .Item ($str & "smtpserver") = "smtp.gmail.com" ;SMTP Server
	  .Item ($str & "smtpauthenticate") = 1
	  .Item ($str & "sendusername") = "мойлогин"
	  .Item ($str & "sendpassword") = "мойпароль" ;Пароль SMTP-сервер
	  .Item ($str & "smtpusessl") = 1
	  .Item ($str & "smtpserverport") = 465 ;Порт
	  .Update
   EndWith
   $hMAIL.Send
EndFunc
Добавил опцию smtpusessl, получилось отправить письмо с gmail
Добавил

Также заменил проверку с помощью IE на InetRead

СПАСИБО. ИМЕННО ТО ЧТО И НУЖНО БЫЛО.
Все работает. Все красиво.
 
Верх