Скрипт Python Twilio/Watchguard отправляет 2 сообщения вместо ожидаемого 1

Я написал этот скрипт для отправки SMS самому себе при изменении файла results.txt. Он отправляет содержимое файла в тексте на мой телефон (я изменил номера в вопросе). Это работает, не считая того, что я получаю два одинаковых SMS-сообщения на модификацию, и я не могу понять, почему.

import time
import sys, os
from twilio.rest import Client
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler


class MyHandler(PatternMatchingEventHandler):
        patterns = ["./results.txt"]

        def process(self, event):
                with open('results.txt', 'r') as myfile:
                        newtweet=myfile.read().replace('\n', '')
                        client = Client("ACac14lkjdchlkdhfdhb448d175335fbd8", "hduhdhdhddhidh39837382783232")
                        client.messages.create(from_="+44145698039",
                        to="+44778974188",
                        body=newtweet)


        def on_modified(self, event):
                self.process(event)



if __name__ == '__main__':
    args = sys.argv[1:]
    observer = Observer()
    observer.schedule(MyHandler(), path=args[0] if args else '.')
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()

    observer.join()

РЕДАКТИРОВАТЬ**

вот файл, который пишет в results.txt:

class MyStreamListener(tweepy.StreamListener):

        def on_status(self, status):
                text = status.text
                name = status.user.screen_name
                uid = status.user.id
                print (text)
                print (uid, text, name, file=open("results.txt", "w"))

        def on_error(self, status_code):
                if status_code == 420:
                        return False

myStreamListener = MyStreamListener()
users = ['22776208', '2845678578']
stream = tweepy.Stream(auth = api.auth, listener=myStreamListener, include_entities=True)
stream.filter(follow=users, languages=["en"])
keywords = ["Trump"]
stream.filter(track=keywords, languages=["en"])

person neilH    schedule 13.07.2017    source источник
comment
Что изменяет results.txt? Возможно, он дважды изменяет файл или, по крайней мере, генерирует два модифицированных события. Я бы, вероятно, попытался зарегистрировать события, которые вы получаете, чтобы увидеть, что происходит.   -  person philnash    schedule 17.07.2017
comment
Привет, теперь я добавил файл, который пишет в results.txt   -  person neilH    schedule 18.07.2017


Ответы (1)


Евангелист разработчиков Twilio здесь.

Я считаю, что, прочитав этот вопрос, когда вы вызываете file.open, вы вызовет модифицированное событие, а затем, когда вы записываете в файл, вы также вызываете срабатывание события. Таким образом, вы отправляете два сообщения, потому что событие изменения запускается дважды.

Вместо того, чтобы открывать файл каждый раз, когда вы хотите в него записать, почему бы не сохранить ссылку на файл, который готов для записи, и каждый раз записывать в одну и ту же ссылку.

Что-то типа:

class MyStreamListener(tweepy.StreamListener):

    def __init__(self, file):
            self.file = file
            super().__init__()

    def on_status(self, status):
            text = status.text
            name = status.user.screen_name
            uid = status.user.id
            print (text)
            print (uid, text, name, self.file)

    def on_error(self, status_code):
            if status_code == 420:
                    return False

myStreamListener = MyStreamListener(file=open("results.txt", "w"))

(Извините, если это не работает точно, мой Python не идеален, но, надеюсь, вы поняли идею, передайте объект открытого файла в свой слушатель и используйте его, а не открывайте файл каждый раз.)

person philnash    schedule 18.07.2017