El enfoque correcto para utilizar la API de VKontakte. Escribir una joya API: elegir una estructura y herramientas

Los primeros pasos son muy simples: crear un repositorio e inicializar una gema simple en él. Se puede crear una nueva gema con el paquete de comandos gem gem_name y el repositorio se puede crear en Github. Aquí está, por cierto: https://github.com/Fodoj/groovehq.

Lo primero que haré es agregar la capacidad de autenticar solicitudes a la API de GrooveHQ y luego escribiré el código mínimo necesario para obtener una lista de todos los tickets. Afortunadamente, la documentación de la API de este servicio es detallada y clara, por lo que realizar una solicitud GET no será difícil.

Cliente mínimo

Comenzaré escribiendo una pequeña clase GrooveHQ::Client que será responsable de realizar solicitudes a la API. El constructor de esta clase aceptará un token de acceso.

# ./lib/groovehq/client.rb módulo Clase GrooveHQ Cliente def inicializar (access_token = nil ) @access_token = access_token ||

ENV [ "GROOVEHQ_ACCESS_TOKEN" ] fin fin fin

Cómo acceder a la API Ahora necesitamos descubrir cómo acceder a la API. Hasta ahora, nunca había usado la gema httparty para realizar solicitudes. Mi experiencia se limita a las bibliotecas RestClient y Faraday. no creo que haya gran diferencia

, qué biblioteca usar, pero para que el proceso sea más interesante elegiré httparty. Además, tiene muchas estrellas en GitHub :)

De hecho, no soporto a Faraday. yo agrego siguiente línea

en groovehq.gemspec:

# ./groovehq.gemspec # ... especificación. add_dependency “httpparty” # ...

y ejecute la instalación del paquete. Todo lo que queda es conectar httparty dentro de ./lib/groovehq.rb:

Realizar la primera solicitud a la API

Para comprobar que todo funciona como se esperaba, agregaré un método perform_request que tomará la ruta al punto API y devolveré JSON con el resultado de la solicitud. Para la autorización, utilizaré el encabezado HTTP de autorización, como se especifica en la documentación de la API. No me gusta la opción con el parámetro de consulta, ya que no funcionará para solicitudes POST.

Comprobemos si todo funciona como debería ejecutando el comando bundle exec irb en la carpeta gem. Luego ejecutaremos los siguientes fragmentos de código uno por uno:

requiere "./lib/groovehq.rb" cliente = GrooveHQ :: Cliente. nuevo cliente ("your_access_token"). realizar_request("yo") # yo normalmente soy responsable de devolver al propietario del token

Como resultado, si se utiliza el token de acceso correcto, recibirá un hash en la consola similar a este:

( "agente" => ( "correo electrónico" => " [correo electrónico protegido]" , "primer_nombre" => "Kirill" , "apellido" => "Shirinkin", "href" => "https://api.groovehq.com/v1/agents/ [correo electrónico protegido]" , "enlaces" => ( "boletos" => ( "href" => "https://api.groovehq.com/v1/tickets?assignee=fodojyko%40gmail.com" } } } }

¡Parece que tenemos una versión mínimamente funcional de la gema! Confirme los cambios aquí: f7d9eef.

El método #perform_request está diseñado únicamente para depurar, por lo que no contiene más creación correcta cadenas de referencia.

Añadiendo estructura

¿Qué sigue?

Mi próxima tarea será agregar tantos recursos como sea posible, siguiendo la documentación de la API. Los problemas que encuentro en el proceso se discutirán en el próximo artículo.

Un ejemplo de una solicitud API que devuelve 20 próximos eventos en Moscú y San Petersburgo:

https://api.timepad.ru/v1/events.json?limit=20&skip=0&cities=Moscow, San Petersburgo&fields=location&sort=+starts_at

Veámoslo pieza por pieza.

https://: el acceso a la API solo es posible a través de https; al intentar recibir datos a través de http, se muestra el error 400. Esto le permite garantizar la integridad de los datos y evitar la transferencia de información crítica sin cifrar.

api.timepad.ru/v1: la API de Timepad está ubicada en un dominio separado, el control de versiones está integrado en la dirección. Esto se hace para que, si alguna vez aparece la v2, la transición a ella sea opcional y la primera versión continúe funcionando mientras tenga clientes.

