Nutrient Bot ou comment je veux prendre du pain avec des entraîneurs de fitness

Bonjour à tous! Tous les développeurs rencontrent une fois le désir de faire quelque chose pour eux-mêmes, et même la valeur matérielle du produit devient sans importance, l'essentiel est qu'il fonctionne seul. Buzz.

Donc, seul, pendant les vacances de mai, je voulais combiner les connaissances de codage et d'autres, vitales, en un seul projet. Il s'est avéré, à mon avis, un service intéressant auquel je veux donner vie et parler.

Je ne suis pas un nutritionniste, pas un athlète professionnel et, bien sûr, je ne prétends pas qu'ils me feront confiance sans aucun doute. Mais, une fois, j'étais très intéressé par le sujet d'une bonne nutrition, et j'ai commencé à étudier des articles, à parler avec des entraîneurs sympas dans les salles que j'ai visitées, et j'ai remarqué une chose pareille: les gens dépensent beaucoup d'argent pour faire des plans de nutrition.

Et j'ai décidé: mais je vais créer un tel système qui calculera automatiquement les produits des personnes en grammes, en fonction de leur objectif et de leurs paramètres.

Comme je suis développeur backend, je rencontre rarement le front, j'y ai pensé et j'ai décidé de faire un bot. Le choix du messager a été influencé par plusieurs facteurs: la demande et la disponibilité des systèmes de paiement. Le réseau social Vkontakte est apparu.

Pour les calculs, j'ai utilisé la formule Harris-Benedict. J'ai pris en compte de tels paramètres d'entrée (que l'utilisateur du robot saisit):

  • Le poids
  • Croissance
  • Objectif (perdre du poids / prendre du poids / maintenir)
  • Activité physique (toutes les informations sont disponibles et standard pour les calculs selon la formule de Harris-Benedict)
  • Tolérance au lactose
  • Sexe

Création d'une base de données de produits dans laquelle le produit avait des champs: protéines, lipides, glucides, Kcal, IG (indice glycémique), ainsi que la teneur en lactose. En général, je veux donner une liste et des commentaires en cours de route.

Vkontakte dispose d'une API accessible et compréhensible

Utilisé le langage PHP.

Tout d'abord, j'ai identifié plusieurs fonctions et constantes nécessaires:

header('Content-Type: text/html; charset=utf-8'); $request = file_get_contents("php://input"); $input = json_decode($request, true); define('VK_API_VERSION', '5.95'); //  API define('VK_API_ENDPOINT', "https://api.vk.com/method/"); //     API function _vkApi_call($method, $params = array()) { $params['access_token'] = //    ,        ; $params['v'] = VK_API_VERSION; $url = VK_API_ENDPOINT.$method.'?'.http_build_query($params); $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $json = curl_exec($curl); curl_close($curl); $response = json_decode($json, true); return $response['error']['error_msg']; $err=$response['error']['error_msg']; } //   messages.send function vkApi_messagesSend($peer_id, $message) { return _vkApi_call('messages.send', array( 'peer_id' => $peer_id, 'user_id' => $peer_id, 'message' => $message, 'random_id' => rand(), 'qroup_id' => //      () ));} //      function vkApi_buttonSend($peer_id, $message,$button) { return _vkApi_call('messages.send', array( 'peer_id' => $peer_id, 'user_id' => $peer_id, 'message' => $message, 'random_id' => rand(), 'keyboard' => $button, 'qroup_id' => //      () ));} 

Dans les paramètres du bot, vous spécifiez un lien vers votre script (webhook). Par ailleurs, dans l'API VK, vous pouvez utiliser deux méthodes pour recevoir des messages. J'ai utilisé des webhooks. Il me semble que c'est plus pratique, plus familier.

Ensuite, je traite le json résultant.

 $test_type=$input['type']; $test_group_id=$input['group_id']; $user_id=$input['object']['user_id']; $text=$input['object']['body']; $text_body=explode(" ", $text); $vk_pay=$text_body[0]; $caption=$input['object']['attachments'][0]['link']['caption']; $url=$input['object']['attachments'][0]['link']['url']; $str3=$input['object']['attachments'][0]['link']['title']; $str2 = explode(" ", $str3); $money =(int)$str2[0]; $money=strstr($str3, ' ', true); $money=(int)$money; 

Étant donné que VK dispose de systèmes de paiement, j'ai envisagé le paiement via VK pay (les serveurs VK envoient de telles demandes à votre webhook, mais uniquement si votre public est répertorié en tant que MAGASIN et qu'il existe un PRODUIT qui peut être payé via VK pay), ainsi qu'un paiement en espèces simple une traduction qui peut être jointe au message.

