Login  |  繁體中文
感謝您對「自由軟體鑄造場」的支持與愛護,十多年來「自由軟體鑄造場」受中央研究院支持,並在資訊科學研究所以及資訊科技創新研究中心執行,現已完成階段性的任務。 原網站預計持續維運至 2021年底,網站內容基本上不會再更動。本網站由 Denny Huang 備份封存。
也紀念我們永遠的朋友 李士傑先生(Shih-Chieh Ilya Li)。

從 MovableType 到 Blogger

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

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

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

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

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

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

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

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




部落格ID
部落格最後更新時間
部落格標題




部落格管理者顯示名稱
部落格管理者資料網頁網址
管理者電子郵件地址

Blogger

……

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

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

◎ 部落格ID
在 Blogger 當中,每一個部落格都會有一個 19 位數字的編號,請觀察一下 Blogger 控制主頁當中,那些超連結就會透露出這組編號。這個標籤內容的格式是:
tag:blogger.com,1999:blog-十九位數字的部落格編號.archive
例如:
tag:blogger.com,1999:blog-1234567890123456789.archive

◎ 部落格最後更新時間
部落格最後的更新時間,也就是部落格上最後一篇文章的最後更新時間。這個標籤內容的格式是:
YYYY-MM-DDThh:mm:ss.sss+ZZ:ZZ
其中 YYYY 是 4 位數的年份,MM 是 2 位數的月份,DD 是 2 位數的日期,hh 是 2 位數的 24 時制時刻,mm 是 2 位數的分鐘,ss.sss 是 2 位數並且到小數點以下第 3 位的秒數,+ZZ:ZZ 則是表達時區。例如:
2008-06-30T23:51:06.135+08:00

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

◎ 部落格Atom網址
部落格的 Atom 源料網址。這個屬性值的格式是:
https://www.blogger.com/feeds/ 19 位數字的部落格編號/archive
例如:
https://www.blogger.com/feeds/1234567890123456789/archive

◎ 部落格網址
部落格的網址。例如:
https://foo.blogspot.com/

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

◎ 部落格管理者資料網頁網址
部落格管理者的簡介網頁網址。在 Blogger 上,每一個使用者帳號都會有個 20 位數字的編號,因此這個標籤內容的格式就會是:
https://www.blogger.com/profile/ 20 位數字的帳號編號
例如:
https://www.blogger.com/profile/00000000000000000020

◎ 管理者電子郵件地址
這個標籤內容是固定的:
This e-mail address is being protected from spambots. You need JavaScript enabled to view it

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


文章ID
文章張貼時間
文章更新時間




文章標題
文章內容



文章作者顯示名稱
文章作者資料網頁網址
文章作者電子郵件

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

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

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

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

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

◎ 文章ID
在 Blogger 當中,每一篇文章也都會有個 19 位數字的編號;要表達文章 ID 時,這組編號還要跟部落格編號一起使用。這個標籤內容的格式是:
tag:blogger.com,1999:blog- 19 位數字的部落格編號.post- 19 位數字的文章編號
例如:
tag:blogger.com,1999:blog-1234567890123456789.post-0987654321098765432

◎ 文章張貼時間
這篇文章的最初張貼時間。這個標籤內容的格式是:
YYYY-MM-DDThh:mm:ss.sss+ZZ:ZZ
其中 YYYY 是 4 位數的年份,MM 是 2 位數的月份,DD 是 2 位數的日期,hh 是 2 位數的 24 時制時刻,mm 是 2 位數的分鐘,ss.sss 是 2 位數並且到小數點以下第 3 位的秒數,+ZZ:ZZ 則是表達時區。例如:
2008-06-30T23:51:06.135+08:00

◎ 文章更新時間
這篇文章的最後更新時間;如果文章張貼之後就沒有更新過的話,自然就會與文章張貼時間一模一樣。這個標籤內容的格式是:
YYYY-MM-DDThh:mm:ss.sss+ZZ:ZZ
其中 YYYY 是 4 位數的年份,MM 是 2 位數的月份,DD 是 2 位數的日期,hh 是 2 位數的 24 時制時刻,mm 是 2 位數的分鐘,ss.sss 是 2 位數並且到小數點以下第 3 位的秒數,+ZZ:ZZ 則是表達時區。例如:
2008-06-30T23:51:06.135+08:00

◎ 文章標籤
如果這篇文章被貼上標籤了,就會出現 scheme 屬性的值為:
https://www.blogger.com/atom/ns#
標籤,其 term 屬性的值就是標籤名稱。如果貼了好幾個標籤,這樣的 標籤也就會出現好幾個。例如:


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

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

◎ 文章內容
這篇文章的內容。這個標籤內容允許出現 (X)HTML,但是必須要逸出─意思就是說,所有的 都要變成 >,所有的 & 都要變成 &,所有的 " 都要變成 " 才行。

