Blackbing Playground

Download Facebook album's photos

https://chrome.google.com/extensions/detail/blbmhonenddnnmbailokbccgmikhkpni

My girl friend want to download her friend’s whole photos on her facebook, so I write a tool for her.


Usage:

  1. Link to the album on your facebook page.
  2. Click the “Download FB phtos” Icon.
  3. You will see all photos on a new tab.
  4. Press “Ctrl+S” and select “Save whole pages”.
  5. Great! You will see a folder including all the photos in this album.

    Cheers!



    聊聊這個小工具的開發心得,首先,我不想花太多時間做這個工具,之前有CCN大大開發了一個抓無名相簿的工具WretchXD,開發的非常好,但一般這種抓圖程式都會遇到被host來源封鎖、擋掉、當成惡意攻擊等奇怪的事情,我不想為了做這種事情,去挑戰臉書的server。其次,我不想做成應用程式,還需要登入、使用graphAPI,為了抓一個相簿,還要挑來挑去,那我乾脆開發一個fb相簿瀏覽器了XD。



    總歸一句就是懶,於是我把腦筋動到google chrome身上,只要我可以parse出縮圖與大圖的規則,就可以拿到一串URL了,稍微測試了一下果然可以。



    縮圖URL:http://photos-c.ak.fbcdn.net/hphotos-ak-ash2/62450_1517231263867_1627073717_1243192_8144805_a.jpg

原始URL:http://photos-c.ak.fbcdn.net/hphotos-ak-ash2/62450_1517231263867_1627073717_1243192_8144805_n.jpg


相當簡單,只差了一個字元而已,於是我開始思考一下這個工具的操作流程:瀏覽FB縮圖,按下按鈕,取得所有連結…..取得所有連結之後咧?使用wget來下載所有連結?windows上還要安裝wget!?而且因為下載的動作已經與瀏覽器的動作分開了,也有可能因為權限問題被擋掉?就在這個moment,我想到了chrome.tabs.create,將所有圖檔load到新分頁裡頭,我就可以利用瀏覽器的「另存新檔」功能來存放所有圖片,非常好,流程不難,「萬事具備,只欠Coding」,最困難的部份在於如何將資料傳入new tab,看起來是安全性的問題不能任意存取tab物件,不過最後我還是繞道解決了,以後再查查看有沒有正規一點的作法來改進。


那麼,使用有什麼bug歡迎回報


Download Facebook album’s photos



2011/04/12 更新日誌:
由於之前懶得查chrome extension API, 在與new tab溝通時,我是用暴力方式將資料塞入window 裡頭,原以為這樣可以正常運作,但發佈出去才發現有眾多的問題存在,因此決定好好survey API, 原來在做message passing時有更好的方式來呼叫,請參考「Message Passing」利用chrome.tabs.sendRequest也可以指定要將參數傳入特定的tab,再該tab裡頭榜入相對應的事件。部份範例code如下:


[sourcecode language=”javascript”]
//=============in click action =====================================
chrome.tabs.create({ url:chrome.extension.getURL(‘./fbphotos.html’), index:(currentTab.index), selected:true }, function(tab){
//指定tab id, 並傳入req
chrome.tabs.sendRequest(tab.id, req);
});

//=============in new tab page====================================
//榜定事件接收資料。
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
loadData(request);
});
[/sourcecode]

2011/7/5 update, 感謝網友更詳細的介紹,相形之下我好懶XD