{"id":370620,"date":"2024-05-21T04:29:23","date_gmt":"2024-05-21T04:29:23","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=370620"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=370620","title":{"rendered":"<span>\u041f\u043e\u043b\u043d\u043e\u0435 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e grammY \u2014 JS-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Telegram-\u0431\u043e\u0442\u043e\u0432<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/tf\/th\/ct\/tfthct7rsmxxkfnutcyewqgwjdu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/tf\/th\/ct\/tfthct7rsmxxkfnutcyewqgwjdu.png\"\/><\/div>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0440\u0441\u0435\u043d\u0438\u0439, \u044f \u0441\u0435\u043d\u044c\u043e\u0440 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 grammY \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u043e\u0442\u0430, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a, \u0432\u0438\u0434\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439, \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0432\u0438\u0434\u0430\u043c\u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440 \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435. \u0418 \u0432\u0441\u0435 \u044d\u0442\u043e \u2014 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445.<\/p>\n<p>  \u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u043d\u0430 <a href=\"https:\/\/selectel.ru\/services\/cloud\/servers\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=cloud_article_grammy_120324_content\">\u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/a>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u0438 \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u041f\u043e\u0435\u0445\u0430\u043b\u0438!<a name=\"habracut\"><\/a><\/p>\n<p>  <b>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e:<\/b><\/p>\n<p>  \u2192 <a href=\"#1\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u0432 Telegram<\/a><br \/>  \u2192 <a href=\"#2\">\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043f\u0438\u0448\u0435\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u0434<\/a><br \/>  \u2192 <a href=\"#3\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/a><br \/>  \u2192 <a href=\"#4\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/a><br \/>  \u2192 <a href=\"#5\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Context (ctx)?<\/a><br \/>  \u2192 <a href=\"#6\">\u041a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b<\/a><br \/>  \u2192 <a href=\"#7\">\u0414\u0435\u043f\u043b\u043e\u0439 \u0431\u043e\u0442\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 Selectel<\/a><br \/>  \u2192 <a href=\"#8\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<p>  <a name=\"1\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u0432 Telegram<\/h2>\n<p><\/font><br \/>  \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u0431\u043e\u0442\u0430:<\/p>\n<ol>\n<li>\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c Telegram \u0438 \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u0432\u0431\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/habr.com\/ru\/users\/botfather\/\" class=\"user_link\">BotFather<\/a>;<\/li>\n<li>\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u043c\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \/newbot;<\/li>\n<li>\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0438\u043c\u044f \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 username;<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043b\u044e\u0447 \u2014 \u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u043e\u043c. \u041e\u043d \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434 <b>1234567890:UIEaeSx_YsRXdD-C39M0t1PzcdnZZ4HgsKq<\/b> (\u044d\u0442\u043e\u0442 \u0442\u043e\u043a\u0435\u043d \u0432\u044b\u0434\u0443\u043c\u0430\u043d, \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438 \u043d\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043d\u0438\u0433\u0434\u0435).<\/li>\n<\/ol>\n<p>  \u0413\u043e\u0442\u043e\u0432\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>  <a href=\"https:\/\/selectel.ru\/services\/cloud\/servers\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=cloud_article_grammy_120324_banner\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/q0\/vh\/5w\/q0vh5w5mou3znpt2vudzz3jpfms.png\" data-src=\"https:\/\/habrastorage.org\/webt\/q0\/vh\/5w\/q0vh5w5mou3znpt2vudzz3jpfms.png\"\/><\/div>\n<p><\/a><\/p>\n<p>  <a name=\"2\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043f\u0438\u0448\u0435\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u0434<\/h2>\n<p><\/font><br \/>  \u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f node.js \u0438 npm. \u041f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 node.js \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0438 npm, \u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">node -v npm -v <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0432 \u043e\u0442\u0432\u0435\u0442 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438, \u0437\u043d\u0430\u0447\u0438\u0442, \u0432\u0441\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e. \u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c node.js \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430 <a href=\"https:\/\/nodejs.org\/\">https:\/\/nodejs.org\/<\/a>. \u0412\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 LTS-\u0432\u0435\u0440\u0441\u0438\u044e \u0438 \u0441\u043b\u0435\u0434\u0443\u0439\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043a\u043e\u0434\u0430 \u043f\u0430\u043f\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e grammyjs-bot). \u0417\u0430\u0442\u0435\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e npm. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0432\u0432\u043e\u0434\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">npm init -y <\/code><\/pre>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u0439 \u043f\u0430\u043f\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0441\u044f \u0444\u0430\u0439\u043b package.json \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u0431 npm-\u043f\u0430\u043a\u0435\u0442\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/6t\/oj\/ym\/6tojymij7beonmlktm_mdnpd1ms.png\" data-src=\"https:\/\/habrastorage.org\/webt\/6t\/oj\/ym\/6tojymij7beonmlktm_mdnpd1ms.png\"\/><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u0440\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u2014 Grammy JS (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044d\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438), \u0437\u0430\u0442\u0435\u043c \u0434\u0432\u0435 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0435. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 dotenv \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f (env variable), nodemon, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0434 \u0431\u043e\u0442\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u0412\u0441\u0435 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"bash\">npm i grammy dotenv nodemon <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b package-lock.json \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0430\u043f\u043a\u0430 node_modules \u0441 \u0441\u0430\u043c\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 package.json \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0432\u0443\u0445 \u043d\u0430\u0448\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432 \u043f\u043e\u043b\u0435 dependencies.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b index.js, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0431\u043e\u0442\u0430, \u0438 \u0444\u0430\u0439\u043b .env, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043a\u0435\u043d. \u0415\u0441\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043d\u0430 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0442\u0430\u043a\u0436\u0435 \u0432\u043d\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0432 package.json, \u0432 \u043f\u043e\u043b\u0435 main.<\/p>\n<h3>\u041a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<p>  \u0418\u0442\u0430\u043a, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0433\u043e\u0442\u043e\u0432\u0430, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 .env:<\/p>\n<pre><code class=\"bash\">\/\/ \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043a\u0430\u0432\u044b\u0447\u0435\u043a \u043d\u0438\u0433\u0434\u0435 \u043d\u0435\u0442 BOT_API_KEY=1234567890:UIEaeSx_YsRXdD-C39M0t1PzcdnZZ4HgsKq <\/code><\/pre>\n<p>  <i>\u0421\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u043d\u0430\u043a\u0430 \u00ab=\u00bb \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043e\u0442 BotFather (\u0431\u0435\u0437 \u043a\u0430\u0432\u044b\u0447\u0435\u043a).<\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c index.js (\u0432 \u043d\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434) \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"javascript\">\/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 dotenv require('dotenv').config(); \/\/ \u041e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 grammy \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441 Bot const { Bot } = require('grammy'); \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0432\u043e\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \/\/ \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 \u0442\u043e\u043a\u0435\u043d (\u0447\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \/\/ \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c) const bot = new Bot (process.env.BOT_API_KEY);  \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u043e\u0442\u0430 bot.start(); <\/code><\/pre>\n<p>  <i>process.env.BOT_API_KEY \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f BOT_API_KEY.<\/i><\/p>\n<p>  \u0411\u043e\u0442\u0430 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \/start \u0438 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"javascript\">require('dotenv').config(); const { Bot } = require('grammy'); const bot = new Bot (process.env.BOT_API_KEY); bot.command('start', async (ctx) => {  await ctx.reply(   '\u041f\u0440\u0438\u0432\u0435\u0442! \u042f - \u0411\u043e\u0442 ?',  ); }); bot.on(\"message\", async (ctx) => {  await ctx.reply('\u041d\u0430\u0434\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c...'); }); bot.start(); <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u0442\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0435\u0441\u0442. \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 test, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u043b\u0441\u044f \u0432 package.json \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 start \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<pre><code class=\"json\">\"scripts\": { \"start\": \"nodemon index.js\" }, <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435<\/p>\n<pre><code class=\"bash\">npm start <\/code><\/pre>\n<p>  \u0413\u043e\u0442\u043e\u0432\u043e \u2014 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0431\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 nodemon.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/kq\/ce\/m3\/kqcem3bgab5-nb6hlqmfjil6avy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/kq\/ce\/m3\/kqcem3bgab5-nb6hlqmfjil6avy.png\"\/><\/div>\n<p>  <a name=\"3\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h2>\n<p><\/font><br \/>  \u0427\u0442\u043e\u0431\u044b \u0431\u043e\u0442 \u043d\u0435 \u043f\u0430\u0434\u0430\u043b \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043e\u043a, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u043a\u0430\u043a \u0441\u043e\u0432\u0435\u0442\u0443\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 Grammy JS \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u043c\u043f\u043e\u0440\u0442 \u043d\u0443\u0436\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432:<\/p>\n<pre><code class=\"javascript\">const { Bot, GrammyError, HttpError } = require('grammy');                                                     <\/code><\/pre>\n<p>  \u0410 \u0434\u0430\u043b\u0435\u0435 \u0441\u0430\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0448\u0438\u0431\u043e\u043a:<\/p>\n<pre><code class=\"javascript\">bot.catch((err) => { const ctx = err.ctx; console.error(`Error while handling update ${ctx.update.update_id}:`); const e = err.error; if (e instanceof GrammyError) {  console.error('Error in request:', e.description); } else if (e instanceof HttpError) { console.error('Could not contact Telegram:', e); } else { console.error('Unknown error:', e); } }); <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 (\u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0438) \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0431\u043e\u0442\u0430, \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0434\u043e \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 \u043a\u043e\u0434\u0435 (bot.start()).<\/p><\/blockquote>\n<p>  \u041e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u0438\u0445 \u0442\u0438\u043f\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/grammy.dev\/guide\/errors%23error-handling\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <a name=\"4\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/h2>\n<p><\/font><br \/>  \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u043e\u0442\u0430 \u2014 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412 Grammy \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041c\u044b \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0431\u043e\u0442\u0443 \u0434\u0432\u0430 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e bot.command \u0438 bot.on. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u0432\u0438\u0434\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0432 Grammy \u0438 \u043a\u0430\u043a \u0441 \u043d\u0438\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<h3>\u041e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u2014 bot.command<\/h3>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u2014 \u043b\u044e\u0431\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u043d\u0430\u043a\u043e\u0432 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 (\/start, \/help, \/say_something). \u0427\u0442\u043e\u0431\u044b \u0431\u043e\u0442 \u043c\u043e\u0433 \u043d\u0430 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a command \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b (\u0431\u0435\u0437 \u0441\u043b\u0435\u0448\u0430). \u0412\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f (\u043a\u043e\u043b\u043b\u0431\u044d\u043a), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430, \u0435\u0441\u043b\u0438 \u0431\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443. \u041a\u043e\u043b\u043b\u0431\u044d\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 context (\u043e\u043d \u0436\u0435 ctx), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<pre><code class=\"javascript\">bot.command('say_hello', async (ctx) => {  await ctx.reply('Hello'); }); <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0431\u043e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u043b \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432:<\/p>\n<pre><code class=\"javascript\">bot.command(['say_hello', 'hello', 'say_hi'], async (ctx) => {  await ctx.reply('Hello');  }); <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u042d\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0418\u041b\u0418 \u2014 \u00ab\u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043b\u043b\u0431\u044d\u043a, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \/say_hello \u0418\u041b\u0418 \/hello \u0418\u041b\u0418 \/say_hi\u00bb.<\/p><\/blockquote>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/pr\/wg\/it\/prwgit6hsgzr5aks3f4nke423da.png\" data-src=\"https:\/\/habrastorage.org\/webt\/pr\/wg\/it\/prwgit6hsgzr5aks3f4nke423da.png\"\/><\/div>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u0432 Grammy \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043c\u0435\u043d\u044e \u043a\u043e\u043c\u0430\u043d\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 setMyCommands:<\/p>\n<pre><code class=\"javascript\">bot.api.setMyCommands([ { command: 'start', description: '\u0417\u0430\u043f\u0443\u0441\u043a \u0431\u043e\u0442\u0430' }, { command: 'say_hello', description: '\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435' }, { command: 'hello', description: '\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435' }, { command: 'say_hi', description: '\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435' }, ]); <\/code><\/pre>\n<p>  \u0423 \u0431\u043e\u0442\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u0438\u043d\u044f\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0441 \u0442\u0440\u0435\u043c\u044f \u0431\u0435\u043b\u044b\u043c\u0438 \u043f\u043e\u043b\u043e\u0441\u043a\u0430\u043c\u0438 \u0432 \u043b\u0435\u0432\u043e\u043c \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0433\u043b\u0443. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u043c\u0435\u0442 \u043d\u0430 \u043d\u0435\u0435, \u043e\u043d \u0443\u0432\u0438\u0434\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/do\/ux\/jw\/douxjw07uo62km2y-wuajibe4oe.png\" data-src=\"https:\/\/habrastorage.org\/webt\/do\/ux\/jw\/douxjw07uo62km2y-wuajibe4oe.png\"\/><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/0x\/4q\/eb\/0x4qebe4rxaq9uq_-czmouflmng.png\" data-src=\"https:\/\/habrastorage.org\/webt\/0x\/4q\/eb\/0x4qebe4rxaq9uq_-czmouflmng.png\"\/><\/div>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u044d\u043c\u0435\u043b-\u043a\u0435\u0439\u0441 (sayHi) \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043d\u0435\u0439\u043a-\u043a\u0435\u0439\u0441\u0430 (say_hi), \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c bot.command, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 bot.api.setMyCommands \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0435\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 400 Bad Request: BOT_COMMAND_INVALID.<\/p>\n<p>  \u0421\u0443\u0434\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u0445 \u0441\u0430\u043c\u043e\u0433\u043e Telegram, \u0430 \u043d\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: \u0442\u0430 \u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438 \u0432 telegraf, \u0438 \u0432 aiogram (\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0434\u043b\u044f Python). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0431\u0443\u043a\u0432\u044b, \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442. \u0410 \u0432\u043e\u0442 \u043a\u0435\u0431\u0430\u0431-\u043a\u0435\u0439\u0441 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<h3>\u041e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0442\u0438\u043f\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \/ \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438<\/h3>\n<p>  \u0411\u043e\u0442 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439, \u0441\u0442\u0438\u043a\u0435\u0440\u043e\u043c, \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412 \u044d\u0442\u043e\u043c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0444\u0438\u0447\u0435\u0439 Grammy. \u0414\u0440\u0443\u0433\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u0443\u0447\u0435\u0439 if-\u043e\u0432. \u0423 grammY \u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u044f\u0437\u044b\u043a \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 bot.on. \u0415\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c (\u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c), \u0430 \u0432\u0442\u043e\u0440\u044b\u043c \u2014 \u043a\u043e\u043b\u043b\u0431\u044d\u043a.<\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u044b \u0442\u043e\u0436\u0435 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u00abmessage\u00bb, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"javascript\">bot.on('message:text', async (ctx) => { await ctx.reply('\u041f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c'); }); <\/code><\/pre>\n<p>  \u0412\u043e\u0442, \u043a\u0430\u043a\u0438\u0435 \u0435\u0449\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0432 Grammy:<\/p>\n<ul>\n<li>\u00abmessage:text\u00bb \u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c,<\/li>\n<li>\u00abmessage:photo\u00bb \u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439,<\/li>\n<li>\u00abmessage:voice\u00bb \u2014 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/li>\n<\/ul>\n<p>  \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043c\u043d\u043e\u0433\u043e, \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/grammy.dev\/guide\/filter-queries.html\">\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>. \u041d\u043e \u0438 \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435.<\/p>\n<h3>\u041b\u0430\u0439\u0444\u0445\u0430\u043a\u0438 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438<\/h3>\n<p>  \u0421\u043b\u043e\u0432\u043e \u00abmessage\u00bb \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043a\u0438\u0439 \u0444\u0438\u043b\u044c\u0442\u0440:<\/p>\n<pre><code class=\"javascript\">bot.on(':voice', async (ctx) => { await ctx.reply('\u041f\u043e\u043b\u0443\u0447\u0438\u043b \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435'); }); <\/code><\/pre>\n<p>  \u0424\u0438\u043b\u044c\u0442\u0440 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00abmessage:entities:url\u00bb \u2014 \u0442\u0443\u0442 \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0443 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438. \u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0441\u043b\u043e\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0432 \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043e \u00ab::url\u00bb.<\/p>\n<p>  \u0422\u0430\u043a \u043d\u0430\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f\u043c\u0438 (\u00ab::mention\u00bb), \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438, \u043f\u0438\u0441\u044c\u043c\u0430\u043c\u0438 (\u00ab::email\u00bb) \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<pre><code class=\"javascript\">bot.on('::email', async (ctx) => { await ctx.reply('\u0412\u0430\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 email'); }); <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/tq\/xi\/dr\/tqxidra4wibgf9xecnosqbnzbjo.png\" data-src=\"https:\/\/habrastorage.org\/webt\/tq\/xi\/dr\/tqxidra4wibgf9xecnosqbnzbjo.png\"\/><\/div>\n<p>  \u041d\u043e \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435 \u043b\u0430\u0439\u0444\u0445\u0430\u043a\u0438.<\/p>\n<ul>\n<li>\u0415\u0441\u0442\u044c \u0448\u043e\u0440\u0442\u043a\u0430\u0442\u044b. \u0417\u0430\u043f\u0438\u0441\u044c \u00abmsg\u00bb \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u00abmessage\u00bb \u0438 \u00abchannel_post\u00bb, \u00abedit\u00bb \u2014 \u00abedited_message\u00bb \u0438 \u00abedited_channel_post\u00bb, \u0430 \u00ab:media\u00bb \u2013 \u00ab:photo\u00bb \u0438 \u00ab:video\u00bb.<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0430\u0441\u0441\u0438\u0432 [\u00ab::url\u00bb, \u00ab::email\u00bb] \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u043e\u0439, \u0442\u0430\u043a \u0438 \u0441 \u043f\u0438\u0441\u044c\u043c\u043e\u043c.<\/li>\n<li>\u0424\u0438\u043b\u044c\u0442\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, bot.on(\u00ab:photo\u00bb).on(\u00ab::hashtag\u00bb) \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043a\u043e\u043b\u043b\u0431\u044d\u043a, \u0435\u0441\u043b\u0438 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0438 \u0444\u043e\u0442\u043e, \u0438 \u0445\u0435\u0448\u0442\u0435\u0433. \u041f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0444\u0438\u0447\u0430 \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432.<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 .filter. \u041f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u0432\u0442\u043e\u0440\u044b\u043c (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430) \u2014 \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0434\u043b\u044f \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/li>\n<\/ul>\n<pre><code class=\"javascript\">bot.on('message').filter(   (ctx) => ctx.from.id === 255162448,   async (ctx) => { await ctx.reply('\u041f\u0440\u0438\u0432\u0435\u0442, \u0430\u0434\u043c\u0438\u043d!'); }, ); <\/code><\/pre>\n<p>  \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f-\u0444\u0438\u043b\u044c\u0442\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0431\u044d\u043a.<\/p>\n<p>  \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043d\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u043c\u043e\u0438\u043c \u043b\u0438\u0447\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c. \u0415\u0441\u043b\u0438 \u043e\u043d \u0441\u043e\u0432\u043f\u0430\u043b, \u0431\u043e\u0442 \u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u043b\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u043c. \u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0437\u043d\u0430\u0442\u044c \u0441\u0432\u043e\u0439 id, \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  \u0422\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u044e\u0437\u0435\u0440\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0443\u0437\u043d\u0430\u0442\u044c \u0435\u0433\u043e \u0440\u043e\u043b\u044c \u0438 \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<h3>\u041e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/h3>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0443\u0437\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440 \u0434\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430, \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0432 \u0431\u043e\u0442\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u0435\u043d \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c bot.hears:<\/p>\n<pre><code class=\"javascript\">bot.hears('\u043f\u0438\u043d\u0433', async (ctx) => {  await ctx.reply('\u043f\u043e\u043d\u0433');  });  <\/code><\/pre>\n<p>  \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0434\u0438\u043d-\u0432-\u043e\u0434\u0438\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0435 \u00ab\u043f\u0438\u043d\u0433\u00bb, \u0438\u043d\u0430\u0447\u0435 \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0432\u044b\u0437\u0432\u0430\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u043e\u0442 \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442 \u00ab\u043f\u0438\u043d\u0433\u00bb, \u0430 \u043d\u0430 \u00ab\u041f\u0438\u043d\u0433\u00bb \u2014 \u043d\u0435\u0442. \u0410 \u0432\u043e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0434\u043e \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u0433\u0440\u0430\u044e\u0442 \u0440\u043e\u043b\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u044b. \u041a\u0430\u043a \u0438 \u0440\u0430\u043d\u0435\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u043e\u043a, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"javascript\">bot.hears(['\u043f\u0438\u043d\u0433', '\u0435\u0449\u0435 \u043f\u0438\u043d\u0433'], async (ctx) => {  await ctx.reply('\u043f\u043e\u043d\u0433'); }); <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/uc\/ef\/br\/ucefbrmnhzn3jo0b4wlor9_dd34.png\" data-src=\"https:\/\/habrastorage.org\/webt\/uc\/ef\/br\/ucefbrmnhzn3jo0b4wlor9_dd34.png\"\/><\/div>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c bot.hears \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a\u0443, \u043d\u043e \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0431\u043e\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u043b \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0432 \u00ab\/ \/\u00bb. \u0422\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0446\u0435\u043f\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"javascript\">bot.hears(\/\u043f\u0438\u043f\u0435\u0446\/, async (ctx) => { await ctx.reply('\u0420\u0443\u0433\u0430\u0435\u043c\u0441\u044f?'); }); <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/he\/o9\/uy\/heo9uywv4v4uke3r7ogidpyueag.png\" data-src=\"https:\/\/habrastorage.org\/webt\/he\/o9\/uy\/heo9uywv4v4uke3r7ogidpyueag.png\"\/><\/div>\n<p>  <\/p>\n<h3>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u043a\u043e\u0434\u0435<\/h3>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0432\u0430\u0436\u043d\u0430. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u0431\u043e\u0442 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0435\u0442 \u043d\u0430\u043c \u00ab\u041f\u0440\u0438\u0432\u0435\u0442! \u042f \u2014 \u0431\u043e\u0442\u00bb, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u00ab\/start\u00bb \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043f\u043e\u0434 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f, \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f.<\/p>\n<pre><code class=\"javascript\">bot.on('message', async (ctx) => await ctx.reply('\u041f\u0440\u0438\u0432\u0435\u0442')); bot.command('start', async (ctx) => {       await ctx.reply('\u041f\u0440\u0438\u0432\u0435\u0442! \u042f - \u0411\u043e\u0442?'); }); <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0448\u0435, \u0447\u0435\u043c \u043e\u0431\u0449\u0438\u0435. \u0415\u0441\u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0430\u0434\u043e \u2014 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u00ab\/start\u00bb \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0442\u0432\u0435\u0442 \u00ab\u041f\u0440\u0438\u0432\u0435\u0442! \u042f \u2014 \u0431\u043e\u0442\u00bb, \u0430 \u043d\u0430 \u043b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u041f\u0440\u0438\u0432\u0435\u0442\u00bb.<\/p>\n<p>  <a name=\"5\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Context (ctx)?<\/h2>\n<p><\/font><br \/>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043e\u043d\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u044b Telegram, \u0430 \u043f\u043e\u0441\u043b\u0435 \u2014 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0443, \u0433\u0434\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0441\u0430\u043c \u0431\u043e\u0442.<\/p>\n<p>  \u0422\u0430\u043a \u0432\u043e\u0442, \u043a\u043e\u0433\u0434\u0430 \u0431\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 Telegram, \u043e\u043d \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Context (\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442). \u041e\u0431\u044a\u0435\u043a\u0442 Context \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442 \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0447\u0430\u0442\u0435, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u0430\u043c\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438.<\/p>\n<p>  \u042d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. Context \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f. \u041e\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a ctx.<\/p>\n<h3>Context: \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f<\/h3>\n<p>  \u041e\u0431\u044a\u0435\u043a\u0442 Context \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0441\u0440\u0435\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439:<\/p>\n<ul>\n<li>ctx.from \u2014 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (id, \u0438\u043c\u044f, \u044e\u0437\u0435\u0440\u043d\u0435\u0439\u043c, \u044f\u0437\u044b\u043a \u0438 \u0434\u0440.);<\/li>\n<li>ctx.msg \u2014 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u0432\u043d\u0443\u0442\u0440\u0438 \u0435\u0441\u0442\u044c id \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435, \u0434\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438, \u0442\u0435\u043a\u0441\u0442 \u0438 \u0434\u0440.);<\/li>\n<li>ctx.me \u2014 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0441\u0430\u043c\u043e\u043c \u0431\u043e\u0442\u0435.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432 \u0444\u0438\u043b\u044c\u0442\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f? \u0422\u0430\u043c \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0432\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 ctx.from, \u0432\u044b\u0432\u0435\u0434\u044f \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c. \u041c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u0431\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0435\u0433\u043e id \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443:<\/p>\n<pre><code class=\"javascript\">bot.hears('ID', async (ctx) => {  await ctx.reply(`\u0412\u0430\u0448 telegram ID: ${ctx.from.id}`); }) <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/0d\/iu\/5c\/0diu5ckofxcnvuu1g2bzxa-grom.png\" data-src=\"https:\/\/habrastorage.org\/webt\/0d\/iu\/5c\/0diu5ckofxcnvuu1g2bzxa-grom.png\"\/><\/div>\n<p>  <\/p>\n<h3>Context: \u043c\u0435\u0442\u043e\u0434\u044b \u2014 reply<\/h3>\n<p>  \u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0443\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 reply \u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u043b\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c.<\/p>\n<p>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439, \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0436\u0438\u0434\u0430\u0442\u044c\u0441\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f await \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043f\u043e\u043c\u0438\u043c\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 (\u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442), \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u2014 \u043e\u0431\u044a\u0435\u043a\u0442. \u041e\u043d \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438.<\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u043a\u0430\u0437\u0430\u0432 reply_parameters \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0442\u0443\u0434\u0430 id \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043c\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043c \u0431\u043e\u0442\u0430 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"javascript\">bot.on(  'message', async (ctx) => await ctx.reply('\u041f\u0440\u0438\u0432\u0435\u0442', { reply_parameters: { message_id: ctx.msg.message_id }, }), ); <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/gi\/7b\/jl\/gi7bjlt_xwtdme5ou-ryab6olzg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/gi\/7b\/jl\/gi7bjlt_xwtdme5ou-ryab6olzg.png\"\/><\/div>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0438\u0434\u043e\u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 parse_mode. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: HTML, Markdown, MarkdownV2.<\/p>\n<p>  \u0421\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c HTML \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u0442\u044d\u0433\u0438: \u0441\u0441\u044b\u043b\u043a\u0443, \u0436\u0438\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u043a\u0443\u0440\u0441\u0438\u0432, \u0441\u043f\u043e\u0439\u043b\u0435\u0440 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"javascript\">bot.on( 'message', async (ctx) => await ctx.reply( '\u041f\u0440\u0438\u0432\u0435\u0442! \u041f\u043e\u0434\u043f\u0438\u0448\u0438\u0441\u044c \u043d\u0430 &lt;a href=\"https:\/\/t.me\/pomazkovjs\">\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b&lt;\/a> pomazkov.js', { parse_mode: 'HTML', },  ), ); <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/yu\/xt\/q8\/yuxtq8-5npdkcmv4rlnyagcxbtk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/yu\/xt\/q8\/yuxtq8-5npdkcmv4rlnyagcxbtk.png\"\/><\/div>\n<p>  <\/p>\n<pre><code class=\"javascript\">{ parse_mode: 'HTML', disable_web_page_preview: true, } <\/code><\/pre>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 MarkdownV2. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443 \u043d\u0435\u0433\u043e \u0442\u0435 \u0436\u0435, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431: \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441\u043f\u0440\u0430\u0432\u0430 \u0438 \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u0442\u0435\u043a\u0441\u0442\u0430. \u0412\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<ul>\n<li>*\u0436\u0438\u0440\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442*<\/li>\n<li>_\u043a\u0443\u0440\u0441\u0438\u0432_<\/li>\n<li>__\u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439__<\/li>\n<li>||\u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c||<\/li>\n<li>[\u0442\u0435\u043a\u0441\u0442\u044b \u0441\u0441\u044b\u043b\u043a\u0438](http:\/\/www.example.com\/)<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>Context: \u043c\u0435\u0442\u043e\u0434\u044b \u2014 react<\/h3>\n<p>  \u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0443 ctx \u2014 react. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442 \u043b\u0438\u0446\u0430 \u0431\u043e\u0442\u0430. \u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 start \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0431\u043e\u0442 \u0435\u0449\u0435 \u0438 \u0441\u0442\u0430\u0432\u0438\u043b \u043b\u0430\u0439\u043a \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"javascript\">bot.command('start', async (ctx) => { await ctx.react('?'); await ctx.reply('\u041f\u0440\u0438\u0432\u0435\u0442! \u042f - \u0411\u043e\u0442 ?'); }); <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/pi\/v6\/34\/piv634bi6fhqyi_np1zglzq7nke.png\" data-src=\"https:\/\/habrastorage.org\/webt\/pi\/v6\/34\/piv634bi6fhqyi_np1zglzq7nke.png\"\/><\/div>\n<p>  <a name=\"6\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u041a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b<\/h2>\n<p><\/font><br \/>  \u041a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u2014 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u0412 Telegram-\u0431\u043e\u0442\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b: \u043e\u0431\u044b\u0447\u043d\u0443\u044e, \u0438\u043b\u0438 custom, \u0438 inline. \u0423 \u043e\u0431\u0435\u0438\u0445 \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c;<\/li>\n<li>\u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u2014 \u043e\u0434\u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430, \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f.<\/li>\n<\/ul>\n<p>  \u042d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 Telegram, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u0435\u043b\u0430\u0435\u0448\u044c.<\/p>\n<h3>Custom Keyboard<\/h3>\n<p>  \u0421\u043f\u0435\u0440\u0432\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c Custom Keyboard. \u042d\u0442\u043e \u00ab\u043e\u0431\u044b\u0447\u043d\u0430\u044f\u00bb \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0438\u0437\u0443 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u0441 \u0431\u0443\u043a\u0432\u0430\u043c\u0438.<\/p>\n<p>  \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 Keyboard \u0438\u0437 Grammy:<\/p>\n<pre><code class=\"javascript\">const { Bot, GrammyError, HttpError, Keyboard } = require('grammy');                                                    <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u043e\u0442\u0430, \u0447\u0435\u0440\u0435\u0437 new Keyboard(). \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u043a \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 text, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0433\u0440\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u043d\u0430\u0434\u043f\u0438\u0441\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435.<\/p>\n<p>  \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0441\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u0441\u0442\u0430\u044e\u0442 \u0432 \u043e\u0434\u0438\u043d \u0440\u044f\u0434. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c, \u043d\u0443\u0436\u0435\u043d \u043c\u0435\u0442\u043e\u0434 row(), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442 \u0440\u044f\u0434 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u043d\u043e\u043f\u043a\u0438 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u0431\u044b\u043b\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u0427\u0442\u043e\u0431\u044b \u043a\u043d\u043e\u043f\u043a\u0438 \u0431\u044b\u043b\u0438 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 resized.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Custom Keyboard<\/h4>\n<p>  \u0421\u043f\u0440\u043e\u0441\u0438\u043c, \u043a\u0430\u043a \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435, \u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443. \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0435\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e moodKeyboard \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \/keyboard:<\/p>\n<pre><code class=\"javascript\">const moodKeyboard = new Keyboard() .text('\u0425\u043e\u0440\u043e\u0448\u043e') .row() .text('\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e') .row() .text('\u041f\u043b\u043e\u0445\u043e') .resized(); <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 reply \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442:<\/p>\n<pre><code class=\"javascript\">bot.command('keyboard', async (ctx) => { await ctx.reply('\u041a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435?', { reply_markup: moodKeyboard, }); }); <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/jg\/td\/1d\/jgtd1dour7gh1i1tmy6evzg1rde.png\" data-src=\"https:\/\/habrastorage.org\/webt\/jg\/td\/1d\/jgtd1dour7gh1i1tmy6evzg1rde.png\"\/><\/div>\n<p>  \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u043c\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u0431\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043e\u0442\u0432\u0435\u0442 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0442\u0430\u043a\u0438\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c bot.hears:<\/p>\n<pre><code class=\"javascript\">bot.hears(\"\u0425\u043e\u0440\u043e\u0448\u043e\", async (ctx) => { await ctx.reply('\u0420\u0430\u0434 \u0441\u043b\u044b\u0448\u0430\u0442\u044c!'); }) <\/code><\/pre>\n<p>  \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 <b>\u0425\u043e\u0440\u043e\u0448\u043e<\/b> \u0438 \u0432\u0438\u0434\u0438\u043c \u043e\u0442\u0432\u0435\u0442:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/4q\/ei\/48\/4qei48bd9qtmsbd27qykpgqyawe.png\" data-src=\"https:\/\/habrastorage.org\/webt\/4q\/ei\/48\/4qei48bd9qtmsbd27qykpgqyawe.png\"\/><\/div>\n<p>  \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d\u0430 \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0439 \u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0432\u043e\u0437\u043b\u0435 \u0437\u043d\u0430\u0447\u043a\u0430 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430. \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0438\u0441\u0447\u0435\u0437\u0430\u043b\u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0442\u043e \u0435\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e\u0439), \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 oneTime:<\/p>\n<pre><code class=\"javascript\">const moodKeyboard = new Keyboard() .text('\u0425\u043e\u0440\u043e\u0448\u043e') .row() .text('\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e') .row() .text('\u041f\u043b\u043e\u0445\u043e') .resized()   .oneTime(); <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u043f\u0430\u0434\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044f.<\/p>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0443\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 remove_keyboard:<\/p>\n<pre><code class=\"javascript\">bot.hears('\u0425\u043e\u0440\u043e\u0448\u043e', async (ctx) => { await ctx.reply('\u0420\u0430\u0434 \u0441\u043b\u044b\u0448\u0430\u0442\u044c!', { reply_markup: { remove_keyboard: true }, }); }); <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0435\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432. \u041a\u043b\u0430\u0441\u0441 Keyboard \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 Keyboard.text, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043d\u043e\u043f\u043e\u043a. \u0414\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Keyboard.from:<\/p>\n<pre><code class=\"javascript\">const moodLabels = ['\u0425\u043e\u0440\u043e\u0448\u043e', \"\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\", '\u041f\u043b\u043e\u0445\u043e']; const rows = moodLabels.map((label) => [Keyboard.text(label)]); const moodKeyboard2 = Keyboard.from(rows).resized(); <\/code><\/pre>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043a\u0440\u043e\u043c\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c Telegram, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u044e (requestLocation), \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 (requestContact) \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043e\u043f\u0440\u043e\u0441 (requestPoll):<\/p>\n<pre><code class=\"javascript\">const shareKeyboard = new Keyboard() .requestLocation('\u0413\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u044f') .requestContact('\u041a\u043e\u043d\u0442\u0430\u043a\u0442') .requestPoll('\u041e\u043f\u0440\u043e\u0441') .placeholder('\u042f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f...') .resized(); bot.command('share', async (ctx) => {  await ctx.reply('\u041a\u0430\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0445\u043e\u0447\u0435\u0448\u044c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f?', {    reply_markup: shareKeyboard,  }); }); <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0432 \u043c\u0435\u043d\u044e, \u043a\u0430\u043a \u043c\u044b \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435:<\/p>\n<pre><code class=\"javascript\">bot.api.setMyCommands([ { command: 'share', description: '\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438' }, ]); <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/uy\/o6\/7d\/uyo67d7_-jqd895n7muhjrtzzeg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/uy\/o6\/7d\/uyo67d7_-jqd895n7muhjrtzzeg.png\"\/><\/div>\n<p>  \u042d\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043d\u0430\u043c \u043c\u0435\u0442\u043e\u0434 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u2014 bot.on:<\/p>\n<pre><code class=\"javascript\">bot.on(':location', async (ctx) => { await ctx.reply('\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u044e!'); }); bot.on(':contact', async (ctx) => { await ctx.reply('\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043a\u043e\u043d\u0442\u0430\u043a\u0442!'); }); <\/code><\/pre>\n<p>  <\/p>\n<h3>Inline Keyboard<\/h3>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0442\u0438\u043f \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u2014 inline-\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430. \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e inline \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u043f\u043e\u0434 \u043d\u0438\u043c. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u2014 \u0447\u0435\u0440\u0435\u0437 \u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"javascript\">const { Bot, GrammyError, HttpError, Keyboard, InlineKeyboard } = require('grammy'); <\/code><\/pre>\n<pre><code class=\"javascript\">const inlineKeyboard = new InlineKeyboard() .text('1', 'button-1') .text('2', 'button-2') .text('3', 'button-3'); <\/code><\/pre>\n<p>  <\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Inline Keyboard<\/h4>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 text \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0432\u0438\u0434\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. \u0412\u0442\u043e\u0440\u043e\u0439 \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043d\u0430\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 callback query payload. \u0427\u0442\u043e\u0431\u044b \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043e\u0442 inline-\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u2014 bot.callbackQuery. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043f\u0435\u0440\u0432\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b:<\/p>\n<pre><code class=\"javascript\">bot.command('inline_keyboard', async  (ctx) => { await ctx.reply('\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0438\u0444\u0440\u0443', { reply_markup: inlineKeyboard, }); }); <\/code><\/pre>\n<p>  \u0412\u043e\u0442, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/sw\/4k\/bn\/sw4kbnbis6cad-9umyxg-q24dng.png\" data-src=\"https:\/\/habrastorage.org\/webt\/sw\/4k\/bn\/sw4kbnbis6cad-9umyxg-q24dng.png\"\/><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u044f:<\/p>\n<pre><code class=\"javascript\">bot.callbackQuery('button-1', async (ctx) => { await ctx.reply('\u0412\u044b\u0431\u0440\u0430\u043d\u0430 \u0446\u0438\u0444\u0440\u0430 1'); }); <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430\u043c \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0431\u043e\u0442\u0430, \u043d\u043e \u043d\u0430\u0432\u0435\u0440\u0445\u0443 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u00ab\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u2026\u00bb. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 inline-\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 ctx.answerCallbackQuery:<\/p>\n<pre><code class=\"javascript\">bot.callbackQuery('button-1', async  (ctx) => { await  ctx.answerCallbackQuery({ text: '\u0412\u044b\u0431\u0440\u0430\u043d\u0430 \u0446\u0438\u0444\u0440\u0430 1', }); await ctx.answerCallbackQuery(); }); <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u0441\u0440\u0430\u0437\u0443 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u043e\u043a\u043e\u0448\u043a\u0435 (\u0433\u0434\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u00ab\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u2026\u00bb):<\/p>\n<pre><code class=\"javascript\">bot.callbackQuery('button-1', async (ctx) => { await ctx.reply('\u0412\u044b\u0431\u0440\u0430\u043d\u0430 \u0446\u0438\u0444\u0440\u0430 1'); await ctx.answerCallbackQuery({ text: \"\u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u043d\u044f\u0442!\", }); }); <\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u043b\u0443\u0447\u0448\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0434\u043d\u0443 \u043a\u043d\u043e\u043f\u043a\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. \u0417\u0430\u043c\u0435\u043d\u0438\u043c bot.callbackQuery \u043d\u0430 bot.on \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0430 \u0444\u0438\u043b\u044c\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u0435 callbackQuery (\u043a\u043e\u043b\u043b\u0431\u044d\u043a-\u0437\u0430\u043f\u0440\u043e\u0441\u044b), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 (payload):<\/p>\n<pre><code class=\"javascript\">bot.on(\"callback_query:data\", async (ctx) => { await ctx.reply('\u041d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 inline-\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b'); await ctx.answerCallbackQuery(); }); <\/code><\/pre>\n<p>  \u041d\u0430 \u043b\u044e\u0431\u043e\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 inline-\u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430\u0448 \u0431\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u043d\u043e\u043f\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0436\u0430\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c:<\/p>\n<pre><code class=\"javascript\">bot.on('callback_query:data', async (ctx) => { await ctx.reply(`\u041d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 ${ctx.callbackQuery.data}`); await ctx.answerCallbackQuery(); }); <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/cc\/al\/hh\/ccalhhddn6s-bz_1msve2txmyv0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/cc\/al\/hh\/ccalhhddn6s-bz_1msve2txmyv0.png\"\/><\/div>\n<h4>\u0427\u0442\u043e \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e Inline-\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443<\/h4>\n<p>  <\/p>\n<ul>\n<li>\u0412 \u043c\u0435\u0442\u043e\u0434 text \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/li>\n<li>\u0412 inline-\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0445 \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 row, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0440\u044f\u0434.<\/li>\n<li>\u041a\u0440\u043e\u043c\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 text \u0438 row \u0435\u0441\u0442\u044c login, pay, url \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const inlineKeyboard = new InlineKeyboard() .url('\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0442\u0433-\u043a\u0430\u043d\u0430\u043b', '&lt;a href=\"https:\/\/t.me\/pomazkovjs\">https:\/\/t.me\/pomazkovjs&lt;\/a>'); <\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u043b\u0430\u0433\u0438\u043d\u044b \u0432 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0445<\/h3>\n<p>  \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u043e\u0449\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0442\u043e, \u0447\u0442\u043e \u0438 \u0442\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0434\u0430\u044e\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u0435\u043c, \u0441\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0437\u043d\u0430\u043b \u043e\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430. \u0414\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d hydrate.<\/p>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c hydrate \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<pre><code class=\"javascript\">npm i @grammyjs\/hydrate <\/code><\/pre>\n<p>  \u0418 \u0441\u0440\u0430\u0437\u0443 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0430\u0432\u0435\u0440\u0445\u0443 \u0444\u0430\u0439\u043b\u0430:<\/p>\n<pre><code class=\"javascript\">import { hydrate } from \"@grammyjs\/hydrate\";                                                    &lt;br><\/code><\/pre>\n<p>  \u0410 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0431\u043e\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d \u0447\u0435\u0440\u0435\u0437 bot.use:<\/p>\n<pre><code class=\"plaintext\">const bot = new Bot(process.env.BOT_API_KEY); bot.use(hydrate()); <\/code><\/pre>\n<p>  \u041f\u043b\u0430\u0433\u0438\u043d \u0433\u043e\u0442\u043e\u0432 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e. \u0422\u0430\u043a \u0437\u0430\u0447\u0435\u043c \u0436\u0435 \u043e\u043d \u043d\u0443\u0436\u0435\u043d? \u041e\u043d \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c inline-\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. \u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u043b\u0438 \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u044f, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u0435\u0435 \u0441\u043a\u0440\u044b\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435, \u043d\u0435 \u0437\u0430\u0445\u043b\u0430\u043c\u043b\u044f\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0443.<\/p>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u043c\u0435\u043d\u044f\u044f \u0442\u0435\u043a\u0441\u0442 \u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443.<\/p>\n<p>  \u0421\u044b\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0441\u043e\u0437\u0434\u0430\u0432 \u043c\u0435\u043d\u044e \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u0443\u043d\u043a\u0442\u0430\u043c\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434.<\/p>\n<p>  \u0421\u043f\u0435\u0440\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b:<\/p>\n<pre><code class=\"javascript\">const menuKeyboard = new InlineKeyboard() .text('\u0423\u0437\u043d\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430', 'order-status') .text('\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443', 'support'); const backKeyboard = new InlineKeyboard().text('&lt; \u041d\u0430\u0437\u0430\u0434 \u0432 \u043c\u0435\u043d\u044e', 'back'); <\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 \u0432\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0435\u0440\u0432\u044b\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \/menu \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0435\u043d\u044e):<\/p>\n<pre><code class=\"javascript\">bot.command('menu', async (ctx) => {  await ctx.reply('\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0443\u043d\u043a\u0442 \u043c\u0435\u043d\u044e', { reply_markup: menuKeyboard, }); }); bot.callbackQuery('order-status', async (ctx) => { await ctx.callbackQuery.message.editText('\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430: \u0412 \u043f\u0443\u0442\u0438', { reply_markup: backKeyboard, }); await ctx.api.editMessageText await ctx.answerCallbackQuery(); }); bot.callbackQuery('support', async (ctx) => { await ctx.callbackQuery.message.editText('\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0412\u0430\u0448 \u0432\u043e\u043f\u0440\u043e\u0441', { reply_markup: backKeyboard, }); await ctx.answerCallbackQuery(); }); bot.callbackQuery('back', async (ctx) => { await ctx.callbackQuery.message.editText('\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0443\u043d\u043a\u0442 \u043c\u0435\u043d\u044e', { reply_markup: menuKeyboard, }); await ctx.answerCallbackQuery(); }); <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/rt\/as\/7b\/rtas7bacqhzqqbjcymddsgu3af0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/rt\/as\/7b\/rtas7bacqhzqqbjcymddsgu3af0.png\"\/><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ro\/04\/jr\/ro04jrsdotcrq4xtgoaekhu9ziu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ro\/04\/jr\/ro04jrsdotcrq4xtgoaekhu9ziu.png\"\/><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/o3\/nv\/q5\/o3nvq5vurxnvbssy-b9palkrjm0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/o3\/nv\/q5\/o3nvq5vurxnvbssy-b9palkrjm0.png\"\/><\/div>\n<p>  \u041f\u043b\u0430\u0433\u0438\u043d hydrate \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043c\u043e\u0433 \u043d\u0430\u043c \u0442\u0435\u043c, \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043c\u0435\u0442\u043e\u0434 editText, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0422\u043e\u0447\u043d\u0435\u0435, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 ctx.api.editMessageText, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043d\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c id \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 id \u0447\u0430\u0442\u0430, \u0447\u0442\u043e \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u0443\u0434\u043b\u0438\u043d\u044f\u0435\u0442 \u043a\u043e\u0434. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u0440\u0430\u0442\u043a\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 (<code>await ctx.callbackQuery.message.editText('\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430: \u0412 \u043f\u0443\u0442\u0438', { reply_markup: backKeyboard,});<\/code>) \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439: <\/p>\n<pre><code class=\"javascript\">await ctx.api.editMessageText( ctx.chat.id, ctx.update.callback_query.message.message_id, '\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430: \u0412 \u043f\u0443\u0442\u0438', { reply_markup: backKeyboard, }, ); <\/code><\/pre>\n<p>  \u0423\u0434\u043e\u0431\u043d\u043e? \u0423\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>  \u041f\u043b\u0430\u0433\u0438\u043d\u044b \u2014 \u043e\u0447\u0435\u043d\u044c \u043e\u0431\u0448\u0438\u0440\u043d\u0430\u044f \u0442\u0435\u043c\u0430, \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u0430\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u043c \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u0442\u044c \u043d\u0430\u0432\u044b\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u0442\u043e\u0432 \u0434\u043e \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f.<\/p>\n<p>  <a name=\"7\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0414\u0435\u043f\u043b\u043e\u0439 \u0431\u043e\u0442\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 Selectel<\/h2>\n<p><\/font><br \/>  \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u043a\u0443, \u0435\u0441\u043b\u0438 \u043c\u044b \u0442\u0430\u043a \u0438 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u0427\u0442\u043e\u0431\u044b \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0431\u043e\u0435\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 <a href=\"https:\/\/selectel.ru\/services\/cloud\/servers\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=cloud_article_grammy_120324_content\">\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/a>. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h3>\n<p>  \u0421\u043f\u0435\u0440\u0432\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431. \u0417\u0430\u0442\u0435\u043c \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Selectel, \u0438\u0434\u0435\u043c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b <b>\u041e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430<\/b>, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d \u0438 \u043f\u0443\u043b, \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c <b>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440<\/b>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/el\/bm\/-q\/elbm-q2rzrqmmcasftzyawgume8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/el\/bm\/-q\/elbm-q2rzrqmmcasftzyawgume8.png\"\/><\/div>\n<p>  \u0412\u0432\u043e\u0434\u0438\u043c \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0434\u0430\u043b\u0435\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u2014 \u0442\u0443\u0442 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0441\u0435 \u0441\u0432\u0435\u0436\u0438\u0435 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u044b Linux: Ubuntu, Debian, CentOS, Fedora \u0438 \u0442. \u0434. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u043d\u0430\u0441, \u043f\u0443\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e Ubuntu 22.04 LTS 64-bit 512 \u041c\u0411.<\/p>\n<p>  \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f: \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Shared. \u041e\u043d\u0430 \u0441\u0442\u043e\u0438\u0442 \u0432\u0441\u0435\u0433\u043e \u043e\u0442 10 \u0440\u0443\u0431\u043b\u0435\u0439 \u0432 \u0434\u0435\u043d\u044c \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 \u0442\u0433-\u0431\u043e\u0442\u043e\u0432, \u043b\u0438\u0447\u043d\u044b\u0445 VPN \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e. \u0421\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0430\u0440\u0435\u043d\u0434\u0443\u0435\u043c \u043d\u0435 \u0432\u0435\u0441\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u0430 \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u044c \u2014 10, 20 \u0438\u043b\u0438 50%. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c 20% \u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043a\u0441\u0442\u0430\u0442\u0438, \u0435\u0441\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0440\u0435\u043d\u0434\u0430\u0442\u043e\u0440\u043e\u0432, \u043d\u0430\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b 100% \u0435\u0433\u043e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0431\u0435\u0437 \u0434\u043e\u043f\u043b\u0430\u0442.<\/p>\n<p>  \u0414\u0438\u0441\u043a \u2014 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 SSD \u043d\u0430 5 \u0413\u0411, \u0441\u0435\u0442\u044c \u2014 \u043d\u043e\u0432\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0435\u0442\u044c, \/29.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/xr\/ez\/18\/xrez18jlso3i-i-rw90xo7nwbrg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/xr\/ez\/18\/xrez18jlso3i-i-rw90xo7nwbrg.png\"\/><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/og\/6n\/jj\/og6njjpukuggnmb3kpxpkqa95ww.png\" data-src=\"https:\/\/habrastorage.org\/webt\/og\/6n\/jj\/og6njjpukuggnmb3kpxpkqa95ww.png\"\/><\/div>\n<p>  SSH \u043a\u043b\u044e\u0447\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u043d\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043e\u043d \u043d\u0430\u043c \u0441\u043d\u043e\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d.<\/p>\n<p>  \u0421 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0432\u0441\u0435, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c <b>\u0421\u043e\u0437\u0434\u0430\u0442\u044c<\/b> \u0432\u043d\u0438\u0437\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h3>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00ab\u041a\u043e\u043d\u0441\u043e\u043b\u044c\u00bb. \u0412 \u043d\u0435\u0439 \u043b\u043e\u0433\u0438\u043d\u0438\u043c\u0441\u044f: \u043b\u043e\u0433\u0438\u043d \u2014 root, \u043f\u0430\u0440\u043e\u043b\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0434 \u043e\u0442\u043a\u0440\u044b\u0432\u0448\u0435\u0439\u0441\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u044e.<\/p>\n<p>  \u0412\u0432\u043e\u0434\u0438\u043c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:<\/p>\n<pre><code class=\"bash\">sudo apt update sudo apt install git <\/code><\/pre>\n<p>  \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0431\u043e\u0442\u043e\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440:<\/p>\n<pre><code class=\"bash\">git clone git clone &lt;a href=\"https:\/\/github.com\/arseniypom\/grammy-js.git\">https:\/\/github.com\/arseniypom\/grammy-js.git&lt;\/a> <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043f\u0430\u043f\u043a\u0430 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f (\u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e grammy-js), \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043d\u0435\u0435:<\/p>\n<pre><code class=\"bash\">cd grammy-js <\/code><\/pre>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Node.js \u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 npm:<\/p>\n<pre><code class=\"bash\">sudo apt install nodejs <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">sudo apt install npm <\/code><\/pre>\n<p>  \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e:<\/p>\n<pre><code class=\"bash\">node -v <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">npm -v <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/yd\/f4\/y5\/ydf4y5riwln6piy7cbqnugud3gq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/yd\/f4\/y5\/ydf4y5riwln6piy7cbqnugud3gq.png\"\/><\/div>\n<p>  \u0412\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0442\u0430\u0432\u044f\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u044b\u0435, \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u0438\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0430\u043a\u0435\u0442 n:<\/p>\n<pre><code class=\"bash\">sudo npm install -g n <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e:<\/p>\n<pre><code class=\"bash\">sudo n stable <\/code><\/pre>\n<p>  \u0417\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u044e node. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441, \u043a\u0430\u043a \u0438 \u0443 \u043c\u0435\u043d\u044f, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/iw\/yo\/f1\/iwyof1c5tdkszaluqinmzwvgp9o.png\" data-src=\"https:\/\/habrastorage.org\/webt\/iw\/yo\/f1\/iwyof1c5tdkszaluqinmzwvgp9o.png\"\/><\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u043b\u043e\u0433\u0438\u043d\u0438\u043c\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u0438 \u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u043e\u0432\u044b\u043c\u0438.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0434\u0435\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"bash\">cd grammy-js npm i <\/code><\/pre>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u0442\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 pm2. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0435\u0433\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e (\u0444\u043b\u0430\u0433 -g):<\/p>\n<pre><code class=\"bash\">npm i pm2 -g <\/code><\/pre>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0431\u043e\u0442\u0430 (\u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0438\u043d\u0430\u0447\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b):<\/p>\n<pre><code class=\"bash\">pm2 start index.js <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u043e\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/x-\/-0\/hb\/x--0hb70r6vgjgrx_u0o-ifku-m.png\" data-src=\"https:\/\/habrastorage.org\/webt\/x-\/-0\/hb\/x--0hb70r6vgjgrx_u0o-ifku-m.png\"\/><\/div>\n<p>  <a name=\"8\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p><\/font><br \/>  \u041c\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c Telegram-\u0431\u043e\u0442\u043e\u0432 \u043d\u0430 grammY, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438, \u043d\u043e \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0434\u0435\u043f\u043b\u043e\u0439 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u0432. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 grammY \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0448\u0442\u0430\u0442\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Telegram API, \u0430 <a href=\"https:\/\/selectel.ru\/services\/cloud\/servers\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=cloud_article_grammy_120324_content\">\u043e\u0431\u043b\u0430\u043a\u043e Selectel<\/a> \u2014 \u0433\u0438\u0431\u043a\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<blockquote><p><b>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u0438 \u0442\u0435\u043a\u0441\u0442\u044b \u0442\u043e\u0436\u0435 \u0432\u0430\u0441 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442:<\/b><\/p>\n<p>  \u2192 <a href=\"https:\/\/habr.com\/ru\/company\/selectel\/blog\/797253\">\u041f\u0438\u0442\u043e\u043c\u0446\u044b \u0438 \u0438\u0445 \u0430\u0439\u0442\u0438\u0448\u043d\u0438\u043a\u0438: 6 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u043a\u043e \u0434\u043d\u044e \u043a\u043e\u0448\u0435\u043a<\/a><br \/>  \u2192 <a href=\"https:\/\/habr.com\/ru\/company\/selectel\/blog\/798363\">\u041b\u0438\u043a\u0431\u0435\u0437 \u043f\u043e Data Governance, \u0437\u0430\u0449\u0438\u0442\u0430 LLM, \u0440\u0435\u0439\u0442\u0438\u043d\u0433 BI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u043e\u0432\u0438\u043d\u043a\u0438 \u0432 \u043c\u0438\u0440\u0435 ML \u0438 DA<\/a><br \/>  \u2192 <a href=\"https:\/\/habr.com\/ru\/company\/selectel\/blog\/798839\">AMD \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u0439\u0442\u0438 \u043f\u043e \u043f\u0443\u0442\u0438 Nvidia \u0438 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u0439 \u0418\u0418-\u0447\u0438\u043f. \u041d\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a<\/a><\/p><\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/799761\/\"> https:\/\/habr.com\/ru\/articles\/799761\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/tf\/th\/ct\/tfthct7rsmxxkfnutcyewqgwjdu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/tf\/th\/ct\/tfthct7rsmxxkfnutcyewqgwjdu.png\"\/><\/div>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0440\u0441\u0435\u043d\u0438\u0439, \u044f \u0441\u0435\u043d\u044c\u043e\u0440 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 grammY \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u043e\u0442\u0430, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a, \u0432\u0438\u0434\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439, \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0432\u0438\u0434\u0430\u043c\u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440 \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435. \u0418 \u0432\u0441\u0435 \u044d\u0442\u043e \u2014 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445.<\/p>\n<p>  \u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u043d\u0430 <a href=\"https:\/\/selectel.ru\/services\/cloud\/servers\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=cloud_article_grammy_120324_content\">\u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/a>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u0438 \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u041f\u043e\u0435\u0445\u0430\u043b\u0438!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-370620","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/370620","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=370620"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/370620\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=370620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=370620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=370620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}