ICQ-Client - Wie anfangen?

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
qqojnm
User
Beiträge: 5
Registriert: Dienstag 16. Dezember 2008, 23:10

Hi,

ich habe vor mir einen eigenen ICQ-Client zu schreiben, da mir die ganzen alternativen Clients nicht mehr wirklich gefallen und es eine Art Herausforderung für mich ist.

Das größte Problem ist jetzt aber leider der Anfang...

Ich habe schon versucht, etwas übers OSCAR-Protokoll rauszufinden, bin da auch mehr oder weniger fündig geworden.
-> http://dev.aol.com/aim/oscar/

Leider habe ich noch nie so wirklich mit solchen Protokollen gearbeitet und weiß deswegen nicht, wie ich da jetzt anfangen soll...
Es wäre schön, wenn ihr mir ein paar Ansätze geben könntet ^^

Grüße,
qqojnm
BlackJack

@qqojnm: Als erstes würde ich mal schauen ob es da schon etwas fertiges in Python gibt. Falls nicht, würde ich schauen, ob sich die `libpurple` von Pidgin/Adium einfach mit dem `ctypes`-Modul ansprechen lässt.

Man muss das Rad nicht unbedingt neu erfinden.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich würde mich einen IRC-Server nehmen, mich an RFC 1459 orientieren, und einfach anfangen, dass Protokoll zu implementieren. Das Message-Format (2.3.1) ist textbasiert und sieht einfach genug aus, dass man da eigentlich schnell erste Erfolge erzielen können sollte.

Der Ansatz wäre aber nur sinnvoll, wenn der Weg das Ziel ist, sprich, man einfach mal lernen will, wie das Protokoll funktioniert.

Wen du nur ein anderen UI haben willst, dann hat BlackJack recht.

Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:@qqojnm: Als erstes würde ich mal schauen ob es da schon etwas fertiges in Python gibt. Falls nicht, würde ich schauen, ob sich die `libpurple` von Pidgin/Adium einfach mit dem `ctypes`-Modul ansprechen lässt.
Ich meine mich zu erinnert, dass mitsuhiko die libpurple mal gewrappt hat. Und ja, es gibt auch Python-Implementationen des ICQ-Client-Protokolls, nutzt etwa PyICQ-t.

Andererseits: Jabber > ICQ :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
qqojnm
User
Beiträge: 5
Registriert: Dienstag 16. Dezember 2008, 23:10

@BlackJack, klingt schon interessant, aber ich habe noch nie was mit ctype gemacht, daher wüsste ich nicht, wie ich das angehen soll oder wie aufwändig/kompliziert das werden würde.

@sma, "der Weg ist das Ziel" ist schon nicht so falsch, da ich gerne etwas ganz selbst mache, also etwas, von dem ich sagen kann, "alles meins".
Du sagst "einfach anfangen, das Protokoll zu implementieren". Ich bin da allerdings noch etwas unerfahrener.
Ich bräuchte z.B. erstmal etwas Handfestes, oder irgend eine Referenz/ein Tutorial wie ich überhaupt eine Verbindung zu einem Server aufbaue und wie ich solche Nachrichten absende bzw. empfange, die dem Protokoll entsprechen.

@Leonidas, habe mir das mal angeguckt und eine Datei oscar.py gefunden. Ist sehr groß und am Anfang steht was von unstable... Gibt es eine Referenz oder Beschreibung dazu? Habe auf die Schnelle nichts gefunden.
ich habe vor mir einen eigenen ICQ-Client zu schreiben, da mir die ganzen alternativen Clients nicht mehr wirklich gefallen und es eine Art Herausforderung für mich ist.
Da fehlt wohl ein "sehr groß" vor "Herausforderung" :-/
Naja, lern ich halt umso mehr dazu...

Edit: Nur damit ihr nichts all zu großes von mir erwartet: Ich habe erst etwa ein halbes Jahr Praxiserfahrung mit Python. Sonst nur Erfahrungen mit anderen Sprachen wie C#, php und so. Daher kenne ich nur wenige Module und Build-In-Funktionen in Python.
n4p
User
Beiträge: 55
Registriert: Dienstag 10. Juni 2008, 11:05

Das als Aufgabe zu sehen ist ja schön und gut aber ich glaube bis du sowas zu deiner Zufriedenheit entwickelt hast dauert es eine ganze Zeit.
Was gefällt dir denn an den bestehenden nicht bzw was fehlt dir?
Oder geht's dir weniger um die Funktionalität als um die Herausforderung (da bringt dir dann natürlich ein fertiger Client nichts ;) )
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

qqojnm hat geschrieben:@Leonidas, habe mir das mal angeguckt und eine Datei oscar.py gefunden. Ist sehr groß und am Anfang steht was von unstable... Gibt es eine Referenz oder Beschreibung dazu? Habe auf die Schnelle nichts gefunden.
Nein, wohl nicht, aber du kannst den Autor anmailen.

Anderseits, wenn du noch nie mit soetwas gearbeitet hast ist ICQ wohl nach Skype das denkbar schlechteste Protokoll zum lernen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
qqojnm
User
Beiträge: 5
Registriert: Dienstag 16. Dezember 2008, 23:10

@n4p, naja, es geht mir doch schon eher darum, einfach mal selbst sowas zu machen und eben diese Herausforderung zu haben. Das mein Client später eher schlechter sein würde, als die anderen Clients denke ich schon... naja.

@Leonidas, da hast du wohl recht. Was könntest du mir denn eher empfehlen?
Jabber der IRC? Afair sind ja beide Protokolle recht gut/einfach.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