J'enregistre chaque utilisateur qui écrit quelque chose dans le bot dans la base de données, puis toute communication avec le bot a lieu en fonction du paiement. S'il n'y a pas eu de paiement, le bot vous dira que vous devez d'abord payer, si le paiement a eu lieu, il vous dira quoi faire ensuite. Pour les tests, vous pouvez entrer n'importe quel message au bot à planifier.

Après paiement, le bot demandera les paramètres nécessaires au calcul, je les sauvegarde tous dans la base de données pour un utilisateur spécifique, et après toutes les informations reçues, je pense et donne une réponse. J'envoie un message à l'aide de la fonction créée, indiquant l'ID utilisateur de l'utilisateur:

 vkApi_messagesSend($user_id, '!   ?'); 

Il a également pris en compte le moment où l'utilisateur a entré certaines informations de manière incorrecte: dans ce cas, vous devez envoyer le numéro 404 au bot, et il commencera à demander en premier, en réinitialisant les données dans la base de données.

Pour certains messages, il était pratique pour moi de créer des boutons, lorsque je cliquais dessus, un message avec le texte qui était indiqué sur le bouton m'envoyait sur le webhook.

 $buttons='{ "one_time":true, "buttons":[[{ "action":{ "type":"text", "payload":"{\"button\": \"1\"}", "label":" " }, "color":"primary" }, { "action":{ "type":"text", "payload":"{\"button\": \"2\"}", "label":" " }, "color":"primary"}]]}'; vkApi_buttonSend($user_id,' ',$buttons) ; 

Et puis tout le plaisir! Après les données collectées, le calcul lui-même se produit. Je n'invente rien moi-même, je rédige juste correctement les formules nécessaires, basées sur la formule Harris-Benedict, ainsi que les connaissances dans le domaine de la bonne nutrition (le nombre de repas, la répartition en pourcentage de protéines / graisses / glucides pour ces réceptions, etc. sont ici importants).

En général, des choses comme ça:

 $BMR=88.363+(13.397*$weight)+(4.799*$height)-(5.677*$age); $BMR_AMR=$BMR*1.2-500; $b_kkal=0.35*$BMR_AMR; $b_gr=$b_kkal/4; $g_kkal=0.3*$BMR_AMR; $g_gr=$g_kkal/9; $u_kkal=0.35*$BMR_AMR; $u_gr=$u_kkal/4; $break_b=0.15*$b_gr; $break_u=0.25*$u_gr; $break_g=0.25*$g_gr; $break_kk=0.25*$BMR_AMR; $snack_b=0.1*$b_gr; $snack_u=0.1*$u_gr; $snack_g=0.15*$g_gr; $snack_kk=1*$BMR_AMR; $snack2_b=0.05*$b_gr; $snack2_u=0.05*$u_gr; $snack2_kk=0.05*$BMR_AMR; $lunch_b=0.45*$b_gr; $lunch_u=0.4*$u_gr; $lunch_g=0.4*$g_gr; $lunch_kk=0.4*$BMR_AMR; $dinner_b=0.25*$b_gr; $dinner_u=0.2*$u_gr; $dinner_g=0.2*$g_gr; $dinner_kk=0.2*$BMR_AMR; 

En conséquence, pour les personnes ayant un mode de vie sédentaire et les personnes hyperactives, il y aura d'autres facteurs, j'ai donné un petit exemple.

Après avoir calculé BZHU et KKAL, je récupère un ensemble de produits. Soit dit en passant, si après le plan nutritionnel reçu, vous entrez le nombre 404 et recommencez (éventuellement perte de poids / gain de poids, changements de style de vie, etc.), l'ensemble des produits changera de manière aléatoire. Et maintenant, vous avez un plan nutritionnel différent!

En conséquence, nous avons obtenu un tel service ici (je l'ai officiellement publié pour les tests, le développeur est un débutant et je ne peux pas moi-même attraper tous mes bugs s'ils existent soudainement):

captures d'écran de bot
imageimage
imageimage


D'après les erreurs que j'ai remarquées (à améliorer):


  • Les boutons ne s'ouvrent pas immédiatement. Vous devez trouver l'icône du clavier près du bouton "envoyer". Cela déroute vraiment les gens et ils écrivent de manière incorrecte (si le bouton est enfoncé, alors je traite le texte du bouton, les données que l'utilisateur entre lui-même sont ignorées).
  • Pas une très grande base de données de produits, face au fait que personne n'en mangera.

Pour ceux qui veulent tester et voir le lien vers le public .

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


All Articles