mail mail

Авторизация на веб-сервере средствами VBA

Функция ConnectServer предназначена для автоматизации авторизации на сайте, выполняемой путем заполнения полей с логином и паролем, и нажатием кнопки "Отправить" (т.н. "форма входа на сайт")

Пример использования функции:

Public Const URL_Login = "http://www.mysite.ru/private/login.php"    ' страница входа
Public Const URL_LoginOK = "http://www.mysite.ru/private/"    ' сюда попадем, если вход удался
Public Const URL_main = "http://www.mysite.ru/documents/add.php"    ' а эта страница сайта нам нужна для работы

Sub ПримерИспользования_ConnectServer()
    ' Dim IE As SHDocVw.InternetExplorer, IEdoc As HTMLDocument
   On Error Resume Next
    Set IE = ConnectServer    ' авторизуемся на сервере

    Set IEdoc = IE.Document    ' получаем ссылку на документ

    ' заполняем поля на сайте
   SetSelectElementValue IEdoc, "region", Город
    SetSelectElementValue IEdoc, "district", Район
    SetInputElementValue IEdoc, "body", Comment

    ' отправляем данные на сервер
   IEdoc.getElementsByName("add_form").Item(0).submit

    IE.Quit ' закрываем браузер
End Sub

Код функции ConnectServer:

Function ConnectServer() As Object
    ' функция предназначена для авторизации на сайтах
   ' (ввод логина и пароля через веб-интерфейс)
   ' Возвращает объект типа InternetExplorer с загруженной страницей сайта, где мы авторизовались
   ' НЕНУЖНЫЕ СТРОКИ КОДА ЗАКОММЕНТИРОВАНЫ

    Login$ = "admin": Password$ = "password"    ' укажите здесь логин и пароль для сайта
   On Error Resume Next: Err.Clear
    ' Dim pi As New ProgressIndicator
   ' pi.Show "Отправка объявлений на сайт риэлторского агенства..."
   ' pi.StartNewAction 5, 10, "Установка соединения с сервером ..."
   Set IE = CreateObject("InternetExplorer.Application")
    ' IE.Visible = True ' для тестирования
   
    ' pi.StartNewAction 10, 50, "Загрузка страницы авторизации ...", , , 10
   IE.Navigate URL_Login
    ' ждём, пока страница загрузиться
   '    t = Timer: While IE.Busy Or (IE.ReadyState <> 4)
   '        DoEvents: If Timer - t > 0.1 Then pi.SubAction: t = Timer
   '    Wend: DoEvents
   While IE.Busy Or (IE.ReadyState <> 4): DoEvents: Wend

    ' pi.StartNewAction 50, 80, "Авторизация на сервере...", , , 15
   
    Set IEdoc = IE.Document: DoEvents: DoEvents

    ' заполняем поля с логином и паролем
   IEdoc.getElementsByName("login_r").Item(0).Value = Login$
    IEdoc.getElementsByName("passwd_r").Item(0).Value = Password$
    ' и отправляем данные формы на сервер
   IEdoc.getElementsByName("login_form").Item(0).submit

    If Err Then MsgBox "Не удаётся загрузить страницу", vbCritical: End
    ' ждём, пока страница загрузиться
   '    t = Timer: While IE.Busy Or (IE.ReadyState <> 4)
   '        DoEvents: If Timer - t > 0.1 Then pi.SubAction: t = Timer
   '    Wend
   While IE.Busy Or (IE.ReadyState <> 4): DoEvents: Wend

    If IE.LocationURL <> URL_LoginOK Then
        MsgBox "Логин или пароль неверны!", vbCritical, "Ошибка авторизации": pi.Hide: End
    End If

    ' pi.StartNewAction 80, 100, "Загрузка страницы отправки объявлений ...", , , 10
   IE.Navigate URL_main
    ' ждём, пока страница загрузиться
   '    t = Timer: While IE.Busy Or (IE.ReadyState <> 4)
   '        DoEvents: If Timer - t > 0.1 Then pi.SubAction: t = Timer
   '    Wend
   While IE.Busy Or (IE.ReadyState <> 4): DoEvents: Wend

    Set ConnectServer = IE
    ' pi.Hide
