Telegram bot në Python. Një udhëzues i plotë për të shkruar një robot me kurse këmbimi nga e para

Bots në Telegram janë programe që ndihmojnë për të vendosur kontakte me audiencën ose për të thjeshtuar veprimet që më parë duhej të kryheshin manualisht. Këto programe janë shkruar posaçërisht për platformën e mesazheve. Bots funksionojnë në këtë mënyrë: përdoruesi dërgon një komandë përmes linjës hyrëse dhe sistemi përgjigjet me një mesazh tekst ose interaktiv. Ndonjëherë programi madje imiton veprimet e një personi të vërtetë - një bot i tillë frymëzon më shumë besim te klientët.

Ekzistojnë disa lloje sistemesh për ndihmë automatike për përdoruesit. Disa robotë thjesht komunikojnë me klientët, të tjerët ofrojnë rregullisht informacion. Është e pamundur të ndahen qartë programet në lloje - zhvilluesit shpesh kombinojnë disa funksione në një bot.

Mund të shkruani një bot të thjeshtë për Telegram me elementë ndërveprues në formën e butonave në ekran në 9 hapa. Le të shohim secilën prej tyre në detaje dhe t'u përgjigjemi disa pyetjeve:

  • si të filloni një bot;
  • si të regjistroni një tastierë të integruar nga një ose më shumë butona;
  • si të programoni butonat për funksionet e dëshiruara;
  • çfarë është modaliteti inline dhe si ta konfiguroni atë për një bot ekzistues.

Hapi 0: sfond teorik në lidhje me API-në e robotëve të Telegram

Mjeti kryesor i përdorur për të krijuar bot Telegram është Ndërfaqja e Programimit të Aplikacionit HTML, ose HTML API. Ky element pranon kërkesat e vizitorëve dhe dërgon përgjigje në formën e informacionit. Modelet e gatshme thjeshtojnë punën në program. Për të shkruar një bot për Telegram, duhet të përdorni këtë adresë emaili: https://api.telegram.org/bot/METHOD_NAME

Për funksionimin e duhur të robotit, nevojitet gjithashtu një shenjë - një kombinim karakteresh që mbron programin dhe hap qasjen në të për zhvilluesit e besuar. Çdo shenjë është unike. Vargu i caktohet robotit pas krijimit. Metodat mund të jenë të ndryshme: getUpdates, getChat dhe të tjera. Zgjedhja e metodës varet nga algoritmi që zhvilluesit presin nga roboti. Shembull simbolik:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Bots përdorin kërkesat GET dhe POST. Parametrat e metodës shpesh duhet të plotësohen - për shembull, kur metoda sendMessage supozohet të dërgojë ID-në e bisedës dhe pak tekst. Parametrat për përsosjen e metodës mund të kalohen si një varg pyetjesh URL duke përdorur aplikacionin/x-www-form-urlencoded ose nëpërmjet aplikacionit-json. Këto metoda nuk janë të përshtatshme për shkarkimin e skedarëve. Kërkohet gjithashtu kodimi UTF-8. Duke dërguar një kërkesë në API, mund të merrni rezultatin në formatin JSON. Shikoni përgjigjen e programit për marrjen e informacionit përmes metodës getME:

MERRNI https://api.telegram.org/bot/getMe{ ok: e vërtetë, rezultati: { id: 231757398, first_name: "Exchange Rate Bot", emri i përdoruesit: "exchangetestbot" } }

Rezultati do të merret nëse ok është e barabartë me i vërtetë. Përndryshe, sistemi do të tregojë një gabim.

Ka dy mënyra për të marrë mesazhe të personalizuara në bots. Të dyja metodat janë efektive, por janë të përshtatshme në raste të ndryshme. Për të marrë mesazhe, mund të shkruani manualisht një kërkesë me metodën getUpdates - programi do të shfaqë grupin e të dhënave Përditësimi në ekran. Kërkesat duhet të dërgohen rregullisht, pasi të analizohet çdo grup, dërgimi përsëritet. Offset është një parametër që përcakton numrin e regjistrimeve të anashkaluara përpara se të ngarkoni një rezultat të ri për të shmangur rishfaqjen e objekteve të kontrolluara. Përfitimet e metodës getUpdates do të hyjnë në lojë nëse:

  • nuk ka asnjë mënyrë për të konfiguruar HTTPS;
  • përdoren gjuhë komplekse skriptimi;
  • serveri bot ndryshon herë pas here;
  • roboti është i ngarkuar me përdorues.

