Telegram-botti Pythonissa. Täydellinen opas botin kirjoittamiseen valuuttakursseilla tyhjästä

Telegramin robotit ovat ohjelmia, jotka auttavat luomaan yhteyden yleisöön tai yksinkertaistavat toimintoja, jotka aiemmin piti suorittaa manuaalisesti. Nämä ohjelmat on kirjoitettu erityisesti Messenger-alustalle. Botit toimivat näin: käyttäjä lähettää komennon syöttörivin kautta, ja järjestelmä vastaa tekstillä tai interaktiivisella viestillä. Joskus ohjelma jopa jäljittelee oikean henkilön toimintaa – tällainen botti herättää enemmän luottamusta asiakkaiden keskuudessa.

Käyttäjien automaattista avustamista varten on olemassa useita erilaisia ​​järjestelmiä. Jotkut robotit vain kommunikoivat asiakkaiden kanssa, toiset tarjoavat säännöllisesti tietoja. On mahdotonta jakaa ohjelmia selkeästi tyyppeihin – kehittäjät yhdistävät usein useita toimintoja samaan bottiin.

Voit kirjoittaa Telegramille yksinkertaisen botin, jossa on interaktiivisia elementtejä näytön painikkeiden muodossa 9 vaiheessa. Katsotaanpa jokaista niistä yksityiskohtaisesti ja vastaamme muutamaan kysymykseen:

  • kuinka käynnistää botti;
  • kuinka sisäänrakennettu näppäimistö rekisteröidään yhdestä tai useammasta painikkeesta;
  • kuinka ohjelmoida painikkeet haluttuja toimintoja varten;
  • mikä on inline-tila ja kuinka se määritetään olemassa olevaa bottia varten.

Vaihe 0: teoreettinen tausta Telegram-bottien API:sta

Päätyökalu Telegram-bottien luomiseen on HTML Application Programming Interface tai HTML API. Tämä elementti hyväksyy vierailijoiden pyynnöt ja lähettää vastaukset tiedon muodossa. Valmiit mallit yksinkertaistavat ohjelman parissa työskentelemistä. Jos haluat kirjoittaa botin Telegramille, sinun on käytettävä tätä sähköpostiosoitetta: https://api.telegram.org/bot/METHOD_NAME

Botin oikeaan toimintaan tarvitaan myös token – merkkiyhdistelmä, joka suojaa ohjelmaa ja avaa pääsyn siihen luotettaville kehittäjille. Jokainen merkki on ainutlaatuinen. Merkkijono määritetään bottiin luomisen yhteydessä. Menetelmät voivat olla erilaisia: getUpdates, getChat ja muut. Menetelmän valinta riippuu siitä, mitä algoritmia kehittäjät odottavat robotilta. Token esimerkki:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Botit käyttävät GET- ja POST-pyyntöjä. Menetelmäparametreja on usein täydennettävä – esimerkiksi silloin, kun sendMessage-menetelmän on tarkoitus lähettää chat-tunnus ja tekstiä. Metodin tarkennusparametrit voidaan välittää URL-kyselymerkkijonona käyttämällä application/x-www-form-urlencoded tai application-json-komentoa. Nämä menetelmät eivät sovellu tiedostojen lataamiseen. Myös UTF-8-koodaus vaaditaan. Lähettämällä pyynnön API:lle saat tuloksen JSON-muodossa. Katso ohjelman vastaus tietojen hakemiseen getME-menetelmällä:

HANKI https://api.telegram.org/bot/getMe{ ok: true, tulos: { id: 231757398, etunimi: "Exchange Rate Bot", käyttäjätunnus: "exchangetestbot" } }

Tulos saadaan, jos ok on yhtä suuri kuin totta. Muussa tapauksessa järjestelmä ilmoittaa virheestä.

