部落格系統知多少:揭秘那些不為人知的學問(三)

部落格系統知多少:揭秘那些不為人知的學問(三)

大佬說部落格

最後更新 2022/3/8 下午10:49
汪宇杰博客
預計閱讀 14 分鐘
分類
分享
標籤
分享

上篇《部落格系統知多少:揭開那些不為人知的學問(二)》介紹了部落格的基本功能設計要點,本篇介紹部落格的協定或標準。

目錄

由於文章篇幅較長,本文將分為 4 篇推送,目錄如下:

  1. 「部落格」的前世今生
  2. 我的部落格故事
  3. 誰是部落格的受眾?
  4. 部落格基本功能設計要點
    • 4.1 文章(Post)
    • 4.2 評論(Comment)
    • 4.3 分類(Category)
    • 4.4 標籤(Tag)
    • 4.5 歸檔(Archive)
    • 4.6 頁面(Page)
    • 4.7 訂閱
    • 4.8 版本控制
    • 4.9 主題及個人化
    • 4.10 使用者及權限
    • 4.11 外掛
    • 4.12 圖片及附件的處理
    • 4.13 髒詞過濾及評論審查
    • 4.14 靜態化
    • 4.15 通知系統
  5. 部落格協定或標準
    • 5.1 RSS
    • 5.2 ATOM
    • 5.3 OPML
    • 5.4 APML
    • 5.5 FOAF
    • 5.6 BlogML
    • 5.7 Open Search
    • 5.8 Pingback
    • 5.9 Trackback
    • 5.10 MetaWeblog
    • 5.11 RSD
    • 5.12 閱讀器檢視
  6. 設計部落格系統有哪些知識點
    • 6.1 時區真的全用 UTC?
    • 6.2 HTML 還是 Markdown
    • 6.3 MVC 還是 SPA
    • 6.4 安全
  7. 結束語

5.1 丨 RSS

RSS(Really Simple Syndication)是一種基於 XML 的標準,普遍應用於包括部落格在內的內容類網站,由 Dave Winer 於 1999 年發明,少年電腦天才 Aaron Swartz 參與定義規範,可惜後者於 2013 年 1 月自殺,年僅 26 歲。

RSS 也是部落格系統中最有標誌性特性之一,其在部落格中的應用廣泛度成為了事實上的標準,沒有 RSS 的部落格系統就像看到不帶攝影鏡頭的手機一樣有趣。

RSS 檔案的副檔名通常是 .rss 或 .xml,也可以不定義副檔名(如 Moonglade 的 RSS)。內容為近期發表的部落格文章的 XML 描述,包括標題、時間、作者、分類、摘要(也可以是全文)等資訊。

(圖:Moonglade的RSS源)

RSS 是寫給機器看的,可用於網站之間同步內容,例如當年人人網(前校內網)可透過 RSS 匯入部落格文章為日記。而對於普通使用者,則需要 RSS 閱讀器應用來訂閱部落格。通常這樣的閱讀器裡不只訂閱一個作者的部落格,而是該使用者關心的所有部落格。閱讀器通常也是跨平台、跨裝置的,使用者可以在電腦、平板、手機,甚至樹莓派上訂閱 RSS 源。

(圖:2012年我在初代iPad上透過RSS訂閱自己部落格)

(圖:最新版Microsoft 365 Outlook中RSS訂閱我的部落格)

部分瀏覽器(如早期的火狐)也可以自動識別一個部落格的 RSS 位址,並在瀏覽器中訂閱。其自動發現原理是查找網頁 head 中有沒有這麼一個東西:

<link rel="alternate" type="application/rss+xml" title="Edi Wang" href="/rss" />

但是 RSS 有個缺點,它並不能夠由伺服器主動向客戶端推送,而需要靠客戶端自動去伺服器拉取。而過去 10 年中,隨著行動端的興起,訊息推播服務彌補了 RSS 的不足,各大平台也幾乎都推出了自己的手機 APP,因此 RSS 已經被許多網站淘汰。但並不意味著 RSS 沒用了,至今仍有大量網站仍然提供 RSS 訂閱。例如微軟 Channel 9 電視台的 RSS: https://channel9.msdn.com/Feeds/RSS/,國內的部落格園的 RSS:http://feed.cnblogs.com/blog/sitehome/rss,有意思的是部落格園網站的 logo 其實就是個 RSS 圖示。

