{"id":305913,"date":"2020-06-25T15:01:07","date_gmt":"2020-06-25T15:01:07","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=305913"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2020-06-25T15:01:07","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=305913","title":{"rendered":"Microsoft \u2665\ufe0f Python"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/508172\/\">\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e Microsoft \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/?WT.mc_id=habr-blog-dmitryso\">\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 .NET<\/a>: C# \u0438\u043b\u0438 F#. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u0430\u043a \u2014 \u043e\u0431\u043b\u0430\u043a\u043e Azure \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0446\u0435\u043b\u044b\u0439 \u0441\u043f\u0435\u043a\u0442\u0440 \u044f\u0437\u044b\u043a\u043e\u0432, \u0441\u0440\u0435\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 Python <a href=\"https:\/\/azure.microsoft.com\/ru-ru\/develop\/python\/?WT.mc_id=habr-blog-dmitryso\">\u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0447\u0435\u0442\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e<\/a>. \u0410 \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438, \u0442\u043e Python \u0437\u0434\u0435\u0441\u044c \u043b\u044e\u0431\u0438\u043c\u0447\u0438\u043a.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xi\/4o\/ax\/xi4oax90j2utgpdymozbe6fagc0.jpeg\"><\/p>\n<p>  \u041a\u0430\u043a\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0432 Microsoft \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 Python, \u043a\u0430\u043a \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 Microsoft \u0438 Python \u0432\u043c\u0435\u0441\u0442\u0435 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 <b>\u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0421\u043e\u0448\u043d\u0438\u043a\u043e\u0432<\/b> (<a href=\"https:\/\/habr.com\/ru\/users\/shwars\/\">@shwars<\/a>).<\/p>\n<p>  <a href=\"http:\/\/soshnikov.com\/\"><b>\u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0421\u043e\u0448\u043d\u0438\u043a\u043e\u0432<\/b><\/a> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 Microsoft 13 \u043b\u0435\u0442, 10 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u2014 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0435\u0432\u0430\u043d\u0433\u0435\u043b\u0438\u0441\u0442\u043e\u043c. \u0412 Microsoft \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0432 \u0440\u043e\u043b\u0438 Cloud Developer Advocate. \u041a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c\u0441\u044f (\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0432 \u0432\u0438\u0434\u0435 issue \u043d\u0430 GitHub). \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u043e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u0436\u0430\u043b\u043e\u0431\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/N-ZJVbdKQgA?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media; accelerometer; gyroscope; picture-in-picture\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <a name=\"habracut\"><\/a><br \/>  \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432 Microsoft \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 .NET \u0441\u0440\u0435\u0434\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u043d\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u043d\u0430\u044e\u0442 \u0432 .NET-\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435.<\/p>\n<p>  \u0415\u0449\u0451 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u043c \u0438 \u0430\u0441\u043f\u0438\u0440\u0430\u043d\u0442\u043e\u043c \u043f\u0438\u0441\u0430\u043b \u043d\u0430 Java, \u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u043b\u044e\u0431\u0438\u043b C#, \u0430 \u0435\u0449\u0451 \u043f\u043e\u0437\u0436\u0435 \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u043d\u0430 F# \u0438 \u0441\u0442\u0430\u043b \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u041c\u0424\u0422\u0418. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0443\u0440\u0441\u044b \u043f\u043e C# \u0438 F# \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b <a href=\"http:\/\/www.soshnikov.com\/fsharp\/\">\u043a\u043d\u0438\u0433\u0443 \u043f\u043e F#<\/a> \u2014 \u043f\u0435\u0440\u0432\u0443\u044e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435. \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u0435 20 \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0445 \u0445\u0430\u043a\u0430\u0442\u043e\u043d\u043e\u0432 \u043f\u043e \u0432\u0441\u0435\u0439 \u0420\u043e\u0441\u0441\u0438\u0438, \u043a\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u043e\u043d\u043a\u0443\u0440\u0441 <a href=\"https:\/\/imaginecup.microsoft.com\/\">Imagine Cup<\/a> \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0435. \u041e\u0442 \u0445\u0430\u043a\u0430\u0442\u043e\u043d\u043e\u0432 \u0435\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u0432\u0430\u0436\u0434\u044b \u0441\u0442\u0430\u043b\u0438 \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u043c\u0438\u0440\u043e\u0432\u043e\u0433\u043e \u0447\u0435\u043c\u043f\u0438\u043e\u043d\u0430\u0442\u0430 \u0432 2014 \u0438 2015 \u0433\u043e\u0434\u0430\u0445.\u00a0<\/p>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u0418\u0418 \u0441\u0442\u0430\u043b \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u041c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043d\u0430\u0434 \u043f\u0438\u043b\u043e\u0442\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439. \u041f\u0440\u0438\u0435\u0437\u0436\u0430\u043b\u0438 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0438 \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0438 proof of concept. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e, \u0432\u0440\u043e\u0434\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u043b\u0438\u043a\u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u043b\u0430 \u043f\u043e \u0432\u0438\u0434\u0435\u043e \u0438\u0437 \u0444\u0443\u0442\u0431\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438. \u041f\u043e\u043a\u0430 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u043e \u043c\u044b \u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c.\u00a0<\/p>\n<p>  \u0414\u043b\u044f ML-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0441\u0442\u044c \u0441 .NET-\u044f\u0437\u044b\u043a\u043e\u0432 \u043d\u0430 Python. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e, \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Python \u0441\u043b\u0435\u0433\u043a\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e <a href=\"https:\/\/github.com\/shwars\/mPyPl\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 mPyPl<\/a>. \u041e\u043d\u0430 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430 Python \u0437\u0430 \u0441\u0447\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  \u041a\u043e\u0434 \u043d\u0430 mPyPl \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b \u0432 \u0442\u043e\u043c \u0436\u0435 \u0441\u0430\u043c\u043e\u043c F#, \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"plaintext\">import mPyPl as mp  images = ( mp.get_files('images',ext='.jpg') | mp.as_field('filename') | mp.apply('filename','image\u2019, lambda x: imread(x)) | mp.apply('filename','date', get_date) | mp.apply(['image','date'],'result\u2019, lambda x: imprint(x[0],x[1])) | mp.select_field('result') | mp.as_list)<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0434\u043d\u043e \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435. \u00ab\u041b\u0435\u043d\u0438\u0432\u044b\u0435\u00bb \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u041d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0437 10-15 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043f\u0435\u0440\u0435\u0448\u043b\u0430 \u043d\u0430 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0438\u043b\u044c \u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u0430.\u00a0<\/p>\n<h2>Science Art<\/h2>\n<p>  \u041c\u043e\u044f \u0434\u043e\u0447\u044c \u043b\u044e\u0431\u0438\u0442 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0443\u0434\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0448\u043a\u043e\u043b\u0435. \u042f \u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0430\u043b \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0438 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0430 \u2014 Science Art. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0431\u043e\u0442 \u0432 \u044d\u0442\u043e\u043c \u0441\u0442\u0438\u043b\u0435.\u00a0<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ti\/ou\/sr\/tiousruzsp3lh50v_mbp1cxcxay.jpeg\"><\/p>\n<p>  \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e-\u0441\u043e\u0441\u0442\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u044c\u044e. \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u2014 \u043f\u043e\u0440\u0442\u0440\u0435\u0442, \u0441\u043e\u0432\u043c\u0435\u0449\u0451\u043d\u043d\u044b\u0439 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439. \u041c\u0435\u0442\u043e\u0434 \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab<a href=\"https:\/\/soshnikov.com\/scienceart\/peopleblending-ru\/\">People Blending<\/a>\u00bb \u0438\u043b\u0438 \u00ab<a href=\"http:\/\/soshnikov.com\/art\/cognitiveportrait_ru\/\">\u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0440\u0442\u0440\u0435\u0442<\/a>\u00bb.\u00a0\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e \u0442\u043e, \u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u0418\u0418 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e, \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/497308\/\">\u0432 \u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435<\/a>.<\/p>\n<p>  <i>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u0433\u0440\u0430\u043c <a href=\"http:\/\/instagram.com\/art_of_artificial\">@art_of_artifical<\/a>. \u041c\u044b \u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u044b, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c\u044e.<\/i><\/p>\n<h3>\u041a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0440\u0442\u0440\u0435\u0442<\/h3>\n<p>  \u041e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 <a href=\"http:\/\/aka.ms\/coserv\">\u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445<\/a> Microsoft \u2014 \u043f\u0440\u0435\u0434\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435. \u041c\u043e\u0434\u0435\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0418\u0418 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u043e\u0431\u043b\u0430\u043a\u0435. \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0435\u0441\u0442\u044c <a href=\"https:\/\/azure.microsoft.com\/ru-ru\/services\/cognitive-services\/\">\u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Microsoft<\/a>. \u0412\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e API.\u00a0<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/u_\/dk\/-h\/u_dk-hs9cts7pptvofodk8tmd9s.png\"><\/p>\n<p>  \u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e <a href=\"https:\/\/azure.microsoft.com\/ru-ru\/services\/cognitive-services\/computer-vision\/?WT.mc_id=habr-blog-dmitryso\">\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0435 \u0437\u0440\u0435\u043d\u0438\u0435<\/a>. \u0415\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0441\u0430\u0439\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f\u0445. \u0412 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0432\u0438\u0434\u043d\u043e \u043a\u0430\u043a \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0442\u0435\u0433\u0438, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438.\u00a0<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/21\/_o\/as\/21_oas0-ch3jo3a3chh_3mifbgg.png\"><\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043c\u043e\u0435\u0439 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00abDmitri Soshnikov holding a sign\u00bb. \u041f\u0440\u0438\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Microsoft \u043c\u0435\u043d\u044f \u0437\u043d\u0430\u044e\u0442 \u0438 \u0437\u0430\u043b\u043e\u0436\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0451 \u043b\u0438\u0446\u043e.<\/p>\n<p>  \u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2014 <a href=\"https:\/\/docs.microsoft.com\/azure\/cognitive-services\/face\/?WT.mc_id=habr-blog-dmitryso\">Face API<\/a>. \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043b\u0438\u0446\u0430 \u2014 \u00abface landmarks\u00bb.\u00a0<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/i9\/_6\/ni\/i9_6nixzot9re26v3c1ftypsrde.jpeg\"><\/p>\n<h3>\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0440\u0442\u0440\u0435\u0442<\/h3>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0440\u0435\u0442\u0430 \u0431\u0435\u0440\u0451\u043c \u043c\u043d\u043e\u0433\u043e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439, \u0438\u0449\u0435\u043c \u043d\u0430 \u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0438 \u00ab\u0441\u043e\u0432\u043c\u0435\u0449\u0430\u0435\u043c\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0444\u0444\u0438\u043d\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439.<\/p>\n<pre><code class=\"plaintext\">def affine_transform(img,attrs):     mc_x = (attrs['mouth_left']['x\u2019]+attrs['mouth_right']['x'])\/2.0     mc_y = (attrs['mouth_left']['y\u2019]+attrs['mouth_right']['y'])\/2.0      tr = cv2.getAffineTransform(np.float32([        (attrs['pupil_left']['x\u2019], attrs['pupil_left'][\u2018y\u2019],        (attrs['pupil_right']['x\u2019], attrs['pupil_right']['y']),        (mc_x,mc_y)]), target_triangle)      return cv2.warpAffine(img,tr,(size,size))<\/code><\/pre>\n<p>  \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/CloudAdvocacy\/CognitivePortrait\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 GitHub<\/a> \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439. \u041a\u0440\u043e\u043c\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0440\u0435\u0442\u0430, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.\u00a0<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wy\/oi\/nk\/wyoink2jz5kfr_o1uwgq485rkbq.png\"><\/p>\n<p>  \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u043e\u0440\u0442\u0440\u0435\u0442 \u2014 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 <a href=\"http:\/\/bit.do\/whyaznb\">Azure Notebooks<\/a>. \u0412 \u043a\u043b\u043e\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0444\u0430\u0439\u043b <code>CognitivePortrait.ipynb<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u043e\u0440\u0442\u0440\u0435\u0442\u0430 \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c. \u0422\u0430\u043a\u0436\u0435 \u0440\u0430\u043d\u0435\u0435 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 <a href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/478356\/\">\u044f \u0443\u0436\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441<\/a>.\u00a0<\/p>\n<p>  \u0412\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0442\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/e9\/jr\/wi\/e9jrwig_c8bxwp7tghpbswpxrpc.png\"><\/p>\n<p>  \u041e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/azure.microsoft.com\/ru-ru\/try\/cognitive-services\/?api=face-api&amp;unauthorized=1&amp;WT.mc_id=habr-blog-dmitryso\">\u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/a> \u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0434\u0435\u043b\u044e. \u0415\u0441\u043b\u0438 <a href=\"https:\/\/azure.microsoft.com\/ru-ru\/free\/?WT.mc_id=habr-blog-dmitryso\">\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442<\/a>, \u0438 \u0432 \u043d\u0451\u043c \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442 Face API, \u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u044e\u0447 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0433\u043e\u0434.<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/azure\/cognitive-services\/face\/quickstarts\/client-libraries?tabs=windows&amp;pivots=programming-language-python&amp;WT.mc_id=habr-blog-dmitrysoWT.mc_id=habr-blog-dmitryso\">Python SDK<\/a>: \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432\u0441\u0435 \u043e\u043f\u043e\u0440\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438. \u0414\u0430\u043b\u044c\u0448\u0435 \u0430\u0444\u0444\u0438\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u043b\u0438\u0446\u0435.<br \/>  \u00a0<br \/>  \u0420\u0438\u0441\u0443\u0439\u0442\u0435 \u0441\u0432\u043e\u0439 \u043f\u043e\u0440\u0442\u0440\u0435\u0442 \u0438\u043b\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u0443\u044e \u0442\u0435\u0445\u043d\u0438\u043a\u0443. \u042f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0441 \u0411\u0438\u043b\u043b\u043e\u043c \u0413\u0435\u0439\u0442\u0441\u043e\u043c. \u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0432\u0430\u0441 \u043f\u043e\u0441\u0435\u0442\u0438\u0442 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u043e\u0451 \u2014 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0439\u0442\u0435 pull request!<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xa\/hf\/t-\/xahft-s28q6ugvqd5thwifvhuaq.png\"><\/p>\n<h2>\u0411\u043e\u0442<\/h2>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e Microsoft, \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442.NET \u0438\u043b\u0438 Visual Studio Code, \u0430 \u043a\u0442\u043e-\u0442\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 Windows Vista. \u041d\u043e \u0441\u0430\u043c\u043e\u0435 \u043b\u0443\u0447\u0448\u0435\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0443 Microsoft \u2014 \u044d\u0442\u043e \u043e\u0431\u043b\u0430\u043a\u043e <a href=\"https:\/\/azure.microsoft.com\/en-us\/?WT.mc_id=habr-blog-dmitryso\">Microsoft Azure<\/a>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/us\/fv\/mk\/usfvmkjy4viy3szlhsp4bzlyafa.png\"><\/p>\n<p>  \u0412 \u043d\u0451\u043c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0438 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0432\u0441\u0451 \u043e\u0431\u043e \u0432\u0441\u0435\u0445, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435. \u042f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043d\u0430 \u0442\u0435\u0445, \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 Python, \u0438 \u043d\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445.\u00a0<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0430\u0442-\u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u0440\u0442\u0440\u0435\u0442\u044b \u0438\u0437 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0440\u0430\u0437\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439. \u0411\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 Telegram: \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e, \u043e\u043d\u0430 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f (\u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435) \u0441 10 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0444\u043e\u0442\u043e, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0434\u043e \u0432\u0430\u0441, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0440\u0442\u0440\u0435\u0442.<\/p>\n<p>  \u0412 <b>\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0431\u043e\u0442\u0430<\/b> \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u044f\u0434 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439.<\/p>\n<ul>\n<li>\u041e\u0441\u043d\u043e\u0432\u0430 \u2014 <a href=\"https:\/\/dev.botframework.com\/?WT.mc_id=habr-blog-dmitryso\"><b>Bot Framework<\/b><\/a>. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0441\u0432\u044f\u0437\u0438. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Bot Framework \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 Telegram, Facebook \u0438\u043b\u0438 Slack. \u041e\u0434\u0438\u043d \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430\u0445.\u00a0  <\/li>\n<li>\u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/docs.microsoft.com\/azure\/azure-functions\/?WT.mc_id=habr-blog-dmitryso\"><b>Azure Functions<\/b><\/a>. \u042d\u0442\u043e \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0430 \u043c\u044b \u043d\u0435 \u0434\u0443\u043c\u0430\u0435\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00abserverless\u00bb.  <\/li>\n<li>\u0412\u0441\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/azure.microsoft.com\/services\/storage\/?WT.mc_id=habr-blog-dmitryso\"><b>\u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/b><\/a>.  <\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u043e\u0442\u0430<\/h3>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <code>botbuilder-core<\/code>:<\/p>\n<pre><code class=\"plaintext\">pip install botbuilder-core pip install asyncio<\/code><\/pre>\n<p>  \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442 <code>cookiecutter<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u0442\u0430.<\/p>\n<pre><code class=\"plaintext\">pip install cookiecutter<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<pre><code class=\"plaintext\">$ cookiecutter --help<\/code><\/pre>\n<p>  \u0412 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0432\u0432\u043e\u0434\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"plaintext\">cookiecutter https:\/\/github.com\/microsoft\/botbuilder-python\/releases\/download\/Templates\/ echo.zip<\/code><\/pre>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0431\u043e\u0442 Echo \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <a href=\"https:\/\/github.com\/microsoft\/BotBuilder-Samples\/tree\/master\/generators\/python\/app\/templates\/echo\">\u0448\u0430\u0431\u043b\u043e\u043d\u0430<\/a> \u043d\u0430 Python. \u0412\u0432\u043e\u0434\u0438\u043c \u0438\u043c\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00abecho-bot\u00bb \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u2014 \u00abA bot that echoes back user response\u00bb.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2s\/tr\/ub\/2strubkv3zx2fqo1tmoeia5svqc.png\"><\/p>\n<p>  \u041b\u043e\u0433\u0438\u043a\u0443 \u0431\u043e\u0442\u0430 (bot.py) \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>on_message_activity<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043c \u0444\u0440\u0430\u0437\u0443 \u00abYou said\u00bb \u043d\u0430 \u00ab\u0412\u044b \u0441\u043a\u0430\u0437\u0430\u043b\u0438\u00bb.<\/p>\n<pre><code class=\"plaintext\">async def on_message_activity(self, turn_context: TurnContext): await turn_context.send_activity(f&quot;You said '{ turn_context.activity.text }'&quot;)<\/code><\/pre>\n<p>  \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0446\u0438\u0444\u0440\u044b \u0432 \u0430\u0434\u0440\u0435\u0441\u0435 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 (\u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e 3978) \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u0442\u0430.<\/p>\n<p>  <i>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0431\u043e\u0442\u0430, \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/azure\/bot-service\/python\/bot-builder-python-quickstart?view=azure-bot-service-4.0&amp;WT.mc_id=pyconf-event-dmitryso\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438<\/a>.<\/i><\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u043e\u0442\u0430<\/h3>\n<p>  \u0412 \u043e\u043a\u043d\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 <code>echo-bot<\/code> \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0430\u043a\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<pre><code class=\"plaintext\">pip install -r requirements.txt<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e):<\/p>\n<pre><code class=\"plaintext\">python app.py<\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0431\u043e\u0442\u0430, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <a href=\"https:\/\/aka.ms\/botemulator\">Bot Emulator<\/a>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0431\u043e\u0442\u043e\u043c, \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044f \u0435\u0433\u043e \u043a Telegram. \u0423\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u043e\u0440\u0430\u0445.<\/p>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u00abOpen Bot\u00bb. \u0412 \u043e\u0442\u043a\u0440\u044b\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u043a\u043d\u0435 \u0432 URL-\u0430\u0434\u0440\u0435\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vd\/lt\/9b\/vdlt9bfy1mswnu6i81wlobqr00w.png\"><\/p>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u0438 \u0431\u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u0412\u0432\u043e\u0434\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<h3>Going Serverless<\/h3>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043a\u0430\u043a <a href=\"http:\/\/aka.ms\/pyfunc\">Azure Functions<\/a>. Azure Functions \u2014 \u044d\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043e\u0431\u043b\u0430\u043a\u0435.<\/p>\n<p>  Azure Function \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\u043c\u0438 \u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f, \u043d\u0430 \u0432\u0445\u043e\u0434 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043b\u0438\u0448\u044c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p>  \u0423 Azure Function \u0434\u0432\u0430 \u0440\u0435\u0436\u0438\u043c\u0430 \u0442\u0430\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043d\u0435 \u0434\u0443\u043c\u0430\u0435\u043c, \u0447\u0442\u043e, \u0433\u0434\u0435 \u0438 \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u2014 \u043e\u0431\u043b\u0430\u043a\u043e \u0441\u0430\u043c\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  \u041b\u043e\u0433\u0438\u043a\u0443 \u0431\u043e\u0442\u0430 \u043e\u043f\u0438\u0448\u0435\u043c Azure Function, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441. \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d HTTP-\u0442\u0440\u0438\u0433\u0433\u0435\u0440.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0451\u043c Azure Function.<\/p>\n<pre><code class=\"plaintext\">func init coportrait --python<\/code><\/pre>\n<p>  \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>coportrait<\/code>.<\/p>\n<pre><code class=\"plaintext\">cd coportrait<\/code><\/pre>\n<p>  \u0412\u043d\u0443\u0442\u0440\u0438 Azure Function \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0445 \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>pdraw<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0440\u0442\u0440\u0435\u0442.<\/p>\n<pre><code class=\"plaintext\">func new --name pdraw --template &quot;HTTP trigger&quot;<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e.<\/p>\n<pre><code class=\"plaintext\">func start<\/code><\/pre>\n<p>  \u041f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435, \u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0435\u043c \u043d\u0430 \u00ab\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439\u00bb \u0441\u0430\u0439\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nk\/kw\/zg\/nkkwzgibc8enfgx-r5izewacjfe.png\"><\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0430\u0439\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430. \u0412\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u0439\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u0448 API \u2014 \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0430\u0434\u0440\u0435\u0441\u0443 \u0441\u0430\u0439\u0442\u0430 <code>\/api\/pdraw<\/code> (\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438). \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c API \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mt\/c7\/ev\/mtc7evuaxdlbgvuznr8hht-nej0.png\"><\/p>\n<h3>\u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f Azure Function<\/h3>\n<p>  \u0412 Azure Function \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438. \u041f\u0435\u0440\u0432\u0430\u044f \u2014 Python-\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>__init__.py<\/code>. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<pre><code class=\"plaintext\">def main(req:func.HttpRequest) -&gt; func.HttpResponse: \u00a0\u00a0\u00a0\u00a0logging.info('Execution begins\u2026')  \u00a0\u00a0\u00a0\u00a0name = req.params.get('name') \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0if name: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return func.HttpResponse(f&quot;Hello {name}!&quot;) \u00a0\u00a0\u00a0\u00a0else: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return func.HttpResponse( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;Need name query parameter&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0status_code=400)<\/code><\/pre>\n<p>  \u0412\u0442\u043e\u0440\u0430\u044f \u2014 \u0444\u0430\u0439\u043b <code>function.json<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <b>\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438<\/b>.<\/p>\n<pre><code class=\"plaintext\">{ \u00a0\u00a0\u00a0\u00a0&quot;scriptFile&quot;: &quot;__init__.py&quot;, \u00a0\u00a0\u00a0\u00a0&quot;bindings&quot;: [ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;authLevel&quot;: &quot;function&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;type&quot;: &quot;httpTrigger&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;direction&quot;: &quot;in&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;name&quot;: &quot;req&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;methods&quot;: [ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;get&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;post&quot; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]}, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;type&quot;: &quot;http&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;direction&quot;: &quot;out&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;name&quot;: &quot;$return&quot; }]}<\/code><\/pre>\n<p>  \u041d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b GET \u0438 POST, \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e HTTP-\u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0443. \u0412\u0445\u043e\u0434\u044b \u0438 \u0432\u044b\u0445\u043e\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0432\u044b\u0445\u043e\u0434, \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0447\u0442\u043e\u0431\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u043b\u0430\u043a\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Azure Function \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0441\u044e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h3>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c Azure Function<\/h3>\n<p>  \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0448\u0430 Azure Function?<\/p>\n<p>  <b>\u041c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c<\/b> \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u041c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0432 \u043a \u043d\u0435\u043c\u0443 Azure Function \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u2014 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0442\u0440\u0435\u043c\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0440\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438.<\/p>\n<p>  \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"http:\/\/aka.ms\/pyblob\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>, \u0430 \u0435\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 BlockBlobService.<\/p>\n<pre><code class=\"plaintext\">blob = BlockBlobService(account_name=acct_name, account_key=acct_key)  body = req.get_body()  sec_p = int((end_date-datetime.datetime.now()).total_seconds()) name = f&quot;{sec_p:09d}-&quot;+time.strftime('%Y%m%d-%H%M%S')<\/code><\/pre>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c <code>blob<\/code> \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u0430\u0439\u0442.<\/p>\n<pre><code class=\"plaintext\">blob.create_blob_from_bytes(&quot;cin&quot;,name,body)<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0439\u0442\u043e\u0432 \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e) \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<pre><code class=\"plaintext\">img = imdecode(body)<\/code><\/pre>\n<p>  \u0415\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441 \u2014 \u043c\u044b \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 \u0434\u0435\u0441\u044f\u0442\u044c\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 10 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 <code>blob<\/code>.<\/p>\n<p>  \u041d\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0442, \u043c\u043e\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0411\u0414, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0431\u0443\u0434\u0443 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438.<\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0438 \u0445\u0438\u0442\u0440\u0435\u0435. \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 <code>blob<\/code> \u0432\u044b\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u043b\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043d\u0430\u0447\u0430\u043b\u0435. \u041f\u043e\u0434\u0443\u043c\u0430\u0432 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e, \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e 2021 \u0433\u043e\u0434\u0430. \u042d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0441 \u043b\u0438\u0434\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0438 \u043d\u0443\u043b\u044f\u043c\u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0438\u043c\u0435\u043d\u0438 \u0444\u0430\u0439\u043b\u0430: \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u044f \u043c\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 10 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u00ab<b>\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 2021 \u0433\u043e\u0434\u0430<\/b>\u00bb, \u043d\u043e \u043f\u043e\u043a\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u0435\u0451 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, <b>\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c<\/b> \u0435\u0433\u043e \u2014 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0433\u043b\u0430\u0437\u0430 \u0431\u044b\u043b\u0438 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<pre><code class=\"plaintext\">cogface = cf.FaceClient(endpoint,CognitiveServicesCredentials(key)) res = cogface.face.detect_with_stream(io.BytesIO(body), \u00a0\u00a0\u00a0\u00a0return_face_landmarks=True)<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043b\u0438\u0446\u043e \u2014 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0430\u0444\u0444\u0438\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<pre><code class=\"plaintext\">if res is not None and len(res)&gt;0: \u00a0\u00a0\u00a0\u00a0tr = affine_transform(img,res[0].face_landmarks.as_dict())<\/code><\/pre>\n<p>  \u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 blob-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u2014 <code>cmapped<\/code>.\u00a0<\/p>\n<pre><code class=\"plaintext\">_,body = cv2.imencode('.jpg',tr) blob.create_blob_from_bytes(&quot;cmapped&quot;,name,body.tobytes())<\/code><\/pre>\n<p>  \u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, <b>Azure Function \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/b>: \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0438\u0437 <code>blob<\/code> 10 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0443\u0441\u0440\u0435\u0434\u043d\u044f\u0435\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0435\u0434\u0438\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c:<\/p>\n<pre><code class=\"plaintext\">imgs = [ imdecode(blob.get_blob_to_bytes(&quot;cmapped&quot;,x.name).content) \u00a0\u00a0\u00a0\u00a0for x in itertools.islice(blob.list_blobs(&quot;cmapped&quot;),10) ]<\/code><\/pre>\n<p>  \u0411\u0435\u0440\u0435\u043c <code>cmapped<\/code> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>blob<\/code>, \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0445\u0438\u0442\u0440\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>itertools.islice<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 <code>blob<\/code> \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e OpenCV \u0438 \u0443 \u043d\u0430\u0441 \u0433\u043e\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0432 <code>np.array<\/code> \u0438 \u0443\u0441\u0440\u0435\u0434\u043d\u044f\u0435\u043c \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0441\u0438 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439, \u0430 \u0434\u043b\u044f \u0443\u0441\u0440\u0435\u0434\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a float \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e.<\/p>\n<pre><code class=\"plaintext\">imgs = np.array(imgs).astype(np.float32)\/255.0 res = (np.average(imgs,axis=0)*255.0).astype(np.uint8)<\/code><\/pre>\n<p>  \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u0441\u0440\u0435\u0434\u043d\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u2014 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435.<\/p>\n<pre><code class=\"plaintext\">b = cv2.imencode('.jpg',res)[1] r = blob.create_blob_from_bytes(&quot;out&quot;,f&quot;{name}.jpg&quot;,b.tobytes())<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c URL, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u042d\u0442\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u043e\u0442\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e URL \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442.<\/p>\n<pre><code class=\"plaintext\">return func.HttpResponse(f&quot;https:\/\/{act}.blob.core.windows.net\/out\/{name}.jpg&quot;)<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c Azure Function \u0432 \u043e\u0431\u043b\u0430\u043a\u043e<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0451\u043c Azure Function \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u043e\u0431\u043b\u0430\u043a\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Azure CLI, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<pre><code class=\"plaintext\">az functionapp create --resource-group &lt;group&gt; \u00a0\u00a0\u00a0\u00a0--os-type Linux \u00a0\u00a0\u00a0\u00a0--consumption-plan-location westeurope \u00a0\u00a0\u00a0\u00a0--runtime python --runtime-version 3.7 --functions-version 2 \u00a0\u00a0\u00a0\u00a0--name &lt;APP_NAME&gt; --storage-account &lt;STORAGE_NAME&gt;<\/code><\/pre>\n<p>  <i>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043f\u043e\u043b\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u0432 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/azure\/bot-service\/bot-builder-deploy-az-cli?view=azure-bot-service-4.0&amp;tabs=csharp&amp;WT.mc_id=pyconf-event-dmitryso\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/i><\/p>\n<p>  \u041d\u043e \u043c\u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b\u0435. \u042f \u0442\u0430\u043a \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u041d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Function App \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0435\u0433\u043e \u2014 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u00abCreate\u00bb.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/-3\/ep\/6c\/-3ep6c8lraqkdubu6oq72n-t5rs.gif\" width=\"100%\"><\/p>\n<p>  \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c: \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u00ab\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434\u00bb \u0438 \u041e\u0421 Linux. \u041f\u043b\u0430\u043d \u2014 \u00abServerless\u00bb: \u0431\u0443\u0434\u0435\u043c \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u0447\u0438\u0441\u043b\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0431\u0435\u0437 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c Azure \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f78\/0b4\/6e9\/f780b46e9517398ce2e7bb9e00b24e28.gif\"><\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043a\u0430\u043a \u0440\u0435\u0441\u0443\u0440\u0441. \u041f\u043e\u043a\u0430 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u00bb \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0427\u0442\u043e\u0431\u044b \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c, \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043e\u0431\u043b\u0430\u043a\u043e:<\/p>\n<pre><code class=\"plaintext\">$ func azure functionapp publish pdraw<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c requirements.txt. \u0415\u0441\u043b\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 OpenCV, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c.<\/p>\n<p>  \u041f\u0430\u043a\u0435\u0442\u044b \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u0438, \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Postman, \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u0432\u044b\u0437\u043e\u0432\u0430.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u2014 \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u043a\u0430\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043e\u043d\u0430 \u0432\u044b\u0434\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u043a\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0437\u0430\u0431\u044b\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0432 requirements.txt, \u044d\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c URL.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/8p\/g4\/nn\/8pg4nn_f_e-pinwmoxjvfbiocvq.png\"><\/p>\n<p>  URL \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u0430\u0441\u044c. \u041a\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 URL \u2014 \u044d\u0442\u043e \u00ab\u043a\u043b\u044e\u0447\u00bb \u0434\u043b\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.\u00a0<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/lt\/zf\/yk\/ltzfykvm0up5ii55eujhqgsdcks.png\"><\/p>\n<h3>\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0431\u043e\u0442 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443<\/h3>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u0434 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>on_message_activity<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043e\u0442\u0430.<\/p>\n<pre><code class=\"plaintext\">api_url=&quot;https:\/\/coportrait.azurewebsites.net\/api\/pdraw?code=...&quot;  async def on_message_activity(self, turn_context: TurnContext): \u00a0\u00a0\u00a0\u00a0a = tc.activity \u00a0\u00a0\u00a0\u00a0if a.attachments is not None and len(a.attachments)&gt;0: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url = a.attachments[0].content_url \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0r = requests.get(url) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res = requests.post(api_url,data=r.content) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url = res.text \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0message = MessageFactory.attachment( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0CardFactory.hero_card( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0HeroCard(title=&quot;Here is your cognitive portrait&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0images=[CardImage(url=url)]))) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await tc.send_activity(message) \u00a0\u00a0\u00a0\u00a0else: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await tc.send_activity(f&quot;Please attach a photograph&quot;)<\/code><\/pre>\n<p>  \u041d\u0430\u0448 \u0431\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u043c\u043d\u044b\u0439 \u2014 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041a\u0430\u043a \u043e\u043d \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442:<\/p>\n<ul>\n<li>\u0438\u0449\u0435\u0442 a.attachments;  <\/li>\n<li>\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c, \u0431\u0435\u0440\u0435\u0442 URL \u043f\u0435\u0440\u0432\u043e\u0433\u043e;  <\/li>\n<li>c URL \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443) \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 Azure Function;  <\/li>\n<li>\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432 \u043e\u0442\u0432\u0435\u0442 URL \u2014 res.text;  <\/li>\n<li>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 hero_card, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0431\u043e\u0442\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443;  <\/li>\n<li>\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e hero_card \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 URL \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438;  <\/li>\n<li>\u0435\u0441\u043b\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0435\u0442, \u0431\u043e\u0442 \u043f\u0438\u0448\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u043e\u0441\u044c\u0431\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e.  <\/li>\n<\/ul>\n<p>  \u041b\u043e\u0433\u0438\u043a\u0430 \u0431\u043e\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442, \u0438 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442, \u0438 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442. \u0411\u043e\u043b\u0435\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0435\u0445 \u0436\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. Azure Function \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043e\u0434\u043d\u0430, \u0430 \u0442\u0440\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440. \u041d\u043e \u043c\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c, \u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f.\u00a0<\/p>\n<h3>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0431\u043e\u0442\u0430 \u0432 \u043e\u0431\u043b\u0430\u043a\u043e<\/h3>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u044d\u0442\u0430\u043f. \u0427\u0430\u0449\u0435 \u0431\u043e\u0442\u043e\u0432 \u043f\u0438\u0448\u0443\u0442 \u043d\u0430 Node.js \u0438\u043b\u0438 C#, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b\u0435. \u0414\u043b\u044f Python \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0447\u0443\u0442\u044c \u0445\u0443\u0436\u0435, \u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u043d\u043e.<\/p>\n<p>  \u0412\u043e\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/azure\/bot-service\/bot-builder-deploy-az-cli?view=azure-bot-service-4.0&amp;tabs=csharp&amp;WT.mc_id=pyconf-event-dmitryso\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f<\/a> \u043f\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u043e\u0442\u043e\u0432 \u0432 \u043e\u0431\u043b\u0430\u043a\u043e. \u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u0442\u043e \u0434\u043b\u044f \u0431\u043e\u0442\u0430 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u0432 \u043d\u0451\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0448 \u0431\u043e\u0442;  <\/li>\n<li>\u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 Telegram.  <\/li>\n<\/ul>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432 Azure Directory \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00abblenderbot\u00bb \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0435\u043c\u0443 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\u00a0<\/p>\n<pre><code class=\"plaintext\">az ad app create --display-name &quot;blenderbot&quot; --password &quot;%PASSWD%&quot; --available-to-other-tenants<\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f, \u043e\u043d\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 appID.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pb\/l5\/tm\/pbl5tmtpuo9civog1st_hvknefm.png\"><\/p>\n<p>  \u0411\u0435\u0440\u0451\u043c \u0435\u0433\u043e \u0438\u0437 JSON-\u0432\u044b\u0432\u043e\u0434\u0430 \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rw\/4z\/_y\/rw4z_y7m5b1vtmlkkg6bd7ziirm.png\"><\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 Telegram.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ow\/-i\/jj\/ow-ijjdyd4kb-aj7fkd9bjxh0xg.png\"><\/p>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f <b>deploymentTemplates<\/b> \u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u043b\u0430\u043a\u0430 \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. deploymentTemplates \u0438\u0434\u0451\u0442 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 <code>cookiecutter<\/code>. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u2014 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c deploymentTemplates \u0438 \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c zip-\u0430\u0440\u0445\u0438\u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0438 <code>requirements.txt<\/code>,\u2026<\/p>\n<pre><code class=\"plaintext\">bot.zip<\/code><\/pre>\n<p>  \u2026 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c Azure Deploy \u0438 \u0432\u0441\u0451 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u043e\u0431\u043b\u0430\u043a\u043e.<\/p>\n<pre><code class=\"plaintext\">az webapp deployment source config-zip<\/code><\/pre>\n<p>  \u0428\u0430\u0433\u0438 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u041d\u043e \u043e\u043d\u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u2014 \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u0443 \u043c\u0435\u043d\u044f \u0432\u0441\u0451 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<h3>\u0427\u0442\u043e \u0432 \u043e\u0431\u043b\u0430\u043a\u0435<\/h3>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u00abblenderbot\u00bb.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_r\/1i\/hk\/_r1ihks17z40lc_j-nuiv3nuzhe.png\"><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b \u00abTest in Web Chat\u00bb \u0438 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0441 \u0431\u043e\u0442\u043e\u043c \u043f\u0440\u044f\u043c\u043e \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0432\u044f\u0436\u0435\u043c \u0435\u0433\u043e \u0441 Telegram:<\/p>\n<ul>\n<li>\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u043e\u0442\u0430 \u0432 Telegram, \u043d\u0430\u0447\u0430\u0432 \u0431\u0435\u0441\u0435\u0434\u0443 c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0431\u043e\u0442\u043e\u043c @botfather (<i>\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: <a href=\"https:\/\/tlgrm.ru\/docs\/bots\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a> \u043e\u0442 Telegram, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c<\/i>);  <\/li>\n<li>\u0434\u0430\u0451\u043c \u0438\u043c\u044f;  <\/li>\n<li>\u043e\u0442 Telegram \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c access token;  <\/li>\n<li>\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Azure;  <\/li>\n<li>\u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0431\u043e\u0442\u0430 \u0432 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0430\u0445 \u0438 \u043e\u0431\u0449\u0430\u0435\u043c\u0441\u044f.\u00a0  <\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/7x\/va\/z4\/7xvaz4fwttwc4afdcmze8tj57um.gif\" width=\"100%\"><\/p>\n<h2>\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435<\/h2>\n<p>  \u041c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0431\u043e\u0442\u0430 Telegram, \u043f\u043e \u043f\u0443\u0442\u0438 \u0438\u0437\u0443\u0447\u0438\u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0432\u0435\u0431-\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 Microsoft, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 Python.\u00a0<\/p>\n<ul>\n<li><a href=\"http:\/\/aka.ms\/pyweb\">\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/a> \u2014 \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u0432\u0438\u0434\u0435\u043b\u0438, \u043d\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u0435\u043f\u043b\u043e\u0438\u043b\u0438.  <\/li>\n<li>\u0418\u0437\u0443\u0447\u0438\u043b\u0438, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c <a href=\"http:\/\/aka.ms\/pybot\">\u0431\u043e\u0442\u043e\u0432<\/a> \u043d\u0430 Python.  <\/li>\n<li>\u041a\u0430\u043a \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <a href=\"http:\/\/aka.ms\/coserv\">\u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b<\/a>.  <\/li>\n<li>\u041a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c <a href=\"http:\/\/aka.ms\/pyfunc\">Azure Functions<\/a>.  <\/li>\n<li>\u041a\u0430\u043a \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a <a href=\"http:\/\/aka.ms\/pyblo%20b\">\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443<\/a>.  <\/li>\n<li>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 <a href=\"http:\/\/aka.ms\/whyaznb\">Jupiter Notebooks<\/a> \u2014 \u043b\u044e\u0431\u043b\u044e \u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u0430\u0440\u0441\u0435\u043d\u0430\u043b, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Google Colab.  <\/li>\n<\/ul>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435 <a href=\"http:\/\/t.me\/peopleblenderbot\">@peopleblenderbot<\/a> \u0432 Telegram, \u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043e\u0441\u0435\u0434\u0430\u044e\u0442 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c. \u0410 \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043d\u043e\u0432\u044b\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u2014\u00a0<a href=\"http:\/\/github.com\/CloudAdvocacy\/CognitivePortrait\">\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435<\/a> \u0438 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0439\u0442\u0435 pull requests!<\/p>\n<p>  \u0412 \u043e\u0431\u043b\u0430\u043a\u0435 Microsoft \u0435\u0441\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u0432\u0441\u0435\u043c \u044f\u0437\u044b\u043a\u0430\u043c \u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c, \u0430 Python \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0430\u043c \u043f\u043e\u0447\u0451\u0442\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e!<\/p>\n<blockquote><p>\u042d\u0442\u043e \u0431\u044b\u043b\u0430 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0414\u043c\u0438\u0442\u0440\u0438\u044f \u0441 \u0432\u0435\u0441\u0435\u043d\u043d\u0435\u0439 \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 Moscow Python Conf 2020. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u043e\u0441\u0435\u043d\u044c\u044e \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/conf.python.ru\/moscow\/2020\">Python Live 2020<\/a>. \u00abLive\u00bb \u2014\u00a0\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f \u043e Python \u0441 \u0443\u043f\u043e\u0440\u043e\u043c <b>\u043d\u0430 \u0436\u0438\u0432\u043e\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435<\/b>. \u041d\u0430\u0441 \u0436\u0434\u0451\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u043d\u044f \u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 (\u0441 14 \u043f\u043e 18 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f) \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u042f\u043d\u0434\u0435\u043a\u0441\u0430, \u041c\u044d\u0439\u043b.\u0440\u0443, Microsoft (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0414\u043c\u0438\u0442\u0440\u0438\u044f), Parallels, Lamoda \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439, \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 core-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440\u0430\u043c\u0438 \u043f\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e \u044f\u0437\u044b\u043a\u0430, \u0438 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0451\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u043a\u0435\u0440\u044b \u0438\u0437 \u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Go \u0438 Erlang.<\/p>\n<p>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u043e\u0442\u043e\u0432\u0430 \u0438 \u0441\u043a\u043e\u0440\u043e \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/conf.python.ru\/moscow\/2020\">\u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Python Live 2020<\/a>. \u041f\u043e\u043a\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c <a href=\"https:\/\/ontico.us8.list-manage.com\/subscribe\/post?u=719c4e65585ea6013f361815e&amp;amp;id=9dff542c96&amp;SIGNUP=habr.com&amp;STATUS=language&amp;ID=habr.com\/ru\/company\/oleg-bunin\/blog\/508172\/\">\u043d\u0430 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443<\/a>: \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u043f\u0438\u0441\u044c\u043c\u043e \u043a\u043e\u0433\u0434\u0430 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043f\u043e\u043b\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438, \u0430 \u0435\u0449\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0442\u044c \u0430\u043d\u043e\u043d\u0441\u044b \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432 \u0441 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u0431\u0440\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 <a href=\"https:\/\/conf.ontico.ru\/conference\/join\/mpc2020-online-conf.html?popup=1\">\u0431\u0438\u043b\u0435\u0442\u044b<\/a> \u2014 1 \u0438\u044e\u043b\u044f \u0446\u0435\u043d\u0430 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u0441\u044f.<\/p><\/blockquote>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/508172\/\"> https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/508172\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/508172\/\">\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e Microsoft \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/?WT.mc_id=habr-blog-dmitryso\">\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 .NET<\/a>: C# \u0438\u043b\u0438 F#. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u0430\u043a \u2014 \u043e\u0431\u043b\u0430\u043a\u043e Azure \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0446\u0435\u043b\u044b\u0439 \u0441\u043f\u0435\u043a\u0442\u0440 \u044f\u0437\u044b\u043a\u043e\u0432, \u0441\u0440\u0435\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 Python <a href=\"https:\/\/azure.microsoft.com\/ru-ru\/develop\/python\/?WT.mc_id=habr-blog-dmitryso\">\u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0447\u0435\u0442\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e<\/a>. \u0410 \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438, \u0442\u043e Python \u0437\u0434\u0435\u0441\u044c \u043b\u044e\u0431\u0438\u043c\u0447\u0438\u043a.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xi\/4o\/ax\/xi4oax90j2utgpdymozbe6fagc0.jpeg\"><\/p>\n<p>  \u041a\u0430\u043a\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0432 Microsoft \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 Python, \u043a\u0430\u043a \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 Microsoft \u0438 Python \u0432\u043c\u0435\u0441\u0442\u0435 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 <b>\u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0421\u043e\u0448\u043d\u0438\u043a\u043e\u0432<\/b> (<a href=\"https:\/\/habr.com\/ru\/users\/shwars\/\">@shwars<\/a>).<\/p>\n<p>  <a href=\"http:\/\/soshnikov.com\/\"><b>\u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0421\u043e\u0448\u043d\u0438\u043a\u043e\u0432<\/b><\/a> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 Microsoft 13 \u043b\u0435\u0442, 10 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u2014 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0435\u0432\u0430\u043d\u0433\u0435\u043b\u0438\u0441\u0442\u043e\u043c. \u0412 Microsoft \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0432 \u0440\u043e\u043b\u0438 Cloud Developer Advocate. \u041a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c\u0441\u044f (\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0432 \u0432\u0438\u0434\u0435 issue \u043d\u0430 GitHub). \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u043e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u0436\u0430\u043b\u043e\u0431\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/N-ZJVbdKQgA?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media; accelerometer; gyroscope; picture-in-picture\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-305913","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305913","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=305913"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305913\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=305913"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=305913"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=305913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}