Asked by:
VBA Loggin into secure websites

Question
-
To keep this short, I have tried for days, used many codes, manipulated many fields to try to get a VBA code to:
1 Open a web browser from an excel macro (i.e. yahoo.com,facebook.com)2 Input the Username and Password fields ( Some websites have them on different pages ; i.e. username page 1 click submit, page 2 password click submit)
3 leave the page open, I will close it.
From what I understand I viewed the webpage source code and from bbt.com I got the User ID field to be 'usernamefield' and the password field to be 'userpw'
I have tried to get many codes that generous people uploaded to the web to work but I am failing miserably. For this code it fails at this line:
(( UserIdBox.Value = cUserID ))
Thank you for your time.
Option Explicit Sub Test() Const cURL = "americanexpress.com" Const cUserID = "race" Const cPwd = "car" Dim ie As Object Dim doc As HTMLDocument Dim PageForm As HTMLFormElement Dim UserIdBox As HTMLInputElement Dim PasswordBox As HTMLInputElement Dim FormButton As HTMLInputButtonElement Dim Elem As IHTMLElement Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True ie.navigate cURL Do While ie.Busy Or Not ie.readyState = IE_READYSTATE.complete: DoEvents: Loop Set doc = ie.document Debug.Print "Login page: " & ie.LocationURL For Each Elem In doc.all Next Set PageForm = doc.forms(0) Set UserIdBox = PageForm.elements("usernamefield") UserIdBox.Value = cUserID Set PasswordBox = PageForm.elements("userpw") PasswordBox.Value = cPwd PageForm.submit Do While ie.Busy Or Not ie.readyState = IE_READYSTATE.complete: DoEvents: Loop Set doc = ie.document Debug.Print "Terms of Use page: " & ie.LocationURL For Each Elem In doc.all Next Set PageForm = doc.forms(0) Set FormButton = PageForm.elements("selection") FormButton.Click Do While ie.Busy Or Not ie.readyState = IE_READYSTATE.complete: DoEvents: Loop Set doc = ie.document Debug.Print "Main Pronto page: " & ie.LocationURL For Each Elem In doc.all Next
Monday, January 7, 2013 3:55 PM
All replies
-
This code may help you in your quest.
Dim objIExplorer As InternetExplorer Public Sub Main() 'Reference set for: 'Microsoft Internet Controls' Set objIExplorer = CreateObject("InternetExplorer.Application") 'Disable pop-up messages objIExplorer.Silent = True 'Arrange Internet Explorer on the screen and make visible objIExplorer.Top = 0 objIExplorer.Left = 0 objIExplorer.Height = 1000 objIExplorer.Width = 1250 objIExplorer.Visible = True objIExplorer.Navigate "www.google.com" Do While objIExplorer.Busy Or Not objIExplorer.ReadyState = 4: DoEvents: Loop objIExplorer.Document.getElementById("q").Value = "Hi" 'Set the value in the Inputbox End Sub
Good LuckMonday, January 7, 2013 8:04 PM -
That works nicely. Thank you for getting me the farthest I have been with the code.
Now just trying to figure why the .click command is not working.Do you have to alter the code for different websites other then the "ID's"?????
Wednesday, January 9, 2013 4:01 AM -
I have modified the code to include clicking a button. 'gbqfba' is actually the Id for the Google Search button. Go figure.
Dim objIExplorer As InternetExplorer Public Sub Main() 'Reference set for: 'Microsoft Internet Controls' Set objIExplorer = CreateObject("InternetExplorer.Application") 'Disable pop-up messages objIExplorer.Silent = True 'Arrange Internet Explorer on the screen and make visible objIExplorer.Top = 0 objIExplorer.Left = 0 objIExplorer.Height = 1000 objIExplorer.Width = 1250 objIExplorer.Visible = True objIExplorer.Navigate "www.google.com" Do While objIExplorer.Busy Or Not objIExplorer.ReadyState = 4: DoEvents: Loop objIExplorer.Document.getElementById("q").Value = "Hi" 'Set the value in the Inputbox x = objIExplorer.Document.getElementById("gbqfba").sourceindex 'Get the index for the Google Search button objIExplorer.Document.all.Item(x).Click 'Click the Search button End Sub
Wednesday, January 9, 2013 5:34 PM -
Thank you for helping me. I have been able to tackle about 20 logins so far. Before I ask two more questions I would like you to know that I have extensive knowledge of Solidworks and 3DviaComposer. If by chance you use these programs or maybe need a small model done I could help. I hate to be that annoying person that keeps asking and asking but I tried for hours to figure out these two questions last night and I feel since you know coding so well it would take you a few minutes probably less. Even though this is probably very simple for you in the end it will save me so much time and energy making my day's less stressful.
1. What is the ID for the Logon button for www.bbt.com ? I have it as "bbt-logon" but the screen just sits there after it inputs my username ( using your last code)
2. Why does the user Id field get skipped on the code below for americanexpress.com
'Dim objIExplorer As InternetExplorer Public Sub bbt() 'Reference set for: 'Microsoft Internet Controls' Set objIExplorer = CreateObject("InternetExplorer.Application") 'Disable pop-up messages objIExplorer.Silent = True 'Arrange Internet Explorer on the screen and make visible objIExplorer.Top = 0 objIExplorer.Left = 0 objIExplorer.Height = 1000 objIExplorer.Width = 1250 objIExplorer.Visible = True objIExplorer.navigate "www.americanexpress.com" Do While objIExplorer.Busy Or Not objIExplorer.readyState = 4: DoEvents: Loop objIExplorer.document.getElementById("userid").Value = "username" 'Set the value in the Inputbox objIExplorer.document.getElementById("Password").Value = "password" x = objIExplorer.document.getElementById("loginimage").sourceIndex 'Get the index for the Google Search button objIExplorer.document.all.Item(x).Click End Sub
Thursday, January 10, 2013 4:30 PM -
Just interested to know why you are using VBA and not some easier solution.Thursday, January 10, 2013 5:11 PM
-
What solution would that be? I'm a mechanical engineer and a carpenter. This coding stuff is on the bottom of my skill set. What is an "easier solution"Thursday, January 10, 2013 6:40 PM
-
I'm an engineer, too, and a hobbyist carpenter. I'm sure you will understand when I say that Excel VBA is my "hammer" so all problems look like "nails" to me - go with what you know, what you are comforatable with, and what will work.Thursday, January 10, 2013 6:47 PM
-
Well right now, thanks to BigMeanCat, the VBA code is working great. Just a few websites I am having problems with. I wish there was a vba recorder when you navigated and did things on the websites and you just copied the code at the end. I would think there would be one but all I found was HTML recorders.
- Edited by VBA_Noob Thursday, January 10, 2013 7:36 PM
Thursday, January 10, 2013 7:05 PM -
you can download rediffmail sender from send email from excel using rediffmail account
I think it is good reference you are looking for
Nasir Akhtar
Friday, January 11, 2013 6:05 PM -
Nasir, I don't need to send emails from excel. I did try to view the code to help me but it's password protected. I need to be able to logon to accounts. I appreciate you trying to help me though.
Does anyone know why this code skips the UserID field?
Public Sub bbt() Set objIExplorer = CreateObject("InternetExplorer.Application") objIExplorer.Silent = True objIExplorer.Top = 0 objIExplorer.Left = 0 objIExplorer.Height = 1000 objIExplorer.Width = 1250 objIExplorer.Visible = True objIExplorer.navigate "www.americanexpress.com" Do If objIExplorer.readyState = 4 Then objIExplorer.Visible = True Exit Do Else DoEvents End If Loop objIExplorer.document.getElementById("userid").Value = "username" objIExplorer.document.getElementById("Password").Value = "password" x = objIExplorer.document.getElementById("loginimage").sourceIndex objIExplorer.document.all.Item(x).Click End Sub
Saturday, January 12, 2013 4:16 AM -
I use iMacros to automate logins. iMacros is a free addon in Firefox, IE and Chrome. I have yet to find a website I can't automate and it only takes a few minutes to do.Sunday, January 13, 2013 3:20 PM
-
I use IMacros too but it records in HTML and I need it in VBA for Excel and SW.Sunday, January 13, 2013 10:27 PM
-
Finding the “Id” for an element on a web page is a little process.
For American Express
Run the code below. Do not exit the procedure when it reaches “Stop”.
On the web page put the cursor in the “UserId” box so it is the active element.
In the Visual Basic Editor highlight “objIExplorer”
Enter the Key combination Shift + F9
Press “Enter”. The Watches window will open.
Navigate to “objIExplorer.Document.ActiveElement”
Locate “id” and that is the value you are looking for.To get the “id” for the button on the bbt site.
Do the same as above but change the code to navigate to www.bbt.com
On the web page put the cursor in the “UserId” box so it is the active object.
Then click the Tab key to make the LOGON button active.
Return to the VBE and do the same as above.Dim objIExplorer As InternetExplorer Public Sub Main() 'Reference set for: 'Microsoft Internet Controls' Set objIExplorer = CreateObject("InternetExplorer.Application") 'Disable pop-up messages objIExplorer.Silent = True 'Arrange Internet Explorer on the screen and make visible objIExplorer.Top = 0 objIExplorer.Left = 0 objIExplorer.Height = 1000 objIExplorer.Width = 1250 objIExplorer.Visible = True objIExplorer.Navigate "www.americanexpress.com" Stop objIExplorer.Quit Set objIExplorer = Nothing End Sub
Monday, January 14, 2013 11:00 PM -
Thanks for replying again BigMeanCat. Your the only one on this forum so far that knows this code and what needs to be done.
I followed your instructions and did learn this new technique to find the ID's and some future helping things, however the ID for User ID for www.americanexpress.com is "userid" which I have been using and its skipping it even with your wait till load script before it.
The Logon button for BBT is said to be, "". I said what the hell and put that into the code but it errored out at that line. I had been using "logon" and "bbt-logon" and many others.
It's frustrating because I can log onto many websites thanks to you. Why are these being so difficult. There are others too, but I am hoping it will trickle down with whatever is going wrong here.
Thanks AgainTuesday, January 15, 2013 12:36 AM -
Hi VBA_Noob,
The problem with the User ID input for American Express is that the id: "UserID" is used for two elements on the web page.
If more than one element is found, getElementById returns the first object in the collection.
Reference: http://msdn.microsoft.com/en-us/library/ie/ms536437%28v=vs.85%29.aspx
You could use the sourceindex value as such.
objIExplorer.Document.all.Item(495).Value = "Username"
Where 495 is the sourceindex for the User ID box.
The potential problem here is that sourceindex values change when changes are made to the web site.
Hope this helps.
‘*********************************************************************************
By the way,
I have not been able to reply to threads in this forum for about a week+. I keep getting the Error: Message from webpage / Unexpected error
If you don't here from me that's because I cannot send replies.
Thanks,
BMC
Sunday, January 20, 2013 6:39 PM -
I officially give up. This is to frustrating. Don't understand why this process has to be so hard.Thursday, January 24, 2013 3:16 AM
-
I do a lot of web scrapping and I use iMacros Enterprise which provides a very easy method to do secure logins and do web scrapping. It has a very easy to use programming interface. I do it with both C# and VBA. I bought it back when it was 1/3 the price it is today.Friday, January 25, 2013 9:13 PM
-
IMACROS is great and I have the free addin for firefox but I want the macros on buttons on my excel sheet for ease of access. I have started the task today of making the 28 accounts into buttons. You really have to be careful of your finances. Last year I had over $300.00 in fraud to my accounts and just today I found out $40.00 was withdrawn out my account that wasn't me or my wife. The signature is David something and my name is Scott and my wife is Beth and the bank just let the man/women take the money. There are double charges from companies and subscriptions thru others or "one time" access fees. It's disgusting.
My excel sheet has taken me months of coding in the sheet and with the help of BigMeanCat with macros to access all these 28 accounts. It has become a whole lot easier to do.
I don't like the idea of inputting all of your personal account information into Mint.com or quick books. I am good at Math and honestly my excel sheets do the exact same thing theirs do and more. I also enjoy the customization of using excel.
What do you guys use??? Below is the start of inserting buttons but I am hungry now and the wifey want's to go out.
Thanks to everyones help especially BigMeanCat, and Cat I feel like I have asked you too many questions but if you have time, I don't understand how to find the information of{{{ objIExplorer.Document.all.Item(495).Value = "Username"
Where 495 is the sourceindex for the User ID box. }}}}
Saturday, January 26, 2013 11:26 PM -
<form action="https://online.bbt.com/auth/pwd.tb" method="post">
<input name="UserName" type="text" class="UserID" id="usernamefield">
<button type="submit">LOGON</button>
<input value="Go" name="input" type="hidden">
</form>This is the form that you're trying to submit from http://www.bbt.com/. I've simplified the HTML a bit to remove stuff that isn't important. They have a "onsubmit" function declared; I checked their .js includes and all this function does is check that a username is entered, and calls .submit if there is one. It was quite possible that this function manipulated other stuff before posting the form. Luckily, it done very little.
Most the elements of their form have no ID fields or name fields, which is why you're finding it hard to refer to them in code.
However, there is a *much much* simpler way to get past this page. The form posts the data to https://online.bbt.com/auth/pwd.tb.
You can manually add the correct form items to the URL and simply open a page with that URL. Their webserver cannot tell the difference between a URL entered in manually, and, the one that would be posted by the form if the user done it themselves. Add a "?" to the end of the post address, take each field in the form and add them to the URL. The "name" field is the one you use when doing this method. Like this:
https://online.bbt.com/auth/pwd.tb?UserName=test&submit&input=Go
I tried it without the "&input=Go" and it worked fine, but for whatever reason they've got that hidden field in there.
In code this will get you past the first page. As to what happens next I've no idea because I have no idea what BB&T is and I don't have an account to see what the password page looks like! I'm using the cUserID variable that you used in your code for the other website is similar to the one you'll want to use here:
ie.navigate "https://online.bbt.com/auth/pwd.tb?UserName=" & cUserID & "&submit&input=Go"
Let me know how this much simpler approach works out!
- Proposed as answer by Vexen_Crabtree Friday, February 8, 2013 9:26 PM
Sunday, January 27, 2013 3:11 AM -
2. Why does the user Id field get skipped on the code below for americanexpress.com
objIExplorer.document.getElementById("userid").Value = "username" 'Set the value in the Inputbox
The user id field is called: "UserID", with a capital U and capital ID. The ID field is case-sensitive according to W3C documentation, therefore, the other poster who said that the A.E. website had duplicate "UserID" field may be wrong; I can see one field on their page in one form, called "USERID" and another called "UserID".
Or at least... in I.T. ... it is best to always consider everything to be case-sensitive. That way, problems like these never occur. (Good advice, even if after you try it and find it is not case sensitive in this particular case!)
- Edited by Vexen_Crabtree Sunday, January 27, 2013 3:33 AM Adding note on W3C specs - just checked.
- Proposed as answer by Vexen_Crabtree Friday, February 8, 2013 9:26 PM
Sunday, January 27, 2013 3:22 AM -
To quickly find the ID of the field, I used the following steps (took me less than a minute - really!)
1. Opened https://www.americanexpress.com/ in a browser after copying URL from your code into clipboard.
2. Made a mental note of some of the plaintext word nearest the elements I was interested in on the web page.
3. Right click... View Source.
4. Pressed Ctrl-F, typed "User ID", pressed enter.
5. Right in front of me, was:
<input type="text" id="UserID" name="UserID" size="12" maxlength="32" valu.......
Sunday, January 27, 2013 3:26 AM -
The code below should work :) hope its not tooooooooooooooooooooooooooooo late.
Sub AmexLogin()
On Error GoTo Err_Clear
sURL = "https://www.americanexpress.com/uk/"
Set oBrowser = New InternetExplorer
oBrowser.Silent = True
oBrowser.timeout = 60
oBrowser.navigate sURL
oBrowser.Visible = True
Do
' Wait till the Browser is loaded
Loop Until oBrowser.readyState = READYSTATE_COMPLETE
Set htmlDoc = oBrowser.document
htmlDoc.all.loginID.Value = "username"
htmlDoc.all.Password.Value = "password"
SendKeys "{Enter}", True
' oBrowser.Refresh ' Refresh If Needed
Err_Clear:
If Err <> 0 Then
Err.Clear
Resume Next
End If
End SubFriday, August 5, 2016 10:14 PM -
Hey Roti Er,
I tried out your code with this website and I can get the login and password to populate, however I can't get the macro to click on "Log In". Can you please help me with this? (I know I'm super late lol) Thank you!!
Private Sub CommandButton1_Click()
On Error GoTo Err_Clear
sURL = random url
Set oBrowser = New InternetExplorer
oBrowser.Silent = True
oBrowser.timeout = 60
oBrowser.navigate sURL
oBrowser.Visible = True
Do
' Wait till the Browser is loaded
Loop Until oBrowser.readyState = READYSTATE_COMPLETESet HTMLdoc = oBrowser.document
HTMLdoc.all.vb_login_username.Value = "blah"
HTMLdoc.all.vb_login_password_hint.Value = "blah123"
SendKeys "{Login button}", True' oBrowser.Refresh ' Refresh If Needed
Err_Clear:If Err <> 0 Then
Err.Clear
Resume Next
End If
End SubMonday, March 12, 2018 5:23 PM -
mrexcel.com
it wouldn't let me attach the link above sorry
Monday, March 12, 2018 5:24 PM -
Hey guys,
I've been trying to use Excel VBA to log into a website with reCAPTCHA two-factor authentication.
I've already put it in the code to open up IE and put input the necessary login information to sign in, but I cant seem to get through the "I'm not a robot" security.
Is this possible? If so, what code would accomplish this?
Thursday, July 12, 2018 6:06 PM -
Hello,
the SendKeys command does not seem right
The SendKeys emulates a user pushing the Enter key on the keyboard
It should be : SendKeys "{Enter}", True
not what you wrote as there is nothing called "login button" on a keyboard
Also, I wouldn't be surprised that such web pages are automatically generated on navigate.
I mean, the web page does not exist and is written by third party code(angular, jquery, whatever) so that id's are always different (to prevent hacking and co)
We use that kind of tech in my sector (banking) . I had to do a similar thing as yours and what I did is the following:
Dim objIE As InternetExplorer
Dim doc As HTMLDocument
Dim e As HTMLInputElement
Dim link As ObjectSet objIE = New InternetExplorer
objIE.Navigate "YourURLhere"Set doc = objIE.Document
Set link = doc.getElementsByTagName("button")
For Each e In link
If e.outerText = "Login" Then
e.Click
Exit For
End If
Next lBasically, it searches into the loaded document (the web page) any element that is a button and reads its outerText (the text displayed on the screen) and because we search for a button, it has a click event attached to it.
kind regards,
Daniel
- Edited by Daniel_C_001 Wednesday, February 20, 2019 4:32 PM
Wednesday, February 20, 2019 4:09 PM