qqojnm hat geschrieben:@Leonidas, da hast du wohl recht. Was könntest du mir denn eher empfehlen?
Jabber der IRC? Afair sind ja beide Protokolle recht gut/einfach.
Ja, eher schon. IRC ist die Standardwahl, auch wenn das Protokoll ziemlich übel ist. Ich glaube ich fände eine Implementation von Jabber interessanter.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

qqojnm hat geschrieben:@sma, "der Weg ist das Ziel" ist schon nicht so falsch, da ich gerne etwas ganz selbst mache, also etwas, von dem ich sagen kann, "alles meins".
Du sagst "einfach anfangen, das Protokoll zu implementieren". Ich bin da allerdings noch etwas unerfahrener.
Ich bräuchte z.B. erstmal etwas Handfestes, oder irgend eine Referenz/ein Tutorial wie ich überhaupt eine Verbindung zu einem Server aufbaue und wie ich solche Nachrichten absende bzw. empfange, die dem Protokoll entsprechen.
Du könntest mal nach "Python Socket" googeln und dir die Dokumentation oder ein HOWTO durchlesen. Du könntest auch z.B. von dem Wissen aus, dass Python HTTP oder XMLRPC kann, ausgehend diese Implementierungen anschauen. Ich muss sagen, von Java her bin ich eine etwas einfachere Socket-Schnittstelle gewohnt, als sie Python zu bieten scheint, aber letztlich öffnet man auch hier ein Socket, schreibt oder liest Bytes und verarbeitet diese dann.

IRC ist ein Text-basiertes Protokoll, das glaube ich nur für ASCII oder ein nicht näher definiertes 8-Bit-Encoding funktioniert. Möglicherweise wurde es irgendwann man für UTF-8 aufgebohrt. Ich weiß es nicht. Die Befehlsstrings, die da verschickt werden, lassen sich jedenfalls leicht mit regulären Ausdrücken (oder manuell mit split() und find()) zerlegen und so analysieren. Dann schreibst du pro Befehl eine Python-Funktion, die gemäß des Standards reagiert.

Ein Kollege von mir schreibst gerade eine IRC-Server in Clojure (just for fun um die Sprache zu lernen) und ein einfacher Server hat weniger als 150 Zeilen Code. Daher nehme ich die Zuversicht, dass auch ein einfacher Client nicht weiter schwierig wäre.

Von XMPP als ersten Versuch würde ich abraten, da dieses Protokoll viel komplexer ist und man deutlich mehr Vorwissen braucht, was z.B. XML, Namensräume und andere Netzwerkprotokolle angeht. Desweiteren ist die Spezifikation mindestens 10x umfangreicher.

Dafür ist XMPP als Kommunikationsinfrastruktur interessanter. Unseren Versuch, einen XMPP-Server mit Clojure zu bauen, haben wir aber ganz schnell wieder aufgegeben und nach zwei Stunden hatte ich auch keine Lust mehr, die einfach nicht enden wollende XMPP-Dokumentation zu lesen ;)

Stefan
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

sma hat geschrieben:IRC ist ein Text-basiertes Protokoll, das glaube ich nur für ASCII oder ein nicht näher definiertes 8-Bit-Encoding funktioniert.
Die Befehle usw. sind in ASCII, für Nachrichten selbst ist kein Encoding definiert uns es gibt auch keine Möglichkeit dass Encoding über das Protokol herauszubekommen.
sma hat geschrieben:Ein Kollege von mir schreibst gerade eine IRC-Server in Clojure (just for fun um die Sprache zu lernen) und ein einfacher Server hat weniger als 150 Zeilen Code. Daher nehme ich die Zuversicht, dass auch ein einfacher Client nicht weiter schwierig wäre.
Verbinden und die Verbindung aufrecht erhalten ist in ca. 80 Zeilen Code drin. Allerdings hat man dann keine User Interaktion und reagiert nur auf einen einzigen Befehl des Protokolls.

EDIT: Syntax gefixt.
Zuletzt geändert von DasIch am Dienstag 10. März 2009, 17:01, insgesamt 1-mal geändert.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

DasIch hat geschrieben:
sma hat geschrieben:Ein Kollege von mir schreibst gerade eine IRC-Server in Clojure (just for fun um die Sprache zu lernen) und ein einfacher Server hat weniger als 150 Zeilen Code. Daher nehme ich die Zuversicht, dass auch ein einfacher Client nicht weiter schwierig wäre.
Verbinden und die Verbindung aufrecht erhalten ist in ca. 80 Zeilen Code drin. Allerdings hat man dann keine User Interaktion und reagiert nur auf einen einzigen Befehl des Protokolls.
Du kennst seinen Code? ;) Oder was meinst du? Der Clojure-Code hat etwa 150 Zeilen und unterstützt NICK, LIST, USER, JOIN, PING und PRIVMSG sagt er. Ich denke, man könnte das auch noch um einige Zeilen kürzen. Was nicht so schön ist, dass er pro Client einen Thread braucht, so wie das bei klassischer Socket-Programmierung in Java notwendig ist. Nio hingegen ist so low-level, dass man dort deutlich mehr als 80 Zeilen für die Verbindung bräuchte oder noch mal eine Bibliothek einsetzen müsste. Clojure bietet da meines Wissens leider noch nichts.

Stefan
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

sma hat geschrieben:Du kennst seinen Code? ;)
Nein, dass nicht, ich wollte nur sagen wieviel man in Python etwa braucht. Zugegeben die Formulierung war unverständlich.
Antworten