On kaksi tapaa saada mukautettuja viestejä boteissa. Molemmat menetelmät ovat tehokkaita, mutta sopivat erilaisiin tapauksiin. Viestien saamiseksi voit kirjoittaa pyynnön manuaalisesti getUpdates-menetelmällä – ohjelma näyttää Päivitä datataulukon näytöllä. Pyynnöt tulee lähettää säännöllisesti, jokaisen taulukon analysoinnin jälkeen lähetys toistetaan. Offset on parametri, joka määrittää ohitettujen tietueiden määrän ennen uuden tuloksen lataamista, jotta vältetään tarkistettujen objektien uusiutuminen. getUpdates-menetelmän edut tulevat käyttöön, jos:

  • HTTPS:ää ei voi määrittää;
  • käytetään monimutkaisia ​​skriptikieliä;
  • bottipalvelin vaihtuu aika ajoin;
  • botti on täynnä käyttäjiä.

Toinen tapa, joka voidaan kirjoittaa vastaanottamaan käyttäjäviestejä, on setWebhook. Sitä käytetään kerran, ei tarvitse jatkuvasti lähettää uusia pyyntöjä. Webhook lähettää tietopäivitykset määritettyyn URL-osoitteeseen. Tämä menetelmä vaatii SSL-varmenteen. Webhook on hyödyllinen seuraavissa tapauksissa:

  • web-ohjelmointikieliä käytetään;
  • botti ei ole ylikuormitettu, käyttäjiä ei ole liikaa;
  • palvelin ei muutu, ohjelma pysyy samalla palvelimella pitkään.

Jatko-ohjeissa käytämme getUpdates.

@BotFather Telegram -palvelu on suunniteltu chat-bottien luomiseen. Myös perusasetukset asetetaan tämän järjestelmän kautta – BotFather auttaa sinua tekemään kuvauksen, laittamaan profiilikuvan ja lisäämään tukityökaluja. Kirjastot – HTML-pyyntösarjat Telegram-boteille – ovat saatavilla Internetissä, niitä on melko paljon. Esimerkkiohjelmaa luotaessa käytettiin pyTelegramBotApi.

Vaihe 1: Valuuttakurssipyyntöjen toteuttaminen

Ensin sinun on kirjoitettava koodi, joka suorittaa kyselyt. Käytämme PrivatBank API:ta kirjoittaessamme, alla on linkki siihen: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Sinun on käytettävä näitä menetelmiä koodissasi:

  • load_exchange – etsii valuuttakurssit ja näyttää koodatut tiedot;
  • get_exchange – näyttää tiedot tietystä valuutasta;
  • get_exchanges – näyttää valuuttojen luettelon näytteen mukaan.

Tämän seurauksena pb.py-tiedoston koodi näyttää tältä:

tuonti uudelleen tuontipyynnöt import json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): return json.loads(requests.get(URL).text) def get_exchange(ccy_key) ): exc in load_exchange(): if ccy_key == exc['ccy']: return exc return Väärä def get_exchanges(ccy_pattern): tulos = [] ccy_pattern = re.escape(ccy_pattern) + '.*' exc in load_exchange(): jos re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) ei ole Ei mitään: result.append(exc) palauttaa tuloksen

Ohjelma voi antaa seuraavan vastauksen määritettyihin pyyntöihin:

[ { ccy:"USD", base_ccy:"UAH", osto:"25.90000", myynti:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", osto:"29.10000", myynti:"29.85000" " }, { ccy:"RUR", base_ccy:"UAH", osta:"0.37800", alennus:"0.41800" }, { ccy:"BTC", base_ccy:"USD", osta:"11220.0384", myynti: "12401.0950" } ]

Vaihe 2: Luo Telegram-botti @BotFatherin kanssa

