vieyahn2017 / iBlog

44 stars 0 forks source link

8.31 AutoIT (windows GUI自动化操作) #362

Closed vieyahn2017 closed 3 months ago

vieyahn2017 commented 3 years ago

AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。而这是其它语言不可能做到或无可靠方法实现的(例如VBScript和SendKeys).

功能:

1、运行Windows和Dos程序[1] 2、模拟键击动作(支持大多数键盘布局) 3、模拟鼠标移动和点击动作 4、对窗口进行移动,调整大小和其它操作 5、直接与窗口的“控件“交互(设置/获取文本,移动,关闭等等) 6、配合剪贴板进行剪切/粘贴文本操作 7、对注册表进行操作 8、不同于AutoIt v2版本,新的v3版本有更多标准语法-类似于VBScript和BASIC-而且支持更复杂的表达式,用户函数,循环以及脚本编写老手们所期待的其它所有内容. 9、正如以前版本一样,AutoIt设计得尽可能的小(大约115KB)并且不用依赖外部DLL文件或添加注册表项目即可独立运行.此外使用 Aut2Exe 这个工具还可以把脚本文件编译为独立的可执行程序. 10、同时升级了ActiveX和DLL版本在AutoIt里称为 AutoItX - 与v2版本不同的是它将是一个组合控件 (COM组件对象模型和同一DLL文件中的标准DLL函数).AutoItX 将允许您加入一些AutoIt独有的特性到您最常用的脚本语言或程序设计语言中去!请查看这AutoItX帮助文件 (开始 \ 程序\ AutoIt v3 \ Extras \ AutoItX \ AutoItX Help File) 以获得更多信息和示例. 最重要的是,AutoIt 将继续是免费的 - 但是如果您打算支持我们花在此工程的时间,金钱以及所作努力和网站主机运作的话,那么您可以到AutoIt的主页上进行捐赠.

vieyahn2017 commented 3 years ago

Autoit3我们用来干什么?

https://blog.csdn.net/mush_me/article/details/84818177

看了介绍,知道了一些用处,但是我们一般都把这个脚本语言用来干什么?它和其它的语言相比有哪些特点?我们为什么要学习它?

我们一般将它用来作一些自动化的操作,因为Autoit一开始就是设计用来AUTO的。当然,现在它也可以有界面,可以编译成独立且小巧的EXE运行。看起来它和VB差不多,它可以操作IE,WORD,EXCEL,数据库,还可以操作标准的WINDOWS控件——这本就是它的基本功能。也可以模拟按键。下面给出一个带有界面,有BUTTON,有INPUT的小程序。


#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 123, 120, 445, 313)
$Button1 = GUICtrlCreateButton("按钮", 24, 80, 75, 25)
$Input1 = GUICtrlCreateInput("这是输入框", 16, 16, 89, 21)
$Label1 = GUICtrlCreateLabel("这个是标签吧?", 16, 48, 88, 17)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            f()
    EndSwitch
WEnd

Func f()
    MsgBox(48,"标题","过五秒这个对话框将消失。",5)
    GUICtrlSetData($Label1,"标签被改变。")
    GUICtrlSetData($Input1,"Input被改变。")
EndFunc

这个小程序带有一个函数,就是定义在func.....endfunc里面。消息循环在while....wend里面。接收到$button1被按下的消息,就会执行f()。include主要用来包含需要的文件,下面的界面代码,由KODA生成,可以在工具箱里找到。这样的程序有个小缺点,就是每次都会在系统的通知区域出现一个AU3的图标,而且点击这个图标,脚本执行会停下来。不过我们可以在脚本里加入:Opt ("TrayIconHide",1)来去掉这个显示。多看帮助,大家可以发现,这是一个简单有趣的小东西,而且它还可以使用COM对象,大家可以到坛子里看到更多的牛人写的东西。听说官方坛子已经有人开发出了用AU3写WEB脚本的解释程序。

vieyahn2017 commented 3 years ago

Python selenium+AutoIt 实现自动获取网页内Flash窗口中的信息,以图片的方式保存

https://blog.csdn.net/az9996/article/details/86013639

枪枪枪 2019-01-07 17:20:11 1713 收藏 6 分类专栏: Python 版权 python结合AutoIt工具后真是太赞了!能很大程度上实现自动化操作。

这次只是一个很简单的演示,但是所用的方式能产生很多可能,~ ~ !!! 完善了webdriver的功能! 使用场景:针对网页内嵌套的flash窗口,selenium中的webdriver无法操作造成断点时,使用AutoIt工具来解决。

