我正在制作一个简单的应用程序来传播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])
任何人都可以帮助我吗?
答案 0 :(得分:2)
使用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")
# ...
答案 1 :(得分:1)
因为我想提出一个主要是完整的解决方案。这是我的版本:
#!/usr/bin/env python
import sys
import json
import datetime
from twython import TwythonStreamer
from circuits import Component, Event, Debugger, Timer
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
class Check(Event):
"""Check Event"""
class Terminate(Event):
"""Terminate Event"""
class App(Component):
def init(self, *args, **kwargs):
self.stream = MyStreamer(
APP_KEY, APP_SECRET,
OAUTH_TOKEN, OAUTH_TOKEN_SECRET
)
interval = datetime.datetime.now() + datetime.timedelta(hours=1)
Timer(interval, Terminate(), self.channel).register(self)
Timer(10, Check(), persist=True, channel=self.channel).register(self)
def terminate(self):
raise SystemExit(0)
def check(self):
self.stream.statuses.filter(follow=[95995660, 8820362])
app = App()
Debugger().register(app)
app.run()
这为您的解决方案circuits添加了一个额外的库/框架,它是强大的事件和内置Timer
组件。
NB:我没有测试过这个。我会把它留给你,因为我没有特别使用twython
Twtiter客户端库或任何它的API。祝你好运!
另请注意,我假设您不想连续检查流,因为Twitter API可能有某种限制。因此,第二个计时器将每10秒触发Check
个事件,并在正在运行的应用程序的生命周期内持续存在。
答案 2 :(得分:1)
我无法通过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
然而,在没有 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')
我不熟悉课程,所以不明白为什么会这样,但我很高兴它确实如此。
答案 3 :(得分:0)
我推荐datetime.datetime.now()模块
datetime.datetime.now()+ datetime.deltatime(seconds = 3600)作为你的一小时停止时间。