Voit luoda ohjelman viestien vastaanottamiseen ja niihin vastaamiseen @BotFather-palvelun avulla. Mene hänen Telegram-sivulleen ja kirjoita /newbot-komento. Chatissa ilmestyvät ohjeet, joiden mukaan sinun on ensin kirjoitettava muistiin botin nimi ja sitten sen osoite. Kun bottitili on luotu, näytölle ilmestyy tunnuksen sisältävä tervetuloviesti. Käytä näitä komentoja lisämäärityksiä varten:

  • /setdescription – kuvaus;
  • /setabouttext – tiedot uudesta robotista;
  • /setuserpic – profiilikuva;
  • /setinline – rivitila;
  • /setcommands – komentojen kuvaus.

Viimeisessä määritysvaiheessa kuvataan /help ja /exchange. Kun kaikki vaiheet on suoritettu, on aika siirtyä koodaukseen.

Vaihe 3: Botin asentaminen ja käynnistäminen

Luodaan config.py-tiedosto. Siinä sinun on määritettävä yksilöllinen bottikoodi ja aikavyöhyke, josta ohjelma löytää tietoja.

TOKEN = '' # korvaa bottisi tunnuksellaTIMEZONE = 'Eurooppa/Kiova' TIMEZONE_COMMON_NAME = 'Kiova'

Seuraavaksi luomme toisen tiedoston, jossa tuodaan aiemmin kirjoitettu pb.py, kirjastot ja muut tarvittavat komponentit. Puuttuvat kirjastot asennetaan paketinhallintajärjestelmästä (pip).

import telebotimport configimport pbimport datetimeimport pytzimport jsonimport traceback P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME

Luodaan botti käyttämällä pyTelegramBotApin sisältöä. Lähetämme vastaanotetun tunnuksen seuraavalla koodilla:

bot = telebot.TeleBot(config.TOKEN) bot.polling(none_stop=True)

None_stop-parametri varmistaa, että pyyntöjä lähetetään jatkuvasti. Menetelmävirheet eivät vaikuta parametrin toimintaan.

Vaihe 4: Kirjoita /start komentokäsittelijä

Jos kaikki edelliset vaiheet on tehty oikein, botti on alkanut toimia. Ohjelma luo pyyntöjä säännöllisesti, koska se käyttää getUpdates-menetelmää. Ennen riviä, jossa on none_stop-elementti, tarvitsemme koodinpätkän, joka käsittelee /start-komennon:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Tervehdys! Voin näyttää valuuttakurssit.n' + 'Saat valuuttakurssit painamalla / Exchange.n' + 'Saat apua painamalla /help.' )

RџСўРё commands=['aloita'] yhtä suuri kuin Totta start_command kutsutaan. Viestin sisältö menee sinne. Seuraavaksi sinun on otettava käyttöön lähetystoiminto_viesti suhteessa tiettyyn viestiin.

Vaihe 5: Luo /help-komentokäsittelijä

/help-komento voidaan toteuttaa painikkeena. Napsauttamalla sitä käyttäjä ohjataan kehittäjän Telegram-tilille. Anna painikkeelle nimi, esimerkiksi "Kysy kehittäjältä". Aseta send_message-menetelmälle reply_markup-parametri, joka ohjaa käyttäjän linkille. Kirjoitetaan koodiin parametri, joka luo näppäimistön (InlineKeyboardMarkup). Tarvitset vain yhden painikkeen (InlineKeyboardButton).

Lopullinen komentokäsittelijän koodi näyttää tältä:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Kysy kehittäjältä', url='валкаа насы профиль' ) ) bot.send_message( message.chat.id, '1) Saat luettelon käytettävissä olevista valuutoista painamalla /exchange.n' + '2) Napsauta valuuttaa, josta olet kiinnostunut.n' + '3) Sinä saa viestin, joka sisältää tietoja lähteestä ja kohdevaluutoista, ' + 'osto- ja myyntikurssit.n' + '4) Napsauta "Päivitä" saadaksesi ajantasaiset tiedot pyynnöstä. ' + 'Botti näyttää myös eron edellisen ja nykyisen valuuttakurssin välillä.n' + '5) Botti tukee inline-vaihtoa. Kirjoita @ missä tahansa chatissa ja valuutan ensimmäisissä kirjaimissa.', reply_markup=keyboard )

