【问题标题】:Tweepy twitter bot replies to new requestsTweepy twitter bot 回复新请求
【发布时间】:2016-12-26 21:12:53
【问题描述】:

我正在寻找一种方法来阻止我的 Twitter 机器人 HappyBot 回复每个在其上发推文的用户,而是只回复自上次运行代码以来的新推文。例如,如果我在 13:00 发推特,它会在 13:00 回复,但如果我在 14:00 再次发推,它会回复 13:00 和 14:00 的推文。我当前运行的代码:

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')

我们将不胜感激任何解决方案、想法或起点。希望一切都清楚。

【问题讨论】:

标签: python twitter tweepy


【解决方案1】:

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

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()

【讨论】:

  • 嗯,这很有趣,谢谢。我没有想到这样的解决方案。它运行良好,因为它假定代码将停止和启动,它会。我可以使用 cron 每隔几分钟左右调用一次
  • 如果我的回答解决了您的问题,请您点击大复选框接受它吗?
【解决方案2】:

您使用的是哪个库?我最好的猜测是,无论您使用什么,都会暴露 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

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 2019-02-19
    • 2017-10-13
    • 2019-01-25
    • 1970-01-01
    • 2020-12-12
    • 2021-10-05
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多