Всем привет! Все разработчики сталкиваются однажды с желанием покодить что-нибудь для себя, и даже становится неважна материальная ценность продукта, главное, что оно работает само по себе. Кайф.
Так и мне, одиноким майским отпуском, захотелось объединить знания кодинга и какие-нибудь другие, жизненные, в один проект. Получился, на мой взгляд, интересный сервис, которому хочу дать жизнь и рассказать об этом.
Я не диетолог, не профессиональный спортсмен и, конечно, не претендую на то, что мне без вопросов будут доверять. Но, однажды, меня сильно заинтересовала тема правильного питания, и я начала изучать статьи, общаться с крутыми тренерами в залах, которые посещала, и заметила такую вещь: люди тратят немаленькие деньги за составление планов питания.
И я решила: а создам-ка я такую систему, которая будет автоматически высчитывать людям продукты в граммах, в зависимости от их цели и параметров.
Так как я бэкенд разработчик, с фронтом сталкиваюсь редко, обдумала и решила сделать бота. На выбор мессенджера повлияли несколько факторов: востребованность и наличие платежных систем. Подошла социальная сеть Вконтакте.
Для расчетов я использовала формулу Харриса- Бенедикта. В учет брала такие входные параметры ( которые пользователь бота вводит):
Создала базу продуктов, в которой у продукта были поля: Белки, Жиры, Углеводы, Ккал, ГИ (гликемический индекс), а также содержание лактозы. Вообще, хочу привести листинг и по ходу комментировать.
У Вконтакте доступный и понятный API
Использовала язык PHP.
Во-первых, определила несколько нужных функций и констант:
В настройках бота вы указывается ссылку на свой скрипт (вебхук). Кстати, в API VK можно использовать два метода для получения сообщений. Я использовала вебхуки. Мне кажется, что это удобнее, привычнее.
Далее обрабатываю полученный json.
Так как у VK есть платежные системы, я предусмотрела оплату через VK pay (сервера VK отправляют на ваш вебхук такие запросы, но только если у вас паблик указан как МАГАЗИН и есть ТОВАР, который можно оплатить через VK pay), а также оплату простым денеженым переводом, который можно прикрепить к сообщению.
Каждого пользователя, который пишет что-то боту, сохраняю в базе, и далее всё общение с ботом происходит в зависимости от оплаты. Если оплаты не было, бот скажет, что нужно сначала оплатить, если оплата произошла — подскажет, что делать дальше. Для тестирования можно ввести любое сообщение боту для составления плана.
После оплаты, бот будет спрашивать параметры, необходимые для расчета, сохраняю это всё в базе для конкретного пользователя, а после всей полученной информацию считаю и выдаю ответ. Отправляю сообщение, используя созданную функцию, указав user_id пользователя:
Также учла момент неправильного ввода пользователем какой-нибудь информации: в таком случае нужно отправить боту число 404, и он начнет спрашивать сначала, обнулив данные в базе.
Для некоторых сообщений мне было удобно сделать кнопки, при нажатии на которую мне на вебхук прилетало сообщение с текстом, который был указан на кнопке.
А дальше всё самое интересное! После собранных данных происходит сам расчет. Ничего не придумываю сама, лишь правильно оформляю нужные формулы, опираясь на формулу Харриса-Бенедикта, а также знания в области правильного питания (здесь важны количества приемов пищи, процентное распределение белков/жиров/углеводов на эти приемы и т.д.).
Вообщем, подобные вещи:
Соответственно, для людей с сидячим образом жизни и людей с гиперактивностью будут другие коэффициенты, я привела небольшой пример.
После высчитанных БЖУ и ККАЛ собираю набор продуктов. Кстати, если после полученного плана питания ввести число 404 и начать сначала (возможнно похудели/набрали вес, изменился образ жизни и т.д.), набор продуктов рандомно изменится. И вот у вас уже другой план питания!
В итоге получился вот такой вот сервис (я его официально разместила ВК для тестирования, разработчик я начинающий, и сама не могу поймать все свои баги, если вдруг они есть):
Для желающих потестить и посмотреть ссылка на паблик.
Так и мне, одиноким майским отпуском, захотелось объединить знания кодинга и какие-нибудь другие, жизненные, в один проект. Получился, на мой взгляд, интересный сервис, которому хочу дать жизнь и рассказать об этом.
Я не диетолог, не профессиональный спортсмен и, конечно, не претендую на то, что мне без вопросов будут доверять. Но, однажды, меня сильно заинтересовала тема правильного питания, и я начала изучать статьи, общаться с крутыми тренерами в залах, которые посещала, и заметила такую вещь: люди тратят немаленькие деньги за составление планов питания.
И я решила: а создам-ка я такую систему, которая будет автоматически высчитывать людям продукты в граммах, в зависимости от их цели и параметров.
Так как я бэкенд разработчик, с фронтом сталкиваюсь редко, обдумала и решила сделать бота. На выбор мессенджера повлияли несколько факторов: востребованность и наличие платежных систем. Подошла социальная сеть Вконтакте.
Для расчетов я использовала формулу Харриса- Бенедикта. В учет брала такие входные параметры ( которые пользователь бота вводит):
- Вес
- Рост
- Цель (похудеть/ набрать массу/ поддерживать)
- Физическая активность (вся информация доступная и стандартная для расчетов по формуле Харриса-Бенедикта)
- Переносимость лактозы
- Пол
Создала базу продуктов, в которой у продукта были поля: Белки, Жиры, Углеводы, Ккал, ГИ (гликемический индекс), а также содержание лактозы. Вообще, хочу привести листинг и по ходу комментировать.
У Вконтакте доступный и понятный 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' => //Здесь должен быть айдишник вашей группы (паблика) ));}
В настройках бота вы указывается ссылку на свой скрипт (вебхук). Кстати, в API VK можно использовать два метода для получения сообщений. Я использовала вебхуки. Мне кажется, что это удобнее, привычнее.
Далее обрабатываю полученный 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 pay (сервера VK отправляют на ваш вебхук такие запросы, но только если у вас паблик указан как МАГАЗИН и есть ТОВАР, который можно оплатить через VK pay), а также оплату простым денеженым переводом, который можно прикрепить к сообщению.
Каждого пользователя, который пишет что-то боту, сохраняю в базе, и далее всё общение с ботом происходит в зависимости от оплаты. Если оплаты не было, бот скажет, что нужно сначала оплатить, если оплата произошла — подскажет, что делать дальше. Для тестирования можно ввести любое сообщение боту для составления плана.
После оплаты, бот будет спрашивать параметры, необходимые для расчета, сохраняю это всё в базе для конкретного пользователя, а после всей полученной информацию считаю и выдаю ответ. Отправляю сообщение, используя созданную функцию, указав user_id пользователя:
vkApi_messagesSend($user_id, 'Отлично! Какой твой возраст?');
Также учла момент неправильного ввода пользователем какой-нибудь информации: в таком случае нужно отправить боту число 404, и он начнет спрашивать сначала, обнулив данные в базе.
Для некоторых сообщений мне было удобно сделать кнопки, при нажатии на которую мне на вебхук прилетало сообщение с текстом, который был указан на кнопке.
$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;
Соответственно, для людей с сидячим образом жизни и людей с гиперактивностью будут другие коэффициенты, я привела небольшой пример.
После высчитанных БЖУ и ККАЛ собираю набор продуктов. Кстати, если после полученного плана питания ввести число 404 и начать сначала (возможнно похудели/набрали вес, изменился образ жизни и т.д.), набор продуктов рандомно изменится. И вот у вас уже другой план питания!
В итоге получился вот такой вот сервис (я его официально разместила ВК для тестирования, разработчик я начинающий, и сама не могу поймать все свои баги, если вдруг они есть):
скриншоты бота
![]() |
![]() |
![]() |
![]() |
Из замеченных мною ошибок (требует доработки) :
- Кнопки не открываются сразу. Нужно найти возле кнопки «отправить» значок клавиатуры. Это очень путает людей, и пишут неправильно (если кнопка нажата, то я обрабатываю текст с кнопки, данные, которые пользователь вводит сам, игнорируются).
- Не очень большая база продуктов, столкнулась с тем, что такое кушать никто не будет.
Для желающих потестить и посмотреть ссылка на паблик.




