{"id":414147,"date":"2024-06-29T23:35:00","date_gmt":"2024-06-29T23:35:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=414147"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=414147","title":{"rendered":"<span>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Telegram-\u0431\u043e\u0442\u0430 \u043d\u0430 JAVA \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f QR-\u043a\u043e\u0434\u043e\u0432<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/227\/e34\/b19\/227e34b1987a3c8d3841452df19870c9.png\" alt=\"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Telegram-\u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 QR-\u043a\u043e\u0434\u0430\u043c\u0438\" title=\"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Telegram-\u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 QR-\u043a\u043e\u0434\u0430\u043c\u0438\" width=\"907\" height=\"465\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/227\/e34\/b19\/227e34b1987a3c8d3841452df19870c9.png\"\/><figcaption>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Telegram-\u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 QR-\u043a\u043e\u0434\u0430\u043c\u0438<\/figcaption><\/figure>\n<h2>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Telegram-\u0431\u043e\u0442\u0430 \u043d\u0430 JAVA \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f QR-\u043a\u043e\u0434\u043e\u0432<\/h2>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0421 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 QR-\u043a\u043e\u0434\u044b \u0432\u0441\u0435\u0440\u044c\u0435\u0437, \u0438 \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u0430\u0434\u043e\u043b\u0433\u043e \u0432\u043e\u0448\u043b\u0438 \u0432 \u043d\u0430\u0448\u0443 \u0436\u0438\u0437\u043d\u044c. QR-\u043a\u043e\u0434 \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0432 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u043c \u043f\u043b\u0430\u043d\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041c\u0430\u0442\u044c-\u043f\u0440\u0430\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0438\u0446\u0430 (\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f DENSO) \u0432\u043d\u0435\u0434\u0440\u0438\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u043e\u0432 \u0441 \u0446\u0435\u043b\u044c\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u0434\u0435\u0440\u0436\u0435\u043a \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u0441 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u043b\u0430\u0441\u0442\u0435\u0439 \u043d\u0430 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0439, \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u00abQR-\u043a\u043e\u0434\u00bb \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b\u043e \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u043a\u0440\u0430\u0441, \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0432\u0437\u0434\u0440\u0430\u0433\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0435\u0433\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0438, \u043e\u0442 \u0447\u0435\u0433\u043e \u0434\u0430\u0436\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0433\u0440\u0443\u0441\u0442\u043d\u043e, \u0432\u0435\u0434\u044c \u043d\u0435 \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u044d\u0442\u0438 \u0447\u0435\u0440\u043d\u043e-\u0431\u0435\u043b\u044b\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b.<\/p>\n<p>\u041e QR-\u043a\u043e\u0434\u0430\u0445 \u044f \u043d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u0438\u0441\u0430\u043b \u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/587400\/\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 QR-\u043a\u043e\u0434\u043e\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0432 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0435 \u0438 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0446\u0435\u043d\u0442\u0440\u0430\u0445?<\/a>, \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439, \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u0438\u043a\u043e\u0432, \u0447\u0442\u043e \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043c\u043d\u0435 \u0432\u043e\u0439\u0442\u0438 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u043e\u0442\u043d\u044e \u0430\u0432\u0442\u043e\u0440\u043e\u0432. \u041d\u0435 \u0441\u043a\u0440\u043e\u044e, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u043c \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u043c, \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0432\u0441\u0435\u043c \u0442\u0435\u043c, \u043a\u0442\u043e \u043f\u043b\u044e\u0441\u043e\u0432\u0430\u043b \u0432 \u043a\u0430\u0440\u043c\u0443, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e \u043a\u0440\u0438\u0442\u0438\u043a\u043e\u0432\u0430\u043b \u0438 \u0434\u0438\u0441\u043a\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043e\u0442\u043c\u0435\u0442\u0438\u043b \u0434\u043b\u044f \u0441\u0435\u0431\u044f, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 QR-\u043a\u043e\u0434\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439, \u043b\u0438\u0431\u043e \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f QR-\u043a\u043e\u0434\u043e\u0432 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435, \u043b\u0438\u0431\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c QR-\u043a\u043e\u0434 \u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u0443 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434, \u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0422\u0430\u043a \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Telegram-\u0431\u043e\u0442\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c QR-\u043a\u043e\u0434\u044b. <\/p>\n<p>\u041f\u043b\u044e\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Telegram-\u0431\u043e\u0442\u0430 \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438-\u0441\u043a\u0430\u043d\u0435\u0440\u0430\u043c\u0438 \u044d\u0442\u043e: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u0444\u0442 (\u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0442\u0435\u043b\u0435\u0433\u0438, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e), \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u0433\u0430\u043b\u0435\u0440\u0435\u0438 \u0438\u043b\u0438 \u0441 web-\u0441\u0430\u0439\u0442\u0430) \u0438 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c. <\/p>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0438 \u043e \u043c\u0438\u043d\u0443\u0441\u0430\u0445, \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0435\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0447\u0440\u0435\u0432\u0430\u0442\u0430 \u0438\u0445 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0435\u0439, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0440\u0430\u0431\u043e\u0442\u0430 \u0431\u043e\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0442\u0438 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u0430 \u2013 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u0431\u043e\u0442\u0443 QR-\u043a\u043e\u0434, \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0448\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u0442\u0435\u043a\u0441\u0442 \u2013 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0448\u044c QR-\u043a\u043e\u0434. \u041f\u0440\u043e\u0441\u0442\u043e? \u0414\u0430! \u0423\u0434\u043e\u0431\u043d\u043e? \u041d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u043e!<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/619ea8d8abb378f6450d1aba\" data-style=\"\" id=\"619ea8d8abb378f6450d1aba\" width=\"\"><\/div>\n<h3>\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f<\/h3>\n<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043b\u043e\u0436\u0435\u043d, \u043d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u043b\u044e\u0434\u0435\u0439, \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u0441\u0432\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0438\u043c\u0435\u0435\u0442\u0441\u044f, \u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044e, \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e. <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e Telegram-\u0431\u043e\u0442\u0430, \u043b\u0438\u0431\u043e \u0432\u0430\u043c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438\/\u043f\u0440\u0438\u0435\u043c\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u043b\u0438 \u0436\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 QR-\u043a\u043e\u0434\u0430\u043c\u0438 \u0432 JAVA \u00ad\u2013 ZXING, \u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u0434\u043b\u044f \u0432\u0430\u0441.<\/p>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0431\u043e\u0442\u0430<\/h3>\n<p>\u041d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0431\u043e\u0442\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430, \u0438\u0431\u043e \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u043d\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u0442\u043e\u043c, \u043a\u0442\u043e \u0442\u0430\u043a\u043e\u0439 @BotFather \u0438 \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/post\/543676\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u0451, \u043e \u0447\u0451\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a Telegram-\u0431\u043e\u0442\u043e\u0432 <\/a>\u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0438\u043c\u044f \u0431\u043e\u0442\u0430 (\u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2013 @QRVisorBot) \u0438 \u0442\u043e\u043a\u0435\u043d, \u043f\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u043d\u0435 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e, \u0442.\u043a. \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043b\u0438\u0446\u0430, \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0442\u043e\u043a\u0435\u043d\u0443, \u0438\u043c\u0435\u044e\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u043e\u0442\u043e\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0442\u043e\u043a\u0435\u043d \u043f\u0440\u0438 \u0441\u0435\u0431\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0432\u0430\u0448\u0438\u043c \u0431\u043e\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0442\u0440\u0435\u0442\u044c\u0438 \u043b\u0438\u0446\u0430.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c JAVA-\u043f\u0440\u043e\u0435\u043a\u0442, \u043b\u0438\u0447\u043d\u043e \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 IDE JETBRAINS IDEA, \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 MAVEN, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0443 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430.<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u043e\u0442\u0430<\/h3>\n<p>\u0414\u0430\u0431\u044b \u043d\u0435 \u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0432\u044b\u043d\u043e\u0441\u0438\u043c \u0435\u0435 \u0432 \u0444\u0430\u0439\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (resources) \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u00abconfig.properties\u00bb, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u043c\u044f \u0438 \u0442\u043e\u043a\u0435\u043d \u0447\u0430\u0442-\u0431\u043e\u0442\u0430:<br \/>token = 0000000000:XXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br \/>username = QRVisor<br \/>, \u0433\u0434\u0435:<br \/>token \u2013 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430;<br \/>username \u2013 \u0438\u043c\u044f \u0431\u043e\u0442\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u044b\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435, \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043a\u043b\u0430\u0441\u0441 BotSettings (\u043a\u043e\u0434 \u043d\u0438\u0436\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 config.properties. \u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u043b\u0430\u0433\u0438\u043d LOMBOK, \u043e\u043d \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0438\u043f\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u044f \u043d\u0430 JAVA \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u043e\u0439\u0442\u0438 \u043c\u0438\u043c\u043e \u043d\u0435\u0433\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u0442\u0430\u043a, \u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c. \u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 BotSettings \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0421\u0418\u041d\u0413\u041b\u0422\u041e\u041d, \u0441\u043b\u0443\u0436\u0438\u0442 \u043e\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435. <\/p>\n<details class=\"spoiler\">\n<summary>BotSettings<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.dsci.qrvisor.bot;  import lombok.Data; import org.telegram.telegrambots.meta.TelegramBotsApi;  import java.io.IOException; import java.io.InputStream; import java.util.Properties;  @Data public class BotSettings {      public static final String FILE_NAME = \"config.properties\";     private static BotSettings instance;     private Properties properties;     private String token;     private String userName;     private TelegramBotsApi telegramBotsApi;      public static BotSettings getInstance() {         if (instance == null)             instance = new BotSettings();         return instance;     }      {         try {             properties = new Properties();             try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(FILE_NAME)) {                 properties.load(inputStream);             } catch (IOException e) {                 throw new IOException(String.format(\"Error loading properties file '%s'\", FILE_NAME));             }             token = properties.getProperty(\"token\");             if (token == null) {                 throw new RuntimeException(\"Token value is null\");             }             userName = properties.getProperty(\"username\");             if (userName == null) {\u0412\u0441\u0451, \u043e \u0447\u0451\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a TELEGRAM-\u0431\u043e\u0442\u043e\u0432                  throw new RuntimeException(\"UserName value is null\");             }         } catch (RuntimeException | IOException e) {             throw new RuntimeException(\"Bot initialization error: \" + e.getMessage());         }     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430<\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0431\u043e\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0430 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 BotProcessor (\u043a\u043e\u0434 \u043d\u0438\u0436\u0435). \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0431\u043e\u0442 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b, \u043f\u0430\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u0435\u043c\u0443 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u0414\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0431\u043e\u0442\u0430 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0442 TelegramLongPollingCommandBot. TelegramLongPollingCommandBot \u2013 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p><em>\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (TelegramLongPollingCommandBot):<\/em><\/p>\n<ul>\n<li>\n<p>getBotUsername \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0431\u043e\u0442;<\/p>\n<\/li>\n<li>\n<p>getBotToken \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>onRegister \u2013 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0431\u043e\u0442\u0430 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430-\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f);<\/p>\n<\/li>\n<li>\n<p>processNonCommandUpdate \u2013 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p>processInvalidCommandUpdate \u2013 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0431\u043e\u0442\u0443 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<\/li>\n<\/ul>\n<p><em>\u041c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/em><\/p>\n<ul>\n<li>\n<p>getMessageType \u2013 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u0442\u0438\u043f\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0431\u043e\u0442\u0430 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432 MessageType).<\/p>\n<\/li>\n<li>\n<p>sendMessage \u2013 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0447\u0430\u0442.<\/p>\n<\/li>\n<li>\n<p>sendImage \u2013 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0447\u0430\u0442.<\/p>\n<\/li>\n<li>\n<p>sendQRImage \u2013 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 QR-\u043a\u043e\u0434 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0447\u0430\u0442 (\u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 sendImage \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c).<\/p>\n<\/li>\n<li>\n<p>processImage \u2013 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. TELEGRAM API \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 getPhoto, \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e photoSizes, \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 (\u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d). \u0421\u0441\u044b\u043b\u043a\u0443 \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 getFileUrl (\u043e\u043f\u0438\u0441\u0430\u043d \u043d\u0438\u0436\u0435).<\/p>\n<\/li>\n<\/ul>\n<p><em>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b:<\/em><\/p>\n<ul>\n<li>\n<p>setRegisteredCommands \u2013 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u043e\u0442\u0430. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0447\u0430\u0442-\u0431\u043e\u0442 \u043c\u043e\u0433 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u043a\u0430\u043a? \u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041a\u043e\u043c\u0430\u043d\u0434\u044b\u00bb.<\/p>\n<\/li>\n<li>\n<p>getFileRequest \u00ad\u2013 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0444\u0430\u0439\u043b\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0444\u0430\u0439\u043b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0444\u0430\u0439\u043b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434: <a href=\"https:\/\/api.telegram.org\/bot%3ctoken%3e\/getFile?file_id=%3cfile_id\" rel=\"noopener noreferrer nofollow\">https:\/\/api.telegram.org\/bot&lt;token>\/getFile?file_id=&lt;file_id<\/a>>, \u0433\u0434\u0435: token \u2013 \u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430, file_id \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p>getFileUrl \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0444\u0430\u0439\u043b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0444\u0430\u0439\u043b\u0435 (\u043c\u0435\u0442\u043e\u0434 getFileRequest), \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 (\u043f\u043e\u043b\u0435 \u00abfile_path\u00bb). \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0444\u0430\u0439\u043b \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434: <a href=\"https:\/\/api.telegram.org\/file\/bot%3ctoken%3e\/%3cpath\" rel=\"noopener noreferrer nofollow\">https:\/\/api.telegram.org\/file\/bot&lt;token>\/&lt;path<\/a>>, \u0433\u0434\u0435 token \u2013 \u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430, path \u2013 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<\/li>\n<li>\n<p>registerBot \u2013 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0431\u043e\u0442 \u043a Telegram API.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<pre><code class=\"xml\">&lt;dependency>     &lt;groupId>org.projectlombok&lt;\/groupId>     &lt;artifactId>lombok&lt;\/artifactId>     &lt;version>1.18.22&lt;\/version>     &lt;scope>provided&lt;\/scope> &lt;\/dependency> &lt;dependency>     &lt;groupId>org.json&lt;\/groupId>     &lt;artifactId>json&lt;\/artifactId>     &lt;version>20210307&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>org.telegram&lt;\/groupId>     &lt;artifactId>telegrambots&lt;\/artifactId>     &lt;version>5.4.0&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>org.telegram&lt;\/groupId>     &lt;artifactId>telegrambotsextensions&lt;\/artifactId>     &lt;version>5.4.0&lt;\/version> &lt;\/dependency><\/code><\/pre>\n<details class=\"spoiler\">\n<summary>BotProcessor<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.dsci.qrvisor.bot;  import com.google.zxing.WriterException; import org.json.JSONObject; import org.telegram.telegrambots.meta.api.methods.send.SendPhoto; import org.telegram.telegrambots.meta.api.objects.InputFile; import ru.dsci.qrvisor.bot.commands.CommandHelp; import ru.dsci.qrvisor.bot.commands.CommandStart; import ru.dsci.qrvisor.core.exceptions.UserException; import lombok.extern.slf4j.Slf4j; import org.telegram.telegrambots.extensions.bots.commandbot.TelegramLongPollingCommandBot; import org.telegram.telegrambots.extensions.bots.commandbot.commands.IBotCommand; import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.PhotoSize; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; import ru.dsci.qrvisor.qr.QRTools;  import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors;  @Slf4j public class BotProcessor extends TelegramLongPollingCommandBot {      private final static int TEXT_LIMIT = 512;     private final static BotSettings botSettings = BotSettings.getInstance();     private static BotProcessor instance;     private final TelegramBotsApi telegramBotsApi;     private List&lt;String> registeredCommands = new ArrayList&lt;>();      public void sendMessage(Long chatId, String message) {         try {             SendMessage sendMessage = SendMessage                     .builder()                     .chatId(chatId.toString())                     .text(message)                     .build();             execute(sendMessage);         } catch (TelegramApiException e) {             log.error(String.format(\"Sending message error: %s\", e.getMessage()));         }     }      public void sendImage(Long chatId, String path) throws UserException {         try {             SendPhoto photo = new SendPhoto();             photo.setPhoto(new InputFile(new File(path)));             photo.setChatId(chatId.toString());             execute(photo);         } catch (TelegramApiException e) {             log.error(String.format(\"Sending image error: %s\", e.getMessage()));             throw new UserException(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\");         }     }      public void sendQRImage(Long chatId, String path) throws UserException {         sendImage(chatId, path);         File file = new File(path);         if (!file.delete()) {             log.error(String.format(\"File '%s' removing error\", path));         }     }      @Override     public String getBotUsername() {         return botSettings.getUserName();     }      @Override     protected void processInvalidCommandUpdate(Update update) {         String command = update.getMessage().getText().substring(1);         sendMessage(                 update.getMessage().getChatId()                 , String.format(\"\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 [%s], \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: %s\"                         , command                         , registeredCommands.toString()));     }      @Override     public void processNonCommandUpdate(Update update) {         if (update.hasMessage()) {             try {                 MessageType messageType = getMessageType(update);                 switch (messageType) {                     case COMMAND:                         processInvalidCommandUpdate(update);                         break;                     case IMAGE:                         processImage(update);                         break;                     case TEXT:                         processText(update);                         break;                 }             } catch (UserException e) {                 sendMessage(update.getMessage().getChatId(), e.getMessage());             } catch (TelegramApiException | RuntimeException | IOException | WriterException e) {                 log.error(String.format(\"Received message processing error: %s\", e.getMessage()));                 sendMessage(update.getMessage().getChatId(), \"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\");             }         }     }      @Override     public String getBotToken() {         return botSettings.getToken();     }      @Override     public void onRegister() {         super.onRegister();     }      private void processText(Update update) throws TelegramApiException, IOException, WriterException, UserException {         String text = update.getMessage().getText();         logMessage(                 update.getMessage().getChatId(),                 update.getMessage().getFrom().getId(),                 true,                 text);         if (text.length() > TEXT_LIMIT) {             log.error(String.format(\"Message exceeds maximum length of %d\", TEXT_LIMIT));             throw new UserException(String.format(\"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 %d \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432\", TEXT_LIMIT));         }         String imageUrl = QRTools.encodeText(text);         logMessage(update.getMessage().getChatId(), update.getMessage().getFrom().getId(), false, \"$image\");         sendQRImage(update.getMessage().getChatId(), imageUrl);     }      private MessageType getMessageType(Update update) throws UserException {         MessageType messageType = null;         try {             if (update.getMessage().getPhoto() != null)                 messageType = MessageType.IMAGE;             else if (update.getMessage().getText() != null)                 messageType = (update.getMessage().getText().matches(\"^\/[\\\\w]*$\")) ?                         MessageType.COMMAND :                         MessageType.TEXT;             if (messageType == null)                 throw new IllegalArgumentException(update.toString());             return messageType;         } catch (RuntimeException e) {             log.error(String.format(\"Invalid message type: %s\", e.getMessage()));             throw new UserException(\"\u041d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\");         }     }      private void processImage(Update update) throws TelegramApiException, IOException, UserException {         logMessage(update.getMessage().getChatId(), update.getMessage().getFrom().getId(), true, \"$image\");         List&lt;PhotoSize> photoSizes = update.getMessage().getPhoto();         String fileUrl = getFileUrl(update.getMessage().getPhoto().get(photoSizes.size() - 1).getFileId());         String text = QRTools.getTextFromQR(fileUrl);         logMessage(update.getMessage().getChatId(), update.getMessage().getFrom().getId(), false, text);         sendMessage(update.getMessage().getChatId(), text);     }      private JSONObject getFileRequest(String fileId) throws IOException {         String fileUrl = String.format(\"https:\/\/api.telegram.org\/bot%s\/getFile?file_id=%s\",                 botSettings.getToken(),                 fileId);         return IOTools.readJsonFromUrl(fileUrl);     }      private String getFileUrl(String fileId) throws IOException {         JSONObject jsonObject = getFileRequest(fileId);         return String.format(\"https:\/\/api.telegram.org\/file\/bot%s\/%s\",                 botSettings.getToken(),                 jsonObject.get(\"file_path\"));     }      private void logMessage(Long chatId, Long userId, boolean input, String text) {         if (text.length() > TEXT_LIMIT)             text = text.substring(0, TEXT_LIMIT);         log.info(String.format(\"CHAT [%d] MESSAGE %s %d: %s\", chatId, input ? \"FROM\" : \"TO\", userId, text));     }      private void setRegisteredCommands() {         registeredCommands = getRegisteredCommands()                 .stream()                 .map(IBotCommand::getCommandIdentifier)                 .collect(Collectors.toList());     }      private void registerCommands() {         register(new CommandStart());         register(new CommandHelp());         setRegisteredCommands();     }      public void registerBot() {         try {             telegramBotsApi.registerBot(this);         } catch (TelegramApiException e) {             throw new RuntimeException(\"Telegram API initialization error: \" + e.getMessage());         }     }      {         try {             telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class);             registerBot();             registerCommands();         } catch (TelegramApiException e) {             throw new RuntimeException(\"Telegram Bot initialization error: \" + e.getMessage());         }     }      public static BotProcessor getInstance() {         if (instance == null)             instance = new BotProcessor();         return instance;     }      public BotProcessor() {         super();     } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041a\u043e\u043c\u0430\u043d\u0434\u044b<\/h3>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IBotCommand, \u0432 \u043c\u043e\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c Command, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043e\u043c\u0430\u043d\u0434 (\u043a\u043b\u0430\u0441\u0441\u044b CommandStart \u0438 CommandHelp).<\/p>\n<p>\u0412 \u0431\u043e\u0442\u0435 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \/START \u0438 \/HELP, \u043f\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0431\u043e\u0442\u0430 \u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441\u043f\u0440\u0430\u0432\u043a\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041b\u043e\u0433\u0438\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 CommandStart \u0438 CommandHelp (\u043a\u043e\u0434 \u043d\u0438\u0436\u0435).<\/p>\n<details class=\"spoiler\">\n<summary>Command<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.dsci.qrvisor.bot.commands;  import lombok.extern.slf4j.Slf4j; import org.telegram.telegrambots.extensions.bots.commandbot.commands.IBotCommand; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Message; import org.telegram.telegrambots.meta.bots.AbsSender; import org.telegram.telegrambots.meta.exceptions.TelegramApiException;  import java.util.Arrays;  @Slf4j public abstract class Command implements IBotCommand {      private final String commandIdentifier;     private final String description;      public Command(String commandIdentifier, String description) {         this.commandIdentifier = commandIdentifier;         this.description = description;     }      @Override     public String getCommandIdentifier() {         return commandIdentifier;     }      @Override     public String getDescription() {         return description;     }      @Override     public void processMessage(AbsSender absSender, Message message, String[] strings) {         log.debug(String.format(String.format(\"COMMAND: %s(%s)\", message.getText(), Arrays.toString(strings))));         try {             SendMessage sendMessage = SendMessage                     .builder()                     .chatId(message.getChatId().toString())                     .text(message.getText())                     .build();             absSender.execute(sendMessage);         } catch (TelegramApiException e) {             log.error(String.format(\"Command message processing error: %s\", e.getMessage(), e));         }     } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>CommandStart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.dsci.qrvisor.bot.commands;  import org.telegram.telegrambots.meta.api.objects.Message; import org.telegram.telegrambots.meta.bots.AbsSender;  public class CommandStart extends Command {      @Override     public void processMessage(AbsSender absSender, Message message, String[] strings) {         message.setText(\"\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c! \\n\"                 + \"\u0412\u0430\u0441 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u0442 @QRVisorBot, \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f QR-\u043a\u043e\u0434\u043e\u0432. \\n\"                 + \"\u041d\u0430\u0447\u043d\u0451\u043c?\"         );         super.processMessage(absSender, message, null);     }      public CommandStart() {         super(\"start\", \"\u0417\u0430\u043f\u0443\u0441\u043a \u0431\u043e\u0442\u0430\");     }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>CommandHelp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.dsci.qrvisor.bot.commands;  import org.telegram.telegrambots.meta.api.objects.Message; import org.telegram.telegrambots.meta.bots.AbsSender;  public class CommandHelp extends Command {      @Override     public void processMessage(AbsSender absSender, Message message, String[] strings) {         message.setText(\"\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430: \\n\" +                 \"- \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u0430: \u0434\u043b\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f QR-\u043a\u043e\u0434\u0430 \u0441\u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u043e\u0434 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0447\u0430\u0442 \\n\" +                 \"- \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f QR-\u043a\u043e\u0434\u0430: \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 QR-\u043a\u043e\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u0438\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u0432 \u0447\u0430\u0442\");         super.processMessage(absSender, message, strings);     }      public CommandHelp() {         super(\"help\", \"\u0421\u043f\u0440\u0430\u0432\u043a\u0430 \\\\help \\n\");     }  } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u043e \u043a\u0430\u043a \u0431\u044b\u0442\u044c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442 \u0431\u043e\u0442\u0443 \u043d\u0435\u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443? \u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 processInvalidCommandUpdate.<\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438, \u043d\u043e \u043a\u0430\u043a \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c? \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 Main (\u043a\u043e\u0434 \u043d\u0438\u0436\u0435), \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 main \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0438 Telegram-\u0431\u043e\u0442\u0430. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u2026 \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<details class=\"spoiler\">\n<summary>Main<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.dsci.qrvisor;  import ru.dsci.qrvisor.bot.BotProcessor; import lombok.extern.slf4j.Slf4j;  @Slf4j public class Main {      public static void main(String[] args) {         try {             BotProcessor botProcessor = BotProcessor.getInstance();             log.info(\"Telegram bot started\");         } catch (RuntimeException e) {             log.error(e.getMessage(), e);         }     } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 QR-\u043a\u043e\u0434\u0430\u043c\u0438 (ZXing)<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 QR-\u043a\u043e\u0434\u0430\u043c\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b open-source \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/github.com\/zxing\/zxing\" rel=\"noopener noreferrer nofollow\">ZXing (zebra crossing)<\/a>, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u2013 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0448\u0442\u0440\u0438\u0445- \u0438 QR-\u043a\u043e\u0434\u0430\u043c\u0438. <\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 QR-\u043a\u043e\u0434\u043e\u0432 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043a\u043b\u0430\u0441\u0441 QRTools (\u043a\u043e\u0434 \u043d\u0438\u0436\u0435).<\/p>\n<p><strong>\u041c\u0435\u0442\u043e\u0434\u044b:<\/strong><\/p>\n<ul>\n<li>\n<p>getBitmapFromUrl \u00ad\u00ad\u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e url-\u0430\u0434\u0440\u0435\u0441\u0443, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 telegram, \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 BinaryBitmap \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Zxing<\/p>\n<\/li>\n<li>\n<p>decodeBitmap \u00ad\u2013 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442<\/p>\n<\/li>\n<li>\n<p>encodeText \u00ad\u2013 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432 QR-\u043a\u043e\u0434, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b \u0441 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.<\/p>\n<\/li>\n<li>\n<p>getTextFromQR \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 QR-\u043a\u043e\u0434.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<pre><code class=\"xml\">        &lt;dependency>             &lt;groupId>com.google.zxing&lt;\/groupId>             &lt;artifactId>core&lt;\/artifactId>             &lt;version>3.4.1&lt;\/version>         &lt;\/dependency>         &lt;dependency>             &lt;groupId>com.google.zxing&lt;\/groupId>             &lt;artifactId>javase&lt;\/artifactId>             &lt;version>3.4.1&lt;\/version>         &lt;\/dependency><\/code><\/pre>\n<details class=\"spoiler\">\n<summary>QRTools<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.dsci.qrvisor.qr;  import com.google.zxing.*; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.QRCodeWriter; import lombok.extern.slf4j.Slf4j;  import javax.imageio.ImageIO; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.nio.file.FileSystems; import java.nio.file.Path; import java.util.*;  @Slf4j public class QRTools {      private static final String FILE_FORMAT = \"png\";     public static final String CHARSET = \"UTF-8\";     private static final QRSIze DEFAULT_VERSION = QRSIze.MEDIUM;     private static final HashMap&lt;QRSIze, Integer> qrSizes;      private static int getQRSize(QRSIze QRSIze) {         return qrSizes.get(QRSIze);     }      private static BinaryBitmap getBitmapFromUrl(String url) throws IOException {         BinaryBitmap binaryBitmap;         try {             binaryBitmap = new BinaryBitmap(new HybridBinarizer(                     new BufferedImageLuminanceSource(ImageIO.read(new URL(url)))));         } catch (IOException e) {             log.error(String.format(\"{QRTools.getBitmapFromUrl}: %s\", e.getMessage()));             throw new IOException(String.format(\"Unable to decrypt QR-code: %s\", e.getMessage()));         }         return binaryBitmap;     }      private static Result decodeBitmap(BinaryBitmap binaryBitmap) {         Result result;         try {             result = new MultiFormatReader().decode(binaryBitmap);         } catch (NotFoundException e) {             throw new IllegalArgumentException(String.format(\"Image does not contain QR-code: %s\", e.getMessage()));         }         return result;     }      public static String encodeText(String text, int width, int height)             throws WriterException, IOException {         QRCodeWriter qrCodeWriter = new QRCodeWriter();         Hashtable hashtable = new Hashtable();         hashtable.put(EncodeHintType.CHARACTER_SET, CHARSET);         BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hashtable);         Path path = FileSystems.getDefault().getPath(String.format(\".\/images\/%s.%s\", UUID.randomUUID(), FILE_FORMAT));         MatrixToImageWriter.writeToPath(bitMatrix, \"PNG\", path);         return path.toAbsolutePath().toString();     }      public static String encodeText(String text, QRSIze QRSIze)             throws WriterException, IOException {         int size = getQRSize(QRSIze);         return encodeText(text, size, size);     }      public static String encodeText(String text)             throws WriterException, IOException {         return encodeText(text, DEFAULT_VERSION);     }      public static String getTextFromQR(String url) throws IOException {         Result result;         try {             result = decodeBitmap(getBitmapFromUrl(url));         } catch (RuntimeException | MalformedURLException e) {             log.debug(String.format(\"decodeQR: %s\", e.getMessage()));             throw new IOException(String.format(\"Unable to decrypt QR-code: %s\", e.getMessage()));         }         return result.getText();     }      static {         qrSizes = new HashMap&lt;>(Map.ofEntries(                 new AbstractMap.SimpleEntry&lt;>(QRSIze.SMALL, 256),                 new AbstractMap.SimpleEntry&lt;>(QRSIze.MEDIUM, 512),                 new AbstractMap.SimpleEntry&lt;>(QRSIze.LARGE, 1024))         );     } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h3>\n<p>\u041d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u043f\u043e\u0440\u0438\u0442\u044c, \u043d\u043e \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u0432 \u0445\u043e\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a, \u0434\u0430\u0436\u0435 \u0432\u0430\u0436\u043d\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0414\u043b\u044f \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430 \u043e\u0448\u0438\u0431\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u0441\u043e\u0437\u0434\u0430\u043d \u043a\u043b\u0430\u0441\u0441 UserException, \u0434\u0430\u043d\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043b\u0438\u0448\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f (\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f) \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0432 \u043b\u043e\u0433.<\/p>\n<details class=\"spoiler\">\n<summary>UserException<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.dsci.qrvisor.core.exceptions;  public class UserException extends Exception {     public UserException(String message) {         super(message);     } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041b\u043e\u0433\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u0414\u043b\u044f \u043b\u043e\u0433\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 SLF4J. \u0411\u043e\u0442 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<\/p>\n<p><strong>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<pre><code class=\"xml\">&lt;dependency>     &lt;groupId>org.apache.logging.log4j&lt;\/groupId>     &lt;artifactId>log4j-api&lt;\/artifactId>     &lt;version>2.7&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>org.apache.logging.log4j&lt;\/groupId>     &lt;artifactId>log4j-core&lt;\/artifactId>     &lt;version>2.7&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>org.apache.logging.log4j&lt;\/groupId>     &lt;artifactId>log4j-slf4j-impl&lt;\/artifactId>     &lt;version>2.7&lt;\/version> &lt;\/dependency><\/code><\/pre>\n<h3>\u0420\u0435\u0441\u0443\u0440\u0441\u044b<\/h3>\n<p>\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: <a href=\"https:\/\/github.com\/SkyZion-public\/qrvisor-public\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/SkyZion-public\/qrvisor-public<\/a><\/p>\n<p>\u041d\u0430\u0439\u0442\u0438 \u0431\u043e\u0442 \u0432 Telegram \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438: @<a href=\"https:\/\/t.me\/QRVisorBot\" rel=\"noopener noreferrer nofollow\">QRVisorBot<\/a><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0414\u0440\u0443\u0437\u044c\u044f, \u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u043d\u043e \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u043e\u0442\u0430, \u0431\u0443\u0434\u0443 \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u0440\u0430\u0434 \u0435\u0441\u043b\u0438 \u0438 \u0431\u043e\u0442, \u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0431\u0443\u0434\u0443\u0442 \u0432\u0430\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u044b. \u0415\u0441\u043b\u0438 \u044f \u0447\u0442\u043e-\u0442\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u043b, \u0438\u043b\u0438 \u0432\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u0435 \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u043f\u0438\u0448\u0438\u0442\u0435 \u043c\u043d\u0435, \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. <\/p>\n<p>\u0415\u0441\u0442\u044c \u0438\u0434\u0435\u044f \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u044f\u043c\u0438 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 API Tinkoff-\u0418\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438, \u0432 \u043f\u043b\u0430\u043d\u0430\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0433\u043e \u0440\u043e\u0431\u043e\u0442\u0430. \u041d\u043e \u044d\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u0430\u043c, \u0447\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0437\u0430\u0439\u0434\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b.<\/p>\n<p>\u0416\u0435\u043b\u0430\u044e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0438 \u0442\u0435\u0440\u043f\u0435\u043d\u0438\u044f, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432 \u0441\u043a\u043e\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441 \u043d\u0430\u0441 \u0441\u043d\u0438\u043c\u0443\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0441\u0442 \u043f\u043e QR-\u043a\u043e\u0434\u0430\u043c.<\/p>\n<h2>UPD<\/h2>\n<p>\u0412\u044b\u043b\u043e\u0436\u0438\u043b \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0435\u0449\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e <a href=\"https:\/\/habr.com\/ru\/post\/592093\/\" rel=\"noopener noreferrer nofollow\">TINKOFF INVEST API<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/591391\/\"> https:\/\/habr.com\/ru\/articles\/591391\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"bordered full-width\"><figcaption>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Telegram-\u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 QR-\u043a\u043e\u0434\u0430\u043c\u0438<\/figcaption><\/figure>\n<h2>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Telegram-\u0431\u043e\u0442\u0430 \u043d\u0430 JAVA \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f QR-\u043a\u043e\u0434\u043e\u0432<\/h2>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0421 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 QR-\u043a\u043e\u0434\u044b \u0432\u0441\u0435\u0440\u044c\u0435\u0437, \u0438 \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u0430\u0434\u043e\u043b\u0433\u043e \u0432\u043e\u0448\u043b\u0438 \u0432 \u043d\u0430\u0448\u0443 \u0436\u0438\u0437\u043d\u044c. QR-\u043a\u043e\u0434 \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0432 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u043c \u043f\u043b\u0430\u043d\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041c\u0430\u0442\u044c-\u043f\u0440\u0430\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0438\u0446\u0430 (\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f DENSO) \u0432\u043d\u0435\u0434\u0440\u0438\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u043e\u0432 \u0441 \u0446\u0435\u043b\u044c\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u0434\u0435\u0440\u0436\u0435\u043a \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u0441 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u043b\u0430\u0441\u0442\u0435\u0439 \u043d\u0430 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0439, \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u00abQR-\u043a\u043e\u0434\u00bb \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b\u043e \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u043a\u0440\u0430\u0441, \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0432\u0437\u0434\u0440\u0430\u0433\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0435\u0433\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0438, \u043e\u0442 \u0447\u0435\u0433\u043e \u0434\u0430\u0436\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0433\u0440\u0443\u0441\u0442\u043d\u043e, \u0432\u0435\u0434\u044c \u043d\u0435 \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u044d\u0442\u0438 \u0447\u0435\u0440\u043d\u043e-\u0431\u0435\u043b\u044b\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b.<\/p>\n<p>\u041e QR-\u043a\u043e\u0434\u0430\u0445 \u044f \u043d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u0438\u0441\u0430\u043b \u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/587400\/\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 QR-\u043a\u043e\u0434\u043e\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0432 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0435 \u0438 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0446\u0435\u043d\u0442\u0440\u0430\u0445?<\/a>, \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439, \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u0438\u043a\u043e\u0432, \u0447\u0442\u043e \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043c\u043d\u0435 \u0432\u043e\u0439\u0442\u0438 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u043e\u0442\u043d\u044e \u0430\u0432\u0442\u043e\u0440\u043e\u0432. \u041d\u0435 \u0441\u043a\u0440\u043e\u044e, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u043c \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u043c, \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0432\u0441\u0435\u043c \u0442\u0435\u043c, \u043a\u0442\u043e \u043f\u043b\u044e\u0441\u043e\u0432\u0430\u043b \u0432 \u043a\u0430\u0440\u043c\u0443, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e \u043a\u0440\u0438\u0442\u0438\u043a\u043e\u0432\u0430\u043b \u0438 \u0434\u0438\u0441\u043a\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043e\u0442\u043c\u0435\u0442\u0438\u043b \u0434\u043b\u044f \u0441\u0435\u0431\u044f, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 QR-\u043a\u043e\u0434\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439, \u043b\u0438\u0431\u043e \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f QR-\u043a\u043e\u0434\u043e\u0432 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435, \u043b\u0438\u0431\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c QR-\u043a\u043e\u0434 \u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u0443 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434, \u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0422\u0430\u043a \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Telegram-\u0431\u043e\u0442\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c QR-\u043a\u043e\u0434\u044b. <\/p>\n<p>\u041f\u043b\u044e\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Telegram-\u0431\u043e\u0442\u0430 \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438-\u0441\u043a\u0430\u043d\u0435\u0440\u0430\u043c\u0438 \u044d\u0442\u043e: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u0444\u0442 (\u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0442\u0435\u043b\u0435\u0433\u0438, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e), \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u0433\u0430\u043b\u0435\u0440\u0435\u0438 \u0438\u043b\u0438 \u0441 web-\u0441\u0430\u0439\u0442\u0430) \u0438 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c. <\/p>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0438 \u043e \u043c\u0438\u043d\u0443\u0441\u0430\u0445, \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0435\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0447\u0440\u0435\u0432\u0430\u0442\u0430 \u0438\u0445 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0435\u0439, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0440\u0430\u0431\u043e\u0442\u0430 \u0431\u043e\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0442\u0438 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u0430 \u2013 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u0431\u043e\u0442\u0443 QR-\u043a\u043e\u0434, \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0448\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u0442\u0435\u043a\u0441\u0442 \u2013 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0448\u044c QR-\u043a\u043e\u0434. \u041f\u0440\u043e\u0441\u0442\u043e? \u0414\u0430! \u0423\u0434\u043e\u0431\u043d\u043e? \u041d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u043e!<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/619ea8d8abb378f6450d1aba\" data-style=\"\" id=\"619ea8d8abb378f6450d1aba\" width=\"\"><\/div>\n<h3>\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f<\/h3>\n<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043b\u043e\u0436\u0435\u043d, \u043d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u043b\u044e\u0434\u0435\u0439, \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u0441\u0432\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0438\u043c\u0435\u0435\u0442\u0441\u044f, \u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044e, \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e. <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e Telegram-\u0431\u043e\u0442\u0430, \u043b\u0438\u0431\u043e \u0432\u0430\u043c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438\/\u043f\u0440\u0438\u0435\u043c\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u043b\u0438 \u0436\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 QR-\u043a\u043e\u0434\u0430\u043c\u0438 \u0432 JAVA \u00ad\u2013 ZXING, \u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u0434\u043b\u044f \u0432\u0430\u0441.<\/p>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0431\u043e\u0442\u0430<\/h3>\n<p>\u041d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0431\u043e\u0442\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430, \u0438\u0431\u043e \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u043d\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u0442\u043e\u043c, \u043a\u0442\u043e \u0442\u0430\u043a\u043e\u0439 @BotFather \u0438 \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/post\/543676\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u0451, \u043e \u0447\u0451\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a Telegram-\u0431\u043e\u0442\u043e\u0432 <\/a>\u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0438\u043c\u044f \u0431\u043e\u0442\u0430 (\u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2013 @QRVisorBot) \u0438 \u0442\u043e\u043a\u0435\u043d, \u043f\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u043d\u0435 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e, \u0442.\u043a. \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043b\u0438\u0446\u0430, \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0442\u043e\u043a\u0435\u043d\u0443, \u0438\u043c\u0435\u044e\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u043e\u0442\u043e\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0442\u043e\u043a\u0435\u043d \u043f\u0440\u0438 \u0441\u0435\u0431\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0432\u0430\u0448\u0438\u043c \u0431\u043e\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0442\u0440\u0435\u0442\u044c\u0438 \u043b\u0438\u0446\u0430.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c JAVA-\u043f\u0440\u043e\u0435\u043a\u0442, \u043b\u0438\u0447\u043d\u043e \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 IDE JETBRAINS IDEA, \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 MAVEN, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0443 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430.<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u043e\u0442\u0430<\/h3>\n<p>\u0414\u0430\u0431\u044b \u043d\u0435 \u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0432\u044b\u043d\u043e\u0441\u0438\u043c \u0435\u0435 \u0432 \u0444\u0430\u0439\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (resources) \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u00abconfig.properties\u00bb, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u043c\u044f \u0438 \u0442\u043e\u043a\u0435\u043d \u0447\u0430\u0442-\u0431\u043e\u0442\u0430:<br \/>token = 0000000000:XXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br \/>username = QRVisor<br \/>, \u0433\u0434\u0435:<br \/>token \u2013 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430;<br \/>username \u2013 \u0438\u043c\u044f \u0431\u043e\u0442\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u044b\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435, \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043a\u043b\u0430\u0441\u0441 BotSettings (\u043a\u043e\u0434 \u043d\u0438\u0436\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 config.properties. \u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u043b\u0430\u0433\u0438\u043d LOMBOK, \u043e\u043d \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0438\u043f\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u044f \u043d\u0430 JAVA \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u043e\u0439\u0442\u0438 \u043c\u0438\u043c\u043e \u043d\u0435\u0433\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u0442\u0430\u043a, \u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c. \u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 BotSettings \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0421\u0418\u041d\u0413\u041b\u0422\u041e\u041d, \u0441\u043b\u0443\u0436\u0438\u0442 \u043e\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435. <\/p>\n<details class=\"spoiler\">\n<summary>BotSettings<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.dsci.qrvisor.bot;  import lombok.Data; import org.telegram.telegrambots.meta.TelegramBotsApi;  import java.io.IOException; import java.io.InputStream; import java.util.Properties;  @Data public class BotSettings {      public static final String FILE_NAME = \"config.properties\";     private static BotSettings instance;     private Properties properties;     private String token;     private String userName;     private TelegramBotsApi telegramBotsApi;      public static BotSettings getInstance() {         if (instance == null)             instance = new BotSettings();         return instance;     }      {         try {             properties = new Properties();             try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(FILE_NAME)) {                 properties.load(inputStream);             } catch (IOException e) {                 throw new IOException(String.format(\"Error loading properties file '%s'\", FILE_NAME));             }             token = properties.getProperty(\"token\");             if (token == null) {                 throw new RuntimeException(\"Token value is null\");             }             userName = properties.getProperty(\"username\");             if (userName == null) {\u0412\u0441\u0451, \u043e \u0447\u0451\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a TELEGRAM-\u0431\u043e\u0442\u043e\u0432                  throw new RuntimeException(\"UserName value is null\");             }         } catch (RuntimeException | IOException e) {             throw new RuntimeException(\"Bot initialization error: \" + e.getMessage());         }     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430<\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0431\u043e\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0430 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 BotProcessor (\u043a\u043e\u0434 \u043d\u0438\u0436\u0435). \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0431\u043e\u0442 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b, \u043f\u0430\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u0435\u043c\u0443 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u0414\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0431\u043e\u0442\u0430 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0442 TelegramLongPollingCommandBot. TelegramLongPollingCommandBot \u2013 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p><em>\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (TelegramLongPollingCommandBot):<\/em><\/p>\n<ul>\n<li>\n<p>getBotUsername \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0431\u043e\u0442;<\/p>\n<\/li>\n<li>\n<p>getBotToken \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>onRegister \u2013 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0431\u043e\u0442\u0430 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430-\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f);<\/p>\n<\/li>\n<li>\n<p>processNonCommandUpdate \u2013 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p>processInvalidCommandUpdate \u2013 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0431\u043e\u0442\u0443 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<\/li>\n<\/ul>\n<p><em>\u041c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/em><\/p>\n<ul>\n<li>\n<p>getMessageType \u2013 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u0442\u0438\u043f\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0431\u043e\u0442\u0430 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432 MessageType).<\/p>\n<\/li>\n<li>\n<p>sendMessage \u2013 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0447\u0430\u0442.<\/p>\n<\/li>\n<li>\n<p>sendImage \u2013 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0447\u0430\u0442.<\/p>\n<\/li>\n<li>\n<p>sendQRImage \u2013 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 QR-\u043a\u043e\u0434 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0447\u0430\u0442 (\u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 sendImage \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c).<\/p>\n<\/li>\n<li>\n<p>processImage \u2013 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. TELEGRAM API \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 getPhoto, \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e photoSizes, \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 (\u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d). \u0421\u0441\u044b\u043b\u043a\u0443 \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 getFileUrl (\u043e\u043f\u0438\u0441\u0430\u043d \u043d\u0438\u0436\u0435).<\/p>\n<\/li>\n<\/ul>\n<p><em>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b:<\/em><\/p>\n<ul>\n<li>\n<p>setRegisteredCommands \u2013 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u043e\u0442\u0430. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0447\u0430\u0442-\u0431\u043e\u0442 \u043c\u043e\u0433 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u043a\u0430\u043a? \u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041a\u043e\u043c\u0430\u043d\u0434\u044b\u00bb.<\/p>\n<\/li>\n<li>\n<p>getFileRequest \u00ad\u2013 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0444\u0430\u0439\u043b\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0444\u0430\u0439\u043b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0444\u0430\u0439\u043b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434: <a href=\"https:\/\/api.telegram.org\/bot%3ctoken%3e\/getFile?file_id=%3cfile_id\" rel=\"noopener noreferrer nofollow\">https:\/\/api.telegram.org\/bot&lt;token>\/getFile?file_id=&lt;file_id<\/a>>, \u0433\u0434\u0435: token \u2013 \u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430, file_id \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p>getFileUrl \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0444\u0430\u0439\u043b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0444\u0430\u0439\u043b\u0435 (\u043c\u0435\u0442\u043e\u0434 getFileRequest), \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 (\u043f\u043e\u043b\u0435 \u00abfile_path\u00bb). \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0444\u0430\u0439\u043b \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434: <a href=\"https:\/\/api.telegram.org\/file\/bot%3ctoken%3e\/%3cpath\" rel=\"noopener noreferrer nofollow\">https:\/\/api.telegram.org\/file\/bot&lt;token>\/&lt;path<\/a>>, \u0433\u0434\u0435 token \u2013 \u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430, path \u2013 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<\/li>\n<li>\n<p>registerBot \u2013 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0431\u043e\u0442 \u043a Telegram API.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<pre><code class=\"xml\">&lt;dependency>     &lt;groupId>org.projectlombok&lt;\/groupId>     &lt;artifactId>lombok&lt;\/artifactId>     &lt;version>1.18.22&lt;\/version>     &lt;scope>provided&lt;\/scope> &lt;\/dependency> &lt;dependency>     &lt;groupId>org.json&lt;\/groupId>     &lt;artifactId>json&lt;\/artifactId>     &lt;version>20210307&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>org.telegram&lt;\/groupId>     &lt;artifactId>telegrambots&lt;\/artifactId>     &lt;version>5.4.0&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>org.telegram&lt;\/groupId>     &lt;artifactId>telegrambotsextensions&lt;\/artifactId>     &lt;version>5.4.0&lt;\/version> &lt;\/dependency><\/code><\/pre>\n<details class=\"spoiler\">\n<summary>BotProcessor<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.dsci.qrvisor.bot;  import com.google.zxing.WriterException; import org.json.JSONObject; import org.telegram.telegrambots.meta.api.methods.send.SendPhoto; import org.telegram.telegrambots.meta.api.objects.InputFile; import ru.dsci.qrvisor.bot.commands.CommandHelp; import ru.dsci.qrvisor.bot.commands.CommandStart; import ru.dsci.qrvisor.core.exceptions.UserException; import lombok.extern.slf4j.Slf4j; import<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-414147","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/414147","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=414147"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/414147\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=414147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=414147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=414147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}