vieyahn2017 commented 3 years ago

python3+selenium+autoit【实现右键文件另存为】功能

https://blog.csdn.net/s740556472/article/details/79322047

s740556472 2018-02-13 16:57:21 9508 收藏 9 分类专栏: |----Python 文章标签: pythonselenium自动化autoit文件下载 版权 前言 selenium是一个很强大的web自动化框架,之前也有用它写过东西,详见: http://blog.csdn.net/s740556472/article/details/78150666 然而对于文件的上传与下载它却显得无力,它虽然可以通过web driver驱动对浏览器的元素进行操作,可当点击下载,浏览器弹出的窗口它无法与其进行交互。 当然在网上也查阅了大量资料去尝试,谷歌浏览器有一种设置可以直接下载,通过这种方式下载的文件有几点诟病:

无法重命名下载文件。 一旦文件被谷歌浏览器检验出有害(例如下载jar包格式的文件),浏览器会弹出另一层确认选项卡(该文件会损害您的电脑,是否保存),这样一来用selenium便实现不了功能了。 此篇有些略长,若想实现功能,请静下心来慢慢看,比较详细,若有错误还望指出! 思路 对于selenium本身而言,通过驱动的方式不可行,但是还有另一种方式,就是通过右键超链接位置,有个另存为的选项,沿着这个思路下去,便解决了selenium的无力。

vieyahn2017 commented 3 years ago

使用AutoIt制作软件自动化安装包

不管是新机器,还是旧机器重装系统后,都有一大堆的工具要一个一个安装。之前也有同事提到过相关改进建议,希望能一键式实现所有工具安装。这个想法是挺好的,不过实现起来并不是很容易的事情。

目前公司有rtools,加上翻译中心常用工具清单,其实也还是可以根据清单列表来自行安装工具的。

想过将整个C盘做镜像,这样在安装操作系统时就自动将所有必需的工具安装上了。这种方式涉及的环节比较多。

后来查阅了一些资料,简单一点的方法,可以通过使用AutoIt来制作安装包。另外一个工具InstallRite也可以制作自动化安装包,相对来说AutoIt的功能更强大一些。

具体操作过程可参考百度文库上的文章:http://wenku.baidu.com/view/22b31581b9d528ea81c779fb.html

初步尝试了制作一个自动化安装工具包,可自动化实现安装FAR、Notepad++、Practicount。这几个都是比较小的工具,操作相对容易一些。像那些Trados、Arbortext等较大的工具,安装步骤复杂,暂没有实现安装包制作。

vieyahn2017 commented 3 years ago

AUTOIT做的小软件

https://blog.csdn.net/yuwanfei/article/details/51352462

犀利不糊涂 2016-05-09 13:43:04 3264 收藏 2 分类专栏: 杂谈 版权 首先说明,本人不是计算机人员,而是一名财务人员。只是爱好编程。因此自学了C,C++,C#,VBA,Autoit等简单的语法。也能用这些编程语言通过VS(MFC,VC#),QT,Excel等写一些简单的程序(请见我的下载资源)。这些程序有的是为了熟悉编程流程比如简单版的计算器(c++->MFC),有些是提高工作效率的小工具比如(EXCEL自动匹配程序,银行对账工具)。其中最好用的,可以真正称得上软件的居然是AUTOIT写的一个会计上的AR清帐对账方面,SAP等ERP软件根本不能满足要求,因为称得上是个软件,因此涉及的方面比较多。我就没上传。需要的可以留言。谢谢!

我没有为上面的软件起名字。功能主要是2大块:

1、自动做账并清帐。也就是把公司的银行回款自动做到SAP等ERP系统里或者说财务系统里。会计凭证号码自动保存到自己想要的地方。

2、预付款清帐。如果1中的银行回款是预付款。则在1中直接做账不清帐。以后定期由2这个模块自动清帐。

3、清帐查询。客户如果要对回款方面的账。在这个软件里很容易查询,SAP等软件却很难,因为SAP等ERP软件都是在你做进去账的基础上查询,如果你没做对账呢?比如A客户的回款不小心放在了B客户的账上。等A来跟你对账的时候,你是不知道这笔回款的存在的。你可以会说查银行帐啊。既然做这个软件就是因为很多企业的银行每天都很多。特别是贸易性企业。SAP查银行帐功能很多,但实在不方便,速度也太慢。比如,有个客户叫ABC公司,他们说我们上个月给你付款1000元,让你查下到账没有。SAP首先要在xd03中查出ABC的客户编码,然后在FBL5N中查看这个客户的账,如果账上的确有1000元还好。如果没有呢?就只好用GL的FBL1N去查银行明细账。然后输入金额,查1个月的。数据量大。等个3-5分钟是正常的。有很多个1000元呢。你又不能马上看出哪笔是这个客户的付款而做到其他客户账上了,或者干脆放在了Unknown。

