标签归档:python

微博比特币价格机器人

前几天看到 twitter 上有一个机器人帐号 btcprice , 会定时报告各大交易所上比特币的最新成交价,觉得蛮有意思的,不用盯盘了,刷刷微博就能跟踪行情。心想微博上应该也应该有类似的帐号,搜了一下,竟然没有,所以就在微博上把 btcprice 注册了。今天有空折腾了几个小时,现在看起来似乎可用了,微博地址:http://weibo.com/btcprice  欢迎关注,目前只提供了 OkCoin 的数据。

做这样一个微博机器人其实很简单,类似的帐号有古城钟楼,这个帐号每个时辰报一次时间。据作者微博称,为了实现这个功能,写了三万多行代码。有点夸张了,不知道古城钟楼还有什么特殊能力?btcprice 这个帐号所有代码只有 48 行,实现一个微博机器人没有想象的那么难。

首先需要到 http://open.weibo.com/ 注册成为开发者,建议使用你注册的机器人帐号登录,这样会方便些。创建一个应用,类型选择网页应用。创建完成后,会获得 App Key 和 App Secret,其实对于机器人帐号来说,这两个字段没太大用处。应用审核通过需要提交开发者实名认证信息,但不审核也不影响调用微博发表接口。不过没有通过审核的应用,状态为测试中,授权的帐号只有1天的有效期。不过据称,对于开发者的帐号,授权有效期为5年。这就不需要担心授权过期的问题了。

发表微的API: http://open.weibo.com/wiki/2/statuses/update 对于一个机器人帐号来说,填两个参数就够了,一个是 status 就是要发表的微博消息,还有一个是 access_token。我一开始就卡在获取 access_token 上了。根据文档,access_token 必须通过 OAuth2.0 获取,而实现一个OAuth2.0 流程还挺麻烦的,况且机器人帐号只需要一次性授权拿到 access_token 就好了,最好有现成的东西可以获取。我想到一个办法是:在我的 wordpress 上安装一个社会化插件,填上在创建应时是获取的 App key 和 App Secret,然后用机器人微博帐号登录到自己的博客上,博客插件应该会通过某种方式把 access_token 保存起来,拿到 access_token 就万事大吉了。不过不知道什么问题,总是授权失败。Google 了一下可能是应用地址设置的问题,和回调地址不匹配。遂改了应用地址,但需要一段时间来生效。后来,看到微博开放平台上有一个API测试工具,http://open.weibo.com/tools/console 点进去就看到开发者自己的  access_token 了,真是踏破铁鞋无觅处得来全不费工夫。

获取比特币最新成交价格通过 OkCoin 的行情API获取 https://www.okcoin.com/t-1000052.html。接口返回的是一段 json 数据,使用 Python 中的 json 模块处理。Python 代码如下:

import urllib2
import json

def get_okcoin_btc_price():
        url = 'https://www.okcoin.com/api/ticker.do'
        r = urllib2.urlopen(url)
        data = json.loads(r.read())
        return float(data['ticker']['last'])

获取到价格后格式化消息体,然后调用微博的发表接口发布微博,Python 代码:

import urllib
import urllib2

        post_data = urllib.urlencode({'access_token' : access_token, 'status' : msg.encode('utf-8') })
        post_url = 'https://api.weibo.com/2/statuses/update.json'
        r = urllib2.urlopen(post_url, post_data);

完整代码可以在 github 上查看:https://github.com/haipome/btcprice/blob/master/btcprice_update.py

最后设置 crontab 每隔 30 分钟更新一次,程序部署在我的位于日本 linode 上。

TODO:

  1. 添加其他交易所数据
  2. 比特币价格监控,有大的波动时发表微博

毕业设计

今天上午进行了毕业设计答辩,很顺利的结束了。这也意味着我大学生涯的最后一门课程的完成,马上就要毕业了。

我的毕业设计就是我做的 newsnavig.com 这个网站,题目取为《SNS网站的研究与实现》。虽然学的是数学,但导师并没有要求一定要和数学相关。一开始做这个项目并不是当作毕业设计来做的,纯粹是个人的兴趣。还有为了打法这学期无聊的时光,因为我在上学期的时候就把毕业设计完成了。是的,后来我把毕业设计改了,抛弃了原来的,重新写了一篇论文。当时自己是觉得这个项目更酷些,加上有的是时间。现在想想,确实如导师所说,这是一个不明智的决定。

