從 MovableType 到 Blogger
這一篇是我給自由軟體鑄造場電子報的稿件,刊登於第一百零七期 (2008/07/14)。
從 MovableType 到 Blogger
認識我的人都知道,如果問到自己架設部落格,我大概會選擇 MovableType;如果問到免費的部落格服務,我通常則會推薦榖歌的 Blogger。
MovableType 從很久以前,就在官方文件當中說明,要如何從 Blogger 把部落格內容搬移到 MovableType,並且詳細說明了 MovableType 的匯入匯出格式,因此對於原本是 Blogger 的使用者來說,不管是要「跳船」到 MovableType,或者是要把位於 Blogger 的部落格備份到 MovableType 上,都相當方便。
反之,如果是想要把 MovableType 的部落格內容弄到 Blogger 上,卻非常地辛苦;在過去幾年間,xdite 和 VicJuan 先後以 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,但是必須要逸出⸺意思就是說,所有的 < 都要變成 <,所有的 > 都要變成 >,所有的 & 都要變成 &,所有的 " 都要變成 " 纔行。
文章網址
這篇文章的網址。例如:
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,但是必須要逸出⸺意思就是說,所有的 < 都要變成 <,所有的 > 都要變成 >,所有的 & 都要變成 &,所有的 " 都要變成 " 纔行。
迴響網址
這則迴響的網址。例如:
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 是靠著這個屬性值纔有辦法把迴響跟文章連在一起。
在這個匯出檔案當中,會先一口氣把所有的文章列完,再開始列出所有的迴響。另外,在匯入的時候,我們會發現幾件事:
- 有些標籤內容一定要符合上述格式,否則匯入時會發生錯誤;但是有些則不用符合特定格式,像是:
- 部落格Atom網址
- 部落格網址
- 部落格管理者資料網頁網址
- 文章網址
- 文章Atom網址
- 文章作者資料網頁網址
- 迴響網址
- 迴響Atom網址
- 留言者資料網頁網址
- 有些內容在匯入之後,會取得新的值;意思是說,原來是什麼其實不重要。像是:
- 部落格Atom網址
- 部落格網址
- 部落格管理者資料網頁網址
- 文章網址
- 文章Atom網址
- 文章作者資料網頁網址
- 迴響網址
- 迴響Atom網址
- 不管匯入檔案裡面的部落格管理者資訊是誰,你匯入的就會變成你;不存在於你部落格的那些作者,他們的文章匯入後也會變成你的文章。
掌握這些要點之後,要讓 MovableType 生出符合這樣規格的檔案,就很容易了。以 MovableType 2.661 版為例,我們只要建立一個新的索引模版,名稱就叫做「Blogger.com 匯入檔」好了,輸出檔名可以用「blogger.xml」,然後模版內容如下:
接著重建索引檔案,你就會取得 blogger.xml⸺這個檔案可以直接丟給 Blogger 匯入,包括迴響、文章與迴響的時間資訊都能匯入,原有的文章分類也會做成標籤,而且你完全不用透露密碼等敏感資訊給第三方。(如果你想要的話,還可以把引用通告也做成迴響。)
這聽起來好多了,然而這個服務還在測試中,有些不足之處,像是目前它無法接受超過 1MB 的 xml 檔(這對於榖歌來說實在很諷刺呀),有時候匯入還會出問題,無法完整匯入所有的內容……這些小症頭,榖歌說未來將會改善,所以縱使這個功能還不夠當做正式上線,卻已經值得好好測試一番了。
有的讀者還會有進一步的疑惑:既然說是使用開放格式的 Atom 來匯出、匯入,為什麼祇能按照本文所描述的語法呢?事實上榖歌也正在努力,讓 Blogger 可以直接服用 WordPress 或其他部落格平台直接生出來的、符合標準的 Atom,祇不過透過本文的努力,我們就可以提早享受到開放格式的好處,而不用等到原生支援出現了。