Pidgin Nachrichtenweiterleitung über DBus

Eigentlich hat alles damit angefangen, dass ich mir ein "Googlephone" G1 gekauft habe. Dieses hat echt gute Features und durch eine gewisse Anbindung an die Googledienste auch Push-Funktionen, wie Googlemail. Ich bin mir nicht sicher, aber ich vermute, dass auch Google Talk auf dem G1 als Push-Dienst funktioniert.
Beim Hören eines Podcasts kam ich auf die Idee, mir Systemnachrichten über Google Talk auf das Handy schicken zu lassen. Als erstes ist mir dann aber etwas Anderes eingefallen. Es wäre schön, dass, wenn man sich vom Rechner entfernt, die eintreffenden IMs weitergeleitet werden würden. Wenn man dann dringend erreicht werden muss, merkt man das auch.
Eigentlich gleicht man damit nur nicht vorhandene Fähigkeiten der proprietären Protokolle gegenüber jabber aus. Aber wer nutzt schon jabber... (leider)
Lange Rede, kurze Zusammenfassung: Ich wollte eine Weiterleitung von IMs auf jabber (Google Talk). Von DBus hatte ich schon mal gehört, daher hab ich über die DBus-Anbindung von Pidgin versucht. Im Netz habe ich einige passende Codefragmente gefunden, die allesamt in Python geschrieben waren. Ich hab es dann auch mit Python versucht, obwohl ich davon nicht viel Ahnung habe. Und hier ist das zusammengestückelte Skript zur Nachrichtenweiterleitung:
#!/usr/bin/env python

# Version: 0.2

import sys
import os
import xmpp
import time
import urllib
import urllib2
import dbus
import gobject
import dbus.glib
from dbus.mainloop.glib import DBusGMainLoop

def sendToJabber(text):
	tojid = 'Empfängeradresse'
	jidparams={}
	jid=xmpp.protocol.JID('Benutzername@server.domain')
	cl=xmpp.Client(jid.getDomain(),debug=[])
	jidparams['username']="Benutzername Sender"
	jidparams['password']="Passwort"
	jidparams['resource']="away-forward"
	
	
	con=cl.connect()
	if not con:
    		print 'could not connect!'
    		sys.exit()
	print 'connected with',con
	auth=cl.auth(jidparams['username'],jidparams['password'],resource=jidparams['resource'])
	if not auth:
    		print 'could not authenticate!'
    		sys.exit()
	print 'authenticated using',auth

	id=cl.send(xmpp.protocol.Message(tojid,text))
	print 'sent message with id',id

	time.sleep(1)


def onSessionIdleChanged(state):
    global away
    if state:
	away=1
    else:
	away=0

def receivedMessage(account, sender, message, conversation, flags):
    buddy = purple.PurpleFindBuddy(account, sender)
    alias = purple.PurpleBuddyGetAlias(buddy)
    text = alias + ": " + message
    if away == 1:
        sendToJabber(text)




away=0
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
bus.add_signal_receiver(receivedMessage, dbus_interface="im.pidgin.purple.PurpleInterface", signal_name="ReceivedImMsg")
bus.add_signal_receiver(onSessionIdleChanged, 'SessionIdleChanged', 'org.gnome.ScreenSaver')
obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")


loop = gobject.MainLoop()
loop.run()
Der Knackpunkt bei der Sache ist die Abfrage, ob der Benutzer abwesend ist. Ich habe es gelöst, indem das Skript den away-Status von Pidgin abfragt. Dazu habe ich mir einen extra Status angelegt, der bei kurzer Abwesenheitszeit automatisch eingestellt wird. Dabei wird dann auch automatisch das Google Talk-Konto abgemeldet, um eine unendliche Nachrichtenschleife vermieden wird. Da ich noch Twitgin für Twitter nutze, melde ich dieses damit auch automatisch ab, um nicht diese Nachrichten auch noch weitergeleitet zu bekommen. Leider gibt DBus den Status nicht unter dem bei Pidgin eingestellten Namen weiter, sondern unter einer Nummer. Diese muss man erst einmal herausfinden. Dafür ist die Zeile "print status". Startet man das Skript im Terminal, gibt dies den aktuellen Pidginstatus aus. Den Richtigen (den für abwesend) muss man dann in der nächsten Zeile eintragen.
Der Rest ist recht selbsterklärend, man benötigt nur die Adresse des Ziel-Google-Talk-Kontos und die Zugangsdaten eines zweiten jabber-Kontos zum Nachrichten senden.

Leider gibt es in Google Talk einen Bug beim Nachrichtenempfang (nicht alle werden angezeigt), aber man erhält jede Nachricht als Benachrichtigung. Und hoffentlich wird der Fehler in Android bald behoben!

Update: Das mit den Statusnummern hat sich als unzuverlässig erwiesen. Daher hab ich auf den Idle-Status von Gnome umgeschwenkt (schon im Code ergänzt).

Trackback URL:
https://barahir.twoday.net/stories/5827112/modTrackback

User Status

Du bist nicht angemeldet.

Suche

 

Aktuelle Beiträge

VDR 1.7 auf Dockstar
weiss jemand wie man die abhängigkeit lösen kann vdr-plugin-xinelibout put...
karsten (Gast) - 16. Apr, 10:20
Umzug
Nach ganzen sechs Jahren ist hier nun Schluss und der...
Barahir - 3. Jan, 21:11
Ich hab versucht das...
Ich hab versucht das Verzeichnis anzupassen, das hat...
Barahir - 15. Nov, 13:22

Charts Lieblingskünstler - Diese Woche

RSS Box

Das Manifest des Web 4.
Torsten - 20. Jan, 20:45
Ein Klick mehr
Frei nach Archimedes: Gib mir einen Klick mehr, und...
Torsten - 13. Aug, 10:30
Nerd ist…
…wenn deine Wohnung von Steckdosenleistenschalterl ichtern...
Torsten - 12. Mai, 14:38
Die Instant-Messenger-Rekursio n
Wenn WhatsApp behauptet, das Klopapier sei ausverkauft,...
Torsten - 15. Mär, 13:03
Nerd ist…
… social distancing like a pro.
Torsten - 10. Mär, 19:16
Bluetooth-Ethik
„Ich — in der Hölle? Warum? Ich bin Ingenieur!“ „Ein...
Torsten - 26. Aug, 10:15
Weltkulturerbe Diskette
Wir sollten die Diskette zum UNO-Weltkulturerbe machen....
Torsten - 12. Aug, 09:33
Cloud – Deutsch: Jetzt lesen
Fürs Wörterbuch Cloud – Deutsch: „Jetzt...
Torsten - 22. Jul, 09:16
Cloud – Deutsch: Kontakte
Fürs Wörterbuch Cloud – Deutsch: „Wirf...
Torsten - 21. Jul, 14:09
KI 2.0
2025 stellten die Forscher ihre Forschungen zur Künstlichen...
Torsten - 3. Dez, 08:39

Status

Online seit 6594 Tagen
Zuletzt aktualisiert: 16. Apr, 10:20