以上3个功能提高做账查账效率,输入准确性(可以说是0误差的输入)。

3个大功能还有具体的小功能比如数据上传,数据导出,编辑清帐记录。查询条件的多样和模糊性等等。

当然还有不完善的地方,比如,SAP中清帐记录只是有了凭证级别的号码信息,而没有具体的Billing号码信息,甚至订单货物发票号码信息等。由于公司也不让我们随便装软件。我用的是SQLITE文件型数据库。如果是MSSQL SERVER,或者MYSQL,那就可以扩展很多。否则数据量大了以后DB文件太大。

看下软件界面图吧:

1和2的功能全在命令菜单里。基本上无界面,就是说你点一下菜单,就会自动打开SAP或者激活SAP相关的T_CODE,然后自动录入或者清帐。

vieyahn2017 commented 3 years ago

APT28最新活动:Zepakab下载器分析

Cybaze-Yoroi ZLab研究人员1月份调查了APT28的一起最新活动。样本最早是意大利安全研究人员发现的,随后在infoSec安全社区共享了该样本。

APT28最新活动:Zepakab下载器分析

Cybaze-Yoroi ZLab安全研究人员根据该样本进行了进一步分析。

技术分析

攻击向量还不明确,APT28一般使用含有VB宏的诱饵office文档。但分析的样本假装模仿微软的serviceTray组件。

APT28最新活动:Zepakab下载器分析

乍一看,可执行文件是用UPX v3.0压缩器压缩的,这是一种压缩PE文件大小的常用工具。

APT28最新活动:Zepakab下载器分析

图1. 恶意PE信息

有趣的是,可执行文件的resource部分是典型的AutoIt v3编译的脚本二进制文件模式:AUT3!签名。

vieyahn2017 commented 3 years ago

autoit、selenium和requests三种自动化操作网页的方式

目录 一、Autoit 二、python和selenium 三、python和requests

本总结以自动化申请夜宵为例,旨在帮助想学习自动化控制网页的同事快速入门。

一、Autoit

autoit是windows下的GUI自动化操作工具,可以操作鼠标、键盘和任何windows的标准控件,自动化控制IE只是它的功能之一。

1.1 autoit的安装

下载附件的autoit-v3,解压缩,无需安装。打开目录autoit-v3\install\SciTe的SciTE.exe,这是编辑器,直接在这上面写代码,按F7编译,按F5运行。

1.2 语法

在SciTE上按F1,打开帮助,选中目录->AutoIt->Keyword Reference,看这里。AutoIt的帮助文档非常详细,基本不用找其它的资料。

1.3 autoit的ie组件

打开帮助,选中目录->User Defined Functions Reference->IE Management,在这之下即是控制IE的所有函数,每个函数不仅解释详细且有例子。

1.4 自动化脚本,模拟手动操作

vb代码

#include <IE.au3>   ;引入IE头文件

