用Python实现从命令行发twitter

比如我在写程序,突然来了个灵感,想发推。这时,停下手头的工作,打开firefox,上twitter.com,选中输入框,输入,tweet。看起来简单,但实际上打断了我写程序的思路,一看到Timeline,就想着往下翻,手头的工作就不要做了。发推应该就跟说话一样简单,不需要那么多步骤。所以,我折腾出了用命令行发推。其实类似的软件或脚本应该有很多,但我觉得我这个还是比较简单的。

从2010年8月31号开始,twitter停止了原先的Basic认证方式,改由OAuth认证。这种认证初看会觉得很复杂,几个token发来发去。简化他有两个办法,第一,官方提供基于OAuth认证的library,各种语言都有,直接拿来用就是;第二,对于单一用户,不用完整实现OAuth功能,官方可以提供最终的access_token。

本文就是基于第二点做的,而且这个方法具有普遍性。很多情况是这样:你在GAE上建了一个gtap来做twitter API,或者GTalk机器人来发推,但实际上,这些服务很有可能只有你自己在使用。这时,你就可以直接从官方获取access_token来进行操作。

1.准备工作

首先你要有一个twitter app,这里有一段文字讲如何注册应用。

https://dev.twitter.com/apps 从这里进入,选择你的应用,记录下Consumer key和Consumer secret。

然后点右边的“My Access Token”,记录下里面的oauth_token和oauth_token_secret。

获得这四个值,你就可以控制你自己的twitter帐号了。

2.获取oauth2库

这是官方推荐的一个OAuth认证库,这里使用easy_install来安装。

如果没有easy_install,请先安装,当然python你肯定要装。

apt-get install python-setuptools

Windows用户可以先去Google搜一个ez_setup.py的脚本,执行后就自动装好了。

装好easy_install后执行:

easy_install oauth2

3.程序代码

点击这里下载程序代码。

01 # -*- coding: utf-8 -*-
02
03 import oauth2 as oauth
04 import urllib
05 import sys
06
07 def oauth_req(url, http_method="GET", post_body=None, http_headers=None):
08     consumer = oauth.Consumer(key="Consumer key", secret="Consumer secret")
09     token = oauth.Token(key="oauth_token", secret="oauth_token_secret")
10     client = oauth.Client(consumer, token)
11
12     resp, content = client.request(
13         url,
14         method=http_method,
15         body=post_body,
16         headers=http_headers
17     )
18     return content
19
20 if len(sys.argv) == 2:
21     #For Windows
22     #a = "status=" + urllib.quote(sys.argv[1].decode('gb2312').encode(‘utf-8’))
23     #For Linux
24     a = "status=" + urllib.quote(sys.argv[1])
25     print "Tweeting…"
26     req = oauth_req(
27     'http://api.twitter.com/1/statuses/update.xml',
28     'POST',
29     a)
30     #print req
31     print "Done."
32 else :
33     print "Error Parameter"

一点解释:Windows下的命令行不是UTF8编码,所以要转换一下。不同系统下请打开相应的代码,并注释掉其他的,然后把上面的四个值替换成从第一步获取的值。

4.使用

在命令行下执行

python t.py "从命令行发推测试"

你如果还嫌前面的python麻烦,那就写个shell脚本替代吧。如果你还问为什么没有看TL、fo人、RT功能。我做这个东西的目的就是在不打断思路的前提下去发个推,仅此而已。如果你都想到了要RT某某推,那还是去官网或者其他客户端吧,这时你已经没心思在手头工作上了,就谈不上不打断思路。

UPDATE.1(2011/3/21):可以在/usr/bin中放入刚才的python脚本,这样就跟执行命令一样。
在脚本最开头加入(具体python路径请自行修改)
#!/usr/bin/python2.6
然后复制脚本到/usr/bin中,并赋予执行权限
cp t.py /usr/bin/tweet
chmod +x /usr/bin/tweet

现在就可以在命令行中的任意路径里输入如下命令发推:
tweet "Tweet From CLI!"

5.参考资料

Authenticating Requests with OAuth

Using one access token with OAuth

anyShare分享到:
Linux, Programming , , ,

16 comments


  1. Pingback: 用Python实现从命令行发twitter « 细节的力量

  2. pandachow

    求推荐Python入门教材…

  3. Pingback: Mr.Wayne » Blog Archive » 用Python实现从命令行发twitter

  4. Pingback: 快速上传截图到flickr并发送twitter | Digital Base

  5. Evan

    我运行之后出错,帮忙看下是怎么了:

    Tweeting…
    Traceback (most recent call last):
    File "/usr/bin/tweet", line 30, in
    a)
    File "/usr/bin/tweet", line 17, in oauth_req
    headers=http_headers
    File "/usr/local/lib/python2.6/dist-packages/oauth2-1.5.170-py2.6.egg/oauth2/__init__.py", line 682, in request
    connection_type=connection_type)
    File "/usr/lib/pymodules/python2.6/httplib2/__init__.py", line 1129, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
    File "/usr/lib/pymodules/python2.6/httplib2/__init__.py", line 901, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, headers)
    File "/usr/lib/pymodules/python2.6/httplib2/__init__.py", line 871, in _conn_request
    response = conn.getresponse()
    File "/usr/lib/python2.6/httplib.py", line 984, in getresponse
    method=self._method)
    File "/usr/lib/python2.6/httplib.py", line 330, in __init__
    self.fp = sock.makefile('rb', 0)
    AttributeError: 'NoneType' object has no attribute 'makefile'

  6. Nimda

    ubuntu吗?我好像试过,python不认ubuntu下的全局代理,export http_proxy="http://ip:port"行不

  7. 我前几天刚弄明白Oauth这个东西。。。。妈蛋好复杂

Leave a Reply

Your email address will not be published.