Як додати підтримку нових служб для Друзів?


19

З посадкою нового додатка для друзів в Ubuntu мені спало на думку, що додавати підтримку Instagram на часовій шкалі буде здорово. Я також думав, що міг би зробити це, але мені важко знайти будь-яку документацію.

Чи є специфікація, що описує, що потрібно від кожного протоколу? Як працює auth? Чи потрібно спочатку додати підтримку до облікових записів ubuntu-online, або друзі можуть зареєструвати новий протокол?

Це дуже нове і дуже складне ім’я Google, тому будь-які вказівники в правильному напрямку були б вдячні.


Це найкраще, що я міг би знайти зараз: bugs.launchpad.net/ubuntu/+source/friends/+bug/1156979 та code.launchpad.net/~robru/gwibber/friends, але схоже, ви можете використовувати все, що було використано для Gwibber (?)
Rinzwind

Добре, що код підтримуваних протоколів, здається, живе в: bazaar.launchpad.net/~super-friends/friends/trunk/files/head:/… Але я дуже хотів би побачити специфікацію, що описує можливості та таке. ..
andrewsomething

Ще ранні дні;)
Rinzwind

Хтось дасть мені tumblr plz.
Хуршид Алам

Відповіді:


34

Друзі автор тут.

Дійсно, як ви підозрювали, підтримка в Інтернет-акаунтах Ubuntu потрібна, перш ніж підтримка може бути додана до Друзів. Архітектура друзів дуже сильно залежить від UOA, щоб зробити всю авторизацію та керувати всіма ключами API для нас. Мій улюблений приклад - LinkedIn, оскільки це поки що єдиний протокол, який внесла спільнота. Плагін UOA - це здебільшого два файли XML, а також трохи хитрості автоконфігурації, яка виглядає приблизно так. (прокрутіть трохи вниз для розл., що чітко показує кожну річ, яку потрібно було додати для роботи LinkedIn).

Після того, як ви зробите те ж саме для свого протоколу, вам потрібно запропонувати злиття проти lp: account-plugins та змусити Mardy переглянути, затвердити та об'єднати їх. Як тільки це буде на місці, ви можете почати писати плагін для друзів, який буде записаний на Python 3.

Тепер одне з найважливіших удосконалень, яке Друзі впроваджують над Gwibber, - це використання підкласів. У оригінальному коді Gwibber абсолютно нічого не було зроблено з підкласами, тому кожен новий плагін протоколу був величезною копією та вставкою різноманітних бітів функцій низького рівня. Реалізуючи Friends, я дуже обережно витягнув загальну функціональність у надклас, який можна легко підкласифікувати та змінити. У суперкласі також є досить багато докстрингів, на які слід звернутися, починаючи. На жаль, ми ще не створили сфінкс, щоб публікувати їх у будь-якому місці, тому зараз вам просто доведеться прочитати код.

Деякі важливі речі, які слід пам’ятати, - це те, що назва вашого класу має відповідати використаному «ім’я постачальника», без урахування регістру Отже, якщо ви визначили ім'я провайдера таким чином instagram, вам слід створити файл protocols/instagram.pyта назвати клас Python Instagram.

Два найважливіші методи, які вам абсолютно доведеться реалізувати для того, щоб ваш плагін насправді щось робив, називаються _whoamiі receive. Вони добре задокументовані в base.py (зв'язані вище), але в основному _whoamiметод буде викликаний автоматично, і передається в диктаті, що представляє собою вже проаналізований блок JSON, який був наданий нам службою, коли відбулася автентифікація. Якщо вам пощастить, у цьому диктаті буде ваше ім'я користувача Instagram, ідентифікатор користувача та відображуване ім'я, але якщо ні, то вам потрібно буде здійснити вторинний дзвінок API, щоб зібрати цю інформацію. Ознайомтеся Facebook._whoamiз прикладом протоколу, який не надав інформацію наперед та вимагав додаткового виклику API в межах методу, і дивTwitter._whoami для прикладу протоколу, який дав нам усі деталі, які нам потрібні були наперед.

Після цього receiveметод відповідає за здійснення виклику API, який опитує послугу щодо нових повідомлень. Це трохи більше вільної форми, оскільки кожен API REST дещо інший, тому вам слід звернутися до документів API веб-сайту, щоб зрозуміти, що саме тут потрібно зробити. У http.py ми надаємо Uploaderта Downloaderкласи, які полегшують дзвінки REST API та можуть навіть розбирати відповіді сервера JSON. Важливо використовувати ці класи зручностей, оскільки вони обертаються libsoup, яка налаштована на вподобання налаштувань проксі-сервера GNOME (ви можете згадати, як завжди була жахлива підтримка проксі Gwibber, добре, що ми все це тепер виправили).

Як тільки ви отримаєте відповідь API від сервера, вам потрібно зберегти його в нашому DeeModel (де Gwibber використовував крапку JSON, скинуту в sqlite db для зберігання ваших повідомлень, ми використовуємо DeeModel, який в основному є лише базою даних яка ділиться станом у DBus, що дозволяє безліч клієнтів легко відображати дані повідомлення). Ми називаємо акт зберігання нового повідомлення "публікацією", і надаємо зручний метод для нього на Base._publish. В основному все, що вам потрібно зробити, це заповнити пробіли тут, переконайтеся, що якомога більше інформації заповнено на якомога більше стовпців. Можливі аргументи до _publish визначені в схемі , і знову ви можете звернутися до існуючих плагінів, щоб побачити, як вони це роблять.

Після того, як ви досягли цього далеко, у вас повинно бути достатньо, щоб можна було протестувати. У toolsкаталозі ми пропонуємо пару інструментів, щоб полегшити запуск вашого коду з дерева-джерела, тому вам не доведеться встановлювати його в систему кожен раз, коли ви хочете внести зміни. Що ви повинні зробити, це відкрити один термінал, CD в корінь дерева-джерела і запустити ./tools/debug_slave.py. Що це робить, це підключення до DeeModel, і просто відображає все, що з ним відбувається, тож ви можете бачити повідомлення, що з’являються в прямому ефірі, коли вони надходять. Потім, на другому терміналі, знову введіть CD в корінь дерева джерела, запустіть ./tools/debug_live.py instagram receiveі це вручну запустить метод Instagram.receive і відобразить купу налагодження виводу, щоб розповісти про те, що відбувається під час його запуску (ви можете посипати свій код дзвінками доlog.debug("hi") якщо ви хочете побачити ще більше деталей про те, що відбувається).

О, і якщо ви все ще читаєте, плагін , що зв’язується, ще не приземлився в багажник, але ви все ще можете подивитися його тут.

Якщо у вас є якісь інші запитання, я завжди перебуваю в #gwibber на freenode, а також відчуваю досить сильно, що нова база коду набагато читабельніше і краще задокументована, ніж будь-що, що коли-небудь було у Gwibber, тому, будь ласка, прочитайте код, який там є, і він не повинен ' не буде занадто складно вчитися на прикладі. Facebook та Twitter - найповніші.

Дякуємо за інтерес до Друзів!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.