{"id":355053,"date":"2024-05-20T23:00:45","date_gmt":"2024-05-20T23:00:45","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=355053"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=355053","title":{"rendered":"<span>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0438\u0437 \u0447\u0435\u043a\u0430 \u0418\u0424\u041d\u0421 (Raspberry + FreePBX + telegram + sheets)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u0435 \u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b. \u0420\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e &#8212; \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u0435\u0451 \u0446\u0435\u043d\u0430 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0447\u0430\u0442\u0438\u043a, \u043f\u043e\u0442\u043e\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043b\u043e\u0441\u044c \u0432 google sheets. \u041f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432 google sheets \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 python \u0438 google-api, \u043d\u043e \u0442.\u043a. \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0432 \u0447\u0435\u043a\u0435 \u043c\u043e\u0433\u043b\u043e \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 10 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0434\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0431\u0449\u0435\u0439 \u0442\u0438\u043f\u0430 &#171;\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b&#187; (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u0449\u0435\u0439 \u0441\u0443\u043c\u043c\u044b \u0447\u0435\u043a\u0430, \u0447\u0442\u043e \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0433\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f, \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u043e\u0432\u0430\u0440\u0430\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e qr-\u043a\u043e\u0434\u0430 \u0438 API \u0418\u0424\u041d\u0421.<\/p>\n<p>\u0412 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043a \u0441\u0435\u0442\u0438 \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 Raspberry PI \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c FreeBPX (\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043f\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/550734\/\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>) \u0441 \u043c\u043e\u0434\u0435\u043c\u043e\u043c E1550, \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0448\u0438\u0442\u044b\u043c \u043d\u0430 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435.<\/p>\n<p>\u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Raspberry \u0438 \u043c\u043e\u0434\u0435\u043c \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442, \u043c\u043e\u0433\u0443\u0442 \u0437\u0432\u043e\u043d\u0438\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0421\u041c\u0421. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0438\u0437 \u0447\u0435\u043a\u0430.<\/p>\n<p>\u0418\u0424\u041d\u0421 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u043f\u0443\u0442\u044f\u043c\u0438: 1) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c API-\u043a\u043b\u044e\u0447 (\u0438 \u0442\u043e\u0433\u0434\u0430 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043c\u043e\u0434\u0435\u043c\u0430); 2) \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0421\u041c\u0421.<\/p>\n<p>\u0422.\u043a. \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043c \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0421\u041c\u0421, \u0438\u0434\u0443 \u043f\u043e \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0443\u0442\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439: \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0430\u0439\u0442 \u043d\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u043c\u0441 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0447\u0435\u043a\u0430 \u0438 \u043a\u043e\u0434\u043e\u043c \u0438\u0437 \u0441\u043c\u0441, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c JSON \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0447\u0435\u043a\u0430, \u0435\u0441\u043b\u0438 \u0447\u0435\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u0418\u0424\u041d\u0421, \u043b\u0438\u0431\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0435\u0441\u043b\u0438 \u0447\u0435\u043a\u0430 \u043d\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0435\u0439 \u0441\u0445\u0435\u043c\u044b: <\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 qr-\u043a\u043e\u0434 \u0441 \u0447\u0435\u043a\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 qr-\u043a\u043e\u0434\u0430 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0447\u0430\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0431\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u043e\u043c \u0438, \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u043d\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e, \u043f\u0440\u043e\u0445\u043e\u0434\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0421\u041c\u0421, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 google sheets;<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f QR-\u043a\u043e\u0434\u043e\u043c, \u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 google sheets.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 <a href=\"https:\/\/leftjoin.ru\/all\/nalog-ru-client\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u0430 <a href=\"https:\/\/github.com\/valiotti\/get-receipts\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a>.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u0433\u0438\u0442\u0445\u0430\u0431\u0430 \u0431\u044b\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043f\u043e\u0434 \u043c\u043e\u0438 \u043d\u0443\u0436\u0434\u044b, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0440\u043e\u043a\u0430 \u0436\u0438\u0437\u043d\u0438 \u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435  \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u043a\u043e\u0432 \u043f\u043e\u0434\u0440\u044f\u0434. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0421\u041c\u0421-\u043a\u043e\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 120 \u0441\u0435\u043a\u0443\u043d\u0434. <\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0436\u0438\u0432 \u043b\u0438 \u043a\u043e\u0434 \u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u0438?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 <code>check_sms<\/code>. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u043e \u0442\u0430\u043a: \u0434\u0435\u043b\u0430\u0435\u043c post-\u0437\u0430\u043f\u0440\u043e\u0441, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u0440\u0430\u043d\u0435\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e (\u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0431\u044b\u043b) \u043a\u043e\u0434\u0430:<\/p>\n<ul>\n<li>\n<p>429 &#8212; \u043a\u043e\u0434 \u0435\u0441\u0442\u044c \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u0430\u043a\u0436\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0435\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 (\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 120);<\/p>\n<\/li>\n<li>\n<p>204 &#8212; \u043a\u043e\u0434 \u0443\u0441\u0442\u0430\u0440\u0435\u043b, \u043b\u0438\u0431\u043e \u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e asterisk \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043c\u0441 \u0432  \u0444\u0430\u0439\u043b <code>\/var\/log\/asterisk\/sms.txt<\/code>. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043c\u0441 \u0432 \u0431\u0430\u0437\u0443 asteriskcdrdb, \u0430 \u043f\u043e\u0442\u043e\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043c\u0441 \u043e\u0442\u0442\u0443\u0434\u0430, \u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b &#8212; \u0434\u0435\u043b\u043e 1 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0431\u0430\u0437\u0443 \u0447\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>\u0422.\u043a. \u044f \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u0442\u043e \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u043e\u0434, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043a\u0443\u0447\u0443 print \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438 \u043a\u0430\u043a\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430 \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0446\u0435\u043b\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>nalog-python.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import json import time import requests import os from datetime import datetime  class NalogRuPython:     HOST = 'irkkt-mobile.nalog.ru:8888'     DEVICE_OS = 'iOS'     CLIENT_VERSION = '2.9.0'     DEVICE_ID = '7C82010F-16CC-446B-8F66-FC4080C66521'     ACCEPT = '*\/*'     USER_AGENT = 'billchecker\/2.9.0 (iPhone; iOS 13.6; Scale\/2.00)'     ACCEPT_LANGUAGE = 'ru-RU;q=1, en-US;q=0.9'     CLIENT_SECRET = 'IyvrAbKt9h\/8p6a7QPh8gpkXYQ4='     OS = 'Android'      def __init__(self):         self.__session_id = None         self.check_sms()         self.set_session_id()      def check_sms(self): #\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0440\u043e\u043a\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0434\u0430 \u0438\u0437 \u0441\u043c\u0441 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u043e\u0432\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0440\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437 \u0441\u043c\u0441 \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 #        \"\"\" #        Authorization using phone and SMS code #        \"\"\"         self.__phone = str('+71234567890') #\u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0441 (asterisk freePBX)          url = f'https:\/\/{self.HOST}\/v2\/auth\/phone\/request'         payload = {             'phone': self.__phone,             'client_secret': self.CLIENT_SECRET,             'os': self.OS         }         headers = {             'Host': self.HOST,             'Accept': self.ACCEPT,             'Device-OS': self.DEVICE_OS,             'Device-Id': self.DEVICE_ID,             'clientVersion': self.CLIENT_VERSION,             'Accept-Language': self.ACCEPT_LANGUAGE,             'User-Agent': self.USER_AGENT,         }          r = requests.post(url, json=payload, headers=headers) #\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u0440\u043e\u043a\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0434\u0430 (\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b - \u0435\u0441\u0442\u044c \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f (\u043d\u0435 \u0431\u043e\u043b\u0435\u0435 120 \u0441\u0435\u043a)  \u0438\u043b\u0438 \u043d\u0435\u0442 (\u0448\u043b\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0442\u043e\u0433\u0434\u0430))         print (datetime.now())  ################### \u0421\u041c\u0421 \u043a\u043e\u0434 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d ###################################################### #\u0441\u0442\u0430\u0442\u0443\u0441-\u043a\u043e\u0434 - 204 - \u043a\u043e\u0434 \u043d\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439, 429 - \u043a\u043e\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439         print (\"status code: \" + str(r.status_code))  #\u043e\u0442\u0432\u0435\u0442\u043d\u044b\u0435 headers - \u0432\u0440\u0435\u043c\u044f, \u0434\u043e \u043a\u0430\u043a\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u0434 \u0438\u0437 \u0441\u043c\u0441, \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u0435\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0432\u0440\u0435\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0435         print ('headers: ' + str(r.headers))  # \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0434\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0435\u0441\u044f         time_left = int(r.headers ['Retry-After']) # \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0435\u0449\u0451 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u0434 \u0438\u0437 \u0421\u041c\u0421         print (\"time_left: \" + str(time_left))          if r.status_code == 204: # \u0415\u0441\u043b\u0438 \u043a\u043e\u0434\u0430 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0431\u044b\u043b\u043e (\u0431\u043e\u043b\u0435\u0435 120 \u0441\u0435\u043a.), \u0442\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0421\u041c\u0421            print (\"\u043a\u043e\u0434 \u0443\u0441\u0442\u0430\u0440\u0435\u043b, \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u043d\u043e\u0432\u044b\u0439\")            time.sleep(10) # \u0436\u0434\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0441\u043c\u0441         elif r.status_code == 429 and time_left &lt;5: # \u0435\u0441\u043b\u0438 \u043a\u043e\u0434 \u0435\u0441\u0442\u044c, \u043d\u043e \u0447\u0435\u0440\u0435\u0437 5 \u0441\u0435\u043a \u043e\u043d \u0443\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u0436\u0434\u0435\u043c 6 \u0441\u0435\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439            time.sleep(6)            self.check_sms()         elif r.status_code == 429 and time_left >=5: # \u0435\u0441\u043b\u0438 \u043a\u043e\u0434 \u0435\u0441\u0442\u044c \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 5 \u0441\u0435\u043a, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e  #\u0447\u0438\u0442\u0430\u0435\u043c \u0421\u041c\u0421 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430         f_read = open(\"\/var\/log\/asterisk\/sms.txt\", \"r\") #\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f         last_line = f_read.readlines()[-1] # \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u043a\u0443         print (last_line)         #\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438: \"2023-09-15 21:09:02 - dongle0 - KKT.NALOG: \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u043a\u043e\u0432 \u0424\u041d\u0421 \u0420\u043e\u0441\u0441\u0438\u0438. \u041a\u043e\u0434: 2872\"         f_read.close() #\u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b          sms_lst = last_line.split(' - ')[2] # \u0434\u0435\u043b\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u0432 \u0432\u0438\u0434\u0435 \" - \" (\u043f\u0440\u043e\u0431\u0435\u043b \u043c\u0438\u043d\u0443\u0441 \u043f\u0440\u043e\u0431\u0435\u043b)         print (\"sms last: \" + sms_lst)          self.__code = sms_lst.strip().split(': ')[2] # \u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u0442\u0440\u0435\u0442\u0438\u0439) \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b         print (\"code: -\" + self.__code + \"-\") # \u043c\u0438\u043d\u0443\u0441\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0442 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u0440: -0123- #################### \u043f\u043e\u0448\u043b\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u0436\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c ######################################        def set_session_id(self) -> None:         print ('session_id')         url = f'https:\/\/{self.HOST}\/v2\/auth\/phone\/verify' #\u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0436\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c         payload = {         'phone': self.__phone,         'client_secret': self.CLIENT_SECRET,         'code': self.__code,         \"os\": self.OS         }          headers = {             'Host': self.HOST,             'Accept': self.ACCEPT,             'Device-OS': self.DEVICE_OS,             'Device-Id': self.DEVICE_ID,             'clientVersion': self.CLIENT_VERSION,             'Accept-Language': self.ACCEPT_LANGUAGE,             'User-Agent': self.USER_AGENT,         }           resp = requests.post(url, json=payload, headers=headers)          print ('headers: ')         print (resp.headers)         print ('status: ')         print (resp.status_code)          self.__session_id = resp.json()['sessionId']         self.__refresh_token = resp.json()['refresh_token']      def refresh_token_function(self) -> None:         print ('refresh_token_function')         url = f'https:\/\/{self.HOST}\/v2\/mobile\/users\/refresh'         payload = {             'refresh_token': self.__refresh_token,             'client_secret': self.CLIENT_SECRET         }          headers = {             'Host': self.HOST,             'Accept': self.ACCEPT,             'Device-OS': self.DEVICE_OS,             'Device-Id': self.DEVICE_ID,             'clientVersion': self.CLIENT_VERSION,             'Accept-Language': self.ACCEPT_LANGUAGE,             'User-Agent': self.USER_AGENT,         }          resp = requests.post(url, json=payload, headers=headers)          self.__session_id = resp.json()['sessionId']         self.__refresh_token = resp.json()['refresh_token']      def _get_ticket_id(self, qr: str) -> str: #        \"\"\" #        Get ticker id by info from qr code #        :param qr: text from qr code. Example \"t=20200727T174700&amp;s=746.00&amp;fn=9285000100206366&amp;i=34929&amp;fp=3951774668&amp;n=1\" #        :return: Ticket id. Example \"5f3bc6b953d5cb4f4e43a06c\" #        \"\"\"         url = f'https:\/\/{self.HOST}\/v2\/ticket'         payload = {'qr': qr}         headers = {             'Host': self.HOST,             'Accept': self.ACCEPT,             'Device-OS': self.DEVICE_OS,             'Device-Id': self.DEVICE_ID,             'clientVersion': self.CLIENT_VERSION,             'Accept-Language': self.ACCEPT_LANGUAGE,             'sessionId': self.__session_id,             'User-Agent': self.USER_AGENT,         }          resp = requests.post(url, json=payload, headers=headers)          return resp.json()[\"id\"]      def get_ticket(self, qr: str) -> dict: #        \"\"\" #        Get JSON ticket #        :param qr: text from qr code. Example \"t=20200727T174700&amp;s=746.00&amp;fn=9285000100206366&amp;i=34929&amp;fp=3951774668&amp;n=1\" #        :return: JSON ticket #        \"\"\"         ticket_id = self._get_ticket_id(qr)         url = f'https:\/\/{self.HOST}\/v2\/tickets\/{ticket_id}'         headers = {             'Host': self.HOST,             'sessionId': self.__session_id,             'Device-OS': self.DEVICE_OS,             'clientVersion': self.CLIENT_VERSION,             'Device-Id': self.DEVICE_ID,             'Accept': self.ACCEPT,             'User-Agent': self.USER_AGENT,             'Accept-Language': self.ACCEPT_LANGUAGE,             'Content-Type': 'application\/json'         }          resp = requests.get(url, headers=headers)         print (datetime.now())          return resp.json()<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0431\u043e\u0442 (\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e,- \u0432 \u0441\u0435\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0430\u043d\u0443\u0430\u043b\u043e\u0432), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u0435\u0441\u0442\u044c \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0447\u0430\u0442, \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 &#171;\u0440\u0430\u0441\u0445\u043e\u0434;\u0441\u0443\u043c\u043c\u0430&#187; (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <code>\u043f\u0438\u0440\u043e\u0433;100<\/code>), \u043b\u0438\u0431\u043e \u0442\u0435\u043a\u0441\u0442 qr-\u043a\u043e\u0434\u0430 \u0441 \u0447\u0435\u043a\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <code>t=20200924T1837&amp;s=349.93&amp;fn=9282440300682838&amp;i=46534&amp;fp=1273019065&amp;n=1<\/code>).<\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 qr-\u043a\u043e\u0434, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432 google sheets, \u0430 \u0435\u0441\u043b\u0438 qr-\u043a\u043e\u0434, \u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u0430 \u0432 google sheets \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u0432\u0430\u0440\u0430\u0445.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c:<\/p>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u0434\u0430\u0451\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">#sheets import gspread from oauth2client.service_account import ServiceAccountCredentials  #\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0431\u043e\u0442 import telebot import time import datetime import json from nalog_python import NalogRuPython # \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u043d\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0441\u043c\u0441, \u0431\u0435\u0440\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u043c\u0441 \u0438 \u0441 \u043d\u0438\u043c\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u043a\u0430  #\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0444\u043e\u0442\u043e \u0447\u0435\u043a\u043e\u0432 (\u0431\u0435\u0440\u0435\u0442 \u0444\u043e\u0442\u043e \u0447\u0435\u043a\u0430 \u0438 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0441 \u043d\u0435\u0433\u043e qr-\u043a\u043e\u0434, \u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0433 \u0435\u0433\u043e \u043d\u0430\u0439\u0442\u0438, \u043b\u0438\u0431\u043e \u0432\u044b\u0434\u0430\u0451\u0442 error) import photo5   # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u043e\u0442\u0430 bot = telebot.TeleBot('\u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430') <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422.\u043a. \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432 google sheets, \u0442\u043e \u0434\u0430\u043b\u0435\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u043d\u0430 \u0444\u0430\u0439\u043b json \u0441 \u043a\u043b\u044e\u0447\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 google sheets (\u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432\u043e\u0442 <a href=\"https:\/\/console.cloud.google.com\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>).<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 google sheets<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">#\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c #\u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438: Date, chatID, chat_username, chat_title, username, firstname, lastname, message, (reply src msg), fileName, fileUrl, e sheet_url = 'https:\/\/docs.google.com\/spreadsheets\/d\/sdfsdhbetretr4324dsarf' #\u0440\u0430\u0431\u043e\u0447\u0438\u0439  #\u0447\u0442\u043e-\u0442\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 API google scope = [\"https:\/\/spreadsheets.google.com\/feeds\",'https:\/\/www.googleapis.com\/auth\/spreadsheets',\"https:\/\/www.googleapis.com\/auth\/drive.file\",\"https:\/\/www.googleapis.com\/auth\/drive\"]  #\u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0441 API (json) \u0433\u0443\u0433\u043b console.cloud.google.com credentials = ServiceAccountCredentials.from_json_keyfile_name('\/home\/qr\/filename.json', scope)  # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 google gc = gspread.authorize(credentials)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f,\u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043e\u043d\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u043c qr-\u043a\u043e\u0434\u0430 \u0441 \u0447\u0435\u043a\u0430, \u0442.\u0435. \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u0441 <code>t=202<\/code><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0447\u0435\u043c\u0443 &#171;t=202&#187;<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0415\u0441\u043b\u0438 \u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c qr-\u043a\u043e\u0434 c \u0447\u0435\u043a\u0430, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0442\u0438\u043f\u0430 \u0442\u0430\u043a\u043e\u0433\u043e:<\/p>\n<p><code>t=20200924T1837&amp;s=349.93&amp;fn=9282440300682838&amp;i=46534&amp;fp=1273019065&amp;n=1<\/code>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439, \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u043a\u043e\u043c &#171;&amp;&#187;, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e:<br \/>\u0434\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f (\u0433\u0433\u0433\u0433\u043c\u043c\u0434\u0434\u0422\u0447\u0447\u043c\u043c): <code>t=20200924T1837<\/code><br \/>\u0441\u0443\u043c\u043c\u0430 \u0447\u0435\u043a\u0430: <code>s=349.93<\/code><br \/>\u043d\u043e\u043c\u0435\u0440 \u0444\u0438\u0441\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u043a\u043e\u043f\u0438\u0442\u0435\u043b\u044f (\u0424\u041d): <code>fn=9282440300682838<\/code><br \/>\u043d\u043e\u043c\u0435\u0440 \u0444\u0438\u0441\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 (\u0424\u0414): <code>i=46534<\/code><br \/>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0438\u0441\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430 (\u0424\u041f): <code>fp=1273019065<\/code><br \/>\u0442\u0438\u043f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (<strong>\u043f\u0440\u0438\u0445\u043e\u0434<\/strong>\/\u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0430\/\u0440\u0430\u0441\u0445\u043e\u0434\/\u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0430): <code>n=1<\/code><\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0441\u0435 qr-\u043a\u043e\u0434\u044b \u0447\u0435\u043a\u043e\u0432 \u0434\u043e 31.12.2029 \u0433\u043e\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 <code>t=202<\/code><\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u043e\u043c?<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0442 \u044e\u0437\u0435\u0440\u0430 @bot.message_handler(content_types=[\"text\"]) def handle_text(message):     print (message.text) # \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f     qr_code = message.text # \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0441\u043b\u0430\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 qr \u043a\u043e\u0434 \u0441 \u0447\u0435\u043a\u0430     time1 = datetime.datetime.now().strftime('%d.%m.%Y') #\u0434\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0434\u043b\u044f sheets \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443     sht2 = gc.open_by_url(sheet_url_my).get_worksheet(0) #\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0433\u0443\u0433\u043b-\u0442\u0430\u0431\u043b\u0438\u0446\u0443      if qr_code.startswith(\"t=202\"): #\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0442\u0430\u043a \u043b\u0438 \u044d\u0442\u043e (qr-\u043a\u043e\u0434 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 t=202 \u043f\u0440\u0438\u043c\u0435\u0440: t=20220110T1730&amp;s=56998.00&amp;fn=9960440301285687&amp;i=93230&amp;fp=3805313241&amp;n=1         print ('\u042d\u0442\u043e qr-\u043a\u043e\u0434')<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0415\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0418\u0424\u041d\u0421<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">        client = NalogRuPython() # \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0441\u0430\u0439\u0442\u0443 \u0438\u0444\u043d\u0441         ticket = client.get_ticket(qr_code) # \u0434\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0438\u0444\u043d\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0447\u0435\u043a\u0430         dictData = json.loads(json.dumps(ticket, indent=4, ensure_ascii=False)) # \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0447\u0435\u043a\u0430<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0447\u0435\u043a \u0432 \u0431\u0430\u0437\u0435 \u0418\u0424\u041d\u0421 (\u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u0435\u0449\u0451 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c) \u0438 \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043f\u0430\u0440\u0441\u0438\u043c \u043e\u0442\u0432\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u043c \u0432 google sheets \u0438 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c. \u041d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c (\u043e\u043f\u044b\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e 5 \u0441\u0435\u043a\u0443\u043d\u0434 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e).<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0435\u043a, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">        if \"ticket\" in dictData: #\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u0432\u0430\u0440\u0430\u0445 (\u0440\u0430\u0437\u0434\u0435\u043b ticket), \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0447\u0435\u043a \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u0418\u0424\u041d\u0421             for each in dictData[\"ticket\"][\"document\"][\"receipt\"][\"items\"]: # \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u043e\u0432\u0430\u0440\u0430 \u0438\u0437 \u0447\u0435\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0438\u043c\u044f, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e, \u0446\u0435\u043d\u0443 \u0437\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 (\u0434\u0435\u043b\u0438\u043c \u0435\u0451 \u043d\u0430 100, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u0440\u0443\u0431.), \u0441\u0443\u043c\u043c\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (\u0442\u043e\u0436\u0435 \u0434\u0435\u043b\u0438\u043c)                 name = str(each['name']).replace(';',',') # \u0438\u043c\u044f \u0442\u043e\u0432\u0430\u0440\u0430, \u043c\u0435\u043d\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432 \u0438\u043c\u0435\u043d\u0438 \u043d\u0430 \u0437\u0430\u043f\u044f\u0442\u0443\u044e                 quantity = str(each['quantity']).replace('.',',') # \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0447\u043a\u0438                 itemprice = str((float(each['price']))\/100).replace('.',',') # \u0446\u0435\u043d\u0430 \u0432 \u043a\u043e\u043f\u0435\u0439\u043a\u0430\u0445                 itemsum = str((float(each['sum']))\/100).replace('.',',') # \u0441\u0443\u043c\u043c\u0430 \u0432 \u043a\u043e\u043f\u0435\u0439\u043a\u0430\u0445 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0447\u043a\u0438                 msg1 = name + \";\" + itemsum + \";\" + str(quantity) + \";\" + itemprice + \";\" + dictData[\"organization\"][\"name\"] # \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0432\u0438\u0434 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c                 report_line = [str(time1), message.chat.id, message.chat.username, message.chat.title, message.from_user.username, message.from_user.first_name, message.from_user.last_name, msg1, \"\", \"\", \"\", \"\", qr_code] #\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 sheets                 sht2.append_row(report_line, table_range='A1') # \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 sheets                 bot.send_message(message.chat.id, name + \" (\u043a\u043e\u043b\u0432\u043e: \" + str(quantity) + \")\" + \";\" + itemsum + \"(\u0426\u0435\u043d\u0430 \u0437\u0430 \u0435\u0434.: \" + itemprice + \")\") # \u0448\u043b\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0447\u0430\u0442 (\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0443\u043c\u043c\u0430)                 time.sleep(5) # \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c - \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 20 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443 \u0432 \u043e\u0434\u0438\u043d \u0447\u0430\u0442 (\u0438\u043b\u0438 \u0442\u0438\u043f\u0430 \u0442\u043e\u0433\u043e)                 print ('goods were written')<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0447\u0435\u043a\u0435 \u043d\u0435\u0442 \u0432 \u0418\u0424\u041d\u0421, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 qr-\u043a\u043e\u0434\u0430 \u0447\u0435\u043a\u0430 \u0432 \u043b\u0438\u0441\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 (\u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0436\u0443) \u0434\u0432\u0430\u0436\u0434\u044b \u0432 \u0434\u0435\u043d\u044c \u044d\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442.<\/p>\n<details class=\"spoiler\">\n<summary>\u0415\u0441\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0447\u0435\u043a\u0435 \u043d\u0435\u0442 \u0432 \u0418\u0424\u041d\u0421, \u0442\u043e:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">        else: # \u0435\u0441\u043b\u0438 \u0438\u043d\u0444\u044b \u043e \u0442\u043e\u0432\u0430\u0440\u0430\u0445 \u043d\u0435\u0442, \u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435                 msg1 = \"\u043e\u0448\u0438\u0431\u043a\u0430 \u0447\u0435\u043a\u0430 (\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0447\u0435\u043a \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f \u0432 \u0431\u0430\u0437\u0443 \u0418\u0424\u041d\u0421), \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u043f\u043e\u0437\u0436\u0435 \u0438 \u0431\u0443\u0434\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u0430\u043c 2 \u0440\u0430\u0437\u0430 \u0432 \u0434\u0435\u043d\u044c \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0441\u044f\u0446\u0430. \u041a\u043e\u0433\u0434\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f, \u0437\u0430\u043f\u0438\u0448\u0443 \u0438\u043d\u0444\u0443 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f, \u0442\u043e \u0442\u043e\u0436\u0435 \u0437\u0430\u043f\u0438\u0448\u0443, \u043d\u043e \u0431\u0435\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u043e\u0432\u0430\u0440\u043e\u0432,- \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0443\u043c\u043c\u0443 (\" + str((float(dictData[\"operation\"][\"sum\"]))\/100).replace('.',',') + \")\" # \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0432\u0438\u0434 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c (\u0438\u043d\u0444\u0430 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 + \u0441\u0443\u043c\u043c\u0430 \u0447\u0435\u043a\u0430)                 bot.send_message(message.chat.id, msg1) # \u0448\u043b\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432 \u0447\u0430\u0442 (\u0441\u0443\u043c\u043c\u0430 \u0447\u0435\u043a\u0430, \u0438\u043d\u0444\u0430 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435)                                  wrongList = str(time1) + ',' + qr_code + ',' + str(message.chat.id) + ',' + str(message.from_user.first_name) + ',' + str(message.from_user.last_name) #\u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 qr-\u043a\u043e\u0434\u043e\u0432 \u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438                                  with open('\/home\/qr\/wrongList.txt', 'a') as f: #\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0447\u0435\u043a\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b                     f.write(wrongList + '\\n') #\u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0435\u043a \u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 (\u0434\u0430\u0442\u0430 - qr - chatid - user - user_last_name), \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e                 print ('ticket error, written to the wronglist')                                   time.sleep(5) # \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c - \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 20 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443 \u0432 \u043e\u0434\u0438\u043d \u0447\u0430\u0442 (\u0438\u043b\u0438 \u0442\u0438\u043f\u0430 \u0442\u043e\u0433\u043e)                  <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 google sheets \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 &#171;\u0442\u043e\u0432\u0430\u0440;\u0441\u0443\u043c\u043c\u0430&#187;, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435, id \u0447\u0430\u0442\u0430, \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f)<\/p>\n<details class=\"spoiler\">\n<summary>\u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f qr-\u043a\u043e\u0434\u043e\u043c, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432 google sheets<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">    else: #\u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 qr-\u043a\u043e\u0434 \u0438 \u043d\u0435 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u0433\u0443\u0433\u043b \u0442\u0430\u0431\u043b\u0438\u0446\u0443         report_line = [str(time1), message.chat.id, message.chat.username, message.chat.title, message.from_user.username, message.from_user.first_name, message.from_user.last_name, message.text, \"\", \"\", \"\", \"\"] #\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 sheets \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u043d\u0435 qr-\u043a\u043e\u0434         sht2.append_row(report_line, table_range='A1') # \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 (\u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435)         print ('message is not qrcode and was written to sheets')<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u043e\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u043e\u0442\u0430 bot.polling(none_stop=True, interval=0)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0432\u0430\u0440\u043e\u0432. \u0412 \u043c\u043e\u0451\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 10 \u0447\u0435\u043a\u043e\u0432 \u0432 \u0434\u0435\u043d\u044c, \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0437\u0430 \u0434\u0435\u043d\u044c \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 100. \u0412 \u0442\u0430\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u0436\u0435 \u043e\u043a\u043e\u043b\u043e \u0434\u0432\u0443\u0445 \u043b\u0435\u0442, \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u043e\u0441\u044c, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0432 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0447\u0435\u043a\u0438 \u0432 \u0431\u0430\u0437\u0435 \u0418\u0424\u041d\u0421, \u043d\u043e \u044d\u0442\u043e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u0430 \u0447\u0435\u043a \u043d\u0435 \u0443\u0448\u0451\u043b \u0432 \u0431\u0430\u0437\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 google sheets \u0438 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c.<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/80d\/e85\/e24\/80de85e248d571c153d53d694d9b9064.jpg\" alt=\"&quot;\u0421\u044b\u0440\u044b\u0435&quot; \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 sheets\" title=\"&quot;\u0421\u044b\u0440\u044b\u0435&quot; \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 sheets\" width=\"1751\" height=\"221\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/80d\/e85\/e24\/80de85e248d571c153d53d694d9b9064.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>&#171;\u0421\u044b\u0440\u044b\u0435&#187; \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 sheets<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/4a1\/990\/e91\/4a1990e9134ad012f4a6b208a3ddbdb1.jpg\" alt=\"\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 sheets \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0438\" title=\"\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 sheets \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0438\" width=\"1019\" height=\"273\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4a1\/990\/e91\/4a1990e9134ad012f4a6b208a3ddbdb1.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 sheets \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/5a7\/58e\/0e6\/5a758e0e608ac93c6965f330cc0a581f.jpg\" alt=\"\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0435\" title=\"\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0435\" width=\"495\" height=\"465\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5a7\/58e\/0e6\/5a758e0e608ac93c6965f330cc0a581f.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0435<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/761416\/\"> https:\/\/habr.com\/ru\/articles\/761416\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u0435 \u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b. \u0420\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e &#8212; \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u0435\u0451 \u0446\u0435\u043d\u0430 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0447\u0430\u0442\u0438\u043a, \u043f\u043e\u0442\u043e\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043b\u043e\u0441\u044c \u0432 google sheets. \u041f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432 google sheets \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 python \u0438 google-api, \u043d\u043e \u0442.\u043a. \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0432 \u0447\u0435\u043a\u0435 \u043c\u043e\u0433\u043b\u043e \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 10 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0434\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0431\u0449\u0435\u0439 \u0442\u0438\u043f\u0430 &#171;\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b&#187; (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u0449\u0435\u0439 \u0441\u0443\u043c\u043c\u044b \u0447\u0435\u043a\u0430, \u0447\u0442\u043e \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0433\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f, \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u043e\u0432\u0430\u0440\u0430\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e qr-\u043a\u043e\u0434\u0430 \u0438 API \u0418\u0424\u041d\u0421.<\/p>\n<p>\u0412 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043a \u0441\u0435\u0442\u0438 \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 Raspberry PI \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c FreeBPX (\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043f\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/550734\/\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>) \u0441 \u043c\u043e\u0434\u0435\u043c\u043e\u043c E1550, \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0448\u0438\u0442\u044b\u043c \u043d\u0430 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435.<\/p>\n<p>\u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Raspberry \u0438 \u043c\u043e\u0434\u0435\u043c \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442, \u043c\u043e\u0433\u0443\u0442 \u0437\u0432\u043e\u043d\u0438\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0421\u041c\u0421. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0438\u0437 \u0447\u0435\u043a\u0430.<\/p>\n<p>\u0418\u0424\u041d\u0421 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u043f\u0443\u0442\u044f\u043c\u0438: 1) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c API-\u043a\u043b\u044e\u0447 (\u0438 \u0442\u043e\u0433\u0434\u0430 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043c\u043e\u0434\u0435\u043c\u0430); 2) \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0421\u041c\u0421.<\/p>\n<p>\u0422.\u043a. \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043c \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0421\u041c\u0421, \u0438\u0434\u0443 \u043f\u043e \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0443\u0442\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439: \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0430\u0439\u0442 \u043d\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u043c\u0441 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0447\u0435\u043a\u0430 \u0438 \u043a\u043e\u0434\u043e\u043c \u0438\u0437 \u0441\u043c\u0441, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c JSON \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0447\u0435\u043a\u0430, \u0435\u0441\u043b\u0438 \u0447\u0435\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u0418\u0424\u041d\u0421, \u043b\u0438\u0431\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0435\u0441\u043b\u0438 \u0447\u0435\u043a\u0430 \u043d\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0435\u0439 \u0441\u0445\u0435\u043c\u044b: <\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 qr-\u043a\u043e\u0434 \u0441 \u0447\u0435\u043a\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 qr-\u043a\u043e\u0434\u0430 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0447\u0430\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0431\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 QR-\u043a\u043e\u0434\u043e\u043c \u0438, \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u043d\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e, \u043f\u0440\u043e\u0445\u043e\u0434\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0421\u041c\u0421, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 google sheets;<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f QR-\u043a\u043e\u0434\u043e\u043c, \u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 google sheets.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 <a href=\"https:\/\/leftjoin.ru\/all\/nalog-ru-client\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u0430 <a href=\"https:\/\/github.com\/valiotti\/get-receipts\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a>.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u0433\u0438\u0442\u0445\u0430\u0431\u0430 \u0431\u044b\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043f\u043e\u0434 \u043c\u043e\u0438 \u043d\u0443\u0436\u0434\u044b, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0440\u043e\u043a\u0430 \u0436\u0438\u0437\u043d\u0438 \u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435  \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u043a\u043e\u0432 \u043f\u043e\u0434\u0440\u044f\u0434. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0421\u041c\u0421-\u043a\u043e\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 120 \u0441\u0435\u043a\u0443\u043d\u0434. <\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0436\u0438\u0432 \u043b\u0438 \u043a\u043e\u0434 \u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u0438?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 <code>check_sms<\/code>. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u043e \u0442\u0430\u043a: \u0434\u0435\u043b\u0430\u0435\u043c post-\u0437\u0430\u043f\u0440\u043e\u0441, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u0440\u0430\u043d\u0435\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e (\u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0431\u044b\u043b) \u043a\u043e\u0434\u0430:<\/p>\n<ul>\n<li>\n<p>429 &#8212; \u043a\u043e\u0434 \u0435\u0441\u0442\u044c \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u0430\u043a\u0436\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0435\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 (\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 120);<\/p>\n<\/li>\n<li>\n<p>204 &#8212; \u043a\u043e\u0434 \u0443\u0441\u0442\u0430\u0440\u0435\u043b, \u043b\u0438\u0431\u043e \u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e asterisk \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043c\u0441 \u0432  \u0444\u0430\u0439\u043b <code>\/var\/log\/asterisk\/sms.txt<\/code>. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043c\u0441 \u0432 \u0431\u0430\u0437\u0443 asteriskcdrdb, \u0430 \u043f\u043e\u0442\u043e\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043c\u0441 \u043e\u0442\u0442\u0443\u0434\u0430, \u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b &#8212; \u0434\u0435\u043b\u043e 1 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0431\u0430\u0437\u0443 \u0447\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>\u0422.\u043a. \u044f \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u0442\u043e \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u043e\u0434, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043a\u0443\u0447\u0443 print \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438 \u043a\u0430\u043a\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430 \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0446\u0435\u043b\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>nalog-python.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import json import time import requests import os from datetime import datetime  class NalogRuPython:     HOST = 'irkkt-mobile.nalog.ru:8888'     DEVICE_OS = 'iOS'     CLIENT_VERSION = '2.9.0'     DEVICE_ID = '7C82010F-16CC-446B-8F66-FC4080C66521'     ACCEPT = '*\/*'     USER_AGENT = 'billchecker\/2.9.0 (iPhone; iOS 13.6; Scale\/2.00)'     ACCEPT_LANGUAGE = 'ru-RU;q=1, en-US;q=0.9'     CLIENT_SECRET = 'IyvrAbKt9h\/8p6a7QPh8gpkXYQ4='     OS = 'Android'      def __init__(self):         self.__session_id = None         self.check_sms()         self.set_session_id()      def check_sms(self): #\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0440\u043e\u043a\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0434\u0430 \u0438\u0437 \u0441\u043c\u0441 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u043e\u0432\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0440\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437 \u0441\u043c\u0441 \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 #        \"\"\" #        Authorization using phone and SMS code #        \"\"\"         self.__phone = str('+71234567890') #\u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0441 (asterisk freePBX)          url = f'https:\/\/{self.HOST}\/v2\/auth\/phone\/request'         payload = {             'phone': self.__phone,             'client_secret': self.CLIENT_SECRET,             'os': self.OS         }         headers = {             'Host': self.HOST,             'Accept': self.ACCEPT,             'Device-OS': self.DEVICE_OS,             'Device-Id': self.DEVICE_ID,             'clientVersion': self.CLIENT_VERSION,             'Accept-Language': self.ACCEPT_LANGUAGE,             'User-Agent': self.USER_AGENT,         }          r = requests.post(url, json=payload, headers=headers) #\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u0440\u043e\u043a\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0434\u0430 (\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b - \u0435\u0441\u0442\u044c \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f (\u043d\u0435 \u0431\u043e\u043b\u0435\u0435 120 \u0441\u0435\u043a)  \u0438\u043b\u0438 \u043d\u0435\u0442 (\u0448\u043b\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0442\u043e\u0433\u0434\u0430))         print (datetime.now())  ################### \u0421\u041c\u0421 \u043a\u043e\u0434 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d ###################################################### #\u0441\u0442\u0430\u0442\u0443\u0441-\u043a\u043e\u0434 - 204 - \u043a\u043e\u0434 \u043d\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439, 429 - \u043a\u043e\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439         print (\"status code: \" + str(r.status_code))  #\u043e\u0442\u0432\u0435\u0442\u043d\u044b\u0435 headers - \u0432\u0440\u0435\u043c\u044f, \u0434\u043e \u043a\u0430\u043a\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u0434 \u0438\u0437 \u0441\u043c\u0441, \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u0435\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0432\u0440\u0435\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0435         print ('headers: ' + str(r.headers))  # \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0434\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0435\u0441\u044f         time_left = int(r.headers ['Retry-After']) # \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0435\u0449\u0451 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u0434 \u0438\u0437 \u0421\u041c\u0421         print (\"time_left: \" + str(time_left))          if r.status_code == 204: # \u0415\u0441\u043b\u0438 \u043a\u043e\u0434\u0430 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0431\u044b\u043b\u043e (\u0431\u043e\u043b\u0435\u0435 120 \u0441\u0435\u043a.), \u0442\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0421\u041c\u0421            print (\"\u043a\u043e\u0434 \u0443\u0441\u0442\u0430\u0440\u0435\u043b, \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u043d\u043e\u0432\u044b\u0439\")            time.sleep(10) # \u0436\u0434\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0441\u043c\u0441         elif r.status_code == 429 and time_left &lt;5: # \u0435\u0441\u043b\u0438 \u043a\u043e\u0434 \u0435\u0441\u0442\u044c, \u043d\u043e \u0447\u0435\u0440\u0435\u0437 5 \u0441\u0435\u043a \u043e\u043d \u0443\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u0436\u0434\u0435\u043c 6 \u0441\u0435\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439            time.sleep(6)            self.check_sms()         elif r.status_code == 429 and time_left >=5: # \u0435\u0441\u043b\u0438 \u043a\u043e\u0434 \u0435\u0441\u0442\u044c \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 5 \u0441\u0435\u043a, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e  #\u0447\u0438\u0442\u0430\u0435\u043c \u0421\u041c\u0421 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430         f_read = open(\"\/var\/log\/asterisk\/sms.txt\", \"r\") #\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f         last_line = f_read.readlines()[-1] # \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u043a\u0443         print (last_line)         #\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438: \"2023-09-15 21:09:02 - dongle0 - KKT.NALOG: \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u043a\u043e\u0432 \u0424\u041d\u0421 \u0420\u043e\u0441\u0441\u0438\u0438. \u041a\u043e\u0434: 2872\"         f_read.close() #\u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b          sms_lst = last_line.split(' - ')[2] # \u0434\u0435\u043b\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u0432 \u0432\u0438\u0434\u0435 \" - \" (\u043f\u0440\u043e\u0431\u0435\u043b \u043c\u0438\u043d\u0443\u0441 \u043f\u0440\u043e\u0431\u0435\u043b)         print (\"sms last: \" + sms_lst)          self.__code = sms_lst.strip().split(': ')[2] # \u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u0442\u0440\u0435\u0442\u0438\u0439) \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b         print (\"code: -\" + self.__code + \"-\") # \u043c\u0438\u043d\u0443\u0441\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0442 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u0440: -0123- #################### \u043f\u043e\u0448\u043b\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u0436\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c ######################################        def set_session_id(self) -> None:         print ('session_id')         url = f'https:\/\/{self.HOST}\/v2\/auth\/phone\/verify' #\u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0436\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c         payload = {         'phone': self.__phone,         'client_secret': self.CLIENT_SECRET,         'code': self.__code,         \"os\": self.OS         }          headers = {             'Host': self.HOST,             'Accept': self.ACCEPT,             'Device-OS': self.DEVICE_OS,             'Device-Id': self.DEVICE_ID,             'clientVersion': self.CLIENT_VERSION,             'Accept-Language': self.ACCEPT_LANGUAGE,             'User-Agent': self.USER_AGENT,         }           resp = requests.post(url, json=payload, headers=headers)          print ('headers: ')         print (resp.headers)         print ('status: ')         print (resp.status_code)          self.__session_id = resp.json()['sessionId']         self.__refresh_token = resp.json()['refresh_token']      def refresh_token_function(self) -> None:         print ('refresh_token_function')         url = f'https:\/\/{self.HOST}\/v2\/mobile\/users\/refresh'         payload = {             'refresh_token': self.__refresh_token,             'client_secret': self.CLIENT_SECRET         }          headers = {             'Host': self.HOST,             'Accept': self.ACCEPT,             'Device-OS': self.DEVICE_OS,             'Device-Id': self.DEVICE_ID,             'clientVersion': self.CLIENT_VERSION,             'Accept-Language': self.ACCEPT_LANGUAGE,             'User-Agent': self.USER_AGENT,         }          resp = requests.post(url, json=payload, headers=headers)          self.__session_id = resp.json()['sessionId']         self.__refresh_token = resp.json()['refresh_token']      def _get_ticket_id(self, qr: str) -> str: #        \"\"\" #        Get ticker id by info from qr code #        :param qr: text from qr code. Example \"t=20200727T174700&amp;s=746.00&amp;fn=9285000100206366&amp;i=34929&amp;fp=3951774668&amp;n=1\" #        :return: Ticket id. Example \"5f3bc6b953d5cb4f4e43a06c\" #        \"\"\"         url = f'https:\/\/{self.HOST}\/v2\/ticket'         payload = {'qr': qr}         headers = {             'Host': self.HOST,             'Accept': self.ACCEPT,             'Device-OS': self.DEVICE_OS,             'Device-Id': self.DEVICE_ID,             'clientVersion': self.CLIENT_VERSION,             'Accept-Language': self.ACCEPT_LANGUAGE,             'sessionId': self.__session_id,             'User-Agent': self.USER_AGENT,         }          resp = requests.post(url, json=payload, headers=headers)          return resp.json()[\"id\"]      def get_ticket(self, qr: str) -> dict: #        \"\"\" #        Get JSON ticket #        :param qr: text from qr code. Example \"t=20200727T174700&amp;s=746.00&amp;fn=9285000100206366&amp;i=34929&amp;fp=3951774668&amp;n=1\" #        :return: JSON ticket #        \"\"\"         ticket_id = self._get_ticket_id(qr)         url = f'https:\/\/{self.HOST}\/v2\/tickets\/{ticket_id}'         headers = {             'Host': self.HOST,           <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-355053","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/355053","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=355053"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/355053\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=355053"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=355053"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=355053"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}