在互联网2.0时代,工程师们主要依靠自己掌握的各种工具和软件来解决业务问题。随着开源浪潮席卷全球,开源工具和软件也在快速增长。工程师需要关注的技术和软件越来越多,学习负担越来越大,脑子越来越不够用。但是工程师们也很无奈,因为谁的技术和软件多,谁解决问题的效率就高。于是工程师开始使用互联网外脑工具:尤其是搜索引擎、书签、github、scihub等,工程师解决问题的能力体现在外脑工具的使用上。但是,随着工程师要解决的问题越来越多,以及自身知识的积累,外部的脑洞工具也逐渐变得臃肿:书签越来越多,github订阅越来越多,越来越多到最后就等于没了书签,没有订阅。为了解决这些问题,我们需要更智能、更灵活的外脑工具,让我们从信息的海洋中解放出来,让我们更专注于自己的业务。GitHub消息的问题你有没有注意到,你的Github消息如果几天不处理,收件箱就会堆积如山?相信有的同学收件箱里的数字比这个还要夸张,有的同学甚至绝望地放弃了收件箱的功能。为什么?因为大多数Coder都喜欢收藏自己心中喜欢的作品,而这三个按钮总是放在github项目首页右上角最显眼的位置:相信工程师们在使用时会毫不犹豫的点击一个按钮他们看到自己喜欢的项目三个连续的:watch、start、fork。悲剧也由此开始。1、工程师喜欢的项目越来越多;2、项目有自己的生命周期,有的活跃,有的逐渐消亡;3、工程师越来越忙,无暇顾及Inbox。然后,收件箱变成了这样:看着堆积如山的信息,是不是感觉要崩溃了。那么github的功能有什么问题呢?我认为watch、star和fork需要工程师给予错误的关注。当然现在github也在积极改进中。与之前相比,我们可以发现手表的选择更多了:但是这些就够了吗?看着收件箱里数以万计的邮件,是不是要将自己关心的一项一项改为忽略?工程师的心还是碎了!有没有办法保存工程师的收件箱?有!继续自己保存我的收件箱。解决方案是使用python作为GitHub消息助手,自动帮助工程师关闭和删除不需要的消息。这不是真正的手表吗?当你看它的时候,你就会收到它的信息,如果你不看它,它就会消失。那么仔细想想,哪些新闻对工程师来说是真正有用的呢?1、可以不关注很久没更新的项目吗?2.不再是工作范围和兴趣点的项目,可以不关注吗?3、长期没有人报道的项目,能不能不关注?python的一个优势就是可以很方便的实现用户操作的自动化嗯,看来这些僵尸项目用python自动化就可以一扫而空了动手吧,开始吧!代码实现我们知道Python有一个很棒的web自动化测试框架:Selenium,但是Selenium主要是用来做测试的,调用还是有点复杂。于是笔者在github上搜索,终于找到了合适的Python包:PyChrome项目地址:https://github.com/siversalih/pyChrome-Web-Automation下面就用这个非主流的自动化工具包吧,完成我们的小助手看看主页,这个作者很懒,几年前都没有更新过,还好帮助挺全的:https://pychrome.wordpress.com/usage/可以愉快的按照说明组装机器人了。0.环境准备首先需要准备Python3.8环境,然后按照网上的说明安装Selenium,然后将PyChrome项目clone到本地。ok,环境准备完成。1、模拟登录github使用PyChrome访问github时有一点麻烦,每次都会启动一个新的Chrome浏览器实例。这样就无法复用本地保存的cookie信息,所以每次都需要模拟登录。GitHub有一个特性,如果ip变化了,需要输入验证码,但是ip不变的话就不需要了,所以我们只能第一次手动输入一次。不过github的登录页面比较简单,只需要找到Username和password对应的表单组件即可。所以登录代码可以很简洁,如下:browser.open("https://github.com/login")#name="login"name_locator="//*[@name='login']"el_name=browser.findElementByXPath(name_locator)browser.sendTextToElement(username,el_name)#name="password"pass_locator="//*[@name='password']"el_pass=browser.findElementByXPath(pass_locator)browser.sendTextToElement(密码,el_pass)login_locator="//*[@name='commit']"el_login=browser.findElementByXPath(login_locator)browser.clickElement(el_login)2.模拟进入收件箱登录完成后,我们需要进入收件箱看看是什么有哪些未读消息。收件箱有点复杂,但很容易区分。找到正确的xpath后,相信定位不难。这里我还有一个技巧,我们其实是被有消息的项目所困扰,如果一个项目不发消息,我们就不会被骚扰。所以直接选择左下角的Repositories区域似乎更高效。代码如下:browser.open("https://github.com/notifications")#GetalistofRepositorieswithmessageslocator="js-notification-sidebar-repositories"el_repos=browser.findElementByClass(locator)repos_list=browser.findElementsByTag("li",el_repos)3.检查僵尸项目我选择第三种策略。将长期未上报的项目作为判断僵尸项目的标准(只是因为实施方便)。首先访问issue,然后判断issue中的issueUpdatedate,恰好有detaildate字段。下面代码的目的很简单,就是获取上一期更新了多久。browser.newTab("https://github.com/"+repos_name+"/pulls?q=")#判断最近的pullrequestlocator="//div[@aria-label='Issues']"el_pulls=browser.findElementByXPath(定位器)pull_list=browser.findElementsByTag("相对时间",el_pulls)timedelta=0iftype(pull_list)==listandlen(pull_list)>0:#2020-11-10T00:55:39Z#last_pull_time_str=pull_list[0]。getAttribute("datetime")last_pull_time_str=pull_list[0].get_attribute("datetime")last_time=datetime.strptime(last_pull_time_str,"%Y-%m-%dT%H:%M:%SZ")timedelta=(日期时间.now()-last_time).dayslogger.debug(repos_name+"timedelta:"+str(timedelta)+"days")4.取消关注僵尸项目。如果问题已经超过1年,您自然应该取消关注。毕竟现在信息更新太快了。#取消非活跃项的订阅(超过1年没有pullrequest)ifunsubscribeandtimedelta>366:el_notify_button=browser.findElementsByTag("notifications-list-subscription-form")browser.clickElement(el_notify_button)time.sleep(1)#data-target="notifications-list-subscription-form.menu"locator="//*[@data-target='notifications-list-subscription-form.menu']"el_notify_menus=browser.findElementByXPath(locator)#value="ignore"sub_locator="//*[@value='ignore']"el_ignore_button=browser.findElementByXPath(sub_locator,el_notify_menus)browser.clickElement(el_ignore_button)logger.debug(repos_name+"cancelsubscribed")5.最后删除僵尸项目消息,是时候摆脱烦恼了。工程师们自然不应该被这种不再更新的项目的消息所骚扰。el_repos_link=browser.findElementByTag("a",repos)browser.clickElement(el_repos_link)#mr-1js-notifications-mark-all-prompttime.sleep(1)el_sel_all=browser.findElementByClass("js-notifications-mark-all-提示”)browser.clickElement(el_sel_all)time.sleep(1)#title="Done"done_locator="//*[@title='Done']"el_done=browser.findElementByXPath(done_locator)browser.clickElement(el_done)logger.debug(repos_name+"removenotifiy")上面的代码是模拟Done按钮的操作:GitHub消息助手的所有逻辑到这里已经全部完成,整个收件箱终于安静下来。你能喝杯咖啡放松一下吗?PostscriptPython自动化工具确实给工程师带来了便利,使工程师能够应对各种日常挑战。为了方便各位工程师朋友早日解脱和兑现,以上代码已经开源,完整代码地址:https://gitee.com/knifecms/puppetry/blob/master/github-agent/resp_notify.py此外,在这个项目下,还有其他几个有趣的自动化助手和工具。如果你有兴趣,你也可以研究它们。希望能从您那里得到更多的好点子!