Metoda e dytë që mund të shkruhet për të marrë mesazhe të përdoruesit është setWebhook. Përdoret një herë, nuk ka nevojë të dërgoni vazhdimisht kërkesa të reja. Uebhook dërgon përditësime të të dhënave në URL-në e specifikuar. Kjo metodë kërkon një certifikatë SSL. Webhook do të jetë i dobishëm në këto raste:

  • përdoren gjuhët e programimit në ueb;
  • roboti nuk është i mbingarkuar, nuk ka shumë përdorues;
  • serveri nuk ndryshon, programi mbetet në të njëjtin server për një kohë të gjatë.

Në udhëzimet e mëtejshme, ne do të përdorim getUpdates.

Shërbimi @BotFather Telegram është krijuar për të krijuar chat bots. Cilësimet bazë vendosen gjithashtu përmes këtij sistemi - BotFather do t'ju ndihmojë të bëni një përshkrim, të vendosni një foto profili, të shtoni mjete mbështetëse. Bibliotekat – grupe kërkesash HTML për bot-et e Telegram-it – janë të disponueshme në internet, ka mjaft prej tyre. Gjatë krijimit të programit shembull, u përdor pyTelegramBotApi.

Hapi 1: Zbatimi i kërkesave për kursin e këmbimit

Së pari ju duhet të shkruani kodin që kryen pyetjet. Ne do të përdorim kur shkruajmë API-në e PrivatBank, më poshtë është një lidhje për të: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Ju duhet të përdorni këto metoda në kodin tuaj:

  • load_exchange – gjen kurset e këmbimit dhe shfaq informacionin e koduar;
  • get_exchange – shfaq të dhëna për një monedhë specifike;
  • get_exchanges – tregon listën e monedhave sipas mostrës.

Si rezultat, kodi në skedarin pb.py duket si ky:

import ri-import kërkesa import json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): kthe json.loads(requests.get(URL).text) def get_exchange(ccy_key ): për exc në load_exchange(): nëse ccy_key == exc['cccy']: kthen exc kthim False def get_exchanges(ccy_pattern): rezultat = [] ccy_pattern = re.escape(cccy_pattern) + '.*' për exc në load_exchange(): nëse re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) nuk është Asnjë: result.append(exc) kthe rezultat

Programi mund të lëshojë përgjigjen e mëposhtme për kërkesat e specifikuara:

[ { ccy:"USD", base_ccy:"UAH", blej:"25.90000", shitje:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", blej:"29.10000", shitje:"29.85000 " }, { ccy:"RUR", bazë_ccy:"UAH", blej:"0.37800", shitje:"0.41800" }, { ccy:"BTC", bazë_ccy:"USD", blej:"11220.0384", shitje: "12401.0950" } ]

Hapi 2: Krijoni një Bot Telegram me @BotFather

Ju mund të krijoni një program për marrjen e mesazheve dhe përgjigjen ndaj tyre duke përdorur shërbimin @BotFather. Shkoni në faqen e tij në Telegram dhe futni komandën /newbot. Në bisedë do të shfaqen udhëzimet, sipas të cilave duhet të shkruani fillimisht emrin e robotit dhe më pas adresën e tij. Kur krijohet llogaria e botit, një mesazh mirëseardhjeje që përmban një shenjë do të shfaqet në ekran. Për konfigurim të mëtejshëm, përdorni këto komanda:

  • /setdescription – përshkrim;
  • /setabouttext – informacion rreth botit të ri;
  • /setuserpic – foto profili;
  • /setinline – modaliteti inline;
  • /setcommands – përshkrimi i komandave.

Në hapin e fundit të konfigurimit, ne përshkruajmë /help dhe /exchange. Kur të kenë përfunduar të gjithë hapat, është koha për të kaluar në kodim.

Hapi 3: Vendosja dhe hapja e Bot

Le të krijojmë një skedar config.py. Në të, duhet të specifikoni kodin unik të botit dhe zonën kohore në të cilën programi do të gjejë informacion.

TOKEN = '' # zëvendëso me kodin e robotit tëndTIMEZONE = 'Evropë/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

Më pas, krijojmë një skedar tjetër me importimin e pb.py të shkruar më parë, bibliotekat dhe komponentët e tjerë të nevojshëm. Bibliotekat që mungojnë janë instaluar nga sistemi i menaxhimit të paketave (pip).

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

Le të përdorim përmbajtjen e pyTelegramBotApi për të krijuar një bot. Ne dërgojmë shenjën e marrë duke përdorur kodin e mëposhtëm:

bot = telebot.TeleBot(config.TOKEN) bot.polling(none_stop=E vërtetë)

Parametri none_stop siguron që kërkesat të dërgohen vazhdimisht. Funksionimi i parametrit nuk do të ndikohet nga gabimet e metodës.

Hapi 4: Shkruani Trajtuesin e Komandës /start

Nëse të gjithë hapat e mëparshëm janë bërë si duhet, roboti ka filluar të funksionojë. Programi gjeneron kërkesa rregullisht sepse përdor metodën getUpdates. Përpara rreshtit me elementin none_stop, na duhet një pjesë kodi që përpunon komandën /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Përshëndetje! Unë mund t'ju tregoj kursin e këmbimit.n' + 'Për të marrë kursin e këmbimit shtyp / exchange.n' + 'Për të marrë ndihmë, shtypni /help.' )

RdzhSЂRё komandat=['fillimi'] e barabartë me të Vërtetën thirret komanda start_. Përmbajtja e mesazhit shkon atje. Më pas, duhet të zbatoni funksionin e dërgimit_mesazh në lidhje me një mesazh të caktuar.

Hapi 5: Krijoni një Trajtues të Komandës /help

Komanda /help mund të zbatohet si një buton. Duke klikuar mbi të, përdoruesi do të dërgohet në llogarinë Telegram të zhvilluesit. Jepini butonit një emër, si p.sh. "Pyetni zhvilluesin". Vendosni parametrin reply_markup, i cili e ridrejton përdoruesin në një lidhje, për metodën send_message. Le të shkruajmë në kod parametrin që krijon tastierën (InlineKeyboardMarkup). Ju duhet vetëm një buton (InlineKeyboardButton).

Kodi përfundimtar i mbajtësit të komandës duket si ky:

@bot.message_handler(commands=['ndihmë']) def help_command(mesazh): tastierë = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Pyet zhvilluesin', url='ваша ссылка на ь' ) ) bot.send_message( message.chat.id, '1) Për të marrë një listë të monedhave të disponueshme shtypni /exchange.n' + '2) Klikoni mbi monedhën që ju intereson.n' + '3) Ju do të marrë një mesazh që përmban informacion në lidhje me burimin dhe monedhat e synuara, ' + 'normat e blerjes dhe tarifat e shitjes.n' + '4) Klikoni "Përditëso" për të marrë informacionin aktual në lidhje me kërkesën. ' + 'Bot do të tregojë gjithashtu diferencën midis kursit të mëparshëm dhe aktual të këmbimit.n' + '5) Bot mbështet inline. Shkruaj @ në çdo bisedë dhe shkronjat e para të një monedhe.', reply_markup=keyboard )

Veprimi i kodit në bisedën në Telegram:

Telegram bot në Python. Një udhëzues i plotë për të shkruar një robot me kurse këmbimi nga e para

Hapi 6: Shtimi i mbajtësit të komandës /exchange

Ky hap nevojitet për të shfaqur butonat me simbolet e monedhave të disponueshme në bisedë. Një tastierë në ekran me opsione do t'ju ndihmojë të shmangni gabimet. PrivatBank ofron informacion mbi rublën, dollarin dhe euron. Opsioni InlineKeyboardButton funksionon si ky:

  1. Përdoruesi klikon në butonin me përcaktimin e dëshiruar.
  2. getUpdates merr një thirrje mbrapsht (CallbackQuery).
  3. Bëhet e njohur se si të trajtohet shtypja e tastierës - transmetohet informacioni për butonin e shtypur.

/kodi i mbajtësit të shkëmbimit:

@bot.message_handler(commands=['shkëmbim']) def exchange_command(mesazh): tastierë = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton('USD', callback_data='merr-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, 'Kliko në monedhën e zgjedhur:', reply_markup=keyboard )

Rezultati i kodit në Telegram:

Telegram bot në Python. Një udhëzues i plotë për të shkruar një robot me kurse këmbimi nga e para

Hapi 7: Shkrimi i një mbajtësi për butonat e integruar të tastierës

Paketa pyTelegramBot Api përmban funksionin e dekoruesit @bot.callback_query_handler. Ky komponent është krijuar për të përkthyer kthimin e thirrjes në një funksion - API e hap dhe e rikrijon thirrjen. Shkruhet kështu:

@bot.callback_query_handler(func=telefonata lambda: E vërtetë) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(pyetës)

Le të shkruajmë gjithashtu metodën get_ex_callback:

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

Ekziston një metodë tjetër e dobishme - answer_callback_query. Ndihmon për të hequr ngarkesën midis shtypjes së butonit dhe shfaqjes së rezultatit në ekran. Mund të dërgoni një mesazh te send_exchange_query duke kaluar një kod monedhe dhe një mesazh. Le të shkruajmë send_exchange_result:

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

Ndërsa chatbot merr rezultatin e kërkesës nga banka API, vizitori sheh mbishkrimin "duke shtypur një mesazh". Duket sikur një person i vërtetë po përgjigjet. Për të shfaqur një tregues të tillë në ekran, do t'ju duhet të shtoni linja të statusit të hyrjes. Tjetra, ne do të përdorim get_exchange - me ndihmën e tij, programi do të marrë përcaktimin e monedhës (rubla, euro ose dollarë). send_message përdor metoda shtesë: serialize_ex konverton monedhën në një format tjetër dhe get_update_keyboard konfiguron butona që përditësojnë informacionin dhe dërgojnë të dhënat e tregut të monedhës në biseda të tjera.

Le të shkruajmë kodin për get_update_keyboard. Duhet të përmenden dy butona - t dhe e tregojnë tip dhe shkëmbim. Artikulli switch_inline_query për butonin Share është i nevojshëm në mënyrë që përdoruesi të mund të zgjedhë nga disa biseda. Vizitori do të jetë në gjendje të zgjedhë se kujt t'i dërgojë kursin aktual të këmbimit të dollarit, rublës ose euros.

def get_update_keyboard(ex): tastierë = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Update', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['buy'], 's': ex['sale'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Share', switch_inline_query=ex['ccy']) ) tastierë kthese

Ndonjëherë ju duhet të shihni se sa ka ndryshuar kursi i këmbimit në një kohë të shkurtër. Le të shkruajmë dy metoda për butonin Përditëso në mënyrë që përdoruesit të mund të shohin kurse në krahasim.

Diferenca midis kurseve të këmbimit i kalon serializuesit nëpërmjet parametrit diff.

Metodat e përshkruara funksionojnë vetëm pasi të dhënat të përditësohen, ato nuk do të ndikojnë në shfaqjen e parë të kursit.

def serialize_ex(ex_json, diff=Asnjë): rezultat = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Bli: ' + ex_json['blej'] nëse diff: rezultat += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Shitet: ' + ex_json['shitje'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' tjetër: rezultat += 'nShit: ' + ex_json['sale'] + 'n' kthen rezultat def serialize_exchange_diff(diff): rezultat = '' nëse diff > 0: rezultat = '(' + str(ndryshim) + ' " 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: rezultat = '(' + str( dallim)[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">)' rezultati i kthimit

Imagjinoni që vizitori donte të dinte kursin e këmbimit të dollarit. Ja çfarë ndodh nëse zgjidhni USD në mesazh:

Telegram bot në Python. Një udhëzues i plotë për të shkruar një robot me kurse këmbimi nga e para

Hapi 8: Zbatimi i mbajtësit të butonit të përditësimit

Le të shkruajmë kodin për trajtimin e veprimeve me butonin Update dhe të shtojmë në të pjesën iq_callback_method. Kur artikujt e programit fillojnë me parametrin get, duhet të shkruani get_ex_callback. Në situata të tjera, ne analizojmë JSON dhe përpiqemi të marrim çelësin t.

@bot.callback_query_handler(func=thirrja lambda: E vërtetë) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query) other: provo: nëse json.loads(data)[ 't'] == 'u': edit_message_callback(pyetje) përveç ValueError: kalim

