ubuntuusers.de

Nummer mit Text vergleichen und ersetzen.

Status: Ungelöst | Ubuntu-Version: Ubuntu 8.04 (Hardy Heron)
Antworten |

Ath0

Anmeldungsdatum:
24. September 2008

Beiträge: 674

Hallo leute ☺ ich arbeite grade an einem pidgin skript der mir anzeigt wer mir die letze nachricht geschrieben hat. funktioniert auch aber ich hab ein problem undzwar wird mir nur die UIN des Schreibers angezeigt nicht aber sein name.

ich hab bisschen recherchiert & herausgefunden das pidgin die Buddyliste in ~/.purple/blist.xml speichert.

folgende Syntax

-<contact>
<buddy account="485275651" proto="prpl-icq">
<name>258933556</name>
<alias>Robin</alias>
</buddy>
</contact>

gibt es einen weg mittels einem skript diese nummer in den Namen umzuwandel so dass es zb. in der datei blist.xml nach der nummer sucht und sie dann durch den namen ersetz?

wenn ihr weitere infos braucht sagt bescheid.

lg tobi

Murdoc

Avatar von Murdoc

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 132

Mir ist zwar nicht so wirklich klar was Du eigentlich machen willst, aber mal als Ansatz.

#!/bin/bash

awk -F"[<>]" ' /<name>|<alias>/ {
	 if ( $2 == "name" ) { print "Name: "$3 }
	 if ( $2== "alias" ) { print "Alias: "$3 }
} ' ~/.purple/blist.xml

Ath0

(Themenstarter)

Anmeldungsdatum:
24. September 2008

Beiträge: 674

Murdoc schrieb:

Mir ist zwar nicht so wirklich klar was Du eigentlich machen willst, aber mal als Ansatz.

das hier ☺ http://ubuntu-pics.de/bild/9192/pidgin_83SB6P.png

wie du sehen kannst bei Last Message ist dort die Nummer angegeben aber ich möchte das der name dort steht 😛

bisschen minimalistisch ich weiß aber ich bin perfektionist ☺

danke danke .

gibt es kein befehl der etwas ersetz?

zb. er sucht in Datei-1 nach eine nummer zb. 23423434 und ersetz die Nummer dann durch ath0 in Datei2?

lg tobi

Murdoc

Avatar von Murdoc

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 132

Doch das kannst Du mit sed machen:

sed "s/ICQNUMMER/ICQNAME/" FILE_ORIGINAL > FILE_NEW

Ath0

(Themenstarter)

Anmeldungsdatum:
24. September 2008

Beiträge: 674

Murdoc schrieb:

Doch das kannst Du mit sed machen:

sed "s/ICQNUMMER/ICQNAME/" FILE_ORIGINAL > FILE_NEW

danke.

da du jetzt weißt worum es geht?! noch eine frage.

& zwar benutze ich um die last Message auf den Bildschirm zu zaubern 2 Skripte

getim.py

#!/usr/bin/python

# ----- GETIM.PY // LISTEN FOR AN RECEIVED MESSAGE ------------#
################################################################
# MOST OF THIS SCRIPT  WAS TAKEN FROM THE PIDGIN DEVELOPER WIKI#
# PLEASE VISIT http://developer.pidgin.im/ FOR MORE INFORMATION#
################################################################

def conky_im(account, sender, message, conversation, flags):
    reg = '<(.|\n)+?>'          # REGEX FOR HTML TAGS
    message = re.sub(reg,'',message)    # REMOVE HTML TAGS
    sender = sender.split("@")[0]       # GET GCHAT NAME
    message = message[0:24]             # LIMIT TO 25 CHARS
    file = '/home/raw/Dokumente/pidgin.log'                          # LOCATION OF DATA FILE
    fim = open(file,"w")
    IM = sender
    fim.write(IM)
    fim.close()

import dbus, gobject, re
from dbus.mainloop.glib import DBusGMainLoop
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()

bus.add_signal_receiver(conky_im,
                dbus_interface="im.pidgin.purple.PurpleInterface",
                signal_name="ReceivedImMsg")

loop = gobject.MainLoop()
loop.run()

das obige skript schreibt eine log wo dann jeweils die ICQ nummer angegeben wird

lastim.py liest aus der log und gibt aus so sieht lastim.py aus.

#!/usr/bin/python

# SHOW LAST IM
f="/home/raw/Dokumente/pidgin.log"                  # REPLACE WITH YOUR DATA FILE. ie.CONKYIM.DAT
fim = open(f,'r')
im = fim.read()
print im
fim.close

kannst du es mir vllt. so verändern das es die nummer aus der log jeweils mit der nummer aus blist.xml identifiziert und ersetz?

ich weiß bisschen zuviel erwartet aber fragen kostet nichts ☺

lg tobi