Func main($username, $password, $boss_sequence)
   ;参数boss_sequence是HR权签人中主管的序号,从1开始,比如HR权签人显示3位主管,你想选中第二位,这里就填2
   Global $oIE = _IECreate("http://wx...com/nightsnack/hrscMenuAction.do?id=20225") ;打开网页
   _IELoadWait($oIE) ;等待加载网页
   Local $html = _IEDocReadHTML($oIE) ;获取网页的内容
   If StringInStr($html, "uid") Then
      Local $user_ele = _IEGetObjByName($oIE, "uid") ;获取名为uid的控件
      $user_ele.value = $username ;设置为域账户
      Local $password_ele = _IEGetObjByName($oIE, "password") ;获取名为password的控件
      ;$password_ele.value =  $CmdLine[2]
      $password_ele.value =  $password ;设置为账户的密码
      Local $submit = _IEGetObjByName($oIE, "Submit") ;获取名为Submit的控件
      $submit.click() ;点击提交登录
      _IELoadWait($oIE) ;等待加载网页
   EndIf
   $html = _IEDocReadHTML($oIE)
   If StringInStr($html, "uid") Then
      MsgBox(0,"填报yx工具提醒","用户名或密码错误")
      _IEQuit($oIE)
   Else
      Local $select_Hr_Approver = _IEGetObjByName($oIE, "Select HR Approver") ;获取HR权签人控件
      _IEAction($select_Hr_Approver, "click") ;点击HR权签人
      Sleep(500)
      Local $select_boss = _IEGetObjByName($oIE, "radioS", $boss_sequence-1) ;获取主管的单选框控件
      _IEAction($select_boss, "click") ;选择主管
      Sleep(500)
      Local $ok = _IEGetObjByName($oIE, "ok") ;获取ok按钮控件
      _IEAction($ok, "click") ;点击ok按钮
      Sleep(500)
      Local $sub = _IEGetObjByName($oIE, "sub") ;获取提交按钮
      _IEAction($sub, "click") ;点击提交按钮
      ControlClick("来自网页的消息", "", "[CLASS:Button; TEXT:确定]")
      _IELoadWait($oIE)
      Sleep(4000)
      $html = _IEDocReadHTML($oIE)
      If StringInStr($html, "已提交") Then
         MsgBox(0,"夜宵填报工具","夜宵已成功提交")
      EndIf
      _IELinkClickByText($oIE, "注销") ;点击注销按钮
      _IEQuit($oIE) ;退出IE
   EndIf
   $ClearID = "32"
   Run("RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess " & $ClearID) ;清除ie密码记录
EndFunc

main("账号","账号密码", 2)

···

## 二、python和selenium   
selenium是网页的自动化测试框架,支持python和java,而且不像Autoit只能操作IE,selenium也能控制chrome和火狐。

2.1 安装python和selenimu模块

2.1.1 python安装:

2.1.2 selenium模块请从附件下载,并把附件的IEDriverServer.exe和.py文件放在同一个目录下

2.2 参考书

推荐《selenium 2 自动化测试实战基于Python语言》,可以到我工位借阅。

2.3 脚本示例

