1

我正在制作一个简单的应用程序来流式传输 twitter 的公共时间线,我希望流式传输在一小时后自动停止,但我不知道该怎么做。我阅读了 datetime 和 timeit 文档,但无法理解它们。这是我的代码,它完美地但无限期地流式传输我想要的时间线。

from twython import TwythonStreamer
import json
import os
import datetime
from datetime import *
APP_KEY = 'XX'
APP_SECRET = 'XX'
OAUTH_TOKEN = 'XX'
OAUTH_TOKEN_SECRET = 'XX'
class MyStreamer(TwythonStreamer):

    def on_success(self, data):
        print data['text']
        with open('scratch1.json', 'ab') as outfile:
            json.dump(data, outfile, indent = 4)
        with open('scratch2.json', 'ab') as xoutfile:
            json.dump(data, xoutfile, indent = 4)
        return


    def on_error(self, status_code, data):
        print status_code
        return True # Don't kill the stream

    def on_timeout(self):
        print >> sys.stderr, 'Timeout...'
        return True # Don't kill the stream

stream = MyStreamer(APP_KEY, APP_SECRET,
                    OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
stream.statuses.filter(follow = [95995660, 8820362])

谁能帮我?

4

3 回答 3

3

使用该datetime.datetime.now()方法获取当前日期时间对象,然后使用timedelta该类为其添加一个小时。

import datetime
stop_time = datetime.datetime.now() + datetime.timedelta(hours=1)

# ...

# in relevant function ...
if datetime.datetime.now() > stop_time:
    stop_streaming()

我不熟悉你的TwythonStreamer课,但可能是这样的:

class MyStreamer(TwythonStreamer):

    # the init function is called when you create instance of class
    def __init__(self):
        self.stop_time = datetime.datetime.now() + datetime.timedelta(hours=1)

    # ...

    def on_success(self, data):
        if datetime.datetime.now() > self.stop_time:
            raise Exception("Time expired")

        # ...
于 2014-01-10T05:31:44.080 回答
2

我无法通过 pztrick 的修改来复制 Apoorv 的代码。写作:

class MyStreamer(TwythonStreamer):  
   def __init__(self):  
        self.stop_time = dt.datetime.now() + dt.timedelta(minutes=1)

将生成此错误消息:

TypeError: __init__() takes 1 positional argument but 5 were given

以下没有工作:

MyStreamer 类(twy.TwythonStreamer):

def __init__(self):
    self.stop_time = dt.datetime.now() + dt.timedelta(minutes=1)
    self.app_key = APP_KEY
    self.app_secret = APP_SECRET
    self.oauth_token = OAUTH_TOKEN
    self.oauth_token_secret = OAUTH_TOKEN_SECRET

然而,真正起作用的是只定义 stop_time 而没有init。我的最终解决方案如下:

class MyStreamer(twy.TwythonStreamer):

    stop_time = dt.datetime.now() + dt.timedelta(minutes=1)

    def on_success(self, data):
        if dt.datetime.now() > self.stop_time:
            raise Exception('Time expired')

        fileName = self.fileDirectory + 'Tweets_' + dt.datetime.now().strftime("%Y_%m_%d_%H") + '.txt'  # File name includes date out to hour.
        open(fileName, 'a').write(json.dumps(data) + '\n')

我是新手,所以不明白为什么会这样,但我很高兴它确实如此。

于 2016-10-14T19:24:17.957 回答
0

我推荐 datetime.datetime.now() 模块
datetime.datetime.now() + datetime.deltatime(seconds=3600) 作为你的一小时停止时间。

于 2014-01-10T06:33:55.437 回答