如何在Python中使用新的Twitter API 1.1搜索?
大家都知道,Twitter正在升级到一个新的API(1.1),而旧的API(1.0)正在逐步停用,最终会被完全关闭。
我正在做一个小组项目,使用的是Python和Django框架,但发现大部分流行的Python Twitter库都还不支持API 1.1。我可以不通过Python库,直接和API对接,但这样做有点麻烦,因为我需要使用OAuth登录。
所以我有两个问题。
有没有支持Twitter API 1.1的Python库呢?
如果我们直接使用新的API,像下面这个链接那样,怎么才能让它正常工作,因为我们需要用OAuth登录?
链接:
https://api.twitter.com/1.1/search/tweets.json?q=#freebandnames&since_id=24012619984051000&max_id=250126199840518145&result_type=mixed&count=4
2 个回答
0
如果我们直接使用新的API,像下面这样,我们该怎么做才能让它正常工作呢?因为我们需要用OAuth登录。
>>> import twitter
>>> client = twitter.Api(username='yourusername', password='yourpassword')
>>> update = client.PostUpdate('The Twitter API is easy')
5
这个Twitter模块可以正常使用。你可以用它来请求Twitter进行身份验证,也就是去Twitter的网站,输入你的用户名和密码,然后在你的电脑上保存一个令牌。
我用这段代码来搜索Twitter上的状态(实时搜索和普通的Twitter搜索稍微有点不同)。
代码:
# -*- coding: utf-8 -*-
import os
import twitter
import json
import csv
from twitter.oauth import write_token_file, read_token_file
from twitter.oauth_dance import oauth_dance
def login():
# Go to http://twitter.com/apps/new to create an app and get these items.
# See also http://dev.twitter.com/pages/oauth_single_token.
APP_NAME = 'xxx'
CONSUMER_KEY = 'xxx'
CONSUMER_SECRET = 'xxx'
TOKEN_FILE = '/token.txt'
try:
(oauth_token, oauth_token_secret) = read_token_file(TOKEN_FILE)
except IOError, e:
(oauth_token, oauth_token_secret) = oauth_dance(APP_NAME, CONSUMER_KEY,
CONSUMER_SECRET)
print e.errno
print e
if not os.path.isdir('out'):
os.mkdir('out')
write_token_file(TOKEN_FILE, oauth_token, oauth_token_secret)
auth=twitter.oauth.OAuth(oauth_token, oauth_token_secret,CONSUMER_KEY, CONSUMER_SECRET)
return twitter.TwitterStream(auth = auth, secure = True)
if __name__=="__main__":
t = login()
res = t.statuses.filter(track = "search text")
res_list = []
tweetfields = set()
for r in res:
if len(res_list)<100:
print len(res_list)
res_list.append(r)
tweetfields = tweetfields.union(r.keys())
else:
break
fname = '/results.csv'
f = open(fname,'w')
dw = csv.DictWriter(f,fieldnames=list(tweetfields))
dw.writeheader()
for r in res_list:
dw.writerow({k:v.encode('utf8') if isinstance(v,unicode) else v for k,v in r.items()})
f.close()
print [result['text'] for result in res_list]