Kooditoiminto Telegram-chatissa:

Telegram-botti Pythonissa. Täydellinen opas botin kirjoittamiseen valuuttakursseilla tyhjästä

Vaihe 6: Lisää /exchange-komentokäsittelijä

Tämä vaihe on tarpeen, jotta chatissa näytetään painikkeita, joissa on käytettävissä olevien valuuttojen symbolit. Näytön näppäimistö vaihtoehtoineen auttaa sinua välttämään virheitä. PrivatBank tarjoaa tietoja ruplasta, dollarista ja eurosta. InlineKeyboardButton-vaihtoehto toimii näin:

  1. Käyttäjä napsauttaa haluamallaan tavalla merkittyä painiketta.
  2. getUpdates vastaanottaa takaisinsoittopyynnön (CallbackQuery).
  3. Näppäimistön painamisen käsittely tulee tiedoksi – tiedot painetusta painikkeesta välittyvät.

/vaihtokäsittelijän koodi:

@bot.message_handler(commands=['vaihto']) def Exchange_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton('USD', callback_data='get-USD') ) keyboard.row( telebot.types.InlineKeyboardButton('EUR', callback_data='get-EUR'), telebot.types.InlineKeyboardButton('RUR', callback_data='get-RUR') ) bot.send_message( message.chat .id, 'Napsauta valittua valuuttaa', reply_markup=keyboard )

Telegramin koodin tulos:

Telegram-botti Pythonissa. Täydellinen opas botin kirjoittamiseen valuuttakursseilla tyhjästä

Vaihe 7: Käsittelijän kirjoittaminen sisäänrakennetuille näppäimistön painikkeille

PyTelegramBot Api -paketti sisältää @bot.callback_query_handler koristelutoiminnon. Tämä komponentti on suunniteltu muuttamaan takaisinkutsu funktioksi – API purkaa ja luo puhelun uudelleen. Se on kirjoitettu näin:

@bot.callback_query_handler(func=lambda call: True) def iq_callback(query): data = query.data jos data.startswith('get-'): get_ex_callback(query)

Kirjoita myös get_ex_callback-menetelmä:

def get_ex_callback(query): bot.answer_callback_query(query.id) send_exchange_result(query.message, query.data[4:])

On toinenkin hyödyllinen menetelmä – answer_callback_query. Se auttaa poistamaan kuormituksen painikkeen painamisen ja tuloksen näytölle näyttämisen välillä. Voit lähettää viestin osoitteeseen send_exchange_query antamalla valuuttakoodin ja Viestin. Kirjoitetaan send_exchange_result:

def send_exchange_result(message, ex_code): bot.send_chat_action(message.chat.id, 'kirjoitus') ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id, serialize_ex(ex), reply_markup=get_exdate_key ), parse_mode='HTML' )

Vaikka chatbot vastaanottaa pyynnön tuloksen pankista API, vierailija näkee tekstin "kirjoittaa viestiä". Näyttää siltä, ​​että oikea henkilö vastaa. Jos haluat näyttää tällaisen ilmaisimen näytöllä, sinun on lisättävä syöttötilarivit. Seuraavaksi käytämme get_exchangea – sen avulla ohjelma saa valuuttamerkinnän (rupla, euro tai dollari). send_message käyttää lisämenetelmiä: serialize_ex muuntaa valuutan toiseen muotoon ja get_update_keyboard määrittää toimintonäppäimet, jotka päivittävät tietoja ja lähettävät valuuttamarkkinatietoja muihin keskusteluihin.

Kirjoitetaan koodi get_update_keyboardille. Kaksi painiketta on mainittava – t ja e tarkoittavat tyyppiä ja vaihtoa. Share-painikkeen switch_inline_query-kohde tarvitaan, jotta käyttäjä voi valita useista keskusteluista. Vierailija voi valita, kenelle lähettää nykyisen dollarin, ruplan tai euron vaihtokurssin.

