Mittels Python-Code am XMPP-Server anmelden und eine Nachricht versenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

Hallo liebe Python-Freunde!

Ich würde mir gerne mit Hilfe eines Python-Scriptes Statusmeldungen auf meinen XMPP-Client auf meinem Handy schicken lassen.
Dazu habe ich folgendes Script geschrieben:

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Import Bibliotheken
import sys
import os
import time
import xmpp

# Variablen initialisieren
Timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
Server = 'blabber.im'
Port = 5222
msg = 'Hallo Welt!'

# Authentifizierung
username = 'Sende-Account@blabber.im'
passwd = 'VollDasGeheimePasswort'

# Ziel
to='Empfangs-Account@blabber.im'

# Verbindung herstellen
xmpp.protocol.JID(username)
client = xmpp.Client(Server, Port, debug=[])

try:
    conn = client.connect()
    print ('Connecting...')
    
except:
    print ('Connection failed')
    pass

print ('Connected.')
client.sendInitPresence(0)

# Anmelden
try:
    login = client.auth(username, passwd)
    print ('Login successfull.')
    
    # Nachrichtenversand
    print (Timestamp)
    
    message = xmpp.Message(to, msg)
    message.setAttr('type', 'chat')
    print (message)
    client.send(message)

except:
    print ('Authentication failed')
    try:
        conn = client.disconnect()
        print ('Disconnected.')
        
    except:
        print ('Connection still active!')
        pass


print ('End.')
Das Script scheint auch fast zu funktionieren. Fast im Sinne von, es kommt keine Fehlermeldung. Ich bekomme folgenden Output:

Code: Alles auswählen

=================== RESTART: /home/pi/XMPP-Message V1.9.py ===================
Connecting...
Connected.
Authentication failed
Disconnected.
End.
>>>  
Leider scheine ich dabei ein Problem mit der Anmeldung zu haben.
Die Verbindung zum Server scheine ich wohl noch hinzubekommen, aber beim Login nimmt das Programm dann immer den Weg "authentication failed"
Kann mir jemand von euch sagen, was ich falsch mache? Ich finde den Fehler einfach nicht.

Vielen Dank im Voraus und beste Grüße
U32
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Solche nackten try/except macht man nicht, weil sie alle moeglichen Fehler verschleiern. Du *denkst* du hast ein Authentication Problem. Es koennte auch ein NameError oder IndexError sein. Weiss man nicht. Schmeiss die also mal alle raus, und dann schau mal, was *wirklich* passiert.
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

Hallo __deets__ !

Vielen Dank für die schnelle Antwort.
Ich probiere es gleich mal aus.
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

So... Moin!

Hab den try/except Kram also nun entfernt.
Code sieht nun so aus:

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Import Bibliotheken
import sys
import os
import time
import xmpp

# Variablen initialisieren
Timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
Server = 'blabber.im'
Port = 5222
msg = 'Hallo Welt!'

# Authentifizierung
username = 'Sende-Account@blabber.im'
passwd = 'VollDasGeheimePasswort'

# Ziel
to='Empfangs-Account@blabber.im'

# Verbindung herstellen
xmpp.protocol.JID(username)
client = xmpp.Client(Server, Port, debug=[])
conn = client.connect()
client.sendInitPresence(0)

# Anmelden
login = client.auth(username, passwd)

# Nachrichtenversand
print (Timestamp)
message = xmpp.Message(to, msg)
message.setAttr('type', 'chat')
print (message)
client.send(message)
conn = client.disconnect()
print ('End.')

Und dieser Code liefert dann diesen Output:

Code: Alles auswählen

================== RESTART: /home/pi/XMPP-Message V1.10.py ==================
Traceback (most recent call last):
  File "/home/pi/XMPP-Message V1.10.py", line 31, in <module>
    login = client.auth(username, passwd)
  File "/usr/local/lib/python3.7/dist-packages/xmpp/client.py", line 217, in auth
    while not self.Dispatcher.Stream._document_attrs and self.Process(1): pass
  File "/usr/local/lib/python3.7/dist-packages/xmpp/dispatcher.py", line 126, in Process
    raise _pendingException[0](_pendingException[1]).with_traceback(_pendingException[2])
  File "/usr/local/lib/python3.7/dist-packages/xmpp/dispatcher.py", line 304, in dispatch
    handler['func'](session,stanza)
  File "/usr/local/lib/python3.7/dist-packages/xmpp/dispatcher.py", line 216, in streamErrorHandler
    raise exc((name,text))
xmpp.protocol.NotAuthorized: ('not-authorized', '')
>>> 
Ich bin - zugegeben - jetzt nicht wirklich schlauer. Kannst du die Fehlermeldung genauer interpretieren?

Vielen Dank und beste Grüße
U32
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@U32: Welche Bibliothek hast Du denn da installiert und was sagt die Dokumentation zu der `login()`-Methode?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

@__blackjack__ :
Die Lib heißt XMPP und eine Dokumentation dazu habe ich leider nicht. :oops:
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@U32: Wo hast Du die Bibliothek denn her?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

@__blackjack__

sudo apt-get install xmpp
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@U32: Dann musst du herausfinden, welche Bibliothek sich dahinter verbirgt und deren Dokumentation lesen. Wie willst du denn sonst mit dem Modul arbeiten?
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

