Sack Automation示例-从一个渠道中抓取联系人列表

背景
最近,我要监视某些Slack频道的联系信息,但是我没有API可以调用。因此,我需要使用UI自动化来完成此任务。
我最近找到了这个图书馆
clicknium
,除了支持Selenium之类的Web自动化外,它还支持桌面自动化,这对我很有用。
您可以跟随此Visual Studio代码扩展到设置环境的入门,对我来说不到2分钟。
Slack客户端自动化 - 刮擦联系人列表

自动选择组和频道。

根据组名称,自动单击左导航栏:

我用
Clicknium录音机
要在Slack上记录UI元素,并使用参数{{group}}进行更新为参数定位器,请参考
Clicknium文档

我将窗口的标题设置为" Slack*",因为ClickNium支持Wild Char匹配,它可以改善自动化稳定性。
然后我将tabitem名称添加到参数"组"中,然后我可以在运行阶段中分配组。

选择 | 换行 | 行号
  1. from clicknium import clicknium as cc, locator, ui
  2.  
  3. ui(locator.slack.tabitem_group, {'group':group}).click()

以与自动点击频道相似的方式。

选择 | 换行 | 行号
  1. if not cc.is_existing(locator.slack.treeitem_channel, params):
  2.         ui(locator.slack.treeitem_parent).click()
  3.     ui(locator.slack.treeitem_channel, params).click()

由于有时会折叠频道列表,因此我检查目标频道是否存在是否存在,如果不存在,则需要单击频道以首先超越频道列表。

通过获取右上角的信息文本获取联系人计数,然后解析文本。

选择 | 换行 | 行号
  1. text = ui(locator.slack.text_all, params).get_text()
  2. index = text.find("members")
  3. count = int("".join(re.findall("\d+",text[0:index])))

通过单击右上角的信息来显示"联系人列表"对话框。

当联系人列表被动态加载时,因此我们刮擦了几乎10个项目,需要在滚动栏下页上加载新的联系人

选择 | 换行 | 行号
  1. for i in range(1,13):
  2.     dict = {"index":i}
  3.     if not cc.is_existing(locator.slack.listitem_member, dict):
  4.         continue
  5.     elem_member = ui(locator.slack.listitem_member, dict)
  6.     name = elem_member.get_text()
  7.     if NotContains(names, name):
  8.         names.append({'name':name,'email':'', 'postfix':''})
  9.         step += 1
  10.         if step % 100 == 0:
  11.             SaveToFile(names)
  12.  
  13. ## move mouse down to trigger new data loaded for member list
  14. ui(locator.slack.edit_membername).click(by='mouse-emulation')
  15. for i in range(10):
  16.     cc.send_hotkey("{DOWN}")

我单击查找成员编辑框,然后将热键"向下"发送十次,它将触发加载新的联系人。
要删除每个成员名称,我使用以下参数定位器:

Slack客户端自动化 - 刮擦联系人细节
在上面的部分中,我显示了如何从频道刮擦联系人列表,在本节中,我将展示如何刮擦每个联系人详细信息,例如电子邮件地址。 (如果频道不显示电子邮件地址,则可以跳过本节)。

与上面的自动选择组和频道的部分相同。

通过单击右上角的信息来显示"联系人列表"对话框。

输入联系人名称以搜索联系人

选择 | 换行 | 行号
  1. ui(locator.slack.text_all, params).click()
  2. ui(locator.slack.edit_membername).set_text(item['name'], "set-text")

如果匹配,请单击以显示联系人的配置文件,然后获取电子邮件的文字

要单击搜索结果,我使用以下定位器,
设置名称"名称"和Uncheck ListItem层。

在本节中处理错误:

- 如果搜索失败,则需要关闭对话框并迭代到下一个联系人。
- 如果无法获取电子邮件信息,则需要关闭个人资料选项卡,然后迭代到下一个联系人。

选择 | 换行 | 行号
  1. member1 = cc.wait_appear(locator.slack.listitem_member1, {'name':item['name']})
  2. if member1 != None:
  3.     member1.click()
  4. else:
  5.     print("failed to search the member")
  6.     item['email'] = "ignore"
  7.     item['postfix'] = ""
  8.     ui(locator.slack.image).click()
  9.     continue
  10.  
  11. try:
  12.     email = ui(locator.slack.text_email).get_text(timeout=5)
  13.     item['email'] = email
  14.     item['postfix'] = email.split('@')[1]
  15. except:
  16.     print("failed to find the email")
  17.     item['email'] = "ignore"
  18.     item['postfix'] = ""
  19.     if cc.is_existing(locator.slack.image):
  20.         ui(locator.slack.image).click()
  21.         continue

开源代码
我将代码放在我的github中,如果您需要查看完整代码,请参考
github

标签: python

评论已关闭