1. 程式人生 > >開源利器分享:BitBar 坐看今天你的專案漲了多少 star

開源利器分享:BitBar 坐看今天你的專案漲了多少 star

今天開頭我想叨叨幾句,我個人最近的感受。在這個資訊爆炸,網際網路的時代裡。我的周遭總是充斥者著各種讓人能產生焦慮的資訊, 我不知道有沒有小夥伴和我一樣,看到各種神通廣大、遊戲人生的大俠,低頭看看自己當前的處境和生活,默默的嘆了口氣。 我很長一段時間都處於被資訊轟炸的焦慮中,感覺自己沒有什麼值得稱讚的成就,自己再努力也追趕不上。就像那種要做的事情太多,無從下手,索性就隨他去了, 但是什麼都不做導致要做的事情越來越多,從而會更加焦慮。這樣的狀態持續 2 個月,偶然的機會下我發現然了一個緩解這種壓力的辦法——讀書。 > 你的問題主要在於讀書不多而想得太多。——楊絳 技術的書籍有些啃不下去了,我就去看了《飛鳥集》好像真的平靜了一些。減少了獲取各種資訊的途徑,從書裡看看智者眼睛裡的世界。 > When we rejoice in our fullness, then we can part with our fruits with joy. > > 當我們從追求充實中找到快樂時,便能愉快地和以結果為目的分手了。——《飛鳥集》 專注的做自己眼下、手上的事情,投入寶貴的時間,讓時間把平凡的事情變得不平凡。我覺得快樂總來的很慢,但它永遠不會缺席。 ![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200710192347301-627265852.jpg) 作者:HelloGitHub-**滷蛋** ## 一、介紹 好了,以上就是我的心路歷程和一些笨拙的經驗。下面開始我們的正題吧: > 專案地址: > > https://github.com/matryer/bitbar 今天推薦一個 GitHub 上開源的 Mac OSX Menu Bar 工具:BitBar,它可以載入各種型別的指令碼輸出資訊。比如在 Menu Bar 上監控 GitHub 上的 Star 數量,展示的資訊完全取決於你寫的指令碼。 它有多香,容我慢慢道來。先看一張效果圖: ![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200710193223794-1424444834.png) ## 二、上手 1. 下載地址:https://github.com/matryer/bitbar/releases/tag/v1.9.2 2. 解壓 ![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200710193250321-962638923.png) 3. 下載 plugins:https://getbitbar.com/plugins/BitBar 4. 上面的外掛是展示 BitBar 版本,效果展示: ![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200710193306110-318838822.png) 這樣整個程式就跑起來了,如果非程式設計師的話可以直接在第 3 步的官網上選擇外掛。下面我將寫一個 Python 指令碼用於獲取 GitHub 的 star 數量,可以方便動態關注我的 HelloGitHub 專案 star 資訊和增長。 ## 三、編寫指令碼 因為我比較擅長 Python,所以我採用了 Python 指令碼進行開發,當然 BitBar 支援很多語言比如:Ruby、JS、Go、Swift 等等。 先不考慮如何展示到 Menu Bar 部分,先解決如何獲取 GitHub 上的專案 star。為了讓整個過程簡單不考慮環境,以下指令碼將採用 Python 的標準庫。 ### 3.1 申請 GitHub token 想要通過 GitHub 介面獲取資料必須要有一個 token,所以需要先在自己的 GitHub 上申請一個 token( https://github.com/settings/tokens/new ),什麼額外的許可權都不用勾選,然後點選最下面的 `Generate token`。 ![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200710193315818-1754726028.png) **然後把生成的 token 複製出來,儲存好後面要用到的!** ![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200710193324122-806762320.png) ### 3.2 GitHub API 獲取資料的方式採用 GitHub API,文件地址:https://developer.github.com/v3/ 。 - 獲取專案資訊的介面:https://api.github.com/repos/使用者名稱/專案名稱 - 獲取首頁的資訊流:https://api.github.com/users/使用者名稱/received_events 比如 HelloGitHub 專案: - https://api.github.com/repos/521xueweihan/HelloGitHub - https://api.github.com/users/521xueweihan/received_events 通過命令列先驗證下 token:`curl -H "Authorization: token 你申請的 token" 請求的介面` ``` curl -H "Authorization: token xxxx" https://api.github.com/repos/521xueweihan/HelloGitHub { "id": 580xxx, "node_id": "MDEwOlJlcG9xxxxxODAzOA==", "name": "HelloGitHub", "full_name": "521xueweihan/HelloGitHub", "private": false, ... "temp_clone_token": "", "allow_squash_merge": true, "allow_merge_commit": true, "allow_rebase_merge": true, "delete_branch_on_merge": false, "network_count": 4752, "subscribers_count": 2085 } ``` ### 3.3 開始編碼 上面介面和 token 都準備好了,下面就是編寫指令碼了。 ```python #!/usr/bin/env python3 # -*- coding:utf-8 -*- # # Author : XueWeiHan # E-mail : [email protected] # Date : 2020-07-10 15:18 # Desc : BitBar GitHub Python plugin import json import datetime from urllib import request REPO_NAME = "HelloGitHub" # 專案名 USER_NAME = "521xueweihan" # 使用者名稱 TOKEN = "xxx" # TOKEN def fetch_data(url): """ 請求、解析 GitHub API 函式 """ headers = { 'Accept': 'application/json, text/plain, */*', 'Authorization': 'token ' + TOKEN, } req = request.Request(url, headers=headers) # GET方法 response = request.urlopen(req).read() data = response.decode('utf-8') # 解析資料 info_dict = json.loads(data) return info_dict def get_star_count(): """ 獲取 star 總數 """ url = "https://api.github.com/repos/{}/{}".format(USER_NAME, REPO_NAME) repo_info_dict = fetch_data(url) star_count = repo_info_dict["stargazers_count"] return star_count def get_today_star(): """ 獲取今日 star 增長數 """ today_star_count = 0 page = 1 # 是否是今天事件的識別符號 is_today_event = True # 今日事件用來判斷事件事件 today = datetime.datetime.now().date() url = "https://api.github.com/users/{}/received_events".format(USER_NAME) url += "?page={}&per_page=200" while is_today_event: event_info_list = fetch_data(url.format(page)) for event_info in event_info_list: create_at_str = event_info["created_at"] create_at_obj = datetime.datetime.strptime( create_at_str, '%Y-%m-%dT%H:%M:%SZ') # 轉化成北京時間的日期 create_at_date_obj = (create_at_obj + datetime.timedelta(hours=8)).date() # 判斷是否是今天的事件 if create_at_date_obj < today: # 結束獲取 is_today_event = False break # 過濾指定專案的 star 事件 if event_info["type"] == "WatchEvent" \ and event_info.get("payload", {}).get("action") == "started" \ and event_info.get("repo", {}).get("name") == USER_NAME + "/" + REPO_NAME: today_star_count += 1 page += 1 return today_star_count if __name__ == '__main__': try: star_count = get_star_count() today_star_count = get_today_star() print("{} 今日增長: {}✨共計:{}k