Bot nutriente ou como eu quero pegar pão de instrutores de fitness

Olá pessoal! Todos os desenvolvedores depararam com o desejo de fazer algo por si mesmos, e mesmo o valor material do produto se torna sem importância, o principal é que ele trabalha por conta própria. Buzz.

Então, como férias solitárias em maio, eu queria combinar o conhecimento de codificação e algum outro, vital, em um projeto. Na minha opinião, resultou em um serviço interessante sobre o qual quero dar vida e falar.

Não sou nutricionista, não sou atleta profissional e, é claro, não pretendo que eles confiem em mim sem questionar. Mas, uma vez, eu estava muito interessado no tópico da nutrição adequada e comecei a estudar artigos, conversar com treinadores legais nos corredores que visitei e percebi uma coisa: as pessoas gastam muito dinheiro fazendo planos de nutrição.

E decidi: mas vou criar um sistema que calcule automaticamente os produtos das pessoas em gramas, dependendo da finalidade e dos parâmetros.

Como sou desenvolvedor de back-end, raramente encontro a frente, pensei nisso e decidi fazer um bot. A escolha do messenger foi influenciada por vários fatores: demanda e disponibilidade de sistemas de pagamento. A rede social Vkontakte surgiu.

Para cálculos, usei a fórmula Harris-Benedict. Levei em consideração esses parâmetros de entrada (que o usuário do bot digita):

  • Peso
  • Crescimento
  • Objetivo (perder peso / ganhar peso / manter)
  • Atividade física (todas as informações estão disponíveis e padrão para cálculos de acordo com a fórmula de Harris-Benedict)
  • Tolerância à lactose
  • Sexo

Criou um banco de dados de produtos no qual o produto possuía campos: proteínas, gorduras, carboidratos, Kcal, IG (índice glicêmico) e também conteúdo de lactose. Em geral, quero dar uma lista e comentar ao longo do caminho.

Vkontakte tem uma API acessível e compreensível

Usou a linguagem PHP.

Primeiro, identifiquei várias funções e constantes necessárias:

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

Nas configurações do bot, você especifica um link para seu script (webhook). A propósito, na API VK, você pode usar dois métodos para receber mensagens. Eu usei webhooks. Parece-me que é mais conveniente, mais familiar.

Em seguida, eu processo o 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 a VK possui sistemas de pagamento, eu previ o pagamento via VK pay (os servidores da VK enviam essas solicitações ao seu webhook, mas apenas se o seu público for indicado como LOJA e houver um PRODUTO que possa ser pago via VK pay), bem como pagamento em dinheiro simples uma tradução que pode ser anexada à mensagem.

Eu salvo cada usuário que escreve algo para o bot no banco de dados e, em seguida, toda a comunicação com o bot ocorre dependendo do pagamento. Se não houver pagamento, o bot dirá que você precisa pagar primeiro, se o pagamento tiver ocorrido, ele informará o que fazer em seguida. Para o teste, você pode inserir qualquer mensagem para o bot planejar.

Após o pagamento, o bot solicitará os parâmetros necessários para o cálculo, guardo tudo no banco de dados para um usuário específico e, após todas as informações recebidas, penso e dou uma resposta. Estou enviando uma mensagem usando a função criada, indicando o user_id do usuário:

 vkApi_messagesSend($user_id, '!   ?'); 

Também levou em consideração o momento em que o usuário inseriu algumas informações incorretamente: nesse caso, você precisa enviar o número 404 para o bot, e ele começará a perguntar primeiro, redefinindo os dados no banco de dados.

Para algumas mensagens, era conveniente para mim criar botões; quando eu clicava nela, uma mensagem com o texto indicado no botão voava para mim no 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) ; 

E então toda a diversão! Após os dados coletados, o próprio cálculo ocorre. Não estou inventando nada, apenas redijo corretamente as fórmulas necessárias, com base na fórmula de Harris-Benedict, bem como o conhecimento no campo da nutrição adequada (o número de refeições, a distribuição percentual de proteínas / gorduras / carboidratos para essas recepções etc. são importantes aqui).

Em geral, coisas 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; 

Assim, para pessoas com estilo de vida sedentário e com hiperatividade, haverá outros fatores, dei um pequeno exemplo.

Após o cálculo do BZHU e KKAL, coleciono um conjunto de produtos. A propósito, se após o plano de nutrição recebido você digitar o número 404 e começar de novo (é possível perder peso / ganhar peso, mudanças no estilo de vida etc.), o conjunto de produtos mudará aleatoriamente. E agora você tem um plano de nutrição diferente!

Como resultado, obtivemos um serviço aqui (eu o publiquei oficialmente para teste, o desenvolvedor é iniciante e eu mesmo não consigo pegar todos os meus erros se eles existirem repentinamente):

capturas de tela do bot
imagemimagem
imagemimagem


Dos erros que notei (precisa ser aprimorado):


  • Os botões não abrem imediatamente. Você precisa encontrar o ícone do teclado próximo ao botão "enviar". Isso realmente confunde as pessoas e elas escrevem incorretamente (se o botão for pressionado, então eu processo o texto do botão, os dados que o usuário insere são ignorados).
  • Não é um banco de dados muito grande de produtos, diante do fato de que ninguém vai comer isso.

Para quem quer testar e ver o link para o público .

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


All Articles