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.
application-development
online-accounts
undetwas
quelle
quelle
Antworten:
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 erstellenprotocols/instagram.py
und Ihre Python-Klasse benennenInstagram
.Die beiden wichtigsten Methoden, die Sie unbedingt implementieren müssen, damit Ihr Plugin tatsächlich etwas tut, heißen
_whoami
undreceive
. Diese sind in base.py (oben verlinkt) gut dokumentiert, aber im Grunde wird die_whoami
Methode 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 SieFacebook._whoami
fü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
receive
Methode 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 bietenUploader
undDownloader
Klassen , 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 werdenlibsoup
und 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
tools
Verzeichnis 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 receive
und 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!
quelle