VK bot sur son genou, ou comment faire plaisir aux gens le 14 février

Bien sûr, chacun de nous aime les cadeaux, mais surtout nous aimons les souhaits qui les accompagnent. Et, jusqu'à récemment, nous n'avons pas eu l'occasion de surprendre agréablement une personne avec des mots chaleureux jusqu'à ce que l'idée lui vienne à l'esprit: et si nous donnions aux gens la possibilité d'échanger des valentines (sur leur nez le 14 février, tout de même) sans quitter le cadre de la manière habituelle communication - salon de discussion sur les réseaux sociaux?

Mot pour mot, et le voici - un plan d'affaires prêt à l'emploi pour créer l'atmosphère de la fête de la Saint-Valentin! Allons-nous rendre les gens heureux?


Pour l'idée de la lune!


Bien sûr, il a d'abord fallu élaborer un plan d'action et décrire l'idée. Étant donné que les gens sont devenus plus timides et ne sont pas toujours prêts à faire confiance à personne, le choix s'est porté sur l'écriture d'un bot à la mode et pratique pour VK, qui a une interface familière, sera toujours à portée de main, et l'anonymat des messages sera codé en dur dans le code du programme.
Malheureusement, en plus de tous les avantages ci-dessus, les communautés ont deux inconvénients: une faible bande passante (nombre de messages par seconde) et une interdiction de commencer un dialogue avec un utilisateur aléatoire (l'utilisateur doit d' abord et explicitement accepter de recevoir des messages au nom de la communauté).

Nous avons donc un utilisateur qui est prêt à envoyer une carte Valentine à son âme soeur, un destinataire et un intermédiaire sous la forme d'un chat bot. Le schéma d'interaction est simple, le bot doit: proposer l'envoi → reconnaître le destinataire → économiser jusqu'au 14 février → livrer → répéter.

Mais cela, bien sûr, n'était pas suffisant pour l'imagination vorace de l'esprit, et, afin d'augmenter l'activité et l'implication du public, un schéma d'une autre interaction a été pensé, permettant aux gens de se familiariser avec le système, d'envoyer des messages à des personnes aléatoires. Ces «valentines aléatoires» peuvent être appréciées, et si les valentines de deux personnes s'aiment, nous leur donnons la possibilité de discuter.

Clause de non-responsabilité


Ce projet a été créé uniquement par l'enthousiasme de deux personnes, un programmeur à moitié instruit (moi) et un inspirateur idéologique (Stepan sadfun Popov), n'a pas pour objectif de vous enseigner quelque chose (bien qu'il puisse vous aider à comprendre l'essence de l'univers), racontez simplement une histoire intéressante de la création et suivez le chemin d'une idée à une implémentation naïve.



Apprendre Ă  parler avec VK


Après avoir parcouru 3-4 bibliothèques différentes à la demande de "NodeJS VK API" , je me suis rendu compte qu'il n'y avait pas de bibliothèques simples et fonctionnelles qui nous permettent d'utiliser des promesses, ainsi que de travailler par exécution. Rappelez-vous l'un des problèmes décrits ci-dessus? Oui, l'exécution des demandes à VKontakte n'est pas directement, mais en lots de 25 vous permet d' augmenter considérablement le débit.


Capacité comparative de diverses méthodes de demandes à VKontakte

Par conséquent, il a été décidé d'écrire quelque chose qui leur soit propre, une solution fiable et pas très béquille, basée sur la bibliothèque node-fetch .

Afin de ne pas donner tout le code ici, je décrirai simplement la logique du travail.

Étant donné que les demandes du programme doivent être regroupées en une seule exécution, elles sont collectées dans la file d'attente LIFO, puis envoyées si:

  • Appels de 25 ou plus (exĂ©cution maximale)
  • Assez de temps s'est Ă©coulĂ© depuis la dernière expĂ©dition, pas moins de 50 millisecondes, mais pas plus de 150 (pour que la file d'attente se dĂ©place, malgrĂ© la petite taille)

Les demandes de la file d'attente sont intégrées dans le code de script VK, qui (dans cette implémentation) ressemble à ceci:

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; 

