Как войти на сайт, используя код VBA в Excel – Статьи – 2021

Как войти на сайт, используя код VBA в Excel. Язык программирования Visual Basic для приложений (VBA) позволяет программистам Microsoft Office расширять оригинальные возможности Excel. Примером этого является программа VBA, которая может вводить информацию об учетной записи на веб-странице и отправлять эту информацию. Этот шаблон представляет собой иерархию виртуальных объектов, которые охватывают программируемые функции Excel. Отправка имени пользователя и пароля на веб-сайт с помощью VBA избавляет пользователя от неудобства при вводе его информации вручную.

направления

como-fazer-login-em-um-site-usando-um-cdigo-vba-no-excel.jpg

Вы можете делать удивительные вещи в Excel

(Photos.com/Photos.com/Getty Images)

  1. Откройте Excel и откройте окно кода VBA, нажав Alt + F11.

  2. Дважды щелкните элемент, который отображает «Эта рабочая книга» на панели навигации в левой части экрана. Откроется окно для ввода кодов в текущей книге.

  3. Введите или вставьте нижеприведенную программу в появившееся окно. Эта программа вызывает оператор VBA «AppActivate», чтобы направить текущую запись приложения (Excel) в ваш браузер. Оператор «SendKeys» отправляет введенное, информацию об учетной записи и пароль в активированный браузер. Текст «{TAB}» и «~» представляют клавиши «Tab» и «Enter». Оператор «Application» указывает Excel быстро сделать паузу, чтобы дать Windows и браузеру время для обработки набранного текста и отправки его.

    Public Sub SendPassword () AppActivate “NTNAME”, True SendKeys “YourUserName”, True Application.Wait 1000 SendKeys “{TAB}”, True SendKeys “SUA_SENHA”, True Application.Wait 1000 SendKeys “~”, True End Sub

  4. Замените текст «NAVIGATION_NAME» именем вашего браузера (например, «Firefox», «Internet Explorer» или «Google Chrome»), который вы будете использовать для доступа к учетной записи веб-страницы. Замените текст “YOUR_USERNAME” и “SUA_SENHA” информацией о доступе к учетной записи, которая требуется странице.

  5. Откройте веб-страницу, к которой вы хотите получить доступ к коду.

  6. Щелкните один из операторов в подпрограмме «SendPassword», а затем нажмите «F5», чтобы повернуть подпрограмму. Windows восстановит фокус на браузере, который включен вашей программой. Ваша программа введет и отправит информацию о доступе к учетной записи, которую вы ввели в коде.

  7. Вставьте следующую редакцию в первую программу под программой, которая уже находится в окне разработки VBA. Эта версия «sendPassword» будет вводить не данные учетной записи для вашего кода, а значения в листе текущей рабочей книги. Основным преимуществом этого является удобство изменения регистрационной информации. Данные, хранящиеся в рабочей таблице, удобнее изменять, чем программные коды.

    Public Sub sendPasswordStoredInWorksheet () Неактивное имя входа, pword, приложение app = ActiveSheet.Cells (1, 1). Значение входа = ActiveSheet.Cells (2, 1). Значение pword = ActiveSheet.Cells (3, 1). Значение AppActivate app, Истинный вход в SendKeys, True Application.Wait 1000 SendKeys “{TAB}”, True SendKeys pword, True Application.Wait 1000 SendKeys “~”, True

    End Sub

  8. Введите имя браузера и регистрационную информацию, которая была в коде первой версии программы, в трех верхних ячейках первого листа книги Excel.

  9. В браузере выйдите из учетной записи сайта, к которой обращалась ваша первая программа, и вернитесь на страницу входа в систему. Запустите новую версию программы, следуя инструкциям на шаге 6. Сеанс этой учетной записи начнется, как на шаге 6.

О чем эта статья?

