{"id":25573,"date":"2021-11-29T10:32:13","date_gmt":"2021-11-29T09:32:13","guid":{"rendered":"https:\/\/www.smsapi.pl\/blog\/?p=25573"},"modified":"2024-01-29T14:34:23","modified_gmt":"2024-01-29T13:34:23","slug":"biblioteka-python-sms-api","status":"publish","type":"post","link":"https:\/\/www.smsapi.pl\/blog\/podstawy\/biblioteka-python-sms-api\/","title":{"rendered":"Biblioteka Python: SMS API"},"content":{"rendered":"\n<p><strong>A teraz co\u015b z zupe\u0142nie innej beczki! Nadszed\u0142 czas na om\u00f3wienie kolejnej biblioteki programistycznej do kampanii SMS. Zosta\u0142a ona napisana w specyficznym i powszechnie lubianym j\u0119zyku. Co\u015b dla tych, kt\u00f3rzy lubi\u0105 brytyjski humor i szybkie skrypty, ale nie lubi\u0105 nawias\u00f3w klamrowych. Poznaj nasz\u0105 bibliotek\u0119 Python!<\/strong><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Na pocz\u0105tek skieruj\u0119 Ci\u0119 do odpowiedniego <a aria-label=\" (opens in a new tab)\" href=\"https:\/\/github.com\/smsapi\/smsapi-python-client\" target=\"_blank\" rel=\"noreferrer noopener nofollow\" class=\"ek-link\">repozytorium SMSAPI na GitHub<\/a>, gdzie znajdziesz kod produkcyjny, testy i przyk\u0142ady. Dok\u0142adne analizowanie plik po pliku nie b\u0119dzie jednak konieczne. Poni\u017cej przybli\u017c\u0119 najwa\u017cniejsze funkcji biblioteki, dzi\u0119ki kt\u00f3rym obs\u0142u\u017cysz <a href=\"https:\/\/www.smsapi.pl\/masowa-wysylka-sms\" class=\"ek-link\">wysy\u0142k\u0119 SMS<\/a>. <\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-16018d1d wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-secondary\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.smsapi.pl\/sms-api\" target=\"_blank\" rel=\"noreferrer noopener\">Biblioteki SMS API<\/a><\/div>\n<\/div>\n\n\n\n<p>Niejednokrotnie b\u0119d\u0119 si\u0119 odwo\u0142ywa\u0142 do <a aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" href=\"https:\/\/www.smsapi.pl\/docs\/\" target=\"_blank\" class=\"ek-link\">Dokumentacji API<\/a>, kt\u00f3ra dok\u0142adnie opisuje komunikacj\u0119 mi\u0119dzy dowoln\u0105 aplikacj\u0105 a serwerem.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"biblioteka-python-instalacja-i-konfiguracja-wysylki-sms\">Biblioteka Python: instalacja i konfiguracja wysy\u0142ki SMS<\/h2>\n\n\n\n<p>Przed rozpocz\u0119ciem kodowania trzeba przygotowa\u0107 kilka rzeczy. Przede wszystkim, zainstaluj bibliotek\u0119. Jest ona hostowana poza GitHubem, na <a aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener nofollow\" href=\"https:\/\/pypi.org\/project\/smsapi-client\/\" target=\"_blank\" class=\"ek-link\">serwisie PyPI<\/a> (Python Package Index). Dzi\u0119ki temu instalacja za pomoc\u0105 mened\u017cera pakiet\u00f3w pip jest b\u0142yskawiczna:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>pip install smsapi-client<\/code><\/pre>\n\n\n\n<p>Podobnie jak w <a aria-label=\"bibliotekach SMSAPI w innych j\u0119zykach (opens in a new tab)\" class=\"ek-link ek-link\" href=\"https:\/\/www.smsapi.pl\/blog\/biblioteka\/\" target=\"_blank\" rel=\"noreferrer noopener\">bibliotekach SMSAPI w innych j\u0119zykach<\/a>, Tw\u00f3j program b\u0119dzie komunikowa\u0142 si\u0119 z serwerem dzi\u0119ki metodom HTTP: GET, PUT, POST i DELETE. Obs\u0142uguje je zewn\u0119trzna biblioteka <a aria-label=\" (opens in a new tab)\" class=\"ek-link ek-link\" href=\"https:\/\/docs.python-requests.org\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Requests<\/a>, kt\u00f3ra jest wymagana do instalacji. B\u0119dzie ona dzia\u0142a\u0107 \u201ena zapleczu\u201d gotowej aplikacji, wi\u0119c spokojnie \u2013 nie musisz wcale zna\u0107 si\u0119 na protoko\u0142ach sieciowych, aby programowo zarz\u0105dza\u0107 <a aria-label=\" (opens in a new tab)\" href=\"https:\/\/www.smsapi.pl\/kampanie-sms\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">kampaniami SMS<\/a>.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zaloz-konto-smsapi\">Za\u0142\u00f3\u017c konto SMSAPI<\/h3>\n\n\n\n<p>Jest jeszcze jedno, co musisz zrobi\u0107, aby wysy\u0142a\u0107 <a href=\"https:\/\/www.smsapi.pl\/powiadomienia-sms\" class=\"ek-link\">powiadomienia SMS<\/a> w Pythonie: <strong>za\u0142o\u017cy\u0107 i skonfigurowa\u0107 konto SMSAPI<\/strong>! Poni\u017cej znajdziesz szybki poradnik.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"izah8JU4Vw\"><a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/zrob-to-sam-jak-utworzyc-konto-testowe\/\">Zr\u00f3b to sam #01 \u2013 Jak utworzy\u0107 konto testowe? (poradnik wideo)<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Zr\u00f3b to sam #01 \u2013 Jak utworzy\u0107 konto testowe? (poradnik wideo)&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/zrob-to-sam-jak-utworzyc-konto-testowe\/embed\/#?secret=m58YmcnYRm#?secret=izah8JU4Vw\" data-secret=\"izah8JU4Vw\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>Dzi\u0119ki temu rozpoczniemy wsp\u00f3\u0142prac\u0119 i b\u0119dziesz m\u00f3g\u0142 korzysta\u0107 z ca\u0142ego <a href=\"https:\/\/www.smsapi.pl\/sms-api\" target=\"_blank\" aria-label=\"SMS API (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">SMS API<\/a>. Pami\u0119taj te\u017c, aby uzupe\u0142ni\u0107 niezb\u0119dne informacje:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>dane osobowe<\/strong>: imi\u0119 i nazwisko, adres e-mail i has\u0142o, numer telefonu;<\/li>\n\n\n\n<li><strong>dane Twojej firmy<\/strong> \u2013 do wystawiania faktur;<\/li>\n\n\n\n<li><strong>pole nadawcy SMS<\/strong>, o kt\u00f3rym przeczytasz dalej;<\/li>\n\n\n\n<li><strong>przydadz\u0105 si\u0119 te\u017c<\/strong>: e-mail do wysy\u0142ania faktur i kontakt do Twojej ksi\u0119gowo\u015bci.<\/li>\n<\/ul>\n\n\n\n<p>Nast\u0119pnie, w Panelu Klienta <a aria-label=\"wygenerujesz token autoryzacyjny OAuth 2 (opens in a new tab)\" href=\"https:\/\/ssl.smsapi.pl\/react\/oauth\/manage\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">wygeneruj token autoryzacyjny OAuth 2<\/a>. To swoisty klucz kryptograficzny. Dzi\u0119ki niemu program b\u0119dzie m\u00f3g\u0142 uzyska\u0107 dost\u0119p do zasob\u00f3w serwera SMSAPI. Token mo\u017cesz wklei\u0107 do skryptu lub umie\u015bci\u0107 we w\u0142asnym pliku konfiguracyjnym.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-16018d1d wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-primary\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.smsapi.pl\/rejestracja\" target=\"_blank\" rel=\"noreferrer noopener\">Rejestracja konta SMSAPI<\/a><\/div>\n<\/div>\n\n\n\n<p>Przygotowania zako\u0144czone! Zobaczmy teraz, jak wygl\u0105da pocz\u0105tek pracy z kodem w Pythonie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"biblioteka-sms-python-prosta-wysylka-wiadomosci\">Biblioteka SMS Python: prosta wysy\u0142ka wiadomo\u015bci<\/h2>\n\n\n\n<p>Jedn\u0105 z najwi\u0119kszych zalet Pythona jest prostota. W tym j\u0119zyku skrypty mog\u0105 by\u0107 zwi\u0119z\u0142e i przejrzyste, a zarazem zaawansowane, a omawiana biblioteka nie stanowi wyj\u0105tku. Zlecenie prostej wysy\u0142ki pojedynczego SMS-a wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>from smsapi.client import SmsApiPlClient\n\ntoken = '%SMSAPI_ACCESS_TOKEN%'\nclient = SmsApiPlClient(access_token=token)\nresult = client.sms.send(to='+48111222333', message='Hello world!')<\/code><\/pre>\n\n\n\n<p class=\"language-python\">Co tu si\u0119 konkretnie dzieje? Najpierw <strong>tworzona jest instancja klienta<\/strong>, kt\u00f3ra zarz\u0105dza po\u0142\u0105czeniem z serwerem \u2013 dlatego potrzebujesz tokena. Formu\u0142owanie zapyta\u0144 do serwera nale\u017cy do szczeg\u00f3\u0142\u00f3w implementacji komunikacji z API, kt\u00f3re ogarnia za Ciebie biblioteka. <\/p>\n\n\n\n<p class=\"language-python\">Klient b\u0119dzie u\u017cywany za ka\u017cdym razem, poniewa\u017c zawiera obiekty odpowiedzialne za wszystkie dost\u0119pne funkcje. Nast\u0119pna linijka odwo\u0142uje si\u0119 po prostu do obiektu <code>sms<\/code> i <strong>zleca wysy\u0142k\u0119 zadanej wiadomo\u015bci<\/strong> na dany numer telefonu. Tylko tyle!<\/p>\n\n\n\n<p class=\"language-python\">Funkcja <code>send<\/code> mo\u017ce przyjmowa\u0107 wiele argument\u00f3w, kt\u00f3re na r\u00f3\u017cne sposoby modyfikuj\u0105 wysy\u0142k\u0119. Opisuje je <a aria-label=\" (opens in a new tab)\" class=\"ek-link ek-link ek-link\" rel=\"noreferrer noopener\" href=\"https:\/\/www.smsapi.pl\/docs\/#2-pojedynczy-sms\" target=\"_blank\">dzia\u0142 Dokumentacji o pojedynczym SMS<\/a>, a dalej przeczytasz te\u017c o kilku najprzydatniejszych.<\/p>\n\n\n\n<p class=\"language-python\">Zwracana warto\u015b\u0107 'result&#8217; to iterowalny obiekt klasy <code>SmsSendResult<\/code>, kt\u00f3ry zawiera <strong>parametry wys\u0142anych wiadomo\u015bci<\/strong>. S\u0105 to konkretnie: <code>count<\/code>, czyli liczba zleconych wysy\u0142ek i <code>results<\/code> \u2013 lista s\u0142ownik\u00f3w, kt\u00f3re odpowiadaj\u0105 poszczeg\u00f3lnym wiadomo\u015bciom. S\u0142ownik taki zawiera m.in.:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>id<\/code> \u2013 unikalny identyfikator wiadomo\u015bci SMS w naszym systemie;<\/li>\n\n\n\n<li><code>points<\/code> \u2013 koszt wiadomo\u015bci, czyli liczba punkt\u00f3w pobranych z Twojego konta;<\/li>\n\n\n\n<li><code>number<\/code> \u2013 numer odbiorcy;<\/li>\n\n\n\n<li><code>status<\/code> \u2013 status dor\u0119czenia (<a aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" href=\"https:\/\/www.smsapi.pl\/docs\/#18-lista-statusow-doreczenia\" target=\"_blank\" class=\"ek-link\">lista status\u00f3w w Dokumentacji<\/a>)<\/li>\n\n\n\n<li><code>date_sent<\/code> \u2013 czas wys\u0142ania wiadomo\u015bci.<\/li>\n<\/ul>\n\n\n\n<p class=\"language-python\">Pozosta\u0142e pola obiektu <code>SmsSendResult<\/code> s\u0105 opcjonalne i obecne pod warunkiem u\u017cycia parametru <code>details=1<\/code>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>message<\/code> \u2013 tre\u015b\u0107 wiadomo\u015bci;<\/li>\n\n\n\n<li><code>length<\/code> \u2013 jej d\u0142ugo\u015b\u0107;<\/li>\n\n\n\n<li><code>parts<\/code> \u2013 na ile cz\u0119\u015bci zosta\u0142a podzielona.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wysylka-wielu-sms-naraz-w-bibliotece-python\">Wysy\u0142ka wielu SMS naraz w bibliotece Python<\/h2>\n\n\n\n<p>Twoje kampanie SMS nie ob\u0119d\u0105 si\u0119 bez mo\u017cliwo\u015bci wysy\u0142ania wiadomo\u015bci do <strong>wielu odbiorc\u00f3w jednocze\u015bnie<\/strong>. Nic prostszego! Zamiast pojedynczego numeru telefonu wystarczy poda\u0107 ich list\u0119:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>from smsapi.client import SmsApiPlClient\n\ntoken = '%SMSAPI_ACCESS_TOKEN%'\nclient = SmsApiPlClient(access_token=token)\nreceivers = &#91;'+48111222333', '+48444555666']\n\nresults = client.sms.send(to=receivers, message='Hello receivers!')\nfor result in results:\n\tprint(result)\n<\/code><\/pre>\n\n\n\n<p>Jak wspomnia\u0142em, obiekt zwracany przez zlecenie wysy\u0142ki jest iterowalny, dlatego powy\u017csza p\u0119tla for wypisze na konsoli informacje o poszczeg\u00f3lnych wiadomo\u015bciach.&nbsp;<\/p>\n\n\n\n<p>W Panelu klienta odnajdziesz mo\u017cliwo\u015b\u0107 tworzenia <strong>grup odbiorc\u00f3w<\/strong>, co u\u0142atwia zorganizowanie wysy\u0142ki. Dzi\u0119ki innej metodzie mo\u017cna skorzysta\u0107 z tego u\u0142atwienia w kodzie:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>from smsapi.client import SmsApiPlClient\n\ntoken = '%SMSAPI_ACCESS_TOKEN%'\nclient = SmsApiPlClient(access_token=token)\n\n\nclient.sms.send_to_group(\n\tgroup='Group_name', \n\tmessage='Hello group!')\n<\/code><\/pre>\n\n\n\n<p class=\"language-python\">Parametry <code>to<\/code> oraz <code>group<\/code> s\u0105 kierowane do tego samego odwo\u0142ania do serwera. S\u0105 jednak roz\u0142\u0105czne, ich jednoczesne u\u017cycie wywo\u0142a b\u0142\u0105d API. Dlatego biblioteka posiada dla nich odr\u0119bne funkcje.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dodatkowe-funkjonalnosci-bramki-sms-python\">Dodatkowe funkcje bramki SMS Python<\/h2>\n\n\n\n<p>Jak ju\u017c wspomnia\u0142em, wysy\u0142k\u0119 mo\u017cna modyfikowa\u0107 poprzez ustawienie czasu dostarczenia, w\u0142asnego pola nadawcy SMS i personalizacj\u0119 tre\u015bci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1-planowanie-wysylki-sms\">1. Planowanie wysy\u0142ki SMS<\/h3>\n\n\n\n<p>W\u0142a\u015bciwy moment dostarczenia wiadomo\u015bci jest kluczowy dla przyci\u0105gni\u0119cia uwagi odbiorcy, o czym szerzej mo\u017cesz poczyta\u0107 w artykule o <strong>planowaniu SMS<\/strong>. <\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"OnhFlTk9yC\"><a href=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/czas-sie-liczy-jak-wybrac-odpowiedni-moment-na-wysylke-sms\/\">Czas si\u0119 liczy! Jak wybra\u0107 odpowiedni moment na wysy\u0142k\u0119 SMS?<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Czas si\u0119 liczy! Jak wybra\u0107 odpowiedni moment na wysy\u0142k\u0119 SMS?&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/czas-sie-liczy-jak-wybrac-odpowiedni-moment-na-wysylke-sms\/embed\/#?secret=UNQeO1FmCM#?secret=OnhFlTk9yC\" data-secret=\"OnhFlTk9yC\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"language-python\">\u017beby wcieli\u0107 w \u017cycie harmonogram Twojej kampanii, u\u017cyj parametru <code>date<\/code>. Zaplanowanie wysy\u0142ki na 1 grudnia 2021 o 12:30, przy pomocy standardowego obiektu <code>datetime<\/code> wygl\u0105da tak:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>from smsapi.client import SmsApiPlClient\nfrom datetime import datetime\n\ntoken = '%SMSAPI_ACCESS_TOKEN%'\nclient = SmsApiPlClient(access_token=token)\nsend_time = datetime(2021,12,1,12,30).isoformat()\n\nresponse = client.sms.send(\n\tto='+48111222333', \n\tmessage='Hello in the future!',\n\tdate=send_time)<\/code><\/pre>\n\n\n\n<p class=\"language-python\"><strong>Akceptowane formaty daty<\/strong> to albo czas uniksowy (liczba sekund od 1 stycznia 1970), albo ISO 8601 (czyli tutaj: 2021-12-01T12:30:00+01:00). <\/p>\n\n\n\n<p class=\"language-python\">Powy\u017cszy przyk\u0142ad korzysta z tej drugiej opcji, st\u0105d u\u017cycie metody <code>isoformat()<\/code>. Je\u017celi plany si\u0119 zmieni\u0105, mo\u017cesz anulowa\u0107 ju\u017c ustalon\u0105 wysy\u0142k\u0119. Do tego potrzebny jest unikalny identyfikator, kt\u00f3ry nale\u017cy zawczasu zapisa\u0107. Kontynuuj\u0105c zatem poprzedni listing:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>smsIdToCancel = response.results&#91;0].id\nclient.sms.remove_scheduled(smsIdToCancel)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"2-pole-nadawcy-sms-zamiast-numeru-telefonu\">2. Pole nadawcy SMS zamiast numeru telefonu<\/h3>\n\n\n\n<p class=\"language-python\">Wa\u017cn\u0105 funkcj\u0105 jest te\u017c <strong>pole nadawcy SMS<\/strong>. Chodzi o kr\u00f3tki tekst, kt\u00f3ry zostanie wy\u015bwietlony zamiast numeru telefonu nadawcy. To nazwa Twojej firmy, marki lub produktu \u2013 co\u015b, dzi\u0119ki czemu odbiorca natychmiast skojarzy, kto pisze. <\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"TcgQ0nbXn8\"><a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/branding-sms-skojarz-swoja-marke-z-wysylka-sms\/\">Branding SMS \u2013 jak ustawi\u0107 nazw\u0119 nadawcy w miejsce numeru telefonu?<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Branding SMS \u2013 jak ustawi\u0107 nazw\u0119 nadawcy w miejsce numeru telefonu?&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/branding-sms-skojarz-swoja-marke-z-wysylka-sms\/embed\/#?secret=JgeBv1jS8J#?secret=TcgQ0nbXn8\" data-secret=\"TcgQ0nbXn8\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"language-python\">Takie \u201eprzedstawienie si\u0119\u201d mo\u017ce skutecznie <strong>przyci\u0105gn\u0105\u0107 uwag\u0119 potencjalnego klienta<\/strong>. Zw\u0142aszcza \u017ce wiele os\u00f3b codziennie otrzymuje na swoje smartfony po kilkana\u015bcie powiadomie\u0144. Polami nadawcy mo\u017cesz zarz\u0105dza\u0107 w odpowiedniej <a aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" href=\"https:\/\/ssl.smsapi.pl\/sms_settings\/sendernames\" target=\"_blank\">sekcji Pola nadawcy w Panelu Klienta<\/a>. Aby z kt\u00f3rego\u015b z nich skorzysta\u0107 w kodzie Pythona, po prostu u\u017cyj parametru <code>from<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>from smsapi.client import SmsApiPlClient\n\ntoken = '%SMSAPI_ACCESS_TOKEN%'\nclient = SmsApiPlClient(access_token=token)\n\nclient.sms.send(\n\tto='+48111222333', \n\tmessage='Hello world!',\n\tfrom='sender_name')<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"obsluga-pola-nadawcy-sms-w-python\">Obs\u0142uga pola nadawcy SMS w Python<\/h4>\n\n\n\n<p class=\"language-python\">Jak ju\u017c wspomnia\u0142em, <strong>pola nadawcy SMS wy\u015bwietlane zamiast numeru telefonu<\/strong>, pozwalaj\u0105 przedstawi\u0107 si\u0119 odbiorcy. Mo\u017cesz zarz\u0105dza\u0107 nimi r\u0119cznie w Panelu klienta albo programowo w skrypcie. Umo\u017cliwia to klasa <code>Sender<\/code>, kt\u00f3ra udost\u0119pnia metody:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>add(name)<\/code> \u2013 dodaje nowe pole;<\/li>\n\n\n\n<li><code>check(name)<\/code> \u2013 zwraca obiekt ze statusem, nazw\u0105 i flag\u0105 czy to pole jest domy\u015blne;<\/li>\n\n\n\n<li><code>remove(name)<\/code> \u2013 usuwa pole;<\/li>\n\n\n\n<li><code>default(name)<\/code> \u2013 ustawia pole jako domy\u015blne;<\/li>\n\n\n\n<li><code>list()<\/code> \u2013 zwraca list\u0119 wszystkich p\u00f3l.<\/li>\n<\/ul>\n\n\n\n<p>U\u017cycie tej klasy wygl\u0105da analogicznie, jak w przypadku wysy\u0142ania SMS-\u00f3w. Tak wygl\u0105da listowanie, dodanie nowego pola, ustawienie go jako domy\u015blne oraz sprawdzenie:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>senderList = client.sender.list()\nfor senderName in senderList\n\tprint(senderName)\n\nclient.sender.add('NewSenderName')\nclient.sender.default('NewSenderName')\nclient.sender.check('NewSenderName')<\/code><\/pre>\n\n\n\n<p>Ka\u017cde nowe pole nadawcy musi zosta\u0107 <strong>zweryfikowane przez pracownika SMSAPI<\/strong>, aby upewni\u0107 si\u0119, czy dana nazwa nie jest prawnie zastrze\u017cona. Poza tym istniej\u0105 ograniczenia techniczne: dozwolona d\u0142ugo\u015b\u0107 i znaki. Wi\u0119cej na ten temat przeczytasz w FAQ technicznym poni\u017cej.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"6AvnfX3zfW\"><a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/techniczne-faq\/\">Problemy techniczne \u2013 najcz\u0119\u015bciej zadawane pytania (FAQ)<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Problemy techniczne \u2013 najcz\u0119\u015bciej zadawane pytania (FAQ)&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/techniczne-faq\/embed\/#?secret=1Izh8KW4nG#?secret=6AvnfX3zfW\" data-secret=\"6AvnfX3zfW\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3-personalizacja-sms\">3. Personalizacja SMS<\/h3>\n\n\n\n<p>Trzecim wa\u017cnym sposobem dopracowania kampanii SMS \u2013 obok planowania oraz p\u00f3l nadawcy \u2013 jest <strong>personalizacja SMS<\/strong>. Dzi\u0119ki niej podczas masowej wysy\u0142ki ka\u017cda wiadomo\u015b\u0107 zostanie w pewien spos\u00f3b zmodyfikowana. Poszczeg\u00f3lni odbiorcy poczuj\u0105 si\u0119 wtedy potraktowani bardziej osobi\u015bcie.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"U9xEHINeZ0\"><a href=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/personalizacja-tresci-wiadomosci-sms-poradnik\/\">Personalizacja tre\u015bci wiadomo\u015bci SMS (poradnik)<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Personalizacja tre\u015bci wiadomo\u015bci SMS (poradnik)&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/personalizacja-tresci-wiadomosci-sms-poradnik\/embed\/#?secret=5gvIR9I7t8#?secret=U9xEHINeZ0\" data-secret=\"U9xEHINeZ0\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>W praktyce dzia\u0142a to dzi\u0119ki specjalnym ci\u0105gom znak\u00f3w w tre\u015bci wiadomo\u015bci. W poszczeg\u00f3lnych wysy\u0142anych SMS-ach te ci\u0105gi s\u0105 podmieniane na docelowy tekst. Ten za\u015b bierze si\u0119 albo z uprzednio utworzonej bazy kontakt\u00f3w, albo z jednego z czterech parametr\u00f3w dowolnych. Zobacz ten drugi przypadek na uproszczonym przyk\u0142adzie:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>receivers = &#91;'+48111222333', '+48444555666']\nclient.sms.send(\n\tto=receivers,\n\tmessage='Hello &#91;%1%], your number is &#91;%2%]!',\n\tparam1=&#91;'Adam', 'Bert']\n\tparam2=&#91;'11', '22'])<\/code><\/pre>\n\n\n\n<p>W kolejnych wiadomo\u015bciach pole [%1%] b\u0119dzie zamieniane na kolejne elementy listy param1, analogicznie stanie si\u0119 z [%2%] i list\u0105 param2. Ostatecznie b\u0119d\u0105 wi\u0119c wygl\u0105da\u0107 tak:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Hello Adam, your number is 11!<\/p>\n\n\n\n<p>Hello Bert, your number is 22!<\/p>\n<\/blockquote>\n\n\n\n<p>Mo\u017cna to zapisa\u0107 bardziej elegancko, korzystaj\u0105c z bazy kontakt\u00f3w:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>receivers = &#91;'+48111222333', '+48444555666']\nclient.sms.send(\n\tto=receivers,\n\tmessage='Hello &#91;%imie%], your number is &#91;%1%]!',\n\tparam1=&#91;'11', '22'])<\/code><\/pre>\n\n\n\n<p>W tym przypadku parametr [%imie%] zostanie zamieniony na imi\u0119, przypisane do konkretnego odbiorcy w bazie kontakt\u00f3w. Takich standardowych p\u00f3l jest naturalnie wi\u0119cej: nazwisko, e-mail, miasto i inne, co opisuje <a aria-label=\" (opens in a new tab)\" href=\"https:\/\/www.smsapi.pl\/docs\/#sms-do-grupy-z-bazy-kontaktow\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">Dokumentacja<\/a>.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-szablony-tresci-wiadomosci-sms\">4. Szablony tre\u015bci wiadomo\u015bci SMS<\/h3>\n\n\n\n<p>Pewnym u\u0142atwieniem przy wysy\u0142kach masowych s\u0105 <strong>szablony tre\u015bci SMS<\/strong>. S\u0105 to wzory wiadomo\u015bci, kt\u00f3re mo\u017cesz tworzy\u0107 w <a aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" href=\"https:\/\/ssl.smsapi.pl\/react\/sms-templates\" target=\"_blank\" class=\"ek-link\">zak\u0142adce szabolny<\/a>. Dzi\u0119ki nim oszcz\u0119dzasz czas na pisaniu takich samych powiadomie\u0144 wiele razy. <\/p>\n\n\n\n<p>Je\u015bli za\u015b dodatkowo skorzystasz w nich z parametr\u00f3w, otrzymasz modyfikowalne tre\u015bci. Masz wi\u0119c zar\u00f3wno wygodniejsz\u0105 obs\u0142ug\u0119, jak i spersonalizowane wiadomo\u015bci. Wykorzystanie przyk\u0142adowego szablonu mo\u017ce wygl\u0105da\u0107 tak:&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>PackageSentTemplate: \u201eCze\u015b\u0107 [%imie%], Twoje zam\u00f3wienie zosta\u0142o wys\u0142ane! Nadejdzie w przeci\u0105gu [%1%] dni roboczych.\u201d&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>receivers = &#91;'+48111222333', '+48444555666']\nclient.sms.send(\n\tto=receivers,\n\ttemplate='PackageSentTemplate',\n\tparam1='4')<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"obsluga-bledow-api\">Obs\u0142uga b\u0142\u0119d\u00f3w API<\/h2>\n\n\n\n<p class=\"language-python\">Nastawiaj\u0105c si\u0119 na najlepsze, warto by\u0107 przygotowanym na najgorsze. Dlatego obs\u0142uga b\u0142\u0119d\u00f3w to podstawa. Kiedy po stronie serwera wyst\u0105pi b\u0142\u0105d przetwarzania danego zapytania, informacja o tym zostanie przes\u0142ana zamiast normalnej odpowiedzi. Biblioteka przetworzy j\u0105 i podniesie jeden z wyj\u0105tk\u00f3w. <\/p>\n\n\n\n<p class=\"language-python\">Zdefiniowano pi\u0119\u0107 klas, dziedzicz\u0105cych po <code>Exception<\/code>. Maj\u0105 one nast\u0119puj\u0105c\u0105 hierarchi\u0119:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>SmsApiException<\/code> \u2013 klasa nadrz\u0119dna, pozwala obs\u0142ugiwa\u0107 \u0142\u0105cznie wszystkie wyj\u0105tki pochodz\u0105ce z biblioteki SMSAPI. Zawiera wiadomo\u015b\u0107 i opcjonalnie kod b\u0142\u0119du.\n<ul class=\"wp-block-list\">\n<li><code>ClientException<\/code> \u2013 wyst\u0105pi, je\u015bli nie podano danych autoryzacyjnych.<\/li>\n\n\n\n<li><code>EndpointException<\/code> \u2013 b\u0142\u0119dy zg\u0142oszone ze strony serwera \u2013 patrz lista kod\u00f3w ni\u017cej.\n<ul class=\"wp-block-list\">\n<li><code>SendException<\/code> \u2013 klasa przypisana do akcji wysy\u0142ania wiadomo\u015bci. W razie u\u017cycia b\u0142\u0119dnych numer\u00f3w telefon\u00f3w zawiera list\u0119 informacji o nich.<\/li>\n\n\n\n<li><code>ContactsException<\/code> \u2013 wyj\u0105tki podczas programowej obs\u0142ugi bazy kontakt\u00f3w.&nbsp;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"najczesciej-spotykane-kody-bledow\">Najcz\u0119\u015bciej spotykane kody b\u0142\u0119d\u00f3w<\/h3>\n\n\n\n<p>W dokumentacji znajdziesz szczeg\u00f3\u0142ow\u0105 list\u0119 kod\u00f3w b\u0142\u0119d\u00f3w wraz z obja\u015bnieniami. Najcz\u0119\u015bciej wyst\u0119puj\u0105ce b\u0142\u0119dy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>11<\/strong> \u2013 zbyt d\u0142uga wiadomo\u015b\u0107 lub jej brak;<\/li>\n\n\n\n<li><strong>12<\/strong> \u2013 wiadomo\u015b\u0107 podzielona na wi\u0119cej cz\u0119\u015bci, ni\u017c wynosi limit;<\/li>\n\n\n\n<li><strong>13<\/strong> \u2013 niepoprawny numer odbiorcy;<\/li>\n\n\n\n<li><strong>14<\/strong> \u2013 b\u0142\u0119dne pole nadawcy;<\/li>\n\n\n\n<li><strong>26<\/strong> \u2013 za d\u0142ugi temat wiadomo\u015bci;<\/li>\n\n\n\n<li><strong>40<\/strong> \u2013 nie istnieje grupa o danej nazwie;<\/li>\n\n\n\n<li><strong>101<\/strong> \u2013 b\u0142\u0119dny token autoryzacyjny;<\/li>\n\n\n\n<li><strong>103<\/strong> \u2013 za ma\u0142o \u015brodk\u00f3w na koncie, aby wys\u0142a\u0107 wiadomo\u015b\u0107;<\/li>\n\n\n\n<li><strong>8<\/strong>, <strong>201<\/strong>, <strong>999<\/strong> \u2013 wewn\u0119trzne b\u0142\u0119dy serwera.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"language-python\">Wyj\u0105tek <code>EndpointException<\/code> wyst\u0119puje jeszcze w dw\u00f3ch sytuacjach. Pierwsza to b\u0142\u0119dy komunikacji z serwerem. Wtedy kod pochodzi z odpowiedzi HTTP, jak cho\u0107by znany b\u0142\u0105d numer 404 \u2013 nie znaleziono zasobu. <\/p>\n\n\n\n<p class=\"language-python\">Druga mo\u017cliwo\u015b\u0107 to u\u017cycie nierozpoznanej nazwy parametru, czyli najprawdopodobniej liter\u00f3wka. Na przyk\u0142ad kiedy <a aria-label=\"zamiast &quot;message&quot; napiszesz &quot;massage&quot; (opens in a new tab)\" href=\"https:\/\/en.wikipedia.org\/wiki\/The_Medium_Is_the_Massage\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">zamiast &#8222;mess<\/a><a href=\"https:\/\/en.wikipedia.org\/wiki\/The_Medium_Is_the_Massage\" target=\"_blank\" aria-label=\"a (opens in a new tab)\" rel=\"noreferrer noopener nofollow\" class=\"ek-link\">a<\/a><a aria-label=\"zamiast &quot;message&quot; napiszesz &quot;massage&quot; (opens in a new tab)\" href=\"https:\/\/en.wikipedia.org\/wiki\/The_Medium_Is_the_Massage\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">ge&#8221; napiszesz &#8222;massage&#8221;<\/a>. \ud83d\ude09<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dalsze-opcje-obslugi-komunikacji-mobilnej-w-python\">Dalsze opcje obs\u0142ugi komunikacji mobilnej w Python<\/h2>\n\n\n\n<p>Mo\u017cliwo\u015bci omawianej biblioteki si\u0119gaj\u0105 dalej! Warto na koniec wspomnie\u0107 o paru z nich np. kampaniach SMS czy zarz\u0105dzaniu baz\u0105 kontakt\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wysylka-mms-z-python\">Wysy\u0142ka MMS z Python <\/h3>\n\n\n\n<p>Wa\u017cne jest <strong>wysy\u0142anie wiadomo\u015bci MMS<\/strong>. Obs\u0142uguje si\u0119 je bardzo prosto:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>response = client.mms.send(\n\tto='+48111222333', \n\tsmil=SMIL_contents,\n\tsubject='Hello multimedia')<\/code><\/pre>\n\n\n\n<p class=\"language-python\">Obowi\u0105zkowy parametr smil to poprawna tre\u015b\u0107 multimedialna w XML-owym formacie SMIL 1.0, kt\u00f3r\u0105 musisz uprzednio przygotowa\u0107. Zwracany jest obiekt tego samego typu, co w przypadku SMS: <code>SmsSendResult<\/code>. Dodatkowo mo\u017cna poda\u0107 tekstowy temat wiadomo\u015bci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zarzadzanie-baza-kontaktow\">Zarz\u0105dzanie baz\u0105 kontakt\u00f3w<\/h3>\n\n\n\n<p>W artykule napomkn\u0105\u0142em te\u017c o bazie kontakt\u00f3w. W prowadzeniu akcji marketingowych posiadanie takiej listy potencjalnych klient\u00f3w jest absolutnie kluczowe. <\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"87oEJgNKvL\"><a href=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/jak-zbierac-numery-do-masowej-wysylki-sms\/\">Jak zbiera\u0107 numery do masowej wysy\u0142ki SMS?<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Jak zbiera\u0107 numery do masowej wysy\u0142ki SMS?&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/jak-zbierac-numery-do-masowej-wysylki-sms\/embed\/#?secret=plRPbLXImP#?secret=87oEJgNKvL\" data-secret=\"87oEJgNKvL\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"language-python\">SMSAPI pozwala w praktyce <strong>wykorzysta\u0107 baz\u0119 danych osobowych do prowadzenia kampanii SMS<\/strong>. W Panelu klienta mo\u017cesz tak\u0105 baz\u0105 zarz\u0105dza\u0107, ale biblioteka Python r\u00f3wnie\u017c to umo\u017cliwia. <\/p>\n\n\n\n<p class=\"language-python\">Klasa <code>client<\/code> posiada obok obiekt\u00f3w <code>sms<\/code>, <code>sender<\/code> i <code>mms<\/code> jeszcze instancj\u0119 <code>contacts<\/code>. Spos\u00f3b u\u017cycia tego ostatniego jest wi\u0119c analogiczny, jak w przyk\u0142adach, kt\u00f3re podawa\u0142em wcze\u015bniej. Jak cho\u0107by utworzenie nowego kontaktu:<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>response = client.contacts.create_contact(\n\tfirst_name='Jan',\n\tlast_name='Kowalski',\n\tphone_number='+48111222333',\n\temail='jankowalski@example.com',\n\tgender='male'\n\tbirthday_date='2000-01-31')<\/code><\/pre>\n\n\n\n<p>Poszczeg\u00f3lne funkcje pozwalaj\u0105 odczytywa\u0107, listowa\u0107, tworzy\u0107, edytowa\u0107 oraz usuwa\u0107 zar\u00f3wno poszczeg\u00f3lne kontakty, jak i ca\u0142e grupy. Jest te\u017c mo\u017cliwo\u015b\u0107 przypisania i usuni\u0119cia kontaktu z grupy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"biblioteka-python-sms-podsumowanie\">Biblioteka Python SMS: podsumowanie<\/h2>\n\n\n\n<p>I to wszystko, je\u015bli chodzi o podstawowe dzia\u0142anie wysy\u0142ek SMS w Python! A jednak, ten artyku\u0142 wci\u0105\u017c nie wyczerpa\u0142 wszystkich mo\u017cliwo\u015bci biblioteki. <\/p>\n\n\n\n<p>Wi\u0119cej pr\u00f3bek zastosowa\u0144 r\u00f3\u017cnych funkcji i mo\u017cliwo\u015bci bramki SMS API znajdziesz w <a aria-label=\" (opens in a new tab)\" class=\"ek-link ek-link\" href=\"https:\/\/github.com\/smsapi\/smsapi-python-client\/tree\/master\/examples\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">katalogu przyk\u0142ad\u00f3w<\/a> na GitHubie. W repozytorium jest te\u017c <a aria-label=\" (opens in a new tab)\" class=\"ek-link ek-link\" href=\"https:\/\/github.com\/smsapi\/smsapi-python-client\/tree\/master\/tests\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">folder test\u00f3w jednostkowych<\/a>, napisanych we frameworku unittest. One r\u00f3wnie\u017c mog\u0105 pos\u0142u\u017cy\u0107 za \u017ar\u00f3d\u0142o przyk\u0142adowych zastosowa\u0144 r\u00f3\u017cnych metod. <\/p>\n\n\n\n<p>Za\u015b wielokrotnie przywo\u0142ywana <a aria-label=\" (opens in a new tab)\" href=\"https:\/\/www.smsapi.pl\/docs\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">Dokumentacja API<\/a> to \u017ar\u00f3d\u0142o wiedzy o znaczeniu poszczeg\u00f3lnych parametr\u00f3w, status\u00f3w i kod\u00f3w. Teraz masz ju\u017c wiedz\u0119 potrzebn\u0105 do zintegrowania Python z SMS. Do dzie\u0142a!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A teraz co\u015b z zupe\u0142nie innej beczki! Nadszed\u0142 czas na om\u00f3wienie kolejnej biblioteki programistycznej do kampanii SMS. Zosta\u0142a ona napisana w specyficznym i powszechnie lubianym j\u0119zyku. Co\u015b dla tych, kt\u00f3rzy lubi\u0105 brytyjski humor i szybkie skrypty, ale nie lubi\u0105 nawias\u00f3w klamrowych. Poznaj nasz\u0105 bibliotek\u0119 Python!<\/p>\n","protected":false},"author":3,"featured_media":25578,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[321],"tags":[315,230,223],"class_list":["post-25573","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-podstawy","tag-biblioteka","tag-it","tag-api"],"_links":{"self":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts\/25573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/comments?post=25573"}],"version-history":[{"count":37,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts\/25573\/revisions"}],"predecessor-version":[{"id":30056,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts\/25573\/revisions\/30056"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/media\/25578"}],"wp:attachment":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/media?parent=25573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/categories?post=25573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/tags?post=25573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}