Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475
  接上一篇博文python办公自动化系列之金蝶K3自动登录(一),我们接着聊聊利用python脚本实现金蝶K3 Wise客户端自动登录这一需求。

如上图所示,自动选择【组织机构】后,我们还需要驱动【当前账套】、【命名用户身份登录】、【用户名】、【密码】、【确定】这几个控件,才算是完成了K3 UI自动化的第一步:自动登录。

一、设置【当前账套】控件

【当前账套】Label右边对应的同样是一个ThunderRT6ComboBox 类,我们选择comboBox某个下拉项时,只有基于索引Index,但是由于集团公司随着业务不断变化,账套数可能存在变化,每个公司账套对应的索引值也会变化。因此,我们最好想办法实现基于账套名称来实现驱动某个comboBox控件。比较通俗易懂的做法是,我们先设法拿到这个组件的所有listItem,将每个Item对应的value(文本值)和listIndex(索引)存入一个字典,那么当用户端随便抛给我们一个账套名时,我们便能基于该字典迅速知道listIndex,再基于它来选择这个comboBox控件。这里面涉及到comboBox一些属性和方法的应用,具体示例代码如下:

 1 import win32gui,win32con2 def getAccountDic(currentAccountHwnd):3     '''根据【当前账套】的句柄,得到该comboBox所有下拉选项,将选项值ItemText和对应的ItemIndex存入字典 accountDic,最终返回'''4     accountDic={}5     accountCnt=win32gui.SendMessage(currentAccountHwnd, win32con.CB\_GETCOUNT, 0, 0)6     for i in range(accountCnt):7         textLen= win32gui.SendMessage(currentAccountHwnd, win32con.CB\_GETLBTEXTLEN, i,0)*2 # 创建一个比combobox 文本长度两倍的buffer,确保数据都能存进去8         buffer = win32gui.PyMakeBuffer(textLen)9  win32gui.SendMessage(currentAccountHwnd, win32con.CB\_GETLBTEXT, i, buffer)
10         address,length=win32gui.PyGetBufferAddressAndLen(buffer[:-1])
11         length=int((length+1)/2)
12         itemText=win32gui.PyGetString(address,length).strip()  # 从内存中取出combobox的当前项内容
13         accountDic[itemText]=i
14     return accountDic
15
16 def setCurrentAccount(currentAccountHwnd,currentAccountName,accountDic):
17     '''根据【当前账套】的句柄,,需要选择的账套名称,和账套字典,选择特定账套为当前账套'''
18     accountIndex=accountDic[currentAccountName]
19     win32gui.SendMessage(currentAccountHwnd, win32con.CB\_SETCURSEL, accountIndex, 0)

二、选择【登录方式】为【以命名用户身份登录(D)】

根据实际需要,小爬这里演示下以命名用户身份登录(D),其它登录方式,手段同理。spy++观察到它其实是一个optionButton。我们可以这样设置:

1 def setOptionBtn(parentHwnd,optionName):
2     # optionName="以命名用户身份登录(D)"
3     '''通过spy++得到这些optionButton的父元素句柄,在基于文本optionName找到并选择特定的optionButton'''
4     optionBtnHandle=win32gui.FindWindowEx(parentHwnd,0,None, optionName) # 以命名用户身份登录(D) optionButton
5     win32gui.SendMessage(optionBtnHandle, win32con.WM\_LBUTTONDOWN, 0, 0) # 设置登录方式为【以命名用户身份登录(D)】
6     time.sleep(0.01)
7     win32gui.SendMessage(optionBtnHandle, win32con.WM\_LBUTTONUP, 0, 0)

三、设置【用户名】、【密码】控件

通过spy++观察到这两个控件的类名为ThunderRT6TextBox,也算是textBox的子类。我们可以大胆使用SendMessage的WM_SETTEXT来实现这一点,唯一的难度在于基于类名来定位这两个控件时稍微有些麻烦,其中【密码框】控件可以通过定位父元素,然后利用findwindowEx方法,基于ThunderRT6TextBox找到第一个元素即可,而【用户名框】可以通过【当前账套】控件来找下一个控件得到。这里比较让人混淆的是:后台的所有控件【用户名】在下,【密码】在上,与肉眼观察到的物理位置刚好相反。具体代码示例如下:

