Nutrient Bot o cómo quiero tomar el pan de los entrenadores de fitness

Hola a todos! Todos los desarrolladores una vez se encuentran con el deseo de hacer algo por sí mismos, e incluso el valor material del producto deja de ser importante, lo principal es que funciona por sí solo. Zumbido.

Entonces, solo en las vacaciones de mayo, quería combinar el conocimiento de codificación y algunos otros, vitales, en un solo proyecto. Resultó, en mi opinión, un servicio interesante al que quiero dar vida y hablar.

No soy nutricionista, no soy un atleta profesional y, por supuesto, no pretendo confiar en mí sin dudarlo. Pero, una vez, estaba muy interesado en el tema de una nutrición adecuada, y comencé a estudiar artículos, hablar con entrenadores geniales en los pasillos que visité y noté tal cosa: las personas gastan mucho dinero en hacer planes de nutrición.

Y decidí: pero crearé un sistema que calculará automáticamente los productos de las personas en gramos, dependiendo de su propósito y parámetros.

Como soy un desarrollador de back-end, rara vez encuentro el frente, lo pensé y decidí hacer un bot. La elección del mensajero estuvo influenciada por varios factores: la demanda y la disponibilidad de los sistemas de pago. La red social Vkontakte surgió.

Para los cálculos, utilicé la fórmula de Harris-Benedict. Tomé en cuenta dichos parámetros de entrada (que ingresa el usuario del bot):

  • Peso
  • Crecimiento
  • Objetivo (bajar de peso / subir de peso / mantener)
  • Actividad física (toda la información está disponible y es estándar para los cálculos de acuerdo con la fórmula de Harris-Benedict)
  • Tolerancia a la lactosa
  • Género

Creó una base de datos de productos en la que el producto tenía campos: proteínas, grasas, carbohidratos, Kcal, GI (índice glucémico), así como contenido de lactosa. En general, quiero dar una lista y comentar en el camino.

Vkontakte tiene una API accesible y comprensible

Usó el lenguaje PHP.

En primer lugar, identifiqué varias funciones y constantes necesarias:

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' => //      () ));} 

En la configuración del bot, especifique un enlace a su script (webhook). Por cierto, en la API de VK, puede usar dos métodos para recibir mensajes. Usé webhooks. Me parece que es más conveniente, más familiar.

A continuación, proceso el json resultante.

 $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; 

Como VK tiene sistemas de pago, preveía el pago a través de VK pay (los servidores VK envían tales solicitudes a su webhook, pero solo si su público se indica como TIENDA y hay un PRODUCTO que se puede pagar a través de VK pay), así como un simple pago en efectivo Una traducción que se puede adjuntar al mensaje.

Guardo a cada usuario que escribe algo en el bot en la base de datos, y luego toda la comunicación con el bot se realiza según el pago. Si no hubo pago, el bot le dirá que debe pagar primero, si se ha realizado el pago, le dirá qué hacer a continuación. Para las pruebas, puede ingresar cualquier mensaje al bot para planificar.

Después del pago, el bot solicitará los parámetros necesarios para el cálculo, lo guardo todo en la base de datos para un usuario específico y, después de toda la información recibida, pienso y respondo. Estoy enviando un mensaje usando la función creada, indicando el user_id del usuario:

 vkApi_messagesSend($user_id, '!   ?'); 

También tuvo en cuenta el momento en que el usuario ingresó información incorrecta: en este caso, debe enviar el número 404 al bot, y comenzará a preguntar primero, restableciendo los datos en la base de datos.

Para algunos mensajes, era conveniente para mí hacer botones, cuando hice clic en él, un mensaje con el texto que se indicaba en el botón voló hacia mí en el enlace web.

 $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) ; 

¡Y luego toda la diversión! Después de los datos recopilados, se produce el cálculo en sí. No estoy inventando nada yo mismo, simplemente redacto correctamente las fórmulas necesarias, basadas en la fórmula de Harris-Benedict, así como el conocimiento en el campo de la nutrición adecuada (el número de comidas, la distribución porcentual de proteínas / grasas / carbohidratos para estas recepciones, etc., son importantes aquí).

En general, cosas como esta:

 $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 consecuencia, para las personas con un estilo de vida sedentario y las personas con hiperactividad, habrá otros factores, di un pequeño ejemplo.

Después de calcular BZHU y KKAL, recojo un conjunto de productos. Por cierto, si después del plan de nutrición recibido ingresa el número 404 y comienza de nuevo (es posible perder peso / aumentar de peso, cambios en el estilo de vida, etc.), el conjunto de productos cambiará al azar. ¡Y ahora tienes un plan de nutrición diferente!

Como resultado, obtuvimos dicho servicio aquí (lo publiqué oficialmente para probarlo, el desarrollador es un principiante y yo mismo no puedo detectar todos mis errores si de repente existen):

capturas de pantalla del bot
imagenimagen
imagenimagen


De los errores que noté (necesita ser mejorado):


  • Los botones no se abren de inmediato. Debe encontrar el icono del teclado cerca del botón "enviar". Esto realmente confunde a las personas, y escriben incorrectamente (si se presiona el botón, entonces proceso el texto del botón, los datos que el usuario ingresa se ignoran).
  • No es una base de datos muy grande de productos, frente al hecho de que nadie comerá esto.

Para aquellos que quieran probar y ver el enlace al público .

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


All Articles