如何在python中正确连接twitter机器人?

时间:2017-08-23 01:37:21

标签: python multithreading twitter

我正在使用python和tweepy创建一个在Twitter上执行两项操作的程序:

  1. 每隔15分钟发推文
  2. 每30秒提一次并回答其中一些
  3. 我最终得到的是一个创建三个线程的程序:两个守护程序线程,一个用于每个任务,一个在后台运行,一个“主”线程基本上什么也没做,除了等待TERM信号取消另外两个并关闭程序。 这是它的样子:

    def run(self):
        while self.running:
            self.running= not self.handler.receivedTermSignal
            time.sleep(1)
    
        self.tweet.cancel()
        self.mentions.cancel()
    

    它似乎按预期工作但感觉就像一个肮脏的黑客。难道没有更好的方法来处理这类事情吗?

1 个答案:

答案 0 :(得分:2)

您可以在Python 3中使用asyncio

import signal
import asyncio
from time import strftime

async def tweet():
    while 1:
        print(strftime('[%H:%M:%S]'), "tweet something")
        try:
            await asyncio.sleep(15 * 60)
        except asyncio.CancelledError:
            break

async def mentions():
    while 1:
        print(strftime('[%H:%M:%S]'), "scrape mentions and answer some of them")
        try:
            await asyncio.sleep(30)
        except asyncio.CancelledError:
            break

def shutdown():
    print(strftime('[%H:%M:%S]'), "shutdown")
    for task in asyncio.Task.all_tasks():
        task.cancel()

def main():
    loop = asyncio.get_event_loop()

    loop.add_signal_handler(signal.SIGTERM, shutdown)

    tasks = [asyncio.ensure_future(tweet()), asyncio.ensure_future(mentions())]

    loop.run_until_complete(asyncio.gather(*tasks))


if __name__ == "__main__":
    main()