2016-08-19 62 views
0

我正在寻找一种方法来阻止我的Twitter机器人HappyBot回复每个用户的推文,并且只会回复自上次代码后的新推文被运行。例如,如果我在13:00推送机器人,它会在13:00回复,但如果我在14:00再次发送推文,它会回复13:00和14:00的推文。我当前运行的代码:Tweepy twitter bot回复新请求

twts = api.search(q="@1happybot make me happy") 

t = ['@1happybot make me happy', 
    '@1happybot Make me happy!', 
    '@1happybot make me happy.', 
    'Make me happy @1happybot', 
    'make me happy @1happybot'] 

for s in twts: 
    for i in t: 
     if i == s.text: 
      sn = s.user.screen_name 
      m = "@%s Don't worry, be happy!" % (sn) 
      s = api.update_status(m, s.id) 
      print ('yes') 

任何解决方案,想法或跳点都将不胜感激。希望一切都清楚。

+0

我不认为有一种方式来获得提及使用tweepy除了使用搜索就像你做的,[基于搜索可能违反Twitter的服务条款自动回复(HTTPS://support.twitter .COM /用品/ 76915#回复-提到)。你应该确认他们的支持,可以这样做(他们可能会说是)。 –

回答

0

您正在使用哪个库?我最好的猜测是,无论你使用什么,都会暴露twitter返回的JSON响应。在这种情况下,您可以尝试检索推文的创建日期。见https://dev.twitter.com/rest/reference/get/search/tweets

s.created_at 

这应该给你的日期时间字符串。你的代码也可能更加pythonic。看一看:

TRIGGERS = ('@1happybot make me happy', 
      '@1happybot Make me happy!', 
      '@1happybot make me happy.', 
      'Make me happy @1happybot', 
      'make me happy @1happybot') 

for tweet in tweets: 
    if tweet.text in TRIGGERS: 
     sn = tweet.user.screen_name 
     status_msg = '@{} Don't worry, be happy!'.format(sn) 
     api.update_status(status_msg, s.id) 
     print ('yes') 

命名的东西很辛苦,但我们应该尽我们所能,是描述性的,而不过于冗长。变量名称应该表达他们的意图。使用像“列表中的元素”的约定,而不是遍历列表来查看元素是否在其中。在使用引号时保持一致。单引号用于您的字符串列表,但不是您设置的状态信息。选择一个,坚持下去。

TRIGGERS中的值是否会改变?如果是这种情况,请使用非易变类型(如元组),并通过使用全部大写来传达将其保持为静态的意图。很多小东西。强烈建议您阅读 - >http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

0

我在这里提供的解决方案是快速&脏,但它应该工作。基本上,它会将您回复的最后一条推文的值存储在文本文件中,以确保代码停止时的持久性,并在您的代码被调用时重新加载它。使用“自”选项时,它只会查找比您已经回复的更早的推文,因此不会再发两次推文。

f = open("lastTweet.txt","r") 
lastTweet = int(f.readline()) 
f.close() 

twts = api.search("@1happybot make me happy since:"+str(lastTweet)) 

t = ['@1happybot make me happy', 
    '@1happybot Make me happy!', 
    '@1happybot make me happy.', 
    'Make me happy @1happybot', 
    'make me happy @1happybot'] 

for s in twts: 
    for i in t: 
     if i == s.text: 
      sn = s.user.screen_name 
      m = "@%s Don't worry, be happy!" % (sn) 
      s = api.update_status(m, s.id) 
      print ('yes') 
      if s.id > lastId: 
       lastId = s.id 
       f = open("lastTweet.txt","w") 
       f.write(lastId) 
       f.close() 
+0

这很有趣,谢谢。我没有想到这样的解决方案。它运行良好,因为它假定代码将停止并开始,它会。我可以使用cron每隔几分钟给它打电话 – user3576482

+0

如果我的答案解决了您的问题,请点击大复选框接受它? – Efferalgan