對於建置部落格系統而言,你通常不會再專門做個手機 App,使用者也不會為每一個部落格都單獨下載一個 App,並且部落格系統與其他部落格、網站之間依然需要同步,不可能為每個合作夥伴都開發一套同步協定,大家依然都用已經是公認標準的 RSS,因此 RSS 在 2020 年依然是部落格系統推播文章的最佳途徑。

參考:https://en.wikipedia.org/wiki/RSS

5.2 丨 ATOM

ATOM 和 RSS 的作用幾乎一樣,但 ATOM 的出現是為了彌補 RSS 的一些設計缺陷。例如對於文章發表日期,ATOM 採用 RFC 3339 的時間戳,而 RSS 採用的是 RFC 822 標準。ATOM 也可以識別文章的語言、允許 payload 中出現 RSS 不允許的 XHTML、XML 和 Base64 編碼內容等。

許多部落格系統(包括我的 Moonglade)同時提供 RSS 及 ATOM 源。

參考連結:https://en.wikipedia.org/wiki/Atom_(Web_standard)

5.3 丨 OPML

「OPML(概述處理器標記語言)是用於輪廓的 XML 格式(定義為「一棵樹,其中每個節點包含一組具有字串值的命名屬性」)。它最初由 UserLand 在其 Radio UserLand 產品中作為大綱應用程式的原生檔案格式開發,此後已被用於其他用途,最常見的是在 Web Feed 聚合器之間交換 Web Feed 列表。

OPML 規範將大綱定義為任意元素的層次結構,有序列表。該規範相當開放,因此適用於多種類型的列表資料。

Mozilla Thunderbird 和許多其他 RSS 閱讀器網站和應用程式都支援以 OPML 格式匯入和匯出 RSS feed 列表。」

參考:https://en.wikipedia.org/wiki/OPML

通俗易懂的說,OPML 對於部落格來說,就是告訴閱讀器,這個部落格一共有哪些訂閱源以及他們各自的訂閱位址,通常就是每個文章分類是一個訂閱源,全部文章又是一個訂閱源。

(圖:Moonglade的OPML)

5.4 丨 APML

APML 即 Attention Profiling Mark-up Language,它比 OPML 更鮮為人知。APML 目前在網際網路上已經非常少見了,比 WP 還慘。作為部落格行業的歷史遺跡之一,抱著情懷簡短介紹一下。

與 OPML 類似,它也是一種 XML 格式的宣告檔,用來描述個人感興趣的事物或話題,並分享給其他讀者或部落客,以幫助閱讀器或者部落格系統本身針對使用者感興趣的內容提供服務或更有針對性的廣告。

參考連結:https://en.wikipedia.org/wiki/Attention_Profiling_Mark-up_Language

WordPress 可以透過外掛實現 APML,BlogEngine 則自帶 APML,我的 Moonglade 不支援 APML。

5.5 丨 FOAF

FOAF 即 Friend of a Friend,也是個寫給機器看的文件,描述了一個人類的社交關係,通常在部落格中可以用 FOAF 表示部落客和其他部落格之間的「友情連結」,只不過這個友情連結是寫給機器看的。好讓機器明白,誰才是你的基友,從而給讀者推薦基友部落格裡的內容。

WordPress 可以透過外掛實現 FOAF,BlogEngine 自帶 FOAF,我的 Moonglade 不支援 FOAF。FOAF 和 APML 的現狀差不多,已快絕跡。

參考連結:https://en.wikipedia.org/wiki/FOAF_(ontology)

5.6 丨 BlogML

BlogML 是一套跨部落格系統的資料標準,凡是實現了 BlogML 的部落格系統,就算語言、平台不一樣,也都可以互相匯入、匯出文章等資料。就好比 HTML5 是個標準,Edge、Chrome、Firefox 是瀏覽器,只要針對 HTML5 寫的網頁都能跨這些瀏覽器運行。

BlogML 也誕生於.NET 社群之中,隨後發展成了標準。除了本身就是.NET 的 BlogEngine 等系統以外,PHP 寫的 WordPress 都支援 BlogML。當年支援 BlogML 的還有 Windows Live Spaces,Subtext,DasBlog 等。我的 Moonglade 不支援 BlogML。

當前 BlogML 的標準 schema 是 2.0,更新於 2006 年 11 月 25 日。看起來這個標準也已經……