Nëse t është e barabartë me u, do t'ju duhet të shkruani një program për metodën edit_message_callback. Le ta zbërthejmë këtë proces hap pas hapi:

  1. Shkarkimi i informacionit të përditësuar për gjendjen e tregut të monedhës (exchange_now = pb.get_exchange(data['c']).
  1. Shkrimi i një mesazhi të ri përmes një serializuesi me diff.
  2. Shtimi i një nënshkrimi (get_edited_signature).

Nëse mesazhi fillestar nuk ndryshon, telefononi metodën edit_message_text.

def edit_message_callback(query): data = json.loads(query.data)['e'] exchange_now = pb.get_exchange(data['c']) text = serialize_ex(shkëmbim_tani, get_exchange_diff( get_ex_from_iq_data(owta)), shkëmbim)_ + 'n' + get_edited_signature() nëse query.message: bot.edit_message_text(tekst, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_modeif='HTMLid_inline') : bot.edit_message_text (tekst, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Le të shkruajmë metodën get_ex_from_iq_data për të analizuar JSON:

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

Do t'ju duhen disa metoda të tjera: për shembull, get_exchange_diff, e cila lexon informacionin e vjetër dhe të ri në lidhje me koston e monedhave dhe shfaq diferencën.

def get_exchange_diff(e fundit, tani): return { 'sale_diff': float("%.6f" % (float(tani['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(tani['blej']) - float(i fundit['blej']))) }

E fundit, get_edited_signature, tregon kohën e përditësimit të fundit të kursit.

def get_edited_signature(): kthe 'U përditësua " + str(data.datëtime.tani(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

Si rezultat, mesazhi i përditësuar nga bot me një kurs këmbimi të qëndrueshëm duket si ky:

Telegram bot në Python. Një udhëzues i plotë për të shkruar një robot me kurse këmbimi nga e para

Kur kursi ndryshon, ndryshimet midis vlerave shfaqen në mesazh për shkak të parametrave të përcaktuar.

Telegram bot në Python. Një udhëzues i plotë për të shkruar një robot me kurse këmbimi nga e para

Hapi 9: Zbatimi i modalitetit të integruar

Modaliteti i integruar nevojitet për të dërguar shpejt informacionin nga programi në çdo bisedë - tani nuk keni nevojë të shtoni një bot në bisedë si pjesëmarrës. Kur një përdorues i Telegram-it fut një emër roboti me një shenjë @ përpara tij, opsionet e konvertimit duhet të shfaqen mbi vijën e hyrjes. Nëse klikoni në një nga artikujt, roboti do t'i dërgojë një mesazh bisedës me rezultatet dhe butonat për përditësimin dhe dërgimin e të dhënave. Emri i dërguesit do të përmbajë titullin “nëpërmjet ".

InlineQuery i kalohet query_text nëpërmjet bibliotekës. Kodi përdor funksionin answer_line për të tërhequr rezultatet e kërkimit si një grup të dhënash dhe elementin inline_query_id. Ne përdorim get_exchanges në mënyrë që roboti të gjejë disa monedha sipas kërkesës.

@bot.inline_handler(func=kërkesa lambda: E vërtetë) def query_text(inline_query): bot.answer_inline_query(inline_query.id, get_iq_articles(pb.get_exchanges(inline_query.query)) )

Ne kalojmë një grup të dhënash tek get_iq_articles në mënyrë që të kthejmë objekte nga InlineQueryResultArticle përmes kësaj metode.

def get_iq_articles(shkëmbime): rezultat = [] për exc në shkëmbime: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputTextnts ( serialize_ex(exc), parse_mode='HTML' ), reply_markup=get_update_keyboard(exc), description='Konverto ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) rezultati i kthimit

Tani, nëse shkruani @ dhe një hapësirë ​​në rresht, rezultatet e kërkimit do të shfaqen në ekran - opsione për konvertimin në tre monedha të disponueshme.

Telegram bot në Python. Një udhëzues i plotë për të shkruar një robot me kurse këmbimi nga e para

Përdoruesit mund të filtrojnë rezultatet duke futur monedhën e dëshiruar.

Pasi klikoni në monedhën e dëshiruar nga lista, chat-i merr të njëjtin mesazh që marrin përdoruesit e bot-it. Ju gjithashtu mund të përdorni butonin Përditëso. Imazhi më poshtë tregon mesazhin e përditësuar të dërguar përmes botit:

Telegram bot në Python. Një udhëzues i plotë për të shkruar një robot me kurse këmbimi nga e para

Përfundim

Tani ju e dini se si të krijoni një bot për Telegram. Ju mund të shtoni mjete të dobishme në programin tuaj: butona për përditësimin dhe dërgimin e rezultatit te përdoruesit e tjerë të mesazherit dhe një modalitet i integruar që ju lejon të përdorni funksionet e botit jashtë bisedës me të. Bazuar në këtë udhëzim, mund të krijoni çdo bot të thjeshtë me funksione të tjera - jo vetëm atë që do të tregojë kurset e këmbimit. Mos kini frikë të eksperimentoni me bibliotekat, API-të dhe kodin për të krijuar një asistent të automatizuar që do të bisedojë me klientët në Telegram dhe do të forcojë lidhjen e njerëzve të interesuar me kompaninë.

1 Comment

  1. Publikimi fantastik

Lini një Përgjigju