Seite 1 von 1

ICQ-Client - Wie anfangen?

Verfasst: Donnerstag 5. März 2009, 11:03
von qqojnm
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

Verfasst: Donnerstag 5. März 2009, 11:35
von 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.

Verfasst: Donnerstag 5. März 2009, 12:02
von sma
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

Verfasst: Donnerstag 5. März 2009, 12:17
von Leonidas
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 :)

Verfasst: Donnerstag 5. März 2009, 15:09
von qqojnm
@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.

Verfasst: Donnerstag 5. März 2009, 15:38
von n4p
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 ;) )

Verfasst: Freitag 6. März 2009, 00:48
von Leonidas
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.

Verfasst: Freitag 6. März 2009, 08:27
von qqojnm
@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.

Verfasst: Freitag 6. März 2009, 10:13
von Leonidas
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.

Verfasst: Samstag 7. März 2009, 11:29
von sma
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

Verfasst: Samstag 7. März 2009, 13:17
von DasIch
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.

Verfasst: Dienstag 10. März 2009, 09:56
von sma
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

Verfasst: Dienstag 10. März 2009, 17:03
von DasIch
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.