{"id":316953,"date":"2021-01-26T09:00:53","date_gmt":"2021-01-26T09:00:53","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=316953"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=316953","title":{"rendered":"\u041a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 Telegram-\u0431\u043e\u0442\u0430, Computer Vision \u0438 SQL Anywhere"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u0443\u0441\u043b\u0443\u0433\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432\u0441\u0451 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0438 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0444\u0435\u0440\u0435 \u043f\u0440\u0438\u043d\u0435\u0441\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u0443 \u043a\u0430\u043a \u0431\u0438\u0437\u043d\u0435\u0441\u0443, \u0442\u0430\u043a \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c. \u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043b\u043e\u0433\u0430 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0437\u0440\u0435\u043d\u0438\u044f \u0438 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0434\u043b\u044f <a href=\"https:\/\/habr.com\/ru\/company\/sap\/blog\/415657\/\">\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f<\/a> \u0446\u0435\u043d\u043d\u0438\u043a\u043e\u0432 \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0432 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f <a href=\"https:\/\/habr.com\/ru\/company\/sap\/blog\/523396\/\">\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f<\/a> \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0443\u044e\u0449\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u043c\u0435\u043d\u0435\u0435 \u0430\u043c\u0431\u0438\u0446\u0438\u043e\u0437\u043d\u043e\u0439 (\u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439) \u0437\u0430\u0434\u0430\u0447\u0435 \u2013 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u0438\u0445 \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0432 Telegram, QR-\u043a\u043e\u0434\u043e\u0432 \u0438 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 <a href=\"https:\/\/www.sap.com\/products\/sql-anywhere.html\">SAP SQL Anywhere<\/a>.&nbsp;<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/513\/4b7\/fc1\/5134b7fc1e6c93a1e53d361c740ab11d.png\" width=\"300\" height=\"405\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0430\u0441\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445, \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u043b\u0438\u0448\u044c \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u043c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u043c. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043c\u044b \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0438\u0431\u0435\u0433\u043b\u0438 \u043a \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u0437\u0440\u0435\u043d\u0438\u044e, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 QR-\u043a\u043e\u0434\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 Telegram \u0431\u043e\u0442\u0430\u043c. \u041c\u044b \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043c\u0430 \u0431\u043e\u0442\u043e\u0432 \u0432 Telegram \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043d\u0435 \u0437\u0430\u043e\u0441\u0442\u0440\u044f\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 Telegram \u0438\u0437-\u0437\u0430 \u0435\u0433\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e API. \u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 Github \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0442\u0435\u043c\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 Telegram \u043f\u043e QR-\u043a\u043e\u0434\u0443 \u0441 live-\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u0438\u0445 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0442\u043e \u043c\u0438\u043b\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u0438\u043c \u043f\u043e\u0434 \u043a\u0430\u0442.  <\/p>\n<h2>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/h2>\n<p>\u041a\u0430\u043a \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u043e\u043d\u043b\u0430\u0439\u043d-\u0437\u0430\u043a\u0430\u0437\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043f\u043e e-mail, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u044b \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 \u0441\u0432\u043e\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u044b. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0442\u043e \u0442\u043e\u0436\u0435 \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u0442 \u0432 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0435 (\u00ab\u043f\u0440\u0438\u043d\u044f\u0442\u00bb, \u00ab\u043f\u0440\u0438\u0431\u044b\u043b \u043d\u0430 \u0441\u043a\u043b\u0430\u0434\u00bb, \u00ab\u0432\u0437\u044f\u0442 \u0441\u043e \u0441\u043a\u043b\u0430\u0434\u0430\u00bb, \u00ab\u0432 \u043f\u0443\u0442\u0438\u00bb \u0438 \u0442.\u0434.), \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u043a \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0435 \u0441\u043f\u0430\u043c\u0430 \u043f\u043e \u043f\u043e\u0447\u0442\u0435. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0432\u0430\u0436\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u00ab\u0443\u0440\u043e\u0432\u043d\u044f\u00bb \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u2013 \u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0441\u0432\u043e\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430 \u043e\u043d \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432\u043e\u0432\u0441\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442 \u043d\u0438\u0445 \u043e\u0442\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f. \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0435 \u043d\u0438\u0436\u0435, \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0431\u043e\u0442\u0430 \u043a \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u0435 \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u044d\u0444\u0438\u0440\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e QR-\u043a\u043e\u0434\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0c0\/0ab\/f16\/0c00abf163096af8626652a2cc4eea26.jpg\" alt=\"\u0420\u0438\u0441. 1. \u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430\" title=\"\u0420\u0438\u0441. 1. \u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430\" width=\"796\" height=\"1041\"><figcaption>\u0420\u0438\u0441. 1. \u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430<\/figcaption><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0443\u0441\u0442\u044c \u0437\u0430\u043a\u0430\u0437\u044b \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 SQL Anywhere, \u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u0441\u043d\u0430\u0449\u0451\u043d\u043d\u043e\u0435 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u043e\u0439 (Raspberry Pi \u0441 PiCam, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0435 \u043a \u044d\u0442\u043e\u0439 \u0431\u0430\u0437\u0435. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0447\u0442\u043e \u0437\u0430\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0442\u043e\u0432\u0430\u0440 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u0441\u043a\u043b\u0430\u0434. \u041d\u0430 \u0442\u043e\u0432\u0430\u0440\u0435 \u043d\u0430\u043a\u043b\u0435\u0435\u043d QR-\u043a\u043e\u0434, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043a\u0430\u0437 \u0432 \u0431\u0430\u0437\u0435. \u041c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e QR-\u043a\u043e\u0434 \u0442\u043e\u0432\u0430\u0440\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0441\u044f \u0432 \u043a\u0430\u0434\u0440\u0435 \u0441\u043a\u043b\u0430\u0434\u0441\u043a\u043e\u0439 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b, \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u0437\u0430\u043a\u0430\u0437\u0430\u0432\u0448\u0435\u043c\u0443 \u044d\u0442\u043e\u0442 \u0442\u043e\u0432\u0430\u0440, \u043e\u0442\u0441\u044b\u043b\u0430\u043b\u043e\u0441\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0432 Telegram \u043e \u043f\u0440\u0438\u0431\u044b\u0442\u0438\u0438 \u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430 \u043d\u0430 \u0441\u043a\u043b\u0430\u0434. \u041f\u0440\u0438\u0447\u0451\u043c \u0432 \u043d\u0451\u043c \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0437\u043e\u043d\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0442\u043e\u0432\u0430\u0440\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e QR-\u043a\u043e\u0434 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043d\u043e \u043e\u043d \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043a\u0430\u0437. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 QR-\u043a\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 (UPC, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440), \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0443\u0447\u0435\u0431\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0443. \u0412\u043e\u043e\u0431\u0449\u0435, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435\u043c QR-\u043a\u043e\u0434\u043e\u0432 \u0441 \u044d\u0444\u0438\u0440\u0430 \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u043e\u0442\u0441\u044b\u043b\u043a\u043e\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 Telegram, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 QR-\u043a\u043e\u0434\u043e\u0432.<\/p>\n<h2>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n<p>\u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0431\u043e\u0442\u0430 \u043d\u0430 Python, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <a href=\"https:\/\/github.com\/aiogram\/aiogram\">AIOgram<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <a href=\"https:\/\/core.telegram.org\/bots\/api\">Telegram Bot API<\/a> \u0438 <a href=\"https:\/\/github.com\/sqlanywhere\/sqlanydb\">sqlanydb<\/a> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f SQL Anywhere. \u0414\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u043e\u0439, \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 QR-\u043a\u043e\u0434\u043e\u0432 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 <a href=\"https:\/\/github.com\/skvark\/opencv-python\">OpenCV<\/a> \u0438 <a href=\"https:\/\/numpy.org\/\">NumPy<\/a>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0451\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<p>\u00b7&nbsp;\u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 SQL Anywhere (\u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u044c sqlanydb);<\/p>\n<p>\u00b7&nbsp;\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0442\u0440\u0438\u043c\u0443 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b, \u043f\u043e\u0438\u0441\u043a \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 QR-\u043a\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043d\u0451\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f (\u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u0438 OpenCV \u0438 NumPy);<\/p>\n<p>\u00b7&nbsp;\u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0430\u043c\u043e\u0433\u043e Telegram \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 (\u0447\u0435\u0440\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a AIOgram).<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 SQL Anywhere<\/h2>\n<p>SAP \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0421\u0423\u0411\u0414 SQL Anywhere. \u0421\u0440\u0435\u0434\u0438 \u0435\u0451 \u043f\u043b\u044e\u0441\u043e\u0432 \u2013 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043d\u0438\u0437\u043a\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c. \u041c\u044b \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b\u0438 \u0435\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0432\u044b\u0431\u043e\u0440 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0430\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0435\u0451.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0430\u043c \u0444\u0430\u0439\u043b \u0441 \u0431\u0430\u0437\u043e\u0439. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0443 <a href=\"https:\/\/help.sap.com\/viewer\/61ecb3d4d8be4baaa07cc4db0ddb5d0a\/17.0\/en-US\/3bc8f4f76c5f1014b7e0e816307e4ca4.html\">dbinit<\/a>:<\/p>\n<pre><code>dbinit -dba admin,password123 -p 4k -z UTF8 -ze UTF8 -zn UTF8 orders.db<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u00abadmin\u00bb (\u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u00abpassword123\u00bb), \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 4 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u0430 \u0438 \u0441\u0445\u0435\u043c\u043e\u0439, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 UTF-8. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u00aborders.db\u00bb \u0447\u0435\u0440\u0435\u0437 SQL Central (\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 SQL Anywhere) \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u0430\u0437\u043e\u0432. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c:<\/p>\n<pre><code>CREATE TABLE Orders (     -- ID of an order     id UNSIGNED INT PRIMARY KEY NOT NULL IDENTITY,     -- Product's name     product NVARCHAR(24) NOT NULL,     -- Product's model     model NVARCHAR(20),     -- Product's price (in Euros)     price DECIMAL(10,2) NOT NULL,     -- Amount of the product     amount UNSIGNED INT NOT NULL DEFAULT 1,     -- Weight of the product (in kilograms)     weight DECIMAL(8,3) NOT NULL,     -- Customer's first name     first_name NVARCHAR(16) NOT NULL,     -- Customer's last name     last_name NVARCHAR(20),     -- Customer's physical address     address NVARCHAR(48) NOT NULL,     -- Customer's Telegram ID     telegram_id UNSIGNED INT NOT NULL,     -- Customer's timezone     timezone NVARCHAR(16) DEFAULT 'UTC',     -- Customer's prefered locale     locale NVARCHAR(5) DEFAULT 'en_US' ); <\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043a\u0430\u0437\u0430 \u0432 \u0442\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:   <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fdb\/c4b\/f06\/fdbc4bf0675ee67b2dde47d5cc1f979f.jpg\" alt=\"\u0420\u0438\u0441. 2. \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u043a\u0430\u0437\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 Orders\" title=\"\u0420\u0438\u0441. 2. \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u043a\u0430\u0437\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 Orders\" width=\"1227\" height=\"107\"><figcaption>\u0420\u0438\u0441. 2. \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u043a\u0430\u0437\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 Orders<\/figcaption><\/figure>\n<p>\u042d\u0442\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u044c sqlanydb: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0448\u0438 credentials (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 admin \u043a\u0430\u043a UID \u0438 password123 \u043a\u0430\u043a \u043f\u0430\u0440\u043e\u043b\u044c) \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b (\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043c \u0432 .env \u0444\u0430\u0439\u043b\u0435 \u0438 \u043f\u043e\u0434\u0446\u0435\u043f\u043b\u044f\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/github.com\/theskumar\/python-dotenv\">dotenv<\/a>). \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u0431\u043e\u0442\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 Orders:<\/p>\n<pre><code>conn = sqlanydb.connect(uid=config.DB_UID, pwd=config.DB_PASSWORD) curs = conn.cursor()<\/code><\/pre>\n<h2>\u041f\u043e\u0438\u0441\u043a \u0438 \u0430\u043d\u0430\u043b\u0438\u0437 QR-\u043a\u043e\u0434\u043e\u0432 \u0441 \u044d\u0444\u0438\u0440\u0430<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u043e\u0442 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043d\u0430 \u044d\u0444\u0438\u0440\u0435:<\/p>\n<pre><code>cap = cv2.VideoCapture(0)<\/code><\/pre>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0437\u0430 \u0440\u0435\u043d\u0434\u0435\u0440 UI \u043d\u0430 \u043e\u043a\u043d\u0435 \u0441 \u044d\u0444\u0438\u0440\u043e\u043c, \u043f\u043e\u0438\u0441\u043a \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 QR-\u043a\u043e\u0434\u043e\u0432 \u043d\u0430 \u044d\u0444\u0438\u0440\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e QR-\u043a\u043e\u0434\u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435.<\/p>\n<pre><code>async def scan_qr(area: int = 300, color: int = 196, side: int = 240, lang: str = \"en\", debug: bool = False) -&gt; None:     \"\"\"Main function that creates a screen with the capture, monitors the web-cam's stream, searches for a QR-code in a squared area and passes the decoded QR-code to the notify module.     Args:         [optional] area (int): Minimal area of a detected object to be consider a QR-code.         [optional] color (int): Minimal hue of gray of a detected object to be consider a QR-code.         [optional] side (int): Length of the side of a square to be drawn in the center of the screen.         [optional] lang (str): Language of a text to be written above the square.         [optional] debug (bool): Crops and outputs an image containing inside the square at potential detection.     \"\"\"      if (cap is None) or (not cap.isOpened()):         logger.critical(\"No video stream detected. \"                         \"Make sure that you've got a webcam connected and enabled\")         return     kernel = np.ones((2, 2), np.uint8)     square = create_square(cap.read()[1], side=side)     while cap.isOpened():         ret, frame = cap.read()         key = cv2.waitKey(1)         if not ret or square is None or ((key &amp; 0xFF) in {27, ord(\"Q\"), ord(\"q\")}):             exit(1)         image = draw_bounds(frame, square, lang=lang)         detected, cropped = detect_inside_square(frame, square, kernel, area_min=area, color_lower=color, debug=debug)         if detected:             address = detect_qr(cropped)             if address:                 logger.debug(\"Detected: \\\"{}\\\"\", address)                 await notify.start(address)         cv2.imshow(\"Live Capture\", image)         await asyncio.sleep(0.1)  <\/code><\/pre>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u044f\u0441\u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0421\u043f\u0435\u0440\u0432\u0430 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043e\u043d\u0430 \u0436\u0435 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u0430) \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u043c OpenCV. \u0417\u0430\u0442\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0441\u043b\u0435\u0434\u0438\u043c, \u0447\u0442\u043e\u0431\u044b QR-\u043a\u043e\u0434 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u0430\u0434\u0440\u0430 (\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435), \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u043f\u0430\u0440 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 (x, y) \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 `side` \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 create_square(). \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 draw_bounds() \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043c \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043a\u0430\u0434\u0440\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0441\u043a\u043e\u043c\u043e\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 `lang`. \u0422\u043e \u0435\u0441\u0442\u044c, draw_bounds() \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0442\u0440\u0438\u043c\u0430 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 UI:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/55c\/462\/20e\/55c46220e2268103002d70526c8bff61.jpg\" alt=\"\u0420\u0438\u0441. 3. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 `draw_bounds`\" title=\"\u0420\u0438\u0441. 3. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 `draw_bounds`\" width=\"644\" height=\"514\"><figcaption>\u0420\u0438\u0441. 3. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 `draw_bounds`<\/figcaption><\/figure>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u044d\u0444\u0438\u0440\u0430 \u0438 \u043f\u043e\u0438\u0441\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e \u043d\u0430 QR-\u043a\u043e\u0434 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 detect_inside_square(): <\/p>\n<pre><code>def detect_inside_square(frame: Any, square: np.ndarray, kernel: np.ndarray, area_min: int = 300, color_lower: int = 212, color_upper: int = 255, debug: bool = False) -&gt; Tuple[bool, Any]:     \"\"\"Detects and analyzes contours and shapes on the frame.  If the detected shape's area is &gt;= :area_min:, its color hue is &gt;= :color_lower and a rectangle that encloses the shape contains inside the square returns True and the cropped image of the frame.     Args:         frame (Union[Mat, UMat]): A frame of the webcam's captured stream.         square (np.ndarray): A numpy array of the square's (x,y)-coordinates on the frame.         kernel (np.ndarray): A kernel for the frame dilation and transformation (to detect contours of shapes in the frame).         [optional] area_min (int): Minimal area of a detected object to be consider a QR-code.         [optional] color_lower (int): Minimal hue of gray of a detected object to be consider a QR-code.         [optional] color_upper (int): Maximal hue of gray of a detected object to be consider a QR-code.         [optional] debug (bool): Crops and outputs an image containing inside the square at potential detection.     Returns:         A tuple where the first element is whether a potential shape has been detected inside the square or not.         If it was then the second element is the square-cropped image with the detected shape, None otherwise.     \"\"\"      filter_lower = np.array(color_lower, dtype=\"uint8\")     filter_upper = np.array(color_upper, dtype=\"uint8\")     mask = cv2.inRange(frame, filter_lower, filter_upper)     dilation = cv2.dilate(mask, kernel, iterations=3)     closing = cv2.morphologyEx(dilation, cv2.MORPH_GRADIENT, kernel)     closing = cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, kernel)     closing = cv2.GaussianBlur(closing, (3, 3), 0)     edge = cv2.Canny(closing, 175, 250)     if debug:         cv2.imshow(\"Edges\", edge)         contours, hierarchy = cv2.findContours(edge, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)     for contour in contours:         area = cv2.contourArea(contour)         if area &lt; area_min:             continue         rect = cv2.minAreaRect(contour)         box = cv2.boxPoints(rect)         box = np.int0(box)         rect = order_points(box)         cv2.drawContours(frame, [box], 0, (0, 0, 255), 1)         if contains_in_area(rect, square):             cropped = frame[square[0][1]:square[2][1], square[0][0]:square[2][0]]             if debug:                 cv2.imshow(\"Cropped\", cropped)             return (True, cropped)     return (False, None)  <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u044b \u0443\u0441\u043f\u0435\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043f\u043e \u0445\u043e\u0434\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043c\u044b \u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u0435\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u043e\u043a\u0441\u0442\u0440\u0438\u043d\u0433\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u043b\u0438\u0448\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0421\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0430\u0448\u0438\u0445 QR-\u043a\u043e\u0434\u043e\u0432 \u0435\u0441\u0442\u044c \u0431\u0435\u043b\u044b\u0439 \u0431\u043e\u0440\u0434\u044e\u0440. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u043a\u0430\u0434\u0440\u0435 \u043f\u043e \u0438\u0445 \u00ab\u0441\u0432\u0435\u0442\u043b\u043e\u0441\u0442\u0438\u00bb (\u044f\u0440\u043a\u043e\u0441\u0442\u0438). \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445. \u0415\u0441\u043b\u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0433\u0430, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 `area_min`, \u0442\u043e \u043d\u0430\u0441 \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442, \u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443. \u0423\u0442\u043e\u0447\u043d\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 CLI-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043f\u043b\u043e\u0449\u0430\u0434\u0438, \u0442\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0431\u044b\u043b\u0430 \u043b\u0435\u0432\u0430\u044f \u0432\u0435\u0440\u0445\u043d\u044f\u044f, \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u2013 \u043b\u0435\u0432\u0430\u044f \u043d\u0438\u0436\u043d\u044f\u044f, \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439:<\/p>\n<pre><code>def contains_in_area(rectangle: np.ndarray, square: np.ndarray) -&gt; bool:     \"\"\"Checks whether a rectangle fully contains inside the area of a square.     Args:         rectangle (np.array): An ordered numpy array of a rectangle's coordinates.         square (np.array): An ordered numpy array of a square's coordinates.     Returns:         Whether the rectangle contains inside the square.  Since the both arrays are ordered it's suffice         to check that the top-left and the bottom-right points of the rectangle are both in the square.     \"\"\"      if ((rectangle[0][0] &lt; square[0][0]) or (rectangle[0][1] &lt; square[0][1])) or (         (rectangle[2][0] &gt; square[2][0]) or (rectangle[2][1] &gt; square[2][1])     ):         return False     return True <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b, \u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0448 \u043e\u0431\u044a\u0435\u043a\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f QR-\u043a\u043e\u0434\u043e\u043c, \u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f `cropped`) \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e detect_qr() \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6a7\/8cd\/f6e\/6a78cdf6e3c035520d097aa76ff0c942.jpg\" alt=\"\u0420\u0438\u0441. 4a). \u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u0430 \u0432 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u044d\u0444\u0438\u0440\u0430\" title=\"\u0420\u0438\u0441. 4a). \u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u0430 \u0432 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u044d\u0444\u0438\u0440\u0430\" width=\"644\" height=\"514\"><figcaption>\u0420\u0438\u0441. 4a). \u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u0430 \u0432 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u044d\u0444\u0438\u0440\u0430<\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2b9\/933\/f60\/2b9933f601658721463345d4bbf08e66.jpg\" alt=\"\u0420\u0438\u0441. 4\u0431). \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 `cropped`\" title=\"\u0420\u0438\u0441. 4\u0431). \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 `cropped`\" width=\"424\" height=\"454\"><figcaption>\u0420\u0438\u0441. 4\u0431). \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 `cropped`<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/080\/93c\/fc8\/08093cfc81e9c80e7140be4601a37ea3.jpg\" alt=\"\u0420\u0438\u0441. 4\u0432). \u041a\u043e\u043d\u0442\u0443\u0440 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0439 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 `edge`\" title=\"\u0420\u0438\u0441. 4\u0432). \u041a\u043e\u043d\u0442\u0443\u0440 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0439 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 `edge`\" width=\"644\" height=\"514\"><figcaption>\u0420\u0438\u0441. 4\u0432). \u041a\u043e\u043d\u0442\u0443\u0440 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0439 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 `edge`<\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f QR-\u043a\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u043c\u044b \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u043d\u0430\u0448\u0443 \u0431\u0430\u0437\u0443 (\u043d\u0430\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e QR-\u043a\u043e\u0434 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f `address`), \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u043a\u0430\u0437\u0435 \u0438 \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043f\u043e Telegram ID \u043a\u043b\u0438\u0435\u043d\u0442\u0430:<\/p>\n<pre><code>async def start(address: str, pause_success: int = 5, pause_fail: int = 1) -&gt; None:     \"\"\"Checks whether the :address: string contains in the set of all different addresses saved in the table.     If it does, gets the record containing :address: in its \"address\" field.     Sends the record to the notification function.     Args:         address (str): The decoded address to check the table with.         [optional] pause_success (int): Time in seconds to standby for after the notification was sent.         [optional] pause_fail (int): Time in seconds to standby for after detecting an invalid QR-code.     \"\"\"      try:         query_addresses = \"SELECT address FROM %s.%s;\"         curs.execute(             query_addresses             % (                 config.DB_UID,                 config.DB_TABLE_NAME,             )         )         response_addresses = curs.fetchall()         addresses = set([res[0] for res in response_addresses])         if not (address in addresses):             logger.warning('Address \"{}\" not found among the available addresses. Skipping', address)             logger.info(\"Standing by for {} second(s)\", pause_fail)             await asyncio.sleep(pause_fail)             return         query = \"SELECT * FROM %s.%s WHERE address='%s';\"         curs.execute(             query             % (                 config.DB_UID,                 config.DB_TABLE_NAME,                 address,             )         )         response = curs.fetchone()         logger.debug('Got response for address \"{}\": \"{}\"', address, response)     except sqlanydb.Error:         logger.exception(\"Encountered an error while handling query to the database. See below for the details\")         return     res_row = {}     for (i, field) in zip(range(len(response)), config.FIELDS):         res_row[field] = response[i]     await notify_user(res_row)     logger.info(\"Standing by for {} second(s)\", pause_success)     await asyncio.sleep(pause_success)  async def notify_user(row: Dict[str, str]) -&gt; None:     \"\"\"Sends a notification about the order contained in :row: to a user with a Telegram ID from :row:.     Args:         row (dict): A dict containing full record about the user's order.     \"\"\"      try:         user_id = row[\"telegram_id\"]         timestamp = datetime.now(pytz.timezone(row[\"timezone\"])).strftime(\"%d\/%m\/%Y %H:%M:%S %Z\")         lang = row.get(\"locale\", \"en_US\")         info = constants.MSG_NOTIFY_EN if lang.startswith(\"en\") else constants.MSG_NOTIFY_RU         info = info.format(             first_name=row[\"first_name\"],             timestamp=timestamp,             id=row[\"id\"],             address=row[\"address\"],             product=row[\"product\"],             model=row[\"model\"],             price=float(row[\"price\"]),             amount=row[\"amount\"],             weight=float(row[\"weight\"])         ).replace(\".\", \"\\.\").replace(\"-\", \"\\-\")     except KeyError:         logger.exception(\"Got invalid query response. See below for the details\")     try:         await bot.send_message(user_id, info)         logger.success(\"Order notification message has been successfully sent to user {}\", user_id)     except CantParseEntities as ex:         logger.error(\"Notification failed. AIOgram couldn't properly parse the following text:\\n\"                      \"\\\"{}\\\"\\n\"                      \"Exception: {}\",                      info, ex)     except ChatNotFound:         logger.error(\"Notification failed. User {} hasn\\'t started the bot yet\", user_id)     except BotBlocked:         logger.error(\"Notification failed. User {} has blocked the bot\", user_id)     except UserDeactivated:         logger.error(\"Notification failed. User {}\\'s account has been deactivated\", user_id)     except NetworkError:         logger.critical(\"Could not access https:\/\/api.telegram.org\/. Check your internet connection\") <\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u0447\u043a\u0430<\/p>\n<pre><code>timestamp = datetime.now(pytz.timezone(row[\"timezone\"])).strftime(\"%d\/%m\/%Y %H:%M:%S %Z\")<\/code><\/pre>\n<p>\u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044e \u0434\u0430\u0442\u044b \u043f\u0440\u0438\u0431\u044b\u0442\u0438\u044f \u0442\u043e\u0432\u0430\u0440\u0430 \u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0430 \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0442\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b \u0431\u043e\u0442\u0430 \u0438\u043b\u0438 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u0432\u043e\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432 Telegram.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 sqlanydb, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 sanitization SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041d\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0430 \u0444\u0438\u0447\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0440\u0435\u043b\u0438\u0437\u0430\u0445. \u0410 \u043f\u043e\u043a\u0430 \u043c\u044b \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 `start()` \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u00ab\u043a\u043e\u0441\u0442\u044b\u043b\u0451\u043c\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 `address` \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u0432\u0441\u0435\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c QR-\u043a\u043e\u0434\u0435 (\u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e) \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043d\u0435\u0447\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u00ab\u2019; DROP TABLE Orders;\u00bb, \u0442\u043e \u043d\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043d\u0435\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u043c\u0438.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0448 \u0431\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e QR-\u043a\u043e\u0434\u0430. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0434 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2d1\/2d7\/4dc\/2d12d74dcd341c6408b9652cf8700c60.jpg\" alt=\"\u0420\u0438\u0441. 5. \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u0442 \u0432 Telegram\" title=\"\u0420\u0438\u0441. 5. \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u0442 \u0432 Telegram\" width=\"1216\" height=\"751\"><figcaption>\u0420\u0438\u0441. 5. \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u0442 \u0432 Telegram<\/figcaption><\/figure>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u0430\u043c\u043e\u0433\u043e Telegram \u0431\u043e\u0442\u0430<\/h2>\n<p>\u041a\u0430\u043a \u043c\u044b \u043e\u0431\u0435\u0449\u0430\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u043c \u043e\u0441\u043e\u0431\u043e \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u0438. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/448310\/\">\u0431\u043e\u043b\u0435\u0435<\/a> <a href=\"https:\/\/habr.com\/ru\/post\/483660\/\">\u0447\u0435\u043c<\/a> <a href=\"https:\/\/habr.com\/ru\/post\/442800\/\">\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e<\/a> \u0441\u0442\u0430\u0442\u0435\u0439, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u044b\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0431\u043e\u0442\u043e\u0432 \u0432 Telegram (\u0445\u043e\u0442\u044f, \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u044e, \u0441\u0442\u0430\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 AIOgram \u043d\u0430 \u0425\u0430\u0431\u0440\u0435, \u043c\u044b \u043d\u0435 \u043d\u0430\u0448\u043b\u0438). \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u043b\u0438\u0448\u044c, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a AIOgram \u0438\u0437-\u0437\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0442\u043e \u043c\u044b \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u044d\u0442\u0438\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Telegram \u0431\u043e\u0442\u043e\u0432. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u0436\u0435 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u043b\u0438\u0448\u044c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u0445\u044d\u043d\u0434\u043b\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u0442\u043e\u0432\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \/lang:<\/p>\n<pre><code>@dp.message_handler(commands=[\"lang\"]) async def cmd_lang(message: Message) -&gt; None:     \"\"\"Handles the \"\/lang\" command from a Telegram user.  Allows the user to change the locale from the chosen one.     Outputs the message in the language that was initially chosen by the user.     Args:         message (Message): User's Telegram message that is sent to the bot.     \"\"\"      query = \"SELECT locale FROM %s.%s WHERE telegram_id=%d;\"     curs.execute(         query         % (             config.DB_UID,             config.DB_TABLE_NAME,             message.from_user.id,         )     )     (lang,) = curs.fetchone()     logger.debug('Got user\\'s {} current language \"{}\"', message.from_user.id, lang)     str_lang = \"Please choose your language\\.\" if lang.startswith(\"en\") else \"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044f\u0437\u044b\u043a\\.\"     btn_en = InlineKeyboardButton(\"?? English\", callback_data=\"lang_en\")     btn_ru = InlineKeyboardButton(\"?? \u0420\u0443\u0441\u0441\u043a\u0438\u0439\", callback_data=\"lang_ru\")     inline_kb = InlineKeyboardMarkup().add(btn_en, btn_ru)     await bot.send_message(message.chat.id, str_lang, reply_markup=inline_kb)     logger.info(\"User {} called \/lang\", message.from_user.id)  @dp.callback_query_handler(lambda c: c.data.startswith(\"lang\")) async def set_lang(cb_query: CallbackQuery) -&gt; None:     \"\"\"Handles the callback that sets the user preferred locale.  Updates the locale in the table.     Args:         cb_query (CallbackQuery): User's Telegram callback query that is sent to the bot.     \"\"\"      lang = \"en_US\" if cb_query.data.endswith(\"en\") else \"ru_RU\"     info = \"Setting your language...\" if lang.startswith(\"en\") else \"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e \u044f\u0437\u044b\u043a...\"     await bot.answer_callback_query(cb_query.id, text=info)     try:         query = \"UPDATE %s.%s SET locale='%s' WHERE telegram_id=%d;\"         curs.execute(             query             % (                 config.DB_UID,                 config.DB_TABLE_NAME,                 lang,                 cb_query.from_user.id,             )         )         logger.debug(\"Commiting the changes\")         conn.commit()     except sqlanydb.Error as ex:         logger.exception(ex)         return     str_setlang = (         \"Language is set to English\\.\\nCall \/lang to change it\\.\"         if lang.startswith(\"en\")         else \"\u0412\u0430\u0448 \u044f\u0437\u044b\u043a \u0420\u0443\u0441\u0441\u043a\u0438\u0439\\.\\n\u0412\u044b\u0437\u043e\u0432\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \/lang, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\\.\"     )     logger.info('User {} set the language to \"{}\"', cb_query.from_user.id, lang)     await bot.send_message(cb_query.from_user.id, str_setlang) <\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fa7\/bba\/e46\/fa7bbae4636c327aa5e19ee8028e2a6d.jpg\" alt=\"\u0420\u0438\u0441. 6. \u0417\u0430\u043f\u0443\u0441\u043a \u0431\u043e\u0442\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\" title=\"\u0420\u0438\u0441. 6. \u0417\u0430\u043f\u0443\u0441\u043a \u0431\u043e\u0442\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\" width=\"1216\" height=\"751\"><figcaption>\u0420\u0438\u0441. 6. \u0417\u0430\u043f\u0443\u0441\u043a \u0431\u043e\u0442\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 AIOgram <a href=\"https:\/\/docs.aiogram.dev\/en\/latest\/examples\/i18n_example.html\">\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442<\/a> \u0432 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u043e\u0442\u0430, \u043d\u043e \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 (\u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430 \u044f\u0437\u044b\u043a\u0430) \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c \u0444\u0440\u0430\u0437 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u00ab\u043d\u0435\u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0435\u043d\u043d\u043e\u0435\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0438\u0445 \u2013 \u044d\u0442\u043e ID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 Telegram, \u0430 \u043e\u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c.<\/p>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0448\u0430\u0433\u0438<\/h2>\n<p>\u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 SAP. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u043b\u0451\u043a \u043e\u0442 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u0441\u0442\u0438\u043a\u0443, \u043d\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0446\u0435\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0438 \u043d\u0435 \u0441\u0442\u043e\u044f\u043b\u043e. \u041c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0438\u0445 \u0441 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u043c \u0437\u0440\u0435\u043d\u0438\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c \u043a\u043b\u044e\u0447\u0435. \u041d\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u0448\u0430 \u0438\u0434\u0435\u044f \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0434\u044b.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0435\u0449\u0451 \u043b\u0435\u0442\u043e\u043c 2019 \u0433\u043e\u0434\u0430, \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0418, \u043a\u0430\u043a \u043c\u044b \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043d\u044b\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u044f\u043c\u0438 \u0441\u043b\u0443\u0436\u0431\u044b \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u0442\u044c \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 <a href=\"https:\/\/www.researchandmarkets.com\/reports\/5024095\/online-food-delivery-services-global-market\">\u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f<\/a> \u0438 <a href=\"https:\/\/www.researchandmarkets.com\/reports\/5136158\/conversational-ai-market-by-component-platform\">\u043f\u0440\u043e\u0433\u043d\u043e\u0437\u044b<\/a>, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0432 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0435\u0449\u0451 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d, \u0438 \u043e\u043d\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442 \u0431\u0443\u0440\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u0435\u0442.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0442\u043e\u0436\u0435 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u0432 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043c\u043e\u0433\u0443\u0442 \u0441\u0435\u0431\u044f \u043f\u0440\u043e\u044f\u0432\u0438\u0442\u044c. \u0421\u0430\u043c\u043e\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2013 \u044d\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0431\u043e\u0442\u0430 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441 <a href=\"https:\/\/www.sap.com\/products\/cloud-platform.html\">SAP Cloud Platform (SCP)<\/a>. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 <a href=\"https:\/\/cai.tools.sap\/\">Conversational AI<\/a> \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0442 \u0438 <a href=\"https:\/\/github.com\/gevartrix\/qr-notify-bot\">\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 Github<\/a>. \u041c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432 README \u0444\u0430\u0439\u043b\u0435, \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0443 \u0441\u0435\u0431\u044f. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0443 \u0432\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 issue \u0438\u043b\u0438 \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 pull request. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0434\u044b \u0432\u0430\u0448\u0435\u043c\u0443 \u0444\u0438\u0434\u0431\u044d\u043a\u0443!<\/p>\n<p><em>\u0410\u0432\u0442\u043e\u0440 &#8212; \u0410\u0440\u0442\u0435\u043c\u0438\u0439 \u0413\u0435\u0432\u043e\u0440\u043a\u043e\u0432, \u0441\u0442\u0430\u0436\u0451\u0440 \u043e\u0442\u0434\u0435\u043b\u0430 Co-Innovation Labs, SAP Labs CIS<\/em><\/p>\n<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/sap\/blog\/539262\/\"> https:\/\/habr.com\/ru\/company\/sap\/blog\/539262\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u0443\u0441\u043b\u0443\u0433\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432\u0441\u0451 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0438 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0444\u0435\u0440\u0435 \u043f\u0440\u0438\u043d\u0435\u0441\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u0443 \u043a\u0430\u043a \u0431\u0438\u0437\u043d\u0435\u0441\u0443, \u0442\u0430\u043a \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c. \u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043b\u043e\u0433\u0430 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0437\u0440\u0435\u043d\u0438\u044f \u0438 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0434\u043b\u044f <a href=\"https:\/\/habr.com\/ru\/company\/sap\/blog\/415657\/\">\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f<\/a> \u0446\u0435\u043d\u043d\u0438\u043a\u043e\u0432 \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0432 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f <a href=\"https:\/\/habr.com\/ru\/company\/sap\/blog\/523396\/\">\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f<\/a> \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0443\u044e\u0449\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u043c\u0435\u043d\u0435\u0435 \u0430\u043c\u0431\u0438\u0446\u0438\u043e\u0437\u043d\u043e\u0439 (\u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439) \u0437\u0430\u0434\u0430\u0447\u0435 \u2013 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u0438\u0445 \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0432 Telegram, QR-\u043a\u043e\u0434\u043e\u0432 \u0438 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 <a href=\"https:\/\/www.sap.com\/products\/sql-anywhere.html\">SAP SQL Anywhere<\/a>.&nbsp;<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0430\u0441\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445, \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u043b\u0438\u0448\u044c \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u043c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u043c. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043c\u044b \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0438\u0431\u0435\u0433\u043b\u0438 \u043a \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u0437\u0440\u0435\u043d\u0438\u044e, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 QR-\u043a\u043e\u0434\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 Telegram \u0431\u043e\u0442\u0430\u043c. \u041c\u044b \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043c\u0430 \u0431\u043e\u0442\u043e\u0432 \u0432 Telegram \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043d\u0435 \u0437\u0430\u043e\u0441\u0442\u0440\u044f\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 Telegram \u0438\u0437-\u0437\u0430 \u0435\u0433\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e API. \u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 Github \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0442\u0435\u043c\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 Telegram \u043f\u043e QR-\u043a\u043e\u0434\u0443 \u0441 live-\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u0438\u0445 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0442\u043e \u043c\u0438\u043b\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u0438\u043c \u043f\u043e\u0434 \u043a\u0430\u0442.  <\/p>\n<h2>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/h2>\n<p>\u041a\u0430\u043a \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u043e\u043d\u043b\u0430\u0439\u043d-\u0437\u0430\u043a\u0430\u0437\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043f\u043e e-mail, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u044b \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 \u0441\u0432\u043e\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u044b. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0442\u043e \u0442\u043e\u0436\u0435 \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u0442 \u0432 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0435 (\u00ab\u043f\u0440\u0438\u043d\u044f\u0442\u00bb, \u00ab\u043f\u0440\u0438\u0431\u044b\u043b \u043d\u0430 \u0441\u043a\u043b\u0430\u0434\u00bb, \u00ab\u0432\u0437\u044f\u0442 \u0441\u043e \u0441\u043a\u043b\u0430\u0434\u0430\u00bb, \u00ab\u0432 \u043f\u0443\u0442\u0438\u00bb \u0438 \u0442.\u0434.), \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u043a \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0435 \u0441\u043f\u0430\u043c\u0430 \u043f\u043e \u043f\u043e\u0447\u0442\u0435. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0432\u0430\u0436\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u00ab\u0443\u0440\u043e\u0432\u043d\u044f\u00bb \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u2013 \u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0441\u0432\u043e\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430 \u043e\u043d \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432\u043e\u0432\u0441\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442 \u043d\u0438\u0445 \u043e\u0442\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f. \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0435 \u043d\u0438\u0436\u0435, \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0431\u043e\u0442\u0430 \u043a \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u0435 \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u044d\u0444\u0438\u0440\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e QR-\u043a\u043e\u0434\u0430.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441. 1. \u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430<\/figcaption><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0443\u0441\u0442\u044c \u0437\u0430\u043a\u0430\u0437\u044b \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 SQL Anywhere, \u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u0441\u043d\u0430\u0449\u0451\u043d\u043d\u043e\u0435 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u043e\u0439 (Raspberry Pi \u0441 PiCam, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0435 \u043a \u044d\u0442\u043e\u0439 \u0431\u0430\u0437\u0435. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0447\u0442\u043e \u0437\u0430\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0442\u043e\u0432\u0430\u0440 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u0441\u043a\u043b\u0430\u0434. \u041d\u0430 \u0442\u043e\u0432\u0430\u0440\u0435 \u043d\u0430\u043a\u043b\u0435\u0435\u043d QR-\u043a\u043e\u0434, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043a\u0430\u0437 \u0432 \u0431\u0430\u0437\u0435. \u041c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e QR-\u043a\u043e\u0434 \u0442\u043e\u0432\u0430\u0440\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0441\u044f \u0432 \u043a\u0430\u0434\u0440\u0435 \u0441\u043a\u043b\u0430\u0434\u0441\u043a\u043e\u0439 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b, \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u0437\u0430\u043a\u0430\u0437\u0430\u0432\u0448\u0435\u043c\u0443 \u044d\u0442\u043e\u0442 \u0442\u043e\u0432\u0430\u0440, \u043e\u0442\u0441\u044b\u043b\u0430\u043b\u043e\u0441\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0432 Telegram \u043e \u043f\u0440\u0438\u0431\u044b\u0442\u0438\u0438 \u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430 \u043d\u0430 \u0441\u043a\u043b\u0430\u0434. \u041f\u0440\u0438\u0447\u0451\u043c \u0432 \u043d\u0451\u043c \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0437\u043e\u043d\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0442\u043e\u0432\u0430\u0440\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e QR-\u043a\u043e\u0434 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043d\u043e \u043e\u043d \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043a\u0430\u0437. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 QR-\u043a\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 (UPC, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440), \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0443\u0447\u0435\u0431\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0443. \u0412\u043e\u043e\u0431\u0449\u0435, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435\u043c QR-\u043a\u043e\u0434\u043e\u0432 \u0441 \u044d\u0444\u0438\u0440\u0430 \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u043e\u0442\u0441\u044b\u043b\u043a\u043e\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 Telegram, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 QR-\u043a\u043e\u0434\u043e\u0432.<\/p>\n<h2>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n<p>\u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0431\u043e\u0442\u0430 \u043d\u0430 Python, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <a href=\"https:\/\/github.com\/aiogram\/aiogram\">AIOgram<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <a href=\"https:\/\/core.telegram.org\/bots\/api\">Telegram Bot API<\/a> \u0438 <a href=\"https:\/\/github.com\/sqlanywhere\/sqlanydb\">sqlanydb<\/a> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f SQL Anywhere. \u0414\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u043e\u0439, \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 QR-\u043a\u043e\u0434\u043e\u0432 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 <a href=\"https:\/\/github.com\/skvark\/opencv-python\">OpenCV<\/a> \u0438 <a href=\"https:\/\/numpy.org\/\">NumPy<\/a>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0451\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<p>\u00b7&nbsp;\u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 SQL Anywhere (\u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u044c sqlanydb);<\/p>\n<p>\u00b7&nbsp;\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0442\u0440\u0438\u043c\u0443 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b, \u043f\u043e\u0438\u0441\u043a \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 QR-\u043a\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043d\u0451\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f (\u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u0438 OpenCV \u0438 NumPy);<\/p>\n<p>\u00b7&nbsp;\u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0430\u043c\u043e\u0433\u043e Telegram \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 (\u0447\u0435\u0440\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a AIOgram).<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 SQL Anywhere<\/h2>\n<p>SAP \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0421\u0423\u0411\u0414 SQL Anywhere. \u0421\u0440\u0435\u0434\u0438 \u0435\u0451 \u043f\u043b\u044e\u0441\u043e\u0432 \u2013 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043d\u0438\u0437\u043a\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c. \u041c\u044b \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b\u0438 \u0435\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0432\u044b\u0431\u043e\u0440 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0430\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0435\u0451.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0430\u043c \u0444\u0430\u0439\u043b \u0441 \u0431\u0430\u0437\u043e\u0439. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0443 <a href=\"https:\/\/help.sap.com\/viewer\/61ecb3d4d8be4baaa07cc4db0ddb5d0a\/17.0\/en-US\/3bc8f4f76c5f1014b7e0e816307e4ca4.html\">dbinit<\/a>:<\/p>\n<pre><code>dbinit -dba admin,password123 -p 4k -z UTF8 -ze UTF8 -zn UTF8 orders.db<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u00abadmin\u00bb (\u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u00abpassword123\u00bb), \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 4 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u0430 \u0438 \u0441\u0445\u0435\u043c\u043e\u0439, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 UTF-8. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u00aborders.db\u00bb \u0447\u0435\u0440\u0435\u0437 SQL Central (\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 SQL Anywhere) \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u0430\u0437\u043e\u0432. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c:<\/p>\n<pre><code>CREATE TABLE Orders (     -- ID of an order     id UNSIGNED INT PRIMARY KEY NOT NULL IDENTITY,     -- Product's name     product NVARCHAR(24) NOT NULL,     -- Product's model     model NVARCHAR(20),     -- Product's price (in Euros)     price DECIMAL(10,2) NOT NULL,     -- Amount of the product     amount UNSIGNED INT NOT NULL DEFAULT 1,     -- Weight of the product (in kilograms)     weight DECIMAL(8,3) NOT NULL,     -- Customer's first name     first_name NVARCHAR(16) NOT NULL,     -- Customer's last name     last_name NVARCHAR(20),     -- Customer's physical address     address NVARCHAR(48) NOT NULL,     -- Customer's Telegram ID     telegram_id UNSIGNED INT NOT NULL,     -- Customer's timezone     timezone NVARCHAR(16) DEFAULT 'UTC',     -- Customer's prefered locale     locale NVARCHAR(5) DEFAULT 'en_US' ); <\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043a\u0430\u0437\u0430 \u0432 \u0442\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:   <\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441. 2. \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u043a\u0430\u0437\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 Orders<\/figcaption><\/figure>\n<p>\u042d\u0442\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u044c sqlanydb: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0448\u0438 credentials (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 admin \u043a\u0430\u043a UID \u0438 password123 \u043a\u0430\u043a \u043f\u0430\u0440\u043e\u043b\u044c) \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b (\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043c \u0432 .env \u0444\u0430\u0439\u043b\u0435 \u0438 \u043f\u043e\u0434\u0446\u0435\u043f\u043b\u044f\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/github.com\/theskumar\/python-dotenv\">dotenv<\/a>). \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u0431\u043e\u0442\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 Orders:<\/p>\n<pre><code>conn = sqlanydb.connect(uid=config.DB_UID, pwd=config.DB_PASSWORD) curs = conn.cursor()<\/code><\/pre>\n<h2>\u041f\u043e\u0438\u0441\u043a \u0438 \u0430\u043d\u0430\u043b\u0438\u0437 QR-\u043a\u043e\u0434\u043e\u0432 \u0441 \u044d\u0444\u0438\u0440\u0430<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u043e\u0442 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043d\u0430 \u044d\u0444\u0438\u0440\u0435:<\/p>\n<pre><code>cap = cv2.VideoCapture(0)<\/code><\/pre>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0437\u0430 \u0440\u0435\u043d\u0434\u0435\u0440 UI \u043d\u0430 \u043e\u043a\u043d\u0435 \u0441 \u044d\u0444\u0438\u0440\u043e\u043c, \u043f\u043e\u0438\u0441\u043a \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 QR-\u043a\u043e\u0434\u043e\u0432 \u043d\u0430 \u044d\u0444\u0438\u0440\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e QR-\u043a\u043e\u0434\u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435.<\/p>\n<pre><code>async def scan_qr(area: int = 300, color: int = 196, side: int = 240, lang: str = \"en\", debug: bool = False) -&gt; None:     \"\"\"Main function that creates a screen with the capture, monitors the web-cam's stream, searches for a QR-code in a squared area and passes the decoded QR-code to the notify module.     Args:         [optional] area (int): Minimal area of a detected object to be consider a QR-code.         [optional] color (int): Minimal hue of gray of a detected object to be consider a QR-code.         [optional] side (int): Length of the side of a square to be drawn in the center of the screen.         [optional] lang (str): Language of a text to be written above the square.         [optional] debug (bool): Crops and outputs an image containing inside the square at potential detection.     \"\"\"      if (cap is None) or (not cap.isOpened()):         logger.critical(\"No video stream detected. \"                         \"Make sure that you've got a webcam connected and enabled\")         return     kernel = np.ones((2, 2), np.uint8)     square = create_square(cap.read()[1], side=side)     while cap.isOpened():         ret, frame = cap.read()         key = cv2.waitKey(1)         if not ret or square is None or ((key &amp; 0xFF) in {27, ord(\"Q\"), ord(\"q\")}):             exit(1)         image = draw_bounds(frame, square, lang=lang)         detected, cropped = detect_inside_square(frame, square, kernel, area_min=area, color_lower=color, debug=debug)         if detected:             address = detect_qr(cropped)             if address:                 logger.debug(\"Detected: \\\"{}\\\"\", address)                 await notify.start(address)         cv2.imshow(\"Live Capture\", image)         await asyncio.sleep(0.1)  <\/code><\/pre>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u044f\u0441\u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0421\u043f\u0435\u0440\u0432\u0430 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043e\u043d\u0430 \u0436\u0435 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u0430) \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u043c OpenCV. \u0417\u0430\u0442\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0441\u043b\u0435\u0434\u0438\u043c, \u0447\u0442\u043e\u0431\u044b QR-\u043a\u043e\u0434 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u0430\u0434\u0440\u0430 (\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435), \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u043f\u0430\u0440 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 (x, y) \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 `side` \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 create_square(). \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 draw_bounds() \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043c \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043a\u0430\u0434\u0440\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0441\u043a\u043e\u043c\u043e\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 `lang`. \u0422\u043e \u0435\u0441\u0442\u044c, draw_bounds() \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0442\u0440\u0438\u043c\u0430 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 UI:<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441. 3. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 `draw_bounds`<\/figcaption><\/figure>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u044d\u0444\u0438\u0440\u0430 \u0438 \u043f\u043e\u0438\u0441\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e \u043d\u0430 QR-\u043a\u043e\u0434 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 detect_inside_square(): <\/p>\n<pre><code>def detect_inside_square(frame: Any, square: np.ndarray, kernel: np.ndarray, area_min: int = 300, color_lower: int = 212, color_upper: int = 255, debug: bool = False) -&gt; Tuple[bool, Any]:     \"\"\"Detects and analyzes contours and shapes on the frame.  If the detected shape's area is &gt;= :area_min:, its color hue is &gt;= :color_lower and a rectangle that encloses the shape contains inside the square returns True and the cropped image of the frame.     Args:         frame (Union[Mat, UMat]): A frame of the webcam's captured stream.         square (np.ndarray): A numpy array of the square's (x,y)-coordinates on the frame.         kernel (np.ndarray): A kernel for the frame dilation and transformation (to detect contours of shapes in the frame).         [optional] area_min (int): Minimal area of a detected object to be consider a QR-code. <\/code><\/pre>\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-316953","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/316953","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=316953"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/316953\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=316953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=316953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=316953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}