Newsnavig 目前完成的只能说是个原型。开发使用的是流行的 LAMP (Linux + Apache + Mysql + Python) 组合,后台用的 Django 框架是现学的,在开始写代码前花了将近两周的时间去看官方英文文档。再加上初期设计不周,代码写的有点混乱,有时间的话准备彻底重构一次。前端用了 twitter 的 Bootstrap 框架,用起来还算顺手,几乎不用怎么去写 CSS 和 JS 就实现了一个看起来还算可以的界面,风格上借鉴了知乎和豆瓣。此外,还用到了 Memcached 用来缓存。

如果从产品或运营角度来说,Newsnavig 无疑是失败的,刚上线时在几个技术论坛发了链接,但带来的只是上百个僵尸帐号。为了让它看起来还没死掉,我每天也会发一些链接上去,主要是自己看 GR 时感觉好的文章。最初是想模仿 HackNews 和 Reddit, 加入社会化的特征,所以发布界面也类似。但通过自己的使用和写作论文时的一些思考,Newsnavig 和它们虽然都是网址分享,但还是很不同的东西。设想的 Newsnavig 使用场景是:看到一个不错的网页,顺手分享,顺便添加一些话题和评论。但现在交互太差了,一般情况下发布一条链接需要在两个网页之间切换数次进行复制粘贴。所以在下一版本中准备加入快速发布书签和浏览器插件。还准备把名字改了,更贴切的描述该网站,已经想好,暂不公布。

但把这个项目写成论文就有点麻烦了,本来准备详细写技术方面的东西。但技术这东西,写复杂了难,写简单了也难,还不如直接看代码。还有导师一再强调,论文要提取出科学问题,而不仅仅是解决一个普通的问题。所以在论文中提出了一个“协同过滤”的概念,当然这个名词不是我发明的。论文只用了不到三分之一的篇幅写了技术方面的东西。毕设论文就不公开了,感觉上面全是废话,至少有一半是复制粘贴过来的,很多来自维基百科,只是为了凑字数。如果你对 Newsnavig 感兴趣,直接看代码吧:https://github.com/haipome/Newsnavig 没打算做成开源项目,只是为了备份代码。

原来的比设项目是给一个空军工程大学的教授做一个数据分析软件,他和我的导师有合作关系。这个项目简单的说就是通过分析一些模拟飞行游戏 Lock On 的轨迹数据,计算得出一些关心的统计数据。软件要求能够批量的读入数据,图形化的界面展示。轨迹数据是文本文件,格式:http://lomac.strasoftware.com/tacview-flight-recordings.php 数据分析很简单,就是字符串的分析处理,再加上一些简单的高中物理知识。难点就在图形化的界面上,之前没有做过着方面的东西。最后用了 python 和 QT, 也是现学现用,做的还像个样子。当然,代码也是公开的:https://github.com/haipome/acmia

上午答辩过程中,五分钟陈述,然后三个评审老师只有一个老师问了一个很简单的问题,顺利通过。接下来坐等毕业了。

我爱 Python

哦,别误会了,我说的 Python 不是这玩意,而是一种编程语言。

这几天用 Python 语言完成了一个项目,包括一个数据分析统计模块和一个简陋的 GUI (图形用户界面)模块,大约一千行代码左右。这是我第一次用 Python 写这么大的程序(对我来说算是够大的了)。从这个项目中充分体会到了 Python 语言的强大和易用。

一个语言是否简洁,有多简洁,从它的 hello world 程序中就可以看得出来:

print 'hello world'

在我所接触到的编程语言中,Python 代码最接近自然语言。强制缩进和一种问题只有一种解决办法的思想使得 Python 代码很整齐,看起来和伪代码一样。虽说这样少了自由度,但再也不用去管那些大括号匹配,行末位分号等,你会对此心存感激的。Python 是真正的为人类设计的语言。

Python 是一种动态语言,也就是说没有了编译步骤,代码就是程序,程序就是代码。并且在使用变量时用不着声明,想用就用,不用那么多废话。在使用一个变量时,也不用太考虑类型问题,直接用就是。

Python 有一个涵盖面很广的标准库,很多问题都已经在此解决了。我想如果这个项目我用 C/C++ 语言写的话,那么几乎要自己从新实现这些 Python 标准库就提供的功能。加上 C/C++ 语言的啰嗦程度,估计代码行数要增加一个数量级。

