花瓣是國內最大的圖片分享網站,部分用戶長期以來都有對我的主頁的畫板按字母順序進行歸檔的需求,但花瓣官方一直沒有支持這個能力。chrome
最近寫了個油猴腳本用於按字母順序歸檔主頁畫板。json
僅供學習交流。canvas
注:因爲我本身沒幾個畫板,爲了進行演示,這個圖是我在別人的主頁截取的。實際上使用這個工具時只在本身的主頁生效。跨域
關閉/卸載app
容易看到花瓣分段拉取畫板的url形如http://huaban.com/xxx/?jp4z1e1x&limit=10&wfl=1&max=42190948
jp4z1e1x
這段每次請求是自增的,大概是個sequence之類的東西。chrome查看請求的initiator,點進去能夠看到調用的是String.uniqueID
,搜一下具體實現是函數
var m = Date.now(); String.extend("uniqueID", function() { return (m++).toString(36) })
跟猜想一致。不過這裏我實際上不須要關注它的實現細節。油猴腳本是能夠訪問到同樣的類型和函數的。
另外這裏對請求的header也有要求,須要設置一下工具
xmlHttp.setRequestHeader("X-Request", 'JSON'); xmlHttp.setRequestHeader("X-Requested-With", 'XMLHttpRequest'); xmlHttp.setRequestHeader("Accept", 'application/json');
最後把limit字段調成須要的大小就行了。性能
一開始爲了展現小圖片,用的是background-image
,學習
background-size: cover; background-repeat: no-repeat; background-position: 50% 50%;
結果發現滾動的時候會卡。
跑了一下性能工具,發現主要是渲染耗時。
改爲<img>
標籤性能會好一些,可是仍是有點卡。
那麼就只能去處理原始圖片了。
一開始想的是經過canvas放縮、裁剪圖片,再傳給img標籤。可是花瓣的圖片是禁止跨域的,就是說雖然能夠正常展現,可是用canvas去編輯是不行的。優化
最後發現,花瓣的圖片用的是又拍雲存的。又拍、七牛這些,都容許針對圖片連接加點後綴返回指定的圖片。這裏用_/both/50x50
使得拿到的圖片限定大小50*50。使用原始大小的img,一個頁面就算有幾百張圖,也一點都不卡了。
花瓣有定義一些本身的快捷鍵。好比按T
會跳到頁面頂部。這和我須要的跳到對應首字母分類的位置是矛盾的。
原本原有的時間監聽咱們是沒法處理的,不過所幸花瓣把大量接口暴露在window.app
變量裏,找了一下相關的有window.app.hotkey.keyboard.$events
和window.app.hotkey.keyboard.options.events
,索性直接置爲{}
,花瓣的快捷鍵邏輯就沒了。