Matrix 精選

Matrix 是少數派的寫作社區,我們主張分享真實的產品體驗,有實用價值的經驗與思考。我們會不定期挑選 Matrix 最優質的文章,展示來自用戶的最真實的體驗和觀點。

文章代表作者個人觀點,少數派僅對標題和排版略作修改。

如果你瀏覽過一些 GitHub 的開源項目,你一定見過很多 README 文檔中都會出現的五顏六色、各式各樣的「小牌子」。

經常出現在 GitHub 項目裏面的小牌子

最初,這些「小牌子」的主要作用是爲了顯示「某個 GitHub 項目」的「某種狀態」,比如項目的編譯是否成功、文檔是否更新至最新、軟件的下載數量有多少……不過,從原理的角度來說,這些「小牌子」都是通過我們給「牌子渲染服務器」提供一些數據後,服務器返回給我們一個 SVG 格式的圖片來工作的。我們將返回的 SVG 圖片嵌入到 GitHub 的 README 文檔或其他網頁裏面,就完成了一個「小牌子」的製作。

因此,我們不僅可以將這些「小牌子」用在 GitHub 裏,如果你擁有自己的「個人主頁」、「博客」或其他展示個人資料的地方,只要你可以控制網頁的 HTML,能自己向其中插入一些自定義代碼,你就可以藉助於「小牌子服務器」來自制一些好看又能實時更新的「個人資料展示牌」、「訂閱地址標識牌」等等。

我自己博客最下方定製的「小牌子」

Shields.io 的基本用法

簡單定製靜態小牌子

Shields.io 就是一個我們開頭提到的「牌子渲染服務」。事實上,GitHub 上面大部分「小牌子」都是用 Shields.io 來渲染的。我們可以藉助於 Shields.io 服務定製一些個性化的「小牌子」。一個最簡單的例子就是: https://img.shields.io/badge/少數派-SpencerWoo-da282a ,這一請求可以渲染得到如下效果的小牌子。

少數派-SpencerWoo-da282a

可以發現,簡單定製小牌子非常方便,最最基礎的語法規則就是:

https://img.shields.io/badge/{左半部分標籤}-{右半部分標籤}-{右半部分顏色}

另外,在 Shields.io 的官網 上面有非常方便的「小牌子生成器」,我們可以直接用它來構造一個「小牌子」,只需要按照下圖的樣子:填入左半邊標籤、填入右半邊標籤,再定義右半邊的顏色,點擊 Make Badge 即可生成。其中,右半邊的顏色我們可以用官方提供的幾種預設顏色名稱(下方 Colors)或者我們自己提供十六進制顏色代碼都可以。

Shields.io 的靜態小牌子生成器

我們按照上面的方法構造一個鏈接,就製作完成我們的小牌子啦!這樣得到的鏈接是一個 SVG 圖片鏈接,我們可以直接 用插入圖片的語法規則加到我們的 Markdown 文本文件中或 HTML 裏面。

動態實時更新的小牌子

事實上,我們前面生成的小牌子都是靜態的小牌子:其中的文本內容是固定不變的,僅能用於做一個好看的標識。 而事實上,Shields.io 生成的小牌子完全支持動態數據顯示,比如粉絲、關注者數量、RSS 訂閱者數量……

如果我們想要顯示一些動態變化的數據,那麼我們就需要一個受支持的數據接口,這樣我們的「Shields.io 小牌子生成服務器」就會先行從這一數據接口請求相應的動態數據,並按照請求的結果將數據渲染成不同的「小牌子」。(具體的語法請繼續向下閱讀)

Shields.io 靜態小牌子與動態小牌子不同的渲染原理

但是,雖然 Shields.io 服務 API 的功能非常完善,能夠支持許多第三方 API 節點的數據服務,但是有一些服務:

  • API 接口返回複雜,無法直接用 Shields.io 簡單處理
  • API 訪問緩慢、不穩定,經常出現超時或無法訪問的情況
  • 訪問一些數據需要進行認證,直接訪問會返回 403 無權限
  • 直接不對外公開 API 接口,沒有面向開發者的開放平臺,無法直接請求數據

當我們想要顯示這些平臺的關注者數量、粉絲數量時,往往就力不從心了。 因此,我使用 Serverless 技術實現了「Substats: Subscriber Statistics」—— 一個專注提供多個服務、平臺、網站的粉絲、關注、訂閱數量的 API 中轉站 ,用來專門處理這些單靠 Shields.io 不方便直接處理的疑難雜症。