參考:https://en.wikipedia.org/wiki/BlogML

如果部落格實現了 Open Search 規範,那麼部落格的搜尋功能就能夠自動整合到使用者的瀏覽器裡,從而便於使用者直接在瀏覽器網址列使用你部落格的搜尋服務作為搜尋引擎(就像必應、谷歌那樣)。

實現 Open Search 只需兩步,首先在網頁的 head 裡加入指向 opensearch 定義檔的 link

<link
  type="application/opensearchdescription+xml"
  rel="search"
  title="Edi Wang"
  href="/opensearch"
/>

然後輸出 opensearch 檔案即可

<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
  <ShortName>Edi Wang</ShortName>

  <Description>Latest posts from Edi Wang</Description>

  <image height="16" width="16" type="image/vnd.microsoft.icon"
    >https://edi.wang/favicon.ico</image
  >

  <Url type="text/html" template="https://edi.wang/search/{searchTerms}" />
</OpenSearchDescription>

文件描述了部落格的名稱、簡介、圖示以及搜尋內容的 URL pattern。瀏覽器一旦識別這個文件,會自動將你的部落格註冊到搜尋引擎列表裡去。然後讀者就可以直接在瀏覽器網址列裡搜尋關鍵詞,並顯示部落格自己的搜尋結果頁面。

(圖:在網址列中搜尋我部落格的內容)

(圖:搜尋結果頁面)

Open Search 的具體規範和標準可參考:https://en.wikipedia.org/wiki/OpenSearch

5.8 丨 Pingback

Pingback 用於部落格系統之間通訊,一旦自己的文章被他人引用就會收到 pingback 請求,而自己引用了他人的文章就會向對方部落格發送一個 pingback 請求,因此完成一次 Pingback 需要己方和對方的部落格共同支援 pingback 協定。由於是標準協定,所以 pingback 並不要求雙方的部落格使用同一款部落格產品,例如我用.NET Core 寫的 Moonglade 可以完美和 PHP 寫的 WordPress 互相 ping。Pingback 也並不限制網站類型一定得是部落格,任何 CMS 或內容網站想要支援 Pingback 都沒問題。

Pingback 的技術原理也不複雜。

發送 Pingback 請求:

得到自己文章的 URL A、對面被引用文章的 URL B,請求 B,看看它有沒有 pingback 終端,如果有,構建一個 HTTP Request,內容是一段 XML:

<methodCall>
       <methodName>pingback.ping</methodName>
       <param>
              <param><value><string>A</string></value></param>
              <param><value><string>B</string></value></param>
       </param>
</methodCall>

這樣 B 所在的網站就知道 A 文章引用了 B 文章,處理 pingback 後,會給 A 所在的網站一個成功與否的回應。

(圖:Moonglade的pingback終端)

接受 Pingback 請求:

自己的文章 URL A 被他人文章 B 引用,並收到了一個 pingback XML。首先自己要驗證別人的 pingback 請求長得是否奇怪,以保證安全性,例如有沒有正常的 methodName、有沒有合法的雙方 URL、URL 是否能正常存取、是否有奇怪的 URL(例如 localhost 或有潛在攻擊行為的特殊構造)。保證 pingback 請求沒問題後,請求 B 的頁面,抓取 B 網頁的 title 內容、B 的 IP 位址,記錄到自己的資料庫中,並和 A 文章關聯。

收到的 Pingback 通常以系統身份自動在文章下加評論,但這個設計不是規範之一,你可以自由發揮,例如 Moonglade 把 pingback 集中起來在後台給部落格管理員檢視。

(圖:Moonglade後台管理中檢視哪些網站引用了自己部落格的文章)

參考:https://en.wikipedia.org/wiki/Pingback

5.9 丨 Trackback

Trackback 允許一個網站將更新通知給另一個網站。這是網站作者在有人連結到其文件之一時請求通知的四種類型的連結方法之一。這使作者可以追蹤誰連結到他們的文章。

參考:https://en.wikipedia.org/wiki/Trackback

儘管功能和 Pingback 類似,但 Trackback 通常需要手動發送,並需要給對方提供一篇文章的摘要。而 Pingback 的過程是由雙方部落格系統共同完成的全自動操作。

5.10 丨 MetaWeblog

