用python开发各种云服务的alfred的workflow

2014-09-04 17:43

其实alfred的workflow与微信公众号的开发者接口是一样的功能。alfred与微信都是人与机的IO接口。input是人输入的query。output是alfred与微信回复的内容,这个内容带着链接,轻轻那么一点就进入了浩瀚如海的互联网世界。但已经是准备定位的内容。

那就是说alfred的workflow与微信的公众号还是在解决互联网信息的搜索找资料的作用。并且能在alfred当workflow用基本也就能在微信公众号上使用了。

为了能用python开发alfred的workflow,采集各种云服务的数据或者工具,这里面搞清楚三个问题。

首先是python这个语言

Python的特色

简单

Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。

易学

就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简单的语法。

免费、开源

Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。这是为什么Python如此优秀的原因之一——它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。

高层语言

当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。

可移植性

由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在下述任何平台上面运行。

这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC!

解释性

这一点需要一些解释。

一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。

而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码 运行 程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。

面向对象

Python即支持面向过程的编程也支持面向对象的编程。在 面向过程 的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在 面向对象 的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。

可扩展性

如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。

可嵌入性

你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。

丰富的库

Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。

除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

好吧,我看中python的是他丰富的库,并且是自带标准库就能解决互联网编程大部分问题,其次是他的解释脚本性就像bash,像写脚本一样写程序来解决想解决的问题。

什么叫解析性

➜ meanapp git:(master) python

Python 2.7.5 (default, Mar 9 2014, 22:15:05)

[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> print("hello world")
hello world

这就叫解析性跟shell一样的使用

什么叫强大的标准库

import httplib,urllib

from time import localtime,strftime

import psutil,time

params=urllib.urlencode({'field1':psutil.cpu_percent(),'field2':psutil.avail_phymem()/1000000,'key':'XKAX0DZFRFXMO6VU'})

headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}

conn = httplib.HTTPConnection("api.thingspeak.com")

conn.request("POST", "/update", params, headers)

这样就实现把当前计算机的CPU温度与负载按thingspeak的RUSTAPI规范提供到了

也就是以程序的形式实现了命令行

curl --post http://api.thingspeak.com/update?fields1=cpu温度&field2=cpu负载&key=XKAX0DZFRFXMO6VU
功效,里面用到强大标准库httplib与第三方库psutil,用import引入整个库,用from XX import来引入具体要用的某个值。而找库的顺序是在sys.path变量中所列目录中寻找库.py或者库.syc文件。

从上面两个案例也可以看出语法,没有分号,一行一行的写就行,括号带参数,冒号开始一段语言块,语言块靠缩进来规定开始与结束。相同的缩进为一个语言块,所以在写python语句里一定只要采用空格或者制表符一种缩进手法。避免混乱。这是与其他语言不同的地方
image
从上面这个例子可以看出 doit这个函数是一个制表符缩进,而函数里面的try是两个制表符。而到主程序,ture下也是第二层执行。反正每个冒号后面的属于一个语言块要保持统一的缩进。
同时也可以看到变量在python里面不需要定义,变量的范围也在语言块的范围里面了,要用全局变量就用global关键字了。

字符串用单引号,双引号,三引号随意,#做单行注释,第一行用#!/usr/bin/python 告诉计算机器用嘛解释器

其实是alfred的workflow

为什么python第一个练习是选workflow来练,就是因为alfred的workflow足够简单,简单到什么教程都没有。

神马教程都没有,那怎么学习开始呢,抄已有的workflow,workflow导入alfred后都是开源的,并且官方也有很多例程。你可以详细的看每一个workflow实现的代码。python实现的多的很。
image
当然alfred也支持bash, zsh, PHP, Ruby, Python, Perl, Apple Script这些语言,通过apple script还可以调用mac automator。
image

其实核心思想就是如果你想直接在alfred的框里显示就要把取的内容组织成XML输出;如果你结果是想open URL或者执行一个mac动作,那就直接执行就可以了。同时还可以有拷贝到剪贴板,给个提醒或者运行一段脚本的输出。

最后才是各种云服务

alfred的workflow首先执行的是mac本机的各种自动化操作,但在互联网时代,mac随时随地都需要与各种互联网资源发动互动。比如我写的文章都在dropbox上,各种文件也都存放在云盘上。代码也都存放在github上,需要随时取个issue什么的。随时需要用google找信息。自己的行事历也同步在google日历上。

这些信息自然可以通过浏览器打开相应的网站来享受服务,但做mac的开门的利器alfred,常用的东西自然要整到alfred来。比如每天的知乎日报,查找某个github的resposity。查个天气预报,PM2.5.

image

上面图例是smzdm网站取当天最前优惠的python实现,先是getitems(uri)对象实现取json格式数据(大部分网站是以json格式提供数据),然后把API地址传递给getitems,最后把结果print给alfred显示框。像知乎,github,v2ex等等大部分网站都可以稍微修改下getitems对象的具体值来实现条目的展现。

请非常注意在sublime专门为python语言做缩进对应,没错就是那一条竖线。