营养机器人或我想如何从健身教练那里拿面包

大家好! 所有开发人员都曾遇到过为自己做某事的愿望,甚至产品的物质价值也变得不重要,主要的是它可以独立工作。 嗡嗡声。

因此,我一个五月的假期想将编码知识和其他一些至关重要的知识结合到一个项目中。 在我看来,结果证明是我想赋予生命和谈论的一项有趣的服务。

我不是营养学家,也不是职业运动员,当然,我不假装他们会毫无疑问地信任我。 但是,有一次,我对适当的营养这个话题非常感兴趣,我开始学习文章,在我去过的大厅里与帅气的教练交谈,并注意到了这样的事情:人们花了很多钱来制定营养计划。

我决定:但是我将创建这样一个系统,该系统将根据人们的目的和参数自动计算以克为单位的人产品。

由于我是后端开发人员,所以我很少遇到前端,因此我考虑了一下并决定制作一个机器人。 信使的选择受以下几个因素影响:支付系统的需求和可用性。 社交网络Vkontakte出现了。

为了进行计算,我使用了哈里斯-本尼迪克特公式。 我考虑了以下输入参数(机器人用户输入的参数):

  • 机重
  • 成长性
  • 目标(减肥/增重/维持)
  • 身体活动(所有信息均可用,并根据Harris-Benedict公式进行计算)
  • 乳糖耐量
  • 性别

创建了一个产品数据库,其中的产品具有以下字段:蛋白质,脂肪,碳水化合物,大卡,GI(血糖指数)以及乳糖含量。 总的来说,我想在此过程中列出并发表评论。

Vkontakte有一个易于理解的API

使用PHP语言。

首先,我确定了几个必要的函数和常量:

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

在漫游器的设置中,指定一个指向脚本(webhook)的链接。 顺便说一下,在VK API中,您可以使用两种方法来接收消息。 我使用了webhooks。 在我看来,它更方便,更熟悉。

接下来,我处理生成的json。

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

由于VK具有付款系统,因此我设想了通过VK付款(VK服务器将此类请求发送到您的Webhook,但前提是您的公众被列为STORE,并且有可以通过VK付款来付款的产品),以及简单的现金付款可以附加到邮件的翻译。

我将每个向bot写东西的用户保存在数据库中,然后根据付款情况进行与bot的所有通信。 如果没有付款,机器人会说您需要先付款,如果付款已经发生,它将告诉您下一步该怎么做。 为了进行测试,您可以向机器人输入任何消息以进行计划。

付款后,机器人将要求计算所需的参数,我将所有参数保存在数据库中以供特定用户使用,并在收到所有信息后思考并给出答案。 我正在使用创建的函数发送一条消息,指示用户的user_id:

 vkApi_messagesSend($user_id, '!   ?'); 

它还考虑了用户输入错误信息的那一刻:在这种情况下,您需要将数字404发送给机器人,它将首先开始询问,重置数据库中的数据。

对于某些消息,当我单击按钮时,对我来说很方便,当它单击时,一条带有在按钮上指示的文本的消息会通过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) ; 

然后所有的乐趣! 收集数据之后,将进行计算本身。 我自己没有发明任何东西,我只是根据哈里斯-本尼迪克特公式正确地拟定了必要的公式,以及适当营养领域的知识(进餐次数,这些接收的蛋白质/脂肪/碳水化合物的百分比分布等在这里很重要)。

通常,如下所示:

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

因此,对于久坐的人和多动的人,还有其他因素,我举一个小例子。

在计算了BZHU和KKAL之后,我收集了一组产品。 顺便说一句,如果在收到营养计划后您输入数字404并重新开始(可能会减轻体重/增加体重,改变生活方式等),则产品组将随机变化。 现在,您有不同的营养计划!

结果,我们在这里得到了这样的服务(我正式将其发布以进行测试,开发人员是一个初学者,而且如果它们突然存在,我自己也无法捕获所有错误):

机器人截图
图片图片
图片图片


从我注意到的错误中(需要改进):


  • 按钮不会立即打开。 您需要在“发送”按钮附近找到键盘图标。 这确实使人们感到困惑,并且他们书写不正确(如果按下按钮,那么我将处理按钮上的文本,那么用户输入自己的数据将被忽略)。
  • 面对着没有人会吃这个的事实,这不是一个非常庞大的产品数据库。

对于那些想要测试并看到公开链接的人。

Source: https://habr.com/ru/post/zh-CN458798/


All Articles