{"id":331039,"date":"2022-03-24T21:00:11","date_gmt":"2022-03-24T21:00:11","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=331039"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=331039","title":{"rendered":"<span>BIK Beep \u2013 Telegram Bot<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b43\/b30\/cc5\/b43b30cc54eb6a3ad0682edc6eea3f10.png\" alt=\"\u041b\u043e\u0433\u043e\u0442\u0438\u043f \u0431\u043e\u0442\u0430\" title=\"\u041b\u043e\u0433\u043e\u0442\u0438\u043f \u0431\u043e\u0442\u0430\" width=\"105\" height=\"105\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b43\/b30\/cc5\/b43b30cc54eb6a3ad0682edc6eea3f10.png\"\/><figcaption>\u041b\u043e\u0433\u043e\u0442\u0438\u043f \u0431\u043e\u0442\u0430<\/figcaption><\/figure>\n<h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<ul>\n<li>\n<p><a href=\"#%D0%9F%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8%20%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B2%D0%B8%D1%87%D0%BD%D1%8B%D0%B5%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D1%8B%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D0%BC%D1%8B%D1%85%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2%20Python\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D1%8B%D0%B5%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D1%8B%20Heroku\" rel=\"noopener noreferrer nofollow\">\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b Heroku<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8%20%D0%B1%D0%BE%D1%82%D0%B0\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A0%D0%B0%D0%B7%D0%B2%D1%91%D1%80%D1%82%D0%BA%D0%B0%20%D0%B1%D0%BE%D1%82%D0%B0%20%D0%BD%D0%B0%20Heroku\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0430 \u0431\u043e\u0442\u0430 \u043d\u0430 Heroku<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B\" rel=\"noopener noreferrer nofollow\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041e\u0448\u0438\u0431\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%98%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%BA%D0%BE%D0%B4\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%97%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%9F%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8%20%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B2%D0%B8%D1%87%D0%BD%D1%8B%D0%B5%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D1%8B%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F\" id=\"\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f\"><\/a><\/p>\n<h2>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u043c\u0438 \u0432\u0435\u0447\u0435\u0440\u043d\u0438\u043c\u0438 (\u0434\u0430 \u0435\u0449\u0451 \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0432 \u0440\u0430\u0437\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f) \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u00a0<a href=\"https:\/\/bincol.ru\" rel=\"noopener noreferrer nofollow\"><u>\u041e\u0413\u0410\u041f\u041e\u0423 \u00ab\u0411\u0435\u043b\u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0438\u0439 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043b\u043b\u0435\u0434\u0436\u00bb<\/u><\/a>\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 (\u041f\u041e), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0442\u044c \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0421\u0440\u0435\u0434\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0430\u043d\u0434\u0440\u043e\u0438\u0434-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0431\u043e\u0442\/\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438\/\u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434 \u0430\u043d\u0434\u0440\u043e\u0438\u0434 \u0432\u00a0<a href=\"https:\/\/developer.android.com\/studio\" rel=\"noopener noreferrer nofollow\"><u>Android Studio<\/u><\/a>\u00a0\u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u044b \u0431\u0435\u0437 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 (\u041e\u0421) Android 11 (API 30).<\/p>\n<blockquote>\n<p><em>\u0414\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0430 \u043c\u043d\u043e\u0439 \u043f\u043e\u0437\u0436\u0435.<\/em><\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/dev.vk.com\/api\/bots\/getting-started\" rel=\"noopener noreferrer nofollow\"><u>\u0411\u043e\u0442<\/u><\/a>\u00a0\u0438\u043b\u0438\u00a0<a href=\"https:\/\/dev.vk.com\/mini-apps\/getting-started\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u0435\u0440\u0432\u0438\u0441<\/u><\/a>\u00a0\u0434\u043b\u044f \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u00ab<a href=\"https:\/\/vk.com\" rel=\"noopener noreferrer nofollow\"><u>\u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435<\/u><\/a>\u00bb \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f, \u043d\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u043f\u043b\u0430\u043d\u0430\u0445.<\/p>\n<p>\u0414\u0430, \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0431\u043e\u0442\u043e\u0432 \u0432 Telegram \u0435\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u0441\u0442\u0430\u0442\u0435\u0439, \u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u0432\u0435\u0441\u044c \u043c\u043e\u0439 \u043f\u0443\u0442\u044c \u0434\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430 \u0432 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0435\u00a0<a href=\"https:\/\/telegram.org\" rel=\"noopener noreferrer nofollow\"><u>Telegram<\/u><\/a>.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8\" id=\"\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\"><\/a><\/p>\n<h2>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h2>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f97\/cce\/9d4\/f97cce9d47ba02ec8d0b974813ed009c.png\" alt=\"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\" title=\"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\" width=\"1280\" height=\"750\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f97\/cce\/9d4\/f97cce9d47ba02ec8d0b974813ed009c.png\"\/><figcaption>\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/figcaption><\/figure>\n<h3>Python<\/h3>\n<p>\u042f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d\u00a0<a href=\"https:\/\/www.python.org\" rel=\"noopener noreferrer nofollow\"><u>Python 3.10.0<\/u><\/a>\u00a0\u2013 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0414\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0451\u0433\u043e\u043a \u0432 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c, \u0442\u0430\u043a \u0438 \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e Python:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0440\u043e\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0446\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0431\u043b\u043e\u043a\u0438 \u043f\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u2013 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043f\u043e\u0434 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e Python:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/contents.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/wiki.python.org\/moin\/BeginnersGuide\/NonProgrammers\" rel=\"noopener noreferrer nofollow\"><u>\u0443\u0447\u0435\u0431\u043d\u044b\u0435 \u043f\u043e\u0441\u043e\u0431\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/wiki.python.org\/moin\/BeginnersGuide\/Programmers\" rel=\"noopener noreferrer nofollow\"><u>\u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pythonworld.ru\/samouchitel-python\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u0430\u043c\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u00a0<a href=\"https:\/\/docs.python.org\/3.11\/whatsnew\/3.11.html\" rel=\"noopener noreferrer nofollow\"><u>Python 3.11<\/u><\/a>, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u043f\u043e\u043a\u0430 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 PATH \u0431\u044b\u043b \u043f\u0443\u0442\u044c \u0434\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 Python.<\/p>\n<pre><code>%UserProfile%\\AppData\\Local\\Programs\\Python\\Python310<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u00a0<a href=\"https:\/\/pypi.org\/project\/pip\" rel=\"noopener noreferrer nofollow\"><u>pip v21.3.1<\/u><\/a>. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 PATH \u0431\u044b\u043b \u043f\u0443\u0442\u044c \u0434\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 Python.<\/p>\n<pre><code>%UserProfile%\\AppData\\Local\\Programs\\Python\\Python310\\Scripts<\/code><\/pre>\n<h3>Visual Studio Code<\/h3>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f\u00a0<a href=\"https:\/\/code.visualstudio.com\" rel=\"noopener noreferrer nofollow\"><u>Visual Studio Code v1.62.3<\/u><\/a>\u00a0(VS Code) \u043e\u0442 Microsoft. \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Python, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e IntelliSense \u2013 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0432 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438.<\/p>\n<h3>Heroku<\/h3>\n<p>\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0451\u043c \u0431\u043e\u0442\u0430 \u043d\u0430 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u00a0<a href=\"https:\/\/heroku.com\" rel=\"noopener noreferrer nofollow\"><u>Heroku<\/u><\/a>. Heroku \u2013 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 2007 \u0433\u043e\u0434\u0443. \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f Unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 <abbr title=\"\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" type=\"abbr\">\u041e\u0421<\/abbr>. \u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f 550 \u0447\u0430\u0441\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0441\u044f\u0446. \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0432 \u0441\u0432\u043e\u044e \u043b\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e 450 \u0447\u0430\u0441\u043e\u0432 \u0432 \u043c\u0435\u0441\u044f\u0446. \u0412 \u043e\u0431\u0449\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 1000 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u0447\u0430\u0441\u043e\u0432 \u0432 \u043c\u0435\u0441\u044f\u0446.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 Heroku \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u00a0<a href=\"https:\/\/vk.com\/away.php?to=https%3A%2F%2Fdevcenter.heroku.com%2Fcategories%2Fcommand-line&amp;cc_key=\" rel=\"noopener noreferrer nofollow\"><u>Heroku Command Line Interface (CLI) v7.59.2<\/u><\/a>.<\/p>\n<p>\u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c Heroku CLI:<\/p>\n<ul>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443\u00a0<code>heroku help<\/code>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/devcenter.heroku.com\/articles\/heroku-cli-commands\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 PATH \u0431\u044b\u043b \u043f\u0443\u0442\u044c \u0434\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 Heroku.<\/p>\n<pre><code>C:\\Program Files\\heroku\\bin<\/code><\/pre>\n<p><a class=\"anchor\" name=\"git\" id=\"git\"><\/a><\/p>\n<h3>Git<\/h3>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438 \u0431\u043e\u0442\u0430 \u043d\u0430 Heroku \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438\u00a0<a href=\"https:\/\/git-scm.com\" rel=\"noopener noreferrer nofollow\"><u>Git v2.34.1<\/u><\/a>. C\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u044e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432\u0435\u0440\u0441\u0438\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u043f\u0440\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u0443\u0442\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0432\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u0436\u0434\u044b\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Git:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/git-scm.com\/docs\/git\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/git-scm.com\/book\/ru\/v2\" rel=\"noopener noreferrer nofollow\"><u>\u043a\u043d\u0438\u0433\u0430 (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 PATH \u0431\u044b\u043b \u043f\u0443\u0442\u044c \u0434\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 Git.<\/p>\n<pre><code>C:\\Program Files\\Git\\cmd<\/code><\/pre>\n<h3>PostgreSQL<\/h3>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (\u0411\u0414) \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/www.postgresql.org\" rel=\"noopener noreferrer nofollow\"><u>PostgreSQL v14.1<\/u><\/a>\u00a0\u2013 \u043c\u043e\u0449\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <abbr title=\"\u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> (\u0421\u0423\u0411\u0414), \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 SQL. \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 Heroku \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u00a0<a href=\"https:\/\/devcenter.heroku.com\/categories\/heroku-postgres\" rel=\"noopener noreferrer nofollow\"><u>Heroku Postgres<\/u><\/a>\u00a0\u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0445 \u043d\u0430 Heroku, \u0441 <abbr title=\"\u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> PostgreSQL.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e PostgreSQL \u0438 \u044f\u0437\u044b\u043a\u0443 SQL:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.postgresql.org\/docs\/14\/index.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f PostgreSQL<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/tproger.ru\/translations\/sql-recap\" rel=\"noopener noreferrer nofollow\"><u>\u043a\u0440\u0430\u0442\u043a\u0430\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c SQL (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/sites.google.com\/site\/sqlgeo123\/8-lekcia-vvedenie-v-strukturirovannyj-azyk-zaprosov---sql\" rel=\"noopener noreferrer nofollow\"><u>\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 SQL (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/480838\" rel=\"noopener noreferrer nofollow\"><u>SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u044b\u0441\u0442\u0440\u043e (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>pgAdmin 4<\/h3>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> PostgreSQL \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u0442\u00a0<a href=\"https:\/\/www.pgadmin.org\" rel=\"noopener noreferrer nofollow\"><u>pgAdmin 4 v6.2<\/u><\/a>. \u0414\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u0430\u043a SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0442\u0430\u043a \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr>.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e pgAdmin 4:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.pgadmin.org\/docs\/pgadmin4\/latest\/index.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"Telegram\" id=\"Telegram\"><\/a><\/p>\n<h3>Telegram<\/h3>\n<p>\u0412\u0441\u0451 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0432 Telegram.<\/p>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0431\u043e\u0442\u0430\u043c \u0432 Telegram:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/core.telegram.org\/bots\/api\" rel=\"noopener noreferrer nofollow\"><u>Telegram Bot API<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/tlgrm.ru\/docs\/bots\" rel=\"noopener noreferrer nofollow\"><u>\u0411\u043e\u0442\u044b: \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/core.telegram.org\/bots#6-botfather\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e BotFather \u2013 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c \u0432\u0441\u0435\u0445 \u0431\u043e\u0442\u043e\u0432 \u0432 Telegram<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs-python.ru\/packages\/biblioteka-python-telegram-bot-python\/sozdat-telegram-bota-botfather\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c BotFather (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>API (Application Programming Interface \u2013 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f) \u2013 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u0440\u0443\u0433\u043e\u0435 <abbr title=\"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\" type=\"abbr\">\u041f\u041e<\/abbr> \u043c\u043e\u0436\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c <abbr title=\"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\u043c\" type=\"abbr\">\u041f\u041e<\/abbr>.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D0%BC%D1%8B%D1%85%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2%20Python\" id=\"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python\"><\/a><\/p>\n<h2>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python<\/h2>\n<h3>AIOgram<\/h3>\n<p>\u0411\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0435 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Telegram Bot API, \u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u044f\u00a0<a href=\"https:\/\/docs.aiogram.dev\" rel=\"noopener noreferrer nofollow\"><u>AIOgram v2.16<\/u><\/a>\u00a0\u2013 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 Python 3.7. \u041c\u043e\u0434\u0443\u043b\u044c \u0443\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044e\u00a0<a href=\"https:\/\/core.telegram.org\/bots\/api-changelog#december-7-2021\" rel=\"noopener noreferrer nofollow\"><u>Telegram Bot API 5.5<\/u><\/a>\u00a0\u0432\u044b\u0448\u0435\u0434\u0448\u0443\u044e 7 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2021 \u0433\u043e\u0434\u0430.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e AIOgram:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.aiogram.dev\/en\/latest\/index.html#contents\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443 \u043c\u043e\u0434\u0443\u043b\u044f \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435\u00a0<a href=\"https:\/\/docs.aiogram.dev\/en\/dev-3.x\/index.html\" rel=\"noopener noreferrer nofollow\"><u>AIOgram v3<\/u><\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0443\u0436\u0435 \u043d\u0430 Python 3.8. \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 AIOgram v3 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e\u00a0<a href=\"https:\/\/core.telegram.org\/bots\/api-changelog#november-5-2021\" rel=\"noopener noreferrer nofollow\"><u>Telegram Bot API 5.4<\/u><\/a>.\u00a0<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e AIOgram v3:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.aiogram.dev\/en\/dev-3.x\/index.html#contents\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0435 <abbr title=\"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\" type=\"abbr\">\u041f\u041e<\/abbr> \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<h3>asyncio<\/h3>\n<p>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/docs.python.org\/3\/library\/asyncio.html\" rel=\"noopener noreferrer nofollow\"><u>asyncio<\/u><\/a>\u00a0\u2013 \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Python. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2013 \u044d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u0434\u043e\u0436\u0438\u0434\u0430\u044f\u0441\u044c \u0438\u0445 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/00b\/fab\/449\/00bfab449c522d06bb0e1a05e3a9437e.png\" alt=\"\u041d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\" title=\"\u041d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\" width=\"707\" height=\"324\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/00b\/fab\/449\/00bfab449c522d06bb0e1a05e3a9437e.png\"\/><figcaption>\u041d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447<\/figcaption><\/figure>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e asyncio:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-api-index.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-llapi-index.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>Requests<\/h3>\n<p>GET \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\u00a0<a href=\"https:\/\/docs.python-requests.org\/en\/latest\" rel=\"noopener noreferrer nofollow\"><u>Requests v2.26.0<\/u><\/a>\u00a0\u2013 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u0441\u0435\u0445 \u0432\u0438\u0434\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 HTTP\/1.1, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0432 1997 \u0433\u043e\u0434\u0443. \u041c\u043e\u0434\u0443\u043b\u044c Requests \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Python 2.7 \u0438 3.6+. \u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0430 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/HTTP\/3\" rel=\"noopener noreferrer nofollow\"><u>HTTP\/3<\/u><\/a>.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Requests:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.python-requests.org\/en\/latest\/#the-user-guide\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 HTTP \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/HTTP#%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D0%B2%D0%B8%D1%82%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\"><u>\u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 HTTP (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/zametkinapolyah.ru\/servera-i-protokoly\/standarty-http-protokola-istoriya-razvitiya-http-protokola-versii-http-protokola.html\" rel=\"noopener noreferrer nofollow\"><u>\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b HTTP (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b\u00a0<a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc2068\" rel=\"noopener noreferrer nofollow\"><u>RFC2068<\/u><\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc2616\" rel=\"noopener noreferrer nofollow\"><u>RFC2616<\/u><\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435\u00a0<a href=\"http:\/\/www.codenet.ru\/webmast\/http\/rfc2068\/\" rel=\"noopener noreferrer nofollow\"><u>RFC2068 (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/HTTPS\" rel=\"noopener noreferrer nofollow\"><u>\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 HTTP (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP\" rel=\"noopener noreferrer nofollow\"><u>\u043a\u043e\u0434\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f HTTP (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/zametkinapolyah.ru\/servera-i-protokoly\/tema-7-opredelenie-metodov-http-http-method-definitions-metody-http-zaprosov.html\" rel=\"noopener noreferrer nofollow\"><u>\u043c\u0435\u0442\u043e\u0434\u044b HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>Beautiful Soup<\/h3>\n<p>\u0414\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 HTML \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u00a0<a href=\"https:\/\/www.crummy.com\/software\/BeautifulSoup\" rel=\"noopener noreferrer nofollow\"><u>Beautiful Soup v4.10.0<\/u><\/a>\u00a0\u2013 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0430\u0440\u0441\u0435\u0440, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 Python 3.8. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430\u00a0<a href=\"https:\/\/www.crummy.com\/software\/BeautifulSoup\/bs3\" rel=\"noopener noreferrer nofollow\"><u>Beautiful Soup 3<\/u><\/a>\u00a0\u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0435\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 2021 \u0433\u043e\u0434\u0430. Beautiful Soup v4.9.3 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0430\u044f Python 2.7.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Beautiful Soup 4:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.crummy.com\/software\/BeautifulSoup\/bs4\/doc\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0438 4.9.3<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.crummy.com\/software\/BeautifulSoup\/bs4\/doc.ru\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0438 4.9.3 (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>os<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <abbr title=\"\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439\" type=\"abbr\">\u041e\u0421<\/abbr> \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c\u00a0<a href=\"https:\/\/docs.python.org\/3\/library\/os.html\" rel=\"noopener noreferrer nofollow\"><u>os<\/u><\/a>\u00a0\u2013 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Python. \u041c\u043e\u0434\u0443\u043b\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438. \u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0432 os \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c\u00a0<a href=\"https:\/\/docs.python.org\/3\/library\/os.path.html\" rel=\"noopener noreferrer nofollow\"><u>os.path<\/u><\/a>\u00a0\u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0443\u0442\u044f\u043c\u0438.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e os \u0438 os.path:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/library\/os.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f os<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pythonworld.ru\/moduli\/modul-os.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 os (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/library\/os.path.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f os.path<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pythonworld.ru\/moduli\/modul-os-path.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 os.path (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0432\u0441\u0435\u043c\u0438 <abbr title=\"\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438\" type=\"abbr\">\u041e\u0421<\/abbr>.<\/p>\n<p><a class=\"anchor\" name=\"HTML2Image\" id=\"HTML2Image\"><\/a><\/p>\n<h3>HTML2Image<\/h3>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 HTML \u043a\u043e\u0434\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u043a\u0435\u0442\u0430\u00a0<a href=\"https:\/\/github.com\/vgalin\/html2image\" rel=\"noopener noreferrer nofollow\"><u>HTML2Image v2.0.1<\/u><\/a>\u00a0\u2013 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u0431\u0435\u0437\u0433\u043e\u043b\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432. \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u0431\u0435\u0437\u0433\u043e\u043b\u043e\u0432\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u2013 \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e HTML2Image:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/vgalin\/html2image#readme\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/peter.sh\/experiments\/chromium-command-line-switches\" rel=\"noopener noreferrer nofollow\"><u>\u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u043b\u0430\u0433\u043e\u0432 Chromium<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>Pillow<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439\u00a0<a href=\"https:\/\/python-pillow.org\" rel=\"noopener noreferrer nofollow\"><u>Pillow v8.4.0<\/u><\/a>\u00a0\u2013 \u043e\u0442\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Python Image Library (PIL), \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0435\u043d\u0430. \u0420\u0430\u0441\u0442\u0440\u043e\u0432\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u0435\u0442\u043a\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0442\u0430\u043a\u043e\u0435, \u0447\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043d\u0435\u0440\u0430\u0437\u043b\u0438\u0447\u0438\u043c\u044b, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438. \u0422\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0442\u0435\u0440\u044f\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/071\/c0d\/8af\/071c0d8afe41f36d737e918834001b78.png\" alt=\"\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438\" title=\"\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438\" width=\"640\" height=\"517\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/071\/c0d\/8af\/071c0d8afe41f36d737e918834001b78.png\"\/><figcaption>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dec\/9a3\/fc3\/dec9a3fc3630e31ce7811fe868c0195f.png\" alt=\"\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438\" title=\"\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438\" width=\"422\" height=\"408\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dec\/9a3\/fc3\/dec9a3fc3630e31ce7811fe868c0195f.png\"\/><figcaption>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a5\/e2c\/d96\/1a5e2cd96e097715e9df84e01710c798.png\" alt=\"\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\" title=\"\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\" width=\"1200\" height=\"644\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1a5\/e2c\/d96\/1a5e2cd96e097715e9df84e01710c798.png\"\/><figcaption>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435<\/figcaption><\/figure>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Pillow:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/pillow.readthedocs.io\/en\/latest\/#overview\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"psycopg2\" id=\"psycopg2\"><\/a><\/p>\n<h3>psycopg2<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <abbr title=\"\u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> PostgreSQL \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u043c\u00a0<a href=\"https:\/\/www.psycopg.org\" rel=\"noopener noreferrer nofollow\"><u>psycopg2 v2.9.2<\/u><\/a>\u00a0\u2013 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> PostgreSQL. Psycopg 2 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043d\u0430 C, \u043a\u0430\u043a \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430\u00a0<a href=\"https:\/\/www.postgresql.org\/docs\/14\/libpq.html\" rel=\"noopener noreferrer nofollow\"><u>libpq<\/u><\/a>. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Python 3.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Psycopg 2:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.psycopg.org\/docs\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443 \u043c\u043e\u0434\u0443\u043b\u044f \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435\u00a0<a href=\"https:\/\/www.psycopg.org\/psycopg3\" rel=\"noopener noreferrer nofollow\"><u>psycopg3<\/u><\/a>. \u041c\u043e\u0434\u0443\u043b\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Python 3.6-3.10 \u0438 PostgreSQL v10-v14.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Psycopg 3:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.psycopg.org\/psycopg3\/docs\/#documentation\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0435 <abbr title=\"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\" type=\"abbr\">\u041f\u041e<\/abbr> \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D1%8B%D0%B5%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D1%8B%20Heroku\" id=\"\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b Heroku\"><\/a><\/p>\n<h2>\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b Heroku<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u2013\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/buildpacks\" rel=\"noopener noreferrer nofollow\"><u>buildpacks<\/u><\/a>. Heroku \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442<a href=\"https:\/\/devcenter.heroku.com\/articles\/buildpacks#officially-supported-buildpacks\" rel=\"noopener noreferrer nofollow\"><u>\u00a0\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b<\/u><\/a>\u00a0\u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/793\/516\/bcd\/793516bcd38ba748b11fa7dae60e34f2.jpg\" alt=\"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b\" title=\"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b\" width=\"1163\" height=\"237\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/793\/516\/bcd\/793516bcd38ba748b11fa7dae60e34f2.jpg\" data-blurred=\"true\"\/><figcaption>\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b<\/figcaption><\/figure>\n<p>\u0412\u00a0<a href=\"https:\/\/elements.heroku.com\/buildpacks\" rel=\"noopener noreferrer nofollow\"><u>\u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0435<\/u><\/a>\u00a0Heroku \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f 8608 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0435\u0441\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u2013\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/buildpack-api\" rel=\"noopener noreferrer nofollow\"><u>Buildpack API<\/u><\/a>.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8%20%D0%B1%D0%BE%D1%82%D0%B0\" id=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u0430\"><\/a><\/p>\n<h2>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u0430<\/h2>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0432 BotFather<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f \u0431\u043e\u0442\u043e\u0432 \u0432 Telegram\u00a0<a href=\"https:\/\/t.me\/BotFather\" rel=\"noopener noreferrer nofollow\"><u>@BotFather<\/u><\/a>.\u00a0<a href=\"https:\/\/docs-python.ru\/packages\/biblioteka-python-telegram-bot-python\/sozdat-telegram-bota-botfather\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c<\/u><\/a>\u00a0\u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 \u00ab<a href=\"#Telegram\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2013 Telegram<\/u><\/a>\u00bb \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0422\u0430\u043a\u0436\u0435 \u0441\u0440\u0430\u0437\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u0442\u0430, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u043e\u0442\u0430, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0431\u043e\u0442\u0435, \u0444\u043e\u0442\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0431\u043e\u0442\u0430.<\/p>\n<p>\u0417\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0432 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432\u00a0<code>configs.py<\/code>:<\/p>\n<pre><code class=\"python\"># \u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430 \u0438\u0437 @BotFather TOKEN = '2118918752:token'<\/code><\/pre>\n<p>\u0421\u0430\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u043a\u0440\u044b\u0442 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0435\u0433\u043e \u0431\u043e\u0442\u0430.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Heroku<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435\u00a0<a href=\"https:\/\/signup.heroku.com\" rel=\"noopener noreferrer nofollow\"><u>\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 Heroku<\/u><\/a>,\u00a0<a href=\"https:\/\/dashboard.heroku.com\/new-app\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/u><\/a>\u00a0\u0432 \u0440\u0435\u0433\u0438\u043e\u043d\u0435 \u0415\u0432\u0440\u043e\u043f\u0430. \u041d\u0430 \u0432\u044b\u0431\u043e\u0440 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b\u0441\u044f \u0435\u0449\u0451 \u0440\u0435\u0433\u0438\u043e\u043d \u0421\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u0428\u0442\u0430\u0442\u044b. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u044b \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Heroku \u2013\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/regions\" rel=\"noopener noreferrer nofollow\"><u>\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u043a\u0430 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u0445<\/u><\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/ef9\/14e\/1a7\/ef914e1a7f0fdedbd449b0737154aedf.jpg\" alt=\"\u041e\u043a\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Heroku\" title=\"\u041e\u043a\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Heroku\" width=\"644\" height=\"371\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ef9\/14e\/1a7\/ef914e1a7f0fdedbd449b0737154aedf.jpg\" data-blurred=\"true\"\/><figcaption>\u041e\u043a\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Heroku<\/figcaption><\/figure>\n<h4>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u043e\u0442\u0430 Telegram<\/h4>\n<p>\u041f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u0442\u043e\u043a\u0435\u043d, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \/start \u2013\u00a0<a href=\"https:\/\/tlgrm.ru\/docs\/bots#global-commands\" rel=\"noopener noreferrer nofollow\"><u>\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b<\/u><\/a>, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043b\u044e\u0431\u044b\u043c \u0431\u043e\u0442\u043e\u043c Telegram. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0431\u043e\u0442\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435\u00a0<code>bot.py<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 from configs import TOKEN  # \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f Telegram Bot API from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor  # \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 bot = Bot(token=TOKEN)  # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 dp = Dispatcher(bot)  @dp.message_handler(commands=['start']) async def welcome(message: types.Message):   await message.answer('\u041f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0421\u0438\u043b\u044c\u0447\u0435\u043d\u043a\u043e\u041e\u0412 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f.')  # \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0444\u0430\u0439\u043b\u0430 if (__name__ == '__main__'):   # \u0437\u0430\u043f\u0443\u0441\u043a \u0440\u0435\u0436\u0438\u043c\u0430 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430   executor.start_polling(dp, skip_updates=True)<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0411\u043b\u043e\u043a\u00a0<code>if (__name__ == '__main__'):<\/code>\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0430 \u043d\u0435 \u043a\u043e\u0434\u0430 \u0438\u0437 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab<a href=\"https:\/\/rtfm.co.ua\/python-zachem-nuzhen-if-__name__-__main__\" rel=\"noopener noreferrer nofollow\"><u>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d if __name__ == &#8216;__main__&#8217; ?<\/u><\/a>\u00bb.  <\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u0430\u0439\u0442\u0430\u00a0\u00ab\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0439\u00bb<\/h3>\n<p>\u0421\u0430\u0439\u0442 \u2013 \u00ab<a href=\"https:\/\/bincol.ru\/rasp\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0439<\/a>\u00bb<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u00a0<code>__init__<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f URL \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u2013 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0425\u043e\u0442\u044f \u0432 Python \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u00a0<code>__new__<\/code>. \u041d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435\u00a0<code>__init__<\/code>, \u0432\u0435\u0434\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430. \u041c\u0435\u0442\u043e\u0434\u00a0<code>__init__<\/code>\u00a0\u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u00a0<code>self<\/code>\u00a0\u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430. \u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u00a0<code>self<\/code>:\u00a0<code>self.url<\/code>. \u041d\u0430\u0447\u0430\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f \u0432 \u0444\u0430\u0439\u043b\u0435\u00a0<code>BIKParser.py<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">class BIKParser:    # \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440   def __init__(self, url):     '''       \u041f\u0430\u0440\u0441\u0435\u0440 \u0441\u0430\u0439\u0442\u0430 bincol.ru \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b `url`        ---------       \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b       ---------       * `url`: str (\u0441\u0442\u0440\u043e\u043a\u0430)          \u0410\u0434\u0440\u0435\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c     '''      self.url = url<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u00a0<code>docstring<\/code>\u00a0\u2013\u00a0<a href=\"https:\/\/docs.python.org\/3.10\/glossary.html#term-docstring\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/u><\/a>. \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0432\u0438\u0434\u0430\u00a0<code>'''docstring'''<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>\"\"\"docstring\"\"\"<\/code>\u00a0\u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u00a0<code>__doc__<\/code>. \u0414\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u044f\u0437\u044b\u043a \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 \u2013\u00a0<a href=\"https:\/\/sphinx-ru.readthedocs.io\/ru\/latest\/rst-markup.html\" rel=\"noopener noreferrer nofollow\"><u>reStructuredText<\/u><\/a>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c \u0432\u044b\u0448\u0435 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c1c\/2a9\/4bf\/c1c2a94bfce4f92018b9d7cb8fcf498c.png\" alt=\"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438\" title=\"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438\" width=\"348\" height=\"136\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c1c\/2a9\/4bf\/c1c2a94bfce4f92018b9d7cb8fcf498c.png\"\/><figcaption>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438<\/figcaption><\/figure>\n<p>\u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437\u00a0<code>self<\/code>.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u00a0<code>FillFileSchedule<\/code>:<\/p>\n<pre><code class=\"python\">def FillFileSchedule(self):   '''\u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f'''    # \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f   f = open('old_schedule.txt', 'w')   f.write(str(self.new_schedule))   f.close()<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u00a0<code>CheckChange<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446. \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435\u00a0<code>&lt;table>&lt;tbody><\/code>\u00a0\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435\u00a0<code>&lt;\/tbody>&lt;\/table><\/code>\u00a0\u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 HTML \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0414\u0430\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u043f\u0440\u043e\u0448\u043b\u043e\u043c\u0443 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u043c\u0443 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439 \u0444\u0430\u0439\u043b \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0430\u00a0<code>True<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u043c\u043e\u0434\u0443\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 from requests import get # \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0430\u0440\u0441\u0435\u0440\u0430 from bs4 import BeautifulSoup as BS # \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 from os.path import exists  def CheckChange(self):   '''     \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f      -------     \u0412\u043e\u0437\u0432\u0440\u0430\u0442     -------     * `ResultCheck`: bool (\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)        \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438   '''    # \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f   h = get(self.url)   html = BS(h.content, 'html.parser')    # \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446   new_schedule_buf = html.find_all('tr')    # \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c html \u043a\u043e\u0434 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f   self.new_schedule = ['&lt;table>&lt;tbody>']   for num in range(1, len(new_schedule_buf)):     bufStr = str(new_schedule_buf[num])     # \u0437\u0430\u0431\u0435\u0440\u0451\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435     if (('\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a' in bufStr) or ('\u0412\u0442\u043e\u0440\u043d\u0438\u043a' in bufStr) or ('\u0421\u0440\u0435\u0434\u0430' in bufStr) or ('\u0427\u0435\u0442\u0432\u0435\u0440\u0433' in bufStr) or ('\u041f\u044f\u0442\u043d\u0438\u0446\u0430' in bufStr) or ('\u0421\u0443\u0431\u0431\u043e\u0442\u0430' in bufStr) or ('\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435' in bufStr) or ('&lt;td valign=\"top\">' in bufStr)):       self.new_schedule.append(bufStr)   self.new_schedule.append('&lt;\/tbody>&lt;\/table>')    # \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438   ResultCheck = False    # \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f   if (exists('old_schedule.txt')):     # \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u0441\u0442\u0430\u0440\u043e\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435     old_schedule = open('old_schedule.txt', 'r').read()      # \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f     if (str(self.new_schedule) != old_schedule):       # \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043d\u043e\u0432\u043e\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435       self.FillFileSchedule()        # \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438       ResultCheck = True     else:       # \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0444\u0430\u0439\u043b \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f       self.FillFileSchedule()        # \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438       ResultCheck = True        # \u0432\u0435\u0440\u043d\u0451\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438   return ResultCheck<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434\u00a0<code>ChangeImage<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438\u0437 html from html2image import Html2Image as HTI # \u043c\u043e\u0434\u0443\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 from PIL import Image  def ChangeImage(self):   '''\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f'''    # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f   hti = HTI(output_path='\/app')    # \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 html \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b   hti.screenshot(html_str=''.join(self.new_schedule), save_as='schedule.png')    # \u043e\u0431\u0440\u0435\u0436\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f   old_image = Image.open('schedule.png')   new_image = old_image.crop(old_image.getbbox())   new_image.save('schedule.png')<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0431\u043e\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0449\u0451\u043d\u043d\u044b\u043c \u043d\u0430 Heroku, \u0430 \u0442\u0430\u043c \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\u00a0<code>app<\/code>, \u0442\u043e \u044d\u0442\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f\u00a0<code>HTML2Image<\/code>, \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c \u0432 \u043a\u043e\u0434, \u043a\u0430\u043a\u00a0<code>HTI<\/code>.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u00a0<a href=\"https:\/\/github.com\/vgalin\/html2image#change-browser-flags\" rel=\"noopener noreferrer nofollow\"><u>\u043d\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0443<\/u><\/a>\u00a0\u0438\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f HTML2Image, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 \u00ab<a href=\"#HTML2Image\" rel=\"noopener noreferrer nofollow\"><u>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python \u2013 HTML2Image<\/u><\/a>\u00bb \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<blockquote>\n<p>However default flags are not used if you decide to specify\u00a0<code>custom_flags<\/code>\u00a0or change the value of\u00a0<code>browser.flags<\/code>:<\/p>\n<\/blockquote>\n<p>\u0412 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u043e\u0442\u043c\u0435\u043d\u0435 \u0444\u043b\u0430\u0433\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0444\u043b\u0430\u0433\u043e\u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0444\u043b\u0430\u0433\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:\u00a0<code>--default-background-color=0<\/code>\u00a0(<a href=\"https:\/\/peter.sh\/experiments\/chromium-command-line-switches\/#default-background-color\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0444\u043b\u0430\u0433\u0430<\/u><\/a>) \u0438\u00a0<code>--hide-scrollbars<\/code>\u00a0(<a href=\"https:\/\/peter.sh\/experiments\/chromium-command-line-switches\/#hide-scrollbars\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0444\u043b\u0430\u0433\u0430<\/u><\/a>).  <\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0411\u0414 PostgreSQL<\/h3>\n<p>\u0412 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Heroku \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u00a0<a href=\"https:\/\/elements.heroku.com\/addons\/heroku-postgresql\" rel=\"noopener noreferrer nofollow\"><u>Heroku Postgres<\/u><\/a>\u00a0\u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e. \u041f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043f\u043b\u0430\u043d Hobby Dev.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/f35\/bed\/ab4\/f35bedab41c44b4f34be18c7e79b8914.jpg\" alt=\"\u041e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0411\u0414 PostgreSQL \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e\" title=\"\u041e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0411\u0414 PostgreSQL \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e\" width=\"456\" height=\"521\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f35\/bed\/ab4\/f35bedab41c44b4f34be18c7e79b8914.jpg\" data-blurred=\"true\"\/><figcaption>\u041e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0411\u0414 PostgreSQL \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e<\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432\u00a0<code>configs.py<\/code>\u00a0\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a <abbr title=\"\u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> PostgreSQL:<\/p>\n<pre><code class=\"python\"># \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414 PostgreSQL DB_URI = 'postgres:\/\/user:password@host:port\/database'<\/code><\/pre>\n<p>\u0421\u0430\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u044b\u0442 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0435\u0439 <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr>.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 \u043e\u043a\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> \u043d\u0430 Heroku:<\/p>\n<blockquote>\n<p>Please note that these credentials are not permanent. Heroku rotates credentials periodically and updates applications where this database is attached.<\/p>\n<\/blockquote>\n<p>\u0418\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0438 \u0432 \u0445\u043e\u0434\u0435\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/maintenance-mode\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0411\u0414<\/u><\/a>\u00a0Heroku \u043c\u0435\u043d\u044f\u0435\u0442 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u0431 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438 \u043d\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0447\u0442\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 Heroku \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043f\u0438\u0441\u044c\u043c\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f:<\/p>\n<blockquote>\n<p>Your database DATABASE_URL on bikbeepbot requires maintenance. During this period, your database will become read-only. \u2026 We expect maintenance to last just a few moments depending on the size of your database. We will notify you when maintenance begins, and again once it&#8217;s complete.<\/p>\n<\/blockquote>\n<p>\u0412 \u043f\u0438\u0441\u044c\u043c\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> \u0438 \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f <abbr title=\"\u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f. \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u044b\u043c. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u043a\u043e\u043d\u0446\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u043f\u0438\u0441\u044c\u043c\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 <abbr title=\"\u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432 pgAdmin 4 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u043c <abbr title=\"\u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> \u043f\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0443\u0447\u0451\u0442\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/22a\/82e\/d46\/22a82ed46afcd733a2b04cf16423ea81.jpg\" alt=\"\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\" title=\"\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\" width=\"500\" height=\"551\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/22a\/82e\/d46\/22a82ed46afcd733a2b04cf16423ea81.jpg\" data-blurred=\"true\"\/><figcaption>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/252\/0e5\/d84\/2520e5d84490552baf603149f4cb8579.jpg\" alt=\"\u041e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430\" title=\"\u041e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430\" width=\"500\" height=\"551\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/252\/0e5\/d84\/2520e5d84490552baf603149f4cb8579.jpg\" data-blurred=\"true\"\/><figcaption>\u041e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432 \u043e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u0435 \u043d\u0430\u0439\u0442\u0438 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0432\u043e\u044e <abbr title=\"\u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u0438 \u0443\u0436\u0435 \u0432 \u043d\u0435\u0439 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u00ab+\u00bb \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0432\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u0430. \u041f\u043e\u043b\u0435 \u00ab\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435\u00a0<a href=\"https:\/\/www.postgresql.org\/docs\/9.5\/datatype-numeric.html#DATATYPE-SERIAL\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u0435\u0440\u0438\u0439\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/u><\/a>. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/1d4\/8bb\/5ea\/1d48bb5ea0063cfff19699666e000253.jpg\" alt=\"\u041e\u043a\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\" title=\"\u041e\u043a\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\" width=\"807\" height=\"420\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d4\/8bb\/5ea\/1d48bb5ea0063cfff19699666e000253.jpg\" data-blurred=\"true\"\/><figcaption>\u041e\u043a\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/figcaption><\/figure>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u043e \u043e\u043a\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u043b\u0438\u043a\u043d\u0443\u0432 \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 (\u041f\u041a\u041c) \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0432 \u043e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u0435.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0438\u043c \u0431\u043e\u0442\u043e\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0442\u043e \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \u043e\u0442 1 \u0434\u043e 32767. \u041a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 API \u0431\u043e\u0442\u043e\u0432 Telegram, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 \u00ab<a href=\"#Telegram\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2013 Telegram<\/u><\/a>\u00bb \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<blockquote>\n<p>Unique identifier for this user or bot. This number may have more than 32 significant bits and some programming languages may have difficulty\/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier.<\/p>\n<\/blockquote>\n<p>\u0414\u043b\u044f\u00a0<a href=\"https:\/\/core.telegram.org\/bots\/api#user\" rel=\"noopener noreferrer nofollow\"><u>\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/u><\/a>\u00a0\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 64-\u0431\u0438\u0442\u043d\u044b\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f bigint \u0432 <abbr title=\"\u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> PostgreSQL.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u00a0<code>__init__<\/code>\u043c\u043e\u0434\u0443\u043b\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a <abbr title=\"\u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> PostgreSQL. \u041d\u0430\u0447\u0430\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f \u0432 \u0444\u0430\u0439\u043b\u0435\u00a0<code>SQLRequests.py<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0411\u0414 PostgreSQL import psycopg2  class SQLRequests:    def __init__(self, db_uri):   '''     \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414 \u043f\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443 `db_uri`     ---------     \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b     ---------     * `db_uri`: str (\u0441\u0442\u0440\u043e\u043a\u0430)            \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414   '''          # \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0411\u0414 c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c SSL   self.connection = psycopg2.connect(db_uri, sslmode='require')      # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a   self.cursor = self.connection.cursor()      # \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439   self.connection.autocommit = True<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 <abbr title=\"\u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr>\u00a0<code>user_exists<\/code>\u00a0\u0438 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 <abbr title=\"\u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr>\u00a0<code>user_add<\/code>:  <\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def user_exists(self, user_id):   '''     \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 \u0411\u0414 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 id = `user_id`     ---------     \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b     ---------     * `user_id`: int (\u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e)          \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f   '''      self.cursor.execute(f'SELECT user_id FROM bikbeepbot.\"UsersBD\" WHERE user_id = {user_id}')    # \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435   return self.cursor.fetchone()  def user_add(self, user_id):   '''     \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0411\u0414 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 id = `user_id`     ---------     \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b     ---------     * `user_id`: int (\u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e)        \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f   '''        self.cursor.execute(f'INSERT INTO bikbeepbot.\"UsersBD\"(user_id) VALUES({user_id})')<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432 \u0434\u0432\u043e\u0439\u043d\u044b\u0445 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445\u00a0<code>\"TableName\"<\/code>. \u0412 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f\u00a0<a href=\"https:\/\/www.python.org\/dev\/peps\/pep-0498\" rel=\"noopener noreferrer nofollow\"><u>f-\u0441\u0442\u0440\u043e\u043a\u0438<\/u><\/a>\u00a0\u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0432 Python 3.6. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u043f\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0442\u0440\u043e\u043a \u0438 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 f-\u0441\u0442\u0440\u043e\u043a:\u00a0<a href=\"https:\/\/shultais.education\/blog\/python-f-strings\" rel=\"noopener noreferrer nofollow\"><u>f-\u0441\u0442\u0440\u043e\u043a\u0438 \u0432 Python 3<\/u><\/a>.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u0431\u043e\u0442\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434\u00a0<code>get_users<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def get_users(self):   '''     \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u043e\u0442\u0430     -------     \u0412\u043e\u0437\u0432\u0440\u0430\u0442     -------     * `users_id`: list[tuples] (\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439)        \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439   '''    self.cursor.execute('SELECT * FROM bikbeepbot.\"UsersBD\"')    # \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f   return self.cursor.fetchall()<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0425\u043e\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432\u00a0<a href=\"https:\/\/www.psycopg.org\/docs\/cursor.html#fetch\" rel=\"noopener noreferrer nofollow\"><u>\u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/u><\/a>\u00a0fetchone( ) \u0438 fetchall( ) \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f psycopg2, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 \u00ab<a href=\"#psycopg2\" rel=\"noopener noreferrer nofollow\"><u>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python \u2013 psycopg2<\/u><\/a>\u00bb \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<h3>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/h3>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0434\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438. \u041c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u00a0<code>bot.py<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 from configs import DB_URI # \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f from BIKParser import BIKParser as BIKP # \u043c\u043e\u0434\u0443\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414 from SQLRequests import SQLRequests as SQLR  ...  # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0411\u0414 db = SQLR(DB_URI)  # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u0440\u0441\u0435\u0440 parserBIK = BIKP('https:\/\/bincol.ru\/rasp\/prep.php?idprep=000000235')  ...<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0431\u043e\u0442\u043e\u0432 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \/start. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u00a0<code>welcome<\/code>\u00a0\u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 <abbr title=\"\u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr>:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0411\u0414 if (not db.user_exists(message.from_user.id)):   # \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0411\u0414   db.user_add(message.from_user.id)<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0434 \u0446\u0438\u043a\u043b\u043e\u043c\u00a0<code>while True:<\/code>\u00a0\u0431\u0443\u0434\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434\u0435\u00a0<code>scheduled<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u043c\u043e\u0434\u0443\u043b\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 from asyncio import get_event_loop, sleep  async def scheduled(wait):   '''     \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 `wait` \u043c\u0438\u043d\u0443\u0442     ---------     \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b     ---------     * `wait`: int (\u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e)        \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432 \u043c\u0438\u043d\u0443\u0442\u0430\u0445   '''    while True:     # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f     if (parserBIK.CheckChange()):        # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f       parserBIK.ChangeImage()        # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u043e\u0442\u0430       IdUsers = db.get_users()        # \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435       for user_id in IdUsers:         await bot.send_photo(user_id[1], open('schedule.png', 'rb'), caption = '\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0421\u0438\u043b\u044c\u0447\u0435\u043d\u043a\u043e\u041e\u0412 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e!')          # \u043e\u0436\u0438\u0434\u0430\u0435\u043c     await sleep(wait * 60)  # \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0444\u0430\u0439\u043b\u0430 if (__name__ == '__main__'):   # \u0437\u0430\u043f\u0443\u0441\u043a \u0437\u0430\u0434\u0430\u0447\u0438   get_event_loop().create_task(scheduled(15))    ...<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u0435\u0442\u043e\u0434\u00a0<code>get_users()<\/code>\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u0438\u0441\u0442 \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439, \u0442\u043e \u0432 \u0446\u0438\u043a\u043b\u0435\u00a0<code>for<\/code>\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u00a0<code>(0, 1)<\/code>\u00a0\u0438\u0434\u0443\u0442 \u043f\u043e\u0434 \u043d\u043e\u043c\u0435\u0440\u043e\u043c 1. \u041f\u043e\u0434 \u043d\u043e\u043c\u0435\u0440\u043e\u043c 0 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u2013 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 id, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0430\u0432\u0442\u043e\u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u043e\u043c.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u043e\u0442\u0430 \u0438 \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0431\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">\u0411\u0414<\/abbr> \u043c\u043e\u0436\u043d\u043e \u0432 pgAdmin 4, \u043a\u043b\u0438\u043a\u043d\u0443\u0432 <abbr title=\"\u043f\u0440\u0430\u0432\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u043c\u044b\u0448\u0438\" type=\"abbr\">\u041f\u041a\u041c<\/abbr> \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u0432\u044b\u0431\u0440\u0430\u0432 \u00ab\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u2013 \u0412\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\u00bb \u0438\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u0432 \u00ab\u0417\u0430\u043f\u0440\u043e\u0441\u043d\u0438\u043a\u00bb \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"pgsql\">SELECT * FROM bikbeepbot.\"UsersBD\"<\/code><\/pre>\n<p>\u041d\u0430\u0436\u0430\u0432 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u00ab\u25b6\u00bb (\u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0432\u043f\u0440\u0430\u0432\u043e) \u0432\u043d\u0438\u0437\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/20d\/a28\/f16\/20da28f160f53988d5914f88fb5485bc.jpg\" alt=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430\" title=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430\" width=\"417\" height=\"98\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/20d\/a28\/f16\/20da28f160f53988d5914f88fb5485bc.jpg\" data-blurred=\"true\"\/><figcaption>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/figcaption><\/figure>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%A0%D0%B0%D0%B7%D0%B2%D1%91%D1%80%D1%82%D0%BA%D0%B0%20%D0%B1%D0%BE%D1%82%D0%B0%20%D0%BD%D0%B0%20Heroku\" id=\"\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0430 \u0431\u043e\u0442\u0430 \u043d\u0430 Heroku\"><\/a><\/p>\n<h2>\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0430 \u0431\u043e\u0442\u0430 \u043d\u0430 Heroku<\/h2>\n<p>\u0421\u0442\u0435\u043a \u2013 \u043e\u0431\u0440\u0430\u0437 <abbr title=\"\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" type=\"abbr\">\u041e\u0421<\/abbr> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 Heroku. \u0421\u0442\u0435\u043a\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0435 Linux \u2013 Ubuntu. Heroku \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0430 \u0441\u0442\u0435\u043a\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/heroku-18-stack\" rel=\"noopener noreferrer nofollow\"><u>Heroku-18<\/u><\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/heroku-20-stack\" rel=\"noopener noreferrer nofollow\"><u>Heroku-20<\/u><\/a>. \u0426\u0438\u0444\u0440\u0430 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u0435\u0440\u0432\u044b\u0445 \u0446\u0438\u0444\u0440 \u0432\u0435\u0440\u0441\u0438\u0439 Ubuntu: Heroku-18 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 Ubuntu 18.04 \u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u0430\u043f\u0440\u0435\u043b\u0435 2023 \u0433\u043e\u0434\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 Heroku-20, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 Python 3, \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 Ubuntu 20.04 \u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u0430\u043f\u0440\u0435\u043b\u0435 2025 \u0433\u043e\u0434\u0430. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043d\u0430 Heroku-20.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u043e\u0439 \u0431\u043e\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c 3 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430 \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b.<\/p>\n<h3>\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b<\/h3>\n<ol>\n<li>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>runtime.txt<\/code>\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/python-runtimes\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u0440\u0435\u0434\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Python<\/u><\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/python-support#specifying-a-python-version\" rel=\"noopener noreferrer nofollow\"><u>\u0442\u043e\u0447\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438<\/u><\/a>.<\/p>\n<\/li>\n<\/ol>\n<pre><code>python-3.10.0<\/code><\/pre>\n<p>2. \u0424\u0430\u0439\u043b\u00a0<code>requirements.txt<\/code>\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/python-pip\" rel=\"noopener noreferrer nofollow\"><u>\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/u><\/a>\u00a0\u2013 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code>aiogram requests bs4 html2image pillow psycopg2<\/code><\/pre>\n<p>3. \u0424\u0430\u0439\u043b\u00a0<code>Procfile<\/code>\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435. \u0421\u0442\u0440\u043e\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442:\u00a0<code>&lt;process type>: &lt;command><\/code>.<\/p>\n<pre><code>worker: python bot.py<\/code><\/pre>\n<h3>\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b<\/h3>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u00bb.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/7dc\/515\/79a\/7dc51579a7c767cc596e2a5701ca5596.jpg\" alt=\"\u041e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432\" title=\"\u041e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432\" width=\"731\" height=\"184\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7dc\/515\/79a\/7dc51579a7c767cc596e2a5701ca5596.jpg\" data-blurred=\"true\"\/><figcaption>\u041e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/figcaption><\/figure>\n<ol>\n<li>\n<p><a href=\"https:\/\/elements.heroku.com\/buildpacks\/heroku\/heroku-buildpack-python\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442<\/u><\/a>\u00a0\u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Python\u00a0<code>heroku\/python<\/code>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/elements.heroku.com\/buildpacks\/heroku\/heroku-buildpack-chromedriver\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442<\/u><\/a>\u00a0\u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 Chrome\u00a0<code>https:\/\/github.com\/heroku\/heroku-buildpack-chromedriver.git<\/code>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/elements.heroku.com\/buildpacks\/heroku\/heroku-buildpack-google-chrome\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442<\/u><\/a>\u00a0\u0434\u043b\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 Google Chrome\u00a0<code>https:\/\/github.com\/heroku\/heroku-buildpack-google-chrome.git<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 183 \u0444\u0430\u0439\u043b\u0430\u00a0<code>\/bin\/compile<\/code>\u00a0\u0444\u043b\u0430\u0433\u00a0<code>--remote-debugging-port=9222<\/code>\u00a0\u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u0443\u044e \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u044e\u0449\u0438\u0439 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u044d\u043a\u0440\u0430\u043d\u0430. \u0414\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0442\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u043e\u0442\u00a0<a href=\"https:\/\/github.com\/aurelmegn\" rel=\"noopener noreferrer nofollow\"><u>aurelmegn<\/u><\/a>\u00a0<code>https:\/\/github.com\/aurelmegn\/heroku-buildpack-google-chrome.git<\/code>.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u043d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0431\u043e\u0442\u0430. \u0421\u043c\u0435\u043d\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439\u00a0<code>cd<\/code>.<\/p>\n<p>\u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435:<\/p>\n<ul>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443\u00a0<code>cd \/?<\/code>;<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/cmd4win.ru\/administrirovanie-computera\/upravlenie-failami\/29-cd\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b CD (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 Heroku CLI \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443\u00a0<code>heroku login<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u043e\u043a\u043d\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 Heroku.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/bdb\/06d\/779\/bdb06d77939fe440f815425f098656a4.jpg\" alt=\"\u041e\u043a\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0432\u0445\u043e\u0434 \u0432 Heroku\" title=\"\u041e\u043a\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0432\u0445\u043e\u0434 \u0432 Heroku\" width=\"408\" height=\"334\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bdb\/06d\/779\/bdb06d77939fe440f815425f098656a4.jpg\" data-blurred=\"true\"\/><figcaption>\u041e\u043a\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0432\u0445\u043e\u0434 \u0432 Heroku<\/figcaption><\/figure>\n<p>\u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c Git \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 \u00ab<a href=\"#git\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2013 Git<\/u><\/a>\u00bb \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p><a href=\"https:\/\/git-scm.com\/book\/ru\/v2\/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-Git-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F#r_getting_a_repo\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/u><\/a>\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439\u00a0<code>git init<\/code>. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043b\u044f\u00a0<a href=\"https:\/\/git-scm.com\/book\/ru\/v2\/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9#r_tracking_files\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f<\/u><\/a>\u00a0\u043d\u043e\u0432\u044b\u0445, \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0445 \u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u00a0<code>git add .<\/code>.<\/p>\n<p>\u0414\u043b\u044f\u00a0<a href=\"https:\/\/git-scm.com\/book\/ru\/v2\/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9#r_committing_changes\" rel=\"noopener noreferrer nofollow\"><u>\u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/u><\/a>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u00a0<code>git commit -m \"First release\"<\/code>. \u0414\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445.<\/p>\n<p><a href=\"https:\/\/git-scm.com\/book\/ru\/v2\/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%D0%BC%D0%B8#_%D0%BF%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80_%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D1%85_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B5%D0%B2\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432<\/u><\/a>\u00a0\u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b\u00a0<code>git remote -v<\/code>. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439.<\/p>\n<p>\u0414\u043b\u044f\u00a0<a href=\"https:\/\/git-scm.com\/book\/ru\/v2\/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%D0%BC%D0%B8#r_pushing_remotes\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/u><\/a>\u00a0\u0432 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443\u00a0<code>git push heroku master<\/code>.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B\" id=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b\"><\/a><\/p>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b<\/h2>\n<p>\u0414\u043b\u044f\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/dyno-types#from-the-heroku-cli\" rel=\"noopener noreferrer nofollow\"><u>\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/u><\/a>\u00a0Heroku \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439\u00a0<code>heroku ps<\/code>.<\/p>\n<p><a href=\"https:\/\/devcenter.heroku.com\/articles\/scaling#scaling-the-number-of-dynos\" rel=\"noopener noreferrer nofollow\"><u>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/u><\/a>, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443\u00a0<code>heroku ps:scale worker=1<\/code>.<\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0431\u043e\u0442 \u0432 Telegram \u2013\u00a0<a href=\"https:\/\/t.me\/BIKbeep_bot\" rel=\"noopener noreferrer nofollow\"><u>@BIKbeep_bot<\/u><\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/04a\/b07\/1ef\/04ab071ef0d1a47d2ab08adaf7b86cc6.jpg\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430\" width=\"736\" height=\"552\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/04a\/b07\/1ef\/04ab071ef0d1a47d2ab08adaf7b86cc6.jpg\" data-blurred=\"true\"\/><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/ebf\/e8e\/768\/ebfe8e768ace673b6429f57428df4d45.jpg\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430\" width=\"733\" height=\"506\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ebf\/e8e\/768\/ebfe8e768ace673b6429f57428df4d45.jpg\" data-blurred=\"true\"\/><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430<\/figcaption><\/figure>\n<p>\u0414\u043b\u044f\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/scaling#scaling-the-number-of-dynos\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/u><\/a>\u00a0\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443\u00a0<code>heroku ps:scale worker=0 -a bikbeepbot<\/code>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/git-clone-heroku-app\" rel=\"noopener noreferrer nofollow\"><u>\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/u><\/a>\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u043e \u043f\u0443\u0442\u0438 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u00a0<code>heroku git:clone -a bikbeepbot<\/code>.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B8\" id=\"\u041e\u0448\u0438\u0431\u043a\u0438\"><\/a><\/p>\n<h2>\u041e\u0448\u0438\u0431\u043a\u0438<\/h2>\n<p>\u0412 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0431\u043e\u0442\u0430 \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0438 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a, \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u041d\u043e \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430 \u044d\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u0438.<\/p>\n<p><a class=\"anchor\" name=\"%D0%96%D1%83%D1%80%D0%BD%D0%B0%D0%BB%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F\" id=\"\u0416\u0443\u0440\u043d\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\"><\/a><\/p>\n<h3>\u0416\u0443\u0440\u043d\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<pre><code>app[worker.1]: [1218\/191809.376330:ERROR:bus.cc(393)] Failed to connect to the bus: Failed to connect to socket \/var\/run\/dbus\/system_bus_socket: No such file or directory  app[worker.1]: [1218\/191809.480389:ERROR:sandbox_linux.cc(376)] InitializeSandbox() called with multiple threads in process gpu-process.  app[worker.1]: \/app\/bot.py:67: DeprecationWarning: There is no current event loop app[worker.1]:   get_event_loop().create_task(scheduled(15))<\/code><\/pre>\n<h3>\u041f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 (\u043e\u0442 11 \u043c\u0430\u0440\u0442\u0430 2022)<\/h3>\n<p>\u0412\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u00a0<a href=\"https:\/\/bincol.ru\" rel=\"noopener noreferrer nofollow\"><u>\u041e\u0413\u0410\u041f\u041e\u0423 \u00ab\u0411\u0435\u043b\u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0438\u0439 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043b\u043b\u0435\u0434\u0436\u00bb<\/u><\/a>\u00a0\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043b \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0432\u043e\u0435\u043c\u0443 \u0441\u0430\u0439\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0430\u043c \u0415\u0432\u0440\u043e\u043f\u044b, \u0433\u0434\u0435 \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u0442. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043a\u043e\u0434\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e URL \u043e\u0442\u00a0<a href=\"https:\/\/elisdn.ru\" rel=\"noopener noreferrer nofollow\"><u>\u0414\u043c\u0438\u0442\u0440\u0438\u044f \u0415\u043b\u0438\u0441\u0435\u0435\u0432\u0430<\/u><\/a>.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u0430\u0432\u043e\u043a \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u00a0<code>CheckChange<\/code>\u00a0\u0431\u043e\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043b \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u0412\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430\u00a0<code>CheckChange<\/code>\u00a0\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0431\u0435\u0437 \u044d\u0442\u0438\u0445 \u043f\u0440\u0430\u0432\u043e\u043a.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%98%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%BA%D0%BE%D0%B4\" id=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434\"><\/a><\/p>\n<h2>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/h2>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>configs.py<\/code>:<\/p>\n<pre><code class=\"python\"># \u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430 \u0438\u0437 @BotFather TOKEN = '2118918752:token'  # \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414 PostgreSQL DB_URI = 'postgres:\/\/user:password@host:port\/database'<\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>bot.py<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 from configs import TOKEN, DB_URI # \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f from BIKParser import BIKParser as BIKP # \u043c\u043e\u0434\u0443\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414 from SQLRequests import SQLRequests as SQLR  # \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f Telegram Bot API from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor # \u043c\u043e\u0434\u0443\u043b\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 from asyncio import get_event_loop, sleep  # \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 bot = Bot(token=TOKEN)  # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 dp = Dispatcher(bot)  # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0411\u0414 db = SQLR(DB_URI)  # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u0440\u0441\u0435\u0440 parserBIK = BIKP('https:\/\/bincol.ru\/rasp\/prep.php?idprep=000000235')  @dp.message_handler(commands=['start']) async def welcome(message: types.Message):   await message.answer('\u041f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0421\u0438\u043b\u044c\u0447\u0435\u043d\u043a\u043e\u041e\u0412 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f.')    # \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0411\u0414   if (not db.user_exists(message.from_user.id)):     # \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0411\u0414     db.user_add(message.from_user.id)  async def scheduled(wait):   '''     \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 `wait` \u043c\u0438\u043d\u0443\u0442     ---------     \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b     ---------     * `wait`: int (\u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e)        \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432 \u043c\u0438\u043d\u0443\u0442\u0430\u0445   '''          while True:     # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f     if (parserBIK.CheckChange()):       # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f       parserBIK.ChangeImage()        # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u043e\u0442\u0430       IdUsers = db.get_users()        # \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435       for user_id in IdUsers:         await bot.send_photo(user_id[1], open('schedule.png', 'rb'), caption = '\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0421\u0438\u043b\u044c\u0447\u0435\u043d\u043a\u043e\u041e\u0412 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e!')      # \u043e\u0436\u0438\u0434\u0430\u0435\u043c     await sleep(wait * 60)  # \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0444\u0430\u0439\u043b\u0430 if (__name__ == '__main__'):   # \u0437\u0430\u043f\u0443\u0441\u043a \u0437\u0430\u0434\u0430\u0447\u0438   get_event_loop().create_task(scheduled(15))    # \u0437\u0430\u043f\u0443\u0441\u043a \u0440\u0435\u0436\u0438\u043c\u0430 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430   executor.start_polling(dp, skip_updates=True)<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>BIKParser.py<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u043c\u043e\u0434\u0443\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 from requests import get # \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0430\u0440\u0441\u0435\u0440\u0430 from bs4 import BeautifulSoup as BS # \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 from os.path import exists # \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438\u0437 html from html2image import Html2Image as HTI # \u043c\u043e\u0434\u0443\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 from PIL import Image  class BIKParser:    # \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440   def __init__(self, url):     '''       \u041f\u0430\u0440\u0441\u0435\u0440 \u0441\u0430\u0439\u0442\u0430 bincol.ru \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b `url`       ---------       \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b       ---------       * `url`: str (\u0441\u0442\u0440\u043e\u043a\u0430)              \u0410\u0434\u0440\u0435\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c     '''      self.url = url    def CheckChange(self):     '''       \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f       -------       \u0412\u043e\u0437\u0432\u0440\u0430\u0442       -------       * `ResultCheck`: bool (\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)                  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438     '''        # \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f     h = get(self.url)     html = BS(h.content, 'html.parser')        # \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446     new_schedule_buf = html.find_all('tr')        # \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c html \u043a\u043e\u0434 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f     self.new_schedule = ['&lt;table>&lt;tbody>']     for num in range(1, len(new_schedule_buf)):       bufStr = str(new_schedule_buf[num])       # \u0437\u0430\u0431\u0435\u0440\u0451\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435       if (('\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a' in bufStr) or ('\u0412\u0442\u043e\u0440\u043d\u0438\u043a' in bufStr) or ('\u0421\u0440\u0435\u0434\u0430' in bufStr) or ('\u0427\u0435\u0442\u0432\u0435\u0440\u0433' in bufStr) or ('\u041f\u044f\u0442\u043d\u0438\u0446\u0430' in bufStr) or ('\u0421\u0443\u0431\u0431\u043e\u0442\u0430' in bufStr) or ('\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435' in bufStr) or ('&lt;td valign=\"top\">' in bufStr)):         self.new_schedule.append(bufStr)     self.new_schedule.append('&lt;\/tbody>&lt;\/table>')        # \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438     ResultCheck = False        # \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f     if (exists('old_schedule.txt')):       # \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u0441\u0442\u0430\u0440\u043e\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435       old_schedule = open('old_schedule.txt', 'r').read()            # \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f       if (str(self.new_schedule) != old_schedule):         # \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043d\u043e\u0432\u043e\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435         self.FillFileSchedule()            # \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438         ResultCheck = True     else:       # \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0444\u0430\u0439\u043b \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f       self.FillFileSchedule()          # \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438       ResultCheck = True        # \u0432\u0435\u0440\u043d\u0451\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438     return ResultCheck    def FillFileSchedule(self):     '''\u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f'''        # \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f     f = open('old_schedule.txt', 'w')     f.write(str(self.new_schedule))     f.close()    def ChangeImage(self):     '''\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f'''        # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f     hti = HTI(output_path='\/app')        # \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 html \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b     hti.screenshot(html_str=''.join(self.new_schedule), save_as='schedule.png')        # \u043e\u0431\u0440\u0435\u0436\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f     old_image = Image.open('schedule.png')     new_image = old_image.crop(old_image.getbbox())     new_image.save('schedule.png')<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>SQLRequests.py<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 Python<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0411\u0414 PostgreSQL import psycopg2  class SQLRequests:    def __init__(self, db_uri):     '''       \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414 \u043f\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443 `db_uri`       ---------       \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b       ---------       * `db_uri`: str (\u0441\u0442\u0440\u043e\u043a\u0430)              \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414     '''          # \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0411\u0414 c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c SSL     self.connection = psycopg2.connect(db_uri, sslmode='require')          # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a     self.cursor = self.connection.cursor()          # \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439     self.connection.autocommit = True      def get_users(self):     '''       \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u043e\u0442\u0430       -------       \u0412\u043e\u0437\u0432\u0440\u0430\u0442       -------       * `users_id`: list[tuples] (\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439)              \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439     '''          self.cursor.execute('SELECT * FROM bikbeepbot.\"UsersBD\"')          # \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f     return self.cursor.fetchall()    def user_exists(self, user_id):     '''       \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 \u0411\u0414 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 id = `user_id`       ---------       \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b       ---------       * `user_id`: int (\u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e)                \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     '''          self.cursor.execute(f'SELECT user_id FROM bikbeepbot.\"UsersBD\" WHERE user_id = {user_id}')          # \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435     return self.cursor.fetchone()    def user_add(self, user_id):     '''       \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0411\u0414 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 id = `user_id`       ---------       \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b       ---------       * `user_id`: int (\u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e)                \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     '''      self.cursor.execute(f'INSERT INTO bikbeepbot.\"UsersBD\"(user_id) VALUES({user_id})')<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>runtime.txt<\/code>:<\/p>\n<pre><code>python-3.10.0<\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>requirements.txt<\/code>:<\/p>\n<pre><code>aiogram requests bs4 html2image pillow psycopg2<\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b\u00a0<code>Procfile<\/code>:<\/p>\n<pre><code>worker: python bot.py<\/code><\/pre>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%97%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\"><\/a><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0411\u043e\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u0436\u0435 \u0441 7 \u0434\u0435\u043a\u0430\u0431\u0440\u044f \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043d\u0435\u0441\u0451\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u0440\u0430\u043d\u0434\u0438\u043e\u0437\u043d\u044b\u0445 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0430 \u043b\u0438\u0448\u044c \u043e\u0441\u0432\u0435\u0449\u0430\u0435\u0442 \u043c\u043e\u0439 \u043f\u0443\u0442\u044c \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u0442\u0430 \u0432 Telegram. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438 \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043d\u043e \u0432\u0435\u0434\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0438\u0445 \u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0443\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <abbr title=\"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f\" type=\"abbr\">\u041f\u041e<\/abbr>.<\/p>\n<p>\u041f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043e\u043a \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u043e\u0448\u0438\u0431\u043e\u043a \u0438\u0437 \u043f\u0443\u043d\u043a\u0442\u0430 \u00ab<a href=\"#%D0%96%D1%83%D1%80%D0%BD%D0%B0%D0%BB%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\"><u>\u041e\u0448\u0438\u0431\u043a\u0438 \u2013 \u0416\u0443\u0440\u043d\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/u><\/a>\u00bb \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u043e\u0434 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0451\u0439, \u0432\u00a0<a href=\"https:\/\/vk.me\/fas.offical\" rel=\"noopener noreferrer nofollow\"><u>\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/u><\/a>\u00a0(\u041b\u0421) \u043d\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435 \u0438\u043b\u0438 \u043d\u0430 \u043d\u0430\u0448\u0443 \u043f\u043e\u0447\u0442\u0443:<\/p>\n<blockquote>\n<p>fas.offical@ya.ru<\/p>\n<\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/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\/post\/657329\/\"> https:\/\/habr.com\/ru\/post\/657329\/<\/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_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><figcaption>\u041b\u043e\u0433\u043e\u0442\u0438\u043f \u0431\u043e\u0442\u0430<\/figcaption><\/figure>\n<h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<ul>\n<li>\n<p><a href=\"#%D0%9F%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8%20%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B2%D0%B8%D1%87%D0%BD%D1%8B%D0%B5%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D1%8B%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D0%BC%D1%8B%D1%85%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2%20Python\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D1%8B%D0%B5%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D1%8B%20Heroku\" rel=\"noopener noreferrer nofollow\">\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b Heroku<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8%20%D0%B1%D0%BE%D1%82%D0%B0\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A0%D0%B0%D0%B7%D0%B2%D1%91%D1%80%D1%82%D0%BA%D0%B0%20%D0%B1%D0%BE%D1%82%D0%B0%20%D0%BD%D0%B0%20Heroku\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0430 \u0431\u043e\u0442\u0430 \u043d\u0430 Heroku<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B\" rel=\"noopener noreferrer nofollow\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041e\u0448\u0438\u0431\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%98%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%BA%D0%BE%D0%B4\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%97%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%9F%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8%20%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B2%D0%B8%D1%87%D0%BD%D1%8B%D0%B5%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D1%8B%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F\" id=\"\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f\">\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f&#187;<\/a><\/p>\n<h2>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u043c\u0438 \u0432\u0435\u0447\u0435\u0440\u043d\u0438\u043c\u0438 (\u0434\u0430 \u0435\u0449\u0451 \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0432 \u0440\u0430\u0437\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f) \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u00a0<a href=\"https:\/\/bincol.ru\" rel=\"noopener noreferrer nofollow\"><u>\u041e\u0413\u0410\u041f\u041e\u0423 \u00ab\u0411\u0435\u043b\u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0438\u0439 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043b\u043b\u0435\u0434\u0436\u00bb<\/u><\/a>\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 (\u041f\u041e), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0442\u044c \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0421\u0440\u0435\u0434\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0430\u043d\u0434\u0440\u043e\u0438\u0434-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0431\u043e\u0442\/\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438\/\u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434 \u0430\u043d\u0434\u0440\u043e\u0438\u0434 \u0432\u00a0<a href=\"https:\/\/developer.android.com\/studio\" rel=\"noopener noreferrer nofollow\"><u>Android Studio<\/u><\/a>\u00a0\u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u044b \u0431\u0435\u0437 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 (\u041e\u0421) Android 11 (API 30).<\/p>\n<blockquote>\n<p><em>\u0414\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0430 \u043c\u043d\u043e\u0439 \u043f\u043e\u0437\u0436\u0435.<\/em><\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/dev.vk.com\/api\/bots\/getting-started\" rel=\"noopener noreferrer nofollow\"><u>\u0411\u043e\u0442<\/u><\/a>\u00a0\u0438\u043b\u0438\u00a0<a href=\"https:\/\/dev.vk.com\/mini-apps\/getting-started\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u0435\u0440\u0432\u0438\u0441<\/u><\/a>\u00a0\u0434\u043b\u044f \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u00ab<a href=\"https:\/\/vk.com\" rel=\"noopener noreferrer nofollow\"><u>\u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435<\/u><\/a>\u00bb \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f, \u043d\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u043f\u043b\u0430\u043d\u0430\u0445.<\/p>\n<p>\u0414\u0430, \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0431\u043e\u0442\u043e\u0432 \u0432 Telegram \u0435\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u0441\u0442\u0430\u0442\u0435\u0439, \u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u0432\u0435\u0441\u044c \u043c\u043e\u0439 \u043f\u0443\u0442\u044c \u0434\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430 \u0432 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0435\u00a0<a href=\"https:\/\/telegram.org\" rel=\"noopener noreferrer nofollow\"><u>Telegram<\/u><\/a>.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8\" id=\"\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\">\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438&#187;><\/a><\/p>\n<h2>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h2>\n<figure class=\"full-width\"><figcaption>\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/figcaption><\/figure>\n<h3>Python<\/h3>\n<p>\u042f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d\u00a0<a href=\"https:\/\/www.python.org\" rel=\"noopener noreferrer nofollow\"><u>Python 3.10.0<\/u><\/a>\u00a0\u2013 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0414\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0451\u0433\u043e\u043a \u0432 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c, \u0442\u0430\u043a \u0438 \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e Python:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0440\u043e\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0446\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0431\u043b\u043e\u043a\u0438 \u043f\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u2013 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043f\u043e\u0434 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e Python:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/contents.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/wiki.python.org\/moin\/BeginnersGuide\/NonProgrammers\" rel=\"noopener noreferrer nofollow\"><u>\u0443\u0447\u0435\u0431\u043d\u044b\u0435 \u043f\u043e\u0441\u043e\u0431\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/wiki.python.org\/moin\/BeginnersGuide\/Programmers\" rel=\"noopener noreferrer nofollow\"><u>\u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pythonworld.ru\/samouchitel-python\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u0430\u043c\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u00a0<a href=\"https:\/\/docs.python.org\/3.11\/whatsnew\/3.11.html\" rel=\"noopener noreferrer nofollow\"><u>Python 3.11<\/u><\/a>, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u043f\u043e\u043a\u0430 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 PATH \u0431\u044b\u043b \u043f\u0443\u0442\u044c \u0434\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 Python.<\/p>\n<pre><code>%UserProfile%\\AppData\\Local\\Programs\\Python\\Python310<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u00a0<a href=\"https:\/\/pypi.org\/project\/pip\" rel=\"noopener noreferrer nofollow\"><u>pip v21.3.1<\/u><\/a>. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 PATH \u0431\u044b\u043b \u043f\u0443\u0442\u044c \u0434\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 Python.<\/p>\n<pre><code>%UserProfile%\\AppData\\Local\\Programs\\Python\\Python310\\Scripts<\/code><\/pre>\n<h3>Visual Studio Code<\/h3>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f\u00a0<a href=\"https:\/\/code.visualstudio.com\" rel=\"noopener noreferrer nofollow\"><u>Visual Studio Code v1.62.3<\/u><\/a>\u00a0(VS Code) \u043e\u0442 Microsoft. \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Python, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e IntelliSense \u2013 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0432 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438.<\/p>\n<h3>Heroku<\/h3>\n<p>\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0451\u043c \u0431\u043e\u0442\u0430 \u043d\u0430 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u00a0<a href=\"https:\/\/heroku.com\" rel=\"noopener noreferrer nofollow\"><u>Heroku<\/u><\/a>. Heroku \u2013 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 2007 \u0433\u043e\u0434\u0443. \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f Unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 <abbr title=\"\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" type=\"abbr\">\u0435\u043c\u044b&#187; type=&#187;abbr&#187;>\u041e<\/abbr>. \u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f 550 \u0447\u0430\u0441\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0441\u044f\u0446. \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0432 \u0441\u0432\u043e\u044e \u043b\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e 450 \u0447\u0430\u0441\u043e\u0432 \u0432 \u043c\u0435\u0441\u044f\u0446. \u0412 \u043e\u0431\u0449\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 1000 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u0447\u0430\u0441\u043e\u0432 \u0432 \u043c\u0435\u0441\u044f\u0446.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 Heroku \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u00a0<a href=\"https:\/\/vk.com\/away.php?to=https%3A%2F%2Fdevcenter.heroku.com%2Fcategories%2Fcommand-line&amp;cc_key=\" rel=\"noopener noreferrer nofollow\"><u>Heroku Command Line Interface (CLI) v7.59.2<\/u><\/a>.<\/p>\n<p>\u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c Heroku CLI:<\/p>\n<ul>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443\u00a0<code>heroku help<\/code>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/devcenter.heroku.com\/articles\/heroku-cli-commands\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 PATH \u0431\u044b\u043b \u043f\u0443\u0442\u044c \u0434\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 Heroku.<\/p>\n<pre><code>C:\\Program Files\\heroku\\bin<\/code><\/pre>\n<p><a class=\"anchor\" name=\"git\" id=\"git\"><\/a><\/p>\n<h3>Git<\/h3>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438 \u0431\u043e\u0442\u0430 \u043d\u0430 Heroku \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438\u00a0<a href=\"https:\/\/git-scm.com\" rel=\"noopener noreferrer nofollow\"><u>Git v2.34.1<\/u><\/a>. C\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u044e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432\u0435\u0440\u0441\u0438\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u043f\u0440\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u0443\u0442\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0432\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u0436\u0434\u044b\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Git:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/git-scm.com\/docs\/git\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/git-scm.com\/book\/ru\/v2\" rel=\"noopener noreferrer nofollow\"><u>\u043a\u043d\u0438\u0433\u0430 (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 PATH \u0431\u044b\u043b \u043f\u0443\u0442\u044c \u0434\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 Git.<\/p>\n<pre><code>C:\\Program Files\\Git\\cmd<\/code><\/pre>\n<h3>PostgreSQL<\/h3>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (\u0411\u0414) \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/www.postgresql.org\" rel=\"noopener noreferrer nofollow\"><u>PostgreSQL v14.1<\/u><\/a>\u00a0\u2013 \u043c\u043e\u0449\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <abbr title=\"\u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">type=&#187;abbr&#187;>\u0411\u0414<\/abbr> (\u0421\u0423\u0411\u0414), \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 SQL. \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 Heroku \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u00a0<a href=\"https:\/\/devcenter.heroku.com\/categories\/heroku-postgres\" rel=\"noopener noreferrer nofollow\"><u>Heroku Postgres<\/u><\/a>\u00a0\u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0445 \u043d\u0430 Heroku, \u0441 <abbr title=\"\u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">ype=&#187;abbr&#187;>\u0411\u0414<\/abbr> PostgreSQL.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e PostgreSQL \u0438 \u044f\u0437\u044b\u043a\u0443 SQL:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.postgresql.org\/docs\/14\/index.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f PostgreSQL<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/tproger.ru\/translations\/sql-recap\" rel=\"noopener noreferrer nofollow\"><u>\u043a\u0440\u0430\u0442\u043a\u0430\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c SQL (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/sites.google.com\/site\/sqlgeo123\/8-lekcia-vvedenie-v-strukturirovannyj-azyk-zaprosov---sql\" rel=\"noopener noreferrer nofollow\"><u>\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 SQL (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/480838\" rel=\"noopener noreferrer nofollow\"><u>SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u044b\u0441\u0442\u0440\u043e (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>pgAdmin 4<\/h3>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">pe=&#187;abbr&#187;>\u0411\u0414<\/abbr> PostgreSQL \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u0442\u00a0<a href=\"https:\/\/www.pgadmin.org\" rel=\"noopener noreferrer nofollow\"><u>pgAdmin 4 v6.2<\/u><\/a>. \u0414\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u0430\u043a SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0442\u0430\u043a \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">pe=&#187;abbr&#187;>\u0411\u0414<\/abbr>.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e pgAdmin 4:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.pgadmin.org\/docs\/pgadmin4\/latest\/index.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"Telegram\" id=\"Telegram\"><\/a><\/p>\n<h3>Telegram<\/h3>\n<p>\u0412\u0441\u0451 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0432 Telegram.<\/p>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0431\u043e\u0442\u0430\u043c \u0432 Telegram:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/core.telegram.org\/bots\/api\" rel=\"noopener noreferrer nofollow\"><u>Telegram Bot API<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/tlgrm.ru\/docs\/bots\" rel=\"noopener noreferrer nofollow\"><u>\u0411\u043e\u0442\u044b: \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/core.telegram.org\/bots#6-botfather\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e BotFather \u2013 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c \u0432\u0441\u0435\u0445 \u0431\u043e\u0442\u043e\u0432 \u0432 Telegram<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs-python.ru\/packages\/biblioteka-python-telegram-bot-python\/sozdat-telegram-bota-botfather\" rel=\"noopener noreferrer nofollow\"><u>\u0441\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c BotFather (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>API (Application Programming Interface \u2013 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f) \u2013 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u0440\u0443\u0433\u043e\u0435 <abbr title=\"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\" type=\"abbr\">\u0435\u043d\u0438\u0435&#187; type=&#187;abbr&#187;>\u041f\u041e<\/abbr> \u043c\u043e\u0436\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c <abbr title=\"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\u043c\" type=\"abbr\">\u0435\u043d\u0438\u0435\u043c&#187; type=&#187;abbr&#187;>\u041f<\/abbr>.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D0%BC%D1%8B%D1%85%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2%20Python\" id=\"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python\">\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python&#187;<\/a><\/p>\n<h2>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python<\/h2>\n<h3>AIOgram<\/h3>\n<p>\u0411\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0435 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Telegram Bot API, \u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u044f\u00a0<a href=\"https:\/\/docs.aiogram.dev\" rel=\"noopener noreferrer nofollow\"><u>AIOgram v2.16<\/u><\/a>\u00a0\u2013 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 Python 3.7. \u041c\u043e\u0434\u0443\u043b\u044c \u0443\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044e\u00a0<a href=\"https:\/\/core.telegram.org\/bots\/api-changelog#december-7-2021\" rel=\"noopener noreferrer nofollow\"><u>Telegram Bot API 5.5<\/u><\/a>\u00a0\u0432\u044b\u0448\u0435\u0434\u0448\u0443\u044e 7 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2021 \u0433\u043e\u0434\u0430.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e AIOgram:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.aiogram.dev\/en\/latest\/index.html#contents\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443 \u043c\u043e\u0434\u0443\u043b\u044f \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435\u00a0<a href=\"https:\/\/docs.aiogram.dev\/en\/dev-3.x\/index.html\" rel=\"noopener noreferrer nofollow\"><u>AIOgram v3<\/u><\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0443\u0436\u0435 \u043d\u0430 Python 3.8. \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 AIOgram v3 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e\u00a0<a href=\"https:\/\/core.telegram.org\/bots\/api-changelog#november-5-2021\" rel=\"noopener noreferrer nofollow\"><u>Telegram Bot API 5.4<\/u><\/a>.\u00a0<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e AIOgram v3:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.aiogram.dev\/en\/dev-3.x\/index.html#contents\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0435 <abbr title=\"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\" type=\"abbr\">\u0435\u043d\u0438\u0435&#187; type=&#187;abbr&#187;>\u041f\u041e<\/abbr> \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<h3>asyncio<\/h3>\n<p>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/docs.python.org\/3\/library\/asyncio.html\" rel=\"noopener noreferrer nofollow\"><u>asyncio<\/u><\/a>\u00a0\u2013 \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Python. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2013 \u044d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u0434\u043e\u0436\u0438\u0434\u0430\u044f\u0441\u044c \u0438\u0445 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><figcaption>\u041d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447<\/figcaption><\/figure>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e asyncio:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-api-index.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-llapi-index.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>Requests<\/h3>\n<p>GET \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\u00a0<a href=\"https:\/\/docs.python-requests.org\/en\/latest\" rel=\"noopener noreferrer nofollow\"><u>Requests v2.26.0<\/u><\/a>\u00a0\u2013 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u0441\u0435\u0445 \u0432\u0438\u0434\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 HTTP\/1.1, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0432 1997 \u0433\u043e\u0434\u0443. \u041c\u043e\u0434\u0443\u043b\u044c Requests \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Python 2.7 \u0438 3.6+. \u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0430 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/HTTP\/3\" rel=\"noopener noreferrer nofollow\"><u>HTTP\/3<\/u><\/a>.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Requests:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.python-requests.org\/en\/latest\/#the-user-guide\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 HTTP \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/HTTP#%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D0%B2%D0%B8%D1%82%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\"><u>\u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 HTTP (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/zametkinapolyah.ru\/servera-i-protokoly\/standarty-http-protokola-istoriya-razvitiya-http-protokola-versii-http-protokola.html\" rel=\"noopener noreferrer nofollow\"><u>\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b HTTP (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b\u00a0<a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc2068\" rel=\"noopener noreferrer nofollow\"><u>RFC2068<\/u><\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc2616\" rel=\"noopener noreferrer nofollow\"><u>RFC2616<\/u><\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435\u00a0<a href=\"http:\/\/www.codenet.ru\/webmast\/http\/rfc2068\/\" rel=\"noopener noreferrer nofollow\"><u>RFC2068 (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/HTTPS\" rel=\"noopener noreferrer nofollow\"><u>\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 HTTP (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP\" rel=\"noopener noreferrer nofollow\"><u>\u043a\u043e\u0434\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f HTTP (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/zametkinapolyah.ru\/servera-i-protokoly\/tema-7-opredelenie-metodov-http-http-method-definitions-metody-http-zaprosov.html\" rel=\"noopener noreferrer nofollow\"><u>\u043c\u0435\u0442\u043e\u0434\u044b HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>Beautiful Soup<\/h3>\n<p>\u0414\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 HTML \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u00a0<a href=\"https:\/\/www.crummy.com\/software\/BeautifulSoup\" rel=\"noopener noreferrer nofollow\"><u>Beautiful Soup v4.10.0<\/u><\/a>\u00a0\u2013 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0430\u0440\u0441\u0435\u0440, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 Python 3.8. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430\u00a0<a href=\"https:\/\/www.crummy.com\/software\/BeautifulSoup\/bs3\" rel=\"noopener noreferrer nofollow\"><u>Beautiful Soup 3<\/u><\/a>\u00a0\u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0435\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 2021 \u0433\u043e\u0434\u0430. Beautiful Soup v4.9.3 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0430\u044f Python 2.7.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Beautiful Soup 4:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.crummy.com\/software\/BeautifulSoup\/bs4\/doc\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0438 4.9.3<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.crummy.com\/software\/BeautifulSoup\/bs4\/doc.ru\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0438 4.9.3 (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>os<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <abbr title=\"\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439\" type=\"abbr\">\u043c\u043e\u0439&#187; type=&#187;abbr&#187;>\u041e\u0421<\/abbr> \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c\u00a0<a href=\"https:\/\/docs.python.org\/3\/library\/os.html\" rel=\"noopener noreferrer nofollow\"><u>os<\/u><\/a>\u00a0\u2013 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Python. \u041c\u043e\u0434\u0443\u043b\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438. \u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0432 os \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c\u00a0<a href=\"https:\/\/docs.python.org\/3\/library\/os.path.html\" rel=\"noopener noreferrer nofollow\"><u>os.path<\/u><\/a>\u00a0\u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0443\u0442\u044f\u043c\u0438.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e os \u0438 os.path:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/library\/os.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f os<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pythonworld.ru\/moduli\/modul-os.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 os (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/library\/os.path.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f os.path<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/pythonworld.ru\/moduli\/modul-os-path.html\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 os.path (\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c)<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0432\u0441\u0435\u043c\u0438 <abbr title=\"\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438\" type=\"abbr\">\u043c\u0430\u043c\u0438&#187; type=&#187;abbr&#187;>\u041e\u0421<\/abbr>.<\/p>\n<p><a class=\"anchor\" name=\"HTML2Image\" id=\"HTML2Image\"><\/a><\/p>\n<h3>HTML2Image<\/h3>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 HTML \u043a\u043e\u0434\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u043a\u0435\u0442\u0430\u00a0<a href=\"https:\/\/github.com\/vgalin\/html2image\" rel=\"noopener noreferrer nofollow\"><u>HTML2Image v2.0.1<\/u><\/a>\u00a0\u2013 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u0431\u0435\u0437\u0433\u043e\u043b\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432. \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u0431\u0435\u0437\u0433\u043e\u043b\u043e\u0432\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u2013 \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e HTML2Image:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/vgalin\/html2image#readme\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/peter.sh\/experiments\/chromium-command-line-switches\" rel=\"noopener noreferrer nofollow\"><u>\u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u043b\u0430\u0433\u043e\u0432 Chromium<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>Pillow<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439\u00a0<a href=\"https:\/\/python-pillow.org\" rel=\"noopener noreferrer nofollow\"><u>Pillow v8.4.0<\/u><\/a>\u00a0\u2013 \u043e\u0442\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Python Image Library (PIL), \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0435\u043d\u0430. \u0420\u0430\u0441\u0442\u0440\u043e\u0432\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u0435\u0442\u043a\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0442\u0430\u043a\u043e\u0435, \u0447\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043d\u0435\u0440\u0430\u0437\u043b\u0438\u0447\u0438\u043c\u044b, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438. \u0422\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0442\u0435\u0440\u044f\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/figcaption><\/figure>\n<figure class=\"\"><figcaption>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0439 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435<\/figcaption><\/figure>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Pillow:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/pillow.readthedocs.io\/en\/latest\/#overview\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"psycopg2\" id=\"psycopg2\"><\/a><\/p>\n<h3>psycopg2<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <abbr title=\"\u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">ype=&#187;abbr&#187;>\u0411\u0414<\/abbr> PostgreSQL \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u043c\u00a0<a href=\"https:\/\/www.psycopg.org\" rel=\"noopener noreferrer nofollow\"><u>psycopg2 v2.9.2<\/u><\/a>\u00a0\u2013 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 <abbr title=\"\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" type=\"abbr\">pe=&#187;abbr&#187;>\u0411\u0414<\/abbr> PostgreSQL. Psycopg 2 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043d\u0430 C, \u043a\u0430\u043a \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430\u00a0<a href=\"https:\/\/www.postgresql.org\/docs\/14\/libpq.html\" rel=\"noopener noreferrer nofollow\"><u>libpq<\/u><\/a>. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Python 3.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Psycopg 2:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.psycopg.org\/docs\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443 \u043c\u043e\u0434\u0443\u043b\u044f \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435\u00a0<a href=\"https:\/\/www.psycopg.org\/psycopg3\" rel=\"noopener noreferrer nofollow\"><u>psycopg3<\/u><\/a>. \u041c\u043e\u0434\u0443\u043b\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Python 3.6-3.10 \u0438 PostgreSQL v10-v14.<\/p>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Psycopg 3:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.psycopg.org\/psycopg3\/docs\/#documentation\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0435 <abbr title=\"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\" type=\"abbr\">\u0435\u043d\u0438\u0435&#187; type=&#187;abbr&#187;>\u041f\u041e<\/abbr> \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D1%8B%D0%B5%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D1%8B%20Heroku\" id=\"\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b Heroku\">\u0435\u0442\u044b Heroku&#187;><\/a><\/p>\n<h2>\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b Heroku<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u2013\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/buildpacks\" rel=\"noopener noreferrer nofollow\"><u>buildpacks<\/u><\/a>. Heroku \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442<a href=\"https:\/\/devcenter.heroku.com\/articles\/buildpacks#officially-supported-buildpacks\" rel=\"noopener noreferrer nofollow\"><u>\u00a0\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b<\/u><\/a>\u00a0\u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><figcaption>\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b<\/figcaption><\/figure>\n<p>\u0412\u00a0<a href=\"https:\/\/elements.heroku.com\/buildpacks\" rel=\"noopener noreferrer nofollow\"><u>\u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0435<\/u><\/a>\u00a0Heroku \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f 8608 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0435\u0441\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u2013\u00a0<a href=\"https:\/\/devcenter.heroku.com\/articles\/buildpack-api\" rel=\"noopener noreferrer nofollow\"><u>Buildpack API<\/u><\/a>.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8%20%D0%B1%D0%BE%D1%82%D0%B0\" id=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u0430\">\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u0430&#187;><\/a><\/p>\n<h2>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u0430<\/h2>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0432 BotFather<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c<\/p>\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-331039","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/331039","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=331039"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/331039\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=331039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=331039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=331039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}