如何使用VBS脚本自动登录

时间:2016-02-23 23:17:39

标签: batch-file vbscript tabs

我刚认识这个。我目前正在我们办公室的一个项目工作,我已经有了如何在一个窗口中打开多标签IE的脚本。这是我用它的脚本。

Const navOpenInBackgroundTab = &H1000

site1 = "http://site1.com/"
site2 = "https://site2.com"



Set oIE = CreateObject("InternetExplorer.Application")
oIE.Visible = True
oIE.Navigate2 site1
oIE.Navigate2 site2,navOpenInBackgroundTab



Set oIE = Nothing 

但其中两个网站需要登录信息。我想知道允许我自动登录这些网站的脚本。我想知道我需要在上面的脚本中添加什么,以便每次使用脚本时它都会自动登录。

以下是其中一个网站: https://myapps.uhc.com/Citrix/AccessPlatform/auth/login.aspx

我希望有人可以帮我理解,谢谢

1 个答案:

答案 0 :(得分:1)

长话短说,您可以更轻松地使用Firefox + Greasemonkey或Chrome + Tampermonkey。

枚举背景标签需要使用Shell.Application对象.Windows()方法。模糊的窗口对象似乎打破DOMelement.parentNode和类似,因此每次导航DOM时,您必须重新建立以tabCollection.item(i).document开头的完整层次结构。用户名字段是用户名,用户名,登录名,登录ID,电子邮件还是其他名称?您可以尝试使用正则表达式进行预测,但如果您计划扩展此脚本以登录其他站点,则可能会涉及一些试验和错误。

但不可能的部分是表格提交。表单提交是否会在发布之前调用回发来设置隐藏的输入值?如果是这样,则form.submit()可能在提交之前不会触发必要的事件,从而导致身份验证失败。这是我测试的两个站点的情况。

如果你可以触发提交按钮的click()事件,那可能会有所帮助。但提交按钮是按钮吗?输入类型=按钮?一个图像?一个程式化的超链接?一个div?好的,所以也许在密码字段中发送 Enter 会更好。我现在已经用initKeyboardEventpasswordField.dispatchEvent(evt)进行了几个小时的试验,似乎在这里,由window产生的模糊Shell.Application对象正在阻止成功。

这是我的几乎工作解决方案。它是批量+ Jscript混合体。用.bat扩展名保存它,并按照你的意愿去做。 *耸肩*也许form.submit()适用于您正在使用的网站?

@if (@CodeSection == @Batch) @then
@echo off & setlocal

cscript /nologo /e:JScript "%~f0"
goto :EOf

@end // end Batch / begin JScript hybrid code

var navOpenInBackgroundTab = 4096,
    site = [
        "http://www.site1.com/",
        "http://www.site2.com/"
    ],
    IE = WSH.CreateObject("InternetExplorer.Application"),
    oSH = WSH.CreateObject("Shell.Application"),
    username = 'username',
    password = 'password';

IE.Visible = true;

for (var i=0; i<site.length; i++) {
    IE.Navigate(site[i], i ? 4096 : null);
}

var tabs = oSH.Windows();

for (var x = 0; x < tabs.Count; x++) {
    if (!!(tabs.item(x))) {
        WSH.Echo('tab ' + x);
        var entered = { 'username': 0, 'password': 0 };
        while (tabs.item(x).Busy || tabs.item(x).ReadyState != 4) WSH.Sleep(50);
        // sleep 1 second regardless, just in case there's some jquery crap going on
        WSH.Sleep(1000);
        for (var i in tabs.item(x).document.forms) {
            if (i == 'length') break;
            var inputs = tabs.item(x).document.forms[i].getElementsByTagName('input');
            for (var j = inputs.length; j--;) {
                if (/\b(login|user(name|id)?|e\-?mail)\b/i.test(inputs[j].name)
                && inputs[j].type.toLowerCase() == "text") {
                    entered.username = inputs[j];
                    inputs[j].value = username;
                } else if (inputs[j].type.toLowerCase() == 'password') {
                    entered.password = inputs[j];
                    inputs[j].value = password;
                }
            }
            if (entered.username && entered.password) {
                tabs.item(x).document.forms[i].submit();

                /* === NOT QUITE WORKING ===
                try {
                    var evt = tabs.item(x).document.createEvent('KeyboardEvent');
                    // What is "window"? tabs.item(x) doesn't work, nor does IE.
                    evt.initKeyboardEvent('keypress', true, true, tabs.item(x),
                        false, false, false, false, 13, 13);
                    entered.password.dispatchEvent(evt);
                }
                catch(e) { WSH.Echo(e.message) }
                */

                i = tabs.item(x).document.forms.length;
            }
        }
    }
}

var IE = null;

另一个想法是passwordElement.focus()并使用WshShell.SendKeys()发送回车,但之后您无法在后台加载标签。我还没有找到一种以编程方式激活标签的方法;但如果他们在前台加载,他们就已经活跃了。虽然这不会在后台加载制表符,但它比第一种方法效果更好。

@if (@CodeSection == @Batch) @then
@echo off & setlocal

cscript /nologo /e:JScript "%~f0"
goto :EOf

@end // end Batch / begin JScript hybrid code

var sites = {
        "http://www.site1.com/" : {
            'username': 'site1user',
            'password': 'site1pass'
        },
        "http://www.site2.net/" : {
            'username': 'site2user',
            'password': 'site2pass'
        }
    },
    IE = WSH.CreateObject("InternetExplorer.Application"),
    oSH = WSH.CreateObject("Shell.Application"),
    WshShell = WSH.CreateObject("WScript.Shell"),
    proc = GetObject("winmgmts:").ExecQuery("SELECT Handle FROM Win32_Process "
        + "WHERE Name='iexplore.exe'"),
    handle = new Enumerator(proc).item().Handle;

awesomeness:
for (var url in sites) {

    // if not a new window, open a new tab
    IE.Navigate(url, IE.Visible ? 2048 : null);
    IE.Visible = true;

    // give the tab a chance to load
    WSH.Sleep(1000);

    var tabs = oSH.Windows(),
        tab = tabs.item(tabs.Count - 1),
        entered = { 'username': 0, 'password': 0 };

    while (tab.Busy || tab.ReadyState != 4) WSH.Sleep(50);

    for (var i in tab.document.forms) {
        if (i == 'length') break;
        var inputs = tab.document.forms[i].getElementsByTagName('input');
        for (var j = inputs.length; j--;) {
            if (/\b(login|user(name|id)?|e\-?mail)\b/i.test(inputs[j].name)
            && inputs[j].type.toLowerCase() == "text") {
                entered.username = inputs[j].value = sites[url].username;
            } else if (inputs[j].type.toLowerCase() == 'password') {
                entered.password = inputs[j];
                inputs[j].value = sites[url].password;
            }
            if (entered.username && entered.password) {
                // force IE window to have focus
                while (!(WshShell.AppActivate(handle))) WSH.Sleep(50);
                entered.password.focus();
                WshShell.SendKeys('{END}{ENTER}');
                continue awesomeness;
            }
        }
    }
}

var IE = null;
相关问题