Comme j'ai écrit le bot pour l'école d / z et changé la base de données

Bonjour, citoyens de Khabrovsk!
Aujourd'hui, je vais essayer de vous dire comment un étudiant peut écrire un bot pour stocker des devoirs pour VK.
Attention
J'attirerai immédiatement l'attention sur le fait que pour des projets sérieux, il est impossible de construire une infrastructure comme celle-ci , tout ce projet a été créé uniquement pour le divertissement et le temps, et pour des présentations lors de toutes sortes de conférences de projets scolaires.

Remarque
17/11/2019 15:55
Ils m'ont écrit dans des messages privés que tout au long de l'article, il n'est pas très clair de quel type de devoirs ils parlent.
Je précise tout de suite que toutes les tâches dont je parle dans l'article sont remplies comme dans un journal ordinaire, et les anciennes tâches «disparaissent».
C'est ainsi que l'utilisateur reçoit les tâches qu'il devra effectuer.


Le bot a été écrit en PHP, et pour des raisons d'expérience, j'ai décidé de recevoir des mises à jour non pas en utilisant les webhooks de l'API CallBack, mais en utilisant LongPoll.

En raison du fait que je n'ai jamais écrit de bots en utilisant cette méthode de réception des mises à jour, j'ai été tourmenté par de vagues doutes quant à savoir si je pouvais écrire ce bot en PHP, mais finalement tout a fonctionné. Je vais maintenant passer à la façon dont mes idées sont nées et comment je les ai mises en œuvre.

Le premier, en général, était l'idée d'écrire un bot pour y stocker des devoirs. Eh bien, comment stocker. Quelque chose comme des notes, mais à l'intérieur de VK, car je vais rarement dans les notes, et elles ne sont pas très pratiques pour moi.

Afin d'implémenter un bot banal avec un devoir, j'ai créé une table dans la base de données, dans laquelle le nom de l'article, le devoir lui-même et le nombre de tout ce bonheur ont été définis. Ce n'est pas très intéressant à décrire, donc je vais omettre ce point, mais je vais donner un diagramme ER puissant de la façon dont la base de données ressemblait au tout début.

image

Alors j'ai pensé, pourquoi ne pas donner à d'autres personnes la possibilité d'utiliser le bot. Eh bien, il a donné aux gens cette opportunité. J'ai un peu changé la base de données, mais la table autour de laquelle tout cela tourne est restée presque inchangée.

image

À partir du diagramme ER, vous pouvez comprendre que chaque utilisateur appartient à un groupe. L'entrée dans un groupe existant se fait par jeton et pour chaque nouveau, un jeton unique est généré. Et les tâches elles-mêmes appartiennent également à l'un ou l'autre groupe, de sorte que les utilisateurs ne voient pas le chaos de leurs tâches et des autres.

J'ai ajouté le code, il n'y a rien d'intéressant ici non plus, en principe non. Je viens de faire en sorte que les anciennes tâches n'apparaissent pas, afin de ne pas supprimer le tout manuellement, mais, je pense, écrire une requête SELECT en SQL est assez simple.

Et maintenant, il est temps de s'amuser: j'ai commencé à ajouter des fonctions qui ralentiraient la file d'attente de messages globale, j'ai donc décidé de les mettre dans des scripts séparés, car je ne peux pas multithread pour le moment, mais j'ai choisi LongPoll. (Et existe-t-il une telle utilisation de PHP?)

Et ces fonctions: envoyer des messages à tous les membres du groupe et générer des codes QR dans lesquels la clé pour rejoindre le groupe est cryptée.

Pour ce faire, je viens de créer une autre table dans la base de données, dans laquelle j'entre le texte du mailing et à qui il est destiné. La base a finalement pris cette forme.

image

Et la génération de codes QR est généralement effectuée dans un processus distinct, qui reçoit également des mises à jour de VK sur les messages sortants, et examine quel message contient la clé du groupe.

Jusqu'à présent, tout semble plus ou moins adéquat, mais je suis ensuite allé briser le modèle relationnel en mettant JSON dans la base de données.

Quel type de JSON puis-je mettre dans la base de données? J'entre le paramètre des pièces jointes, que je reçois de VK, puis les traite lors de l'envoi de messages, afin de ne pas charger le processus principal.

En conséquence, le tout ressemble à ceci.

image

À propos de la même méthode, j'ai ajouté une pièce jointe aux tâches du robot. La tâche est ajoutée immédiatement et les fichiers sont progressivement joints s'ils correspondent au format et à la taille de Telegram Bot Api. Je télécharge des fichiers sur Telegram via un cluster de robots et enregistre l'ID du fichier.

Je stocke les fichiers dans le Telegram car le serveur sur lequel je garde tout cela n'a pas beaucoup d'espace, et se développer pour moi est très difficile financièrement.

La base de données entière a commencé à ressembler à ceci:

image

Mais maintenant, j'ai une tâche: comment vais-je rendre les fichiers aux utilisateurs? Ensuite, j'ai fait presque la même logique qu'avec l'ajout de fichiers.

image

Ensuite, un autre bot a été ajouté pour le panier, mais je ne le décrirai pas encore.

Fondamentalement, je pense que la structure de la base de données n'est pas mauvaise, mais je n'aime pas quelque chose ici. Il sera peut-être utile pour certains des nouveaux arrivants de voir comment vous pouvez concevoir la structure de la base de données au cours du développement de l'idée, et il sera intéressant pour moi d'écouter les critiques sur l'organisation de ma base et de mettre quelque chose en service.

L'article est petit, mais il peut faire baisser les critiques.
Klats 1
"Plein jusqu'à 17 heures sur mon bureau!"
Je posterai tous les codes sources du bot sur git après avoir défendu le projet, et ce n'est pas un péché d'écrire un article.

Klats 2
Certaines idées liées à l'utilisation de fichiers m'ont été suggérées dans le chat Habr dans le panier, je peux souvent y être vu.

Klats 3
Vous pouvez piquer un bot en direct ici . Je serai heureux de vos commentaires.

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


All Articles