{"id":404519,"date":"2024-06-29T17:44:57","date_gmt":"2024-06-29T17:44:57","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=404519"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=404519","title":{"rendered":"<span>Slack Ruby App. \u0427\u0430\u0441\u0442\u044c 1. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Sinatra \u0438 ngrok<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438, \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0447\u0430\u0445 Slack, \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u044e\u0434\u0435\u0439 \u0437\u0430\u0445\u043e\u0434\u044f\u0442 \u0432 \u0418\u0422, \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f Slack \u0438 \u043e\u043d, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043a\u0443\u0434\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0437\u0430\u0439\u0442\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043f\u0440\u0438\u043a\u043e\u043b \u043e\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430.<\/p>\n<p>\u0421\u0430\u043c \u044f \u043f\u0440\u043e\u0448\u0451\u043b \u043f\u0443\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u043c \u0431\u0440\u0435\u0434\u043d\u044f\u043c, \u0432\u044b\u0440\u0432\u0430\u043d\u044b\u043c \u043a\u0443\u0441\u043a\u0430\u043c \u0438\u0437 Stack Overflow, \u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u043e\u0431, \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439. \u041d\u0435 \u0438\u043c\u0435\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u0430\u043a \u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0445\u043e\u0442\u0435\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>\u0411\u044b\u043b\u043e \u0431\u044b \u043a\u0440\u0443\u0442\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u043c\u0435\u043b\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431 (\u0438\u043b\u0438 \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431) \u043c\u043e\u0433 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u0430 \u0438\u043b\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043b\u044e\u0431\u0438\u043c\u043e\u0433\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0432\u043e\u0439 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e Slack Workspace.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u044f \u043e\u043f\u0438\u0448\u0443 \u044d\u0442\u0430\u043f\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e Slack \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 Workspace!<\/p>\n<p>\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0440\u043e\u0437\u0431\u0438\u0442\u044c \u043d\u0430 3 \u0441\u0442\u0430\u0442\u044c\u0438, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0438\u043c\u0438:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Sinatra \u0438 ngrok (\u041c\u044b \u0437\u0434\u0435\u0441\u044c).<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/578798\/\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0430\u0440\u0442\u043e\u0432, \u0438\u043b\u0438 \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440 \u0444\u0440\u043e\u043d\u0442\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. <\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/586488\/\" rel=\"noopener noreferrer nofollow\">\u0422\u0443\u0441\u043e\u0432\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0442\u0430\u043a\u0438\u043c \u0433\u043e\u0441\u0442\u0435\u043c \u043a\u0430\u043a Heroku.<\/a><\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 <\/h2>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 Ruby &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0438\u0447\u043d\u043e \u044f \u043f\u0438\u0448\u0443 \u043f\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043e\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439, \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u0440\u0438\u043a\u043e\u043b\u0430\u043c\u0438 \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430\u043c\u0438. <\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 Slack &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f Telegram \u0431\u043e\u0442\u0430 \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u043f\u043e\u0441\u0442, <a href=\"https:\/\/habr.com\/ru\/post\/535618\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430<\/a>, \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c workspace \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0440\u0435\u043c\u044f, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\/\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438\u0441\u044c. \u0411\u044b\u043b\u0430 \u0431\u044b \u0443 \u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0442\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b \u0431\u044b \u0441\u0435\u0431\u0435 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \ud83d\ude42<\/p>\n<p>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0446\u0438\u043a\u043b\u0430 : <\/p>\n<ol>\n<li>\n<p><a href=\"#prepare\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430 <\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#arch\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e\u0431 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#gems\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e \u0433\u0435\u043c\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#auth\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 workspace (\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#slash_commands\" rel=\"noopener noreferrer nofollow\">\u0423\u0447\u0438\u043c\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c Slash Commands <\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#modals\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b Slash Commands<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#events\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0432\u0435\u043d\u0442\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#results\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<p><a class=\"anchor\" name=\"prepare\" id=\"prepare\"><\/a><\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430<\/h2>\n<p>\u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0439 \u044d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f <\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u0431\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f : <\/p>\n<ul>\n<li>\n<p>ngrok<\/p>\n<\/li>\n<li>\n<p>PostgreSQL<\/p>\n<\/li>\n<li>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0443\u0436\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b, <a href=\"https:\/\/github.com\/sorshireality\/teamplate-slack-ruby-app\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 Git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 ngrok<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443 (\u043d\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b), \u0432 \u0446\u0435\u043b\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \ud83d\ude42 <\/p>\n<h3>\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0411\u0414 \u043d\u0430 PostgreSQL<\/h3>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 MacOs, \u0445\u0437 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430 \u041b\u0438\u043d\u0443\u043a\u0441\u0435 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.<\/p>\n<p>\u0412\u044b\u0431\u043e\u0440 PostgreSql \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u043d, \u0434\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 Heroku \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b SQLite 3 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442 Heroku \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SQLite \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0444\u043e\u0440\u0441\u044f\u0442 PostgreSql, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c &#8230;<\/p>\n<p>\u0412\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 (\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435)<\/p>\n<pre><code>psql -l <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 : <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/093\/995\/ff5\/093995ff54011c57fc3f457bfd87f0d7.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0411\u0414 + \u0438\u0445 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u044b \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0411\u0414 + \u0438\u0445 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u044b \" width=\"1604\" height=\"398\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/093\/995\/ff5\/093995ff54011c57fc3f457bfd87f0d7.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0411\u0414 + \u0438\u0445 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u044b <\/figcaption><\/figure>\n<pre><code>sudo psql -U oleksandrtutunnik -d postgres<\/code><\/pre>\n<p>\u041d\u0430 \u043c\u0435\u0441\u0442\u0435 oleksandrtutunnik \u043f\u0438\u0448\u0438\u0442\u0435 \u0441\u0432\u043e\u0435\u0433\u043e owner \u0441 \u0420\u0438\u0441\u0443\u043d\u043a\u0430 1, \u0411\u0414 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e postgres \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0434\u043b\u044f SQL \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432 \u0411\u0414.<\/p>\n<pre><code>CREATE DATABASE habr_one_love; CREATE USER admin WITH password 'admin'; GRANT ALL ON DATABASE habr_one_love TO admin; \\q<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0411\u0414 habr_one_love, \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u044e\u0437\u0435\u0440\u0430, \u0442\u0440\u0435\u0442\u044c\u044f \u0434\u043b\u044f \u043a\u043e\u0440\u043e\u043b\u0435\u0432\u0441\u043a\u0438\u0445 \u0443\u0434\u043e\u0431\u0441\u0442\u0432. `\\q` \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u0441 \u044d\u0442\u043e\u0439 \u0448\u0442\u0443\u043a\u0438 (quit).<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/38b\/0a6\/c67\/38b0a6c676bfa61822f9757bb3ee585e.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u043e\u0438\u043d \u043b\u0430\u0439\u043a\u0430.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u043e\u0438\u043d \u043b\u0430\u0439\u043a\u0430.\" width=\"1648\" height=\"442\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/38b\/0a6\/c67\/38b0a6c676bfa61822f9757bb3ee585e.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u043e\u0438\u043d \u043b\u0430\u0439\u043a\u0430.<\/figcaption><\/figure>\n<p>\u042f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c RubyMine, \u0411\u0414 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 DataGrip, Workbench \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. <\/p>\n<p>\u041d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 3 &#8212; \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u044b \u0432 RubyMine. \u0423 \u0432\u0430\u0441 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u0441\u044f \u043f\u043e\u043b\u044f: name, comment, user, password, Database. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435, \u043f\u043e \u0438\u0434\u0435\u0435, \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u0436\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d5f\/7f1\/dc2\/d5f7f1dc26e02184ab8a24edca61d229.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f DB \u0432 RubyMine\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f DB \u0432 RubyMine\" width=\"1590\" height=\"1188\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d5f\/7f1\/dc2\/d5f7f1dc26e02184ab8a24edca61d229.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f DB \u0432 RubyMine<\/figcaption><\/figure>\n<h3>\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c GitHub \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/h3>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u043f\u0438\u0448\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <\/p>\n<pre><code>git clone https:\/\/github.com\/sorshireality\/teamplate-slack-ruby-app<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f Slack (Slack  \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \ud83d\ude42 )<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"arch\" id=\"arch\"><\/a><\/p>\n<h2>\u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e\u0431 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u041d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 4 \u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d64\/34d\/a1f\/d6434da1fb66521620d67ccd6a69f0ca.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" width=\"406\" height=\"301\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d64\/34d\/a1f\/d6434da1fb66521620d67ccd6a69f0ca.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<\/p>\n<p>\u0424\u0430\u0439\u043b\u044b Git \u0431\u0430\u0437\u043e\u0432\u044b\u0435: .gitignore, README.md, CHANGELOG.md<br \/>\u0424\u0430\u0439\u043b\u044b Ruby: Gemfile \u0438 \u0444\u0430\u0439\u043b \u0441 \u043c\u043e\u0438\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c Gemfile.lock <br \/>\u0424\u0430\u0439\u043b auth.rb \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u043e\u0432\u044b\u0445 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 (Slack Workspace) \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <br \/>\u0424\u0430\u0439\u043b env.rb \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0442\u0438\u043f\u0443 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<p>\u0424\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0435 Listeners \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043e\u0442 Slack \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <br \/>\u0421\u0435\u0439\u0447\u0430\u0441 \u0442\u0443\u0442 \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Slack Commands, Events, Interactivity Actions. \u041f\u043e\u043f\u043e\u0437\u0436\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0447\u0442\u043e \u043a \u0447\u0435\u043c\u0443. <\/p>\n<p>\u0424\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0435 Components \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u044e\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d, \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438 \u043a\u043b\u0430\u0441\u0441\u044b. \u0421\u0435\u0439\u0447\u0430\u0441 \u0442\u0443\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"gems\" id=\"gems\"><\/a><\/p>\n<h2>\u041f\u0440\u043e \u0433\u0435\u043c\u044b<\/h2>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 Bundler \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0435\u043c\u0430\u043c\u0438. \u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e \u0440\u0430\u043d\u0435\u0435, \u0448\u0430\u0431\u043b\u043e\u043d \u043e\u0441\u043d\u0430\u0449\u0435\u043d Gemfile.lock \u0444\u0430\u0439\u043b\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443 \u0432\u0430\u0441 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u043d\u0430\u044f \u043e\u0442 \u043c\u043e\u0435\u0439 \u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435 \u043f\u043e\u0448\u0435\u043b \u043f\u043e <s>\u043f\u0438\u0437<\/s> \u043a\u0440\u0438\u0432\u043e\u0439 \u0434\u043e\u0440\u043e\u0436\u043a\u0435.<\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u043e Gemfile \u043e\u0441\u043d\u0430\u0449\u0435\u043d \u0442\u0430\u043a\u0438\u043c\u0438 \u0433\u0435\u043c\u0430\u043c\u0438 : <\/p>\n<pre><code class=\"ruby\">source 'http:\/\/rubygems.org'  gem 'pg' ---> \u0413\u0435\u043c \u0434\u043b\u044f PostgreSQL gem 'sinatra', '~> 1.4.7' ---> \u0413\u0435\u043c-\u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442 SLACK API. gem 'slack-ruby-client', '~> 0.17.0' ---> \u041e\u0447\u0435\u043d\u044c-\u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0433\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Slack API, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u0431\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a, \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.<\/code><\/pre>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 (\u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435) \u0438 \u0434\u0430\u043b\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u043c\u0438 \u0433\u0435\u043c\u0430\u043c\u0438, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 : <\/p>\n<pre><code>bundle install<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0451 \u0442\u0430\u043a \u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"auth\" id=\"auth\"><\/a><\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 workspace (\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)<\/h2>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 <a href=\"https:\/\/api.slack.com\/apps\" rel=\"noopener noreferrer nofollow\">api.slack.com<\/a>, \u0442\u0430\u043c \u043a\u043b\u0430\u0446\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 5.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/41d\/87f\/214\/41d87f2140c11040fe21ad6937b52e25.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" width=\"1060\" height=\"980\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/41d\/87f\/214\/41d87f2140c11040fe21ad6937b52e25.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c &#8212; \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ede\/efc\/0a4\/edeefc0a4c40289df3cda115a3d97708.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c\" width=\"2240\" height=\"1188\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ede\/efc\/0a4\/edeefc0a4c40289df3cda115a3d97708.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c<\/figcaption><\/figure>\n<p>\u041d\u0430 \u043c\u0435\u043d\u044e\u0448\u043a\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Basic Information \u0438 \u0438\u0449\u0435\u043c \u0431\u043b\u043e\u043a App Credentials, \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 6 \u0435\u0433\u043e \u043a\u0440\u0430\u0435\u0448\u0435\u043a \u0432\u0438\u0434\u0435\u043d. \u0422\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b env.rb \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0444\u0430\u0439\u043b env.rb \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c ngrok \u0438 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u0445\u043e\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0442 ngrok \u0432<strong> SLACK_REDIRECT_URI.<\/strong><\/p>\n<pre><code>.\/ngrok http 9292<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0442\u043e\u0438\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0443 \u0432\u0430\u0441 \u043b\u0435\u0436\u0438\u0442 \u0444\u0430\u0439\u043b ngrok. <br \/>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 7<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/75b\/1ac\/415\/75b1ac415a168f60f87ab5ac2acd6ed8.jpg\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. Output \u043e\u0442 ngrok\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. Output \u043e\u0442 ngrok\" width=\"1280\" height=\"213\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/75b\/1ac\/415\/75b1ac415a168f60f87ab5ac2acd6ed8.jpg\" data-blurred=\"true\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. Output \u043e\u0442 ngrok<\/figcaption><\/figure>\n<p>\u0412\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 env.rb \u0438\u043c\u0435\u043d\u043d\u043e \u0430\u0434\u0440\u0435\u0441 \u0441 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u043e\u0439 https (\u044d\u0442\u043e Slack \u0442\u0430\u043a \u0445\u043e\u0447\u0435\u0442, \u043d\u0435 \u044f \ud83d\ude42 ), \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e : https:\/\/d69e-31-202-13-150.ngrok.io, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043b\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a <\/p>\n<pre><code class=\"ruby\">ENV['SLACK_REDIRECT_URI'] = \"https:\/\/d69e-31-202-13-150.ngrok.io\/finish_auth\"<\/code><\/pre>\n<p> \u0418 \u0447\u0442\u043e \u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 8 :  <\/p>\n<pre><code>rackup<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a90\/52e\/f78\/a9052ef78c9ac55e8365008bb7d369ce.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b rackup\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b rackup\" width=\"1188\" height=\"338\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a90\/52e\/f78\/a9052ef78c9ac55e8365008bb7d369ce.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b rackup<\/figcaption><\/figure>\n<h3>\u0414\u0435\u043f\u043b\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u043c\u0435\u043d\u044e\u0448\u043a\u0435 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 OAuth &amp; Permissions. \u041d\u0430 \u044d\u0442\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0432 \u0431\u043b\u043e\u043a\u0435 Scopes \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0441\u0445\u043e\u0436\u0438\u0435 \u0441 \u0442\u0435\u043c\u0438, \u0447\u0442\u043e \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 9.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2fd\/a75\/e88\/2fda75e883a30009fe3a6e140b4cc558.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. Scopes \u043d\u0430\u0448\u0435\u0433\u043e app\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. Scopes \u043d\u0430\u0448\u0435\u0433\u043e app\" width=\"1398\" height=\"1228\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2fd\/a75\/e88\/2fda75e883a30009fe3a6e140b4cc558.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. Scopes \u043d\u0430\u0448\u0435\u0433\u043e app<\/figcaption><\/figure>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0432 \u0431\u043b\u043e\u043a Redirect URLs \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e env.rb \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u044f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0442\u0443\u0442 \u0438\u0433\u0440\u044b \u0438\u0433\u0440\u0430\u0442\u044c \u0441 \u043e\u0434\u043d\u0438\u043c workspace, \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0438\u0434\u0451\u043c \u0432 Basic Information > Manage Distribution -> Distribute. \u041e\u0442\u043c\u0435\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0433\u0430\u043b\u043e\u0447\u043a\u0438 (\u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0445\u0430\u0440\u0434\u043a\u043e\u0434, \u043d\u043e \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043d\u0430 Heroku \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u0437\u0430\u043b\u0438\u0442\u044c App). \u0418 \u0432\u043d\u0438\u0437\u0443 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Active Public Distribution. <\/p>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u043d\u0430\u043b\/workspace<\/h3>\n<p>\u0421\u0432\u0435\u0440\u0445\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Manage Distribute \u0435\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Workspace, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u044d\u0442\u0443 \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0430\u043c\u0438 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/25f\/f97\/6ad\/25ff976ad84c778c50a9cc620227b42c.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043b\u044e\u0431\u043e\u0439 Slack Workspace\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043b\u044e\u0431\u043e\u0439 Slack Workspace\" width=\"1398\" height=\"1370\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/25f\/f97\/6ad\/25ff976ad84c778c50a9cc620227b42c.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043b\u044e\u0431\u043e\u0439 Slack Workspace<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8a6\/574\/2fb\/8a65742fb203a539509c929201fd96d4.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 11. \u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e :)\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 11. \u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e :)\" width=\"566\" height=\"76\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a6\/574\/2fb\/8a65742fb203a539509c929201fd96d4.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 11. \u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e \ud83d\ude42<\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0411\u0414, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 oauth_access \u0438 \u0432 \u043d\u0435\u0439 \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e Workspace. \u041e\u0434\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c &#8212; \u043e\u0434\u0438\u043d Workspace. <\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"slash_commands\" id=\"slash_commands\"><\/a><\/p>\n<h3>\u0423\u0447\u0438\u043c\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c Slash Commands<\/h3>\n<p>\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c > Slash Commands \u0438 \u0442\u0430\u043c \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 Create New Command<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b52\/8a0\/daf\/b528a0daf88213fbd711d29ec0f131fc.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 12. \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Slash Command \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 12. \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Slash Command \" width=\"545\" height=\"774\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b52\/8a0\/daf\/b528a0daf88213fbd711d29ec0f131fc.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 12. \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Slash Command <\/figcaption><\/figure>\n<p>\u042f \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 12. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u042f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0443 Slack API \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0435\u0451 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442.<\/p>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 Listeners\/commands.rb \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Slash Commands, \u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0432 \u044d\u0442\u043e\u0439 \u0436\u0435 \u043f\u0430\u043f\u043a\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>\u0417\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c : <\/p>\n<pre><code class=\"ruby\">post '\/who_am_i' do     get_input     pp self.input     status 200   end<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0438\u043d\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0435\u0439 CTRL + C \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <\/p>\n<pre><code class=\"ruby\">rackup<\/code><\/pre>\n<p>\u041a \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u043e\u0436\u0435\u043b\u0435\u043d\u0438\u044e, \u0442\u0430\u043a \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430, \u043f\u043e\u0441\u043b\u0435 \u043b\u044e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430 \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043f\u0440\u0438\u043c\u0438\u043d\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u0431\u043e\u0442\u0435 (\u0441\u0435\u0440\u0432\u0435\u0440\u0435), \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0432 Ruby \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u0437\u0430\u0439\u0442\u0438 \u0432 \u0447\u0430\u0442 Slack, \u043a Workspace, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 &#8216;\/who_&#8217;, \u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043b\u0435\u0437\u0442\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043e Slash Command, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 (\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13)<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f79\/ba2\/37e\/f79ba237ed6a0d8733555235a4e47b6f.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13. \u0421\u0432\u043e\u044f \u043b\u0438\u0447\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u043f\u0440\u0438\u043a\u043e\u043b \u0434\u0430?\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13. \u0421\u0432\u043e\u044f \u043b\u0438\u0447\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u043f\u0440\u0438\u043a\u043e\u043b \u0434\u0430?\" width=\"1196\" height=\"376\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f79\/ba2\/37e\/f79ba237ed6a0d8733555235a4e47b6f.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13. \u0421\u0432\u043e\u044f \u043b\u0438\u0447\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u043f\u0440\u0438\u043a\u043e\u043b \u0434\u0430?<\/figcaption><\/figure>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0432 \u0447\u0430\u0442\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0437\u0430\u0442\u043e, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c payload \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u043a \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 14.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/812\/38e\/6f7\/81238e6f7d2b768e19ea8c43be24de0e.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14. P-p-p-payload\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14. P-p-p-payload\" width=\"1117\" height=\"354\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/812\/38e\/6f7\/81238e6f7d2b768e19ea8c43be24de0e.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14. P-p-p-payload<\/figcaption><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0432 \u0431\u0430\u0437\u0435 \u043a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441 team_id \u0438\u0437 payload \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0447\u0430\u0442 \u043a\u0430\u043a \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0432 \u043c\u043e\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e, \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 access_token \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <\/p>\n<pre><code class=\"ruby\">Database.find_access_token input['team_id']<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 <\/p>\n<pre><code class=\"ruby\">create_slack_client(access_token)<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u0432 \u0447\u0430\u0442 \u043d\u0430\u043c \u0442\u0430\u043a \u0436\u0435 \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 channel_id, \u043e\u043d \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 payload \u0438\u0437 \u0420\u0438\u0441\u0443\u043d\u043a\u0430 14. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c :<\/p>\n<pre><code class=\"ruby\">    message = '\u041d\u0435 \u043c\u0435\u0448\u0430\u0439 \u043c\u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c!'     blocks =         [             'type' => 'section',             'text' => {                 'type' => 'mrkdwn',                 'text' => message             }         ]     client.chat_postMessage(         channel: input['channel_id'],         blocks: blocks.to_json     )<\/code><\/pre>\n<p>\u0422\u0443\u0442 blocks &#8212; \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 \u043e\u0442 Slack, \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0438 \u043f\u043e\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0432\u0430\u0442\u0441\u044f \u0441 \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/app.slack.com\/block-kit-builder\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>\u0426\u0435\u043b\u0438\u043a\u043e\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a : <\/p>\n<pre><code class=\"ruby\">  post '\/who_am_i' do     get_input     pp self.input      Database.init     client = create_slack_client(Database.find_access_token input['team_id'])     message = '\u041d\u0435 \u043c\u0435\u0448\u0430\u0439 \u043c\u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c!'     blocks =         [             'type' => 'section',             'text' => {                 'type' => 'mrkdwn',                 'text' => message             }         ]     client.chat_postMessage(         channel: input['channel_id'],         blocks: blocks.to_json     )     status 200   end<\/code><\/pre>\n<p>\u041b\u043e\u0436\u0438\u043c-\u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441\u043d\u043e\u0432\u0430. \u0412\u0438\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u043b\u0435\u0437\u0435\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0430 \u0442\u0430\u043c &#8230; \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bcf\/2cf\/f1e\/bcf2cff1e9a8a8179c724f4900713c68.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14. \u041b\u044e\u0442\u043e\u0435 \u0444\u0430\u0442\u0430\u043b\u0438\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14. \u041b\u044e\u0442\u043e\u0435 \u0444\u0430\u0442\u0430\u043b\u0438\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\" width=\"1361\" height=\"166\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bcf\/2cf\/f1e\/bcf2cff1e9a8a8179c724f4900713c68.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14. \u041b\u044e\u0442\u043e\u0435 \u0444\u0430\u0442\u0430\u043b\u0438\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/figcaption><\/figure>\n<p>\u0414\u043b\u0438\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0432\u0435\u043b \u043a \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435 &#8212; \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b (\u0447\u0430\u0442) \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0438\u043c\u0435\u043b \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c, \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c, \u0438 \u043c\u043e\u0433 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430 (\u0420\u0438\u0441\u0443\u043d\u043e\u043a 15)<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b1d\/8d3\/c7b\/b1d8d3c7b8b13f8caa2d444c54530abd.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 15. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 15. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430\" width=\"1194\" height=\"123\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b1d\/8d3\/c7b\/b1d8d3c7b8b13f8caa2d444c54530abd.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 15. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430<\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0430 \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 > \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#8212; \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c<\/p>\n<p>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u043e\u043c\u0435\u0440 2 &#8230; \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 16.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c86\/594\/2aa\/c865942aa0c6761170bfefd98cdfc135.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 16. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043d\u043e\u043c\u0435\u0440 2\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 16. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043d\u043e\u043c\u0435\u0440 2\" width=\"1194\" height=\"270\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c86\/594\/2aa\/c865942aa0c6761170bfefd98cdfc135.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 16. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043d\u043e\u043c\u0435\u0440 2<\/figcaption><\/figure>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f. \u0412\u0441\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b Slack API, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435 <a href=\"https:\/\/api.slack.com\/methods\" rel=\"noopener noreferrer nofollow\">https:\/\/api.slack.com\/methods<\/a>. <s>\u0412\u0430\u043d\u0433\u0443\u044e<\/s> \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u044d\u0442\u043e\u0442 \u0440\u043e\u0443\u0442 : <a href=\"https:\/\/api.slack.com\/methods\/users.profile.get\" rel=\"noopener noreferrer nofollow\">https:\/\/api.slack.com\/methods\/users.profile.get<\/a>. <\/p>\n<p>\u041e\u043a\u0435\u0439, \u0440\u043e\u0443\u0442 \u0435\u0441\u0442\u044c, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0435\u0441\u0442\u044c, \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432. \u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e! \u0427\u0443\u0434\u0435\u0441\u043d\u044b\u0439 \u0433\u0435\u043c \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430 \u043d\u0430\u0441, \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f!!!<\/p>\n<p>User_id \u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0438\u0437 Payload \u0438\u0437 \u0420\u0438\u0441\u0443\u043d\u043a\u0430 14, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c <\/p>\n<pre><code class=\"ruby\"> message = client.users_profile_get(         user: input['user_id']     ).to_s<\/code><\/pre>\n<p>\u0423\u0431\u0438\u0432\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440, \u0432\u043e\u0437\u0440\u043e\u0436\u0434\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 \u0447\u0430\u0442 &#8230; \u0420\u0438\u0441\u0443\u043d\u043e\u043a 17.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3ef\/d56\/a45\/3efd56a4548aba04451058e93471d720.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 17. \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0436\u0434\u0430\u043b!\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 17. \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0436\u0434\u0430\u043b!\" width=\"1194\" height=\"144\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3ef\/d56\/a45\/3efd56a4548aba04451058e93471d720.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 17. \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0436\u0434\u0430\u043b!<\/figcaption><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0438 &#8212; \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430\u0445, \u0441\u043a\u043e\u0443\u043f\u0430\u0445. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c OAuth &amp; Permissions > \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u043e\u0443\u043f <a href=\"https:\/\/api.slack.com\/scopes\/users.profile:read\" rel=\"noopener noreferrer nofollow\"><strong>users.profile:read<\/strong><\/a><strong>.<\/strong><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0441\u0432\u0435\u0440\u0445\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u044b\u043b\u0435\u0437\u0435\u0442 Warning Message, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0414\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u044d\u0442\u043e\u043c Warning.<\/p>\n<p>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u043e\u043c\u0435\u0440 2 &#8230; \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0440\u0430\u0436\u0430\u0435\u0442 ! (\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 18)<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e1d\/3a5\/c7d\/e1d3a5c7d7c57d5e2479cbb83840330f.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 18. \u041d\u0435\u0443\u0436\u0435\u043b\u0438 \u0432\u0441\u0451 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c :)\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 18. \u041d\u0435\u0443\u0436\u0435\u043b\u0438 \u0432\u0441\u0451 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c :)\" width=\"1663\" height=\"664\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e1d\/3a5\/c7d\/e1d3a5c7d7c57d5e2479cbb83840330f.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 18. \u041d\u0435\u0443\u0436\u0435\u043b\u0438 \u0432\u0441\u0451 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \ud83d\ude42<\/figcaption><\/figure>\n<p>\u041f\u043e\u043d\u0438\u043c\u0430\u044e, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a <s>\u043f\u0430\u0440\u0430\u0448<\/s> \u0445\u043b\u0430\u043c \u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041d\u043e \u043c\u044b \u0437\u0430\u0434\u0430\u0447\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 ? \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \ud83d\ude42 \u041f\u043e\u0442\u043e\u043c \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u043c \ud83d\ude42<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"modals\" id=\"modals\"><\/a><\/p>\n<h2>\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b Slash Commands <\/h2>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u043a slash command \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 Slack \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430.<\/p>\n<p>\u041b\u0438\u0447\u043d\u043e \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0443 \u0438\u0437-\u0437\u0430 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 &#8216;\/menu&#8217;, \u043f\u043e \u0437\u0430\u0434\u0443\u043c\u043a\u0435 &#8212; \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u0435\u043d\u044e.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0441\u043e\u0431\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 Slack API \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. <a href=\"https:\/\/api.slack.com\/methods\/views.open\" rel=\"noopener noreferrer nofollow\">https:\/\/api.slack.com\/methods\/views.open<\/a><\/p>\n<p>\u041f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 : <\/p>\n<p><strong>trigger_id<\/strong> &#8212; \u044d\u0442\u043e id \u0432\u044b\u0437\u043e\u0432\u0430, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 &#8212; \u043d\u0430\u0448\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e. \u0415\u0441\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 14.<\/p>\n<p><strong>view &#8212; <\/strong>\u044d\u0442\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430, \u043f\u043e \u0441\u0443\u0442\u0438, \u0442\u0435 \u0436\u0435 blocks, \u043d\u043e \u0441 \u0434\u043e\u043f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. <\/p>\n<p>\u0414\u043b\u044f \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f Ruby, \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f erb. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 Components \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e &#8216;Components\/View&#8217;. <br \/>\u0422\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u043c \u0444\u0430\u0439\u043b menu.json (json \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043c\u0435\u043d\u044f\u044e \u043d\u0430 erb, \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 RubyMine)<\/p>\n<p>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a : <\/p>\n<pre><code class=\"json\">{   \"type\": \"modal\",   \"title\": {     \"type\": \"plain_text\",     \"text\": \"Menu\"   },   \"blocks\": [],   \"private_metadata\": \"&lt;%= metadata %>\",   \"callback_id\": \"menu\" }<\/code><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 8 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0442\u0438\u043f\u0430 erb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437\u0432\u043d\u0435, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 metadata.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 9 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0444\u0430\u0439\u043b\u0435 &#8212; <strong>interactivity.rb.<\/strong><\/p>\n<p>\u041d\u0430 \u043c\u0435\u0441\u0442\u0435 blocks \u0441\u0442\u043e\u0438\u0442 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0438 \u0431\u043b\u043e\u043a\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430, \u0434\u0430 \u043b\u0430\u0434\u043d\u043e, \u044f \u0437\u043d\u0430\u044e \u0447\u0442\u043e \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \ud83d\ude42 \u0412\u043e\u0442 \u043e\u043d\u0438 :<\/p>\n<pre><code class=\"json\">\"blocks\": [     {       \"type\": \"section\",       \"text\": {         \"type\": \"mrkdwn\",         \"text\": \"List of available functions\"       }     },     {       \"type\": \"divider\"     },     {       \"type\": \"section\",       \"text\": {         \"type\": \"mrkdwn\",         \"text\": \"Display information about this user\"       },       \"accessory\": {         \"type\": \"button\",         \"text\": {           \"type\": \"plain_text\",           \"text\": \"Display\",           \"emoji\": true         },         \"value\": \"display_user_info\",         \"action_id\": \"display_user_info\"       }     }   ],<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0444\u0430\u0439\u043b \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0432 menu.erb \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u0441\u044f \u043a commands.rb \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b &#8216;\/menu&#8217;. <\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u043e\u043a\u0435\u043d \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \/who_am_i <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c trigger_id \u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 metadata \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c id \u043a\u0430\u043d\u0430\u043b\u0430 (\u044d\u0442\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u043c \u043f\u043e\u0437\u0436\u0435)<\/p>\n<pre><code class=\"ruby\">triger_id = input['trigger_id'] metadata = input['channel_id']<\/code><\/pre>\n<p>\u0427\u0442\u043e \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d menu.erb, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u044b\u0437\u043e\u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 ERB \u043e\u0442 Ruby. \u0421\u0432\u0435\u0440\u0445\u0443 \u0444\u0430\u0439\u043b\u0430 \u0434\u043e\u043f\u0438\u0448\u0438\u0442\u0435 <\/p>\n<pre><code class=\"ruby\">require 'erb'<\/code><\/pre>\n<p>\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 <\/p>\n<pre><code class=\"ruby\">template = File.read '.\/Components\/View\/menu.erb' view = ERB.new(template).result(binding)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 Slack API \u0441 \u044d\u0442\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u041f\u043e\u043b\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a : <\/p>\n<pre><code class=\"ruby\">  post '\/menu' do     get_input     access_token = DBHelper.new.find_access_token self.input['team_id']     client = create_slack_client access_token          triger_id = input['trigger_id']     metadata = self.input['channel_id']          template = File.read '.\/Components\/View\/menu.erb'     view = ERB.new(template).result(binding)          client.views_open(         trigger_id: triger_id,         view: view     )     status 200   end<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 &#8216;\/menu&#8217;. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 19.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/75f\/357\/c88\/75f357c887b8640b19ace5c52b957cbf.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 19. \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e-\u043c\u0435\u043d\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 19. \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e-\u043c\u0435\u043d\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" width=\"1550\" height=\"1244\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/75f\/357\/c88\/75f357c887b8640b19ace5c52b957cbf.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 19. \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e-\u043c\u0435\u043d\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 Display, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f.<\/p>\n<p><a class=\"anchor\" name=\"events\" id=\"events\"><\/a><\/p>\n<h2>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0432\u0435\u043d\u0442\u043e\u0432<\/h2>\n<p>\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0438\u0432\u0435\u043d\u0442, \u043d\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 Slack. \u0417\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043f\u0443\u043d\u043a\u0442 &#171;Interactivity &amp; Shortcuts&#187;, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c. <br \/>Request URL \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0443 <strong>ngrok_host<\/strong>\/interactivity, \u0433\u0434\u0435 <strong>ngrok_host <\/strong>&#8212; \u0432\u0430\u0448 \u0430\u0434\u0440\u0435\u0441\u0441 ngrok (\u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 Slash Command)<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0432 \u0444\u0430\u0439\u043b\u0435 interactivity \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438. \u0414\u043b\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 menu, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 callback_id \u0432 menu.erb \u0444\u0430\u0439\u043b &#8212; &#8216;menu&#8217;. \u041f\u043e \u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0441\u0435\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043c payload. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 <\/p>\n<pre><code class=\"ruby\">request_data = Rack::Utils.parse_nested_query(request.body.read) payload = JSON.parse(request_data['payload'])<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c case \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f callback_id \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u0435\u0439\u0441, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0440\u0430\u0432\u0435\u043d menu<\/p>\n<pre><code class=\"ruby\">    case payload['view']['callback_id']     when 'menu'       status 200     else       status 404     end<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043b\u0438\u0448\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u044d\u0442\u043e\u0433\u043e \u043a\u0435\u0439\u0441\u0430. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u043d\u0430\u0448 payload, \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443<\/p>\n<pre><code class=\"ruby\">when 'menu'   pp payload   status 200  <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043c\u0435\u043d\u044e \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 Display.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/585\/dcc\/116\/585dcc116556ca5e0f7ae04ac3f9e380.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 20. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 (payload)\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 20. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 (payload)\" width=\"1550\" height=\"1244\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/585\/dcc\/116\/585dcc116556ca5e0f7ae04ac3f9e380.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 20. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 (payload)<\/figcaption><\/figure>\n<p>\u0412 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 20.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u0441\u044f \u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0435 &#8216;\/who_am_i&#8217;, \u0442\u043e \u0434\u043b\u044f \u0435\u0451 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u0442\u0440\u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 : <\/p>\n<ul>\n<li>\n<p>team_id<\/p>\n<\/li>\n<li>\n<p>user_id<\/p>\n<\/li>\n<li>\n<p>channel_id <\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0435\u0437\u0435\u043d\u0438\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0435\u0441\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u043c payload. \u041f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043a \u0447\u0435\u043c\u0443 \u044f \u0432\u0435\u0434\u0443? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0444\u043e\u0440\u043c\u0438\u043c &#8216;\/who_am_i&#8217; \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u0435\u0451 \u0432 \u043a\u0435\u0439\u0441\u0435 menu.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0438 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0435\u0451 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0442\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0451 \u0441\u0442\u043e\u0438\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u042f \u0445\u043e\u0447\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0435 Components \u043c\u043e\u0434\u0443\u043b\u044c Helper. \u0417\u043d\u0430\u044e, Helper \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 &#8212; <s>\u0434\u043b\u044f<\/s> <s>\u0434\u043e\u0434\u0438\u043a\u043e\u0432<\/s> \u043d\u0435 \u0441\u0430\u043c\u043e\u0435 \u043b\u0443\u0447\u0448\u0435\u0435 \u0438 \u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u044d\u0442\u043e \u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041d\u043e, \u0435\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438 \u0441\u0430\u043c\u0438\u043c \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u0438\u0442\u044c \ud83d\ude42<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0432, \u0442\u0435\u043b\u043e \u043c\u043e\u0434\u0443\u043b\u044f :<\/p>\n<pre><code class=\"ruby\">module Helper   def displayUserInfo(team_id, user_id, channel_id)     Database.init     client = create_slack_client(Database.find_access_token team_id)     message = client.users_profile_get(         user: user_id     ).to_s     blocks =         [             'type' => 'section',             'text' => {                 'type' => 'mrkdwn',                 'text' => message             }         ]     client.chat_postMessage(         channel: channel_id,         blocks: blocks.to_json     )   end    module_function(       :displayUserInfo   ) end<\/code><\/pre>\n<p>\u041d\u0415 \u0417\u0410\u0411\u042b\u0412\u0410\u0415\u041c \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0418\u0422\u042c \u0424\u0410\u0419\u041b \u041c\u041e\u0414\u0423\u041b\u042f \u0412 \u0424\u0410\u0419\u041b\u0415 &#8216;auth.rb&#8217;, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b &#8216;\/who_am_i&#8217;, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e  \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c <\/p>\n<pre><code class=\"ruby\">  post '\/who_am_i' do     get_input     Helper.displayUserInfo input['team_id'], input['user_id'], input['channel_id']     status 200   end<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 &#8216;\/who_am_i&#8217;.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0442\u0432\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0431\u044b\u043b \u0440\u0430\u043d\u044c\u0448\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 displayUserInfo \u0432 interactivity.rb. \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <strong>team_id<\/strong> \u0438 <strong>user_id<\/strong>, \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 payload \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 20. \u041d\u043e \u0432\u043e\u0442 channel_id \u0442\u0430\u043c \u043d\u0435\u0442\u0443, \u0442\u0443\u0442 \u0442\u043e \u043d\u0430\u043c \u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f metadata, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u0415\u0441\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 payload, \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 view, \u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043d\u0430\u043c \u043b\u0438\u0448\u044c \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a \u043d\u0435\u0439 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c<\/p>\n<pre><code class=\"ruby\">case payload['view']['callback_id']     when 'menu'       Helper.displayUserInfo payload['user']['team_id'], payload['user']['id'], payload['view']['private_metadata']       status 200     else       status 404     end<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u043d\u044e (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 &#8216;\/menu&#8217;) \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 Display \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442 \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435!<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439, \u043d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u043d\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043c\u0435\u043d\u044e. \u0415\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0444\u0430\u0439\u043b menu.erb, \u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u0438 &#8216;action_id&#8217;. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c : <\/p>\n<pre><code class=\"ruby\">case payload['view']['callback_id']     when 'menu'       case payload['actions'].first['action_id']       when 'display_user_info'         Helper.displayUserInfo payload['user']['team_id'], payload['user']['id'], payload['view']['private_metadata']         status 200       else         status 404       end     else       status 404     end<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412\u0441\u0451 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u043e\u0431\u0449\u0435\u043c \u0438 \u0446\u0435\u043b\u043e\u043c:) <\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"results\" id=\"results\"><\/a><\/p>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b <\/h2>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c :<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 postgresql<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 Slack App<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0439 Slack App \u0432 Workspace<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e Slack App<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0432\u043c\u0435\u0449\u0430\u0442\u044c ngrok \u0438 Sinatra \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 Ruby<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u0435\u043c\u043e\u043c slack-ruby-client<\/p>\n<\/li>\n<li>\n<p>\u041a\u0440\u043e\u0441\u0441-Workspace \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c Slash Commands<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0441\u044f Slack Block Kit <\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Slack API Methods<\/p>\n<\/li>\n<li>\n<p>\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0447\u0430\u0442 \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0431\u043e\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e Slack User \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u043e\u0442\u0430 <\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 <\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043d\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438 <\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u043c\u044b \u043f\u043e \u0438\u0442\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 : <\/p>\n<p>Slack App, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u043e Workspace&#8217;\u0430\u043c \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 \u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 slash commands.<\/p>\n<p>\u0412\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043c\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0432\u0441\u0435\u043c \u043c\u0438\u0440 \ud83d\ude42<\/p>\n<p><a href=\"https:\/\/github.com\/sorshireality\/teamplate-slack-ruby-app\/tree\/master\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/sorshireality\/teamplate-slack-ruby-app\/tree\/my_app\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430<\/a> <\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/576150\/\"> https:\/\/habr.com\/ru\/articles\/576150\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438, \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0447\u0430\u0445 Slack, \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u044e\u0434\u0435\u0439 \u0437\u0430\u0445\u043e\u0434\u044f\u0442 \u0432 \u0418\u0422, \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f Slack \u0438 \u043e\u043d, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043a\u0443\u0434\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0437\u0430\u0439\u0442\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043f\u0440\u0438\u043a\u043e\u043b \u043e\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430.<\/p>\n<p>\u0421\u0430\u043c \u044f \u043f\u0440\u043e\u0448\u0451\u043b \u043f\u0443\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u043c \u0431\u0440\u0435\u0434\u043d\u044f\u043c, \u0432\u044b\u0440\u0432\u0430\u043d\u044b\u043c \u043a\u0443\u0441\u043a\u0430\u043c \u0438\u0437 Stack Overflow, \u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u043e\u0431, \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439. \u041d\u0435 \u0438\u043c\u0435\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u0430\u043a \u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0445\u043e\u0442\u0435\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>\u0411\u044b\u043b\u043e \u0431\u044b \u043a\u0440\u0443\u0442\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u043c\u0435\u043b\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431 (\u0438\u043b\u0438 \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431) \u043c\u043e\u0433 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u0430 \u0438\u043b\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043b\u044e\u0431\u0438\u043c\u043e\u0433\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0432\u043e\u0439 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e Slack Workspace.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u044f \u043e\u043f\u0438\u0448\u0443 \u044d\u0442\u0430\u043f\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e Slack \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 Workspace!<\/p>\n<p>\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0440\u043e\u0437\u0431\u0438\u0442\u044c \u043d\u0430 3 \u0441\u0442\u0430\u0442\u044c\u0438, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0438\u043c\u0438:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Sinatra \u0438 ngrok (\u041c\u044b \u0437\u0434\u0435\u0441\u044c).<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/578798\/\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0430\u0440\u0442\u043e\u0432, \u0438\u043b\u0438 \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440 \u0444\u0440\u043e\u043d\u0442\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. <\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/586488\/\" rel=\"noopener noreferrer nofollow\">\u0422\u0443\u0441\u043e\u0432\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0442\u0430\u043a\u0438\u043c \u0433\u043e\u0441\u0442\u0435\u043c \u043a\u0430\u043a Heroku.<\/a><\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 <\/h2>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 Ruby &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0438\u0447\u043d\u043e \u044f \u043f\u0438\u0448\u0443 \u043f\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043e\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439, \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u0440\u0438\u043a\u043e\u043b\u0430\u043c\u0438 \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430\u043c\u0438. <\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 Slack &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f Telegram \u0431\u043e\u0442\u0430 \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u043f\u043e\u0441\u0442, <a href=\"https:\/\/habr.com\/ru\/post\/535618\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430<\/a>, \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c workspace \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0440\u0435\u043c\u044f, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\/\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438\u0441\u044c. \u0411\u044b\u043b\u0430 \u0431\u044b \u0443 \u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0442\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b \u0431\u044b \u0441\u0435\u0431\u0435 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \ud83d\ude42<\/p>\n<p>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0446\u0438\u043a\u043b\u0430 : <\/p>\n<ol>\n<li>\n<p><a href=\"#prepare\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430 <\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#arch\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e\u0431 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#gems\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e \u0433\u0435\u043c\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#auth\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 workspace (\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#slash_commands\" rel=\"noopener noreferrer nofollow\">\u0423\u0447\u0438\u043c\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c Slash Commands <\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#modals\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b Slash Commands<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#events\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0432\u0435\u043d\u0442\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#results\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<p><a class=\"anchor\" name=\"prepare\" id=\"prepare\"><\/a><\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430<\/h2>\n<p>\u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0439 \u044d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f <\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u0431\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f : <\/p>\n<ul>\n<li>\n<p>ngrok<\/p>\n<\/li>\n<li>\n<p>PostgreSQL<\/p>\n<\/li>\n<li>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0443\u0436\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b, <a href=\"https:\/\/github.com\/sorshireality\/teamplate-slack-ruby-app\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 Git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 ngrok<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443 (\u043d\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b), \u0432 \u0446\u0435\u043b\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \ud83d\ude42 <\/p>\n<h3>\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0411\u0414 \u043d\u0430 PostgreSQL<\/h3>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 MacOs, \u0445\u0437 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430 \u041b\u0438\u043d\u0443\u043a\u0441\u0435 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.<\/p>\n<p>\u0412\u044b\u0431\u043e\u0440 PostgreSql \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u043d, \u0434\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 Heroku \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b SQLite 3 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442 Heroku \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SQLite \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0444\u043e\u0440\u0441\u044f\u0442 PostgreSql, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c &#8230;<\/p>\n<p>\u0412\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 (\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435)<\/p>\n<pre><code>psql -l <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 : <\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0411\u0414 + \u0438\u0445 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u044b <\/figcaption><\/figure>\n<pre><code>sudo psql -U oleksandrtutunnik -d postgres<\/code><\/pre>\n<p>\u041d\u0430 \u043c\u0435\u0441\u0442\u0435 oleksandrtutunnik \u043f\u0438\u0448\u0438\u0442\u0435 \u0441\u0432\u043e\u0435\u0433\u043e owner \u0441 \u0420\u0438\u0441\u0443\u043d\u043a\u0430 1, \u0411\u0414 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e postgres \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0434\u043b\u044f SQL \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432 \u0411\u0414.<\/p>\n<pre><code>CREATE DATABASE habr_one_love; CREATE USER admin WITH password 'admin'; GRANT ALL ON DATABASE habr_one_love TO admin; \\q<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0411\u0414 habr_one_love, \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u044e\u0437\u0435\u0440\u0430, \u0442\u0440\u0435\u0442\u044c\u044f \u0434\u043b\u044f \u043a\u043e\u0440\u043e\u043b\u0435\u0432\u0441\u043a\u0438\u0445 \u0443\u0434\u043e\u0431\u0441\u0442\u0432. `\\q` \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u0441 \u044d\u0442\u043e\u0439 \u0448\u0442\u0443\u043a\u0438 (quit).<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 <\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u043e\u0438\u043d \u043b\u0430\u0439\u043a\u0430.<\/figcaption><\/figure>\n<p>\u042f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c RubyMine, \u0411\u0414 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 DataGrip, Workbench \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. <\/p>\n<p>\u041d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 3 &#8212; \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u044b \u0432 RubyMine. \u0423 \u0432\u0430\u0441 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u0441\u044f \u043f\u043e\u043b\u044f: name, comment, user, password, Database. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435, \u043f\u043e \u0438\u0434\u0435\u0435, \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u0436\u0435.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f DB \u0432 RubyMine<\/figcaption><\/figure>\n<h3>\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c GitHub \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/h3>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u043f\u0438\u0448\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <\/p>\n<pre><code>git clone https:\/\/github.com\/sorshireality\/teamplate-slack-ruby-app<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f Slack (Slack  \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \ud83d\ude42 )<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"arch\" id=\"arch\"><\/a><\/p>\n<h2>\u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e\u0431 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u041d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 4 \u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<figure class=\"\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<\/p>\n<p>\u0424\u0430\u0439\u043b\u044b Git \u0431\u0430\u0437\u043e\u0432\u044b\u0435: .gitignore, README.md, CHANGELOG.md<br \/>\u0424\u0430\u0439\u043b\u044b Ruby: Gemfile \u0438 \u0444\u0430\u0439\u043b \u0441 \u043c\u043e\u0438\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c Gemfile.lock <br \/>\u0424\u0430\u0439\u043b auth.rb \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u043e\u0432\u044b\u0445 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 (Slack Workspace) \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <br \/>\u0424\u0430\u0439\u043b env.rb \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0442\u0438\u043f\u0443 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<p>\u0424\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0435 Listeners \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043e\u0442 Slack \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <br \/>\u0421\u0435\u0439\u0447\u0430\u0441 \u0442\u0443\u0442 \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Slack Commands, Events, Interactivity Actions. \u041f\u043e\u043f\u043e\u0437\u0436\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0447\u0442\u043e \u043a \u0447\u0435\u043c\u0443. <\/p>\n<p>\u0424\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0435 Components \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u044e\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d, \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438 \u043a\u043b\u0430\u0441\u0441\u044b. \u0421\u0435\u0439\u0447\u0430\u0441 \u0442\u0443\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"gems\" id=\"gems\"><\/a><\/p>\n<h2>\u041f\u0440\u043e \u0433\u0435\u043c\u044b<\/h2>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 Bundler \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0435\u043c\u0430\u043c\u0438. \u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e \u0440\u0430\u043d\u0435\u0435, \u0448\u0430\u0431\u043b\u043e\u043d \u043e\u0441\u043d\u0430\u0449\u0435\u043d Gemfile.lock \u0444\u0430\u0439\u043b\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443 \u0432\u0430\u0441 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u043d\u0430\u044f \u043e\u0442 \u043c\u043e\u0435\u0439 \u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435 \u043f\u043e\u0448\u0435\u043b \u043f\u043e <s>\u043f\u0438\u0437<\/s> \u043a\u0440\u0438\u0432\u043e\u0439 \u0434\u043e\u0440\u043e\u0436\u043a\u0435.<\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u043e Gemfile \u043e\u0441\u043d\u0430\u0449\u0435\u043d \u0442\u0430\u043a\u0438\u043c\u0438 \u0433\u0435\u043c\u0430\u043c\u0438 : <\/p>\n<pre><code class=\"ruby\">source 'http:\/\/rubygems.org'  gem 'pg' ---> \u0413\u0435\u043c \u0434\u043b\u044f PostgreSQL gem 'sinatra', '~> 1.4.7' ---> \u0413\u0435\u043c-\u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442 SLACK API. gem 'slack-ruby-client', '~> 0.17.0' ---> \u041e\u0447\u0435\u043d\u044c-\u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0433\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Slack API, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u0431\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a, \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.<\/code><\/pre>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 (\u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435) \u0438 \u0434\u0430\u043b\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u043c\u0438 \u0433\u0435\u043c\u0430\u043c\u0438, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 : <\/p>\n<pre><code>bundle install<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0451 \u0442\u0430\u043a \u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"auth\" id=\"auth\"><\/a><\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 workspace (\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f)<\/h2>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 <a href=\"https:\/\/api.slack.com\/apps\" rel=\"noopener noreferrer nofollow\">api.slack.com<\/a>, \u0442\u0430\u043c \u043a\u043b\u0430\u0446\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 5.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c &#8212; \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c<\/figcaption><\/figure>\n<p>\u041d\u0430 \u043c\u0435\u043d\u044e\u0448\u043a\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Basic Information \u0438 \u0438\u0449\u0435\u043c \u0431\u043b\u043e\u043a App Credentials, \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 6 \u0435\u0433\u043e \u043a\u0440\u0430\u0435\u0448\u0435\u043a \u0432\u0438\u0434\u0435\u043d. \u0422\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b env.rb \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0444\u0430\u0439\u043b env.rb \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c ngrok \u0438 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u0445\u043e\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0442 ngrok \u0432<strong> SLACK_REDIRECT_URI.<\/strong><\/p>\n<pre><code>.\/ngrok http 9292<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0442\u043e\u0438\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0443 \u0432\u0430\u0441 \u043b\u0435\u0436\u0438\u0442 \u0444\u0430\u0439\u043b ngrok. <br \/>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 7<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. Output \u043e\u0442 ngrok<\/figcaption><\/figure>\n<p>\u0412\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 env.rb \u0438\u043c\u0435\u043d\u043d\u043e \u0430\u0434\u0440\u0435\u0441 \u0441 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u043e\u0439 https (\u044d\u0442\u043e Slack \u0442\u0430\u043a \u0445\u043e\u0447\u0435\u0442, \u043d\u0435 \u044f \ud83d\ude42 ), \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e : https:\/\/d69e-31-202-13-150.ngrok.io, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043b\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a <\/p>\n<pre><code class=\"ruby\">ENV['SLACK_REDIRECT_URI'] = \"https:\/\/d69e-31-202-13-150.ngrok.io\/finish_auth\"<\/code><\/pre>\n<p> \u0418 \u0447\u0442\u043e \u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 8 :  <\/p>\n<pre><code>rackup<\/code><\/pre>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b rackup<\/figcaption><\/figure>\n<h3>\u0414\u0435\u043f\u043b\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u043c\u0435\u043d\u044e\u0448\u043a\u0435 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 OAuth &amp; Permissions. \u041d\u0430 \u044d\u0442\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0432 \u0431\u043b\u043e\u043a\u0435 Scopes \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0441\u0445\u043e\u0436\u0438\u0435 \u0441 \u0442\u0435\u043c\u0438, \u0447\u0442\u043e \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 9.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. Scopes \u043d\u0430\u0448\u0435\u0433\u043e app<\/figcaption><\/figure>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0432 \u0431\u043b\u043e\u043a Redirect URLs \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e env.rb \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u044f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0442\u0443\u0442 \u0438\u0433\u0440\u044b \u0438\u0433\u0440\u0430\u0442\u044c \u0441 \u043e\u0434\u043d\u0438\u043c workspace, \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0438\u0434\u0451\u043c \u0432 Basic Information > Manage Distribution -> Distribute. \u041e\u0442\u043c\u0435\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0433\u0430\u043b\u043e\u0447\u043a\u0438 (\u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0445\u0430\u0440\u0434\u043a\u043e\u0434, \u043d\u043e \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043d\u0430 Heroku \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u0437\u0430\u043b\u0438\u0442\u044c App). \u0418 \u0432\u043d\u0438\u0437\u0443 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Active Public Distribution. <\/p>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u043d\u0430\u043b\/workspace<\/h3>\n<p>\u0421\u0432\u0435\u0440\u0445\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Manage Distribute \u0435\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Workspace, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u044d\u0442\u0443 \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0430\u043c\u0438 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. <\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043b\u044e\u0431\u043e\u0439 Slack Workspace<\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 11. \u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e \ud83d\ude42<\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0411\u0414, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 oauth_access \u0438 \u0432 \u043d\u0435\u0439 \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e Workspace. \u041e\u0434\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c &#8212; \u043e\u0434\u0438\u043d Workspace. <\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"slash_commands\" id=\"slash_commands\"><\/a><\/p>\n<h3>\u0423\u0447\u0438\u043c\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c Slash Commands<\/h3>\n<p>\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c > Slash Commands \u0438 \u0442\u0430\u043c \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 Create New Command<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 12. \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Slash Command <\/figcaption><\/figure>\n<p>\u042f \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 12. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u042f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0443 Slack API \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0435\u0451 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442.<\/p>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 Listeners\/commands.rb \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Slash Commands, \u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0432 \u044d\u0442\u043e\u0439 \u0436\u0435 \u043f\u0430\u043f\u043a\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>\u0417\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c : <\/p>\n<pre><code class=\"ruby\">post '\/who_am_i' do     get_input     pp self.input     status 200   end<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0438\u043d\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0435\u0439 CTRL + C \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <\/p>\n<pre><code class=\"ruby\">rackup<\/code><\/pre>\n<p>\u041a \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u043e\u0436\u0435\u043b\u0435\u043d\u0438\u044e, \u0442\u0430\u043a \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430, \u043f\u043e\u0441\u043b\u0435 \u043b\u044e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430 \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043f\u0440\u0438\u043c\u0438\u043d\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u0431\u043e\u0442\u0435 (\u0441\u0435\u0440\u0432\u0435\u0440\u0435), \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0432 Ruby \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u0437\u0430\u0439\u0442\u0438 \u0432 \u0447\u0430\u0442 Slack, \u043a Workspace, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 &#8216;\/who_&#8217;, \u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043b\u0435\u0437\u0442\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043e Slash Command, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 (\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13)<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13. \u0421\u0432\u043e\u044f \u043b\u0438\u0447\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u043f\u0440\u0438\u043a\u043e\u043b \u0434\u0430?<\/figcaption><\/figure>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0432 \u0447\u0430\u0442\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0437\u0430\u0442\u043e, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c payload \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u043a \u043d\u0430 \u0420\u0438\u0441\u0443\u043d\u043a\u0435 14.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14. P-p-p-payload<\/figcaption><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0432 \u0431\u0430\u0437\u0435 \u043a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441 team_id \u0438\u0437 payload \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0447\u0430\u0442 \u043a\u0430\u043a \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0432 \u043c\u043e\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e, \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 access_token \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <\/p>\n<pre><code class=\"ruby\">Database.find_access_token input['team_id']<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 <\/p>\n<pre><code class=\"ruby\">create_slack_client(access_token)<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u0432 \u0447\u0430\u0442 \u043d\u0430\u043c \u0442\u0430\u043a \u0436\u0435 \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 channel_id, \u043e\u043d \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 payload \u0438\u0437 \u0420\u0438\u0441\u0443\u043d\u043a\u0430 14. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c :<\/p>\n<pre><code class=\"ruby\">    message = '\u041d\u0435 \u043c\u0435\u0448\u0430\u0439 \u043c\u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c!'     blocks =         [             'type' => 'section',             'text' => {                 'type' => 'mrkdwn',                 'text' => message             }         ]     client.chat_postMessage(         channel: input['channel_id'],         blocks: blocks.to_json     )<\/code><\/pre>\n<p>\u0422\u0443\u0442 blocks &#8212; \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 \u043e\u0442 Slack, \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0438 \u043f\u043e\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0432\u0430\u0442\u0441\u044f \u0441 \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/app.slack.com\/block-kit-builder\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>\u0426\u0435\u043b\u0438\u043a\u043e\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a : <\/p>\n<pre><code class=\"ruby\">  post '\/who_am_i' do     get_input     pp self.input      Database.init     client = create_slack_client(Database.find_access_token input['team_id'])     message = '\u041d\u0435 \u043c\u0435\u0448\u0430\u0439 \u043c\u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c!'     blocks =         [             'type' => 'section',             'text' => {                 'type' => 'mrkdwn',   <\/code><\/pre>\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-404519","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/404519","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=404519"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/404519\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=404519"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=404519"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=404519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}