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

微軟技術棧發表於2021-10-09

上篇《部落格系統知多少:揭祕那些不為人知的學問(二)》介紹了部落格的基本功能設計要點,本篇介紹部落格的協議或標準。
由於文章篇幅較長,本文將分為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描述,包括標題、時間、作者、分類、摘要(也可以是全文)等資訊。
image.png

(圖:Moonglade的RSS源)

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

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

image.png
(圖:最新版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/Fee...,國內的部落格園的RSS:http://feed.cnblogs.com/blog/...,有意思的是部落格園網站的logo其實就是個RSS圖示。

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

參考連結:

https://en.wikipedia.org/wiki...

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...(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對於部落格來說,就是告訴閱讀器,這個部落格一共有哪些訂閱源以及他們各自的訂閱地址,通常就是每個文章分類是一個訂閱源,全部文章又是一個訂閱源。
image.png

(圖:Moonglade的OPML)

5.4丨APML

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

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

參考連結:

https://en.wikipedia.org/wiki...

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...(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...

5.7丨Open Search

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

實現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。瀏覽器一旦識別這個檔案,會自動將你的部落格註冊到搜尋引擎列表裡去。然後讀者就可以直接在瀏覽器位址列裡搜尋關鍵詞,並顯示部落格自己的搜尋結果頁面。
image.png

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

image.png
(圖:搜尋結果頁面)

Open Search的具體規範和標準可參:

https://en.wikipedia.org/wiki...

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所在的網站一個成功與否的響應。
image.png

(圖:Moonglade的pingback終端)

接受Pingback請求:

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

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

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

參考連結:

https://en.wikipedia.org/wiki...

5.9丨Trackback

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

參考連結:

https://en.wikipedia.org/wiki...

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

5.10丨MetaWeblog

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

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

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

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

參考連結:

https://en.wikipedia.org/wiki...

我的部落格在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...

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

5.12 閱讀器檢視

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

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

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

image.png

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

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

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

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

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

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

明天將主要介紹【設計部落格系統有哪些知識點】
請繼續鎖定我們!


掃碼關注微軟中國MSDN,獲取更多微軟一手技術資訊和官方學習資料!
image.png

相關文章