◎ 文章網址
這篇文章的網址。例如:
https://foo.blogspot.com/2008/06/blog-post.html

◎ 文章 Atom 網址
這篇文章的 Atom 源料網址。這個屬性值的格式是:
https://www.blogger.com/feeds/ 19 位數字的部落格編號/posts/default/ 19 位數字的文章編號
例如:
https://www.blogger.com/feeds/1234567890123456789/posts/default/0987654321098765432

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

◎ 文章作者資料網頁網址
這篇文章作者的簡介網頁網址。在 Blogger 上,每一個使用者帳號都會有個 20 位數字的編號,因此這個標籤內容的格式就會是:
https://www.blogger.com/profile/ 20 位數字的帳號編號
例如:
https://www.blogger.com/profile/00000000000000000020

◎ 文章作者電子郵件
這篇文章作者的電子郵件地址。例如:
This e-mail address is being protected from spambots. You need JavaScript enabled to view it

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


迴響ID
迴響張貼時間
迴響更新時間

迴響標題
迴響內容



留言者顯示名稱
留言者資料網頁網址
留言者電子郵件


請注意,如果某一段 …… 內容是一則迴響的話,就會出現一個 scheme 屬性值為:
https://schemas.google.com/g/2005#kind
標籤,其 term 屬性值是:

請注意,如果某一段 …… 內容是一則迴響的話,就會出現一個 scheme 屬性值為:的 標籤,其 term 屬性值是:

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

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

◎ 迴響ID
在 Blogger 當中,每一則迴響也都會有個 19 位數字的編號;要表達文章 ID 時,這組編號還要跟部落格編號、文章編號一起使用。這個標籤內容的格式是:
tag:blogger.com,1999:blog- 19 位數字的部落格編號.post- 19 位數字的文章編號.comment- 19 位數字的迴響編號
例如:
tag:blogger.com,1999:blog-1234567890123456789.post-0987654321098765432.comment-0123456789012345678

◎ 迴響張貼時間
這則迴響的張貼時間。這個標籤內容的格式是:
YYYY-MM-DDThh:mm:ss.sss+ZZ:ZZ
其中 YYYY 是 4 位數的年份,MM 是 2 位數的月份,DD 是 2 位數的日期,hh 是 2 位數的 24 時制時刻,mm 是 2 位數的分鐘,ss.sss 是 2 位數並且到小數點以下第 3 位的秒數,+ZZ:ZZ 則是表達時區。例如:
2008-07-01T23:51:06.135+08:00

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

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

◎ 迴響內容
這則迴響的實際內容。這個標籤內容允許出現 (X)HTML,但是必須要逸出─意思就是說,所有的 都要變成 >,所有的 & 都要變成 &,所有的 " 都要變成 " 才行。

◎ 迴響網址
這則迴響的網址。例如:
https://foo.blogspot.com/2008/06/blog-post.html?showComment=1212721680000#c0123456789012345678

◎ 迴響 Atom 網址
這則迴響的 Atom 源料網址。這個屬性值的格式是:
https://www.blogger.com/feeds/ 19 位數字的部落格編號/comments/default/19 位數字的迴響編號
例如:
https://www.blogger.com/feeds/1234567890123456789/comments/default/0123456789012345678

◎ 留言者顯示名稱
這則迴響作者的顯示名稱。例如:
BarPaz

◎ 留言者資料網頁網址
這則迴響作者的簡介網頁網址。在 Blogger 上,每一個使用者帳號都會有個 20 位數字的編號,因此這個標籤內容的格式就會是:
https://www.blogger.com/profile/ 20 位數字的帳號編號
例如:
https://www.blogger.com/profile/00000000000000000020
如果迴響作者並不是登入 Blogger 才留言的話,則這個標籤內容也有可能是任何網站網址,端看留言者填寫了什麼而定。

◎ 留言者電子郵件
這則迴響作者的電子郵件地址。例如:
This e-mail address is being protected from spambots. You need JavaScript enabled to view it

◎ 文章 Atom 網址
這則迴響所屬的文章的 Atom 源料網址。這個屬性值的格式是:
https://www.blogger.com/feeds/ 19 位數字的部落格編號/posts/default/19 位數字的文章編號
例如:
https://www.blogger.com/feeds/1234567890123456789/posts/default/0987654321098765432

◎ 文章ID
這則迴響所屬的文章的文章 ID。這個屬性值的格式是:
tag:blogger.com,1999:blog- 19 位數字的部落格編號.post- 19 位數字的文章編號
例如:
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」,然後模版內容如下:




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









This e-mail address is being protected from spambots. You need JavaScript enabled to view it


Blogger>


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


>
















tag:blogger.com,1999:blog-.post-.comment-


>
...











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

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

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

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




OSSF Newsletter : 第 107 期 從 MovableType 到 Blogger

Category: FOSS Forum