Por supuesto, cada uno de nosotros ama los regalos, pero sobre todo amamos los deseos que los acompañan. Y, hasta hace poco, no teníamos la oportunidad de sorprender gratamente a una persona con palabras cálidas hasta que se me ocurrió la idea: ¿qué pasa si le damos a las personas la oportunidad de intercambiar valentines (de todos modos, el 14 de febrero) sin abandonar el marco de la forma habitual? comunicación - sala de chat de redes sociales?
Palabra por palabra, y aquí está: ¡un plan comercial listo para crear el ambiente de las vacaciones del Día de San Valentín! ¿Haremos felices a las personas?
¡Por la idea de la luna!
Por supuesto, en primer lugar era necesario elaborar un plan de acción y describir la idea. Debido al hecho de que las personas se han vuelto más tímidas y no siempre están listas para confiar en nadie, la elección recayó en escribir un bot de moda y conveniente para VK, que tiene una interfaz familiar, siempre estará a mano, y el anonimato de los mensajes estará codificado en el código del programa.
Desafortunadamente, además de todas las ventajas anteriores, las comunidades tienen dos inconvenientes: bajo ancho de banda (número de mensajes por segundo) y una prohibición de iniciar un diálogo con un usuario aleatorio (el usuario debe
primero y
explícitamente aceptar recibir mensajes en nombre de la comunidad).
Entonces, tenemos un usuario que está listo para enviar una tarjeta de San Valentín a su alma gemela, un destinatario y un intermediario en forma de un bot de chat. El esquema de interacción es simple, el bot debería: ofrecer el envío → reconocer al destinatario → guardar hasta el 14 de febrero → entregar → repetir.
Pero esto, por supuesto, no fue suficiente para la voraz imaginación de la mente y, para aumentar la actividad y la participación de la audiencia, se pensó en un esquema de otra interacción que permitiera a las personas familiarizarse dentro del sistema y enviar mensajes a personas aleatorias. Estas "valentines al azar" se pueden apreciar, y si las valentines de dos personas se gustan, les damos la oportunidad de chatear.
Descargo de responsabilidad
Este proyecto fue creado puramente por el entusiasmo de dos personas, un programador medio educado (yo) y un inspirador ideológico (Stepan sadfun Popov), no tiene el objetivo de enseñarle algo (aunque puede ayudarlo a comprender la esencia del universo), solo cuente una historia interesante de creación y siga el camino de una idea a una implementación ingenua.
Aprendiendo a hablar con VK
Después de
pasar por 3-4 bibliotecas diferentes a pedido de
"NodeJS VK API" , me di cuenta de que no hay bibliotecas simples y funcionales que nos permitan usar promesas, así como trabajar durante la ejecución. ¿Recuerdas uno de los problemas descritos anteriormente? Sí, la ejecución de solicitudes a VKontakte no es directa, pero en lotes de 25 le permite aumentar
significativamente el rendimiento.
Capacidad comparativa de varios métodos de solicitudes a VKontaktePor lo tanto, se decidió escribir algo propio, una solución confiable y no muy precisa, basada en la biblioteca de
búsqueda de nodos .
Para no dar todo el código aquí, simplemente describiré la lógica del trabajo.
Dado que las solicitudes del programa deben empaquetarse en una ejecución, se recopilan en la cola LIFO y luego se envían si:
- Llamadas de 25 o más (ejecución máxima)
- Ha pasado suficiente tiempo desde el último envío, no menos de 50 milisegundos, pero no más de 150 (para que la cola se mueva, a pesar del pequeño tamaño)
Las solicitudes de la cola se compilan en el código VK Script, que (en esta implementación) se ve así:
var returnables = []; returnables[0] = API.messages.send({"message": ", !", "peer_id": 1, "random_id": 561427}); returnables[1] = API.users.get({"user_ids": 1, "fields": "sex"}); return returnables;
Después de que el código se ejecuta mediante una solicitud a VK, el resultado de cada solicitud (por los
retornables de índice) vuelve a su devolución de llamada, bellamente envuelto en Promise. La eficacia del enfoque es abrumadora: cuantos
más usuarios (y, por lo tanto, más solicitudes a VKontakte para enviar),
menor es la demora en la respuesta. Para mantener el límite bajo control, el sistema de envío tiene un contador que muestra el número de solicitudes restantes para este segundo, lo que le permite procesar rápidamente una oleada de visitantes.
Aprendiendo a escuchar VK
Hay dos formas de recibir notificaciones de eventos de VKontakte:
Longpoll-request y
Callback-server . Su servidor es conveniente porque no requiere gestos especiales para su uso, y también le permite recibir notificaciones perdidas (por ejemplo, cuando reinicia el servidor). Dicho servidor se puede escribir en varias líneas utilizando la clase nativa
http.Server .
Todo esto crea un ecosistema ideal para la lógica del programa, que es conveniente de usar.
Todo termina
Dado que el usuario es libre de hacer cualquier cosa en el chat y no podemos detenerlo, debemos limitarlo a una cantidad razonable. La máquina de estado hace un gran trabajo al hacer esto, configurando cada transición posible dentro del sistema y usando los botones (parámetro de
teclado en messages.send) hará que usar el bot sea tan simple como un simple toque en la pantalla.
Aquí está la interacción del usuario con el bot:
Todo esto se convierte en un conjunto de estados ("Menú principal", "Entrada de San Valentín", etc.), las transiciones entre las cuales se configuran y transmiten en botones, o se conocen inicialmente y no cambian.
Por cierto, sobre los botones. Su gama de colores no es invariable (
4 colores para todas las ocasiones), pero son los botones los que permiten minimizar la cantidad de errores del usuario. Sobre su base, puede construir absolutamente cualquier sistema no lineal, por lo que se utilizan en todas partes. Y en este proyecto también.
Pero debe comprender: si está apuntando a una gran audiencia, debería considerar otra forma de interactuar, porque alguien puede tener una aplicación antigua (
VK para iPad , por ejemplo, no se ha actualizado durante mucho tiempo, no mentiré, pero parece que ha pasado más de un año, y el soporte de teclado no está allí). Y sucede (sí, sucede, lo comprobé) que las personas, sin darse cuenta de que se puede hacer clic en los botones, simplemente reescriben su contenido (y luego el parámetro del botón de carga útil, por supuesto, no se transmite, y todo puede romperse).
Cabe señalar que no todo sucede tan bien como se describe en el diagrama, y a veces ocurren casos curiosos. Por ejemplo, el sistema para determinar el enlace VKontakte procesó incorrectamente a los usuarios cuyos enlaces cortos comenzaron con
id y lo cortaron. La sorpresa de las personas que se encontraron con este error no se puede describir, porque escribieron Valentine Valentine, pero resultó que Olezhka.
¿Qué olezhka ????
Los accidentes no son accidentales
Entonces, si todo está claro con el día de San Valentín ordinario, hay un destinatario y un remitente, ¿cómo reducir a dos extraños? Necesitas intercambiar sus tarjetas de San Valentín, y si a la gente le gustan las tarjetas de San Valentín, ¡deberían presentarse! ¡Aquí está, la fórmula del amor!
Aunque esto suena patético, funciona, y se vuelve más interesante para las personas trabajar con el bot: obtendrán una respuesta positiva si hay al menos una persona (que, por supuesto, el bot se encargará).
Esto lleva a una gran ventaja: cuantas más personas aprovechen esta oportunidad, más oportunidades tendrán de conocerse y, por lo tanto, esto, como un juego, mantiene a una persona en un chat. Vale la pena confesar que la sesión promedio del usuario es de ~ 7 minutos, pero existe el potencial de restringir a una persona entre
10 y 15 por el simple hecho de esta característica.
La distribución misma de los mensajes forzó un esquema separado, ya que hay varias opciones para usar este bot, el usuario puede perder de vista algo y el bot le recordará cuidadosamente esto.
Es interesante cómo se resolvió el segundo problema, con la incapacidad de la comunidad para iniciar un diálogo con el usuario primero: ahora este problema se resuelve mediante dicho mensaje.
Pero tengo una condición! Para que el destinatario reciba su Valentine, también debe escribirme. Tu tarea ahora es convencerlo de que me escriba algo. ¡Esto se hace para que no tengas miedo de hablar con él!
En general, el tradicional "¡No es un error, sino una característica!"
Fuegos artificiales al final
Eso es todo! Si no tiene en cuenta algunas dificultades para comprender la lógica de la API de VK, así como para confirmar la cuenta con uno de los proveedores, todo salió demasiado bien.
Ejemplo de chat con un botEl bot funciona y hará las delicias de las personas con San Valentín, haciéndolos felices. Esto se hace para ayudar a las personas a ser más amables entre sí. Puede evaluar todo esto usted mismo en la comunidad
Valentinych: vk.com/verylovebot , si lo desea. Gracias por su atencion!