1 def setUserInfo(userName,passWord,parentHwnd,currentAccountHwnd):
2     passwordHwnd=win32gui.FindWindowEx(parentHwnd,0,"ThunderRT6TextBox", None) # 密码框,基于父元素和其类名找到的第一个即可
3     time.sleep(0.1)
4     userNameHwnd=win32gui.FindWindowEx(parentHwnd,currentAccountHwnd,None, None)  # 用户名框,基于【当前账套】控件句柄找到下一个即可
5     time.sleep(0.1)
6  win32gui.SendMessage(userNameHwnd, win32con.WM\_SETTEXT, None,userName)
7     time.sleep(0.1)
8     win32gui.SendMessage(passwordHwnd, win32con.WM\_SETTEXT, None,passWord)

四、发送【回车】实现登录

小爬通过模拟给登录界面发送【回车键】来实现登录,示例代码如下:

1     '''根据登录界面句柄sysLoginWnd,发送回车键实现登录'''
2  win32gui.PostMessage(sysLoginWnd, win32con.WM\_KEYDOWN, win32con.VK\_RETURN, 0)
3     time.sleep(0.01)
4     win32gui.PostMessage(sysLoginWnd, win32con.WM\_KEYUP, win32con.VK\_RETURN, 0)

结合上一篇博文,我们基本就完成了K3登录需要的各个方法,我们只需要依次调用,就可以实现K3自动登录某个账套啦。希望小爬的分享对你们的日常工作有所帮助,完整代码如下,供参考,:

 1 # 需要使用管理员权限运行VScode或者Pycharm,否则无法正常使用2 import win32gui,win32api,win32con,subprocess,time,os3 def getK3LoginHwnd():4     sysLoginWnd=win32gui.FindWindow('ThunderRT6Form',"金蝶K/3系统登录") # K3系统登录窗5     if sysLoginWnd==0:6         subprocess.Popen(r'C:\Program Files (x86)\Kingdee\K3ERP\K3MainNet.exe')7 8     # subprocess发送指令启动后需要等K3登录窗彻底可见后,再进行后续操作9     while sysLoginWnd==0:
10         time.sleep(0.3)
11         sysLoginWnd=win32gui.FindWindow('ThunderRT6Form',"金蝶K/3系统登录") # K3系统登录窗
12     isSysLoginWndVisible=0
13     while isSysLoginWndVisible==0:
14         time.sleep(0.3)
15         sysLoginWnd=win32gui.FindWindow('ThunderRT6Form',"金蝶K/3系统登录") # K3系统登录窗
16         isSysLoginWndVisible=win32gui.IsWindowVisible(sysLoginWnd) # 判断窗口是否已经对用户可见
17     return sysLoginWnd
18
19 def setOrganization(sysLoginWnd,organizationIndex):
20     '''根据K3登录窗的句柄sysLoginWnd和下拉框索引值organizationIndex,选择特定的组织机构'''
21     mainHwnd1=win32gui.FindWindowEx(sysLoginWnd,0,None, '') # ThunderRT6PictureBoxDC
22     mainHwnd2=win32gui.FindWindowEx(sysLoginWnd,mainHwnd1,None, '') # ThunderRT6PictureBoxDC
23     organizationHwnd=win32gui.FindWindowEx(mainHwnd2,0,"ThunderRT6ComboBox", '') # 组织机构
24     currentOrgIndex=win32gui.SendMessage(organizationHwnd, win32con.CB\_GETCURSEL) # 当前combobox选中的index
25     if currentOrgIndex!=organizationIndex:
26  win32gui.SendMessage(organizationHwnd, win32con.CB\_SETCURSEL, organizationIndex, 0)
27
28         '''模拟鼠标左键点击元素,激活它'''
29  win32gui.SendMessage(organizationHwnd, win32con.WM\_LBUTTONDOWN, 0, 0)
30         time.sleep(0.01)
31  win32gui.SendMessage(organizationHwnd, win32con.WM\_LBUTTONUP, 0, 0)
32
33         '''小爬此处的场景中,【组织机构】有6个下拉项,那么最大的index就是5'''
34         if organizationIndex<5: # 模拟键盘↓+键盘↑
35  win32gui.PostMessage(organizationHwnd, win32con.WM\_KEYDOWN, win32con.VK\_DOWN, 0)
36             time.sleep(0.01)
37  win32gui.PostMessage(organizationHwnd, win32con.WM\_KEYUP, win32con.VK\_DOWN, 0)
38             time.sleep(0.1)
39  win32gui.PostMessage(organizationHwnd, win32con.WM\_KEYDOWN, win32con.VK\_UP, 0)
40             time.sleep(0.01)
41  win32gui.PostMessage(organizationHwnd, win32con.WM\_KEYUP, win32con.VK\_UP, 0)
42         else: # 模拟键盘↑+键盘↓
43  win32gui.PostMessage(organizationHwnd, win32con.WM\_KEYDOWN, win32con.VK\_UP, 0)
44             time.sleep(0.01)
45  win32gui.PostMessage(organizationHwnd, win32con.WM\_KEYUP, win32con.VK\_UP, 0)
46             time.sleep(0.1)
47  win32gui.PostMessage(organizationHwnd, win32con.WM\_KEYDOWN, win32con.VK\_DOWN, 0)
48             time.sleep(0.01)
49  win32gui.PostMessage(organizationHwnd, win32con.WM\_KEYUP, win32con.VK\_DOWN, 0)
50             time.sleep(0.1)
51
52 def getAccountDic(currentAccountHwnd):
53     '''根据【当前账套】的句柄,得到该comboBox所有下拉选项,将选项值ItemText和对应的ItemIndex存入字典 accountDic,最终返回'''
54     accountDic={}
55     accountCnt=win32gui.SendMessage(currentAccountHwnd, win32con.CB\_GETCOUNT, 0, 0)
56     for i in range(accountCnt):
57         textLen= win32gui.SendMessage(currentAccountHwnd, win32con.CB\_GETLBTEXTLEN, i,0)*2 # 创建一个比combobox 文本长度两倍的buffer,确保数据都能存进去
58         buffer = win32gui.PyMakeBuffer(textLen)
59  win32gui.SendMessage(currentAccountHwnd, win32con.CB\_GETLBTEXT, i, buffer)
60         address,length=win32gui.PyGetBufferAddressAndLen(buffer[:-1])
61         length=int((length+1)/2)
62         itemText=win32gui.PyGetString(address,length).strip()  # 从内存中取出combobox的当前项内容
63         accountDic[itemText]=i
64     return accountDic
65
66 def setCurrentAccount(currentAccountHwnd,currentAccountName,accountDic):
67     '''根据【当前账套】的句柄,,需要选择的账套名称,和账套字典,选择特定账套为当前账套'''
68     accountIndex=accountDic[currentAccountName]
69  win32gui.SendMessage(currentAccountHwnd, win32con.CB\_SETCURSEL, accountIndex, 0)
70
71 def setOptionBtn(parentHwnd,optionName):
72     # optionName="以命名用户身份登录(D)"
73     '''通过spy++得到这些optionButton的父元素句柄,在基于文本optionName找到并选择特定的optionButton'''
74     optionBtnHandle=win32gui.FindWindowEx(parentHwnd,0,None, optionName) # 以命名用户身份登录(D) optionButton
75     win32gui.SendMessage(optionBtnHandle, win32con.WM\_LBUTTONDOWN, 0, 0) # 设置登录方式为【以命名用户身份登录(D)】
76     time.sleep(0.01)
77  win32gui.SendMessage(optionBtnHandle, win32con.WM\_LBUTTONUP, 0, 0)
78
79 def setUserInfo(userName,passWord,parentHwnd,currentAccountHwnd):
80     passwordHwnd=win32gui.FindWindowEx(parentHwnd,0,"ThunderRT6TextBox", None) # 密码框,基于父元素和其类名找到的第一个即可
81     time.sleep(0.1)
82     userNameHwnd=win32gui.FindWindowEx(parentHwnd,currentAccountHwnd,None, None)  # 用户名框,基于【当前账套】控件句柄找到下一个即可
83     time.sleep(0.1)
84  win32gui.SendMessage(userNameHwnd, win32con.WM\_SETTEXT, None,userName)
85     time.sleep(0.1)
86  win32gui.SendMessage(passwordHwnd, win32con.WM\_SETTEXT, None,passWord)
87
88 def sendReturn(sysLoginWnd):
89     '''根据登陆界面句柄sysLoginWnd,发送回车键实现登录'''
90  win32gui.PostMessage(sysLoginWnd, win32con.WM\_KEYDOWN, win32con.VK\_RETURN, 0)
91     time.sleep(0.01)
92     win32gui.PostMessage(sysLoginWnd, win32con.WM\_KEYUP, win32con.VK\_RETURN, 0)

欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!

