2017-07-13 6 views
0

J'ai écrit ce script pour m'envoyer un SMS lorsque le fichier results.txt est modifié. Il envoie le contenu du fichier dans un texte à mon téléphone (j'ai changé les numéros dans la question). Cela fonctionne, mis à part le fait que je reçois deux SMS identiques par modification et je ne peux pas, pour la vie de moi, comprendre pourquoi.Script Python Twilio/Watchguard envoyant 2 messages au lieu de 1 attendu

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 **

est le fichier ici qui est écrit à 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"]) 
+0

Qu'est-ce qui modifie 'results.txt'? Il est possible qu'il modifie deux fois le fichier ou qu'il génère au moins deux événements modifiés. J'essaierais probablement de consigner les événements que vous recevez pour voir ce qui se passe. – philnash

+0

Bonjour, J'ai maintenant ajouté le fichier qui écrit à results.txt – neilH

Répondre

0

Twilio évangéliste développeur ici.

Je crois, à la lecture de this question, que lorsque vous appelez file.open vous provoquerez un événement modifié, puis lorsque vous écrivez dans le fichier, vous déclenchez également l'événement. Ainsi, vous envoyez deux messages car l'événement change est déclenché deux fois. Plutôt que d'ouvrir le fichier chaque fois que vous voulez y écrire, pourquoi ne pas enregistrer une référence au fichier qui est prêt à être écrit et écrire dans la même référence à chaque fois.

Quelque chose comme:

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

(Excusez-moi si cela ne fonctionne pas exactement, mon Python est pas superbe, mais nous espérons que vous avez l'idée, passer un objet fichier ouvert dans votre auditeur et l'utiliser, plutôt que d'ouvrir le fichier à chaque fois.)