[敲打鍵盤] 從 MovableType 到 Blogger

這一篇是我給自由軟體鑄造場電子報的稿件,刊登於第一百零七期 (2008/07/14)。

從 MovableType 到 Blogger

認識我的人都知道,如果問到自己架設部落格,我大概會選擇 MovableType;如果問到免費的部落格服務,我通常則會推薦榖歌的 Blogger

MovableType 從很久以前,就在官方文件當中說明,要如何從 Blogger 把部落格內容搬移到 MovableType,並且詳細說明了 MovableType 的匯入匯出格式,因此對於原本是 Blogger 的使用者來說,不管是要「跳船」到 MovableType,或者是要把位於 Blogger 的部落格備份到 MovableType 上,都相當方便。

反之,如果是想要把 MovableType 的部落格內容弄到 Blogger 上,卻非常地辛苦;在過去幾年間,xditeVicJuan 先後以 PHP 撰寫了腳本,幫助人們把 MovableType 的內容,塞進 Blogger 當中⸺這些作法相當地克難,並且有諸多限制,例如每天祇能匯入 50 篇文章、無法匯入留言迴響、必須手動更正文章發表時間、冒著帳號密碼外流的風險等。這些困難讓反方向的操作(從 MovableType「跳船」到 Blogger,或用 Blogger 來備份 MovableType)難以接受,尤其是對一個已經寫了不知道幾百篇文章的部落客來說更是如此。

上個月,Blogger 測試區推出了部落格的匯入匯出功能,並且採用開放的 Atom 格式,霎時間生機湧現!

當我們在討論開放源碼軟體時,經常會提到「開放檔案格式」;事實上,許多開放源碼軟體也很堅持要採用開放檔案格式,因為這麼一來,這些檔案將能更容易地被其他程式所處理,而不會讓使用者被任何一套程式所箝制。這種「能夠隨時跳槽」的自由,向來是自由軟體/開放源碼軟體所尊崇的。在上個月的專欄當中,我們知道,這也是 Web 2.0 世代所期盼的。

以 Blogger 這個(讓人們期待了好多年的)新功能來說,我們可以輕易地弄懂它的匯出檔案格式,自然也就有辦法把其他部落格系統或平台的內容,包裝成相同的格式,匯入 Blogger。

實際上要怎麼做呢?前面提過,這個新功能目前祇有在 Blogger 測試區提供,所以你得從 http://draft.blogger.com/ 登入 Blogger,接著在「設定 > 基本 > 網誌工具」當中,就可以看到匯入、匯出等選項了。

首先讓我們試著匯出原有的部落格內容,你會得到一個檔名為 blog-MM-DD-YYYY.xml 的檔案,其中 MM-DD-YYYY 是以數字表示的匯出日期;這個檔案會是以 UTF-8 編碼的純文字檔,不含任何換列,所以可能不大容易閱讀。不過因為檔案內容其實是 Atom 格式,所以就算有換列也不影響其效用;稍加整理一下,你會發現這個檔案的內容大致上長這樣:

讓我們說明一下其中各個標籤內容:

部落格ID

在 Blogger 當中,每一個部落格都會有一個十九位數字的編號,請觀察一下 Blogger 控制主頁當中,那些超連結就會透露出這組編號。這個標籤內容的格式是:

tag:blogger.com,1999:blog-十九位數字的部落格編號.archive

例如:

tag:blogger.com,1999:blog-1234567890123456789.archive

部落格最後更新時間

部落格最後的更新時間,也就是部落格上最後一篇文章的最後更新時間。這個標籤內容的格式是:

YYYY-MM-DDThh:mm:ss.sss+ZZ:ZZ

其中 YYYY 是四位數的年份,MM 是兩位數的月份,DD 是兩位數的日期,hh 是兩位數的二十四時制時刻,mm 是兩位數的分鐘,ss.sss 是兩位數並且到小數點以下第三位的秒數,+ZZ:ZZ 則是表達時區。例如:

2008-06-30T23:51:06.135+08:00

部落格標題

部落格的名稱。這個標籤內容應該要是純文字,如果你偷用了任何 (X)HTML 碼,則會直接濾掉不見。

部落格Atom網址

部落格的 Atom 源料網址。這個屬性值的格式是:

http://www.blogger.com/feeds/十九位數字的部落格編號/archive

例如:

http://www.blogger.com/feeds/1234567890123456789/archive

部落格網址

部落格的網址。例如:

http://foo.blogspot.com/

部落格管理者顯示名稱

部落格管理者的顯示名稱。例如:

FooBar

部落格管理者資料網頁網址

部落格管理者的簡介網頁網址。在 Blogger 上,每一個使用者帳號都會有個二十位數字的編號,因此這個標籤內容的格式就會是:

http://www.blogger.com/profile/二十位數字的帳號編號

例如:

http://www.blogger.com/profile/00000000000000000020

管理者電子郵件地址

這個標籤內容是固定的:

noreply@blogger.com

在 <entry> 與 </entry> 之間的,則是文章或迴響;每一篇文章、每一則迴響,都會單獨放在一組 <entry>……</entry> 內。如果是一篇文章的話,則這段內容看起來會像這樣:

要判斷某一段 <entry>……</entry> 是否代表一篇文章,可以根據是否有這個標籤:

<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/blogger/2008/kind#post'/>

注意一下 term 這個屬性的值要是:

http://schemas.google.com/blogger/2008/kind#post

這樣纔是文章。接下來讓我們看看每一個標籤或屬性內容:

文章ID

在 Blogger 當中,每一篇文章也都會有個十九位數字的編號;要表達文章 ID 時,這組編號還要跟部落格編號一起使用。這個標籤內容的格式是:

tag:blogger.com,1999:blog-十九位數字的部落格編號.post-十九位數字的文章編號

例如:

tag:blogger.com,1999:blog-1234567890123456789.post-0987654321098765432

文章張貼時間

這篇文章的最初張貼時間。這個標籤內容的格式是:

YYYY-MM-DDThh:mm:ss.sss+ZZ:ZZ

其中 YYYY 是四位數的年份,MM 是兩位數的月份,DD 是兩位數的日期,hh 是兩位數的二十四時制時刻,mm 是兩位數的分鐘,ss.sss 是兩位數並且到小數點以下第三位的秒數,+ZZ:ZZ 則是表達時區。例如:

2008-06-30T23:51:06.135+08:00

文章更新時間

這篇文章的最後更新時間;如果文章張貼之後就沒有更新過的話,自然就會與文章張貼時間一模一樣。這個標籤內容的格式是:

YYYY-MM-DDThh:mm:ss.sss+ZZ:ZZ

其中 YYYY 是四位數的年份,MM 是兩位數的月份,DD 是兩位數的日期,hh 是兩位數的二十四時制時刻,mm 是兩位數的分鐘,ss.sss 是兩位數並且到小數點以下第三位的秒數,+ZZ:ZZ 則是表達時區。例如:

2008-06-30T23:51:06.135+08:00

文章標籤

如果這篇文章被貼上標籤了,就會出現 scheme 屬性的值為:

http://www.blogger.com/atom/ns#

的 <category /> 標籤,其 term 屬性的值就是標籤名稱。如果貼了好幾個標籤,這樣的 <category /> 標籤也就會出現好幾個。例如:

<category scheme='http://www.blogger.com/atom/ns#' term='Tag01'/>
<category scheme='http://www.blogger.com/atom/ns#' term='Tag02'/>

在上述的例子當中,表示這篇文章同時貼著 Tag01 與 Tag02 這兩個標籤。

文章標題

這篇文章的標題。這應該要是純文字,如果你偷用了任何 (X)HTML 碼,則會直接濾掉不見。

文章內容

這篇文章的內容。這個標籤內容允許出現 (X)HTML,但是必須要逸出⸺意思就是說,所有的 < 都要變成 &lt;,所有的 > 都要變成 &gt;,所有的 & 都要變成 &amp;,所有的 " 都要變成 &quot; 纔行。

文章網址

這篇文章的網址。例如:

http://foo.blogspot.com/2008/06/blog-post.html

文章Atom網址

這篇文章的 Atom 源料網址。這個屬性值的格式是:

http://www.blogger.com/feeds/十九位數字的部落格編號/posts/default/十九位數字的文章編號

例如:

http://www.blogger.com/feeds/1234567890123456789/posts/default/0987654321098765432

文章作者顯示名稱

這篇文章的作者的顯示名稱。例如:

FooBar

文章作者資料網頁網址

這篇文章作者的簡介網頁網址。在 Blogger 上,每一個使用者帳號都會有個二十位數字的編號,因此這個標籤內容的格式就會是:

http://www.blogger.com/profile/二十位數字的帳號編號

例如:

http://www.blogger.com/profile/00000000000000000020

文章作者電子郵件

這篇文章作者的電子郵件地址。例如:

foobar@gmail.com

如果是一則迴響的話,<entry>……</entry> 的內容看起來則會像這樣:

請注意,如果某一段 <entry>……</entry> 內容是一則迴響的話,就會出現一個 scheme 屬性值為:

http://schemas.google.com/g/2005#kind

的 <category /> 標籤,其 term 屬性值是:

http://schemas.google.com/blogger/2008/kind#comment

接下來也讓我們看看每一個標籤或屬性內容:

迴響ID

在 Blogger 當中,每一則迴響也都會有個十九位數字的編號;要表達文章 ID 時,這組編號還要跟部落格編號、文章編號一起使用。這個標籤內容的格式是:

tag:blogger.com,1999:blog-十九位數字的部落格編號.post-十九位數字的文章編號.comment-十九位數字的迴響編號

例如:

tag:blogger.com,1999:blog-1234567890123456789.post-0987654321098765432.comment-0123456789012345678

迴響張貼時間

這則迴響的張貼時間。這個標籤內容的格式是:

YYYY-MM-DDThh:mm:ss.sss+ZZ:ZZ

其中 YYYY 是四位數的年份,MM 是兩位數的月份,DD 是兩位數的日期,hh 是兩位數的二十四時制時刻,mm 是兩位數的分鐘,ss.sss 是兩位數並且到小數點以下第三位的秒數,+ZZ:ZZ 則是表達時區。例如:

2008-07-01T23:51:06.135+08:00

迴響更新時間

Blogger 中的迴響無法修改、更新,所以這個標籤內容一定會與迴響張貼時間一模一樣。

迴響標題

這個標籤內容會是純文字,所以實際上會是將迴響內容的 (X)HTML 全部去除後,取前五十個中文字,再接上三個 . 號。如果迴響內容少於五十個中文字,則全取而且不加 . 號。

迴響內容

這則迴響的實際內容。這個標籤內容允許出現 (X)HTML,但是必須要逸出⸺意思就是說,所有的 < 都要變成 &lt;,所有的 > 都要變成 &gt;,所有的 & 都要變成 &amp;,所有的 " 都要變成 &quot; 纔行。

迴響網址

這則迴響的網址。例如:

http://foo.blogspot.com/2008/06/blog-post.html?showComment=1212721680000#c0123456789012345678

迴響Atom網址

這則迴響的 Atom 源料網址。這個屬性值的格式是:

http://www.blogger.com/feeds/十九位數字的部落格編號/comments/default/十九位數字的迴響編號

例如:

http://www.blogger.com/feeds/1234567890123456789/comments/default/0123456789012345678

留言者顯示名稱

這則迴響作者的顯示名稱。例如:

BarPaz

留言者資料網頁網址

這則迴響作者的簡介網頁網址。在 Blogger 上,每一個使用者帳號都會有個二十位數字的編號,因此這個標籤內容的格式就會是:

http://www.blogger.com/profile/二十位數字的帳號編號

例如:

http://www.blogger.com/profile/00000000000000000020

如果迴響作者並不是登入 Blogger 纔留言的話,則這個標籤內容也有可能是任何網站網址,端看留言者填寫了什麼而定。

留言者電子郵件

這則迴響作者的電子郵件地址。例如:

barpaz@gmail.com

文章Atom網址

這則迴響所屬的文章的 Atom 源料網址。這個屬性值的格式是:

http://www.blogger.com/feeds/十九位數字的部落格編號/posts/default/十九位數字的文章編號

例如:

http://www.blogger.com/feeds/1234567890123456789/posts/default/0987654321098765432

文章ID

這則迴響所屬的文章的文章 ID。這個屬性值的格式是:

tag:blogger.com,1999:blog-十九位數字的部落格編號.post-十九位數字的文章編號

例如:

tag:blogger.com,1999:blog-1234567890123456789.post-0987654321098765432

請注意,Blogger 是靠著這個屬性值纔有辦法把迴響跟文章連在一起。

在這個匯出檔案當中,會先一口氣把所有的文章列完,再開始列出所有的迴響。另外,在匯入的時候,我們會發現幾件事:

  1. 有些標籤內容一定要符合上述格式,否則匯入時會發生錯誤;但是有些則不用符合特定格式,像是:
    • 部落格Atom網址
    • 部落格網址
    • 部落格管理者資料網頁網址
    • 文章網址
    • 文章Atom網址
    • 文章作者資料網頁網址
    • 迴響網址
    • 迴響Atom網址
    • 留言者資料網頁網址
  2. 有些內容在匯入之後,會取得新的值;意思是說,原來是什麼其實不重要。像是:
    • 部落格Atom網址
    • 部落格網址
    • 部落格管理者資料網頁網址
    • 文章網址
    • 文章Atom網址
    • 文章作者資料網頁網址
    • 迴響網址
    • 迴響Atom網址
  3. 不管匯入檔案裡面的部落格管理者資訊是誰,你匯入的就會變成你;不存在於你部落格的那些作者,他們的文章匯入後也會變成你的文章。

掌握這些要點之後,要讓 MovableType 生出符合這樣規格的檔案,就很容易了。以 MovableType 2.661 版為例,我們只要建立一個新的索引模版,名稱就叫做「Blogger.com 匯入檔」好了,輸出檔名可以用「blogger.xml」,然後模版內容如下:

接著重建索引檔案,你就會取得 blogger.xml⸺這個檔案可以直接丟給 Blogger 匯入,包括迴響、文章與迴響的時間資訊都能匯入,原有的文章分類也會做成標籤,而且你完全不用透露密碼等敏感資訊給第三方。(如果你想要的話,還可以把引用通告也做成迴響。)

這聽起來好多了,然而這個服務還在測試中,有些不足之處,像是目前它無法接受超過 1MB 的 xml 檔(這對於榖歌來說實在很諷刺呀),有時候匯入還會出問題,無法完整匯入所有的內容……這些小症頭,榖歌說未來將會改善,所以縱使這個功能還不夠當做正式上線,卻已經值得好好測試一番了。

有的讀者還會有進一步的疑惑:既然說是使用開放格式的 Atom 來匯出、匯入,為什麼祇能按照本文所描述的語法呢?事實上榖歌也正在努力,讓 Blogger 可以直接服用 WordPress 或其他部落格平台直接生出來的、符合標準的 Atom,祇不過透過本文的努力,我們就可以提早享受到開放格式的好處,而不用等到原生支援出現了。

jedi.org: