Wie füge ich Freunden Unterstützung für neue Dienste hinzu?

19

Mit der neuen Freunde-App-Landung in Ubuntu kam mir der Gedanke , dass das Hinzufügen von Unterstützung für Instagram in der Timeline cool wäre. Ich dachte auch, ich könnte es selbst versuchen, aber es fällt mir schwer, Unterlagen zu finden.

Gibt es eine Spezifikation, die beschreibt, was von jedem Protokoll benötigt wird? Wie funktioniert die Authentifizierung? Müsste Support zuerst zu Ubuntu-Online-Konten hinzugefügt werden, oder gibt es eine Möglichkeit für Freunde, das neue Protokoll zu registrieren?

Es ist sehr neu und hat einen sehr schwer zu Google Namen, also wäre jeder Hinweis in die richtige Richtung dankbar.

undetwas
quelle
Dies ist das Beste, was ich für den Moment finden konnte: bugs.launchpad.net/ubuntu/+source/friends/+bug/1156979 und code.launchpad.net/~robru/gwibber/friends ABER es sieht so aus, als könnten Sie verwenden, was auch immer verwendet wurde für Gwibber (?)
Rinzwind
Nun, der Code für die unterstützten Protokolle scheint zu leben in: bazaar.launchpad.net/~super-friends/friends/trunk/files/head:/… Aber was ich wirklich sehen möchte, ist eine Spezifikation, die Fähigkeiten und dergleichen beschreibt. ..
Andrewsomething
Es ist noch früh;)
Rinzwind
Jemand gibt mir Tumblr PLZ.
Khurshid Alam

Antworten:

34

Freunde Autor hier.

Wie Sie vermutet haben, ist in Ubuntu-Online-Konten Support erforderlich, bevor Support zu Freunden hinzugefügt werden kann. Die Architektur von Friends hängt sehr stark von UOA ab, um die gesamte Autorisierung und Verwaltung aller API-Schlüssel für uns zu übernehmen. Mein Lieblingsbeispiel ist LinkedIn, weil es bislang das einzige Protokoll ist, das von der Community beigesteuert wurde. Das UOA-Plugin besteht zumeist nur aus zwei XML-Dateien und ein bisschen Autoconf-Trick, der so aussieht. (Scrollen Sie ein wenig nach unten, um das Diff zu sehen, das alle Elemente anzeigt, die hinzugefügt werden mussten, damit LinkedIn funktioniert).

Sobald Sie dasselbe für Ihr Protokoll getan haben, müssen Sie die Zusammenführung gegen lp: account-plugins vorschlagen und Mardy veranlassen, diese zu überprüfen, zu genehmigen und zusammenzuführen. Sobald dies geschehen ist, können Sie das Friends-Plugin schreiben, das in Python 3 geschrieben wird.

Eine der wichtigsten Verbesserungen, die Friends gegenüber Gwibber einführt, ist die Verwendung von Unterklassen. Im ursprünglichen Gwibber-Code wurde absolut nichts mit Unterklassen gemacht, so dass jedes neue Protokoll-Plugin ein riesiger Copy & Paste-Hackjob mit verschiedenen Funktionen auf niedriger Ebene war. Bei der Implementierung von Friends habe ich große Sorgfalt darauf verwendet, die allgemeinen Funktionen in eine Superklasse zu extrahieren, die einfach in Unterklassen unterteilt und geändert werden kann. Die Superklasse enthält auch eine ganze Reihe von Dokumentzeichenfolgen, auf die Sie bei den ersten Schritten verweisen sollten. Leider haben wir sphinx noch nicht eingerichtet, um diese zu veröffentlichen. Daher müssen Sie den Code erst einmal lesen.

Einige wichtige Dinge, die Sie beachten sollten, sind, dass der Name Ihrer Klasse mit dem verwendeten "Anbieternamen" übereinstimmen muss, wobei die Groß- und Kleinschreibung nicht berücksichtigt wird. Wenn Sie also den Providernamen definiert haben instagram, sollten Sie die Datei erstellen protocols/instagram.pyund Ihre Python-Klasse benennen Instagram.

Die beiden wichtigsten Methoden, die Sie unbedingt implementieren müssen, damit Ihr Plugin tatsächlich etwas tut, heißen _whoamiund receive. Diese sind in base.py (oben verlinkt) gut dokumentiert, aber im Grunde wird die _whoamiMethode automatisch aufgerufen und in einem Diktat übergeben, das einen bereits analysierten JSON-Blob darstellt, der uns vom Service bei der Authentifizierung übergeben wurde. Wenn Sie Glück haben, enthält dieses Diktat Ihren Instagram-Benutzernamen, Ihre Benutzer-ID und Ihren Anzeigenamen. Wenn nicht, müssen Sie einen sekundären API-Aufruf durchführen, um diese Informationen zu sammeln. Bitte beachten Sie Facebook._whoamifür ein Beispiel eines Protokolls , das die Informationen nicht vorne vorsah und einen zusätzlichen API - Aufruf benötigt , um von innerhalb des Verfahrens, und sehenTwitter._whoami Ein Beispiel für ein Protokoll, das uns alle Details lieferte, die wir von Anfang an brauchten.

Danach ist die receiveMethode dafür verantwortlich, den API-Aufruf durchzuführen, der den Dienst nach neuen Nachrichten abfragt. Diese ist etwas freier, da sich jede REST-API geringfügig unterscheidet. Lesen Sie daher die API-Dokumente der Website, um herauszufinden, was genau hier zu tun ist. In http.py wir bieten Uploaderund DownloaderKlassen , die es einfach machen REST - API - Aufrufe zu machen, und kann sogar Parsen JSON Server - Antworten für Sie. Es ist wichtig, diese Convenience-Klassen zu verwenden, da sie umbrochen werden libsoupund so konfiguriert sind, dass sie die GNOME-Proxy-Einstellungen berücksichtigen.

Sobald Sie die API-Antwort vom Server erhalten haben, müssen Sie sie in unserem DeeModel speichern (wo Gwibber einen JSON-Blob in einer SQLite-Datenbank zum Speichern Ihrer Nachrichten verwendet hat, verwenden wir ein DeeModel, das im Grunde genommen nur eine Datenbank ist) die den Status über den DBus hinweg gemeinsam nutzen, sodass mehrere Clients die Meldungsdaten problemlos anzeigen können). Wir nennen den Vorgang des Speicherns einer neuen Nachricht "Veröffentlichung" und bieten eine bequeme Methode dafür an Base._publish. Grundsätzlich müssen Sie hier nur die Lücken ausfüllen und sicherstellen, dass so viele Informationen wie möglich in so viele Spalten wie möglich eingegeben werden. Die möglichen Argumente für _publish sind im Schema definiert , und Sie können sich erneut auf die vorhandenen Plugins beziehen, um zu sehen, wie sie dies tun.

Wenn Sie soweit sind, sollten Sie genug haben, um es testen zu können. Das toolsVerzeichnis enthält einige Tools, mit denen Sie Ihren Code problemlos aus dem Quelltextbaum heraus ausführen können, sodass Sie ihn nicht jedes Mal auf dem System installieren müssen, wenn Sie Änderungen vornehmen möchten. Sie sollten nur ein Terminal öffnen, eine CD in das Stammverzeichnis des Quellbaums kopieren und ausführen ./tools/debug_slave.py. Damit stellen Sie eine Verbindung zum DeeModel her und zeigen einfach alles an, was damit passiert, sodass Sie Nachrichten live sehen können, wenn sie eingehen. Wechseln Sie dann in einem zweiten Terminal erneut zum Stammverzeichnis des Quellbaums, und führen Sie ./tools/debug_live.py instagram receiveund aus Dadurch wird die Instagram.receive-Methode manuell ausgelöst und es wird eine Reihe von Debugging-Ausgaben angezeigt, die Sie darüber informieren, was gerade läuft (Sie können Ihren Code mit Aufrufen von "" bestreuenlog.debug("hi") wenn Sie noch mehr Details darüber sehen möchten, was passiert).

Oh, und wenn Sie noch lesen, ist das linkedin-Plugin noch nicht im trunk gelandet, aber Sie können es sich hier noch ansehen.

Wenn Sie weitere Fragen haben, bin ich immer in #gwibber auf freenode und bin außerdem der festen Überzeugung, dass die neue Codebasis viel lesbarer und besser dokumentiert ist als alles, was Gwibber jemals hatte. Es ist nicht zu schwierig, anhand von Beispielen zu lernen. Facebook und Twitter sind die vollständigsten.

Vielen Dank für Ihr Interesse an Friends!

robru
quelle