Python新手也會寫的Alfred Workflow

weixin_34378969發表於2016-12-08
22359-88efea25212ef15d.jpg

Alfred的是公認的MacBook效率神器,入坑Mac這麼久用了很多別人寫的workflow覺著真心不錯。學了一點python終於可以寫個簡單的workflow了,先上效果圖:

22359-4e92dc8271816fb0.png
先上效果圖

關於Alfred的介紹可以看看 少數派的系列文章:關於Alfred的文章

準備工作:

1.MacBook + Alfred 2或3 + Alfred Powerpack
2.下載 deanishe 的python alfred 框架deanishe alfred,我們可以用他造的輪子完成我們自己的workflow了。
3.註冊和風天氣和風天氣官網,用天氣API獲取我們要在alfred輸出的天氣資料。

步驟:

1.新建個空白的workflow:


22359-61d2f2a6d3531de1.png
新建空白的workflow

2.選中剛才新建的workflow,右邊空白區域右鍵選擇 Inputs-Scripts,會彈出一個新的設定視窗:

22359-34ffb00ca51bc8b2.png

keyword:在alfred裡輸入這個值,就會調起這個script;
Language:這裡是指指令碼使用的程式語言,雖然我們用的是python,但是為了便於除錯,建議還是用bash呼叫自己寫的指令碼。

3.開啟這個workflow的位置

22359-01bb604328fe5212.png
在finder裡面開啟workflow

4.把deanishe 的workflow框架和自己的.py指令碼放在這個資料夾。

# -*- coding:utf-8 -*-
import json,sys
from datetime import datetime
from workflow import Workflow, web

reload(sys) # Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入
sys.setdefaultencoding('utf-8')

#這個是和風天氣的API key,替換成你自己的就行
API_KEY = '你的API_KEY'

#返回某日是星期幾
def the_day(num):
    week = ['星期一','星期二','星期三','星期四','星期五','星期六','星期日']
    return week[num]

def main(wf):
    url = 'https://free-api.heweather.com/x3/weather?cityid=CN101010100&key=' + API_KEY
    #這裡用了deanishe 的框架裡面的web模組來請求頁面,web模組類似requests庫
    r = web.get(url=url)
    r.raise_for_status()
    resp = r.text
    data = json.loads(resp)

    d = data['HeWeather data service 3.0'][0]
    city = d['basic']['city']

    #獲取一週內的資料
    for n in range(0,7):
        day = d['daily_forecast'][n]
    #把API獲取的天氣、溫度、風力等資訊拼接成 alfred條目的標題、副標題
        title = city + '\t' + the_day(datetime.weekday(datetime.strptime(day['date'],'%Y-%m-%d')))+ '\t' +day['cond']['txt_d']
        subtitle = '白天 {weather_day}|' \
                   '夜間 {weather_night} |' \
                   ' {tmp_low}~{tmp_high}攝氏度|' \
                   ' {wind_dir} {wind_sc}'.format(
            weather_day = day['cond']['txt_d'],
            weather_night = day['cond']['txt_n'],
            tmp_high = day['tmp']['max'],
            tmp_low = day['tmp']['min'],
            wind_sc = day['wind']['sc'],
            wind_dir = day['wind']['dir']
        )
    #向alfred新增條目,傳標題、副標題、圖片路徑(圖片直接用的和風天氣提供的天氣圖,每個圖片的命名對應天氣狀態碼)
        wf.add_item(title=title,subtitle=subtitle,icon='images/{code}.png'.format(code = day['cond']['code_d']))

    wf.send_feedback()

if __name__ == '__main__':
    wf = Workflow()
    sys.exit(wf.run(main))

5.天氣的icon放在workflow所在的資料夾
6.給你的workflow新增一個版本檔案

22359-218a3cf8898b945b.png
結構.png

7.在Alfred中除錯workflow

22359-686204679c6f1a48.png
搞定收工

程式碼不完善的地方歡迎留言討論,如果您覺得這篇文章對您有幫助請點個贊喲。

相關文章