Une fois que le code est exécuté par une demande à VK, le résultat de chaque demande (par l'index des éléments retournables ) revient à son rappel, magnifiquement enveloppé dans Promise. L'efficacité de l'approche est écrasante - plus il y a d' utilisateurs (et, par conséquent, plus il y a de demandes d'envoi à VKontakte), moins il y a de retard dans la réponse. Pour garder la limite sous contrôle, le système d'envoi dispose d'un compteur indiquant le nombre de demandes restantes pour cette seconde, ce qui vous permet de traiter rapidement une vague de visiteurs.

Apprendre à écouter VK


Il existe deux façons de recevoir des notifications sur les événements de VKontakte: les requêtes Longpoll et le serveur de rappel . Votre serveur est pratique car il ne nécessite pas de gestes spéciaux à utiliser et vous permet également de recevoir des notifications manquées (par exemple, lorsque vous redémarrez le serveur). Un tel serveur peut être écrit sur plusieurs lignes en utilisant la classe native http.Server .

Tout cela crée un écosystème idéal pour la logique du programme, qui est pratique à utiliser.

Tout se termine


Étant donné que l'utilisateur est libre de faire quoi que ce soit dans le chat et que nous ne pouvons pas l'arrêter, nous devons le limiter à un montant raisonnable. La machine d'état fait un excellent travail en faisant cela, en définissant toutes les transitions possibles dans le système, et en utilisant les boutons (paramètre du clavier dans messages.send) rendra l'utilisation du bot aussi simple qu'une simple pression sur l'écran.

Voici l'interaction de l'utilisateur avec le bot:


Tout cela se transforme en un ensemble d'états ("Menu principal", "Entrée Saint-Valentin" et ainsi de suite), dont les transitions entre elles sont définies et transmises par boutons, ou sont connues initialement et ne changent pas.


Soit dit en passant, sur les boutons. Leur gamme de couleurs est non invariante ( 4 couleurs pour toutes les occasions), mais ce sont les boutons qui permettent de minimiser le nombre d'erreurs utilisateur. Sur leur base, vous pouvez construire absolument n'importe quel système non linéaire, c'est pourquoi ils sont utilisés partout. Et dans ce projet aussi.

Mais vous devez comprendre: si vous visez un large public, vous devriez envisager une autre façon d'interagir, car quelqu'un peut avoir une ancienne application ( VK pour iPad , par exemple, n'a pas été mis à jour depuis très longtemps, je ne mentirai pas, mais il semble que plus d'un an, et le clavier n'est pas là). Et il arrive (oui, ça arrive, j'ai vérifié) que les gens, ne réalisant pas que les boutons peuvent être cliqués, réécrivent simplement leur contenu (et ensuite le paramètre du bouton de charge utile, bien sûr, n'est pas transmis, et tout peut casser).

Il convient de noter que tout ne se passe pas aussi bien que décrit dans le diagramme, et parfois des cas curieux se produisent. Par exemple, le système de détermination du lien VKontakte a mal traité les utilisateurs dont les liens courts ont commencé avec id et les ont coupés. La surprise des gens qui ont rencontré ce bug ne peut pas être décrite, car ils ont écrit Valentine Valentine, mais il s'est avéré que Olezhka.
Quel olezhka ????

Les accidents ne sont pas accidentels


Donc, si tout est clair avec les valentines ordinaires, il y a un destinataire et un expéditeur, alors comment réduire deux étrangers? Vous devez échanger leurs valentines, et si les gens aiment les valentines les uns des autres, alors ils devraient être présentés! Voilà, la formule de l'amour!

Bien que cela semble pathétique, cela fonctionne et il devient plus intéressant pour les gens de travailler avec le bot - ils obtiendront une réponse positive s'il y a au moins une personne (dont, bien sûr, le bot prendra soin).

Cela conduit à un gros plus - plus les gens saisissent cette opportunité, plus ils ont de chances de se connaître, et donc, comme un jeu, cela maintient une personne dans une conversation. Il vaut la peine d’avouer que la session moyenne d’un utilisateur dure environ 7 minutes, mais il est possible de resserrer une personne de 10 à 15 uniquement pour le plaisir de cette fonctionnalité.

La distribution même des messages a forcé un schéma séparé, car il existe plusieurs options pour utiliser ce bot, l'utilisateur peut perdre de vue quelque chose, et le bot le lui rappellera soigneusement.


Il est intéressant de voir comment le deuxième problème a été résolu, avec l'incapacité de la communauté à engager un dialogue avec l'utilisateur en premier: ce problème est maintenant résolu par un tel message.
Mais j'ai une condition! Pour que le destinataire reçoive votre Valentin, il doit également m'écrire. Votre tâche consiste maintenant à le persuader de m'écrire quelque chose. Ceci est fait pour que vous n'ayez pas peur de lui parler!
En général, le traditionnel "Pas un bug, mais une fonctionnalité!"

Feux d'artifice Ă  la fin


C'est tout! Si vous ne tenez pas compte de certaines difficultés pour comprendre la logique de l'API VK, ainsi que pour confirmer le compte auprès de l'un des fournisseurs, tout s'est encore trop bien déroulé.


Exemple de chat avec un bot

Le bot fonctionne et ravira les gens avec des valentines, les rendant heureux. Ceci est fait pour aider les gens à être plus gentils les uns envers les autres. Vous pouvez évaluer tout cela vous-même dans la communauté Valentinych - vk.com/verylovebot , si vous le souhaitez. Merci de votre attention!

Source: https://habr.com/ru/post/fr439218/


All Articles