<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Python制作GitHub消息助手

          共 5347字,需瀏覽 11分鐘

           ·

          2021-02-22 09:00

          ↑↑↑關(guān)注后"星標(biāo)"簡說Python
          人人都可以簡單入門Python、爬蟲、數(shù)據(jù)分析
          ?簡說Python推薦?
          來源/Python中文社區(qū)
          作者/邵可佳,目前任職墨跡天氣算法專家崗位

          在互聯(lián)網(wǎng)2.0時代,工程師解決業(yè)務(wù)問題主要依賴的是自己掌握的各種工具和軟件伴隨著席卷全球的開源浪潮,開源工具和軟件也迅猛增長。工程師需要關(guān)注的技術(shù)和軟件也隨之越來越多,學(xué)習(xí)負(fù)擔(dān)越來越大,大腦也越來越不夠用。但工程師們也很無奈,因?yàn)檎l掌握的技術(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 這個功能。
          為什么會這樣?
          因?yàn)槊總€Coder內(nèi)心大多都會喜歡收藏喜愛的作品,而github的項(xiàng)目主頁右上角最醒目的位置總是擺著這三個按鈕:

          相信工程師們看到喜愛的項(xiàng)目,就會毫不猶豫的一鍵三連:watch、start、fork。
          悲劇也就從這里開始了。
          1、工程師喜歡的項(xiàng)目越來越多;
          2、項(xiàng)目會有自己的生命周期,有的變得活躍,有的逐漸消亡;
          3、工程師越來越忙,無暇顧及Inbox。
          然后,Inbox就變這樣了:

          看著滿是堆積的消息,是不是有種崩潰的感覺。那github的功能到底出了什么問題?
          我認(rèn)為是 watch、star、fork 需要工程師投入的關(guān)注程度搞錯了。當(dāng)然現(xiàn)在github也在積極改進(jìn),相比以前,我們可以發(fā)現(xiàn)有了更多的 watch 選項(xiàng):

          但是僅僅這些就夠了嗎?看著 Inbox 動輒上萬條的消息,難道要將自己關(guān)注的項(xiàng)目一個個的修改為 Ignore?
          工程師的內(nèi)心依然是崩潰的!
          有沒有辦法拯救工程師的Inbox?
          有!來吧,自己動手拯救我的收件箱。
          解決方案
          用 python 做一個 GitHub 消息助手,自動幫工程師關(guān)閉和刪除不必要的消息。這不也就是真正意義上的Watch嗎?你看它的時候,會接收它的信息,你不看了它就消失了。那么仔細(xì)想想,到底哪些消息真正對工程師有用呢?
          1、已經(jīng)很久沒更新的項(xiàng)目,是不是就可以不關(guān)注了?
          2、已經(jīng)不是工作范圍和興趣點(diǎn)的項(xiàng)目,是不是也可以不關(guān)注了?
          3、已經(jīng)很久都沒人反饋問題的項(xiàng)目,是不是也可以不關(guān)注了?
          而python有一個優(yōu)勢就是可以很方便的實(shí)現(xiàn)用戶操作的自動化 嗯,看起來這些僵尸項(xiàng)目都可以用python自動化的方式清除掉 說干就干,讓我們開始吧!
          代碼實(shí)現(xiàn)
          我們知道Python有一款很棒的Web自動化測試框架:Selenium,但 Selenium 主要還是用于測試,調(diào)用還是略顯復(fù)雜。所以筆者在github上搜刮了一番,終于找到一款合適的Python包:PyChrome 項(xiàng)目地址:
          https://github.com/siversalih/pyChrome-Web-Automation
          下面我們就用這款非主流的自動化工具包,完成我們的小助手 看主頁,這個作者很懶,幾年前就沒有更新了,但幸好說明幫助還是挺全的:
          https://pychrome.wordpress.com/usage/
          所以我們就可以 happy 的按照說明書來組裝機(jī)器人了。
          0.環(huán)境準(zhǔn)備
          首先需要準(zhǔn)備Python 3.8環(huán)境,然后按照網(wǎng)上說明安裝 Selenium,接下來將PyChrome項(xiàng)目 clone到本地。ok,環(huán)境準(zhǔn)備完成。
          1、模擬登錄github
          使用PyChrome訪問github有個小麻煩,每次都會啟動一個全新的Chrome瀏覽器實(shí)例。這就導(dǎo)致無法重復(fù)利用保存在本地的cookie信息,所以每次要模擬登陸下。github有一個特點(diǎn),如果ip變更,需要輸入驗(yàn)證碼,如果ip不變則不需要,所以第一次我們只能先手工輸入一次。

          不過github的登錄頁面相對簡單,只需要找到Username和password對應(yīng)的表單組件就可以了。所以登錄的代碼可以非常簡潔,如下所示:
          browser.open("https://github.com/login")
          #?name="login"
          name_locator?=?"http://*[@name='login']"
          el_name?=?browser.findElementByXPath(name_locator)?
          browser.sendTextToElement(username,?el_name)?
          #?name="password"
          pass_locator?=?"http://*[@name='password']"
          el_pass?=?browser.findElementByXPath(pass_locator)?
          browser.sendTextToElement(password,el_pass)?
          login_locator?=?"http://*[@name='commit']"
          el_login?=?browser.findElementByXPath(login_locator)?
          browser.clickElement(el_login)
          2.模擬進(jìn)入Inbox
          登錄完成后,我們需要進(jìn)入收件箱,查看到底有哪些未讀消息。收件箱有點(diǎn)小復(fù)雜,不過也還能很方便的區(qū)分。

          找到了正確的xpath,相信定位也不是難事。這里我又取了個巧,我們被困擾的其實(shí)是有消息的項(xiàng)目,如果一個項(xiàng)目不發(fā)消息,我們其實(shí)也不會被騷擾到。所以直接選取左下角的 Repositories 區(qū)域似乎效率更高一些。
          代碼如下:
          browser.open("https://github.com/notifications")
          #?獲取有消息的Repositories列表
          locator?=?"js-notification-sidebar-repositories"
          el_repos?=?browser.findElementByClass(locator)?
          repos_list?=?browser.findElementsByTag("li",?el_repos)
          3.檢查僵尸項(xiàng)目
          我選用第三條策略,已經(jīng)很久沒人反饋問題的項(xiàng)目作為判斷僵尸項(xiàng)目的標(biāo)準(zhǔn)(純粹只是因?yàn)榉奖銓?shí)現(xiàn)),首先訪問issue,然后判斷issue里的更新日期,恰好有一個詳細(xì)的日期字段。下面代碼目的很簡單,就是獲取最后一條issue更新了多久。
          ????browser.newTab("https://github.com/"?+?repos_name?+?"/pulls?q=")
          ????#?判斷最近的?pull?request
          ????locator?=?"http://div[@aria-label='Issues']"
          ????el_pulls?=?browser.findElementByXPath(locator)?
          ????pull_list?=?browser.findElementsByTag("relative-time",?el_pulls)
          ????timedelta?=?0
          ????if?type(pull_list)==list?and?len(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?=?(datetime.now()?-?last_time).days?
          ????logger.debug(repos_name?+?"?timedelta:?"?+?str(timedelta)?+?"?days")
          4.取消關(guān)注僵尸項(xiàng)目
          如果issue已經(jīng)超過了1年,自然就應(yīng)該取消關(guān)注了,畢竟目前信息更新的速度太快了。
          #?取消不活躍項(xiàng)目的訂閱(1年以上沒有pull?request)
          if?unsubscribe?and?timedelta?>?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?=?"http://*[@data-target='notifications-list-subscription-form.menu']"
          ????el_notify_menus?=?browser.findElementByXPath(locator)?
          ????#?value="ignore"
          ????sub_locator?=?"http://*[@value='ignore']"
          ????el_ignore_button?=browser.findElementByXPath(sub_locator,?el_notify_menus)?
          ????browser.clickElement(el_ignore_button)?
          ????logger.debug(repos_name?+?"?cancel?subscribed")
          5.刪除僵尸項(xiàng)目消息
          最后,該是解除困擾的時候了,這種不再更新的項(xiàng)目,工程師自然也不要再被它的消息騷擾。
          ????el_repos_link?=?browser.findElementByTag("a",?repos)
          ????browser.clickElement(el_repos_link)?
          ????#?mr-1?js-notifications-mark-all-prompt
          ????time.sleep(1)
          ????el_sel_all?=browser.findElementByClass("js-notifications-mark-all-prompt")
          ????browser.clickElement(el_sel_all)?
          ????time.sleep(1)
          ????#?title="Done"
          ????done_locator?=?"http://*[@title='Done']"
          ????el_done?=?browser.findElementByXPath(done_locator)?
          ????browser.clickElement(el_done)?
          ????logger.debug(repos_name?+?"?remove?notifiy")
          以上代碼就是模擬 Done 按鈕的操作:

          到這里就完成了GitHub消息助手的全部邏輯,整個Inbox終于清靜了,是不是可以喝杯咖啡愜意一下了。

          后記
          Python自動化工具的確是給工程師們帶來了便捷,使得工程師能應(yīng)對各種日常不同的挑戰(zhàn)。為方便各位工程師小伙伴們早日解脫、得償所愿,以上代碼已開源,完整的代碼地址:
          https://gitee.com/knifecms/puppetry/blob/master/github-agent/resp_notify.py
          另外,該項(xiàng)目下,還有幾個其他有意思的自動化助手和工具喲,大家感興趣的話也可以研究研究。
          希望得到你的更多好點(diǎn)子!

          掃碼回復(fù):2021

          獲取最新學(xué)習(xí)資源

          【書籍推薦】
          《Python網(wǎng)絡(luò)編程從入門到精通》編寫秉承讓更多的 Python 愛好者能看懂的原則,以讓讀者以較少的時間、較低的成本,快速掌握 Python 網(wǎng)絡(luò)編程為目標(biāo)。每個步驟都很詳盡,讀者可按步驟操作,還配有相應(yīng)代碼,方便讀者實(shí)現(xiàn)網(wǎng)絡(luò)編程的開發(fā)。



          點(diǎn)擊公眾號卡片關(guān)注,一起學(xué)Python

          學(xué)習(xí)更多:
          整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說不知道該從哪開始,實(shí)戰(zhàn)哪里找了

          看完“點(diǎn)贊”的美德不能丟?

          瀏覽 61
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美日韩在线电影 | 夜夜爽久久精品91 | 美女被艹视频网站 | jiZZjiZZ丰满熟妇 | 无码_免费在线视频网站入口_第1页 |