• 售前

  • 售后

热门帖子
入门百科

如何用 Python 制作 GitHub 消息助手

[复制链接]
没有昵称513 显示全部楼层 发表于 2021-10-25 19:52:43 |阅读模式 打印 上一主题 下一主题
目录


  • GitHub 消息的问题
  • 办理方案
  • 代码实现

    • 0.环境准备
    • 1、模仿登录github
    • 2.模仿进入Inbox
    • 3.查抄僵尸项目
    • 4.取消关注僵尸项目
    • 5.删除僵尸项目消息

  • 跋文
在互联网2.0期间,工程师办理业务问题主要依赖的是本身掌握的各种工具和软件陪伴着席卷全球的开源浪潮,开源工具和软件也迅猛增长。工程师需要关注的技能和软件也随之越来越多,学习负担越来越大,大脑也越来越不敷用。但工程师们也很无奈,由于谁掌握的技能和软件越多,谁就能更高效的办理问题。于是工程师们开始借助互联网外脑工具:尤其是搜索引擎、书签、github、scihub等 而工程师们办理问题的本事就表现在了对外脑工具的使用上。
但是,随着工程师们要办理的问题增长以及自身知识的积累,外脑工具也渐渐变得臃肿:书签越来越多,github的订阅越来越多,多到末了就约即是没有书签、没有订阅了。为相识决这些问题,我们需要更智能机动的外脑工具,能让我们从信息的海洋中解放出来,让我们能更加专注自身业务。

GitHub 消息的问题


有没有发现你的 Github 消息 Inbox 过几天不处置惩罚,就会堆积成山呢?相信有的同学 Inbox 里的数字比这个还要浮夸,乃至有的同学已经绝望的放弃了 Inbox 这个功能。
为什么会如许?
由于每个Coder心田大多都会喜好收藏喜好的作品,而github的项目主页右上角最醒目标位置总是摆着这三个按钮:

相信工程师们看到喜好的项目,就会绝不夷由的一键三连:watch、start、fork。
悲剧也就从这里开始了。
1、工程师喜好的项目越来越多;
2、项目会有本身的生命周期,有的变得活泼,有的渐渐死亡;
3、工程师越来越忙,无暇顾及Inbox。
然后,Inbox就变如许了:

看着满是堆积的消息,是不是有种瓦解的感觉。那github的功能到底出了什么问题?
我认为是 watch、star、fork 需要工程师投入的关注程度搞错了。当然现在github也在积极改进,相比以前,我们可以发现有了更多的 watch 选项:

但是仅仅这些就够了吗?看着 Inbox 动辄上万条的消息,难道要将本身关注的项目一个个的修改为 Ignore?
工程师的心田依然是瓦解的!
有没有办法拯救工程师的Inbox?
有!来吧,本身动手拯救我的收件箱。

办理方案


用 python 做一个 GitHub 消息助手,主动帮工程师关闭和删除不须要的消息。这不也就是真正意义上的Watch吗?你看它的时候,会吸收它的信息,你不看了它就消失了。那么细致想想,到底哪些消息真正对工程师有效呢?
1、已经很久没更新的项目,是不是就可以不关注了?
2、已经不是工作范围和爱好点的项目,是不是也可以不关注了?
3、已经很久都没人反馈问题的项目,是不是也可以不关注了?
而python有一个优势就是可以很方便的实现用户操纵的主动化 嗯,看起来这些僵尸项目都可以用python主动化的方式清撤除 说干就干,让我们开始吧!

代码实现


我们知道Python有一款很棒的Web主动化测试框架:Selenium,但 Selenium 主要还是用于测试,调用还是略显复杂。以是笔者在github上搜索了一番,终于找到一款符合的Python包:PyChrome 项目地址:
https://github.com/siversalih/pyChrome-Web-Automation
下面我们就用这款非主流的主动化工具包,完成我们的小助手 看主页,这个作者很懒,几年前就没有更新了,但幸好阐明资助还是挺全的:
https://pychrome.wordpress.com/usage/
以是我们就可以 happy 的按照阐明书来组装机器人了。

0.环境准备


首先需要准备Python 3.8环境,然后按照网上阐明安装 Selenium,接下来将PyChrome项目 clone到本地。ok,环境准备完成。

1、模仿登录github


使用PyChrome访问github有个小贫困,每次都会启动一个全新的Chrome欣赏器实例。这就导致无法重复使用保存在本地的cookie信息,以是每次要模仿登岸下。github有一个特点,如果ip变动,需要输入验证码,如果ip稳定则不需要,以是第一次我们只能先手工输入一次。

不外github的登录页面相对简朴,只需要找到Username和password对应的表单组件就可以了。以是登录的代码可以非常轻便,如下所示:
  1. browser.open("https://github.com/login")
  2. # name="login"
  3. name_locator = "//*[@name='login']"
  4. el_name = browser.findElementByXPath(name_locator) 
  5. browser.sendTextToElement(username, el_name) 
  6. # name="password"
  7. pass_locator = "//*[@name='password']"
  8. el_pass = browser.findElementByXPath(pass_locator) 
  9. browser.sendTextToElement(password,el_pass) 
  10. login_locator = "//*[@name='commit']"
  11. el_login = browser.findElementByXPath(login_locator) 
  12. browser.clickElement(el_login)
