Sack Automation示例-从一个渠道中抓取联系人列表
背景
最近,我要监视某些Slack频道的联系信息,但是我没有API可以调用。因此,我需要使用UI自动化来完成此任务。
我最近找到了这个图书馆
clicknium
,除了支持Selenium之类的Web自动化外,它还支持桌面自动化,这对我很有用。
您可以跟随此Visual Studio代码扩展到设置环境的入门,对我来说不到2分钟。
Slack客户端自动化 - 刮擦联系人列表
自动选择组和频道。
根据组名称,自动单击左导航栏:
我用
Clicknium录音机
要在Slack上记录UI元素,并使用参数{{group}}进行更新为参数定位器,请参考
Clicknium文档
我将窗口的标题设置为" Slack*",因为ClickNium支持Wild Char匹配,它可以改善自动化稳定性。
然后我将tabitem名称添加到参数"组"中,然后我可以在运行阶段中分配组。
- from clicknium import clicknium as cc, locator, ui
- ui(locator.slack.tabitem_group, {'group':group}).click()
以与自动点击频道相似的方式。
- if not cc.is_existing(locator.slack.treeitem_channel, params):
- ui(locator.slack.treeitem_parent).click()
- ui(locator.slack.treeitem_channel, params).click()
由于有时会折叠频道列表,因此我检查目标频道是否存在是否存在,如果不存在,则需要单击频道以首先超越频道列表。
通过获取右上角的信息文本获取联系人计数,然后解析文本。
- text = ui(locator.slack.text_all, params).get_text()
- index = text.find("members")
- count = int("".join(re.findall("\d+",text[0:index])))
通过单击右上角的信息来显示"联系人列表"对话框。
当联系人列表被动态加载时,因此我们刮擦了几乎10个项目,需要在滚动栏下页上加载新的联系人
- for i in range(1,13):
- dict = {"index":i}
- if not cc.is_existing(locator.slack.listitem_member, dict):
- continue
- elem_member = ui(locator.slack.listitem_member, dict)
- name = elem_member.get_text()
- if NotContains(names, name):
- names.append({'name':name,'email':'', 'postfix':''})
- step += 1
- if step % 100 == 0:
- SaveToFile(names)
- ## move mouse down to trigger new data loaded for member list
- ui(locator.slack.edit_membername).click(by='mouse-emulation')
- for i in range(10):
- cc.send_hotkey("{DOWN}")
我单击查找成员编辑框,然后将热键"向下"发送十次,它将触发加载新的联系人。
要删除每个成员名称,我使用以下参数定位器:
Slack客户端自动化 - 刮擦联系人细节
在上面的部分中,我显示了如何从频道刮擦联系人列表,在本节中,我将展示如何刮擦每个联系人详细信息,例如电子邮件地址。 (如果频道不显示电子邮件地址,则可以跳过本节)。
与上面的自动选择组和频道的部分相同。
通过单击右上角的信息来显示"联系人列表"对话框。
输入联系人名称以搜索联系人
- ui(locator.slack.text_all, params).click()
- ui(locator.slack.edit_membername).set_text(item['name'], "set-text")
如果匹配,请单击以显示联系人的配置文件,然后获取电子邮件的文字
要单击搜索结果,我使用以下定位器,
设置名称"名称"和Uncheck ListItem层。
在本节中处理错误:
- 如果搜索失败,则需要关闭对话框并迭代到下一个联系人。
- 如果无法获取电子邮件信息,则需要关闭个人资料选项卡,然后迭代到下一个联系人。
- member1 = cc.wait_appear(locator.slack.listitem_member1, {'name':item['name']})
- if member1 != None:
- member1.click()
- else:
- print("failed to search the member")
- item['email'] = "ignore"
- item['postfix'] = ""
- ui(locator.slack.image).click()
- continue
- try:
- email = ui(locator.slack.text_email).get_text(timeout=5)
- item['email'] = email
- item['postfix'] = email.split('@')[1]
- except:
- print("failed to find the email")
- item['email'] = "ignore"
- item['postfix'] = ""
- if cc.is_existing(locator.slack.image):
- ui(locator.slack.image).click()
- continue
开源代码
我将代码放在我的github中,如果您需要查看完整代码,请参考
github
。
评论已关闭