MetaWeblog 是一套基於 XML-RPC 的 Web Service,這套 API 定義了幾個標準介面,用於文章、分類、標籤等部落格常規內容的 CRUD。只要實現了這些介面的部落格系統,就可以讓部落客不用透過瀏覽器登入部落格後台寫文章,而使用電腦上安裝的用戶端去寫部落格。主流的用戶端包括 Windows Live Writer、Microsoft Word。在用戶端裡可以完整的編輯文章、插入圖片、設定分類,甚至可以將部落格的主題同步到用戶端中。

可能它看起來也像是過時的部落格協定之一,但直到 2020 年的今天,最新版的 Microsoft 365 套件依然完整支援實現了 MetaWeblog API 的部落格系統。

(圖:Microsoft Word的部落格支援)

類似 MetaWeblog 的部落格 API 還有 Blogger API, Atom Publishing Protocol, Micropub。

參考:https://en.wikipedia.org/wiki/MetaWeblog

我的部落格在 2012 年曾經 996 007 完整實現了 MetaWeblog + RSD,但如今 30 歲了,在.NET Core 裡暫時不打算實現這個了,畢竟有多少人還在用 Live Writer 和 Word 寫部落格(哭。

5.11 丨 RSD

Really Simple Discovery(RSD)是 XML 格式和一種發布慣例,用於使部落格或其他 Web 軟體公開的服務可由用戶端軟體發現。這是一種將設定編輯/部落格軟體所需的資訊減少到三個眾所周知的元素的方法:使用者名稱,密碼和首頁 URL。任何其他關鍵設定都應該在與網站相關的 RSD 文件中定義,或者可以使用提供的資訊來發現。

為了使用 RSD,網站的所有者在首頁的 head 裡放置了一個連結標記,用於指示 RSD 檔案的位置。MediaWiki 使用的一個範例是:

<link
  rel="EditURI"
  type="application/rsd+xml"
  href="https://en.wikipedia.org/w/api.php?action=rsd"
/>

然後用 RSD 檔案去表示各種 API 的介面

<?xml version="1.0"?>

<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">

    <service>

        <apis>

            <api name="MediaWiki" preferred="true" apiLink="http://en.wikipedia.org/w/api.php" blogID="">

                <settings>

                    <docs xml:space="preserve">http://mediawiki.org/wiki/API</docs>

                    <setting name="OAuth" xml:space="preserve">false</setting>

                </settings>

            </api>

        </apis>

        <engineName xml:space="preserve">MediaWiki</engineName>

        <engineLink xml:space="preserve">http://www.mediawiki.org/</engineLink>

    </service>

</rsd>

參考:https://en.wikipedia.org/wiki/Really_Simple_Discovery

RSD 也幾乎和上面的 MetaWeblog 介面一起使用。這樣 Windows Live Writer、Microsoft Word 等工具才可以自動發現部落格的 MetaWeblog 服務,而不需要手動去輸 URL。

5.12 閱讀器檢視

大部分瀏覽器和用戶端都有閱讀器檢視,可以讓讀者在與部落格網站頁面風格完全不一樣的檢視中閱讀文章。例如,我部落格某篇文章的正常頁面長這樣:

(圖:Moonglade非閱讀器檢視文章頁)

瀏覽器識別到我的部落格支援閱讀器檢視,就會亮起沉浸式閱讀按鈕

(圖:Microsoft Edge 瀏覽器沉浸式閱讀按鈕)

進入沉浸式閱讀介面後,瀏覽器會自動提取文章的內容,識別文章的標題、章節、圖片,去掉導航列、側邊欄等與文章無關的元素,並可讓使用者控制文字大小、背景色,甚至朗讀文章內容。

(圖:Moonglade 的文章進入沉浸式閱讀介面)

不僅我的部落格有閱讀器檢視,設計良好的部落格、新聞內容站都有,例如 Azure 的:

(圖:Azure 官方部落格閱讀器檢視)

另外,支援閱讀器檢視的網站,SEO 一定不會差。因此設計部落格系統時,請考慮支援閱讀器檢視。

下篇將主要介紹【設計部落格系統有哪些知識點】歡迎關注

汪宇杰

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2022/3/29

疫情下的北京失業中年

最近身邊的一個朋友突然間就被辭退了,而且是一線網路大廠,週末跟我聚了一下。喝了一點小酒,聊了很多,他說我可以把他的經歷發出來,因為他已經看淡了

繼續閱讀