复制代码
2.模仿进入Inbox


登录完成后,我们需要进入收件箱,检察到底有哪些未读消息。收件箱有点小复杂,不外也还能很方便的区分。

找到了精确的xpath,相信定位也不是难事。这里我又取了个巧,我们被困扰的实在是有消息的项目,如果一个项目不发消息,我们实在也不会被骚扰到。以是直接选取左下角的 Repositories 区域似乎服从更高一些。
代码如下:
  1. browser.open("https://github.com/notifications")
  2. # 获取有消息的Repositories列表
  3. locator = "js-notification-sidebar-repositories"
  4. el_repos = browser.findElementByClass(locator) 
  5. repos_list = browser.findElementsByTag("li", el_repos)
复制代码
3.查抄僵尸项目


我选用第三条策略,已经很久没人反馈问题的项目作为判定僵尸项目标尺度(纯粹只是由于方便实现),首先访问issue,然后判定issue里的更新日期,恰好有一个详细的日期字段。下面代码目标很简朴,就是获取末了一条issue更新了多久。
  1.     browser.newTab("https://github.com/" + repos_name + "/pulls?q=")
  2.     # 判断最近的 pull request
  3.     locator = "//div[@aria-label='Issues']"
  4.     el_pulls = browser.findElementByXPath(locator) 
  5.     pull_list = browser.findElementsByTag("relative-time", el_pulls)
  6.     timedelta = 0
  7.     if type(pull_list)==list and len(pull_list)>0:
  8.         # 2020-11-10T00:55:39Z
  9.         # last_pull_time_str = pull_list[0].getAttribute("datetime")
  10.         last_pull_time_str = pull_list[0].get_attribute("datetime")
  11.         last_time = datetime.strptime(last_pull_time_str, "%Y-%m-%dT%H:%M:%SZ")
  12.         timedelta = (datetime.now() - last_time).days 
  13.     logger.debug(repos_name + " timedelta: " + str(timedelta) + " days")
复制代码
4.取消关注僵尸项目


如果issue已经超过了1年,天然就应该取消关注了,毕竟现在信息更新的速度太快了。
  1. # 取消不活跃项目的订阅(1年以上没有pull request)
  2. if unsubscribe and timedelta > 366:
  3.     el_notify_button =browser.findElementsByTag("notifications-list-subscription-form")
  4.     browser.clickElement(el_notify_button) 
  5.     time.sleep(1)
  6.     # data-target="notifications-list-subscription-form.menu"
  7.     locator = "//*[@data-target='notifications-list-subscription-form.menu']"
  8.     el_notify_menus = browser.findElementByXPath(locator) 
  9.     # value="ignore"
  10.     sub_locator = "//*[@value='ignore']"
  11.     el_ignore_button =browser.findElementByXPath(sub_locator, el_notify_menus) 
  12.     browser.clickElement(el_ignore_button) 
  13.     logger.debug(repos_name + " cancel subscribed")
复制代码
5.删除僵尸项目消息


末了,该是排除困扰的时候了,这种不再更新的项目,工程师天然也不要再被它的消息骚扰。
  1.     el_repos_link = browser.findElementByTag("a", repos)
  2.     browser.clickElement(el_repos_link) 
  3.     # mr-1 js-notifications-mark-all-prompt
  4.     time.sleep(1)
  5.     el_sel_all =browser.findElementByClass("js-notifications-mark-all-prompt")
  6.     browser.clickElement(el_sel_all) 
  7.     time.sleep(1)
  8.     # title="Done"
  9.     done_locator = "//*[@title='Done']"
  10.     el_done = browser.findElementByXPath(done_locator) 
  11.     browser.clickElement(el_done) 
  12.     logger.debug(repos_name + " remove notifiy")
复制代码
以上代码就是模仿 Done 按钮的操纵:

到这里就完成了GitHub消息助手的全部逻辑,整个Inbox终于寂静了,是不是可以喝杯咖啡舒服一下了。


跋文


Python主动化工具的确是给工程师们带来了便捷,使得工程师能应对各种一样寻常不同的挑衅。为方便各位工程师小同伴们早日摆脱、得偿所愿,以上代码已开源,完整的代码地址:
https://gitee.com/knifecms/puppetry/blob/master/github-agent/resp_notify.py
别的,该项目下,还有几个其他故意思的主动化助手和工具哟,各人感爱好的话也可以研究研究。
盼望得到你的更多好点子!
以上就是如何用 Python 制作 GitHub 消息助手的详细内容,更多关于Python 制作 GitHub 消息助手的资料请关注脚本之家别的相关文章!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作