用VBSCRIPT自动输入登录信息

时间:2022-10-16 07:28:52

用VBSCRIPT自动输入登录信息

 

作者:半点闲

时间:2016-8-1921:55

博客:blog.csdn.net/cg_i

邮箱:b_dx@sohu.com

关键字:自动输入登录信息,夜神安卓模拟器, 360股票,按键精灵,VBSCRIPT,MicrosoftScripting Host

背景知识:会编写Vbscript,有编程经历

 

任务简介

    几日前,朋友问我能不能帮他做一个能自动输入登录信息功能的程序。了解到,他的那个程序是运行在一款叫做“夜神安卓模拟器”(OUT了,第一次知道还有这种神器)环境下的360股票APP。对于这款模拟器我不甚了解,它自带类式像“键盘精灵”(OUT了,以前也试着了解,装后觉得很复杂就卸载了。至今,对它的认识也只建立在听说过)样的操作录制、播放功能。通过模拟器自带的这个功能,朋友在APP中需要的自动化操作,都已经通过精心设计成功录制。现在,唯一困扰它的就是动态输入登录用户名称和密码。

    看着朋友期盼的眼神一时难于推脱,就接下了这个任务。

前言

    接手这个任务后,脑子里像过电影一样,逐个查看我的武器库,看那项技术来完成这项工作。即,时间成本不能太高、采用的技术不能太复杂。一来,平日我还有很繁重的日常工作要做,也只能牺牲我的空余时间了。二来,技术不能太复杂,毕竟它是个一次性任务。权衡之下,我选择了一门自己很多年都没有用过的老式技术,它就是Windows脚本。只所以说它是老式的,如果我没有记错的话,从2001年第一次接触它至今已经过去了15个年头,回忆起它的那一瞬间如时光倒流,我仿佛又附身回到了那个懵懂无忧的少年身上。那时,不管是在没有空调炎热夏夜。还是,湿冷没有暖气的隆冬。偏远的一座小城里一个房间彻夜亮着一盏灯,堆满书籍及电脑的桌前,一个少年眉头时而紧锁、时而舒展、时而自言自语,甚至还会击节高歌,时过境迁,现在的我身上再也没有,那时因攻克一道难题兴奋久久不能入眠几日的简单快乐了……

    抱歉,一时神游天外。言归正传,Windows脚本功能相当强大。微软的Windows Scripting Host在所有Windows系统上是免费提供的,用户开发自己的脚本程序可以直接同Windows对话,而不必通过复杂的编程环境,操作系统本身对自动例行任务的执行根本不会有一点点妨碍。脚本语言用起来相当容易、有趣,而且容错性非常好。这些特性正是上述任务的不二之选,现在,唯一困扰摆在我面前的难题,是我已全忘了如何使用它。是的,没错我已经完完全全忘记了……

    对此,大家不要感到诧异,我想大家都会有这种经历。好在,这门语言并不太难,毕竟记忆里还多多少少残留一些,找了些资料用了半天时间恶补下,断断续续利用闲暇时间写完这个小程序。目前,已经解决了朋友的难题,现将这段代码共享出来。一来,给需要完成类式任务的朋友以做参考。二来,抛砖引玉盼得到大牛更强的指点。小弟在此感激不尽!

说明

    直接给出完整代码,程序很小且代码注释也很详细,就不多费笔墨一一解释了。写这篇文章时身边没有环境,没法将程序运行过程以视频、图片的方式给出。回来一一补上好给大家一个直观的了解。

代码

'----------------------------------------------------------------------
'
' Author:	高玉涵
' Date:		2016/8/18
'
' Abstract:
' autologin.vbs - 自动输入登录用户名与密码 
'     夜神安卓模拟器-360股票.
'
' File:
' users.txt - 用户信息文件(必须)
' ok.txt    - 成功登录记录行数(必须),每次输入信息将跳过这些行。
' log.txt   - 日志文件
'
' Usage:
' Cscript autologin.vbs
' 
' Declare:
' 接收输入的程序运行在模拟器中,超出了这个程序能力。
' 这个程序无法准确获取,指定窗口及控件对像,也就无法保证程序有效。
' 程序只是简单的,发送键盘输入信息给模拟器,让事先打开并在等待输入信息
' 的地方获取输入焦点。以达到自动输入信息的功能。
'
' 要想达到上述效果,还需要做以下几步:
' 1.模拟器自带屏幕操作记录器(类式按键精灵)录制“登录”及清空原登录信息
'   及输入焦点。
' 2.Cscript autologin.vbs,自动输入用户信息。
' 3.录制“确定”及退出。
' 4.成功,重复以上操作。
'----------------------------------------------------------------------
Option Explicit

