2017-07-13 1 views
0

Ich habe dieses Skript geschrieben, um eine SMS an mich selbst zu senden, wenn die Datei results.txt geändert wird. Es sendet den Inhalt der Datei in einem Text an mein Telefon (ich habe die Zahlen in der Frage geändert). Es funktioniert, abgesehen davon, dass ich pro Modifikation zwei identische SMS-Nachrichten erhalte und ich nicht für das Leben von mir herausfinden kann warum.Python Twilio/Watchguard Skript Senden von 2 Nachrichten anstelle der 1 erwartet

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

EDIT **

hier ist die Datei, die auf results.txt schreibt:

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"]) 
+0

Was ändert 'results.txt'? Es ist möglich, dass die Datei zweimal geändert oder mindestens zwei geänderte Ereignisse generiert werden. Ich würde wahrscheinlich versuchen, die Ereignisse, die Sie erhalten, zu protokollieren, um zu sehen, was vor sich geht. – philnash

+0

Hallo, ich habe jetzt die Datei hinzugefügt, die in results.txt schreibt – neilH

Antwort

0

Twilio Entwickler Evangelist hier.

Ich glaube, aus dem Lesen von this question, dass, wenn Sie file.open aufrufen, Sie ein modifiziertes Ereignis verursachen und wenn Sie dann in die Datei schreiben, verursachen Sie auch das Ereignis zu feuern. Daher senden Sie zwei Nachrichten, da das Änderungsereignis zweimal ausgelöst wird.

Anstatt die Datei jedes Mal zu öffnen, wenn Sie darauf schreiben möchten, speichern Sie einen Verweis auf die Datei, die schreibbereit ist, und schreiben Sie jedes Mal auf dieselbe Referenz.

Etwas wie:

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

(Wie bitte, wenn das nicht genau funktioniert, mein Python nicht großartig, aber man hoffentlich auf die Idee kommen, ein offenes Dateiobjekt in Ihre Zuhörer übergibt und es verwenden, anstatt die Datei jedes Mal zu öffnen.)

Verwandte Themen