def get_update_keyboard(ex): näppäimistö = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Päivitä', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['osta'], 's': ex['alennus'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Jaa', switch_inline_query=ex['ccy']) ) paluu näppäimistö

Joskus sinun täytyy nähdä, kuinka paljon valuuttakurssi on muuttunut lyhyessä ajassa. Kirjoita Päivitä-painikkeelle kaksi menetelmää, jotta käyttäjät voivat nähdä kursseja vertailussa.

Valuuttakurssien välinen ero välitetään sarjoittajalle diff-parametrin kautta.

Määrätyt menetelmät toimivat vasta tietojen päivityksen jälkeen, ne eivät vaikuta kurssin ensimmäiseen näyttöön.

def serialize_ex(ex_json, diff=Ei mitään): tulos = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Osta: ' + ex_json['osta'] jos ero: tulos += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Myy: ' + ex_json['alennus'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: tulos += 'nSell: ' + ex_json['sale'] + 'n' palauttaa tuloksen def serialize_exchange_diff(diff): tulos = '' jos ero > 0: tulos = '(' + str(diff) + ' " src="https://sworg/images/core/emoji/2.3/svg/2197.svg">" src="https://sworg/images /core/emoji/72x72/2197.png">" src="https://sworg/images/core/emoji/72x72/2197.png">)' elif diff < 0: tulos = '(' + str( diff)[1:] + ' " src="https://sworg/images/core/emoji/2.3/svg/2198.svg">" src="https://sworg/images/core/emoji/72x72 /2198.png">" src="https://sworg/images/core/emoji/72x72/2198.png">)" palautustulos

Kuvittele, että vierailija halusi tietää dollarin vaihtokurssin. Näin tapahtuu, jos valitset viestissä USD:n:

Telegram-botti Pythonissa. Täydellinen opas botin kirjoittamiseen valuuttakursseilla tyhjästä

Vaihe 8: Päivityspainikekäsittelijän käyttöönotto

Kirjoitetaan koodi toimintojen käsittelyä varten Päivitä-painikkeella ja lisätään siihen osa iq_callback_method. Kun ohjelman kohteet alkavat get-parametrilla, sinun on kirjoitettava get_ex_callback. Muissa tilanteissa jäsennämme JSON:ia ja yritämme saada avaimen t.

@bot.callback_query_handler(func=lambda call: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query) else: try: if json.loads(data)[ 't'] == 'u': edit_message_callback(query) paitsi ValueError: hyväksy

Jos t on yhtä kuin u, sinun on kirjoitettava ohjelma edit_message_callback-menetelmää varten. Haetaan tämä prosessi vaihe vaiheelta:

  1. Ladataan ajantasaisia ​​tietoja valuuttamarkkinoiden tilasta (exchange_now = pb.get_exchange(data['c']).
  1. Uuden viestin kirjoittaminen serialisaattorilla, jossa on diff.
  2. Allekirjoituksen lisääminen (get_edited_signature).

Jos alkuperäinen viesti ei muutu, kutsu menetelmää edit_message_text.

def edit_message_callback(query): data = json.loads(query.data)['e'] exchange_now = pb.get_exchange(data['c']) text = serialize_ex( Exchange_now, get_exchange_diff( get_ex_from_iq_data(owta)), vaihto + 'n' + get_edited_signature() jos query.message: bot.edit_message_text( text, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode_idline_if_HTML'ssage. : bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Kirjoitetaan get_ex_from_iq_data menetelmä JSONin jäsentämiseksi:

def get_ex_from_iq_data(exc_json): return { 'osta': exc_json['b'], 'sale': exc_json['s'] }

Tarvitset vielä muutaman menetelmän: esimerkiksi get_exchange_diff, joka lukee vanhat ja uudet tiedot valuuttojen hinnasta ja näyttää eron.

def get_exchange_diff(viime, nyt): return { 'sale_diff': float("%.6f" % (float(now['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(now['buy']) - float(last['osta']))) }

Viimeinen, get_edited_signature, näyttää ajan, jolloin kurssi on viimeksi päivitetty.

def get_edited_signature(): return 'Päivitetty ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

Tämän seurauksena päivitetty viesti robotista, jolla on vakaa valuuttakurssi, näyttää tältä:

Telegram-botti Pythonissa. Täydellinen opas botin kirjoittamiseen valuuttakursseilla tyhjästä

Kun kurssi muuttuu, arvojen väliset erot näkyvät viestissä määrättyjen parametrien vuoksi.

Telegram-botti Pythonissa. Täydellinen opas botin kirjoittamiseen valuuttakursseilla tyhjästä

Vaihe 9: Sulautetun tilan käyttöönotto

Sisäänrakennettua tilaa tarvitaan tietojen nopeaan lähettämiseen ohjelmasta mihin tahansa chattiin – nyt sinun ei tarvitse lisätä bottia keskusteluun osallistujana. Kun Telegram-käyttäjä kirjoittaa botin nimen, jonka edessä on @-merkki, muunnosvaihtoehtojen pitäisi näkyä syöttörivin yläpuolella. Jos napsautat jotakin kohdetta, botti lähettää keskusteluun viestin, jossa on tulokset ja painikkeet tietojen päivittämistä ja lähettämistä varten. Lähettäjän nimessä on kuvateksti "via ".

InlineQuery välitetään query_textille kirjaston kautta. Koodi käyttää answer_line-funktiota hakutulosten hakemiseen tietojoukona ja inline_query_id-elementtinä. Käytämme get_exchanges, jotta botti löytää pyynnöstä useita valuuttoja.

@bot.inline_handler(func=lambda query: True) def query_text(inline_query): bot.answer_inline_query( inline_query.id, get_iq_articles(pb.get_exchanges(inline_query.query)) )

Välitämme datajoukon get_iq_articlesille, jotta voimme palauttaa objektit InlineQueryResultArticlesta tämän menetelmän avulla.

def get_iq_articles(exchanges): tulos = [] excille pörsseissä: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputTextMessageContent ( serialize_ex(exc), parse_mode='HTML' ), reply_markup=get_update_keyboard(exc), description='Muunna ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) palauttaa tuloksen

Jos nyt kirjoitat @ ja välilyönnin rivillä, hakutulokset ilmestyvät näytölle – vaihtoehdot muuntamiseen kolmeen käytettävissä olevaan valuuttoon.

Telegram-botti Pythonissa. Täydellinen opas botin kirjoittamiseen valuuttakursseilla tyhjästä

Käyttäjät voivat suodattaa tuloksia syöttämällä haluamasi valuutan.

Kun olet napsauttanut haluamaasi valuuttaa luettelosta, chat saa saman viestin kuin botin käyttäjät. Voit myös käyttää Päivitä-painiketta. Alla olevassa kuvassa näkyy päivitetty viesti, joka on lähetetty botin kautta:

Telegram-botti Pythonissa. Täydellinen opas botin kirjoittamiseen valuuttakursseilla tyhjästä

Yhteenveto

Nyt tiedät kuinka luoda botti Telegramille. Voit lisätä ohjelmaan hyödyllisiä työkaluja: painikkeet tulosten päivittämiseen ja lähettämiseen muille messengerin käyttäjille sekä sisäänrakennetun tilan, jonka avulla voit käyttää botin toimintoja chatin ulkopuolella. Tämän ohjeen perusteella voit luoda minkä tahansa yksinkertaisen botin, jolla on muita toimintoja – ei vain sitä, joka näyttää valuuttakursseja. Älä pelkää kokeilla kirjastoja, API:ita ja koodia luodaksesi automaattisen avustajan, joka keskustelee asiakkaiden kanssa Telegramissa ja vahvistaa kiinnostuneiden ihmisten yhteyttä yritykseen.

miten 1

  1. Fantástica publicación

Jätä vastaus