还有一个是 Python 没有指针,不用手动管理内存。Python 内建的内存管理和垃圾回收机制很完善,再也不会遇到莫名其妙的段错误了。

Python 的好处太多了,可以看看维基百科的介绍。

Python 是一门很容易学习的语言,也被推荐为入门者应该学的第一门语言。事实上,如果你是一名有经验的程序员,那么你能在两个小时内学会 Python 语言的语法并写出有用的程序。简明 Python 教程 是一个很不错的学习资料,深入学习的话可以看看 Dive Into Python 中文版Python 的官方网站是你应该常去的地方,也是各种文档资料最多的地方。

Python 可以说是一个很“酷”的编程语言,它被列为黑客应该学习的五中编程语言之一,它的资深使用者几乎都是很厉害的程序员。它被使用的也很广泛,豆瓣网的后台开发语言就是 python, Google 主要使用的三种编程语言也包括 Python.

Python的创始人为吉多·范罗苏姆(Guido van Rossum),关于他还有一段有意思的故事:Guido 去 Google 面试,简历只有一句话:I wrote Python (我写 Python),结果面到第10轮 Google 才明白过来这句话的真正意思。

当然每种编程语言都有它合适的领域,相对来说 Python 是一种开发效率较高的语言,但其运行效率则相对较差,如果和 C 语言写出的同样功能程序相比的话,有时候甚至要慢上几个数量级。在一些项目中,牺牲运行效率来提升开发效率还是很直当的。比如在我的这个项目中,写一个桌面程序,对于用户来说,一毫秒和一秒的反应时间真没什么区别。不过 Python 语言和 C 语言结合的很紧密,一些对效率要求很高的模块可以用 C 语言来写,Python 执行时导入该模块即可。实际上,Python 本身就是 C 语言写的。由于 Python 的代码即程序的特点,所以如果算法需要保密的话,也可以用 C 来写,这样别人就看不到你的源码了。

有很多工具可以将 Python 程序转换为 Windows 可以在不用安装 Python 解释器直接执行的 exe 文件。我根据这篇文章:使用py2exe打包pyqt程序为exe 提供的方法成功将 PyQt 程序打包成了 exe.

另外,Python 语言是一个由社区驱动的自由软件,任何人都可对其做贡献,它的源码也是很好的学习 C 语言资源。

延伸阅读:

每个程序员都应该学习使用Python或Ruby

Zen of Python — 蟒之禅!

PyQT 介绍和一些资源

这几天学习了 PyQt , 照猫画虎的做出了一个图形界面。

Python 是功能很强大的脚本语言,Qt 是跨平台的界面开发语言,二者的结合就是PyQt, 它是 Python 语言的 GUI (图形用户界面)编程解决方案之一,而 QT 是由诺基亚开发的应用软件框架。使用 PyQt 编写程序图形界面可以在不修改代码情况下在很多种平台比如 Windows, Linux 和 MacOs 上运行。

PyQt 官方网站:http://www.riverbankcomputing.co.uk/software/pyqt/intro

安装:

如果你使用的是 Windows, 需要首先安装 Python, 如果你对这篇文章感兴趣的话你肯定已经安装了 Python. 然后到 PyQt 官网上下载一个 Windows 安装包进行安装,注意应根据你安装的 Python 版本号进行选择。 PyQt 的 Windows 安装包已经包含了一份 Qt, 安装的时候注意选择你安装 Python 的目录。

如果你使用的 Ubuntu Linux, 那么已经默认安装了 Python, 运行下面命令就可以自动的安装所依赖的软件包:

sudo apt-get install python-qt4

然后运行命令:

sudo apt-get install python-qt4-doc

安装 PyQt 的文档和示例。

Eric 则是由 Python 开发的一款支持 PyQt 的 IDE, 可以很方便的使用 Qt Designer 设计界面,安装和使用可以看这篇文章:Eric+PyQt打造完美的Python集成开发环境。也许在编写大程序时 IDE 是很有用的,但我更喜欢用一个自己喜欢的文本编辑器手工 Hack.

学习资源:

PyQt Reference Guide

The PyQt4 tutorial

Rapid GUI Programming with Python and Qt

GUI Programming with Python: QT Edition

PyQt – PythonInfo Wiki

不过上面都是英文的,再次证明了学好英文对搞计算机的重要性。中文资料很少,有一个翻译了 The PyQt4 tutorial 的资源:

http://www.czug.org/python/pyqt4/

还有这个:

http://code.google.com/p/pyqt-doc-cn/

http://www.ibm.com/developerworks/cn/linux/l-qt/

在安装好 PyQt 后,程序自带的一些例子也是很好的学习资源。

Windows 中例子位于:python目录Libsite-packagesPyQt4examples

Linux 中例子位于:/usr/share/doc/python-qt4-doc/examples

在编写程序时,查看官方文档很有用,列出了所有模块中对象的可用方法、参数和它继承的对象等

我在使用 QtGui.QFileDialog.getOpenFileName 方法时,遇到如果文件路径中包含汉字时打开文件会出错的问题,估计又是因为该死的字符编码。我没有搜索到解决方法,最后自己试了几次,用如下代码解决了问题。我不知道为什么,但它能正常工作 :-)

fname = str(QtGui.QFileDialog.getOpenFileName(self, u'选择文件',
	'/home', u"ACMi 文件(*.acmi)").toLocal8Bit())
f = open(fname, 'r')

多平台兼容时字符编码问题

我把自己在 Win 下写的 Python 程序拿到 Linux 下运行,遇到了一些问题。

第一个问题是汉字乱码问题。问题出现在 Win 下汉字的默认字符编码格式是 ANSI 格式,而 Linux 下默认使用 UTF-8 格式。如果你用的是 Ubuntu, 可以看看这篇文章:Gedit中文乱码。如果你想让你的程序能在多平台下正常运行,最好在编写程序时使用通用的 UTF-8 格式编码,或者在你的代码中不要出现除了 ASCII 码之外的字符。

第二个问题:在 Linux 的脚本程序第一行中写类似于下面的代码:

#!/usr/bin/python

可以指定运行脚本的程序,从而可以直接运行脚本文件。但是我的程序并没有直接运行成功,shell 提示找不到解释器文件。只能以类似如下命令方式运行:

python test.py

也就是说第一行代码没有起作用。

猜测出现这个问题是因为 Win 和 Linux 下文本换行符格式不一样。在 Linux/UNIX 下,换行符为 ‘n’, 而 Win 下为 ‘rn’, Mac 下为 ‘r’, 所以 shell 在运行文件时,’/usr/bin/python’ 后多出了一个字符 ‘r’, shell 按照这个文件名当然找不到。解决办法:在编写代码时以 UNIX 格式新建文件,使用 notepad++ 文本编辑器可以很容易做到这一点。

但在我使用了 UNIX 格式新建文件和 UTF-8 文本编码格式保存后程序还是无法直接运行。我试着以UTF-8 无 BOM 格式编码后问题得到解决。查找了资料,了解到:BOM (Byte-Order Mark),字节顺序记号,中文也叫字节顺序记号。对于 UTF-16 和 UTF-32,BOM 的作用是在文件开头加上三个字节来标识文件的字节序,即采用的是大端法还是小端法。但对 UTF-8 来说,没有字节序的问题,BOM 的作用只是来标识这是一个 UTF-8 编码的文本文件。在 UTF-8 中,BOM 在文件开头占三个字节为 EF BB BF (十六进制)。在类 UNIX 系统中,UTF-8 BOM 这种作法则不被建议采用。但是在windows系统中,它是默认存在的。UTF-8 BOM 可以在不知不觉间导致一系列莫名其妙的问题。

总结一下

如果你想让你的代码不但能在 Win 下,也能在 Linxu 下都正常运行(其他平台没有测试),那么最好以 UNIX 格式新建文件,使用 UtF-8 无 BOM 格式编码。Win 下推荐使用 notepad++ 文本编辑器

扩展阅读

字符编码笔记:ASCII,Unicode和UTF-8 —— 阮一峰

UTF-8文件的Unicode签名BOM(Byte Order Mark)问题

Pyqt 学习成果

今天读了 The PyQt4 tutorial, 学习了一些基本的用法。另外花了两个小时左右的时间,又看了一遍 简明 Python 教程,复习一下 Python 语言。下周要交计算机图形学作业,就拿来练练手。本来想做成一个带菜单的界面,整合到一块,但调试了很久没有成功,就只做了最基本的。做的不是很完美,一些接口不知道怎么用。

今天太晚了,下次再介绍安装、配置和一些资源,睡觉……