下面我來簡單介紹一下如何利用 Substats 配合 Shields.io 定製小牌子 ( •̀ ω •́ )✧

用 Substats 配合 Shields.io 製作動態小牌子

通過 Substats API 獲取我們期望的數據

爲了更好的配合 Shields.io 服務,我特意將 Substats 的 API 設計成簡單拼接 URL 即可進行數據請求。Substats API 的語法非常簡單,我們只需要關注並提供如下的兩個字段即可進行請求:

  • 目標服務名稱 source :你所想要請求的服務、網站和平臺名(比如: sspaiweibo ……)
  • 請求數據標籤 queryKey :在這一服務中查詢的關注數據對應的標籤或名稱(比如我的少數派用戶名 spencerwoo

這樣,我們就可以用這樣的語法來拼接一個 URL(注意第一個字符是 ? ,其他用 & 拼接):

https://api.spencerwoo.com/substats/?source={目標服務名稱}&queryKey={請求數據標籤}

利用這樣的語法,我們就可以進行數據請求啦。繼續上面圖示中的例子,比如我想要製作一個實時顯示我自己的少數派關注數量的小牌子,我拼接成的 URL 即爲:

https://api.spencerwoo.com/substats/?source=sspai&queryKey=spencerwoo

非常方便!這一 URL 會給我們返回類似下面的 JSON 結果:

{
  "status": 200,
  "data": {
    "totalSubs": 638,
    "subsInEachSource": {
      "sspai": 638
    },
    "failedSources": {}
  }
}

我們可以這樣理解返回的 JSON 數據:

  • status 是請求是否成功,成功即爲 200(表示 HTTP OK)
  • data 就是請求返回的數據(其中 totalSubs 表示總關注數量, subsInEachSource 表示每個服務請求到的粉絲數據,最後 failedSources 表示請求失敗的數據源。)

可以看到我們所需要的字段即爲 $.data.totalSubs ,也就是 638 —— 我的少數派總關注人數。接下來,我們只需要告訴 Shields.io:

  1. 我們請求的 URL 地址
  2. 返回數據中所要的字段

這兩個參數,即可成功製作一個動態小牌子。

用 Shields.io 製作最終動態小牌子

我們繼續借助 Shields.io 官網上面提供的「小牌子生成器」,這次我們稍微向下滾動,找到 Dynamic 版本「小牌子生成器」,並按照這樣的規則依次操作:

  1. 數據類型 data type 選擇:JSON
  2. 標籤 label 填入:小牌子左側的標籤,比如 少數派關注
  3. API 地址 data url 填入:我們剛剛的 API URL: https://api.spencerwoo.com/substats/?source=sspai&queryKey=spencerwoo
  4. 請求字段 query 填入:我們 Substats API 數據中的這一字段: $.data.totalSubs
  5. 標籤顏色 color 填入:一個十六進制的顏色代碼,比如少數派強調色: da282a
  6. ……(餘下的兩個參數:前綴 prefix 和後綴 suffix ,可以根據自己的需要自行定義)
藉助 Shields.io 官方提供的生成器構造動態小牌子

這樣,我們就藉助 Shields.io 構造出來一個自定義的動態 SVG 小牌子(由於我們的請求中包含有 URL 中非法的字符,因此下面這個是 URL 編碼之後的 SVG 小牌子地址):

https://img.shields.io/badge/dynamic/json?color=da282a&label=%E5%B0%91%E6%95%B0%E6%B4%BE%E5%85%B3%E6%B3%A8&query=%24.data.totalSubs&url=https%3A%2F%2Fapi.spencerwoo.com%2Fsubstats%2F%3Fsource%3Dsspai%26queryKey%3Dspencerwoo
動態的少數派關注數量小牌子

這樣,我們的動態小牌子就完整的製作完成啦,我們可以用 Markdown 的語法將這一圖片鏈接嵌入一篇文章之中:

![](https://img.shields.io/badge/dynamic/json?color=da282a&label=%E5%B0%91%E6%95%B0%E6%B4%BE%E5%85%B3%E6%B3%A8&query=%24.data.totalSubs&url=https%3A%2F%2Fapi.spencerwoo.com%2Fsubstats%2F%3Fsource%3Dsspai%26queryKey%3Dspencerwoo)

或者用 HTML 定義圖片的方法直接將這一 SVG 嵌入一個網頁:

<img src="https://img.shields.io/badge/dynamic/json?color=da282a&label=%E5%B0%91%E6%95%B0%E6%B4%BE%E5%85%B3%E6%B3%A8&query=%24.data.totalSubs&url=https%3A%2F%2Fapi.spencerwoo.com%2Fsubstats%2F%3Fsource%3Dsspai%26queryKey%3Dspencerwoo" />

其他 Substats API 的功能和語法規則

另外,Substats API 還可以串聯多個不同的數據源和它們對應的請求參數。比如,我同時請求少數派、知乎、GitHub 三個平臺上面的關注,即可這樣構造請求(多個 source 和  queryKey 組合按照順序進行請求即可,順序在請求過程中不會丟失):

https://api.spencerwoo.com/substats/?source=sspai&queryKey=spencerwoo&source=zhihu&queryKey=spencer-woo-64&source=github&queryKey=spencerwooo

可以看到,上面的 URL 裏,我直接串聯了多個 sourcequeryKey 的請求組合,同時請求。這樣我們就可以得到這三個平臺上面關注者數量的總和 totalSubs ,以及每個平臺各自的關注者數量 subsInEachSource

{
  "status": 200,
  "data": {
    "totalSubs": 1312,
    "subsInEachSource": {
      "sspai": 638,
      "zhihu": 361,
      "github": 313
    },
    "failedSources": {}
  }
}

那麼,我們就可以直接用 Shields.io 構造一個如下的 SVG 小牌子:

https://img.shields.io/badge/dynamic/json?color=0084ff&label=%E5%B0%91%E6%95%B0%E6%B4%BE%7C%E7%9F%A5%E4%B9%8E%7CGitHub&query=%24.data.totalSubs&url=https%3A%2F%2Fapi.spencerwoo.com%2Fsubstats%2F%3Fsource%3Dsspai%26queryKey%3Dspencerwoo%26source%3Dzhihu%26queryKey%3Dspencer-woo-64%26source%3Dgithub%26queryKey%3Dspencerwooo

這樣我們就可以直接得到三個平臺總關注數量的一個「小牌子」:

少數派、知乎、GitHub 三個平臺總關注者數量

同時,如果你想同時請求多個平臺,但是平臺中請求的數據標籤名稱是一樣的,比如我們同時請求 Feedly 和 NewsBlur 兩個 RSS 訂閱服務裏我自己的 RSS 鏈接 https://blog.spencerwoo.com/posts/index.xml 的訂閱數量,那麼我們可以:

  • 直接用 |feedlynewsblur 直接連接,傳遞給 source  作爲參數
  • 並將 RSS 鏈接傳遞給 queryKey  作爲參數

從而構造這樣的請求:

https://api.spencerwoo.com/substats/?source=feedly|newsblur&queryKey=https://blog.spencerwoo.com/posts/index.xml

這樣,我們就可以直接得到兩個平臺同一個 RSS 源的總訂閱數量:

{
  "status": 200,
  "data": {
    "totalSubs": 17,
    "subsInEachSource": {
      "feedly": 14,
      "newsblur": 3
    },
    "failedSources": {}
  }
}

從而製作表示 RSS 鏈接總訂閱人數的「小牌子」:

顯示 RSS 訂閱總人數的動態小牌子

簡單方便!實在好用!(不瞞大家說,最初開發這一項目,我就是爲了顯示我自己 RSS 總訂閱人數。:joy:)

小結

Substats 是我藉助 Serverless 技術構建的一個 Cloudflare Worker, 直接部署在 Cloudflare 全球 CDN 節點上,訪問速度非常的快。 因此,如果你使用 Substats 和 Shields.io 來製作「小牌子」,生成 SVG 所消耗的時間的佔比較大的部分應該是和原服務 API 溝通的時間(比如 NewsBlur 就特別慢)。

雖然 Substats 僅誕生了不到一週,但是目前在我和其他兩位同學的共同努力下,已經支持了包括嗶哩嗶哩、少數派、知乎、微博、GitHub 等知名網站、社交平臺以及 Feedly 和 NewsBlur 兩大 RSS 服務提供商。未來我會盡我所能,繼續維護,支持更多的平臺。

Substats API 目前支持的服務、網站和平臺

希望這篇文章,以及 Substats API,能幫助你更方便、更輕鬆的 零成本自制動態實時更新、快速加載 的小牌子,用來裝扮你的個人主頁、博客、GitHub 項目 README 或其他網頁。 如果你覺得 Substats 簡直太棒了,那請一定  前往 GitHub 項目頁面  給我一個 :star2: Star! 本文的介紹到這裏就結束啦,感謝閱讀。

> 下載少數派客戶端、關注少數派公衆號,瞭解更精彩的數字生活 :leaves:

相關文章