{"id":5462,"date":"2018-08-14T15:20:07","date_gmt":"2018-08-14T13:20:07","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=5462"},"modified":"2023-01-27T12:02:25","modified_gmt":"2023-01-27T11:02:25","slug":"tworzenie-asystenta-do-telegram-z-logika-w-chmurze-azure","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/tworzenie-asystenta-do-telegram-z-logika-w-chmurze-azure\/","title":{"rendered":"Tworzenie asystenta do Telegram z logik\u0105 w chmurze Azure"},"content":{"rendered":"\n<p>Chcia\u0142bym opowiedzie\u0107 par\u0119 s\u0142\u00f3w o tym jak my, programi\u015bci, mo\u017cemy wykorzystywa\u0107 nowoczesne technologie dla naszych prostych potrzeb. Przedstawi\u0119 proces tworzenia bota, kt\u00f3ry b\u0119dzie pobiera\u0107 od u\u017cytkownika link do filmiku na serwisie YouTube i zwraca\u0107 plik audio jako odpowied\u017a. Wszystko b\u0119dziemy robi\u0107 za pomoc\u0105 komunikatora Telegram.<\/p>\n\n\n\n<p>Telegram jest to popularne w ostatnim czasie narz\u0119dzie do komunikacji, kt\u00f3re wype\u0142nia przestrze\u0144 informacyjn\u0105. Dzi\u0119ki prostocie i jako\u015bci \u2013 coraz mocniej i mocniej zast\u0119puje konkurencyjne rozwi\u0105zania. Jednym z trend\u00f3w minionego roku by\u0142o wprowadzenie wszelkiego rodzaju wirtualnych asystent\u00f3w czy te\u017c pomocnik\u00f3w i o tym w\u0142a\u015bnie chcia\u0142bym dzisiaj opowiedzie\u0107. Tre\u015bci\u0105 tego artyku\u0142u b\u0119dzie prosta prezentacja, jak zacz\u0105\u0107 korzysta\u0107 z us\u0142ug w chmurze ju\u017c teraz. Niniejszy wpis skierowany jest do programist\u00f3w, kt\u00f3rzy chc\u0105 by\u0107 w trendzie nowoczesnego programowania oraz s\u0105 zainteresowani us\u0142ugami w chmurze Microsoft.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Konfiguracja Telegram<\/strong><\/h2>\n\n\n\n<p>Telegram to komunikator, kt\u00f3ry zapewnia wygodny interfejs oraz dokumentacj\u0119 do tworzenia bot\u00f3w (<a href=\"https:\/\/core.telegram.org\/\" rel=\"nofollow\" >https:\/\/core.telegram.org\/<\/a>). W celu dodania swojego w\u0142asnego bota do systemu Telegram, programista powinien wyszuka\u0107 w\u015br\u00f3d wszystkich u\u017cytkownik\u00f3w asystenta, kt\u00f3rego imi\u0119 jest\u00a0<em>BotFather (stworzonego przez tw\u00f3rc\u00f3w Telegram)<\/em>.\u00a0 Asystent pomaga tworzy\u0107 nowe boty oraz zmienia\u0107 ustawienia istniej\u0105cych. Aby utworzy\u0107 \u00a0nowego bota nale\u017cy napisa\u0107 do niego, wykorzystuj\u0105c polecenie\u00a0<strong>\/newbot<\/strong>\u00a0.\u00a0<em>BotFather<\/em>\u00a0poprosi o imi\u0119 oraz nazw\u0119 u\u017cytkownika. Nast\u0119pnie zostanie wygenerowany token autoryzacyjny dla nowego bota, kt\u00f3ry jest niezb\u0119dny do autoryzacji wysy\u0142ania zapyta\u0144 do API.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/1.png\"><img decoding=\"async\" width=\"484\" height=\"489\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/1.png\" alt=\"Tworzenie asystenta(bota) o nazwie \u00abAudioLoaderBot\u00bb\" class=\"wp-image-18997\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/1.png 484w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/1-297x300.png 297w\" sizes=\"(max-width: 484px) 100vw, 484px\" \/><\/a><figcaption>Tworzenie asystenta(bota) o nazwie \u00abAudioLoaderBot\u00bb<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Konfiguracja us\u0142ugi w chmurze Azure<\/strong><\/h2>\n\n\n\n<p>Wykonywanie zapyta\u0144 oraz logika b\u0119d\u0105 uruchamiane w chmurze&nbsp;<em>Microsoft Azure<\/em>&nbsp;za pomoc\u0105 mechanizmu&nbsp;<em>Azure Functions<\/em>, w kt\u00f3rej umie\u015bcimy w\u0142a\u015bciwy kod do obs\u0142ugi naszego bota.<\/p>\n\n\n\n<p><strong>Troch\u0119 o kosztach<\/strong><\/p>\n\n\n\n<p>Istniej\u0105 dwa podej\u015bcia do wyliczania koszt\u00f3w za korzystanie z us\u0142ug w chmurze&nbsp;<em>Azure<\/em>. Pierwszy spos\u00f3b polega na tym, \u017ce us\u0142uga&nbsp;<em>Functions<\/em>&nbsp;jest rozliczana na podstawie zaobserwowanego u\u017cycia zasob\u00f3w mierzonego w sekundach i gigabajtach pami\u0119ci (GB-s). Zaobserwowane u\u017cycie zasob\u00f3w jest obliczane przez pomno\u017cenie \u015bredniego rozmiaru pami\u0119ci w gigabajtach przez czas w milisekundach potrzebny na wykonanie funkcji. Pami\u0119\u0107 u\u017cyta przez funkcj\u0119 jest zaokr\u0105glana w g\u00f3r\u0119 do najbli\u017cszych 128 MB przy maksymalnym rozmiarze pami\u0119ci 1 536 MB. Czas wykonywania jest obliczany przez zaokr\u0105glenie w g\u00f3r\u0119 do najbli\u017cszej 1 ms. Minimalny czas wykonywania i pami\u0119\u0107 dla pojedynczego wykonania funkcji to odpowiednio 100 ms i 128 MB. Ceny us\u0142ugi typu&nbsp;<em>Functions<\/em>&nbsp;uwzgl\u0119dniaj\u0105 miesi\u0119czny bezp\u0142atny przydzia\u0142 400 000 GB-s. Drugie podej\u015bcie opiera si\u0119 na liczbie wywo\u0142a\u0144 funkcji, przy czym 1 mln po\u0142\u0105cze\u0144 funkcji jest darmowych. Deweloper sam mo\u017ce zdecydowa\u0107, co najlepiej pasuje dla jego potrzeb.<\/p>\n\n\n\n<p>Na pocz\u0105tek utworzymy now\u0105 instancj\u0119 funkcji. W tym celu na portalu Azure (<a href=\"https:\/\/portal.azure.com\/\" rel=\"nofollow\" >https:\/\/portal.azure.com\/<\/a>) trzeba klikn\u0105\u0107 w pole wyszukiwarki i wpisa\u0107 s\u0142owo kluczowe \u00ab<em>Functions\u00bb<\/em>\u00a0albo znale\u017a\u0107 t\u0105 us\u0142ug\u0119 w li\u015bcie po lewej stronie w\u00a0<em>\u00bb<\/em>.\u00a0 Pojawi si\u0119 dodatkowe okno, w kt\u00f3rym\u00a0 wybieramy sekcj\u0119 \u00ab<em>Compute\u00bb<\/em>. Nast\u0119pnie\u00a0 nale\u017cy wybra\u0107 \u00ab<em>Function App\u00bb<\/em>. Zostanie otwarty formularz do wst\u0119pnej konfiguracji us\u0142ugi, kt\u00f3ry w miar\u0119 jego nape\u0142niania intuicyjnie podpowiada u\u017cytkownikowi mo\u017cliwe warto\u015bci. Po utworzeniu instancji aplikacji typu \u00ab<em>Functions App\u00bb<\/em>, u\u017cytkownik b\u0119dzie mia\u0142 dost\u0119p do panelu sterowania funkcj\u0105, gdzie mo\u017cna zobaczy\u0107 list\u0119 swoich funkcji, zmienia\u0107 ustawienia sieci, dodawa\u0107 proxy, etc.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/2.png\"><img decoding=\"async\" width=\"1024\" height=\"545\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/2-1024x545.png\" alt=\"Panel sterowania funkcj\u0105\" class=\"wp-image-18999\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/2-1024x545.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/2-300x160.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/2-768x408.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/2.png 1384w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Panel sterowania funkcj\u0105<\/figcaption><\/figure><\/div>\n\n\n\n<p>Dalej stworzymy nasz\u0105 funkcj\u0119 za pomoc\u0105 przycisku \u00ab<em>New function\u00bb<\/em>. U\u017cytkownik b\u0119dzie mia\u0142 mo\u017cliwo\u015b\u0107 wybra\u0107 jeden z kilku szablon\u00f3w funkcji, wykorzystuj\u0105c przy tym r\u00f3\u017cne j\u0119zyki programowania takie jak C#, F# oraz JavaScript.<\/p>\n\n\n\n<p>W naszym przypadku wybieramy szablon funkcji nazywaj\u0105cy si\u0119 \u00ab<em>HTTP Trigger<\/em>\u00bb, kt\u00f3ry przyjmuje i wysy\u0142a \u017c\u0105dania typu\u00a0<em>HTTP<\/em>. Wprowadzamy nazw\u0119 dla funkcji, wybieramy poziom autoryzacji i nast\u0119pnie j\u0105 zatwierdzamy.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/3-1024x611-1.png\"><img decoding=\"async\" width=\"1024\" height=\"611\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/3-1024x611-1.png\" alt=\"Dodawanie nowej funkcji\" class=\"wp-image-19001\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/3-1024x611-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/3-1024x611-1-300x179.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/3-1024x611-1-768x458.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Dodawanie nowej funkcji<\/figcaption><\/figure><\/div>\n\n\n\n<p>Funkcja zosta\u0142a stworzona. U\u017cytkownik mo\u017ce wykorzysta\u0107 minimalistyczne \u015brodowisko deweloperskie dla rozwoju i testowania funkcji bezpo\u015brednio w przegl\u0105darce. W \u015brodkowej cz\u0119\u015bci ekranu umieszczony jest edytor kodu, natomiast z prawej strony umieszczony jest ma\u0142y modu\u0142 do testowania, w kt\u00f3rym mo\u017cna tworzy\u0107 zapytania, oraz \u015bledzi\u0107 ich wykonanie.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/4-1024x550-1.png\"><img decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/4-1024x550-1.png\" alt=\"Obszar roboczy - g\u0142\u00f3wny widok\" class=\"wp-image-19003\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/4-1024x550-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/4-1024x550-1-300x161.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/4-1024x550-1-768x413.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Obszar roboczy &#8211; g\u0142\u00f3wny widok<\/figcaption><\/figure><\/div>\n\n\n\n<p>Zak\u0142adka \u00ab<em>View files<\/em>\u00bb pozwala wy\u015bwietli\u0107 katalog\u00a0 funkcji, dodawa\u0107\/edytowa\u0107\/usuwa\u0107 pliki. Dodatkowo mo\u017cna edytowa\u0107 plik\u00a0<em>project.json<\/em>, gdy jest potrzeba zarz\u0105dza\u0107 pakietami\u00a0<em>NuGet<\/em>\u00a0albo skonfigurowa\u0107 wykorzystywane modu\u0142y.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/5.png\"><img decoding=\"async\" width=\"429\" height=\"298\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/5.png\" alt=\"Struktura plik\u00f3w zwyk\u0142ej funkcji\" class=\"wp-image-19005\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/5.png 429w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/5-300x208.png 300w\" sizes=\"(max-width: 429px) 100vw, 429px\" \/><\/a><figcaption>Struktura plik\u00f3w zwyk\u0142ej funkcji<\/figcaption><\/figure><\/div>\n\n\n\n<p>Plik\u00a0<em>run.csx<\/em>\u00a0umo\u017cliwia wykonywanie g\u0142\u00f3wnej funkcji\u00a0<em>Run<\/em>\u00a0(funkcja zosta\u0142a pokazana na powy\u017cszym zrzucie ekranu w okienku dla edytowania kodu). Pliki\u00a0<em>AudioSender.csx<\/em>\u00a0oraz\u00a0<em>TelegramAudioFile.csx<\/em>\u00a0zosta\u0142y utworzone przeze mnie. Zmodyfikujmy tre\u015b\u0107 funkcji Run:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/6.png\"><img decoding=\"async\" width=\"1024\" height=\"648\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/6-1024x648.png\" alt=\"Modyfikacja tre\u015bci funkcji Run\" class=\"wp-image-19007\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/6-1024x648.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/6-300x190.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/6-768x486.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/6.png 1175w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Pe\u0142n\u0105 i aktualn\u0105 wersj\u0119 kodu mo\u017cna zobaczy\u0107 pod linkiem:\u00a0<a href=\"https:\/\/github.com\/ihorbodia\/AudioLoaderBot\" rel=\"nofollow\" >https:\/\/github.com\/ihorbodia\/AudioLoaderBot<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<p>Plik\u00a0<em>project.json<\/em>\u00a0jest plikiem konfiguracyjnym, kt\u00f3ry pomo\u017ce okre\u015bli\u0107 pakiety\u00a0<em>NuGet,<\/em>\u00a0kt\u00f3re nale\u017cy u\u017cy\u0107. W naszym przypadku wygl\u0105da on nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/7.png\"><img decoding=\"async\" width=\"318\" height=\"194\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/7.png\" alt=\"Struktura pliku project.json\" class=\"wp-image-19009\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/7.png 318w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/7-300x183.png 300w\" sizes=\"(max-width: 318px) 100vw, 318px\" \/><\/a><figcaption>Struktura pliku project.json<\/figcaption><\/figure><\/div>\n\n\n\n<p>Uwaga! Je\u015bli biblioteki, kt\u00f3re chcesz u\u017cy\u0107 w swojej funkcji nie s\u0105 dystrybuowane&nbsp; jako pakiety&nbsp;<em>NuGet<\/em>, trzeba u\u017cy\u0107 mechanizm&nbsp;<em>KUDU<\/em>. Jest to zestaw narz\u0119dzi, kt\u00f3ry pozwala przeprowadzi\u0107 bardziej szczeg\u00f3\u0142ow\u0105 diagnostyk\u0119 i ustawienia us\u0142ugi. Wi\u0119cej szczeg\u00f3\u0142\u00f3w:&nbsp;<a href=\"https:\/\/blogs.msdn.microsoft.com\/benjaminperkins\/2017\/04\/13\/how-to-add-assembly-references-to-an-azure-function-app\/\" rel=\"nofollow\" >https:\/\/blogs.msdn.microsoft.com\/benjaminperkins\/2017\/04\/13\/how-to-add-assembly-references-to-an-azure-function-app\/<\/a><\/p>\n\n\n\n<p>Ko\u0144cowym krokiem w dostosowywaniu us\u0142ug w chmurze b\u0119dzie otrzymanie linka \u2013 webhooka, pod kt\u00f3rym b\u0119dzie dost\u0119pna us\u0142uga. Aby to zrobi\u0107 nale\u017cy nacisn\u0105\u0107 na przycisk \u00ab<em>Get Function URL<\/em>\u00bb , kt\u00f3ry znajduje si\u0119 nad edytorem kodu. Ten link jest potrzebny do tego, aby stworzony wcze\u015bniej asystent w aplikacji\u00a0<em>Telegram<\/em>\u00a0wiedzia\u0142 gdzie ma wys\u0142a\u0107 zapytanie\u00a0<em>HTTP<\/em>. W danym przypadku to wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/8.png\"><img decoding=\"async\" width=\"539\" height=\"151\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/8.png\" alt=\"8 - Tworzenie asystenta do Telegram z logik\u0105 w chmurze Azure\" class=\"wp-image-19011\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/8.png 539w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/8-300x84.png 300w\" sizes=\"(max-width: 539px) 100vw, 539px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Aby powi\u0105za\u0107 bota z funkcj\u0105 w&nbsp;<em>Azure<\/em>&nbsp;nale\u017cy otworzy\u0107 odno\u015bnik:<\/p>\n\n\n\n<p><em>https:\/\/api.telegram.org\/bot<strong>&lt;YOUR_API_TOKEN&gt;<\/strong>\/setwebhook?url=<strong>&lt;HTTPS_url_to_send_updates_to&gt;<\/strong><\/em><\/p>\n\n\n\n<p>W kt\u00f3rym:<\/p>\n\n\n\n<p><strong><em>&lt;YOUR_API_TOKEN&gt;<\/em><\/strong><strong>&nbsp;\u2013&nbsp;<\/strong>token \/ klucz, kt\u00f3ry zosta\u0142 uzyskany przy tworzeniu naszego bota w&nbsp;<em>Telegram<\/em>&nbsp;(za pomoc\u0105&nbsp;<em>BotFather<\/em>) i jest potrzebny do autoryzacji asystenta<\/p>\n\n\n\n<p><strong><em>&lt;HTTPS_url_to_send_updates_to&gt;<\/em><\/strong><strong>&nbsp;\u2013&nbsp;<\/strong>link \/webhook&nbsp;do obs\u0142ugi \u017c\u0105da\u0144, znajduj\u0105cy si\u0119 pod adresem us\u0142ugi<\/p>\n\n\n\n<p>\u00a0Je\u015bli uruchomimy odno\u015bnik w przegl\u0105darce, powinna pojawi\u0107 si\u0119 prosta odpowied\u017a w postaci JSON:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/8.1.png\"><img decoding=\"async\" width=\"415\" height=\"26\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/8.1.png\" alt=\"8.1 - Tworzenie asystenta do Telegram z logik\u0105 w chmurze Azure\" class=\"wp-image-19015\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/8.1.png 415w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/8.1-300x19.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/8.1-400x26.png 400w\" sizes=\"(max-width: 415px) 100vw, 415px\" \/><\/a><figcaption>Odpowied\u017a serwera Telegram o pomy\u015blnym ustawieniu webhooka<\/figcaption><\/figure><\/div>\n\n\n\n<p>Po tej akcji, us\u0142uga w\u00a0<em>Azure<\/em>\u00a0b\u0119dzie otrzymywa\u0107 wiadomo\u015bci z chatu i odpowiada\u0107 na nie:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/9.png\"><img decoding=\"async\" width=\"814\" height=\"761\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/9.png\" alt=\"Wizualizacja - chat\" class=\"wp-image-19013\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/9.png 814w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/9-300x280.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/08\/9-768x718.png 768w\" sizes=\"(max-width: 814px) 100vw, 814px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Jak wida\u0107, efektem naszej pracy jest uzyskanie prostego bota umo\u017cliwiaj\u0105cego przetwarzanie plik\u00f3w wideo na audio i odpornego na b\u0142\u0119dne wiadomo\u015bci. Bot mo\u017ce by\u0107 przydatny dla ludzi, kt\u00f3rzy lubi\u0105 s\u0142ucha\u0107 podcast\u00f3w i jednocze\u015bnie wykonuj\u0105 inne zadania. Us\u0142uga w Azure jest niezale\u017cna od Telegramu i jest og\u00f3lnodost\u0119pna jako publiczne API.&nbsp;Ma zdefiniowan\u0105 sygnatur\u0119 przyjmowanych \u017c\u0105da\u0144 oraz mo\u017ce pracowa\u0107 nie tylko z messengerem&nbsp;<em>Telegram<\/em>.<\/p>\n\n\n\n<p>Rozbudowuj\u0105c naszego bota, mo\u017cna dodawa\u0107 r\u00f3\u017cne funkcjonalno\u015bci, na przyk\u0142ad mo\u017cliwo\u015b\u0107 ustawienia przep\u0142ywno\u015bci (<em>bit rate<\/em>), co zmniejszy rozmiar pliku wynikowego czy formatu (<em>MP3<\/em>\/<em>WMA<\/em>\/<em>OGG<\/em>).<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;5462&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;3&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;3.7&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;3.7\\\/5 ( votes: 3)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Tworzenie asystenta do Telegram z logik\u0105 w chmurze Azure&quot;,&quot;width&quot;:&quot;101.8&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 101.8px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            3.7\/5 ( votes: 3)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Chcia\u0142bym opowiedzie\u0107 par\u0119 s\u0142\u00f3w o tym jak my, programi\u015bci, mo\u017cemy wykorzystywa\u0107 nowoczesne technologie dla naszych prostych potrzeb. Przedstawi\u0119 proces tworzenia &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/tworzenie-asystenta-do-telegram-z-logika-w-chmurze-azure\/\">Continued<\/a><\/p>\n","protected":false},"author":163,"featured_media":5477,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[129,111],"class_list":["post-5462","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-c","tag-web-development"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/06\/action-blur-electronics-247932.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5462"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/163"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=5462"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5462\/revisions"}],"predecessor-version":[{"id":19017,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5462\/revisions\/19017"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/5477"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=5462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=5462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=5462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}