フレンドに新しいサービスのサポートを追加する方法は?


19

Ubuntuに新しい友達アプリが登場したことで、タイムラインにInstagramのサポートを追加するのはクールだと思いました。自分で突き刺すかもしれないと思っていましたが、ドキュメントを見つけるのに苦労しています。

各プロトコルから何が必要かを説明する仕様はありますか?認証はどのように機能しますか?最初にubuntu-online-accountsにサポートを追加する必要がありますか、または友人が新しいプロトコルを登録する方法はありますか?

これは非常に新しく、Googleに名前を付けるのが非常に難しいため、正しい方向へのポインタをいただければ幸いです。


これは私が今のところ見つけることができる最善の方法です:bugs.launchpad.net/ubuntu/+source/friends/+bug/1156979code.launchpad.net/~robru/gwibber/friendsいますが、使用されたものを使用することができますように見えますGwibber(?)
Rinzwind

サポートされているプロトコルのコードは、bazaar.launchpad.net / 〜super-friends / friends / trunk / files / head/ ...にあるようです。しかし、私が本当に見たいのは、機能などを記述した仕様です。 ..
andrewsomething

それはまだ初期段階です;)
Rinzwind

誰かがtumblr plzをくれました。
ルシッドアラム

回答:


34

友人の著者はこちら。

確かに、あなたが疑ったように、サポートをフレンドに追加するには、Ubuntuオンラインアカウントでのサポートが必要です。Friendsアーキテクチャは、すべての認証を行い、すべてのAPIキーを管理するために、UOAに大きく依存しています。私のお気に入りの例はLinkedInです。これは、これまでのところコミュニティが貢献した唯一のプロトコルだからです。UOAプラグインは、主に2つのXMLファイルに加えて、このように見えるautoconfのちょっとしたトリックです。(差分を少しスクロールすると、LinkedInが機能するために追加する必要があるすべてのものが明確に表示されます)。

プロトコルで同じことを行ったら、lp:account-pluginsに対してマージを提案し、Mardyにレビュー、承認、マージを依頼する必要があります。それが整ったら、フレンドプラグインの作成を開始できます。これはPython 3で作成されます。

現在、FriendsがGwibberで導入した主要な主要な改善点の1つは、サブクラスの使用です。元のGwibberコードでは、サブクラスではまったく何も行われなかったため、新しいプロトコルプラグインはすべて、さまざまな低レベル機能の巨大なコピーアンドペーストハックジョブでした。Friendsを実装するときは、共通の機能をスーパークラスに抽出するように細心の注意を払いました。スーパークラスは簡単にサブクラス化および変更できます。また、スーパークラスには非常に多くのdocstringがあり、開始時に参照する必要があります。残念ながら、これらをまだどこにも公開するようにsphinxを設定していないので、今のところコードを読むだけで済みます。

覚えておくべき重要なことは、クラスの名前が、大文字と小文字を区別せずに使用される「プロバイダ名」と一致する必要があるということです。したがって、providernameをに定義した場合instagram、ファイルを作成し、protocols/instagram.pyPythonクラスに名前を付ける必要がありますInstagram

プラグインが実際に何かをするために絶対に実装しなければならない2つの最も重要なメソッドは、と呼ば_whoamireceiveます。これらはbase.py(上記にリンク)で詳しく説明されていますが、基本的に_whoamiメソッドは自動的に呼び出され、認証が行われたときにサービスによって提供された既に解析されたJSON blobを表す辞書に渡されます。運が良ければ、その辞書にはInstagramのユーザー名、ユーザーID、表示名が含まれますが、そうでない場合は、その情報を収集するために2次API呼び出しを行う必要があります。前もってFacebook._whoami情報を提供せず、メソッド内からの追加のAPI呼び出しが必要なプロトコルの例を参照してください。Twitter._whoami すぐに必要なすべての詳細を提供してくれたプロトコルの例。

その後、receiveメソッドは、新しいメッセージのサービスをポーリングするAPI呼び出しを行います。これはもう少し自由形式です。RESTAPIはすべて少し異なるため、ここで何を行う必要があるかを正確に把握するには、WebサイトのAPIドキュメントを参照する必要があります。http.py では、REST API呼び出しを簡単に行えるクラスUploaderDownloaderクラスを提供し、JSONサーバーの応答を解析することもできます。これらの便利なクラスlibsoupはGNOMEプロキシ設定を尊重するように構成されているため、これらの便利なクラスを使用することが重要です(Gwibberのプロキシサポートが常にいかにひどいものだったかを思い出すことができます。

サーバーからAPIレスポンスを取得したら、それをDeeModelに保存する必要があります(Gwibberはメッセージを保存するためにsqlite dbにダンプされたJSON blobを使用しましたが、基本的にはデータベースであるDeeModelを使用しています) DBus全体で状態を共有し、複数のクライアントがメッセージデータを簡単に表示できるようにします)。新しいメッセージを保存するという行為を「公開」と呼び、その便利なメソッドをで提供していBase._publishます。基本的にあなたがしなければならないことは、ここに空白を埋めることです。可能な限り多くの情報が可能な限り多くの列に記入されるようにしてください。_publishの可能な引数はschema定義されています。また、既存のプラグインを参照して、それらがどのように機能するかを確認できます。

ここまで到達したら、テストできる十分な容量が必要です。toolsソースツリー内からコードを簡単に実行できるように、ディレクトリにいくつかのツールを提供しているため、変更するたびにシステムにインストールする必要はありません。あなたがすべきことは、1つのターミナルを開いて、ソースツリーのルートにcdし、実行すること./tools/debug_slave.pyです。それはDeeModelに接続し、発生したすべてを表示するので、メッセージが入ってくるとライブで表示されます。次に、2番目のターミナルで、ソースツリーのルートに再度cdし、実行./tools/debug_live.py instagram receiveしてこれにより、Instagram.receiveメソッドが手動でトリガーされ、実行中に何が起こっているかを示すデバッグ出力の束が表示されます(log.debug("hi") 何が起こるかについてさらに詳しく知りたい場合)。

ああ、まだ読んでいるのなら、linkedinプラグインはまだtrunkに到達していませんが、ここでそれを見ることができます。

他に質問がある場合、私は常にfreenodeの#gwibberにいます。また、新しいコードベースはGwibberがこれまでに持っていたものよりもはるかに読みやすく、文書化が優れていると強く感じています。例で学ぶには難しすぎる。FacebookとTwitterが最も完全です。

友達に興味を持ってくれてありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.