1

Twitter の公開タイムラインをストリーミングする簡単なアプリを作成しています。1 時間後にストリーミングを自動的に停止したいのですが、その方法がわかりません。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

Apoorv のコードを pztrick の修正で複製することはできませんでした。書き込み:

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

しかし、うまくいったのは、initなしで stop_time を定義することだけでした。私の最終的な解決策は次のようになります。

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 に答える