'
'Generic strings
'
Public const strUsersFile				= "users.txt"
Public const strOutputLog				= "log.txt"
Public const strTitle					= "夜神模拟器"

'测试函数
startUsers strUsersFile


'----------------------------------------------------------------------
' Author:	高玉涵
' Date:		2016/8/16
' Name:		SendLogin
' Declare:发送登录用户信息
' parameter:
' WindowTitle,指定窗口标签
' strName,用户名
' strPwd,用户密码
'----------------------------------------------------------------------
Function SendLogin(WindowTitle, strName,strPwd) 
	Dim objShell 
	
	Set objShell = CreateObject("WScript.Shell")  '定义一个WHS对象  
	If objShell.AppActivate(WindowTitle) Then     '检测是否有我们要检测的Windows  
		objShell.AppActivate WindowTitle      '把窗口对焦  
		objShell.SendKeys strName             '发送登录名
		'objShell.AppActivate WindowTitle     '把窗口对焦  
		objShell.SendKeys "{Enter}"
		'objShell.AppActivate WindowTitle     '把窗口对焦  
		objShell.SendKeys strPwd              '发送登录密码
		'成功
		SendLogin = 1
	Else
		SendLogin = 0
		MsgBox strTitle	& ",启动了吗!",vbCritical,"致命错误:0"
	End If
End Function

'----------------------------------------------------------------------
' Author:	高玉涵
' Date:		2016/8/16
' Name:		outputLog
' Declare:输出日志
' parameter:
' strFileName,日志文件名
' strMsg,日志信息
'----------------------------------------------------------------------
Sub outputLog(strFileName,strMsg,mode)
	Dim fso
	Dim file
	Dim stream
	'Const ForReading =1, ForWriting =2, ForAppending =8
	
	Set fso = CreateObject("Scripting.FileSystemObject")
	Set stream = fso.OpenTextFile(strFileName,mode,True)
	stream.WriteLine(strMsg)
	stream.close
End Sub 

'----------------------------------------------------------------------
' Author:	高玉涵
' Date:		2016/8/18
' Name:		startUsers
' Declare:开始用户登录
' parameter:
' strFileName,登录用户信息文件
'----------------------------------------------------------------------
Sub startUsers(strFileName)
	On Error Resume Next
	
	Const ForReading =1, ForWriting =2, ForAppending =8
	Dim fso
	Dim stream,stream1
	Dim strTemp
	Dim iPos
	Dim user
	Dim pwd
	Dim iLine,okLine
	Dim strYesNo
	
	Set fso = CreateObject("Scripting.FileSystemObject")
	Set stream = fso.OpenTextFile(strFileName)
	If err.number <> 0 Then
		MsgBox "用户信息文件:" & strFileName & VbCrlf & err.description,vbCritical,"Err:" & err.number
		Exit Sub
	End If
	
	'
	' Ok.txt
	'
	Set stream1 = fso.OpenTextFile("ok.txt")
	If Not IsEmpty(stream1) Then 
		okLine = cInt(stream1.ReadLine)
	Else
		okLine = 0
	End If
	
	iLine = 1
	Do While Not stream.AtEndOfStream
		'
		' 跳过先前成功的记录行
		' 吐槽:continue,goto语句都没有啊
		'
		If stream.Line > okLine Then
			strTemp = Trim(stream.ReadLine)
			iPos = InStr(strTemp,"|")
		
			If iPos > 0 Then
				user = Left(strTemp,iPos - 1)
				pwd = Mid(strTemp,iPos + 1,Len(strTemp))
				
				If SendLogin(strTitle,user,pwd) = 1 Then
					iLine = iLine + 1
					'
					' 记录成功的记录行
					' 吐槽:天晓得成功没
					'
					outputLog "ok.txt",iLine,ForWriting
					Wscript.Echo strTemp
					Exit Do
				Else
					Exit Do
				End If
			Else
				outputLog strOutputLog, Now & vbTab & stream.Line - 1 & "# 找不到指定格式用户名与密码,格式:name|passwd",ForAppending
			End If
		Else
			'
			' 跳过先前成功的记录行
			'
			stream.SkipLine
			iLine = iLine + 1
		End If
	Loop
	
	stream.close
End Sub



G T