Matrix 首页推荐 

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。 
文章代表作者个人观点,少数派仅对标题和排版略作修改。


在软件公司开始实习三周有余,公司内部使用「禅道」进行项目管理。每天需要时不时上去看看组长有没有派发新任务,所以经常需要手动刷新网页查看。如下图所示,橙色矩形框框选的区域就是工作总计。但是作为一个自动化玩家,每天手动刷新几十次网页去查看工作任务,这对我来说是不可接受的。所以就开始考虑是否可以使用自动化脚本,实现定时通知任务状态的功能?于是就有了这篇文章。

定位数据源

打开 Google Chrome 的开发者工具,切换到「网络」菜单,刷新网页。然后按下 command + F 搜索关键词:我的任务。可以看到在左侧只有一个匹配结果,再看一下中间的 URL 请求地址列表,不难猜出上图中的每一个块内容,都是单独发了一个请求,然后获取数据渲染出来的。这种情况下反而还减少了工作量,因为这个请求返回的代码量只有 63 行,非常好处理的数据。

将 block-printBlock-458-my.html 的链接复制出来,单独访问,可以看到如下的页面。

确认请求参数

切换到「网络」菜单,右键点击 block-printBlock-458-my.html 链接,点击「以 cURL 格式复制」将对应的请求复制。此处可以粘贴到 Sublime Text 等文本编辑器中,去除无用的参数。最后经过测试只需要保留 Authorization、Referer 和 cookies 三个参数,即可成功发起请求,获取任务信息。

如果会使用 Postman 这样的 API 调试工具,也可以直接将 curl 请求导入 Postman。使用它去调试接口,来确定最终需要保留那些参数。如下图所示,是使用 Postman 调试接口的图例。

编写代码

API 接口有了,就可以开始编写代码,获取工作统计信息了。不过在此之前,可以使用 htmlq 简单看一下,输出的结果是否符合预期。此处使用了 httpie 发了一个 GET 请求,带上了三个必要的参数:Authorization、Referer 和 cookies,cookies 里只需要保留个人的 zentaosid 即可。然后将返回的数据通过管道符传送给 htmlq,将 .tile-amount.tile-title 的文字提取出来。可以看到需要的数据已经被正确提取出来了,说明思路是正确的。

编写 Python 代码,只需要 20 行即可实现功能。使用 requests 向接口发送请求,使用 BeautifulSoup 解析网页,提取 .tile-amount.tile-title 两类元素。最后使用 for 循环,设置 step 为 2,构造通知的消息文本数据。那么如何使用 Python 发送系统通知呢?通过 Python post osx notification 这个回答可以知道,在 macOS 上最简单的方法就是通过 AppleScript 直接调用 Displaying Notifications API 实现发送通知。

import os
import requests
from bs4 import BeautifulSoup

resp = requests.get("http://XXXXXXXX/zentao/block-printBlock-458-my.html",
    headers={
        "Authorization": "Basic 这是 Basic 认证密码",
        "Referer": "http://XXXXXXXX/zentao/my.html"
    },
    cookies={"zentaosid": "这是个人 zentaosid"}
)

soup = BeautifulSoup(resp.text, 'lxml')
data = soup.select('.tile-amount, .tile-title')

notificationText = ""
for i in range(0, len(data), 2):
    notificationText += f"{data[i].text[2:]}:{data[i+1].text}\n"

os.system("""osascript -e 'display notification "{}" with title "{}"'""".format(notificationText, "禅道看板"))

定时推送

编写好 Python 脚本后运行即可成功收到推送通知,但是如何让脚本能够自动推送通知?而不是手动运行?该功能可以通过 macOS 自带的 crontab 功能实现。在 Wikipedia 上,关于 crontab 的定义如下:

工具型软件cron是一款类Unix的操作系统下的基于时间的任务管理系统。用户们可以通过cron在固定时间、日期、间隔下,运行定期任务。cron常用于运维和管理,但也可用于其他地方,如:定期下载文件和邮件。cron该词来源于希腊语chronos,原意是时间。

根据 crontab 的语法,不难写出这样的一条配置信息:

*/10 9-18 * * 1-5 /usr/local/bin/python3 ~/Code/zenDashboard.py

它表示从周一到周五,从早上 9 点到晚上 18 点,每隔 10 分钟运行一次 zenDashboard.py 脚本。如果对自己写出来的配置正确性有疑问,也可以使用一些现成的网站,例如 crontab.guru 来验证配置的正确性。输入配置之后,如下图所示它就会解析该配置,并解释它的功能是:

“At every 10th minute past every hour from 9 through 18 on every day-of-week from Monday through Friday.”

配置信息写好了,那么在哪里写入配置呢?打开终端,输入 corntab -e 在 vim 模式下粘贴 crontab 配置信息,注意路径要改成本机电脑上相应的 Python 脚本路径,保存之后使用 crontab -l 来查看是否保存成功。如果配置信息保存成功,就会输出刚才配置好的 crontab 配置。最后输入 crontab /etc/crontab 让 crontab 立即生效即可。

效果演示

单条通知
通知列表

总结

本文从如何抓包分析接口入手,再到编写 Python 脚本解析 HTML 内容,最后使用 crontab 实现定时执行脚本,推送工作状态通知的功能。思路基本都一样,如果读者的公司也有类似的平台和需求,也可以按图索骥实现自己的需求。

关联阅读:

> 下载 少数派 2.0 客户端 、关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