¿Cómo agregar soporte para nuevos servicios a Friends?

19

Con la nueva aplicación de amigos aterrizando en Ubuntu, se me ocurrió que agregando soporte para Instagram en la línea de tiempo sería genial. También pensé que podría intentarlo yo mismo, pero me está costando encontrar documentación.

¿Hay alguna especificación que describa qué se necesita de cada protocolo? ¿Cómo funciona auth? ¿Debería agregarse soporte a ubuntu-online-accounts primero o existe una forma de que los amigos registren el nuevo protocolo?

Es muy nuevo y tiene un nombre muy difícil para Google, por lo que cualquier indicador en la dirección correcta sería apreciado.

    
pregunta andrewsomething 10.04.2013 - 17:17

1 respuesta

34

Amigos autores aquí.

De hecho, como sospechabas, se requiere soporte en Ubuntu Online Accounts antes de que se pueda agregar soporte a Friends. La arquitectura de amigos depende en gran medida de la UOA para poder hacer toda la autorización y administrar todas las claves de la API para nosotros. Mi ejemplo favorito es LinkedIn, porque hasta ahora era el único protocolo que contribuía la comunidad. El complemento UOA es principalmente solo dos archivos XML, más un poco de truco de autoconf, que se ve así. (desplácese un poco hacia abajo para la diferencia, que muestra claramente cada cosa que se debe agregar para que LinkedIn funcione).

Una vez que haya hecho lo mismo con su protocolo, debe proponer la fusión contra lp: account-plugins y obtener Mardy para revisar, aprobar y fusionarlos. Una vez que esté en su lugar, puede comenzar a escribir el plugin de amigos, que se escribirá en Python 3.

Ahora, una de las principales mejoras importantes que Friends presenta sobre Gwibber es el uso de subclases. En el código original de Gwibber, no se hacía absolutamente nada con las subclases, por lo que cada nuevo complemento de protocolo era un gran copiar y pegar hackjob de varios bits de funcionalidad de bajo nivel. Al implementar Friends, tuve mucho cuidado de extraer la funcionalidad común en una superclase, que puede subclasificarse y modificarse fácilmente. La superclase también tiene un montón de documentos, al que debes consultar cuando comiences. Lamentablemente, todavía no hemos configurado sphinx para publicarlos en ningún otro lugar, por lo que tendrás que leer el código por el momento.

Algunas cosas importantes a tener en cuenta es que el nombre de su clase debe coincidir con el "nombre de proveedor" utilizado, sin distinción de mayúsculas y minúsculas. Entonces, si definió el nombre del proveedor como instagram , entonces debe crear el archivo protocols/instagram.py y nombrar su clase Python Instagram .

Los dos métodos más importantes que debes implementar para que tu complemento realmente haga algo se llaman _whoami y receive . Están bien documentados en base.py (vinculado anteriormente), pero básicamente el método _whoami se llamará automáticamente y se pasará en un dict que representa un blob JSON ya analizado que nos brindó el servicio cuando se realizó la autenticación. . Si tienes suerte, ese dict contendrá tu nombre de usuario, identificación de usuario y nombre de usuario de Instagram, pero si no es así, deberás realizar una llamada secundaria de API para recopilar esa información. Consulte Facebook._whoami para obtener más información. un ejemplo de un protocolo que no proporcionó la información por adelantado y requirió una llamada API adicional desde dentro del método, y ver Twitter._whoami para ver un ejemplo de un protocolo que nos proporcionó todos los detalles que necesitábamos desde el principio.

Posteriormente, el método receive es responsable de realizar la llamada API que sondea el servicio para nuevos mensajes. Este es un poco más libre, ya que cada API REST es ligeramente diferente, por lo que debe consultar los documentos API del sitio web para averiguar qué se debe hacer exactamente aquí. En http.py proporcionamos clases Uploader y Downloader que facilitan la realización de llamadas a la API REST, e incluso pueden analizar las respuestas del servidor JSON por usted. Es importante utilizar estas clases de conveniencia porque envuelven libsoup , que está configurado para respetar la configuración del proxy de GNOME (puede recordar cuán terrible siempre fue el soporte de proxy de Gwibber, así que hemos solucionado todo eso ahora).

Una vez que tienes la respuesta API del servidor, debes almacenarla en nuestro DeeModel (donde Gwibber usó un blob JSON vertido en un archivo sqlite para almacenar tus mensajes, estamos usando un DeeModel, que es básicamente solo una base de datos que comparte estado a través de DBus, lo que facilita a los clientes múltiples mostrar los datos del mensaje fácilmente). Llamamos a la acción de almacenar un nuevo mensaje "publicar", y proporcionamos un método de conveniencia para él en Base._publish . Básicamente, todo lo que tiene que hacer es rellenar los espacios en blanco aquí, asegúrese de que se ingrese la mayor cantidad de información posible en tantas columnas como sea posible. Los posibles argumentos para _publish son definidos en el esquema , y de nuevo puede consultar los complementos existentes para ver cómo lo hacen.

Una vez que has llegado tan lejos, deberías tener suficiente para poder probarlo.Proporcionamos un par de herramientas en el directorio tools para que sea más fácil ejecutar el código desde el árbol de origen, por lo que no tiene que instalarlo en el sistema cada vez que desee realizar un cambio. Lo que debe hacer es abrir un terminal, cd a la raíz del árbol fuente, y ejecutar ./tools/debug_slave.py . Lo que hace es conectarse a DeeModel, y simplemente muestra todo lo que le sucede, para que pueda ver los mensajes que aparecen en vivo a medida que ingresan. Luego, en un segundo terminal, vuelva a cd a la raíz del árbol fuente y ejecute ./tools/debug_live.py instagram receive y que activará manualmente el método Instagram.receive y mostrará un montón de resultados de depuración para informarle sobre lo que está sucediendo mientras se ejecuta (puede rociar su código con llamadas a log.debug("hi") si desea ver aún más detalles sobre que pasa).

Ah, y si todavía estás leyendo, el complemento de linkedin aún no ha llegado al tronco, pero aún puede verlo aquí.

Si tiene alguna otra pregunta, siempre estoy en #gwibber en freenode, y también creo firmemente que la nueva base de código es mucho más legible y está mejor documentada que cualquier otra cosa que haya tenido Gwibber, así que lea el código que está allí y no debería ser demasiado difícil aprender con el ejemplo. Facebook y Twitter son los más completos.

¡Gracias por su interés en Friends!

    
respondido por el robru 11.04.2013 - 17:50

Lea otras preguntas en las etiquetas