1. 程式人生 > >記一個上傳圖片到圖床利器插件的實現(Mac版 開源)

記一個上傳圖片到圖床利器插件的實現(Mac版 開源)

rwx 興趣 lse 技術分享 clas putextra 直接 put else

Mac版上傳圖片利器插件的實現

鑒於寫博客截圖手動上傳到圖床的步驟過於繁瑣,很久之前寫了一個windows版的截圖軟件插件,用於把圖片快速上傳到圖床

重新打包用戶量過億的開源截圖軟件——加入圖片自動上傳到圖床的功能

現在換系統了,由windows換成了Mac,系統確實好用,但截圖上傳到圖床的功能沒法子弄過來,網上搜了下現成的軟件,都不太好用。Mac免費軟件不像windows那麽多。在windows系統上是在Greenshot的基礎上實現的七牛圖床插件,這個軟件在Mac下也有,但是不開源。周末了,決定自己研究一下,實現一個mac版的上傳到七牛圖床的軟件插件。好了,先上最終效果圖:

技術分享圖片

選擇一款mac版開源截圖軟件

選擇的截圖軟件需要滿足兩個條件:

  • 一個是易用性,界面友好
  • 另外一個是這個軟件要支持插件

google了一下,搜了幾個,最後覺的katana這個軟件還不錯。

技術分享圖片

技術分享圖片

雖然功能簡單了點,但界面做的比較專業,而且支持service,上面的imgur是一個國外的免費的圖床服務。好了,就在這上面整吧。

研究打包

這個軟件是用Javascript寫的,才知道用javascrpit還能做出Mac的app,開發工具選擇使用WebStorm。研究源碼的時候一般是邊操作軟件,邊看代碼,大概把整個軟件輪廓和相關的細節了解了一下。

接下來比較棘手的其實是如何把源碼打包成mac app,把github上打包好的軟件下載下來研究了一番。看一下它的目錄結構,看到了Framework這個文件夾,進到裏面看一下:

drwxr-xr-x  6 zexu  staff   192B  6 24 16:48 Electron Framework.framework
drwxr-xr-x  3 zexu  staff    96B  6 24 16:48 Katana Helper EH.app
drwxr-xr-x  3 zexu  staff    96B  6 24 16:48 Katana Helper NP.app
drwxr-xr-x  3 zexu  staff    96B  6 24 16:48 Katana Helper.app
drwxr-xr-x  7 zexu  staff   224B  6 24 16:48 Mantle.framework
drwxr-xr-x  7 zexu  staff   224B  6 24 16:48 ReactiveCocoa.framework
drwxr-xr-x  7 zexu  staff   224B  6 24 16:48 Squirrel.framework

看到了Electron這個東西,接著google,下面是官網的介紹:

使用 JavaScript, HTML 和 CSS 構建跨平臺的桌面應用

看到package.json下面有下面幾個依賴包:

  "devDependencies": {
    "electron": "^2.0.3",
    "electron-packager": "^12.0.2",
    "standard": "^11.0.1"
  }

應該就是它了,用的是electron框架打包的app。

安裝依賴

npm install 

把所有依賴包安裝到本地,然後cd到項目根目錄執行下面的命令:

zexudeMacBook-Pro:katana zexu$ electron-packager . --overwrite --platform=darwin --arch=x64 --icon=./app/static/images/icon.icns --prune=true --out=release-builds
  • 註意,我把electron-packager 進行全局安裝了。

就一條命令,打包就成了,竟然如此簡潔。

研究源碼和功能實現

先把qiniu的npm包裝上:

npm install qiniu --save

為這個軟件寫插件需要寫css,html和一寫js的功能函數。一個軟件的功能很多,但要快速聚焦到相關的功能點,有時候光看代碼的效率實在是低。把代碼跑起來,看一些log輸出是不錯的快速熟悉代碼的方法。

如何才能debug呢。看下圖,按照紅色字體添加一個新的Debug Configurations:

技術分享圖片

網上說解釋器的路徑要寫成下面這樣:

~/github/katana/node_modules/.bin/electron

試了半天沒有成功,發現這個文件是一個軟鏈,指向的是上圖中的解釋器路徑,所以直接寫成圖片上的路徑。網上的帖子說設置好之後是可以加斷點調試的。試了幾次沒有成功,這個軟件應該是多進程的,應該和這個有關。log到是能看了,但有些Log不能打印到控制臺上,還是多進程的問題,最後找到了解決方法,使用下面的變量來打印log:

const con = require('electron').remote.getGlobal('console')

軟件的整個工作流程是下面這樣的:

  • 把AK,SK,Scope和Default Domain配置好,不熟悉這幾個參數的參考windows版的軟件配置。

技術分享圖片

  • save之後這些參數應該是持久化到文件中了,具體沒有研究。
  • 截圖的時候,先調用Mac的截圖接口,生成截圖文件保存到如下路徑中:

    ~/.katana/uploads
  • 最後調用qiniu的接口把文件上傳到七牛圖床。

具體代碼細節就不介紹了,感興趣自己去github看吧。qiniu的官方文檔感覺比較亂。研究了一些時間,把這段代碼貼一下:

const ak = _qiniuService.accessKey
const sk = _qiniuService.secretKey
const sc = _qiniuService.Scope
const dm = _qiniuService.defaultDomain

var key = path.basename(file)
var mdpath = '![](' + path.join(dm, key) + ')'
const link = {link: mdpath}

var mac = new qiniu.auth.digest.Mac(ak, sk)
var options = {
  scope: sc + ':' + key,
  expires: 0
}
var putPolicy = new qiniu.rs.PutPolicy(options)
var uploadToken = putPolicy.uploadToken(mac)
var config = new qiniu.conf.Config()

config.zone = qiniu.zone.Zone_z1
var formUploader = new qiniu.form_up.FormUploader(config)
var putExtra = new qiniu.form_up.PutExtra()

formUploader.putFile(uploadToken, key, file, putExtra, function ( respErr, respBody, respInfo) {
  console.log('status:' + respInfo.statusCode)
  if (respErr) {
    callback(null, respErr)
    throw respErr
  }
  if (respInfo.statusCode === 200) {
    callback(link)
    console.log(respBody)
  } else {
    console.log(respInfo.statusCode)
    console.log(respBody)
    //callback(link)
  }
})

Download

給一個打包好的鏈接,感興趣的可以玩一下:

鏈接:https://pan.baidu.com/s/1JEej70eO5FCqF6CibOmdLQ 密碼:qnq7

源碼鏈接,在dev分支上開發的:

https://github.com/harlanc/katana

記一個上傳圖片到圖床利器插件的實現(Mac版 開源)