{"id":484278,"date":"2026-06-19T11:01:21","date_gmt":"2026-06-19T11:01:21","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=484278"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=484278","title":{"rendered":"T2M Bridge, \u0447\u0430\u0441\u0442\u044c 2: \u043a\u0430\u043a\u00a0\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b Java\u2011\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f\u00a0Telegram Bot API \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u00a0Codex\u00a0\u2014 \u0443\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 50\/50"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e03\/cb2\/dc4\/e03cb2dc43acff4a779065affbc6cb78.jpg\" width=\"1280\" height=\"720\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e03\/cb2\/dc4\/e03cb2dc43acff4a779065affbc6cb78.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e03\/cb2\/dc4\/e03cb2dc43acff4a779065affbc6cb78.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 T2M Bridge &#8212; \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433\u0430 \u043c\u0435\u0436\u0434\u0443 Telegram-\u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u0438 MAX-\u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438.<\/p>\n<p>\u0412 \u0446\u0438\u043a\u043b\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u0435 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1049564\/\" rel=\"noopener noreferrer nofollow\"><strong>T2M Bridge, \u0447\u0430\u0441\u0442\u044c 1: \u043a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f MAX Bot API \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Codex<\/strong><\/a><\/p>\n<\/li>\n<li>\n<p><strong>T2M Bridge, \u0447\u0430\u0441\u0442\u044c 2: \u043a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f Telegram Bot API \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Codex &#8212; \u0443\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 50\/50<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>T2M Bridge, \u0447\u0430\u0441\u0442\u044c 3: \u043a\u0430\u043a \u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438 \u0441\u043e\u0431\u0440\u0430\u043b \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433\u0430 \u043c\u0435\u0436\u0434\u0443 Telegram \u0438 MAX<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>T2M Bridge, \u0447\u0430\u0441\u0442\u044c 4: \u043a\u0430\u043a \u044f \u0432\u044b\u043a\u0430\u0442\u044b\u0432\u0430\u043b \u0431\u043e\u0442\u0430 \u0432 \u043f\u0440\u043e\u0434 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 Docker Compose<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u043e <code>maxlib<\/code> &#8212; Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f MAX Bot API.<\/p>\n<p>\u0422\u0430\u043c Codex \u0441\u0434\u0435\u043b\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u0430\u0440\u043a\u0430\u0441\u0430. \u042d\u0442\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u043d\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435: \u0418\u0418 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u043b \u043f\u043e\u043b\u044f, \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 MAX Bot API. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443\u0448\u043b\u0430 \u043d\u0435 \u043d\u0430 Java \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u0443\u044e, \u0430 \u043d\u0430 \u0441\u0432\u0435\u0440\u043a\u0443 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c API.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u044f \u043d\u0430\u0447\u0430\u043b \u0434\u0435\u043b\u0430\u0442\u044c Telegram-\u0447\u0430\u0441\u0442\u044c \u0434\u043b\u044f T2M Bridge \u0443\u0436\u0435 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435.<\/p>\n<p>\u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c <code>telegalib<\/code> &#8212; Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Telegram-\u0431\u043e\u0442\u043e\u0432.<\/p>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/p>\n<p><a href=\"https:\/\/github.com\/tardyon-soft\/telegalib\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/tardyon-soft\/telegalib<\/a><\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0443, \u0437\u0430\u0447\u0435\u043c \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0430\u0441\u044c \u0441\u0432\u043e\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 Telegram Bot API, \u043a\u0430\u043a \u043e\u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0442 <code>maxlib<\/code> \u0438 \u043a\u0430\u043a \u0441 \u0435\u0451 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u043d\u0430 Java.<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f Telegram<\/h3>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 MAX, \u0434\u043b\u044f Telegram \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439:<\/p>\n<blockquote>\n<p>\u0417\u0430\u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443?<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0445\u0438\u0435.<\/p>\n<p>\u041c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c: Telegram \u0438 MAX. T2M Bridge \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430 \u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c:<\/p>\n<ul>\n<li>\n<p>\u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044c Telegram \u0441 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u043c MAX;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043d\u0430\u043b\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0431\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0432\u044f\u0437\u0430\u0442\u044c Telegram-\u043a\u0430\u043d\u0430\u043b \u0438 MAX-\u043a\u0430\u043d\u0430\u043b;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u043e\u0432 \u0432 \u043f\u043e\u0445\u043e\u0436\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043b\u044f MAX \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c runtime \u0441 routing, FSM, screens \u0438 middleware, \u0430 \u0434\u043b\u044f Telegram &#8212; \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0438\u043b\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u0431\u043e\u0442\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0437\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>telegalib<\/code> \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a thin-wrapper \u043d\u0430\u0434 Telegram Bot API, \u0430 \u043a\u0430\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 \u043f\u043e\u0445\u043e\u0436\u0438\u043c\u0438 \u0438\u0434\u0435\u044f\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>typed client;<\/p>\n<\/li>\n<li>\n<p>long polling \u0438 webhook;<\/p>\n<\/li>\n<li>\n<p>dispatcher;<\/p>\n<\/li>\n<li>\n<p>router;<\/p>\n<\/li>\n<li>\n<p>filters;<\/p>\n<\/li>\n<li>\n<p>middleware;<\/p>\n<\/li>\n<li>\n<p>FSM;<\/p>\n<\/li>\n<li>\n<p>screen API;<\/p>\n<\/li>\n<li>\n<p>Spring Boot starter;<\/p>\n<\/li>\n<li>\n<p>testkit;<\/p>\n<\/li>\n<li>\n<p>demo-\u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435 \u00ab\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 Telegram-\u0431\u043e\u0442\u043e\u0432\u00bb, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 runtime \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0444\u043e\u0440\u043c\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 Codex \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 <code>maxlib<\/code> \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e: \u0435\u0441\u043b\u0438 \u0434\u0430\u0442\u044c \u0418\u0418 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0448\u0438\u0440\u043e\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u043e\u043d \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0421 Telegram \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>\u041f\u0440\u043e\u0449\u0435 &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Telegram Bot API \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d, \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0430 \u0447\u0430\u0441\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u0430\u0432\u043d\u043e \u0443\u0441\u0442\u043e\u044f\u043b\u0430\u0441\u044c.<\/p>\n<p>\u0421\u043b\u043e\u0436\u043d\u0435\u0435 &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0430\u043c API \u0431\u043e\u043b\u044c\u0448\u043e\u0439. \u0422\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u043e\u0432 update\u2019\u043e\u0432, \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043c\u0435\u0434\u0438\u0430, callback\u2019\u043e\u0432, \u043f\u043b\u0430\u0442\u0435\u0436\u0435\u0439, business-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u044f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Codex \u0438\u043d\u0430\u0447\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043b\u044f <code>maxlib<\/code> \u0444\u043e\u0440\u043c\u0430\u0442 \u0431\u044b\u043b \u0431\u043b\u0438\u0436\u0435 \u043a:<\/p>\n<blockquote>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439 \u043a\u0430\u0440\u043a\u0430\u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0430 \u044f \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043f\u0440\u0430\u0432\u043b\u044e.<\/p>\n<\/blockquote>\n<p>\u0422\u043e \u0434\u043b\u044f <code>telegalib<\/code> \u043f\u043e\u0434\u0445\u043e\u0434 \u0441\u0442\u0430\u043b \u0431\u043b\u0438\u0436\u0435 \u043a 50\/50:<\/p>\n<ul>\n<li>\n<p>\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 &#8212; \u0432\u0440\u0443\u0447\u043d\u0443\u044e;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 API &#8212; \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u0441 \u0436\u0435\u0441\u0442\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0439 \u043a\u043e\u0434 &#8212; \u0447\u0435\u0440\u0435\u0437 Codex;<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u0441\u0442\u044b, README \u0438 demo &#8212; \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Codex;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u043e\u0440\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 &#8212; \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0434\u0435\u043b\u0438 Telegram Bot API &#8212; \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e, \u0431\u0435\u0437 \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u043a \u00ab\u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c\u0443\u00bb \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0431\u044b\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439:<\/p>\n<blockquote>\n<p>\u0418\u0418 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u044c, \u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u043c\u0443 \u043f\u0440\u0430\u0432\u043e \u0440\u0435\u0448\u0430\u0442\u044c, \u043a\u0430\u043a \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0432\u043d\u0435\u0448\u043d\u0438\u0439 API.<\/p>\n<\/blockquote>\n<h3>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c<\/h3>\n<p><code>telegalib<\/code> &#8212; \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u0430\u044f Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Telegram-\u0431\u043e\u0442\u043e\u0432.<\/p>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441\u043e\u0431\u0440\u0430\u043d \u043d\u0430 Java 21 \u0438 Gradle.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c\u044b\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b:<\/p>\n<pre><code>implementation(\"ru.tardyon.botframework:telegram-bot-framework-core:&lt;version&gt;\")implementation(\"ru.tardyon.botframework:telegram-bot-framework-spring-boot-starter:&lt;version&gt;\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439:<\/p>\n<ul>\n<li>\n<p><code>telegram-bot-framework-core<\/code> -\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 runtime \u0438 client API;<\/p>\n<\/li>\n<li>\n<p><code>telegram-bot-framework-spring-boot-starter<\/code> &#8212; \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u043e Spring Boot;<\/p>\n<\/li>\n<li>\n<p><code>telegram-bot-framework-testkit<\/code> &#8212; \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p><code>telegram-bot-framework-demo<\/code> &#8212; demo-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p><code>telegram-bot-framework-screen-demo<\/code> &#8212; demo \u0434\u043b\u044f screen API;<\/p>\n<\/li>\n<li>\n<p><code>telegram-bot-framework-botapi-generator<\/code> &#8212; tooling \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0430\u0441\u0442\u0435\u0439 Bot API.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439:<\/p>\n<ul>\n<li>\n<p><code>TelegramApiClient<\/code> \u0434\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Telegram Bot API;<\/p>\n<\/li>\n<li>\n<p>runtime \u0434\u043b\u044f long polling \u0438 webhook;<\/p>\n<\/li>\n<li>\n<p><code>Router<\/code>, filters \u0438 middleware;<\/p>\n<\/li>\n<li>\n<p>FSM \u0441 <code>StateStorage<\/code>;<\/p>\n<\/li>\n<li>\n<p>screen API \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>Spring Boot starter \u0441 auto-configuration;<\/p>\n<\/li>\n<li>\n<p>testkit \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<h3>Vanilla Java: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u043e\u0442 \u0431\u0435\u0437 Spring<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d Spring Boot, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>core<\/code>.<\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435:<\/p>\n<pre><code>repositories {    mavenCentral()}dependencies {    implementation(\"ru.tardyon.botframework:telegram-bot-framework-core:&lt;version&gt;\")}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 long polling:<\/p>\n<pre><code>import ru.tardyon.botframework.telegram.api.DefaultTelegramApiClient;import ru.tardyon.botframework.telegram.api.TelegramApiClient;import ru.tardyon.botframework.telegram.bot.DefaultTelegramBot;import ru.tardyon.botframework.telegram.bot.TelegramBot;import ru.tardyon.botframework.telegram.dispatcher.DefaultDispatcher;import ru.tardyon.botframework.telegram.dispatcher.Router;import ru.tardyon.botframework.telegram.dispatcher.filter.Filters;import ru.tardyon.botframework.telegram.polling.LongPollingOptions;import ru.tardyon.botframework.telegram.polling.LongPollingRunner;public class VanillaBotMain {    public static void main(String[] args) {        TelegramApiClient client = new DefaultTelegramApiClient(System.getenv(\"BOT_TOKEN\"));        Router router = new Router();        router.message(Filters.command(\"start\"),                (ctx, msg) -&gt; ctx.telegramMessage().reply(\"\u041f\u0440\u0438\u0432\u0435\u0442\"));        router.message(Filters.textEquals(\"ping\"),                (ctx, msg) -&gt; ctx.telegramMessage().reply(\"pong\"));        router.callbackQuery(Filters.callbackDataStartsWith(\"menu:\"),                (ctx, cbq) -&gt; ctx.telegramCallbackQuery().answer(\"OK\"));        LongPollingRunner pollingRunner = new LongPollingRunner(                client,                LongPollingOptions.defaults()        );        TelegramBot bot = new DefaultTelegramBot(                pollingRunner,                new DefaultDispatcher(router)        );        bot.startPolling();    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><code>TelegramApiClient<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>Router<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>DefaultDispatcher<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>LongPollingRunner<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>TelegramBot<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>\u041d\u043e \u0432 T2M Bridge \u043c\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 Spring Boot, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0442\u043e\u0436\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 Spring-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<h3>Spring Boot starter<\/h3>\n<p>\u0414\u043b\u044f Spring Boot \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 starter:<\/p>\n<pre><code>repositories {    mavenCentral()}dependencies {    implementation(\"ru.tardyon.botframework:telegram-bot-framework-spring-boot-starter:&lt;version&gt;\")}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f polling:<\/p>\n<pre><code>telegram:  bot:    token: ${BOT_TOKEN}    mode: polling    transport:      mode: cloud    polling:      enabled: true      timeout: 30      limit: 100<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438:<\/p>\n<pre><code>import ru.tardyon.botframework.telegram.bot.TelegramCallbackQuery;import ru.tardyon.botframework.telegram.bot.TelegramMessage;import ru.tardyon.botframework.telegram.spring.boot.annotation.BotController;import ru.tardyon.botframework.telegram.spring.boot.annotation.OnCallbackQuery;import ru.tardyon.botframework.telegram.spring.boot.annotation.OnMessage;@BotControllerpublic class MyBotController {    @OnMessage(command = \"start\")    public void onStart(TelegramMessage message) {        message.reply(\"\u041f\u0440\u0438\u0432\u0435\u0442\");    }    @OnMessage(textEquals = \"ping\")    public void onPing(TelegramMessage message) {        message.reply(\"pong\");    }    @OnCallbackQuery(callbackPrefix = \"menu:\")    public void onMenu(TelegramCallbackQuery callback) {        callback.answer(\"OK\");    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Starter \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 runtime-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><code>TelegramApiClient<\/code>;<\/p>\n<\/li>\n<li>\n<p>transport profile;<\/p>\n<\/li>\n<li>\n<p><code>LongPollingOptions<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>LongPollingRunner<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>Router<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>Dispatcher<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>TelegramBot<\/code>;<\/p>\n<\/li>\n<li>\n<p>lifecycle;<\/p>\n<\/li>\n<li>\n<p>webhook processor;<\/p>\n<\/li>\n<li>\n<p>webhook controller;<\/p>\n<\/li>\n<li>\n<p><code>StateStorage<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ScreenStateStorage<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ScreenRegistry<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ScreenEngine<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ScreenMiddleware<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f T2M Bridge: \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c runtime \u0440\u0443\u043a\u0430\u043c\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435, \u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0431\u043e\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438.<\/p>\n<h3>Webhook mode<\/h3>\n<p>\u0414\u043b\u044f production \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 webhook, \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 URL, TLS \u0438 reverse proxy.<\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f:<\/p>\n<pre><code>telegram:  bot:    token: ${BOT_TOKEN}    mode: webhook    polling:      enabled: false    webhook:      enabled: true      path: \/telegram\/webhook      public-url: ${BOT_WEBHOOK_PUBLIC_URL}      secret-token: ${BOT_WEBHOOK_SECRET_TOKEN:}      drop-pending-updates: true<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d <code>webhook.public-url<\/code>, starter \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>setWebhook<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 long polling \u043f\u0440\u043e\u0449\u0435: \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 endpoint, \u0434\u0443\u043c\u0430\u0442\u044c \u043f\u0440\u043e TLS \u0438 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u043d\u0430\u0440\u0443\u0436\u0443.<\/p>\n<p>\u0412 T2M Bridge \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u043c: \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c polling, \u0430 \u0432 production \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c webhook.<\/p>\n<h3>Proxy<\/h3>\n<p>\u0412 starter \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 HTTP \u0438 SOCKS5 proxy:<\/p>\n<pre><code>telegram:  bot:    proxy:      enabled: true      type: socks5      host: 127.0.0.1      port: 1080      username: ${PROXY_USER:}      password: ${PROXY_PASSWORD:}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f Telegram-\u0431\u043e\u0442\u043e\u0432 \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0430\u044f \u0432\u0435\u0449\u044c.<\/p>\n<p>\u0412 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u043b\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u044f\u0432\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u043c \u043a Telegram API.<\/p>\n<p>\u042f \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u0432 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u043a\u043e\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 proxy-\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<h3>Router \u0438 filters<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0447\u0435\u0440\u0435\u0437 <code>Router<\/code>.<\/p>\n<p><code>Router<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b update-\u0441\u043e\u0431\u044b\u0442\u0438\u0439:<\/p>\n<ul>\n<li>\n<p><code>message<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>callbackQuery<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>inlineQuery<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>chosenInlineResult<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>myChatMember<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>chatMember<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>shippingQuery<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>preCheckoutQuery<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>businessConnection<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>businessMessage<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>editedBusinessMessage<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>deletedBusinessMessages<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>Router router = new Router();router.message(Filters.command(\"start\"),        (ctx, msg) -&gt; ctx.telegramMessage().reply(\"\u041f\u0440\u0438\u0432\u0435\u0442\"));router.message(Filters.textEquals(\"ping\"),        (ctx, msg) -&gt; ctx.telegramMessage().reply(\"pong\"));router.callbackQuery(Filters.callbackDataStartsWith(\"menu:\"),        (ctx, cbq) -&gt; ctx.telegramCallbackQuery().answer(\"OK\"));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 <code>Filters<\/code> \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><code>command(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>commands(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>textPresent()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>textEquals(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>textStartsWith(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>privateChat()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>groupChat()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>supergroupChat()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>channelChat()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>fromUser(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>fromChat(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>callbackDataEquals(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>callbackDataStartsWith(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>invoicePayloadEquals(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>preCheckoutPayloadEquals(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>stateEquals(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>inStates(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>noState()<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432.<\/p>\n<p>\u0412 T2M Bridge \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>\/start<\/code>;<\/p>\n<\/li>\n<li>\n<p>callback\u2019\u0438 \u044d\u043a\u0440\u0430\u043d\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0432\u043e\u0434 \u043a\u043e\u0434\u0430 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0431\u043e\u0440 \u043a\u0430\u043d\u0430\u043b\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>UpdateContext<\/h3>\n<p>\u0412 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f <code>UpdateContext<\/code>.<\/p>\n<p>\u041e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442:<\/p>\n<ul>\n<li>\n<p>\u0442\u0435\u043a\u0443\u0449\u0438\u0439 update;<\/p>\n<\/li>\n<li>\n<p><code>TelegramApiClient<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>StateStorage<\/code>;<\/p>\n<\/li>\n<li>\n<p>bot id;<\/p>\n<\/li>\n<li>\n<p>runtime attributes.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u043e\u0431\u0451\u0440\u0442\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><code>ctx.telegramMessage()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ctx.telegramCallbackQuery()<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>router.message(Filters.command(\"start\"), (ctx, msg) -&gt; {    ctx.telegramMessage().reply(\"\u041f\u0440\u0438\u0432\u0435\u0442\");});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043b\u0438 callback:<\/p>\n<pre><code>router.callbackQuery(Filters.callbackDataStartsWith(\"menu:\"), (ctx, cbq) -&gt; {    ctx.telegramCallbackQuery().answer(\"OK\");});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0435\u043b, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0435 \u0441 \u0433\u043e\u043b\u044b\u043c JSON update, \u0430 \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0431\u043e\u0442 \u0440\u0430\u0441\u0442\u0451\u0442, \u043f\u0440\u044f\u043c\u043e\u0435 \u043a\u043e\u0432\u044b\u0440\u044f\u043d\u0438\u0435 update\u2019\u043e\u0432 \u0431\u044b\u0441\u0442\u0440\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u0448\u0443\u043c\u043d\u044b\u043c.<\/p>\n<h3>Middleware<\/h3>\n<p><code>DefaultDispatcher<\/code> \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 middleware.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>import java.util.List;import ru.tardyon.botframework.telegram.dispatcher.DefaultDispatcher;import ru.tardyon.botframework.telegram.dispatcher.middleware.ErrorBoundaryUpdateMiddleware;import ru.tardyon.botframework.telegram.dispatcher.middleware.LoggingUpdateMiddleware;DefaultDispatcher dispatcher = new DefaultDispatcher(        router,        List.of(                new ErrorBoundaryUpdateMiddleware(),                new LoggingUpdateMiddleware()        ));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u0441\u0432\u043e\u044f \u043b\u043e\u0433\u0438\u043a\u0430, \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>UpdateMiddleware<\/code>.<\/p>\n<p>\u0414\u043b\u044f T2M Bridge middleware \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0434\u043b\u044f \u0441\u043a\u0432\u043e\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447:<\/p>\n<ul>\n<li>\n<p>\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 update\u2019\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u044f;<\/p>\n<\/li>\n<li>\n<p>enrichment \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u0440\u0438\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u0440\u0430\u0437\u043c\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443.<\/p>\n<h3>FSM: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/h3>\n<p>\u0421\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439 Telegram \u0438 MAX &#8212; \u044d\u0442\u043e \u043d\u0435 \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442:<\/p>\n<ol>\n<li>\n<p>\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044c;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0436\u0430\u0442\u044c \u00ab\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043e\u0434;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u043e\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0432\u043e\u0434 \u043a\u043e\u0434\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.<\/p>\n<p>\u0412 <code>telegalib<\/code> FSM \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433:<\/p>\n<ul>\n<li>\n<p><code>State<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>StateKey<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>StateStorage<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>InMemoryStateStorage<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>import ru.tardyon.botframework.telegram.dispatcher.Router;import ru.tardyon.botframework.telegram.dispatcher.filter.Filters;import ru.tardyon.botframework.telegram.fsm.State;Router router = new Router();router.message(Filters.command(\"startform\"), (ctx, msg) -&gt; {    ctx.state().setState(State.of(\"form.awaiting_name\"));    ctx.telegramMessage().reply(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f\");});router.message(Filters.stateEquals(\"form.awaiting_name\"), (ctx, msg) -&gt; {    ctx.state().putData(\"name\", msg.text());    ctx.state().setState(State.of(\"form.awaiting_language\"));    ctx.telegramMessage().reply(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u044f\u0437\u044b\u043a\");});router.message(Filters.stateEquals(\"form.awaiting_language\"), (ctx, msg) -&gt; {    Object name = ctx.state().getData(\"name\").orElse(\"unknown\");    ctx.state().clear();    ctx.telegramMessage().reply(\"\u0418\u043c\u044f: \" + name + \", \u044f\u0437\u044b\u043a: \" + msg.text());});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c in-memory storage.<\/p>\n<p>\u0414\u043b\u044f production-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043b\u0443\u0447\u0448\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c storage, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u043b\u043e \u0440\u0435\u0441\u0442\u0430\u0440\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412 Spring Boot \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c Redis:<\/p>\n<pre><code>telegram:  bot:    state:      storage: redis      redis:        key-prefix: telegram:fsm        ttl-seconds: 86400spring:  data:    redis:      host: localhost      port: 6379<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>Screen API: \u0431\u043e\u0442 \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u044d\u043a\u0440\u0430\u043d\u043e\u0432<\/h3>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0436\u043d\u044b\u0445 \u0441\u043b\u043e\u0451\u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 &#8212; screen API.<\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>\/start\/link\/channels\/settings<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u043a\u0440\u0430\u043d \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u043e\u0444\u0438\u043b\u044c;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0438 \u043a\u0430\u043d\u0430\u043b\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0437\u0430\u0434.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 <code>telegalib<\/code> screen API \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442:<\/p>\n<ul>\n<li>\n<p><code>ScreenEngine<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ScreenRegistry<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>Screen<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ScreenView<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ScreenAction<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ScreenNavigator<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ScreenStateStorage<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>ScreenMiddleware<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f Spring Boot \u0435\u0441\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><code>@ScreenController<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>@Screen<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>@OnScreenMessage<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>@OnScreenCallback<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u044d\u043a\u0440\u0430\u043d\u0430:<\/p>\n<pre><code>import ru.tardyon.botframework.telegram.api.model.markup.Keyboards;import ru.tardyon.botframework.telegram.screen.ScreenAction;import ru.tardyon.botframework.telegram.screen.ScreenContext;import ru.tardyon.botframework.telegram.screen.ScreenView;import ru.tardyon.botframework.telegram.spring.boot.annotation.OnScreenCallback;import ru.tardyon.botframework.telegram.spring.boot.annotation.Screen;import ru.tardyon.botframework.telegram.spring.boot.annotation.ScreenController;@ScreenControllerpublic class SettingsScreenController {    private static final String SETTINGS = \"settings\";    private static final String TOGGLE = \"screen:settings:toggle\";    @Screen(id = SETTINGS, main = true)    public ScreenView settings(ScreenContext context) {        boolean enabled = context.screenState()                .getData(\"notifications\")                .map(Boolean.class::cast)                .orElse(false);        return ScreenView.builder()                .line(\"\u042d\u043a\u0440\u0430\u043d \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\")                .line(\"notifications=\" + enabled)                .replyMarkup(                        Keyboards.inlineKeyboard()                                .row(Keyboards.callbackButton(\"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\", TOGGLE))                                .build()                )                .build();    }    @OnScreenCallback(screen = SETTINGS, callbackEquals = TOGGLE)    public ScreenAction toggle(ScreenContext context) {        boolean enabled = context.screenState()                .getData(\"notifications\")                .map(Boolean.class::cast)                .orElse(false);        context.screenState().putData(\"notifications\", !enabled);        return ScreenAction.render();    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>ScreenAction<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><code>handled()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>render()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>push(screenId)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>push(screenId, targetData)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>replace(screenId)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>replace(screenId, targetData)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>back()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>clear()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>unhandled()<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f T2M Bridge \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0451\u0432.<\/p>\n<p>\u041c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434, \u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043e\u0442\u0430:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043d\u0430\u043b\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u043a\u0430\u043d\u0430\u043b\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0431\u043e\u0440 \u043a\u0430\u043d\u0430\u043b\u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0435\u0440\u0435\u0437 screen API \u0442\u0430\u043a\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u043b\u0438\u0436\u0435 \u043a \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 UI-flow, \u0430 \u043d\u0435 \u043a \u043d\u0430\u0431\u043e\u0440\u0443 \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u044b\u0445 callback\u2019\u043e\u0432.<\/p>\n<h3>Widgets<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0438\u0437 \u044d\u043a\u0440\u0430\u043d\u043e\u0432, \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0447\u0430\u0441\u0442\u0438.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li>\n<p>\u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0431\u043b\u043e\u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0449\u0438\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0435\u0441\u0442\u044c widgets.<\/p>\n<p>\u0412 Spring Boot \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><code>@WidgetController<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>@Widget<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>@OnWidgetAction<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>import java.util.List;import ru.tardyon.botframework.telegram.screen.ScreenAction;import ru.tardyon.botframework.telegram.spring.boot.widget.OnWidgetAction;import ru.tardyon.botframework.telegram.spring.boot.widget.Widget;import ru.tardyon.botframework.telegram.spring.boot.widget.WidgetButtons;import ru.tardyon.botframework.telegram.spring.boot.widget.WidgetController;import ru.tardyon.botframework.telegram.spring.boot.widget.WidgetView;@WidgetControllerpublic class MenuWidgetController {    record MenuItem(String label, String target) {    }    @Widget(id = \"home_menu\")    public WidgetView homeMenu(List&lt;MenuItem&gt; items) {        return WidgetView.builder()                .line(\"\u041c\u0435\u043d\u044e\")                .replyMarkup(                        WidgetButtons.objectList(                                \"home_menu\",                                \"open\",                                items,                                MenuItem::label,                                MenuItem::target                        )                )                .build();    }    @OnWidgetAction(widget = \"home_menu\", action = \"open\")    public ScreenAction open(String payload) {        return ScreenAction.push(payload);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0431\u043e\u0442\u0430.<\/p>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u0431\u043e\u0442 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0435\u0439, widgets \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043d\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438.<\/p>\n<h3>Screen state storage<\/h3>\n<p>\u0423 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e FSM \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 &#8212; \u043d\u0435 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435.<\/p>\n<p>FSM \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0432\u043e\u0434\u0438\u0442 \u043a\u043e\u0434 \u0438\u043b\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>Screen state \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 UI: \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430, \u0434\u0430\u043d\u043d\u044b\u0435 \u044d\u043a\u0440\u0430\u043d\u0430, targetData, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e starter \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 in-memory storage:<\/p>\n<pre><code>telegram:  bot:    screen-state:      storage: memory<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c Redis:<\/p>\n<pre><code>telegram:  bot:    screen-state:      storage: redis      redis:        key-prefix: telegram:screen        ttl-seconds: 86400<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u043e \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0447\u0442\u043e \u0438 Redis \u0434\u043b\u044f FSM: \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<\/p>\n<h3>\u041f\u0440\u044f\u043c\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 Telegram Bot API<\/h3>\n<p>\u0415\u0441\u043b\u0438 routing-\u0441\u043b\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>TelegramApiClient<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>import ru.tardyon.botframework.telegram.api.DefaultTelegramApiClient;import ru.tardyon.botframework.telegram.api.TelegramApiClient;import ru.tardyon.botframework.telegram.api.method.SendMessageRequest;public class DirectApiExample {    public static void main(String[] args) {        TelegramApiClient client = new DefaultTelegramApiClient(System.getenv(\"BOT_TOKEN\"));        client.sendMessage(new SendMessageRequest(                123456789L,                \"\u041f\u0440\u0438\u0432\u0435\u0442\",                null        ));    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0440\u0430\u0437\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b Telegram Bot API:<\/p>\n<ul>\n<li>\n<p>\u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>callback \u0438 inline API;<\/p>\n<\/li>\n<li>\n<p>invoices;<\/p>\n<\/li>\n<li>\n<p>shipping\/pre-checkout;<\/p>\n<\/li>\n<li>\n<p>web app query;<\/p>\n<\/li>\n<li>\n<p>media group;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>chat\/admin\/member operations;<\/p>\n<\/li>\n<li>\n<p>forum topics;<\/p>\n<\/li>\n<li>\n<p>gifts;<\/p>\n<\/li>\n<li>\n<p>Stars;<\/p>\n<\/li>\n<li>\n<p>paid media;<\/p>\n<\/li>\n<li>\n<p>business connection;<\/p>\n<\/li>\n<li>\n<p>stories;<\/p>\n<\/li>\n<li>\n<p>checklist.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 T2M Bridge \u043f\u0440\u044f\u043c\u043e\u0439 client API \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e update\u2019\u0430: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043c\u0435\u0434\u0438\u0430 \u043f\u0440\u0438 \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433\u0435.<\/p>\n<h3>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432<\/h3>\n<p>\u0414\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 <code>InputFile<\/code>, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><code>InputFile.fileId(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>InputFile.url(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>InputFile.path(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>InputFile.bytes(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/InputFile.stream\" rel=\"noopener noreferrer nofollow\"><code>InputFile.stream<\/code><\/a><code>(...)<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433\u0430.<\/p>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0444\u0430\u0439\u043b \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 Telegram \u043a\u0430\u043a <code>file_id<\/code>.<\/p>\n<p>\u0412 \u0434\u0440\u0443\u0433\u043e\u043c &#8212; \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a stream \u0438\u043b\u0438 bytes.<\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u044d\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e. \u0414\u043b\u044f \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u043f\u043e\u0441\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043c\u0435\u0434\u0438\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439.<\/p>\n<h3>Testkit \u0438 demo-\u043c\u043e\u0434\u0443\u043b\u0438<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043d\u043e \u0438 \u0437\u0430 routing, FSM, screens \u0438 middleware, \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0436\u0435 \u043c\u0430\u043b\u043e.<\/p>\n<p>\u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0435\u0441\u0442\u044c <code>telegram-bot-framework-testkit<\/code>.<\/p>\n<p>\u041e\u043d \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0431\u0435\u0437 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e Telegram API.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c demo-\u043c\u043e\u0434\u0443\u043b\u0438:<\/p>\n<ul>\n<li>\n<p><code>telegram-bot-framework-demo<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>telegram-bot-framework-screen-demo<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; screen API, push\/back \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e, screen state, widgets \u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 targetData.<\/p>\n<p>\u0414\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>README \u0438 unit-\u0442\u0435\u0441\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0435\u043b\u0451\u043d\u044b\u043c\u0438, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e demo \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a API \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<h3>\u0427\u0435\u043c telegalib \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 maxlib \u043f\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h3>\n<p><code>maxlib<\/code> \u044f \u043f\u0438\u0441\u0430\u043b \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u00ab\u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043e\u0441\u043d\u043e\u0432\u0443 \u0434\u043b\u044f MAX\u00bb.<\/p>\n<p>\u0422\u0430\u043c Codex \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0430 \u044f \u043f\u043e\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u0432\u044b\u0447\u0438\u0449\u0430\u043b \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u0438: \u0432\u044b\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043b\u0438\u0448\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0421 <code>telegalib<\/code> \u043f\u043e\u0434\u0445\u043e\u0434 \u0431\u044b\u043b \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044f \u0443\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043b, \u043a\u0430\u043a\u0438\u0435 runtime-\u0447\u0430\u0441\u0442\u0438 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>client;<\/p>\n<\/li>\n<li>\n<p>dispatcher;<\/p>\n<\/li>\n<li>\n<p>router;<\/p>\n<\/li>\n<li>\n<p>filters;<\/p>\n<\/li>\n<li>\n<p>middleware;<\/p>\n<\/li>\n<li>\n<p>FSM;<\/p>\n<\/li>\n<li>\n<p>screens;<\/p>\n<\/li>\n<li>\n<p>Spring Boot starter;<\/p>\n<\/li>\n<li>\n<p>testkit.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u044f \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u043b \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043b\u044f Codex.<\/p>\n<p>\u041d\u0435:<\/p>\n<blockquote>\n<p>\u0421\u0434\u0435\u043b\u0430\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f Telegram Bot API.<\/p>\n<\/blockquote>\n<p>\u0410 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e:<\/p>\n<blockquote>\n<p>\u0421\u0434\u0435\u043b\u0430\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e update-\u0441\u043e\u0431\u044b\u0442\u0438\u044f.<\/p>\n<\/blockquote>\n<p>\u0418\u043b\u0438:<\/p>\n<blockquote>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u044c Spring Boot auto-configuration \u0434\u043b\u044f \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u0418\u043b\u0438:<\/p>\n<blockquote>\n<p>\u041d\u0430\u043f\u0438\u0448\u0438 README \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043a\u043e\u0434\u0443.<\/p>\n<\/blockquote>\n<p>\u0418\u043b\u0438:<\/p>\n<blockquote>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e routing-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f.<\/p>\n<\/blockquote>\n<p>\u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u0432 Telegram-\u0447\u0430\u0441\u0442\u0438 \u044f \u0443\u0436\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u043b \u00ab\u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c\u0443\u00bb \u043a\u043e\u0434\u0443.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043e\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 Bot API.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0442\u0430\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 50\/50:<\/p>\n<ul>\n<li>\n<p>\u044f \u0437\u0430\u0434\u0430\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443;<\/p>\n<\/li>\n<li>\n<p>Codex \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e API \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p>Codex \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u0430 \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0413\u0434\u0435 \u0418\u0418 \u043f\u043e\u043c\u043e\u0433<\/h3>\n<p>Codex \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438, \u0433\u0434\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443\u0436\u0435 \u0437\u0430\u0434\u0430\u043d.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li>\n<p>\u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 &#8212; \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e;<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u0442\u044c runtime-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b &#8212; \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c auto-configuration;<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u0442\u044c handler &#8212; \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0439 handler;<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 &#8212; \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 cases;<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u0442\u044c \u043a\u043e\u0434 &#8212; \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c README;<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u0442\u044c screen API &#8212; \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c demo-\u044d\u043a\u0440\u0430\u043d.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u044b\u043b \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c.<\/p>\n<p>\u0418\u0418 \u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0435\u043d\u044f, \u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u043b \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<h3>\u0413\u0434\u0435 \u0418\u0418 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u0435\u0448\u0430\u043b<\/h3>\n<p>\u0414\u0430\u0436\u0435 \u0441 Telegram API, \u0433\u0434\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0418\u0418 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0434\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u0430\u043c.<\/p>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u00ab\u0442\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u044b\u0432\u0430\u0435\u0442\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438, \u0430 \u043d\u0435 \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0443\u0442\u0430\u0435\u0442 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 update-\u0442\u0438\u043f\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u0443\u044e \u0438 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u0438 API;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0438\u0448\u0435\u0442 \u0442\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 happy path, \u043d\u043e \u043d\u0435 \u043b\u043e\u0432\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0443\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e \u0442\u0430\u043c, \u0433\u0434\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u0435\u043c \u0436\u0435:<\/p>\n<blockquote>\n<p>\u0414\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e API \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0432\u0430\u0436\u043d\u0435\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<\/blockquote>\n<p>\u041d\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 <code>maxlib<\/code> \u044f \u0443\u0436\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0430\u0437\u0433\u0440\u0435\u0431\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u0430\u043b Codex \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<h3>\u041a\u0430\u043a telegalib \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 T2M Bridge<\/h3>\n<p>\u0412 T2M Bridge <code>telegalib<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 Telegram-\u0447\u0430\u0441\u0442\u044c.<\/p>\n<p>\u0421 \u0435\u0451 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u043e\u0442:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 update\u2019\u044b \u0438\u0437 Telegram;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 callback\u2019\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u044d\u043a\u0440\u0430\u043d\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043c\u0435\u0434\u0438\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 Telegram-\u043a\u0430\u043d\u0430\u043b\u0430 \u0441 MAX-\u043a\u0430\u043d\u0430\u043b\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 Telegram-\u0431\u043e\u0442\u0430, \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u0442\u0430 \u0432 \u043a\u0430\u043d\u0430\u043b \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0430\u0440\u0443 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 Telegram screens \u0438 callback handlers.<\/p>\n<p>\u041d\u043e \u0441\u0430\u043c \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433 \u044f \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e.<\/p>\n<p>\u042d\u0442\u043e \u0442\u0435\u043c\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0446\u0438\u043a\u043b\u0430.<\/p>\n<p>\u0422\u0430\u043c \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u043a\u0430\u043a \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 replies;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0434\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u0447\u043d\u043e<\/h3>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 &#8212; \u0435\u0434\u0438\u043d\u044b\u0439 runtime-\u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<p>Telegram-\u0447\u0430\u0441\u0442\u044c \u0438 MAX-\u0447\u0430\u0441\u0442\u044c T2M Bridge \u0441\u0442\u0430\u043b\u0438 \u0431\u043b\u0438\u0436\u0435 \u043f\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u042d\u0442\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443: \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u0432\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0435 &#8212; Spring Boot starter.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438 \u044d\u043a\u0440\u0430\u043d\u044b, \u0430 \u043d\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c client, dispatcher, polling runner \u0438 storage.<\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u0435 &#8212; screen API.<\/p>\n<p>\u0414\u043b\u044f \u0431\u043e\u0442\u0430 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0435\u0439 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f. \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f developer-first \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043d\u043e \u0434\u043b\u044f \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 \u044d\u043a\u0440\u0430\u043d\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435.<\/p>\n<p>\u0427\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u0435 &#8212; testkit \u0438 demo.<\/p>\n<p>\u041e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043d\u043e \u0438 \u0442\u043e, \u043a\u0430\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>\u041f\u044f\u0442\u043e\u0435 &#8212; \u0431\u043e\u043b\u0435\u0435 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 Codex.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 <code>maxlib<\/code> \u044f \u0441\u0442\u0430\u043b \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0418\u0418 \u00ab\u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451\u00bb \u0438 \u0447\u0430\u0449\u0435 \u0434\u0430\u0432\u0430\u0442\u044c \u0435\u043c\u0443 \u0443\u0437\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438.<\/p>\n<h3>\u0427\u0442\u043e \u044f \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u043b \u0438\u043d\u0430\u0447\u0435<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b <code>telegalib<\/code> \u0437\u0430\u043d\u043e\u0432\u043e, \u044f \u0431\u044b \u0435\u0449\u0451 \u0440\u0430\u043d\u044c\u0448\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0442\u0440\u0435\u043c\u044f \u0441\u043b\u043e\u044f\u043c\u0438:<\/p>\n<ol>\n<li>\n<p>Bot API models and methods.<\/p>\n<\/li>\n<li>\n<p>Runtime: dispatcher, router, middleware, FSM.<\/p>\n<\/li>\n<li>\n<p>UI layer: screens, widgets, navigation.<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044d\u0442\u0438 \u0441\u043b\u043e\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e\u0439.<\/p>\n<p>\u0415\u0449\u0451 \u044f \u0431\u044b \u0440\u0430\u043d\u044c\u0448\u0435 \u0443\u0441\u0438\u043b\u0438\u043b contract-\u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f Bot API \u043c\u043e\u0434\u0435\u043b\u0435\u0439.<\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0441\u043a\u0430\u0436\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 API. \u041e\u043d \u0441\u043a\u0430\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e Java-\u043a\u043e\u0434 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0435\u043d.<\/p>\n<p>\u0414\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 API \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e.<\/p>\n<p>\u041d\u0443\u0436\u043d\u044b \u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0449\u0438\u0449\u0430\u044e\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u043e \u0438 \u043e\u0442 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c.<\/p>\n<h3>\u0418\u0442\u043e\u0433\u0438<\/h3>\n<p><code>telegalib<\/code> \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 Java-\u043c\u0438\u0440\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c Telegram-\u0431\u043e\u0442\u043e\u0432.<\/p>\n<p>\u041e\u043d\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0434\u043b\u044f T2M Bridge \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u0435\u0434\u0438\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0434\u0432\u0443\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c: Telegram \u0438 MAX.<\/p>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0432\u0438\u0434\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u044f\u043c\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Telegram Bot API \u0447\u0435\u0440\u0435\u0437 <code>TelegramApiClient<\/code>;<\/p>\n<\/li>\n<li>\n<p>long polling \u0438 webhook;<\/p>\n<\/li>\n<li>\n<p>routing update-\u0441\u043e\u0431\u044b\u0442\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>filters;<\/p>\n<\/li>\n<li>\n<p>middleware;<\/p>\n<\/li>\n<li>\n<p>FSM;<\/p>\n<\/li>\n<li>\n<p>screen API;<\/p>\n<\/li>\n<li>\n<p>widgets;<\/p>\n<\/li>\n<li>\n<p>Spring Boot auto-configuration;<\/p>\n<\/li>\n<li>\n<p>Redis storage \u0434\u043b\u044f state \u0438 screen state;<\/p>\n<\/li>\n<li>\n<p>testkit \u0438 demo-\u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 &#8212; \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 <code>maxlib<\/code> \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u043a\u0430\u043a \u00ab\u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u043a\u0430\u0441 \u0438 \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u00bb, \u0442\u043e <code>telegalib<\/code> \u044f \u043f\u0438\u0441\u0430\u043b \u0443\u0436\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u0435\u0435: \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 50\/50 \u043c\u0435\u0436\u0434\u0443 \u043c\u043d\u043e\u0439 \u0438 Codex.<\/p>\n<p>\u0418\u0418 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043f\u043e\u043c\u043e\u0433\u0430\u043b \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b \u0432\u0440\u0435\u043c\u044f, \u043d\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 API \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 Telegram Bot API \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434 \u0440\u0443\u0447\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u044b\u0432\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u0434\u0432\u0443\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0442\u0430\u043a\u043e\u0439:<\/p>\n<blockquote>\n<p>Codex \u0445\u043e\u0440\u043e\u0448\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u043e \u0447\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u043a\u043e\u0434 \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 API, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<\/blockquote>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0443\u0436\u0435 \u043f\u0440\u043e \u0441\u0430\u043c T2M Bridge: \u043a\u0430\u043a \u044f \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043b Telegram- \u0438 MAX-\u043f\u0440\u043e\u0444\u0438\u043b\u0438, \u043a\u0430\u043a \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u043a\u0430\u043d\u0430\u043b\u044b, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043b \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0433\u0434\u0435 \u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u0438\u0434\u043d\u044b \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<\/p>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <code>telegalib<\/code>:<\/p>\n<p><a href=\"https:\/\/github.com\/tardyon-soft\/telegalib\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/tardyon-soft\/telegalib<\/a><\/p>\n<p>\u0416\u0438\u0432\u043e\u0439 MVP \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f T2M Bridge:<\/p>\n<p><a href=\"https:\/\/docs.t2m-bridge.ru\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.t2m-bridge.ru<\/a><\/p>\n<p>\u041d\u043e\u0432\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 roadmap:<\/p>\n<p><a href=\"https:\/\/t.me\/telega2max\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/telega2max<\/a><\/p>\n<\/div>\n<p>\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\/1049572\/\">https:\/\/habr.com\/ru\/articles\/1049572\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 T2M Bridge &#8212; \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433\u0430 \u043c\u0435\u0436\u0434\u0443 Telegram-\u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u0438 MAX-\u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438.\u0412 \u0446\u0438\u043a\u043b\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u0435 \u0447\u0430\u0441\u0442\u0438:T2M Bridge, \u0447\u0430\u0441\u0442\u044c 1: \u043a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f MAX Bot API \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e CodexT2M Bridge, \u0447\u0430\u0441\u0442\u044c 2: \u043a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f Telegram Bot API \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Codex &#8212; \u0443\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 50\/50T2M Bridge, \u0447\u0430\u0441\u0442\u044c 3: \u043a\u0430\u043a \u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438 \u0441\u043e\u0431\u0440\u0430\u043b \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433\u0430 \u043c\u0435\u0436\u0434\u0443 Telegram \u0438 MAXT2M Bridge, \u0447\u0430\u0441\u0442\u044c 4: \u043a\u0430\u043a \u044f \u0432\u044b\u043a\u0430\u0442\u044b\u0432\u0430\u043b \u0431\u043e\u0442\u0430 \u0432 \u043f\u0440\u043e\u0434 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 Docker Compose\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u043e maxlib &#8212; Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f MAX Bot API.\u0422\u0430\u043c Codex \u0441\u0434\u0435\u043b\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u0430\u0440\u043a\u0430\u0441\u0430. \u042d\u0442\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u043d\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435: \u0418\u0418 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u043b \u043f\u043e\u043b\u044f, \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 MAX Bot API. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443\u0448\u043b\u0430 \u043d\u0435 \u043d\u0430 Java \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u0443\u044e, \u0430 \u043d\u0430 \u0441\u0432\u0435\u0440\u043a\u0443 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c API.\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u044f \u043d\u0430\u0447\u0430\u043b \u0434\u0435\u043b\u0430\u0442\u044c Telegram-\u0447\u0430\u0441\u0442\u044c \u0434\u043b\u044f T2M Bridge \u0443\u0436\u0435 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435.\u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c telegalib &#8212; Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Telegram-\u0431\u043e\u0442\u043e\u0432.\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:https:\/\/github.com\/tardyon-soft\/telegalib\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0443, \u0437\u0430\u0447\u0435\u043c \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0430\u0441\u044c \u0441\u0432\u043e\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 Telegram Bot API, \u043a\u0430\u043a \u043e\u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0442 maxlib \u0438 \u043a\u0430\u043a \u0441 \u0435\u0451 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u043d\u0430 Java.\u0417\u0430\u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f Telegram\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 MAX, \u0434\u043b\u044f Telegram \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439:\u0417\u0430\u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443?\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0445\u0438\u0435.\u041c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c: Telegram \u0438 MAX. T2M Bridge \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430 \u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c:\u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044c Telegram \u0441 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u043c MAX;\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043d\u0430\u043b\u043e\u0432;\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0431\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c;\u0441\u0432\u044f\u0437\u0430\u0442\u044c Telegram-\u043a\u0430\u043d\u0430\u043b \u0438 MAX-\u043a\u0430\u043d\u0430\u043b;\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0440\u043e\u0441\u0441\u043f\u043e\u0441\u0442\u0438\u043d\u0433\u0430;\u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u043e\u0432 \u0432 \u043f\u043e\u0445\u043e\u0436\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.\u0415\u0441\u043b\u0438 \u0434\u043b\u044f MAX \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c runtime \u0441 routing, FSM, screens \u0438 middleware, \u0430 \u0434\u043b\u044f Telegram &#8212; \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0438\u043b\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u0431\u043e\u0442\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0437\u0430\u0442\u044c\u0441\u044f.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c telegalib \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a thin-wrapper \u043d\u0430\u0434 Telegram Bot API, \u0430 \u043a\u0430\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 \u043f\u043e\u0445\u043e\u0436\u0438\u043c\u0438 \u0438\u0434\u0435\u044f\u043c\u0438:typed client;long polling \u0438 webhook;dispatcher;router;filters;middleware;FSM;screen API;Spring Boot starter;testkit;demo-\u043c\u043e\u0434\u0443\u043b\u0438.\u0422\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435 \u00ab\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 Telegram-\u0431\u043e\u0442\u043e\u0432\u00bb, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 runtime \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0444\u043e\u0440\u043c\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.\u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 Codex \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f\u041f\u043e\u0441\u043b\u0435 maxlib \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e: \u0435\u0441\u043b\u0438 \u0434\u0430\u0442\u044c \u0418\u0418 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0448\u0438\u0440\u043e\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u043e\u043d \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.\u0421 Telegram \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.\u041f\u0440\u043e\u0449\u0435 &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Telegram Bot API \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d, \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0430 \u0447\u0430\u0441\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u0430\u0432\u043d\u043e \u0443\u0441\u0442\u043e\u044f\u043b\u0430\u0441\u044c.\u0421\u043b\u043e\u0436\u043d\u0435\u0435 &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0430\u043c API \u0431\u043e\u043b\u044c\u0448\u043e\u0439. \u0422\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u043e\u0432 update\u2019\u043e\u0432, \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043c\u0435\u0434\u0438\u0430, callback\u2019\u043e\u0432, \u043f\u043b\u0430\u0442\u0435\u0436\u0435\u0439, business-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u044f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Codex \u0438\u043d\u0430\u0447\u0435.\u0415\u0441\u043b\u0438 \u0434\u043b\u044f maxlib \u0444\u043e\u0440\u043c\u0430\u0442 \u0431\u044b\u043b \u0431\u043b\u0438\u0436\u0435 \u043a:\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439 \u043a\u0430\u0440\u043a\u0430\u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0430 \u044f \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043f\u0440\u0430\u0432\u043b\u044e.\u0422\u043e \u0434\u043b\u044f telegalib \u043f\u043e\u0434\u0445\u043e\u0434 \u0441\u0442\u0430\u043b \u0431\u043b\u0438\u0436\u0435 \u043a 50\/50:\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 &#8212; \u0432\u0440\u0443\u0447\u043d\u0443\u044e;\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 API &#8212; \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u0441 \u0436\u0435\u0441\u0442\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439;\u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0439 \u043a\u043e\u0434 &#8212; \u0447\u0435\u0440\u0435\u0437 Codex;\u0442\u0435\u0441\u0442\u044b, README \u0438 demo &#8212; \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Codex;\u0441\u043f\u043e\u0440\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 &#8212; \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438;\u043c\u043e\u0434\u0435\u043b\u0438 Telegram Bot API &#8212; \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e, \u0431\u0435\u0437 \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u043a \u00ab\u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c\u0443\u00bb \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443.\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0431\u044b\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439:\u0418\u0418 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u044c, \u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u043c\u0443 \u043f\u0440\u0430\u0432\u043e \u0440\u0435\u0448\u0430\u0442\u044c, \u043a\u0430\u043a \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0432\u043d\u0435\u0448\u043d\u0438\u0439 API.\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044ctelegalib &#8212; \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u0430\u044f Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Telegram-\u0431\u043e\u0442\u043e\u0432.\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441\u043e\u0431\u0440\u0430\u043d \u043d\u0430 Java 21 \u0438 Gradle.\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c\u044b\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b:implementation(&#171;ru.tardyon.botframework:telegram-bot-framework-core:&lt;version&gt;&#187;)implementation(&#171;ru.tardyon.botframework:telegram-bot-framework-spring-boot-starter:&lt;version&gt;&#187;)\u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439:telegram-bot-framework-core -\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 runtime \u0438 client API;telegram-bot-framework-spring-boot-starter &#8212; \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u043e Spring Boot;telegram-bot-framework-testkit &#8212; \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b;telegram-bot-framework-demo &#8212; demo-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435;telegram-bot-framework-screen-demo &#8212; demo \u0434\u043b\u044f screen API;telegram-bot-framework-botapi-generator &#8212; tooling \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0430\u0441\u0442\u0435\u0439 Bot API.\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439:TelegramApiClient \u0434\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Telegram Bot API;runtime \u0434\u043b\u044f long polling \u0438 webhook;Router, filters \u0438 middleware;FSM \u0441 StateStorage;screen API \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u043e\u0432;Spring Boot starter \u0441 auto-configuration;testkit \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432.Vanilla Java: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u043e\u0442 \u0431\u0435\u0437 Spring\u0415\u0441\u043b\u0438 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d Spring Boot, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e core.\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435:repositories {    mavenCentral()}dependencies {    implementation(&#171;ru.tardyon.botframework:telegram-bot-framework-core:&lt;version&gt;&#187;)}\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 long polling:import ru.tardyon.botframework.telegram.api.DefaultTelegramApiClient;import ru.tardyon.botframework.telegram.api.TelegramApiClient;import ru.tardyon.botframework.telegram.bot.DefaultTelegramBot;import ru.tardyon.botframework.telegram.bot.TelegramBot;import ru.tardyon.botframework.telegram.dispatcher.DefaultDispatcher;import ru.tardyon.botframework.telegram.dispatcher.Router;import ru.tardyon.botframework.telegram.dispatcher.filter.Filters;import ru.tardyon.botframework.telegram.polling.LongPollingOptions;import ru.tardyon.botframework.telegram.polling.LongPollingRunner;public class VanillaBotMain {    public static void main(String[] args) {        TelegramApiClient client = new DefaultTelegramApiClient(System.getenv(&#171;BOT_TOKEN&#187;));        Router router = new Router();        router.message(Filters.command(&#171;start&#187;),                (ctx, msg) -&gt; ctx.telegramMessage().reply(&#171;\u041f\u0440\u0438\u0432\u0435\u0442&#187;));        router.message(Filters.textEquals(&#171;ping&#187;),                (ctx, msg) -&gt; ctx.telegramMessage().reply(&#171;pong&#187;));        router.callbackQuery(Filters.callbackDataStartsWith(&#171;menu:&#187;),                (ctx, cbq) -&gt; ctx.telegramCallbackQuery().answer(&#171;OK&#187;));        LongPollingRunner pollingRunner = new LongPollingRunner(                client,                LongPollingOptions.defaults()        );        TelegramBot bot = new DefaultTelegramBot(                pollingRunner,                new DefaultDispatcher(router)        );        bot.startPolling();    }}\u0417\u0434\u0435\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:TelegramApiClient;Router;DefaultDispatcher;LongPollingRunner;TelegramBot.\u0414\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.\u041d\u043e \u0432 T2M Bridge \u043c\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 Spring Boot, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0442\u043e\u0436\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 Spring-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b.Spring Boot starter\u0414\u043b\u044f Spring Boot \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 starter:repositories {    mavenCentral()}dependencies {    implementation(&#171;ru.tardyon.botframework:telegram-bot-framework-spring-boot-starter:&lt;version&gt;&#187;)}\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f polling:telegram:  bot:    token: ${BOT_TOKEN}    mode: polling    transport:      mode: cloud    polling:      enabled: true      timeout: 30      limit: 100\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438:import ru.tardyon.botframework.telegram.bot.TelegramCallbackQuery;import ru.tardyon.botframework.telegram.bot.TelegramMessage;import ru.tardyon.botframework.telegram.spring.boot.annotation.BotController;import ru.tardyon.botframework.telegram.spring.boot.annotation.OnCallbackQuery;import ru.tardyon.botframework.telegram.spring.boot.annotation.OnMessage;@BotControllerpublic class MyBotController {    @OnMessage(command = &#171;start&#187;)    public void onStart(TelegramMessage message) {        message.reply(&#171;\u041f\u0440\u0438\u0432\u0435\u0442&#187;);    }    @OnMessage(textEquals = &#171;ping&#187;)    public void onPing(TelegramMessage message) {        message.reply(&#171;pong&#187;);    }    @OnCallbackQuery(callbackPrefix = &#171;menu:&#187;)    public void onMenu(TelegramCallbackQuery callback) {        callback.answer(&#171;OK&#187;);    }}Starter \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 runtime-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:TelegramApiClient;transport profile;LongPollingOptions;LongPollingRunner;Router;Dispatcher;TelegramBot;lifecycle;webhook processor;webhook controller;StateStorage;ScreenStateStorage;ScreenRegistry;ScreenEngine;ScreenMiddleware.\u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f T2M Bridge: \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c runtime \u0440\u0443\u043a\u0430\u043c\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435, \u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0431\u043e\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438.Webhook mode\u0414\u043b\u044f production \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 webhook, \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 URL, TLS \u0438 reverse proxy.\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f:telegram:  bot:    token: ${BOT_TOKEN}    mode: webhook    polling:      enabled: false    webhook:      enabled: true      path: \/telegram\/webhook      public-url: ${BOT_WEBHOOK_PUBLIC_URL}      secret-token: ${BOT_WEBHOOK_SECRET_TOKEN:}      drop-pending-updates: true\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d webhook.public-url, starter \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 setWebhook.\u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 long polling \u043f\u0440\u043e\u0449\u0435: \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 endpoint, \u0434\u0443\u043c\u0430\u0442\u044c \u043f\u0440\u043e TLS \u0438 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u043d\u0430\u0440\u0443\u0436\u0443.\u0412 T2M Bridge \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u043c: \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c polling, \u0430 \u0432 production \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c webhook.Proxy\u0412 starter \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 HTTP \u0438 SOCKS5 proxy:telegram:  bot:    proxy:      enabled: true      type: socks5      host: 127.0.0.1      port: 1080      username: ${PROXY_USER:}      password: ${PROXY_PASSWORD:}\u0414\u043b\u044f Telegram-\u0431\u043e\u0442\u043e\u0432 \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0430\u044f \u0432\u0435\u0449\u044c.\u0412 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u043b\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u044f\u0432\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u043c \u043a Telegram API.\u042f \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u0432 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u043a\u043e\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 proxy-\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.Router \u0438 filters\u0415\u0441\u043b\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Router.Router \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b update-\u0441\u043e\u0431\u044b\u0442\u0438\u0439:message;callbackQuery;inlineQuery;chosenInlineResult;myChatMember;chatMember;shippingQuery;preCheckoutQuery;businessConnection;businessMessage;editedBusinessMessage;deletedBusinessMessages.\u041f\u0440\u0438\u043c\u0435\u0440:Router router = new Router();router.message(Filters.command(&#171;start&#187;),&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-484278","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/484278","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=484278"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/484278\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=484278"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=484278"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=484278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}