python办公自动化系列之金蝶K3自动登录(二)相关推荐

  1. Python办公自动化(七)|自动更新不对称表格

    需求分析 现在我们有类似如下一份记录了口袋妖怪名字的分组名单:(未全部展示,实际有A-U组+1个"未分组") 现在有一份更新的名单(仅含名字) 需要根据这份新名单对原来的总表进行更 ...

  2. Python进阶之使用Scrapy实现自动登录Github的两种方法(POST,FormRequest,from_response)

    Python进阶之使用Scrapy实现自动登录Github的两种方法 1. 通过.FormRequest()实现登录github github1.py 2. 通过.FormRequest.from_r ...

  3. Ubuntu20.04实现Python基于Selenium实现上海大学校园网自动登录

    Ubuntu20.04实现Python基于Selenium实现上海大学校园网自动登录 以anaconda环境为例,创建一个Selenium的虚拟环境: 一.安装selenium 1. conda cr ...

  4. Python + Selenium实现163邮箱的自动登录和发送邮件

    运用Python和Selenium实现163邮箱的自动登录和发送邮件 初接触selenium,最近研究了一下用python和Selenium实现163邮箱的自动登录和发送邮件的实现过程,中间出现了各种 ...

  5. 用python脚本4行代码实现自动登录上网认证系统

    公司最近搞了个上网认证系统.每天开机要连上网络都要登录一下. 一直听说python啥事都能干,说得我这个美工心痒痒. 装好python,搜了一些教程,说简单的post发送就能搞定, 再往下,了解到了p ...

  6. python 实现华安信达论坛自动登录

    近期需要从论坛采集一些数据,就使用爬虫专属语言python写了一个小爬虫,实现自动登录,并到指定的板块采集帖子标题.作者等信息. 实现自动登录的关键在于模拟浏览器向服务器发送数据包,用Fiddler抓 ...

  7. Python自动化脚本——涉及弹窗,自动登录,截图,获取用户权限,打包程序等

    2020暑期XX银行实习-一个自动化脚本 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高 ...

  8. 【原来Python爬虫还可以这么玩!】python爬虫自动化实现B站自动登录

    从新开始吧,而不是重新开始 哈喽,大家好呐,很久不见,甚是想念! 小夜斗又和大家见面啦,距离小夜斗上次更新爬虫文章又过去了很久辽! 因为在学校的时候有太多事情要做了,就疏忽了博客的更新呐,感觉以后还是 ...

  9. 用python计算成绩_Python使用splinter自动登录教务系统查询并计算成绩(CUMT新版教务系统)...

    矿大2017年使用的是新版的教务系统,提交的密码是经过js加密的. 虽然我最后找到了加密的文件,可是js没有学过,看了半天硬是没看懂. 最后渣渣只能另找办法了,最后发现了一个神器splinter.这个 ...

最新文章

  1. Headfirst JSP 01 (概述)
  2. 美团字节滴滴重启支付大战,王兴张一鸣不甘心
  3. nohup: 无法运行命令 ‘/bin/java‘: 没有那个文件或目录
  4. 有向图生成树是如何画的_漫画:什么是最小生成树?
  5. 编程一个最简单游戏_通过一个简单的数学游戏,清晰了解各大编程语言之间的一些区别...
  6. JAVA入门级教学之(方法-2)
  7. 颠覆与重构——戴尔助力徐工集团等行业客户实现业务转型
  8. java servlet 获取mac地址_Java开发网 - 请教大家几个关于servlet取ip和mac地址的问题~~!...
  9. opencv waitKey() 函数理解及应用
  10. linux中流设备_Linux中的标准文件I/O流
  11. 图片剪裁控件——ClipImageView
  12. 关于postgre中的pg_hba.conf 文件
  13. python 退出自定义函数_python通过自定义异常,提前退出方法
  14. 使用cJSON库解析和构建JSON字符串
  15. Microsoft Visio绘图
  16. Python爬取全站妹子图片,差点硬盘走火了!
  17. oracle数据库迁移到DM数据库
  18. Windows本地认证
  19. Git基本知识和常用命令(IDEA)
  20. 服务器柜机位置摆放电子图,柜式空调摆放位置有什么要注意的吗

热门文章

  1. 帮我写一篇C语言课程的课程实施报告,第一章写整体教学设计,第二章写教学实施流程,第三章写学习效果,第4章写特色与创新,第5章写教学反思与改进...
  2. vba 选中所有区域 但是不包括首行
  3. 如何在 Mac 中运行 Office 办公软件?
  4. MYSQL源码安装概述
  5. cdc工具 postgresql_基于 Flink SQL CDC 的实时数据同步方案
  6. 三边定位_位置解析(C++)
  7. 使用au录音有回音_如何使用回音按钮控制智能家居设备
  8. 利用tasklist和taskkill实现判断进程数按名称杀掉进程
  9. postgresql_anonymizer使用
  10. SaltStack基础知识-SaltStack产品介绍