用 Node.js 把玩一番 Alfred Workflow

本文首發(fā)在個人博客:http://muyunyun.cn/posts/4c23be51/

插件地址(集成Github榨婆、掘金顺少、知乎枢赔、淘寶等搜索)

作為 Mac 上常年位居神器榜第一位的軟件來說桅咆,Alfred 給我們帶來的便利是不言而喻的括授,其中 workflow(工作流) 功不可沒,在它上面可以輕松地查找任何 api;可以快速在豆瓣上搜到自己喜歡的電影荚虚、圖書薛夜、音樂;可以快速把圖片上傳到圖床 等等版述。

一些安利

附上一張個人裝著的插件的截圖梯澜。Caffeinate 插件能在指定時間使電腦不黑屏;在 Dash 插件上能輕松查任何文檔渴析;Youdao Translate 插件比系統(tǒng)自帶的翻譯方便許多腊徙。插件也是因人而異,大家可以在 Workflow List 上逛逛檬某,各取所需。

在用了別人的插件感覺高大上后螟蝙,便萌發(fā)了也寫一個插件的想法恢恼,計劃把自己常逛的網(wǎng)站集合成一個插件,使用特定的縮略詞便可快速進行搜索數(shù)據(jù)胰默,又看了官方稱可以使用 bash, zsh, PHP, Ruby, Python, Perl, Apple Script 開發(fā) Alfred Workflow场斑。于是我選擇了 Node.js 作為開發(fā)語言,開發(fā)了一款 commonSearch, 開發(fā)完效果如下(集成了Github牵署、掘金漏隐、知乎、淘寶等搜索)奴迅。

開發(fā)階段

在開發(fā)前青责,得先對一些特定的操作步驟和知識點有一定的認知,這樣開發(fā)時就基本上沒有大礙了取具。

前置步驟

可以先參考 如何去寫一個第三方的 workflow 的開始部分, 完成基本工作流的搭建脖隶,如下圖是我搭建好的基本工作流連線。

在 Script 中暇检,可以看到 /usr/local/bin/node common_search.js 相當于就是在調(diào)用該插件的時候起了一個 node 服務(wù)产阱,后面的 1 是為了區(qū)分當前調(diào)用的是哪個搜索手動傳入 common_search.js 的,{query} 則是用戶查詢的名稱块仆。

使用 Node.js 調(diào)用 JSON API

最初開發(fā)參考了 知乎搜索 這個項目构蹬,它是基于 cheerio 這個模塊對請求到的網(wǎng)頁數(shù)據(jù)進行分析爬取,但是引入了 cheerio 后悔据,插件體積多了 2M 多庄敛,這對于一個插件來說太不友好了,所以這可能是 python 之類的語言更適合開發(fā)類似插件的原因吧(猜想:python 不需要引人第三方庫就能進行爬蟲)蜜暑,于是我開始選擇提供 JSON API 的接口铐姚,比如找尋掘金返回數(shù)據(jù)的接口。首先打開 chrome 控制臺,這可能對前端工程師比較熟悉了隐绵。

從而找到了掘金返回搜索數(shù)據(jù)的接口是 https://search-merger-ms.juejin.im/v1/search?query={query}&page=0&raw_result=false&src=web

接著愉快地使用 node 提供的 https 模塊之众,這里有一個注意點,http.get() 回調(diào)中的 res 參數(shù)不是正文依许,而是 http.ClientResponse 對象棺禾,所以我們需要組裝內(nèi)容秸架。

var options = {
    host: 'search-merger-ms.juejin.im',
    path: '/v1/search?query=' + encodeURI(keyword) + '&page=0&raw_result=false&src=web'
  }
  https.get(options, function (res) {
    res.on('data', (chunk) => {
      var content += chunk
    }).on('end', function () {
      var jsonContent = JSON.parse(content) && JSON.parse(content).d
      var result_array = []
      for (var i = 0; i < jsonContent.length; i++) {
        if (jsonContent[i].user.jobTitle === '') {
          result_array.push({
            title:
            subtitle:
            arg:
            icon: {
              path: join(__dirname, 'xx.png'),
            },
            mods: {
              cmd: {}
            }
          })
        }
      }
      content = ''
      console.log(JSON.stringify({
        items: result_array
      }))
    })
  })

