自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用Python制作GitHub消息助手

開發(fā) 后端
github的訂閱越來越多,多到最后就約等于沒有書簽、沒有訂閱了。為了解決這些問題,我們需要更智能靈活的外腦工具,能讓我們從信息的海洋中解放出來,讓我們能更加專注自身業(yè)務(wù)。

 

在互聯(lián)網(wǎng)2.0時代,工程師解決業(yè)務(wù)問題主要依賴的是自己掌握的各種工具和軟件伴隨著席卷全球的開源浪潮,開源工具和軟件也迅猛增長。工程師需要關(guān)注的技術(shù)和軟件也隨之越來越多,學(xué)習(xí)負(fù)擔(dān)越來越大,大腦也越來越不夠用。但工程師們也很無奈,因為誰掌握的技術(shù)和軟件越多,誰就能更高效的解決問題。于是工程師們開始借助互聯(lián)網(wǎng)外腦工具:尤其是搜索引擎、書簽、github、scihub等 而工程師們解決問題的能力就體現(xiàn)在了對外腦工具的利用上。

但是,隨著工程師們要解決的問題增長以及自身知識的積累,外腦工具也逐漸變得臃腫:書簽越來越多,github的訂閱越來越多,多到最后就約等于沒有書簽、沒有訂閱了。為了解決這些問題,我們需要更智能靈活的外腦工具,能讓我們從信息的海洋中解放出來,讓我們能更加專注自身業(yè)務(wù)。

GitHub 消息的問題

有沒有發(fā)現(xiàn)你的 Github 消息 Inbox 過幾天不處理,就會堆積成山呢?相信有的同學(xué) Inbox 里的數(shù)字比這個還要夸張,甚至有的同學(xué)已經(jīng)絕望的放棄了 Inbox 這個功能。

為什么會這樣?

因為每個Coder內(nèi)心大多都會喜歡收藏喜愛的作品,而github的項目主頁右上角最醒目的位置總是擺著這三個按鈕:

相信工程師們看到喜愛的項目,就會毫不猶豫的一鍵三連:watch、start、fork。

悲劇也就從這里開始了。

1、工程師喜歡的項目越來越多;

2、項目會有自己的生命周期,有的變得活躍,有的逐漸消亡;

3、工程師越來越忙,無暇顧及Inbox。

然后,Inbox就變這樣了:

看著滿是堆積的消息,是不是有種崩潰的感覺。那github的功能到底出了什么問題?

我認(rèn)為是 watch、star、fork 需要工程師投入的關(guān)注程度搞錯了。當(dāng)然現(xiàn)在github也在積極改進(jìn),相比以前,我們可以發(fā)現(xiàn)有了更多的 watch 選項:

但是僅僅這些就夠了嗎?看著 Inbox 動輒上萬條的消息,難道要將自己關(guān)注的項目一個個的修改為 Ignore?

工程師的內(nèi)心依然是崩潰的!

有沒有辦法拯救工程師的Inbox?

有!來吧,自己動手拯救我的收件箱。

解決方案

用 python 做一個 GitHub 消息助手,自動幫工程師關(guān)閉和刪除不必要的消息。這不也就是真正意義上的Watch嗎?你看它的時候,會接收它的信息,你不看了它就消失了。那么仔細(xì)想想,到底哪些消息真正對工程師有用呢?

1、已經(jīng)很久沒更新的項目,是不是就可以不關(guān)注了?

2、已經(jīng)不是工作范圍和興趣點的項目,是不是也可以不關(guān)注了?

3、已經(jīng)很久都沒人反饋問題的項目,是不是也可以不關(guān)注了?

而python有一個優(yōu)勢就是可以很方便的實現(xiàn)用戶操作的自動化 嗯,看起來這些僵尸項目都可以用python自動化的方式清除掉 說干就干,讓我們開始吧!

代碼實現(xiàn)

我們知道Python有一款很棒的Web自動化測試框架:Selenium,但 Selenium 主要還是用于測試,調(diào)用還是略顯復(fù)雜。所以筆者在github上搜刮了一番,終于找到一款合適的Python包:PyChrome 項目地址:

https://github.com/siversalih/pyChrome-Web-Automation

下面我們就用這款非主流的自動化工具包,完成我們的小助手 看主頁,這個作者很懶,幾年前就沒有更新了,但幸好說明幫助還是挺全的:

https://pychrome.wordpress.com/usage/

所以我們就可以 happy 的按照說明書來組裝機器人了。

0.環(huán)境準(zhǔn)備

首先需要準(zhǔn)備Python 3.8環(huán)境,然后按照網(wǎng)上說明安裝 Selenium,接下來將PyChrome項目 clone到本地。ok,環(huán)境準(zhǔn)備完成。

1、模擬登錄github

使用PyChrome訪問github有個小麻煩,每次都會啟動一個全新的Chrome瀏覽器實例。這就導(dǎo)致無法重復(fù)利用保存在本地的cookie信息,所以每次要模擬登陸下。github有一個特點,如果ip變更,需要輸入驗證碼,如果ip不變則不需要,所以第一次我們只能先手工輸入一次。

不過github的登錄頁面相對簡單,只需要找到Username和password對應(yīng)的表單組件就可以了。所以登錄的代碼可以非常簡潔,如下所示: 

  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.模擬進(jìn)入Inbox

登錄完成后,我們需要進(jìn)入收件箱,查看到底有哪些未讀消息。收件箱有點小復(fù)雜,不過也還能很方便的區(qū)分。

找到了正確的xpath,相信定位也不是難事。這里我又取了個巧,我們被困擾的其實是有消息的項目,如果一個項目不發(fā)消息,我們其實也不會被騷擾到。所以直接選取左下角的 Repositories 區(qū)域似乎效率更高一些。

代碼如下: 

  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.檢查僵尸項目

我選用第三條策略,已經(jīng)很久沒人反饋問題的項目作為判斷僵尸項目的標(biāo)準(zhǔn)(純粹只是因為方便實現(xiàn)),首先訪問issue,然后判斷issue里的更新日期,恰好有一個詳細(xì)的日期字段。下面代碼目的很簡單,就是獲取最后一條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.取消關(guān)注僵尸項目

如果issue已經(jīng)超過了1年,自然就應(yīng)該取消關(guān)注了,畢竟目前信息更新的速度太快了。 

  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終于清靜了,是不是可以喝杯咖啡愜意一下了。

[[382330]]

后記

Python自動化工具的確是給工程師們帶來了便捷,使得工程師能應(yīng)對各種日常不同的挑戰(zhàn)。為方便各位工程師小伙伴們早日解脫、得償所愿,以上代碼已開源,完整的代碼地址:

https://gitee.com/knifecms/puppetry/blob/master/github-agent/resp_notify.py

另外,該項目下,還有幾個其他有意思的自動化助手和工具喲,大家感興趣的話也可以研究研究。

希望得到你的更多好點子! 

 

責(zé)任編輯:龐桂玉 來源: Python中文社區(qū) (ID:python-china)
相關(guān)推薦

2019-12-26 09:38:57

GitHub工具 wxpy

2023-11-09 11:31:43

GitHub開發(fā)

2023-02-06 10:19:18

語音消息應(yīng)用消息

2017-02-05 15:10:50

wordcloud

2017-02-05 14:10:30

wordcloud

2013-01-21 14:50:19

GitHub

2022-09-05 09:46:34

Python核酸檢測

2021-06-15 10:16:08

PythonNFT區(qū)塊鏈

2021-06-15 10:30:57

PythonNFT區(qū)塊鏈

2024-01-15 07:47:09

井字棋游戲編程練習(xí)Python

2021-03-24 10:01:54

GitHub代碼開發(fā)者

2024-07-11 15:26:23

2021-04-16 11:27:16

Python表情微信

2020-09-07 13:02:22

地球Python代碼

2024-02-29 10:05:23

AIGitHub編碼助手

2025-04-18 00:00:00

2023-09-21 10:01:10

GitHubAI 代碼助手

2023-05-22 08:30:35

GPT-4智能編程助手

2023-06-28 06:59:41

2015-08-05 17:44:39

快用
點贊
收藏

51CTO技術(shù)棧公眾號