python代码
```python
def webOption(username, password, bossname=''):
    driver = webdriver.Ie()
    driver.get('http://wx...com/nightsnack/hrscMenuAction.do?id=20225')
    user_ele = driver.find_element_by_name('uid')
    user_ele.clear()
    user_ele.send_keys(username)
    password_ele = driver.find_element_by_name('password')
    password_ele.clear()
    password_ele.send_keys(password)
    driver.find_element_by_name('Submit').click()
    time.sleep(3)
    try:
        driver.find_element_by_link_text(u'注销')
    except Exception:
        win32api.MessageBox(0, u"用户名或密码错误", u"来自yx自动提交工具", win32con.MB_ICONERROR)
        driver.quit()
    driver.find_element_by_name('Select HR Approver').click()
    time.sleep(0.5)
    driver.find_element_by_xpath("//input[@value='" + bossname + "']").click()
    time.sleep(0.5)
    driver.find_element_by_name('ok').click()
    time.sleep(0.5)
    driver.find_element_by_name('sub').click()
    time.sleep(0.5)
    driver.switch_to_alert().accept()
    time.sleep(1)
    driver.quit()
    # win32api.MessageBox(0, u"夜宵已成功提交", u"来自夜宵自动提交工具", win32con.MB_OK)

三、python和requests

requests模块的作者自称为HTTP for humans,它的设计思路非常符合人类思维习惯,因此自诞生之日起就广受好评。

3.1 安装requests模块

请从附件下载,如果安装失败,请根据失败提示,安装其它依赖组件。

3.2 学习资料

http://cn.python-requests.org/zh_CN/latest/

3.3 从附件下载Fiddler工具,分析浏览器和服务器的行为

3.4 脚本示例

python代码

#!/usr/bin/python2.7
# encoding=utf-8

import requests
import re

def logW3(username, password):
    '''
    登录W3
    : params: userName: 账号
              password: 密码
    : return: r: requests.Session()类型
    '''
    login_url = 'https://login...com/login/login.do'
    headers = {'User-Agent' : 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'}
    param = {'actionFlag': 'loginAuthenticate',
    'lang': 'en',
    'loginMethod': 'login',
    'loginPageType': 'mix',
    'password': password,
    'redirect': 'http://ms....com/hi/home?_type=menu',
    'redirect_local': '',
    'uid': username}

    redirect_url = "http://ms...com/hi/home"
    r = requests.post(login_url, headers=headers, params=param) # 登录, 获取cookie
    # print(r.status_code, r.text) # 返回状态值
    # print(r.content )
    if re.search('欢迎', r.content):
        print('w3登录成功')
        return r
    else:
        raise Exception('w3登录失败')

def submitNightSnack(username, password, boss_name_str, boss_id_str):
    '''
    提交夜宵补助
    : params: userName: 账号
              password: 密码
              boss_name_str: 主管姓名,如'zhang'
              boss_id_str: 主管工号
    '''

    # 登录W3
    r = logW3(username, password)

    # 获取加班日期
    headers_base = {
            'Host': 'w3...com',
            'Connection': 'keep-alive',
            'Cache-Control': 'max-age=0',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Referer': 'http://w3...com/nightsnack/hrscMenuAction.do?id=20227&&returnURL=20225',
            'Accept-Encoding': 'gzip, deflate, sdch',
            'Accept-Language': 'zh-CN,zh;q=0.9',
        }

    url = 'http://w3...com/nightsnack/hrscMenuAction.do?id=20225'
    # print(url)
    s = requests.get(url, headers=headers_base, cookies=r.cookies)
    # print(s.status_code, s.text)
    # print(s.content)
    rPattern = re.compile(r'<td align="center">(\d{4}-\d{2}-\d{2})', re.M)
    overtime_date_list = rPattern.findall(s.content)
    print('加班的日期:', overtime_date_list)

    # 提交加班申报
    headers_base = {
            'Host': 'w3...com',
            'Connection': 'keep-alive',
            'Cache-Control': 'max-age=0',
            'Origin': 'http://w3...com',
            'Upgrade-Insecure-Requests': '1',
            'Content-Type': 'application/x-www-form-urlencoded',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Referer': 'http://w3...com/nightsnack/hrscMenuAction.do?id=20225',
            'Accept-Encoding': 'gzip, deflate, sdch',
            'Accept-Language': 'zh-CN,zh;q=0.9',
        }
    data = ''
    for overtime_date in overtime_date_list:
        data += '%s=1&%sold=1&%scheck=1&%slock=0&' % (overtime_date, overtime_date, overtime_date, overtime_date)
    data += 'superiorNotesID=%s+%s' % (boss_name_str, boss_id_str)
    url = 'http://wx...com/nightsnack/hrscMenuAction.do?id=20227&&returnURL=20225'
    r = requests.post(url=url, headers=headers_base, cookies=r.cookies, data=data)
    # print(s.content)
    if re.search('已提交', s.content):
        print('yx补助提交成功')
    else:
        print('yx补助提交失败')

if __name__ == '__main__':
    submitNightSnack('user', 'yourpassword', 'zhangxxx', '00xxxxxx')
vieyahn2017 commented 3 years ago

上一楼 帖子的python代码 带有行号。 用以下的脚本简单处理


ct = """
-vb代码
01
#include <IE.au3>   ;引入IE头文件
02

03
Func main($username, $password, $boss_sequence)
04
   ;参数boss_sequence是HR权签人中主管的序号,从1开始,比如HR权签人显示3位主管,你想选中第二位,这里就填2
05
   Global $oIE = _IECreate("http://wx...com/nightsnack/hrscMenuAction.do?id=20225") ;打开网页
06
   _IELoadWait($oIE) ;等待加载网页
07
   Local $html = _IEDocReadHTML($oIE) ;获取网页的内容
08
   If StringInStr($html, "uid") Then
09
      Local $user_ele = _IEGetObjByName($oIE, "uid") ;获取名为uid的控件
10
      $user_ele.value = $username ;设置为域账户
11
      Local $password_ele = _IEGetObjByName($oIE, "password") ;获取名为password的控件
12
      ;$password_ele.value =  $CmdLine[2]

....

"""

print('\n'.join([x[2:] for x in ct.split("\n")]))
# 去掉前两个字符

In [13]: a=["22", "23", "33","aa"]
In [14]: filter(lambda x: x.startswith("2"), a)
Out[14]: ['22', '23']

import re  
def end_num(string):  
    #以一个数字结尾字符串
    text = re.compile(r".*[0-9]$")  
    if text.match(string):  
        return True  
    else:  
        return False  

def start_num(string):  
    #以一个数字结尾字符串
    text = re.compile(r"^[0-9].*$")  
    if text.match(string):  
        return True  
    else:  
        return False  

print(end_num('abcdef'))  
print(end_num('abcdef6'))
print(start_num('6abcdef'))
print(start_num('abcdef'))

# 去掉帖子的数字行(其实是跨行的行号)

print('\n'.join(filter(lambda x: not start_num(x), ct.split("\n")  ) ))