這種方法應(yīng)該是最直接的調(diào)用 JSON API 的方案了李命,當然也可以引人第三方模塊 request 后解析 JSON拌喉,示例如下:

var request = require('request')

var url = 'search-merger-ms.juejin.im/v1/search?query=' + encodeURI(keyword) + '&page=0&raw_result=false&src=web'

request.get({
    url: url,
    json: true,
    headers: {'User-Agent': 'request'}
  }, (err, res, data) => {
    if (err) {
      console.log('Error:', err);
    } else if (res.statusCode !== 200) {
      console.log('Status:', res.statusCode);
    } else {
      // data is already parsed as JSON:
      console.log(data.html_url);
    }
});

還有一點要注意的是返回值的字段是固定的蚕礼,具體可以參考它的官方解釋镀岛,琢磨了好久才把 JS 中的 Icon 自定義的格式找出來饲齐。

title: 主標題
subtitle: 內(nèi)容行
arg: 跳轉(zhuǎn)鏈接
icons: 圖標
mods:定制鍵盤按鍵的方法

對于 Github缓窜、掘金藤违、知乎拯刁、淘寶的搜索都是基于以上思路進行開發(fā)的脊岳,就是對于具體返回的 JSON 數(shù)據(jù)進行了不同處理,雖然粗糙垛玻,但也算完成了第一個 Alfred Workflow 插件的開發(fā)割捅。

尾聲

本文的知識點寫的不是特別豐滿,一是就是對開發(fā)這個插件的小結(jié)帚桩,另外就是拋磚引玉了亿驾,能讓更多的小伙伴了解開發(fā)一個插件并不是難事,同時讓更多的朋友開發(fā)出更多有意義账嚎,有趣的 alfred-workflow 插件也算是本文分享的一個初衷了莫瞬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市醉锄,隨后出現(xiàn)的幾起案子乏悄,更是在濱河造成了極大的恐慌,老刑警劉巖恳不,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檩小,死亡現(xiàn)場離奇詭異,居然都是意外死亡烟勋,警方通過查閱死者的電腦和手機规求,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卵惦,“玉大人阻肿,你說我怎么就攤上這事【谀颍” “怎么了丛塌?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵较解,是天一觀的道長。 經(jīng)常有香客問我赴邻,道長印衔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任姥敛,我火速辦了婚禮奸焙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彤敛。我一直安慰自己与帆,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布墨榄。 她就那樣靜靜地躺著玄糟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袄秩。 梳的紋絲不亂的頭發(fā)上茶凳,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音播揪,去河邊找鬼。 笑死筒狠,一個胖子當著我的面吹牛猪狈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辩恼,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雇庙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灶伊?” 一聲冷哼從身側(cè)響起疆前,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎聘萨,沒想到半個月后竹椒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡米辐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年胸完,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翘贮。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赊窥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狸页,到底是詐尸還是另有隱情锨能,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站址遇,受9級特大地震影響熄阻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜傲隶,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一饺律、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跺株,春花似錦复濒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袖扛,卻和暖如春砸泛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛆封。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工唇礁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惨篱。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓盏筐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砸讳。 傳聞我的和親對象是個殘疾皇子琢融,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評論 25 707
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實...
    香橙柚子閱讀 23,864評論 8 183
  • 讀書是自己充實簿寂,參學自得亦是自己充實漾抬。精神之充實之外體力要充實。充實即飽滿常遂,飽滿則充溢纳令,然后結(jié)果自然流露】烁欤…人要自...
    勉強家閱讀 533評論 0 2
  • 什么是構(gòu)建生命周期 構(gòu)建生命周期是一組階段的序列(sequence of phases)泊碑,每個階段定義了目標被執(zhí)行...
    小孩真笨閱讀 270評論 0 0