Я немного занимаюсь программированием, откровенно говоря по большей части это говно-код, но я и не настоящий сварщик. И так вышло что в ру-нете неплохо освещены азы, чуть хуже вопросы посложнее, а некоторые вопросы либо не освещены вовсе, либо подавляющее большинство пишет что это невозможно в принципе или невозможно без изобретения велосипедов. А может я просто плохо гуглил. В общем понадобилось мне однажды выполнять GET и POST запросы из VBA, это не сложный в общем-то язык для офисного пакета Microsoft, в этой статье вы узнаете как без установки сторонних компонент, изобретения велосипедов и прочего общаться с серверами в Интернет из Excel, Access или других офисных приложений.

Часть 2. Реализация решения под MacOS и Excel 64-bit

В виду того, что работал я на двух машинах под управлением разных ОС, хотелось, чтобы решение было универсальным. В итоге, собрав по крупицам информацию по интернет-форумам с данной тематикой у меня вышло следующее решение. Принцип работы его остается схожим, а изменения были внесены в часть, где использовалась стандартная библиотека WindowsMsxml2.XMLHTTP.6.0, которой в MacOS не было по понятным причинам. 

Чтобы обойти данное ограничение, был выбран единственный рабочий подход через cUrl, exec и функции. Данное решение точно работает под версией MacOS 10.14 и Excel 16.51. Функция ниже, в том или ином виде, встречается на различных форумах, однако на текущих версиях софта – не работает. В итоге, после небольших правок получили рабочий вариант:

 Была отлажена функция вызова ExecShell:

Код:

Option ExplicitPrivate Declare PtrSafe Function popen Lib “/usr/lib/libc.dylib” (ByVal Command As String, ByVal Mode As String) As LongPtrPrivate Declare PtrSafe Function pclose Lib “/usr/lib/libc.dylib” (ByVal file As LongPtr) As LongPrivate Declare PtrSafe Function fread Lib “/usr/lib/libc.dylib” (ByVal outStr As String, ByVal size As LongPtr, ByVal items As LongPtr, ByVal stream As LongPtr) As LongPrivate Declare PtrSafe Function feof Lib “/usr/lib/libc.dylib” (ByVal file As LongPtr) As LongPtrFunction execShell(Command As String, Optional ByRef exitCode As Long) As String Dim file As LongPtr file = popen(Command, “r”) If file = 0 Then Exit Function End If While feof(file) = 0 Dim chunk As String Dim read As Long chunk = Space(500) read = fread(chunk, 1, Len(chunk) – 1, file) If read > 0 Then chunk = Left$(chunk, read) execShell = execShell & chunk End If Wend exitCode = pclose(file) End Function

И написаны отдельные функции для работы с различным методами GET / PUT / POST, которые на входе принимают URL и параметры):

Код:

Function HTTPGet(sUrl As String, sQuery As String) As String Dim sCmd As String Dim sResult As String Dim lExitCode As Long sCmd = “curl -X GET ” & sQuery & “” & ” ” & sUrl sResult = execShell(sCmd, lExitCode) HTTPGet = sResultEnd FunctionFunction HTTPPost(sUrl As String, sQuery1 As String, sQuery2 As String) As String Dim sCmd As String Dim sResult As String Dim lExitCode As Long sCmd = “curl -X POST ” & sQuery1 & “” & ” -d ” & sQuery2 & “” & ” ” & sUrl sResult = execShell(sCmd, lExitCode) HTTPPost = sResultEnd FunctionFunction HTTPPut(sUrl As String, sQuery1 As String, sQuery2 As String) As String Dim sCmd As String Dim sResult As String Dim lExitCode As Long sCmd = “curl -X PUT ” & sQuery1 & “” & ” -d ” & sQuery2 & “” & ” ” & sUrl sResult = execShell(sCmd, lExitCode) HTTPPut = sResultEnd Function

Так как мы заменяем библиотеку Msxml2.XMLHTTP.6.0 – поменялась реализация макросов в этой части: мы заменили Msxml2 на написанные выше функции и получили следующее:

Код:

‘GET-запросыSub SendGETRequest()Dim i As IntegerDim j As IntegerDim result As StringDim URL As StringDim Auth As Stringa = Timer ‘Подсчет заполненных ячеек первого столбца i = 1 Do While Not IsEmpty(Cells(i, 1)) i = i + 1 Loop i = i – 1 ‘Цикл, который отправляет запрос от 2 до последнего элемента For j = 2 To i URL = Range(“I” & j) Auth = Range(“H” & j) result = HTTPGet(URL, Auth) Range(“J” & j).Value = result ‘Application.Wait (Now + TimeValue(“0:00:01”)) Next jMsgBox Timer – aEnd Sub’PUT-запросыSub SendPUTRequest()Dim i As IntegerDim j As IntegerDim result As StringDim URL As StringDim Auth As StringDim Message As Stringa = Timer ‘Подсчет заполненных ячеек первого столбца i = 1 Do While Not IsEmpty(Cells(i, 1)) i = i + 1 Loop i = i – 1 ‘Цикл, который отправляет запрос от 2 до последнего элемента For j = 2 To i Message = Range(“D” & j) URL = Range(“I” & j) Auth = Range(“H” & j) result = HTTPPut(URL, Auth, Message) Range(“J” & j).Value = result ‘Application.Wait (Now + TimeValue(“0:00:01”)) Next jMsgBox Timer – aEnd Sub’POST-запросыSub SendPOSTRequest()Dim i As IntegerDim j As IntegerDim result As StringDim URL As StringDim Auth As StringDim Message As Stringa = Timer ‘Подсчет заполненных ячеек первого столбца i = 1 Do While Not IsEmpty(Cells(i, 1)) i = i + 1 Loop i = i – 1 ‘Цикл, который отправляет запрос от 2 до последнего элемента For j = 2 To i Message = Range(“D” & j) URL = Range(“I” & j) Auth = Range(“H” & j) result = HTTPPost(URL, Auth, Message) Range(“J” & j).Value = result ‘Application.Wait (Now + TimeValue(“0:00:01”)) Next jMsgBox Timer – a

Авторизация на сайте средствами VB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.

Правила форума

Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут

закрыты

.

Читайте

требования к создаваемым темам

.

GSerg Шаман
Шаман   Сообщения: 14286Зарегистрирован: 14.12.2002 (Сб) 5:25Откуда: Магадан

Сообщение GSerg » 17.01.2006 (Вт) 12:16

:roll:

<FORM name=login action=security_log.php method=post target=main>Имя:
<INPUT class=nice id=l size=12 name=l>&nbsp;Пароль: <INPUT class=nice
type=password size=12 name=p>&nbsp;<INPUT class=button type=submit value=”Зайти в Вашу команду” name=submit>&nbsp;&nbsp;&nbsp;<A
href=”http://www.hockeyarena.net/public_password_recovery_form.php”><B>Забыли
свой пароль?</B></A></FORM>

Метод POST, см. в FAQ.

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Odrick Постоялец
Постоялец Аватара пользователя
  Сообщения: 503Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 17.01.2006 (Вт) 13:18

Ну и чем не устраивает через WebBrowser?

:shock:

Тебя ж никто не заставляет показывать его пользователю до того, как не произойдет авторизация или что-то-там еще, что тебе нужно

;)

То, что для одних константа, для других только переменная…

Odrick Постоялец
Постоялец Аватара пользователя
  Сообщения: 503Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 17.01.2006 (Вт) 13:27

Да, кстати, то что в форме POST еще ни о чем не говорит. Это уже как настроен сервак у провайдера. Если в php-шке включена авторегистрация глобальных переменных, и код юзает не $_POST[‘var’], а просто $var, то может прокатить и вариант с адресной строкой. Только вот написал ты ее совсем неправильно. Правильно будет где-то так:

www.hockeyarena.net/security_log.php?l=login&p=password

Да, и заметь, что l это не 1

;)

То, что для одних константа, для других только переменная…

avtograd Начинающий
Начинающий   Сообщения: 9Зарегистрирован: 18.12.2005 (Вс) 4:47
  • ICQ

Сообщение avtograd » 17.01.2006 (Вт) 14:20

Odrick писал(а):

Ну и чем не устраивает через WebBrowser?

:shock:

Тебя ж никто не заставляет показывать его пользователю до того, как не произойдет авторизация или что-то-там еще, что тебе нужно

;)

Если можно провести авторизацию не показывая пользователю, то это устраивает. Только как в нужные поля вложить логин, пароль и активизировать кнопку? Как это сделать?

avtograd Начинающий
Начинающий   Сообщения: 9Зарегистрирован: 18.12.2005 (Вс) 4:47
  • ICQ

Сообщение avtograd » 17.01.2006 (Вт) 14:24

Odrick писал(а):

Да, и заметь, что l это не 1 ;)

Да я и так и так пробовал, один результат. Как разобраться?

Odrick Постоялец
Постоялец Аватара пользователя
  Сообщения: 503Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 17.01.2006 (Вт) 14:33

Значит писали грамотные люди, и не юзали глобальных переменных, а коллекцию $_POST

;)

По поводу:

Только как в нужные поля вложить логин, пароль и активизировать кнопку? Как это сделать?

я уже устал объяснять, чесс слово. Поиском пробовал пользоваться?

http://bbs.vbstreets.ru/viewtopic.php?t=22128

– ну вот хотя бы сюда сходи, скачай пример…

То, что для одних константа, для других только переменная…

avtograd Начинающий
Начинающий   Сообщения: 9Зарегистрирован: 18.12.2005 (Вс) 4:47
  • ICQ

Сообщение avtograd » 17.01.2006 (Вт) 17:51

Спасибо огромное!!! Всё получилось! Благодарен Вам!

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Как работать с Веб-серверами из VBA?

Первым делом нужно открыть редактор VBA и подключить библиотеку Microsoft XML -> Tools -> References — в списке находим нужную библиотеку и ставим галочку:

Как быстро и просто выполнять HTTP-запросы к web-серверу из VBA

В зависимости от версии офиса, установленных обновлений и другого софта у вас в списке могут быть разные версии, выбирать можно любую:1. Microsoft XML, v 3.0.2. Microsoft XML, v 4.0 (если установлен пакет MSXML 4.0).3. Microsoft XML, v 5.0 (устанавливается вместе с  Office 2003 – 2007).4. Microsoft XML, v 6.0 устанавливается с последними версиями MS Office 2010 и новее.У меня в системе были все из списка, я пробовал разные и со всеми работало, решил подключить самую новую.

А далее все просто, вот пример GET-запроса:

Private Sub get_zaproz_from_VBA_Click() ‘ это кнопка на формеDim xmlhttp As New MSXML2.XMLHTTP60, myurl As Stringmyurl = “https://kakpedia.org”xmlhttp.Open “GET”, myurl, Falsexmlhttp.SendMsgBox (xmlhttp.responseText)End Sub

И если все сделано верно, то откроется окошко с Html-кодом, который отдал сервер. Некоторые серверы ничего не отдадут (например гугл мне почему-то отказался отвечать) — это нормально, пробуйте несколько.

Задать если необходимо, HTTP-заголовки можно вот так:

xmlhttp.setRequestHeader “Content-Type”, “text/json”xmlhttp.setRequestHeader “Content-Type”, “application/x-www-form-urlencoded”xmlhttp.setRequestHeader “User-Agent”, “Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405″xmlhttp.setRequestHeader “Authorization”, AuthCredentials

Простая авторизация:

user = “логин”password = “пароль”xmlhttp.setRequestHeader “Authorization”, “Basic ” + Base64Encode(user + “:” + password)

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...