kako si kej ?

TweetSuite Patch

In 程式設計, 電腦網路 on 2009 年 01 月 17 日 at 23:13

TweetSuite 是由 Dan Zarrella 所寫的一個 wordpress plugin,可以在 blog 的單篇文章內嵌一個 tweet-this 的按鈕,讓你的讀者(如果有在用 twitter 的話)可以很輕易的將「我正在讀這篇文章」的狀態丟到 twitter 上;以及他之前所寫的 TweetBacks 功能:列出所有曾經在 twitter 上推過這篇文章的人,並且可以在每一條推文後面加上 reTweet 按鈕;另外還有幾個可以放在邊欄的 widget,包括作者自己所有的推、作者打星過的推、以及這個 blog 裡被推最多次的文章。

基本上 TweetSuite 還蠻好用的,只是實際裝起來後我發現了幾個小問題,而其中有幾個問題可能是英語系的作者比較不會碰到的:

  1. 作者在找 TweetBacks 的列表時是利用 search api 去搜尋此篇文章的 url,api 回傳的格式是 Atom,所以作者寫了一個 parseAtom 的 function 去做 parsing,但是不知道為什麼作者 parsing 的方式卻是先切好每一個 entry,然後用找行數(line number)的方式去擷取出內容,或許作者本身沒有碰到問題,但是我發現在某些情況下,有些 tweet 的文字內容會分成兩行,所以這時候 parseAtom 就會找錯行了,進而導致 tweet 作者的名稱跟顯示圖片內容錯誤。因此我用 Regular Expression 的方式重寫這個 function 內大部分的 code,直接尋找 tag 內的文字,就不會出錯了。
  2. 作者去 search api 找 url 之前,會預先將這篇文章的 url 去幾個比較常用的縮址服務運算,抓回這篇文章 url 的各種縮址,然後再將各個縮址用加號 ( + )連結起來當作搜尋字串丟去 search api。原本一切都很美好的…如果有正確的從 tinyurl.com 取回縮址的話。因為這個搜尋字串的最後一個縮址是 tinyurl,如果當 tinyurl 沒有回應的時候,程式就不會存任何東西到 DB 中 tinyurl 的欄位,之後也不會再重抓,所以當組合搜尋字串時,最後的一個字就會是加號,丟到 search api 之後就死掉了。所以這邊的解決方式就是在送到 search api 之前,先檢查字串最後一個字元是不是加號,是的話就先去掉再送出,就一切正常了。
  3. 因為 twitter 的 search api 傳回的 atom 中,對於 UTF-8 的字元都是使用 &#\d{3, 10}; 的 HTML 格式,作者在程式中都沒有處理,所以當一個中文的 tweet (或其他非英語系的 tweet)要存進去 DB 時,140 個字元的限制是絕對不夠的,所以很多 tweet 就被硬生生的截斷了,使用 retweet 的功能時也會直接帶成 &#\d{3, 10}; 的格式而不是原本該顯示的字。因此我加上了一個將 HTML 格式的 UTF-8 code 轉換成 UTF-8 字串的 function,先將字串轉換後再存入 DB,就不會有截斷跟 retweet 亂碼的問題了。因為要存入 UTF-8 字串的關係,所以我也將 TweetSuite 會自動建立的資料表都設定為 DEFAULT CHARSET=utf8; 。
  4. 接下來的幾項都是比較不嚴重的問題,純粹是使用上或美觀上的部份。TweetSuite 去抓取 TweetBacks 時會抓推文作者的顯示圖片 url,然後將圖片的 url 存在資料庫中;原本的機制是如果這個 tweet 已經存在資料庫中,下次更新的時候就不會去更動他;所以如果作者換了顯示圖片之後,TweetSuite 也不會更新,然後就會產生破圖了:在 Firefox 上看會導致推文往前縮,在 IE 上看則是會有叉燒包。所以我先將顯示圖片的 HTML 從 <img> 改成一個相同大小的 <div>,然後將原本的圖片設為這 <div> 的底圖,如此一來如果抓不到圖片,也不會往前縮或產生叉燒包,只會留有一個白色灰框的四方形區塊,推文也就比較整齊了。再來就是 TweetSuite 每次去搜尋 TweetBacks 時並不會預先排除已經存在資料庫的部份,只是在搜尋過後要寫入時,才禁止已經存在的資料再一次寫入,所以我將這部分小改一點,改成:如果已經存在,就更新這一篇推文的作者顯示圖片,這樣就可以確保推文作者更新圖片後我們這邊的資料也可以更新的到,但是這個功能只有 MySQL 4.1 或更新的版本可以使用。
  5. TweetSuite 的設定選項中有一項是 “Display Tweet-This button?",但是他只能控制文章上方的那個大按鈕而已,並不會連帶影響 TweetBacks 附帶的 Tweet This 連結。我自己是覺得這樣很怪,所以就把 TweetBacks 的 Tweet This 連結跟這個選項也綁在一起了。
  6. TweetBack 顯示的推文時間都是 UTC 時間,這個問題我曾經在 tenz 的這篇文章中看過,不過那時他用的應該是單獨的 TweetBacks JavaScript 版本,所以可能也不是很好調整;由於 TweetSuite 是用 plugin 的方式,所以我就可以先抓取這個 blog 所設定的時區,將加上原本 UTC 的時間換算後再輸出,這樣推文時間看起來就不會怪怪的了。

對我的 patch 有興趣的人,可以在這裡 Download, 裡面的檔案只有我修改過的部份,所以請先到原作者的網站抓回原始的檔案,再將我修改過的部份覆蓋過去即可。對我的修改有任何問題的話,也歡迎在這裡提問喔。

post this page to twitter via twitthat

4 Total TweetBacks:
  • OOBE: Looking at: "TweetSuite Patch « Kej.tw Revisited" ( http://tinyurl.com/93xpmd ) 2009/04/02 06:51 am
  • carrielis: 閱讀: "TweetSuite Patch « Kej.tw Revisited" ( http://tinyurl.com/93xpmd ) 2009/04/02 03:52 am
  • tzangms: Cool! "TweetSuite Patch « Kej.tw Revisited" ( http://tinyurl.com/93xpmd ) 2009/01/17 03:16 pm
  • kej: 剛寫完: "TweetSuite Patch « Kej.tw Revisited" ( http://tinyurl.com/93xpmd ) 2009/01/17 03:14 pm
  1. Joel Lee 說道:

    小建議:Twitter API 的搜尋可以回傳 JSON ,他們還說讓他們回傳 JSON 會比較快, JSON 要 Parse 也比較容易, PHP 5 預設內建 json_decode() 可以用。

    • Kej 說道:

      而且 JSON 的回傳檔案也比較小…

      我之前沒考慮到這點,因為本來也只是想說就依照作者原本的架構做一些修改跟調整而已。改成 JSON 好像不錯,我會再來修改一下。

All comments are screened for appropriateness. Commenting is a privilege, not a right. Good comments will be cherished, bad comments will be deleted.

    follow me on Twitter