{"id":401054,"date":"2024-06-29T15:37:29","date_gmt":"2024-06-29T15:37:29","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=401054"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=401054","title":{"rendered":"<span>\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 ChatOps \u0441 VK Teams (\u0447\u0430\u0441\u0442\u044c II): OpsDroid \u2014 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440, \u0441\u043a\u0438\u043b\u043b\u044b, \u0431\u043e\u0442\u044b<\/span>"},"content":{"rendered":"<div><!--[--><img loading=\"lazy\" decoding=\"async\" height=\"1\" src=\"https:\/\/vk.com\/rtrg?p=VK-RTRG-1297426-bEGLU&amp;event=habr_workspace\" style=\"display:none;\" width=\"1\"><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/ex\/rg\/qc\/exrgqcvsrvilgaxihlqtzyqsov4.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/ex\/rg\/qc\/exrgqcvsrvilgaxihlqtzyqsov4.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0430\u0440\u0438\u0439, \u044f DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0443\u043f\u0435\u0440\u0430\u043f\u043f\u0430 <a href=\"https:\/\/teams.vk.com\/\">VK Teams<\/a>. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 ChatOps \u0432 \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445. \u041f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043e \u0441\u0430\u043c\u0438\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u0445 \u0438 \u043c\u0438\u043d\u0438-\u0430\u043f\u043f\u0430\u0445 \u0434\u043b\u044f \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/companies\/vk\/articles\/750206\/\">\u0437\u0434\u0435\u0441\u044c<\/a>.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e, ChatOps \u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432, QA-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432, \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438, \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u044b\u0445 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432, \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0432 \u0435\u0434\u0438\u043d\u0443\u044e \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <a href=\"https:\/\/opsdroid.dev\/\">OpsDroid<\/a>, \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 OpsDroid \u0438 VK Teams, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0431\u043e\u0442\u0430. \u0423\u0432\u0435\u0440\u0435\u043d, \u044d\u0442\u043e\u0442 \u043e\u043f\u044b\u0442 \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u0434\u043b\u044f \u0432\u0430c \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 ChatOps.<\/p>\n<h2>ChatOps \u0438 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u044b<\/h2>\n<p>  \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f ChatOps:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/0j\/cy\/lz\/0jcylzlxwnvs6hiefqrhusqflf4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/0j\/cy\/lz\/0jcylzlxwnvs6hiefqrhusqflf4.png\"\/><\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ja\/wf\/hh\/jawfhhxkgfatj_avgjjo5ad6rzi.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ja\/wf\/hh\/jawfhhxkgfatj_avgjjo5ad6rzi.png\"\/><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 <a href=\"https:\/\/vk-teams.cnews.ru\/articles\/2022-11-15_kak_v_vk_sozdali_korporativnyj_superapp\">VK Teams \u2014 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0443\u043f\u0435\u0440\u0430\u043f\u043f<\/a> \u043e\u0442 VK, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438, \u0431\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0441\u0432\u043e\u0439 \u0442\u0430\u0441\u043a-\u0442\u0440\u0435\u043a\u0435\u0440, \u0432\u0438\u0434\u0435\u043e\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0430 100 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u043c\u0438\u043d\u0438-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\u00a0<\/p>\n<p>  \u0423\u0441\u043f\u0435\u0448\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f ChatOps \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b ChatOps.<\/p>\n<h2>Open-Source-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a OpsDroid<\/h2>\n<p>  <a href=\"https:\/\/github.com\/opsdroid\/opsdroid\">OpsDroid<\/a> \u2014 \u044d\u0442\u043e \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 ChatOps-\u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u0415\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a Slack, MS Teams, Webex Teams, Facebook Messenger, Telegram, Matrix, Discord \u0438 \u0434\u0440\u0443\u0433\u0438\u0445. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 OpsDroid.<\/p>\n<p>  \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 OpsDroid \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/opsdroid\/opsdroid\/tree\/master\/opsdroid\/connector\">\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b<\/a>. \u041e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e \u043d\u0430\u0434 API \u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430\u043c\u0438 \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439. \u041a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c\u0438 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442:<\/p>\n<ul>\n<li>\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f,  <\/li>\n<li>\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438,  <\/li>\n<li>\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0438 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c.  <\/li>\n<\/ul>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 OpsDroid \u0438 VK Teams \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0432\u044f\u0436\u0435\u0442 Bot API VK Teams \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e OpsDroid.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fr\/_a\/gl\/fr_aglgaar96hh5ttdecs3mvymi.png\" data-src=\"https:\/\/habrastorage.org\/webt\/fr\/_a\/gl\/fr_aglgaar96hh5ttdecs3mvymi.png\"\/><\/p>\n<p>  OpsDroid \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u0442\u043e\u0432: \u0432 \u0432\u0438\u0434\u0435 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 (skills) \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f (events), \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u0438\u0445, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c OpsDroid \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0434\u043b\u044f \u0432\u0430\u0441 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043d\u0430 \u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0438\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u043e\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c OpsDroid \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438:<\/p>\n<p>  <b>Linux, MacOS<\/b> \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 Docker (<a href=\"https:\/\/docs.opsdroid.dev\/en\/stable\/installation.html#docker-image\">\u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e<\/a>). \u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u00a0OpsDroid \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Docker, \u043f\u0440\u043e\u0441\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e:<\/p>\n<pre><code class=\"bash\">pip3 install opsdroid[common]  <\/code><\/pre>\n<p>  <a href=\"https:\/\/docs.opsdroid.dev\/en\/stable\/installation.html#windows-10\">\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0434\u043b\u044f <b>Windows<\/b><\/a>.<\/p>\n<h3>\u041a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 OpsDroid-VK Teams<\/h3>\n<p>  \u0414\u043b\u044f \u0441\u0432\u044f\u0437\u0438 VK Teams \u0438 OpsDroid \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 <a href=\"https:\/\/github.com\/mboriskin\/connector-vkteams\">\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440<\/a>.   <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u043e\u0442 \u0435\u0433\u043e \u043a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import aiohttp import asyncio  from opsdroid.connector import Connector from opsdroid.events import Message   class ConnectorVKTeams(Connector): \"\"\"A connector for VK Teams\"\"\"      def __init__(self, config, opsdroid=None): \u00a0\u00a0\u00a0\u00a0    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0     super().__init__(config, opsdroid=opsdroid) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.name = \"vkteams\"  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.opsdroid = opsdroid \u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0self.latest_update = None \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.listening = True \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.default_target = self.default_user \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.session = None \u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0self._closing = asyncio.Event() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.loop = asyncio.get_event_loop()   \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.base_url = config.get(\"base-url\", None) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.default_user = config.get(\"default-user\", None) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.whitelisted_users = config.get(\"whitelisted-users\", None) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.update_interval = config.get(\"update-interval\", 1) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  # \u0431\u0435\u0437 \u0442\u043e\u043a\u0435\u043d\u0430 \u0431\u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.token = config[\"token\"]      async def _get_messages(self): \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 \u0438\u0432\u0435\u043d\u0442\u043e\u0432. \u0418\u0432\u0435\u043d\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c: events\/get \u0438\u0437 Bot API  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  data = { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  'token': self.token, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  'pollTime': 30, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  'lastEventId': 1 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  if self.latest_update is not None: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  data[\"lastEventId\"] = self.latest_update  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  await asyncio.sleep(self.update_interval) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  resp = await self.session.get(self.build_url(\"events\/get\"), params=data)  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  if 200 == resp.status: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  json = await resp.json() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  await self._parse_message(json)      async def _parse_message(self, response): \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  # \u041e\u0442\u0434\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0448\u043b\u0438 \u0432 json-\u0435 \u0438\u0432\u0435\u043d\u0442\u0430  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  for event in response[\"events\"]: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  user = self.get_user(event) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  target = self.get_target(event) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  parsed_event = await self.handle_messages( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  user=user, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  target=target, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  event_id=event.get(\"eventId\"), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  raw_event=event \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  ) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  if parsed_event: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  if self.handle_user_permission(event, user): \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  await self.opsdroid.parse(parsed_event) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  else: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  block_message = Message( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  text=\"\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u0441 \u0431\u043e\u0442\u043e\u043c\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  user=user, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  user_id=user, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  target=target, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  connector=self \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  ) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  await self.send(block_message) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  self.latest_update = event[\"eventId\"] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  elif \"eventId\" in event:                 # \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c                 self.latest_update = event[\"eventId\"] <\/code><\/pre>\n<p>\u00a0\u00a0\u00a0\u00a0  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\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\u044b \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0441\u043e\u0433\u043b\u0430\u0441\u0443\u044f \u0441 Bot API.   <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u043e\u0442 \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import aiohttp  from opsdroid.connector import register_event from opsdroid.events import Message, File  ...   @register_event(Message) async def send_message(self, message):  data = dict() data[\"token\"] = self.token data[\"chatId\"] = message.target data[\"text\"] = message.text  resp = await self.session.post(self.build_url(\"messages\/sendText\"), data=data)   @register_event(File) async def send_file(self, file_event):  data = aiohttp.FormData() data.add_field( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"token\", str(self.token)) data.add_field( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"chatId\", str(file_event.target), content_type=\"multipart\/form-data\") data.add_field( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"file\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await file_event.get_file_bytes(), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0content_type=\"multipart\/form-data\")  async with aiohttp.ClientSession() as session: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0resp = await session.post(self.build_url(\"messages\/sendFile\"), data=data)\u00a0 <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 <a href=\"https:\/\/github.com\/mboriskin\/connector-vkteams\/blob\/master\/vkt_connector.py\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u041a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 OpsDroid \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 VK Teams, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 <a href=\"https:\/\/docs.opsdroid.dev\/en\/stable\/skills\/events.html\">\u0438\u0432\u0435\u043d\u0442\u043e\u0432<\/a> \u043e\u0442 OpsDroid:<\/p>\n<pre><code class=\"python\">from opsdroid.events import JoinGroup  ...  if raw_event.get(\"type\") == \"newChatMembers\": \u00a0\u00a0\u00a0\u00a0return JoinGroup( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0user=f\"@[{user}]\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0user_id=user, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0event_id=event_id, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0target=target, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0connector=self, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0raw_event=raw_event, \u00a0\u00a0\u00a0\u00a0) <\/code><\/pre>\n<p>  \u0418\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 <a href=\"https:\/\/github.com\/mboriskin\/connector-vkteams\/blob\/master\/vkt_events.py\">\u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 (\u0434\u043b\u044f VK Teams \u0441\u043c. <a href=\"https:\/\/myteam.mail.ru\/botapi\/#\/events\/get_events_get\">\/events\/get<\/a>).  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">from opsdroid.events import Message from . import vkt_events  ...  if raw_event['payload']['parts'][0].get(\"type\") == \"forward\": return vkt_events.Forward(         user=f\"@[{user}]\",         user_id=user, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0event_id=event_id, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0target=target, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0message=Message( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text=raw_event['payload']['text'], \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0user=f\"@[{first_part['payload']['message']['from']['userId']}]\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0user_id=first_part['payload']['message']['from']['userId'], \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0connector=self, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0raw_event=first_part, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0connector=self, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0raw_event=raw_event ) <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0432\u044b\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0432\u0430\u0448\u0438 \u0431\u043e\u0442\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 <a href=\"https:\/\/github.com\/mboriskin\/connector-vkteams\/blob\/aba742d7485201193582205d4428bb9e9f83e0f9\/vkt_connector.py#LL253C20-L253C20\">\u0438\u0432\u0435\u043d\u0442\u043e\u0432<\/a>: <i>Reply<\/i>, <i>Forward<\/i>, <i>File<\/i>, <i>Voice<\/i>, <i>Sticker<\/i>, <i>Mention<\/i> \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 <i>Edited Message<\/i>, <i>Deleted Message<\/i>, <i>Pinned\/Unpinned Message<\/i>, <i>Join\/Left chat<\/i> \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0447\u0430\u0442\u0435.<\/p>\n<p>  \u0415\u0449\u0435 OpsDroid \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0448\u0438\u0440\u043e\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f <a href=\"https:\/\/docs.opsdroid.dev\/en\/stable\/testing.html\">\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a>. <a href=\"https:\/\/docs.opsdroid.dev\/en\/stable\/contributing\/workflow.html#running-the-tests\">\u041f\u0440\u0438\u043d\u044f\u0442\u043e<\/a> \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 <a href=\"https:\/\/github.com\/mboriskin\/connector-vkteams\/blob\/master\/tests\/test_connector_vkt.py\">\u0442\u0435\u0441\u0442\u0430\u043c\u0438<\/a>.<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0431\u043e\u0442\u0430 \u0441 OpsDroid<\/h3>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0438\u043c\u0435\u0439\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043d\u0430 \u043d\u0435\u0433\u043e \u0431\u044b\u043b \u0434\u0430\u043d \u043e\u0442\u0432\u0435\u0442 \u0441 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c \u00absend_email\u00bb. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c OpsDroid \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u0432 VK Teams, \u0442\u0430\u043a \u0438 \u0432 Slack \u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Matrix. \u041a\u043e\u0434 \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u0440\u043f\u0438\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043c\u044b \u043e\u0431\u0435\u0440\u043d\u0435\u043c \u0435\u0433\u043e \u0432 OpsDroid. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438 \u0441 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439 <i>payload<\/i> \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043a\u043e\u0434 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435, \u0432 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0438\u0432\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u0430 <i>Reply<\/i>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0438\u0432\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443:  <\/p>\n<pre><code class=\"python\">message.linked_event.text <\/code><\/pre>\n<p>  \u041d\u0430\u0432\u044b\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u043c \u0431\u043e\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435 <i>configuration.yaml<\/i>, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">from opsdroid.skill import Skill from opsdroid.matchers import match_regex from opsdroid.constraints import constrain_connectors   class SendEmailSkill(Skill):  \u00a0\u00a0\u00a0\u00a0@match_regex(r'send_email', matching_condition=\"fullmatch\") \u00a0\u00a0\u00a0\u00a0async def send_email(self, message): \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if not isinstance(message, Reply): \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await message.respond(\"\u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0440\u0435\u043f\u043b\u0430\u0439 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0441\u043b\u0430\u0442\u044c \u043d\u0430 \u0438\u043c\u0435\u0439\u043b\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0message_for_email = f\"{message.linked_event.user_id}:\\n\\n\" \\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0f\"{message.linked_event.text}\\n\\n\"  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0send_email(to=[\"your.real.email@mail.ru\"], \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0subject=f\"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 {message.connector.name}(opsdroid)\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text=message_for_email) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await message.respond(f\"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0441\u043b\u0430\u043d\u043e \u043d\u0430 \u0438\u043c\u0435\u0439\u043b\")   \u00a0\u00a0\u00a0\u00a0@match_regex(r'send_email', matching_condition=\"fullmatch\") \u00a0\u00a0\u00a0\u00a0@constrain_connectors(['slack']) \u00a0\u00a0\u00a0\u00a0async def send_email_slack(self, message): \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0slack = self.opsdroid.get_connector('slack')  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0thread_timestamp = message.raw_event.get('thread_ts', None) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0replies = await slack.slack_web_client.conversations_replies( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0channel=message.target, ts=thread_timestamp \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0messages = replies['messages']  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0thread_head = messages[0] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0users_info = await slack.slack_web_client.users_info(user=thread_head['user'])  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0message_for_email += f\"{users_info.get('user').get('real_name')}:\" \\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0f\"\\n\\n{thread_start['text']}\\n\\n\"  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0send_email(to=[\"your.real.email@mail.ru\"], \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0subject=f\"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 Slack (opsdroid)\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text=remove_emoji(message_for_email)) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await message.respond(f\"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0441\u043b\u0430\u043d\u043e \u043d\u0430 \u0438\u043c\u0435\u0439\u043b\") <\/code><\/pre>\n<p>  \u041a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0432\u044b\u043a\u0430 \u0434\u043b\u044f Slack \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 Slack \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f \u0438\u0432\u0435\u043d\u0442\u0430 <i>Reply<\/i>. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <i>constrain_connectors<\/i>, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0431\u043e\u0442 \u043f\u0440\u0438\u043d\u044f\u043b \u0438\u0432\u0435\u043d\u0442 \u0432 Slack, \u043e\u043d \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u043b \u0435\u0433\u043e \u043e\u0434\u043d\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0430 \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043d\u044f\u043b \u0432 VK Teams \u0438\u043b\u0438 \u0432 Matrix \u2014 \u0442\u043e \u0434\u0440\u0443\u0433\u0438\u043c, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c. \u041a\u043e\u0434\u044b \u043d\u0430\u0432\u044b\u043a\u0430 \u0434\u043b\u044f VK Teams \u0438 Matrix \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.<\/p>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0432\u044b\u043a\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 <a href=\"https:\/\/github.com\/mboriskin\/connector-vkteams\/blob\/master\/bot\/skills\/email_sender\/__init__.py\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u043e\u043b\u043d\u0443\u044e <a href=\"https:\/\/docs.opsdroid.dev\/en\/stable\/skills\/index.html\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e OpsDroid<\/a>.<\/p>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  .<br \/>  \u251c\u2500\u2500 Dockerfile*<br \/>  \u251c\u2500\u2500 configuration.yaml<br \/>  \u2514\u2500\u2500 skills<br \/>  \u00a0\u00a0\u00a0\u00a0\u2514\u2500\u2500 email_sender (\u0438\u043c\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0441\u043a\u0438\u043b\u043b\u0430)<br \/>  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u2514\u2500\u2500 __init__.py<\/p>\n<p>  * Dockerfile \u2014 \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 OpsDroid \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e docker.<\/p>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">cd \/home\/username\/Projects  mkdir -p my_opsdroid_project\/skills\/email_sender  cd my_opsdroid_project  vim __init__.py\u00a0 &lt;- \u0441\u044e\u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043a\u043e\u0434 \u043d\u0430\u0432\u044b\u043a\u0430 <\/code><\/pre>\n<p>  \u0421\u043e\u0431\u0435\u0440\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u043e\u0442\u0430:  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">configuration.yaml<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">logging: \u00a0\u00a0level: debug \u00a0\u00a0timestamp: true \u00a0 welcome-message: false \u00a0 # Web server web: \u00a0\u00a0host: '0.0.0.0' \u00a0\u00a0port: 8080 \u00a0 ## Parsers parsers: []  ## Connectors modules connectors: \u00a0\u00a0vkteams: \u00a0\u00a0\u00a0\u00a0token: \"VKT_BOT_TOKEN\"\u00a0 # &lt;- \u0442\u043e\u043a\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0443 \u041c\u0435\u0442\u0430\u0431\u043e\u0442\u0430 \u00a0\u00a0\u00a0\u00a0bot-name: \"email_sender_bot\"\u00a0 # &lt;- \u0438\u043c\u044f \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0434\u0430\u043b\u0438 \u041c\u0435\u0442\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u00a0\u00a0\u00a0\u00a0base-url: \"api.my-company.myteam.mail.ru\/bot\/v1\/\"\u00a0 # &lt;- base-url \u0431\u043e\u0442-\u0430\u043f\u0438 \u00a0\u00a0\u00a0\u00a0repo: https:\/\/github.com\/mboriskin\/connector-vkteams\u00a0 # &lt;- \u043a\u043e\u0434 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430  \u00a0 # \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c slack - https:\/\/docs.opsdroid.dev\/en\/stable\/connectors\/slack.html \u00a0\u00a0slack: \u00a0\u00a0\u00a0\u00a0bot-token: \"SLACK_BOT_TOKEN\" \u00a0\u00a0\u00a0\u00a0bot-name: \"email_sender_bot\" \u00a0\u00a0\u00a0\u00a0socket-mode: true \u00a0\u00a0\u00a0\u00a0app-token: \"SLACK_APP_TOKEN\"  \u00a0\u00a0# \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c matrix - https:\/\/docs.opsdroid.dev\/en\/stable\/connectors\/matrix.html \u00a0\u00a0matrix: \u00a0\u00a0\u00a0\u00a0mxid: \"@bot_account_username:matrix.org\" \u00a0\u00a0\u00a0\u00a0password: \"bot_account_password\" \u00a0\u00a0\u00a0\u00a0rooms: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'main': '#my-corporate-bots:matrix.org' \u00a0\u00a0\u00a0\u00a0nick: \"Botty EmailSender\" \u00a0\u00a0\u00a0  ## Skill modules skills: \u00a0\u00a0## Hello (https:\/\/github.com\/opsdroid\/skill-hello) \u00a0\u00a0hello: {}\u00a0 # &lt;- \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0432\u044b\u043a \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u00a0 \u00a0\u00a0## \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u0438\u043c\u0435\u0439\u043b \u00a0\u00a0email_sender: \u00a0\u00a0\u00a0\u00a0path: \/opt\/opsdroid\/skills\/email_sender\u00a0 # &lt;- \u0442\u0430\u043c \u043b\u0435\u0436\u0438\u0442 \u043d\u0430\u0432\u044b\u043a (\u0435\u0441\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 docker) \u00a0\u00a0\u00a0\u00a0no-cache: true \u00a0\u00a0\u00a0\u00a0app-name: my_opsdroid_vkt <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0421\u043e\u0431\u0435\u0440\u0435\u043c \u0431\u043e\u0442\u0430:  <\/p>\n<pre><code class=\"bash\">opsdroid config -f configuration.yaml build<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0432 \u0440\u0430\u0431\u043e\u0442\u0443:  <\/p>\n<pre><code class=\"bash\">opsdroid start <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 Docker \u0441\u0442\u044f\u043d\u0438\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442 <a href=\"https:\/\/github.com\/mboriskin\/connector-vkteams\/blob\/master\/startup.sh\">startup.sh<\/a> \u0438 <a href=\"https:\/\/github.com\/mboriskin\/connector-vkteams\/blob\/master\/bot\/Dockerfile\">Dockerfile<\/a> \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438. \u0417\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u043e\u0442\u0430:  <\/p>\n<pre><code class=\"bash\">IMAGE_NAME=\"my_opsdroid_vkt\" .\/startup.sh --build <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u043c\u043e\u0436\u0435\u043c \u043a\u0430\u043a \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e (\u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0437\u0430 \u043b\u043e\u0433\u0430\u043c\u0438):  <\/p>\n<pre><code class=\"bash\">.\/startup.sh --run <\/code><\/pre>\n<p>  \u0422\u0430\u043a \u0438 \u0432 \u0444\u043e\u043d\u0435:  <\/p>\n<pre><code class=\"bash\">.\/startup.sh --runbg <\/code><\/pre>\n<p>  \u0418 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0435\u0442 \u0432\u0440\u0435\u043c\u044f, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u043e\u0442\u0430:  <\/p>\n<pre><code class=\"bash\">.\/startup.sh --stop<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0438\u0439 \u043e\u0431\u0440\u0430\u0437:  <\/p>\n<pre><code class=\"bash\">.\/startup.sh --remove<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u043e\u0442\u0430 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u043c\u0443 \u043b\u0438\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u043c \u0447\u0430\u0442\u0435, \u043a\u0443\u0434\u0430 \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d, \u0438 \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u043d\u0443\u0436\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0438\u043c\u0435\u0439\u043b.<\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Slack:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/kz\/vg\/ep\/kzvgepclez1asy7uicieq6f2p8s.png\" data-src=\"https:\/\/habrastorage.org\/webt\/kz\/vg\/ep\/kzvgepclez1asy7uicieq6f2p8s.png\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fk\/lt\/lh\/fkltlhppnfyg8ztcukm8msiznlu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/fk\/lt\/lh\/fkltlhppnfyg8ztcukm8msiznlu.png\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/6w\/uq\/lx\/6wuqlxwwwgmluffbhsk5hg6uu3e.png\" data-src=\"https:\/\/habrastorage.org\/webt\/6w\/uq\/lx\/6wuqlxwwwgmluffbhsk5hg6uu3e.png\"\/><\/p>\n<p>  \u0412 VK Teams:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/eo\/zm\/0z\/eozm0zhcfnaqxznnw7i7iugbuie.png\" data-src=\"https:\/\/habrastorage.org\/webt\/eo\/zm\/0z\/eozm0zhcfnaqxznnw7i7iugbuie.png\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fk\/lt\/lh\/fkltlhppnfyg8ztcukm8msiznlu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/fk\/lt\/lh\/fkltlhppnfyg8ztcukm8msiznlu.png\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/r0\/tq\/gj\/r0tqgjlwnm63iir6jh_2lbj7fsm.png\" data-src=\"https:\/\/habrastorage.org\/webt\/r0\/tq\/gj\/r0tqgjlwnm63iir6jh_2lbj7fsm.png\"\/><\/p>\n<p>  \u0418 \u0432 Matrix:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/f1\/xz\/xf\/f1xzxfpmrg3hx_5xbar6c2coade.png\" data-src=\"https:\/\/habrastorage.org\/webt\/f1\/xz\/xf\/f1xzxfpmrg3hx_5xbar6c2coade.png\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fk\/lt\/lh\/fkltlhppnfyg8ztcukm8msiznlu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/fk\/lt\/lh\/fkltlhppnfyg8ztcukm8msiznlu.png\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/v-\/jc\/v9\/v-jcv9xizehrtwfn0lkvkuehcpq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/v-\/jc\/v9\/v-jcv9xizehrtwfn0lkvkuehcpq.png\"\/><\/p>\n<p>  OpsDroid \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u043e\u0449\u043d\u044b\u0439 \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 ChatOps-\u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a Slack, MS Teams, VK Teams \u0438 \u0434\u0440\u0443\u0433\u0438\u0445, OpsDroid \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 \u0431\u043e\u0442\u0430\u043c\u0438. \u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0435\u0434\u0438\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u041d\u0430\u0432\u044b\u043a\u0438 \u0432 OpsDroid \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u043e\u0442\u043e\u0432, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 OpsDroid \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0445 \u0431\u043e\u0442\u043e\u0432, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.<\/p>\n<h3>\u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f OpsDroid \u043c\u043e\u0436\u043d\u043e \u0448\u0430\u0440\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430\u043c\u0438.<\/h3>\n<p>  \u041c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f OpsDroid \u0438 \u0437\u0430\u0442\u0435\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 VK Teams \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043f\u0438\u0441\u043e\u043a \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<ul>\n<li><a href=\"https:\/\/github.com\/kadasz\/skill-ssh\">skill-ssh<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 Linux-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SSH-\u043a\u043e\u043c\u0430\u043d\u0434;  <\/li>\n<li><a href=\"https:\/\/github.com\/akmalovaa\/opsdroid_docker\">skill-devops<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 Docker \u0438 Gitlab;  <\/li>\n<li><a href=\"https:\/\/github.com\/FabioRosado\/skill-sysanalytics\">skill-sysanalytics<\/a> \u2014 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435 OpsDroid;  <\/li>\n<li><a href=\"https:\/\/github.com\/dud1337\/nginx_rtmp_opsdroid\">skill-nginx-rtmp<\/a> \u2014 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 nginx-rtmp \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0446\u0435\u043b\u043e\u043c;  <\/li>\n<li><a href=\"https:\/\/github.com\/Cadair\/skill-github-linker\">skill-github-linker<\/a> \u2014 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 GitHub Issues \u0438 PR \u043f\u0440\u0438 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0438;  <\/li>\n<li><a href=\"https:\/\/github.com\/ifosch\/skill-jenkins\">skill-jenkins<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 Jenkins;  <\/li>\n<li><a href=\"https:\/\/github.com\/mayflower\/opsdroid-repohook\">skill-repohook<\/a> \u2014 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 Git{Hub|Lab};  <\/li>\n<li><a href=\"https:\/\/github.com\/codexlynx\/opsdroid-skill-docker-daemon\">skill-docker-daemon<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Docker;  <\/li>\n<li><a href=\"https:\/\/github.com\/alibahramian\/opsdroid-k8s-skills\">skill-k8s<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Kubernetes;\u00a0  <\/li>\n<li><a href=\"https:\/\/github.com\/szimszon\/skill-shell\">skill-shell<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 shell-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432;  <\/li>\n<li><a href=\"https:\/\/github.com\/szimszon\/skill-yourextip\">skill-yourextip<\/a> \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0432 \u0447\u0430\u0442\u0435;  <\/li>\n<li><a href=\"https:\/\/github.com\/mahdi1234\/opsdroid-taginfo\">skill taginfo<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 OpenStreetMap;  <\/li>\n<li><a href=\"https:\/\/github.com\/jseiser\/skill-awx\">skill-awx<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 AWX;  <\/li>\n<li><a href=\"https:\/\/github.com\/d10v\/skill-grafana-annotation\">skill-grafana-annotation<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 Grafana;  <\/li>\n<li><a href=\"https:\/\/github.com\/codexlynx\/opsdroid-skill-prometheus-scraper\">skill-prometheus-scrape<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a \u0447\u0435\u0440\u0435\u0437 Prometheus \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0447\u0430\u0442\u0430;  <\/li>\n<li><a href=\"https:\/\/github.com\/opsdroid\/skill-github\">skill-github<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 GitHub;  <\/li>\n<li><a href=\"https:\/\/github.com\/opsdroid\/skill-cloudhealth\">skill-cloudhealth<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 CloudHealth;  <\/li>\n<li><a href=\"https:\/\/github.com\/FabioRosado\/skill-reminders\">skill-reminders<\/a> \u2014 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439;  <\/li>\n<li><a href=\"https:\/\/github.com\/whateverany-scratch\/opsdroid-minecraft-skill\">skill-minecraft<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043b\u043e\u0433\u043e\u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Minecraft;  <\/li>\n<li><a href=\"https:\/\/github.com\/opsdroid\/skill-google-it\">skill-google-it<\/a> \u2014 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u0432 Google;  <\/li>\n<li><a href=\"https:\/\/github.com\/opsdroid\/skill-iss\">skill-iss<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u041c\u041a\u0421;  <\/li>\n<li><a href=\"https:\/\/github.com\/Cadair\/skill-formula1-schedule\">skill-formula1-schedule<\/a> \u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f \u00ab\u0424\u043e\u0440\u043c\u0443\u043b\u044b-1\u00bb \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439;  <\/li>\n<li><a href=\"https:\/\/github.com\/opsdroid\/skill-random\">skill-random<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430: \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439;  <\/li>\n<li><a href=\"https:\/\/github.com\/opsdroid\/skill-words\">skill-words<\/a> \u2014 \u043d\u0430\u0432\u044b\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c NLTK \u0434\u043b\u044f \u0438\u0433\u0440\u044b \u0432 \u0441\u043b\u043e\u0432\u0430;  <\/li>\n<li><a href=\"https:\/\/github.com\/opsdroid\/skill-word-of-the-day\">skill-word-of-the-day<\/a> \u2014 \u043f\u0440\u0438\u0441\u043b\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e \u0434\u043d\u044f \u0438\u0437 \u041e\u043a\u0441\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430.  <\/li>\n<\/ul>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  ChatOps \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u044b, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u043e\u043b\u0438 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0435\u0434\u0438\u043d\u0443\u044e \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443.\u00a0<\/p>\n<p>  VK Teams \u043a\u0430\u043a \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0443\u043f\u0435\u0440\u0430\u043f\u043f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0439. \u0423\u0441\u043f\u0435\u0448\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f ChatOps \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b ChatOps.<\/p>\n<p>  OpsDroid \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 ChatOps-\u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0443\u044e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a Slack, MS Teams, VK Teams, Matrix \u0438 \u0434\u0440\u0443\u0433\u0438\u0445. \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430\u043c\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445.<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f OpsDroid \u0431\u044b\u043b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0431\u043e\u0442, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0438\u043c\u0435\u0439\u043b \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 OpsDroid \u0438 \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445 \u0442\u0430\u043a\u043e\u0439 \u0431\u043e\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043a\u0430\u043a \u0432 VK Teams, \u0442\u0430\u043a \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Slack \u0438\u043b\u0438 Matrix.<\/p>\n<p>  \u041c\u044b \u043e\u0442\u043c\u0435\u0442\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 OpsDroid, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 VK Teams \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430\u0445. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0430\u0432\u044b\u043a\u0438 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0431\u043e\u0442\u0430\u043c\u0438.<\/p>\n<p>  \u0412 \u0446\u0435\u043b\u043e\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f OpsDroid \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 VK Teams \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0438 \u0433\u0438\u0431\u043a\u0438\u0435 ChatOps-\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0443\u043b\u0443\u0447\u0448\u0430\u044f \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044e, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u044f \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p><\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/750208\/\"> https:\/\/habr.com\/ru\/articles\/750208\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><img loading=\"lazy\" decoding=\"async\" height=\"1\" src=\"https:\/\/vk.com\/rtrg?p=VK-RTRG-1297426-bEGLU&amp;event=habr_workspace\" style=\"display:none;\" width=\"1\"><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/ex\/rg\/qc\/exrgqcvsrvilgaxihlqtzyqsov4.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/ex\/rg\/qc\/exrgqcvsrvilgaxihlqtzyqsov4.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0430\u0440\u0438\u0439, \u044f DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0443\u043f\u0435\u0440\u0430\u043f\u043f\u0430 <a href=\"https:\/\/teams.vk.com\/\">VK Teams<\/a>. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 ChatOps \u0432 \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445. \u041f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043e \u0441\u0430\u043c\u0438\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u0445 \u0438 \u043c\u0438\u043d\u0438-\u0430\u043f\u043f\u0430\u0445 \u0434\u043b\u044f \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/companies\/vk\/articles\/750206\/\">\u0437\u0434\u0435\u0441\u044c<\/a>.  <\/p>\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-401054","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/401054","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=401054"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/401054\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=401054"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=401054"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=401054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}