Airtest之window应用程序钉钉聊天信息获取

  本来是要写 Airtest用例 批量执行生成聚合报告的文章,但是,这周工作中临时插进来一个需求,就是获取钉钉聊天记录,所以就记录一下。一开始接到这个需求,也是一团乱麻,钉钉已经没有网页版了,也没法爬虫,客户端又不是采用 HTTPS 通信协议,如何抓取聊天记录呢?一开始建议走API,但是这个要钉钉授权,而且还有费用,前期暂时没这个打算,想来想去,决定采用 Airtest 做自动化抓取。至于为什么要抓取聊天记录,主要是提取客户的关键问题,通过大模型自动生成对应的解决方案。

  由于时间紧迫,先直接写脚本,再验证。首先,先还原了一下操作过程,登录钉钉->选择工作组->然后搜索聊天群(这里有很多,后面要做参数化)->选择聊天群->进入对话框页面->点击聊天信息框(将焦点聚焦到聊天信息页面,默认是在输入框)->Ctrl+A,全选->Ctrl+C,复制->打开记事本(后来改成了excel)->Ctrl+v,粘贴内容->保存->关闭记事本(记事本)。这个过程是真实的场景,这里忽略了登录,因为用的业务的账号,看着简单,但里面踩了很多坑。

  输入框问题

  要搜索不同的聊天群,离不开搜索框,一开始打开引用程序,特征比较明显,有明显的提示文字,这个时候借助 Airtest 图片识别可以定位到该输入框,然后输入文字;但是,下次搜索其他的聊天群,这个提示的文本就没了,被上次的聊天群名字取代,所以这种方式行不通,怎么办?最后截取输入框与周边的背景结合的位置,使之不包含文本信息,同时,输入框的区域占多数,如下图:在点击输入框之后,先判断是否有上次输入的信息,如果有,删除,没有就输入。
在这里插入图片描述

  聊天信息区问题

  这里的问题也不少,首先,在打开聊天群之后,默认焦点是在发送信息输入框,如果要复制聊天信息,焦点要移动到历史信息区,但是聊天信息区又没有明显的特征,只有一个滚动条,通过观察发现,每次进来,滚动条都在最底部,所以截取含有这个滚动条的图片作为操作识别,同时加了判断条件,判断是否有这个滚动条,因为聊天信息少的群,根本没有第二页信息,所以就没有滚动条。其次,在将聊天信息复制出来之后,发现有缺失,主要发生在聊天内容比较多的情况下,通过对比发现,复制出来的内容有3屏,在往前就没有;后来尝试,把滚动条拖动顶部在复制粘贴,果然能拿到全部内容。最后,如果判断滑动到顶部,因为,这个区域只有滚动条,如果不能与底部获取焦点的滚动条相区分,是不会滚动的,通过观察发现,滚动条与顶部的设置按钮很近,所以将它们截取为一个有特征的图片,才解决了这个问题。如下图:
在这里插入图片描述
在这里插入图片描述
  处理了上述问题之后,后面可以借助subprocess、pyautogui 这两个模块,进入操作window 记事本(excel)打开、写入、关闭等操作。经过调试,确实可以抓取了不同群的聊天信息,放到 excel 都是原始数据,后面可以根据需要再行处理。下面给出了本次调试的代码,如果大家有更好的方法,也可交流,不胜感谢。

  注意:有些地方加了等待时间,因为有些地方执行太快,会出错;还有就是,在执行的过程中,尽量不要动电脑,因为焦点丢了,会引起一系列问题。

# -*- encoding=utf8 -*-
__author__ = "wchao"

from airtest.core.api import *
from airtest.core.win.win import *
from openpyxl import load_workbook

import pyautogui

import subprocess
auto_setup(__file__)

connect_device("windows:///?title_re=钉钉")

def info(name):
    
    sleep(1)
    touch(Template(r"tpl1700487575373.png", record_pos=(0.105, -0.291), resolution=(1280, 800)))

    clear_search = exists(Template(r"close.png"))
    if clear_search:
        touch(Template(r"close.png"))
    
    sleep(1)
    touch(Template(r"group.png"))
    sleep(1)
    text(name)
    key_press("ENTER")
    sleep(1)
    touch(Template(r"service.png"))
    sleep(2)

    is_side = exists(Template(r"tpl1700546391906.png", record_pos=(0.478, 0.101), resolution=(1920, 1020)))
    if is_side:
        touch(Template(r"tpl1700546391906.png", record_pos=(0.478, 0.101), resolution=(1920, 1020)))
        sleep(1)
        is_top = exists(Template(r"tpl1700544723179.png", threshold=0.95, target_pos=6, record_pos=(0.489, -0.21), resolution=(1920, 1020)))

        while(not is_top):
            for i in range(10):
                keyevent("{PGUP}")
            sleep(2)
            is_top = exists(Template(r"tpl1700544723179.png", threshold=0.95, target_pos=6, record_pos=(0.489, -0.21), resolution=(1920, 1020)))
    else:
        touch(Template(r"tpl1700547594994.png", record_pos=(0.472, -0.186), resolution=(1920, 1020)))

    sleep(1)
    keyevent("^a")
    sleep(1)
    keyevent("^c")
    #subprocess.Popen(["D:\\Location\\Notepad\\Notepad++\\notepad++.exe"])
    subprocess.Popen(["C:\\Program Files\\Microsoft Office\\root\\Office16\\EXCEL.EXE"])
    sleep(4)
    keyevent("{ENTER}")
    sleep(2)
    
    keyevent("^v")

    sleep(2)
    pyautogui.hotkey("ctrl","s")
    sleep(2)
    pyautogui.typewrite(name)
    sleep(2)
    pyautogui.hotkey("enter")
    sleep(2)
    pyautogui.hotkey("alt","f4")

wb = load_workbook(open("C:\\Users\\xxx\\Desktop\\name.xlsx",mode='rb'))
sheets = wb.worksheets
sheet = sheets[0]
rows = sheet.max_row 

touch(Template(r"xxx.jpg"))

for i in range(2,rows+1):
    name = sheet[i][0].value
    info(name)
    sleep(3)
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值