End Function

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Обратите внимание на эти строки кода:

    ' заполняем поля с логином и паролем
   IEdoc.getElementsByName("login_r").Item(0).Value = Login$
    IEdoc.getElementsByName("passwd_r").Item(0).Value = Password$
    ' и отправляем данные формы на сервер
   IEdoc.getElementsByName("login_form").Item(0).submit

Названия полей login_r, passwd_r и формы login_form - подходят только для моего примера.
В вашем случае названия полей будут другие
(и, скорее всего, надо предварительно обработать ошибку отсутствия сертификата)

Это был лишь пример авторизации на сайте - под конкретный сайт код нужно дорабатывать.

Помоги пожалуйста! Что я сделал не так?

Public Const URL_Login = "https://br.so-ups.ru/Public/Login.aspx?ReturnUrl=%2fEntityDataView%2fGtp.aspx#"    ' страница входа
Public Const URL_LoginOK = "https://br.so-ups.ru/EntityDataView/Gtp.aspx"    ' сюда попадем, если вход удался
Public Const URL_main = "https://br.so-ups.ru/Export/Csv/Gtp.aspx?&date=24.01.2012&gtpIds=GIRKEN08"    ' а эта страница сайта нам нужна для работы

Sub ПримерИспользования_ConnectServer()
    ' Dim IE As SHDocVw.InternetExplorer, IEdoc As HTMLDocument
  On Error Resume Next
    Set IE = ConnectServer    ' авторизуемся на сервере

    Set IEdoc = IE.Document    ' получаем ссылку на документ

    ' заполняем поля на сайте
   SetSelectElementValue IEdoc, "login", Логин
    SetSelectElementValue IEdoc, "password", Пароль
   'SetInputElementValue IEdoc, "body", Comment

    ' отправляем данные на сервер
  IEdoc.getElementsByName("add_form").Item(0).submit

    IE.Quit ' закрываем браузер
End Sub

Function ConnectServer() As Object
    ' функция предназначена для авторизации на сайтах
  ' (ввод логина и пароля через веб-интерфейс)
  ' Возвращает объект типа InternetExplorer с загруженной страницей сайта, где мы авторизовались
  ' НЕНУЖНЫЕ СТРОКИ КОДА ЗАКОММЕНТИРОВАНЫ

    Login$ = "...": Password$ = "..."    ' укажите здесь логин и пароль для сайта
  On Error Resume Next: Err.Clear
    ' Dim pi As New ProgressIndicator
  ' pi.Show "Отправка объявлений на сайт риэлторского агенства..."
  ' pi.StartNewAction 5, 10, "Установка соединения с сервером ..."
  Set IE = CreateObject("InternetExplorer.Application")
    ' IE.Visible = True ' для тестирования
 
    ' pi.StartNewAction 10, 50, "Загрузка страницы авторизации ...", , , 10
  IE.Navigate URL_Login
    ' ждём, пока страница загрузиться
  '    t = Timer: While IE.Busy Or (IE.ReadyState <> 4)
  '        DoEvents: If Timer - t > 0.1 Then pi.SubAction: t = Timer
  '    Wend: DoEvents
  While IE.Busy Or (IE.ReadyState <> 4): DoEvents: Wend

    ' pi.StartNewAction 50, 80, "Авторизация на сервере...", , , 15
 
    Set IEdoc = IE.Document: DoEvents: DoEvents

    ' заполняем поля с логином и паролем
  IEdoc.getElementsByName("login_r").Item(0).Value = Login$
    IEdoc.getElementsByName("passwd_r").Item(0).Value = Password$
    ' и отправляем данные формы на сервер
  IEdoc.getElementsByName("login_form").Item(0).submit

    If Err Then MsgBox "Не удаётся загрузить страницу", vbCritical: End
    ' ждём, пока страница загрузиться
  '    t = Timer: While IE.Busy Or (IE.ReadyState <> 4)
  '        DoEvents: If Timer - t > 0.1 Then pi.SubAction: t = Timer
  '    Wend
  While IE.Busy Or (IE.ReadyState <> 4): DoEvents: Wend

    If IE.LocationURL <> URL_LoginOK Then
        MsgBox "Логин или пароль неверны!", vbCritical, "Ошибка авторизации": pi.Hide: End
    End If

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
5 + 10 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.