RE: Mit dem Pi über WhatsApp Nachrichten, etc. senden!

  • Also wie versprochen, hier mein Patch der CmdClient.py. Ich habe außerdem mal das Originalfile als CmdClient-bak.py hier hochgeladen für die, die viel rumgespielt haben und das Originalfile nicht mehr haben. (Es empfiehlt sich, in jedem Fall ein Backup von jedem File anzulegen, bevor man irgendwelche Änderungen ausprobiert!)

    Wenn man darauf den Patch anwendet, bekommt man die CmdClient.py wie ich sie momentan habe.

    Nach dem Runterladen des Patches in das Exampels-Verzeichnis führt man den Patch dort folgendermaßen aus:

    Code
    patch < CmdClient.patch

    Der Patch beinhaltet nicht das Hochladen von Bildern, sondern nur kosmetische Änderungen sowie die Möglichkeit, kurz vor /setstatus eine aktuelle Statusmeldung einzugeben (mit Return behält man die voreingestellt bzw. die vorige).

    Viel Spaß damit!

  • RE: Mit dem Pi über WhatsApp Nachrichten, etc. senden!? Schau mal ob du hier fündig wirst!

  • Der Patch erweitert nun den CmdClient so dass er folgende Befehle mit Parametern akzeptiert:

    Code
    Enter Message or command: (/available , /unavailable , /getprofile , /setprofile filename, /setstatus status, /exit , /lastseen )


    Details wo man den Patch runterlädt und wie man ihn einbaut steht hier. Statusmessage sowie der Filename für das Bild sind nun Parameter für die Befehle und sind nun nicht mehr hardcoded.

  • Hallo zusammen,

    ich habe hier vor einiger Zeit schon mal eine Frage gepostet. Leider gab es bislang noch keine Antwort darauf.

    Meine Frage war ob ich mit dem Programm hier prüfen kann, ob eine beliebige Nummer bei Whatsapp registriert ist.

    So eine Funktion würde mir sehr helfen.

    Danke!

    Gruss
    matt


  • mach ich gleich mal Drauf framp

    inwiefern ist der patch neuer/besser als der von HaSch??


    Das Problem ist, dass es hier mehrere Köche und mehrere Gourmets gibt und es deshalb nicht leicht ist den Überblick über die köstlichen Rezepte zu behalten :shy:. Die Köche tauschen die Rezepte aus und die Gourmets verköstigen die Gerichte.

    Mein neuer Patch verbessert die Benutzbarkeit. Die vorherige Version verlangte immer, dass man Code ändert um den Status zu ändern oder das ProfileIcon zu ändern. Jetzt können diese Dinge als Argumente bei den Befehlen mitgegeben werden.

    Was HaSch Patch macht muss ich gestehen habe ich nicht im Detail verfolgt. Vielleicht sollten die Köche mal kurz eine Summary ihrer Rezeptqualiäten erstellen.

    Anbei meine Summary:

    Erweiterung des Standard yowsup CmdClients durch die Befehle

    a) /setstatus statusMessage
    b) /setprofile profileIconName
    c) /getprofile
    d) /exit

    wobei der Code dazu an diversen Stellen geändert wurde, damit die Befehle Parameter verarbeiten können (vielleicht für andere Köche interessant, wenn diese auch weitere Befehle einbauen wollen die parametrisiert sein sollen).

  • Ich habe meine Nummern aus ge xxxx 't

    unten bei onMsg recieved in der if sind die 2 Nummern denen erlaubt ist Bilder zu chatten
    die nummern in jind:12 oder 13 gibt die länge der nummer 491....... an

    unter self.my_jid, trägst du deine ein

    edit:
    Ich mache die Tage wenn ich alle "Versionen" gesichtet habe eine kleine in-Datei Doku.

    Ich würde euch bitten mir eure aktuellen Dateien mal zu senden, am besten dropbox oder github link per PM oder Email
    @ HaSch und Framp und mbod77


    MERGE STAND AKTUELL:
    HaSch's letzter Patch und Framps neuer Patch
    einziger großer Unterschied in der runCommand

    aber wie ich das sehen tut die von HaSch den Status hardcoden
    und für /available und /unavailable nichts machen
    richtig soweit oder?
    habe die von Framp aktiv aktuell

    Wenn ich die anderen morgen oder so durchsehe werde ich wohl Montag oder so eine "für alle" CMD bereitstellen
    die Listener ist ja mehr die "persönliche mit eigenen Befehle" aber die CMD liegt ja im allgemeinen Interesse :)

    Einmal editiert, zuletzt von StillResonance1614 (16. November 2013 um 19:09)

  • Jawohl, läuft ähnlich. Hier meine Lösung, vielleicht hilft sie dem ein oder anderen:

    Code
    def onUploadSuccess(self, url):
     print("MSG send Url: "+url)
     #self.sendImage(url)
     self.methodsInterface.call("message_audioSend",(self.sender_jid,url,"test.wav", str(os.path.getsize(self.local_path))))

    Das ganze jetzt vielleicht noch in eine eigene Methode verpacken und unterscheiden zwischen Image und Audio.

    Einmal editiert, zuletzt von Keano (18. November 2013 um 11:46)

  • Was macht /available /unavailable eigentlicht?

    Ich hab die Option aufm Iphone irgendwie nicht, also will vom Grundsatz erstmal wissen was es macht ^^

    edit: habs rausgefunden

    für online stellen und für zu letzt online stelle ^^ dachte nicht das es dafür nen Befehl gibt ^^

    HaSch und framp

    werden bei euch die folgenden Funktionen aufgerufen? Weil bei mir wird da keine aufgerufen bei /available /unavailable

    Einmal editiert, zuletzt von StillResonance1614 (18. November 2013 um 16:04)

  • Danke piro299 für die schnelle antwort,
    ich habe das natürlich gleich mal in meine Listener gepackt und habe mir auch erlaubt den Befehl "rpidata" mit zu übernehmen :).


    Ich habe bei "kellertemp" momentan aber nur zum testen eine Textausgabe, da ich es noch nicht hinbekommen habe, den w1 sensor "schön formatiert" auszulesen.
    :danke_ATDE: euch!

    gruß johannes

  • Danke Leute es hat geklappt!

    Hier der aktuelle angefügte Listener-Code:

    bei "kellertemp = commands.getoutput('temp') wird die datei "temp" aufgerufen.

    diese habe ich in /bin/bash angelegt.

    Bash
    #!/bin/bash
    
    
    # Sensors auslesen
    kellertemp=`echo "scale=2; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-000004a6c7eb/w1_slave | awk -F't=' '{print$
    # Temperatur ausgeben
    echo  $kellertemp°C


    jetzt muss ich das ganze blos noch in einen screen packen, damit der Listener im Hintergrund läuft.

    gruß johannes

  • Ich habs folgend, weil ich kein commands. Objekt habe ^^

    Code
    if "Temperatur innen" in messageContent:
                                    time = formattedDate
                                    tempinnen = subprocess.check_output('/home/pi/Skripte/temp_innen.sh', shell=True)
                                    message = "Innentemperatur: \n Gemessen: %s \n Temperatur: %s" %(time,tempinnen)
                                    self.methodsInterface.call("message_send", (jid,message))
    Bash
    #!/bin/sh
    echo "scale=2; $(grep 't='  /sys/bus/w1/devices/w1_bus_master1/28-00000400afdb/w1_slave | awk -F't=' '{print $2}')/1000" | bc -l


    und screen hab ich so gelöst:

    Code
    listen.sh
    python yowsup-cli -l -a -k -c config.example
  • Beim senden einer Nachricht kommt dann folgender fehler:


    Python
    Traceback (most recent call last):
      File "yowsup-master/src/yowsup-cli", line 35, in <module>
        from Examples.ListenerClient import WhatsappListenerClient
      File "/home/pi/yowsup-master/src/Examples/ListenerClient.py", line 32, in <module>
        class WhatsappListenerClient:
      File "/home/pi/yowsup-master/src/Examples/ListenerClient.py", line 72, in WhatsappListenerClient
        if "Test" in messageContent:
    NameError: name 'messageContent' is not defined


    Oder wenn ich die sh Daten so änder:

    Code
    def onMessageReceived(self, messageId, jid, messageContent, timestamp, wantsReceipt, pushName, isBroadCast):
                    formattedDate = datetime.datetime.fromtimestamp(timestamp).strftime('%d-%m-%Y %H:%M')
                    print("%s [%s]:%s"%(jid, formattedDate, messageContent))
    
    
    if "test" in messageContent:
            os.system('python yowsup-cli -c config.example -s 491737895062 "Befehl "Bestanden"')

    kommt folgender fehler

    Python
    Traceback (most recent call last):
      File "yowsup-master/src/yowsup-cli", line 35, in <module>
        from Examples.ListenerClient import WhatsappListenerClient
      File "/home/pi/yowsup-master/src/Examples/ListenerClient.py", line 78
        if wantsReceipt and self.sendReceipts:
        ^
    IndentationError: unexpected indent

    Einmal editiert, zuletzt von Fillip13 (26. November 2013 um 21:49)


  • Suche mal nach sort. Die Liste wird sortiert ausgegeben. Den sort einfach entfernen.

    Wonach wird die denn sortiert? Ich kann da keine Regel erkennen!

    Edit: Ich habe den ganzen Code durchsucht aber kein sort gefunden. Wo kann sich das denn verstecken?

    Einmal editiert, zuletzt von HaSch (30. November 2013 um 14:47)


  • Edit: Ich habe den ganzen Code durchsucht aber kein sort gefunden. Wo kann sich das denn verstecken?


    Sorry, Du hast Recht. Ich hatte meine Antwort vom Weihnachtsmarkt aus geschrieben und da hat mich mein Gedächtnis getäuscht (Nicht der Glühwein :lol: ) und ich habe eben noch mal im Code nachgesehen. Ich wollte damals einen sort reinbringen - habe es aber gelassen. Die Sortierung einer Map in Python ist implementationsabhängig und nicht die Reihenfolgde der Elementdefinitionen

    Aber Du kannst das wie folgt mit einem kleinen Trick erreichen (Die letzte Zahl in der Map gibt die Positiion bei der Ausgabe an):


  • Sorry, Du hast Recht. Ich hatte meine Antwort vom Weihnachtsmarkt aus geschrieben und da hat mich mein Gedächtnis getäuscht (Nicht der Glühwein :lol: ) und ich habe eben noch mal im Code nachgesehen. Ich wollte damals einen sort reinbringen - habe es aber gelassen. Die Sortierung einer Map in Python ist implementationsabhängig und nicht die Reihenfolgde der Elementdefinitionen

    Aber Du kannst das wie folgt mit einem kleinen Trick erreichen (Die letzte Zahl in der Map gibt die Positiion bei der Ausgabe an):



    Super, das geht schon mal ganz gut, bis auf 2 Dinge:
    1. Am Ende der Liste steht noch ein Leerzeichen, das weg kann (wahrscheinlich eine Kleinigkeit) und
    2 Es gibt eine Fehlermeldung beim Beenden über /exit:

    Exception in thread Thread-3:
    Traceback (most recent call last):
    File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
    File "/usr/lib/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
    File "/home/pi/yowsup-master/src/Examples/CmdClient.py", line 84, in onAuthSuccess
    self.goInteractive(self.phoneNumber)
    File "/home/pi/yowsup-master/src/Examples/CmdClient.py", line 171, in goInteractive
    if not self.runCommand(message.strip()):
    File "/home/pi/yowsup-master/src/Examples/CmdClient.py", line 148, in runCommand
    self.commandMappings[command[0]]()
    TypeError: 'tuple' object is not callable

    ^CTraceback (most recent call last):
    File "./yowsup-cli", line 247, in <module>
    wa.login(login, password)
    File "/home/pi/yowsup-master/src/Examples/CmdClient.py", line 75, in login
    time.sleep(0.5)
    KeyboardInterrupt


  • Super, das geht schon mal ganz gut, bis auf 2 Dinge:
    1. Am Ende der Liste steht noch ein Leerzeichen, das weg kann (wahrscheinlich eine Kleinigkeit)

    Code
    message=[ "%s%s%s" % (i," " if self.commandMappings[i][1] else "", self.commandMappings[i][1]) for i in sorted(self.commandMappings, lambda x,y: cmp(x,y), lambda x: self.commandMappings[x][2])]
    Zitat


    2 Es gibt eine Fehlermeldung beim Beenden über /exit:[/i][/i]


    Bei mir funktioniert es. Mein Code sieht aber auch anders aus als bei Dir. Offensichtlich hast Du nicht meinen Patch applied.:

  • Code
    message=[ "%s%s%s" % (i," " if self.commandMappings[i][1] else "", self.commandMappings[i][1]) for i in sorted(self.commandMappings, lambda x,y: cmp(x,y), lambda x: self.commandMappings[x][2])]

    Leerzeichen ist schon mal weg!

    Einmal editiert, zuletzt von HaSch (30. November 2013 um 20:02)

  • Hey,
    Sorry das ich mich erst jetzt melde...

    Code
    #Audio Empfangen
    self.signalsInterface.registerListener("audio_received",self.onAudioReceived)
    
    
    def onAudioReceived(self,messageId, jid, url, size, author, receiptRequested):
                    os.system("wget -q -O /home/pi/audio.aac " + url)
                    self.methodsInterface.call("message_ack", (jid, messageId))


    in die Listener, das wars auch schon ;)

    mfG
    Philip ;)

    Einmal editiert, zuletzt von philidinator (9. Dezember 2013 um 15:33)

  • Ich hab Gruppen geaddet im Listener:

    Das dient nur dazu Nachrichten in Gruppen zu empfangen in die ihr bereits eingeladen wurdet

    Einmal editiert, zuletzt von StillResonance1614 (9. Dezember 2013 um 22:10)

  • Moin,

    das hate ich ja

    Python
    pi@raspberrypi ~/wa2/yowsup/src $ ./yowsup-cli -c config.example -l -a -k
    Traceback (most recent call last):
      File "./yowsup-cli", line 35, in <module>
        from Examples.ListenerClient import WhatsappListenerClient
      File "/home/pi/wa2/yowsup/src/Examples/ListenerClient.py", line 78
        if wantsReceipt and self.sendReceipts:
                                             ^
    IndentationError: unindent does not match any outer indentation level

    so sieht die Datei im letzten Drittel aus


  • Nette Idee framp ;)
    Aber ich glaub ich werd's nicht nutzen da die Nummer viele kennen ;) viele Informatik Studenten xD
    Also lass ich's lieber hihi


    Keine Sorge. Mein Patch akzeptiert die Befehle nur von zu definierenden Telefonnummern ;)

    Ich habe alle Erweiterungen im Patch sowie wie man den Patch applied hier konsolidiert beschrieben.

    Allerdings ist das natürlich mit Vorsicht zu benutzen. Ich kann mir vorstellen, dass es möglich sein kann Telefonnummern bei WhatsApp zu fälschen :no_sad:. Auch gibt es gewisse Restriktionen. Die BefehlsfensterFunktion ist natürlich reduziert in ihrer Funktionalität (kann man sicherlich auch noch was dran drehen ... ist aber nur ein Prototyp. Wer will kann es ja erweitern). Ein Ersatz für ssh ist es natürlich nicht. Aber trotzdem ein nettes Feature.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!