思路很简单,账号密码的保存、读取,用ini配置文件就可以统统搞定。
%A_ScriptDir%——当前脚本所在路径
iniread,输出变量名,文件路径,(区域名称)——使用时没有区域名称,那么会返回ini文件中的所有区域名称;如果使用时有区域名称,那么会返回该名称区域内的所有数据,在这里也就是账号密码。
以下是保存账号密码的ini范例
[名称A] 123 321
根据名称,选择账号和密码,之后怎么使用就很随意了。目前重要的是读取和添加。
readini(Section_name){ ;定义一个函数读取ini配置,传入变量名称随意。输入区域块名称,获取账号和密码,并在网页中登录 global ;考虑到之后可能要在不同的函数中使用,所以这里用global声明了该函数中生成的全都是全局变量。 IniRead,output_a,%A_ScriptDir%\账号密码.ini,%Section_name% ;该行代码将数据,保存到output_a中,原谅我如此随意的变量名··· ;~ StringSplit,finally_a,output_a,`n ;这里可以使用伪数组,但是伪数组依赖名称,所以这里使用数组。P.S.伪数组示例:a1 a2 a3 word_array := StrSplit(output_a,"`n") ;把提取的数据,分割成数组,数组需要使用for循环才能读取。 send,!{F4} ;以下几行代码是关闭GUI界面,这可以略过。 Sleep,400 Click Sleep,400 Send,{Enter} ;--------第一部分完成,文本读取-------- ;根据传入的名称,在ini文件中寻找对应的数据块,在本文中,数据块为“名称A”。找到数据块之后,返回数据块中的数据,文本中是啥,就是啥。在本文中,数据是123换行321。 for i,j in word_array { sleep,100 send,{tab} send,%j% ;有需要的朋友可以把这三行代码换成 MsgBox,%j% 测试一下。 } Sleep,200 send,{Enter} ;--------第二部分完成,数据分割,数据操作,这部分可以玩出各种花样-------- return }
如此一来,就可以去读ini文件中的数据,并进行各种操作,功能没有扩展开,目前只用于网页登录。
接下来是GUI界面部分,我只需要一个按钮,点击就可以获取账号密码,而账号密码是越来越多的,不希望每次都写代码,所以GUI必须是能够自动生成的,好在AHK可以轻易办到。
!r:: ;呼出后台登录账号界面,该脚本核心功能 { IniRead,output_a,%A_ScriptDir%\账号密码.ini ;读取配置的时候忽略数据名称key,则会返回所有数据名称,返回的是字符串,需要分割。 word_array := StrSplit(output_a,"`n") ;分割字符串 x:=0 ;定义一下界面,比如说从X0,Y0开始,一个按钮100宽,30高,数量从0开始,每到5个,就把x归零,把y加30,很简单。 k:=0 w:=100 h:=30 num:=0 for i,j in word_array ;自动化新建按钮,并且按照一行5个的规律换行。这里可以用gui宽度来设置列,因为我已经限制了gui宽度为500,所以不需要这个future。 { Gui add,Button,x%x% y%k% w%w% h%h% g%j%,%j% ;注意这里设置了g标签,点击按钮会触发相应的功能。标签名称就是区域块名称,在这里就是“名称A” num+=1 x+=100 if (num//5) { k+=30 x:=0 num:=0 } } gui,add,button,x%x% y%k% w%w% h%h% gwork_mid,添加账号 ;在自动生成的按钮之后,放一个添加账号用的按钮,绑定了一个work_mid标签。 Gui Show, w500 h500, 电视登录 ;通过快捷键alt+r,可以呼出一个宽高均为500的gui界面,之后会调用ini,读取所有的块名称,并根据这些名称生成按钮。 return }
如果在ini文件中,按照上述格式多建一些的话,那么按理说会有如下界面。
添加账号部分
work_mid: ;添加账号的功能 { gui,new Gui Add, Text, x8 y8 w55 h23, 账号名称 Gui Add, Edit, vname x72 y8 w120 h21 Gui Add, Text, x8 y40 w55 h23 +0x1, 账号 Gui Add, Edit, vzhang x72 y40 w120 h21 Gui Add, Text, x8 y72 w55 h23 +0x1, 密码 Gui Add, Edit, vpassword x72 y72 w120 h21 Gui Add, Button, gwork_add x8 y104 w186 h23, 确定添加 Gui Show, w202 h370, 添加账号密码 return }
就是简单的GUI界面,没有什么可说的,注意下绑定的标签,大概效果如图。
到目前为止,我们有了gui界面,有了一个只要输入区域名称,就可以干活的变量。
需要把它们结合起来,每一个按钮都对应一个专有名称和专有g标签,所以应该好好利用它们。
那么,请删除ini文件中的内容,让我们从零开始吧。
空白的ini文件,肯定也就不能生成按钮了。只能点击添加。
我们需要一个功能,把输入的账号密码,保存到ini中,同时还要让生成的按钮可以通过一个事件调用那些数据。不知道说明白没有···
work_add: ;将输入的信息,保存在两个文本中,再重新运行脚本。 { Gui, Submit,NoHide ;点击确认添加之后,submit提交 a=%name%:`nreadini("%name%")`nreturn`n ;定义一个变量a,它的内容是 名称 冒号 换行 readini(名称) 换行 return 换行 b=[%name%]`n%zhang%`n%password%`n ;定义一个变量b,它的内容是 名称 换行 账号 换行 密码 换行 FileAppend ,%a%,%A_ScriptDir%\后台.ahk ;把变量a,添加到脚本中的最后 FileAppend ,%b%,%A_ScriptDir%\账号密码.ini ;把变量b,添加到ini文件中的最后 Run,%A_ScriptDir%\123.ahk ;重新运行这个脚本,之所以使用run而不使用reload,是因为曾经觉得肯定会扩展开的,所以要把数据分开比较好。现在觉得无所谓啦··· return }
有没有更好的方法?有的,有很多···但是···能用就好···能用就好···
每添加一个账号,都会在ini文件中添加内容,也会在ahk文件中添加一个标签,添加多了,就如图了。
明文保存账号密码肯定有各种不方便,但是一般来说都不会放特别重要的东西啦,主要是工作需要,所以做一个小工具减轻自己的负担。其实可以对密码进行加密,每次登陆的时候输入一个密钥就可以全部解锁了,这样别人哪怕拿到文件,也不能猜到密钥是什么。
畅想:
如果要根据网页来识别账号密码,可以在激活热键之后,读取网址,利用正则搞定关键字,然后推荐内容,提示就用tooltip提示就好了。
以下是最终ahk代码
readini(Section_name){ ;定义一个函数读取ini配置,传入变量名称随意。输入区域块名称,获取账号和密码,并在网页中登录 global ;考虑到之后可能要在不同的函数中使用,所以这里用global声明了该函数中生成的全都是全局变量。 IniRead,output_a,%A_ScriptDir%\账号密码.ini,%Section_name% ;该行代码将数据,保存到output_a中,原谅我如此随意的变量名··· ;~ StringSplit,finally_a,output_a,`n ;这里可以使用伪数组,但是伪数组依赖名称,所以这里使用数组。P.S.伪数组示例:a1 a2 a3 word_array := StrSplit(output_a,"`n") ;把提取的数据,分割成数组,数组需要使用for循环才能读取。 send,!{F4} ;以下几行代码是关闭GUI界面,这可以略过。 Sleep,400 Click Sleep,400 Send,{Enter} ;--------第一部分完成,文本读取-------- ;根据传入的名称,在ini文件中寻找对应的数据块,在本文中,数据块为“名称A”。找到数据块之后,返回数据块中的数据,文本中是啥,就是啥。在本文中,数据是123换行321。 for i,j in word_array { sleep,100 ;~ send,{tab} ;~ send,%j% ;有需要的朋友可以把这三行代码换成 MsgBox,%j% 测试一下。 MsgBox,%j% ;这里是功能测试,就是当GUI和ini都成功生成了一个按钮之后,点击按钮会发生的事情。我这里用msgbox测试。 } Sleep,200 send,{Enter} ;--------第二部分完成,数据分割,数据操作,这部分可以玩出各种花样-------- return } !r:: ;呼出后台登录账号界面,该脚本核心功能 { IniRead,output_a,%A_ScriptDir%\账号密码.ini ;读取配置的时候忽略数据名称key,则会返回所有数据名称,返回的是字符串,需要分割。 word_array := StrSplit(output_a,"`n") ;分割字符串 x:=0 ;定义一下界面,比如说从X0,Y0开始,一个按钮100宽,30高,数量从0开始,每到5个,就把x归零,把y加30,很简单。 k:=0 w:=100 h:=30 num:=0 for i,j in word_array ;自动化新建按钮,并且按照一行5个的规律换行。这里可以用gui宽度来设置列,因为我已经限制了gui宽度为500,所以不需要这个future。 { Gui add,Button,x%x% y%k% w%w% h%h% g%j%,%j% ;注意这里设置了g标签,点击按钮会触发相应的功能。标签名称就是区域块名称,在这里就是“名称A” num+=1 x+=100 if (num//5) { k+=30 x:=0 num:=0 } } gui,add,button,x%x% y%k% w%w% h%h% gwork_mid,添加账号 ;在自动生成的按钮之后,放一个添加账号用的按钮,绑定了一个work_mid标签。 Gui Show, w500 h500, 电视登录 ;通过快捷键alt+r,可以呼出一个宽高均为500的gui界面,之后会调用ini,读取所有的块名称,并根据这些名称生成按钮。 return } work_mid: ;添加账号的功能 { gui,new Gui Add, Text, x8 y8 w55 h23, 账号名称 Gui Add, Edit, vname x72 y8 w120 h21 Gui Add, Text, x8 y40 w55 h23 +0x1, 账号 Gui Add, Edit, vzhang x72 y40 w120 h21 Gui Add, Text, x8 y72 w55 h23 +0x1, 密码 Gui Add, Edit, vpassword x72 y72 w120 h21 Gui Add, Button, gwork_add x8 y104 w186 h23, 确定添加 Gui Show, w202 h370, 添加账号密码 return } work_add: ;将输入的信息,保存在两个文本中,再重新运行脚本。 { Gui, Submit,NoHide ;点击确认添加之后,submit提交 a=%name%:`nreadini("%name%")`nreturn`n ;定义一个变量a,它的内容是 名称 冒号 换行 readini(名称) 换行 return 换行 b=[%name%]`n%zhang%`n%password%`n ;定义一个变量b,它的内容是 名称 换行 账号 换行 密码 换行 FileAppend ,%a%,%A_ScriptDir%\123.ahk ;把变量a,添加到脚本中的最后 FileAppend ,%b%,%A_ScriptDir%\账号密码.ini ;把变量b,添加到ini文件中的最后 Run,%A_ScriptDir%\123.ahk ;重新运行这个脚本,之所以使用run而不使用reload,是因为曾经觉得肯定会扩展开的,所以要把数据分开比较好。现在觉得无所谓啦··· return }
😀
脚本报错