/events: recurso de eventos, uno de los principales recursos de la API. Con su ayuda, puede acceder a una base de datos de conferencias, seminarios, conciertos, conferencias, tertulias y reuniones celebradas a través de Timepad, filtrando de una de varias docenas de formas posibles.

Json: una indicación del formato de datos deseado. Se admiten json y html. Si no se especifica nada, la API determina el formato automáticamente: html en el navegador, json en todos los demás casos.

&sort=+starts_at: ordenar por fecha de inicio del evento en orden ascendente. También es posible ordenar por varios otros parámetros.

Seleccionar campos para mostrar

La API de eventos solo genera algunos de los campos de eventos más utilizados: título, categoría, fecha de inicio, enlace, póster.

Para mostrar otros campos de eventos, debe especificarlos en el parámetro de campos, separados por comas, por ejemplo:

Como resultado de tal solicitud además Los campos predeterminados también incluirán un objeto de ubicación del evento y un objeto de datos de estado de registro de evento adicional. Objetos internos o no se muestran completamente, o se muestran completamente, el campo de campos no afecta su contenido.

Puede encontrar una lista de campos que se pueden mostrar en la documentación en línea marcada Opcional, como en la captura de pantalla:

Ordenar valores

La API Timepad admite la clasificación por uno de los siguientes campos:

nombre
comienza_en
ciudad
porcentaje_referente
creado_en
identificación

El nombre del campo de clasificación debe especificarse en la solicitud, por ejemplo:

Para ordenar en orden descendente, debe especificar - antes del nombre del campo, por ejemplo:
https://api.timepad.ru/v1/events?sort=-id

Al ordenar en orden ascendente, opcionalmente puede especificar un signo más antes del nombre, por ejemplo,

Paginación

Todas las listas de la API se dividen en páginas. Para gestionarlos existen los siguientes parámetros:

límite: el número de elementos a devolver
skip - número de elementos a saltar

Así, por ejemplo, si recibes eventos de 10, las solicitudes quedarán así:
https://api.timepad.ru/v1/events?limit=10
https://api.timepad.ru/v1/events?limit=10&skip=10
https://api.timepad.ru/v1/events?limit=10&skip=20
https://api.timepad.ru/v1/events?limit=10&skip=30
...
etcétera

La respuesta se ve así:

( "total": "123", "valores": [...])

Total refleja el número total de elementos en la selección y los valores contienen elementos correspondientes a la configuración de paginación.

Campos vacios

De forma predeterminada, la API elimina campos con valores vacíos (matrices vacías, lineas vacias, nulo). En caso de que necesites valores vacíos, debe especificar el parámetro show_empty_fields con el valor verdadero

¡Hola Habr!

En un momento, navegando por Internet sobre el tema. uso racional API de VKontakte, no pude encontrar nada inteligible, las únicas bibliotecas que descubrí se implementaron sin utilizar prácticas generalmente aceptadas y sin hermoso código. Decidí corregir el malentendido y escribí mi propia biblioteca para trabajar con la API de VKontakte.
Detalles y enfoques vitales en el resumen.

Da la casualidad de que la API VK está bastante bien implementada, con la excepción de algunos puntos ilógicos, que mencionaré más adelante. Pero hoy no hablamos de calidad, sino de aplicación específica.

Es necesario hacer una reserva de inmediato; además de la descripción, proporcionaré fragmentos de código de trabajo para mi biblioteca, cuyo enlace proporcionaré al final del artículo. La biblioteca funciona con la última versión. versión estable 5.5, si elimina los generadores del recibo del lote, debería funcionar en 5.4.

  • Autorización del servidor (la llamada autorización del sitio)
  • Autorización del cliente (independiente)
  • Autorización del servidor de aplicaciones
Los más interesantes para el desarrollador son los dos primeros. El primero le permite autorizar a un usuario en el sitio y obtener su clave de acceso, el segundo le permite autorizar su aplicación, por ejemplo Dekstop o Mobile. De cara al futuro, la segunda opción nos ofrece enormes oportunidades, y los primeros, sólo una pequeña parte de ellos.

El algoritmo de obtención en el primer caso se reduce a realizar los siguientes puntos:

  • Mostramos un enlace para la autorización del usuario, que formateamos de acuerdo con la documentación.
  • El usuario lo sigue e inicia sesión.
  • El usuario es redirigido al REDIRECT_URI de nuestra aplicación desde OBTENER parámetro código
  • Nuestra aplicación debe realizar una solicitud a la API que contiene el código para obtener la clave de acceso del usuario.
  • La API responde con un objeto que contiene la clave de acceso o con un error.

Un ejemplo de código con el que puedes realizar esta complicada tarea.

$auth = getjump\Vk\Auth::getInstance(); $auth->setAppId("3470411")->setScope("SCOPE")->setSecret("CÓDIGO SECRETO")->setRedirectUri("http://localhost/test.php"); $token=$auth->startCallback(); imprimirf(" ENLACE", $auth->getUrl());

Se supone que nuestro dominio es localhost y el archivo actual es test.php. Si todo salió bien, entonces nuestra variable $token contendrá la clave de acceso del usuario que ha sido autorizado.

Desde el momento en que tenemos la clave de acceso, podemos realizar Solicitudes API. Lógica general Las solicitudes son simples: pasa una solicitud especialmente diseñada a la API de URL. La solicitud debe contener el nombre del método y los argumentos.

api.vk.com/method/METHOD_NAME?PARAMETERS&access_token=ACCESS_TOKEN

Lista de métodos Esta es una de las cosas ricas de la API. En él podrás encontrar métodos que no requieren clave de acceso para su trabajo, por lo que puedes llamarlos sin recibirla.

Al usar la biblioteca necesitamos crear objeto base, por ejemplo así:
$vk = getjump\Vk\Core::getInstance()->apiVersion("5.5")->setToken($token);

Un par de consultas de ejemplo usando la biblioteca:

Exactamente 100 objetos pasarán por la función anónima en cada uno, conteniendo datos sobre usuarios del 1 al 100. Tenga en cuenta que si eliminamos la llamada a la función, no se producirá ninguna solicitud, todo porque se devolverá un objeto que tiene los métodos mágicos __call y __get. anulado, lo que nos permite realizar una solicitud cuando realmente la necesitamos.
$vk->request("usuarios.get", ["user_ids" => rango(1, 100)])->cada(función($i, $v) ( if($v->apellido == "" ) devolver; imprimir $v->apellido "
"; });

Una de las cosas que nos abre el uso de generadores es la recepción por lotes. Es decir, recibimos datos sólo cuando los necesitamos. El siguiente ejemplo nos permitirá recibir TODOS nuestros mensajes, en solicitudes de 100. Ojo, método requiere que tengas derechos para mensajes, Aplicaciones independientes, la misma autorización y, en consecuencia, transferencia de la clave de acceso.
foreach($vk->request("messages.get")->batch(100) as $datos) ( $datos->cada(función($i, $m) ( if(isset($m->body) ) imprimir $m->cuerpo.

Buen método, que se puede encontrar en la API - ejecutar. Toma un parámetro de código como argumento, el código es un pseudo JavaScript que nos permite ejecutar nuestro código en el lado del servidor y también nos permite ejecutar procedimientos almacenados que podemos crear al editar nuestra aplicación.

No podía ignorar esto y lo implementé en la biblioteca. En pocas palabras, le permite ejecutar múltiples consultas como una sola. Vea el siguiente ejemplo de código.

$js1 = $vk->request("messages.get", ["count" => 200, "offset" =>0 * 200])->toJs(); // Devuelve un objeto de tipo VkJs $js2 = $vk->request("messages.get", ["count" => 200, "offset" =>1 * 200])->toJs(); $js3 = $vk->request("messages.get", ["count" => 200, "offset" =>2 * 200])->toJs(); $js4 = $vk->request("messages.get", ["count" => 200, "offset" =>3 * 200])->toJs(); $js1 ->append($js2) // Agregamos js2 a js1 ->append($js3) ->append($js4) ->execute() // Queremos ejecutar esto (esto en realidad devolverá una RequestTransaction) - >respuesta //La solicitud se ejecutará solo ahora ->cada(función($i, $v) //La primera función anónima es necesaria para recorrer todos los elementos de la matriz recibida de ejecutar(matriz de 4 elementos, 4 solicitudes ) ( $v->each( function($c, $d) ( // Siguiente para revisar los 200 mensajes en cada matriz if(isset($d->body)) print $d->body; // Imprimir un mensaje si dicho campo está presente ) ) );

Como prometí, uno de esos malentendidos que puedes encontrar en versión actual API(5.21), método




Arriba