Murdoc

Avatar von Murdoc

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 132

Sorry aber in Phyton habe ich keine Karten 😀

Ath0

(Themenstarter)

Anmeldungsdatum:
24. September 2008

Beiträge: 674

Murdoc schrieb:

Sorry aber in Phyton habe ich keine Karten 😀

okay. ☺ nicht schlimm.

werde diese nacht bisschen basteln.

aber danke für die basis befehle.

lg tobi

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Ich denke, du gehst verkehrt vor. Dein eigentliches Ziel ist es ja offensichtlich nicht, irgendetwas aus der XML-Datei zu lesen, sondern bei Erhalt einer neuen Nachricht den Namen des Absenders im Script auszugeben, oder?

Das lässt sich ohne irgendwelche Log-Dateien auch direkt über die DBus-API von Pidgin erledigen. Da ich selbst Pidgin nicht nutzt, kann ich dir trotz Python-Kenntnissen wenig helfen. Aber ich denke, du erreichst mehr Hilfe, wenn du einen neuen Thread mit richtigem Titel ala "Pidgin/DBus: Bei Erhalt einer Nachricht Absender ausgeben" startest. Dann werden nämlich Leute auf den Thread aufmerksam, die Pidgin nutzen und dir in der Richtung mehr helfen können.

BadBoy

Avatar von BadBoy

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 479

folgender Codeabschnitt sollte weiterhelfen:...

edit: ups...oder auch nicht. Naja, ich hab hier 'ne Lösung mit minidom, einem xml-Parser. ich frickel mal eben eine Funktion zusammen =D

tante edith returns: dumdidum, na also. Ich krieg ja doch ein bisschen was in Python hin:

1
2
3
4
5
6
7
8
import os, xml.dom.minidom
BUDDY_LIST_FILE = os.path.expanduser("~/.purple/blist.xml")
def getNameByICQid(icqid):
	data = xml.dom.minidom.parse(BUDDY_LIST_FILE).getElementsByTagName("buddy")
	for x in data: 
		if x.getElementsByTagName("name")[0].firstChild.data == icqid:
			return x.getElementsByTagName("alias")[0].firstChild.data
	return None

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Lunar schrieb:

Das lässt sich ohne irgendwelche Log-Dateien auch direkt über die DBus-API von Pidgin erledigen.

Ich kann mir gut vorstellen, dass er dies bereits tut, da sein Code doch arg an diesen erinnert.

Wie man jetzt aber konkret eine ICQ-Nummer in einen Alias übersetzt, weiß ich leider nicht.

BadBoy

Avatar von BadBoy

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 479

snafu1 schrieb:

Lunar schrieb:

Das lässt sich ohne irgendwelche Log-Dateien auch direkt über die DBus-API von Pidgin erledigen.

Ich kann mir gut vorstellen, dass er dies bereits tut, da sein Code doch arg an diesen erinnert.

Wie man jetzt aber konkret eine ICQ-Nummer in einen Alias übersetzt, weiß ich leider nicht.

na mit meinem Codeschnipsel =D

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Ich bezog mich auf D-Bus...

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

snafu1 schrieb:

Lunar schrieb:

Das lässt sich ohne irgendwelche Log-Dateien auch direkt über die DBus-API von Pidgin erledigen.

Ich kann mir gut vorstellen, dass er dies bereits tut, da sein Code doch arg an diesen erinnert.

Wie man jetzt aber konkret eine ICQ-Nummer in einen Alias übersetzt, weiß ich leider nicht.

PurpleBuddyGetAlias(buddy) vielleicht? Gefunden im DBus HowTo ...

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Lunar schrieb:

PurpleBuddyGetAlias(buddy) vielleicht? Gefunden im DBus HowTo ...

Nee, das bezieht sich auf so eine Art interne ID von Pidgin, die für die gesamte Kontaktliste gilt (also z.B. auch Jabber).

Die Icq-Nummer gehört ja zum Netzwerk von Icq. Und diese wird einem durch das Event angezeigt. Der OP möchte aber den zugehörigen Alias von seiner Kontakliste statt der Nummer.

Ich persönlich verstehe auch nicht, warum das so gehandhabt wird. Denn beim Event "BuddySignedOn" wird einem z.B. nur diese Buddy-ID zurückgegeben und da kann man auch die von dir erwähnte Methode nutzen, um den Alias zu kriegen. Bei Nachrichten aber offenbar nicht ohne weiteres.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Ach so ... wie gesagt, ich nutze Pidgin nicht.

Edit: Mmmh, kann es sein, dass sich hinter account im Signal (conky_im(account, sender, message, conversation, flags):) genau diese Id oder der DBus-Pfad zum entsprechenden DBus-Objekt dieses Accounts (über welches man an das Alias kommen würde) verbirgt?

Antworten |