Python:Twitter流媒体和pycurl问题

时间:2010-11-26 22:50:39

标签: python twitter pycurl

我遇到pycurl与Twitter的Streaming API过滤器流一起出现问题。 当我运行下面的代码时发生的事情似乎是在执行调用上barf。我知道这是因为我在执行调用之前和之后放置了print语句。我正在使用Python 2.6.1,如果重要的话我就在Mac上。

#!/usr/bin/python
print "Content-type: text/html"
print
import pycurl, json, urllib

STREAM_URL = "http://stream.twitter.com/1/statuses/filter.json?follow=1&count=100"
USER = "user"
PASS = "password"
print "<html><head></head><body>"


class Client:
    def __init__(self):
        self.buffer = ""
        self.conn = pycurl.Curl()
        self.conn.setopt(pycurl.POST,1)
        self.conn.setopt(pycurl.USERPWD, "%s:%s" % (USER,PASS))
        self.conn.setopt(pycurl.URL, STREAM_URL)
        self.conn.setopt(pycurl.WRITEFUNCTION, self.on_receive)

        try:
            self.conn.perform()
            self.conn.close()
        except BaseException:
            traceback.print_exc()

    def on_receive(self,data):
        self.buffer += data
        if data.endswith("\r\n") and self.buffer.strip():
            content = json.loads(self.buffer)
            self.buffer = ""
            print content
            if "text" in content:
                print u"{0[user][name]}: {0[text]}".format(content)

client = Client()

print "</body></html>"

2 个答案:

答案 0 :(得分:2)

首先,尝试启用详细程度以帮助调试:

    self.conn.setopt(pycurl.VERBOSE ,1)

看起来您没有设置基本身份验证模式:

    self.conn.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC)

另外根据文档,您需要为API提供参数的POST,而不是将它们作为GET参数传递:

    data = dict( track='stack overflow' )
    self.conn.setopt(pycurl.POSTFIELDS,urlencode(data))

答案 1 :(得分:1)

您正在尝试使用基本身份验证。

  

基本身份验证发送用户   HTTP标头中的凭据   请求。这使它易于使用,   但是不安全。 OAuth是推特   首选的身份验证方法   向前迈进 - 来自 2010年8月,   我们将关闭Basic Auth   API 。 - Authentication, Twitter