Moin!
OK, dann muss ich mich wohl auf die Suche machen...
Hat denn jemand von euch grundsätzliche Erfahrung mit dem versenden von XMPP-Nachricht aus einem Script heraus?
Ich meine könnte es sein, das Anbieter das scriptgesteuerte Versenden von Nachrichten unterbinden (es nur über über die entsprechenden Clients möglich ist) ?
Danke und Gruß
U32
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Woran unterscheiden die das? Ein Skript ist auch nur ein Client.
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

Ähnlich wie die Übermittlung welcher Web-Browser beim Besuch einer Website verwendet wird.
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

Ich möchte nur ausschließen, dass ich ein grundsätzliches Problem habe.
Deshalb hatte ich gefragt, ob es hier im Forum jemanden gibt, der schon mal eine XMPP-Nachricht aus einem Script heraus an einen anderen Client gesendet hat.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Hallo U32,

vorweg: Ich hab leider keine Erfahrung mit XMPP-Servern. Aber vielleicht hilft das ein wenig:

Es scheint, als würdest du das xmpppy package verwenden. - Reine Vermutung, denn dein Code sieht dem Beispielcode dort sehr ähnlich:
https://pypi.org/project/xmpppy/

Dort wird die Authentifizierung so gemacht:

Code: Alles auswählen

connection.auth(user=jid.getNode(), password=password, resource=jid.getResource())
Es scheint auch als währe das ein Raspberry Pi Projekt. Falls du das nach einem Tutorial oder sonstigen Anleitung machst, währe es hilfreich hier einen Link darauf zu posten. Dann hätte man schonmal einiges mehr an Information.

Ich gehe mal davon aus, dass es den User
'Sende-Account@blabber.im'

mit dem Passwort
'VollDasGeheimePasswort'

auf dem Server auch wirklich gibt....
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

Hallo in die Runde!

Es ist zwar schon eine Weile her seit meinem letzten Posting, aber dafür gibt es gute Nachrichten:

Das Problem ist gelöst!
Mit diesem Code ist es mir gelungen, mich aus einem Python-Code heraus an einem XMPP-Server anzumelden und eine Nachricht zu versenden.

Code: Alles auswählen

#!/usr/bin/python3

# Import Bibliotheken
import sys
import os
import time
import xmpp


def message(Text):

    # Authentifizierung
    Server = "jabber.de"
    username = "<Name_des_Absende-Accounts>@jabber.de" # An dieser Stelle steht die Absende-Adresse
    passwd = "<Password>" # Hier steht das Passwort

    # Ziel
    #receiver="<Name des Empfangs-Accounts>@jabber.de" # An dieser Stelle kommt die Empfangs-Adresse
	receiver="<Name des Chatraumes>@conference.jabber.de" # An dieser Stelle steht der maschinell generierte Name des Chatraumes (z.B. efeugnt@conference.jabber.de)

    # Verbindung herstellen
    jid = xmpp.protocol.JID(username) # JabberID zusammenbauen
    conn = xmpp.Client(Server, debug=[]) # Verbindung zum Server einrichten
   
    conn.connect() # Verbindung zum Server öffnen
        
    # Anmelden
    login = conn.auth(user=jid.getNode(), password=passwd, resource=jid.getResource()) # Am Server authentifizieren
            
    # Nachrichtenversand
    msg1 = xmpp.protocol.Message(to=receiver, body=Text) # Nachricht und Empfänger festlegen
	conn.send(msg1) # Die eigentliche Nachricht versenden
        
    conn.disconnect() # Verbindung zum Server wieder schließen/trennen
    
Das senden von Nachrichten an eine Empfänger-Adresse funktioniert - wie gesagt - schon sehr gut und zuverlässig.
Nun möchte ich diese Nachrichten - in diesem Fall Statusmeldungen - aber gerne an einen Chatraum senden, um mehrere Empfänger zu erreichen.
Der Chatraum ist eingerichtet und mit Handy und zwei Tabletts erfolgreich getestet.

Wenn ich aber nun - wie oben im Code angedeutet - nicht den Namen des Empfangs-Account eingebe, sondern den Namen des Chatraumes, dann funktioniert es plötzlich nicht mehr.
Es passiert aber auch nichts, ich bekomme also auch keine Fehlermeldung und die Nachricht wird nicht gesendet.

Hat hier im Forum jemand Erfahrung in der Verwendung von XMPP für den Versand von Status-Meldungen?
Kann mir jemand sagen, ob das senden an Gruppenchats bzw. Chaträumen theoretisch überhaupt gehen sollte?

Ich meine, was mache ich denn bei der Nutzung meines Handy-Clients anders?
Ich sende die Nachricht doch auch an z.B. "efeugnt@conference.jabber.de" und sie wird verarbeitet...

Bin für jeden Hinweis dankbar!

Vielen Dank und beste Grüße
U32
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

U32 hat geschrieben: Donnerstag 21. Oktober 2021, 21:07 Kann mir jemand sagen, ob das senden an Gruppenchats bzw. Chaträumen theoretisch überhaupt gehen sollte?
Dieser Seite [1] zufolge müßtest Du den betreffenden Raum erst einmal betreten, um hineinschreiben zu können.

[1] https://stackoverflow.com/questions/112 ... ing-xmpppy
Antworten