
Šodien mēs no pieejamajiem materiāliem savāksim Telegram-botu izmantojot (vai Yandex funkcijas — īsumā) un (vai Objektu glabātuve — skaidrības labad). Kods būs uz Node.js. Tomēr ir viens sakarīgs apstāklis — kāda organizācija, kuru nosauksim par Roskomcenzūra (cenzūra ir aizliegta ar Krievijas Federācijas Satversmes 29. pantu), neļauj Krievijas interneta pakalpojumu sniedzējiem pārsūtīt pieprasījumus uz Telegram API adresē: https://api.telegram.org/. Nu, mēs to nedarīsim — ja nav, tad nav. Galu galā mūsu braucienā ir tā sauktie webhooki — ar to palīdzību mēs neveicam pieprasījumus uz konkrētu adresi, bet vienkārši sūtām savu pieprasījumu kā atbildi uz jebkuru pieprasījumu uz mums. Tas nozīmē, kā Odessā — atbildam ar jautājumu uz jautājumu. Tāpēc Telegram API mūsu kodā tas nebūs.
AtskaiteŠajā rakstā minētās valstiskās organizācijas nosaukumi ir izdomāti, un iespējamie sakritības ar reāli esošu organizāciju nosaukumiem ir nejauši.
Tātad, mēs izveidosim botu, kas mūs apgādās ar gudrām domām. Tieši tādu, kā attēlā:
Varat to izmēģināt darbībā — lūk, vārds: @SmartThoughtsBot. Pamanījāt pogu «Alises prasme»? Это потому, что бот является своеобразным «компаньоном» для одноименного Alises prasmes, t.i., tas veic tās pašas funkcijas, ko Alises prasme un, iespējams, viņi varēs mīlīgi līdzpastāvēt, reklamējot viens otru. Par to, kā izveidot prasmju Gudrās Domas stāstīts rakstā . Tagad (pēc dažām izmaiņām, kas veiktas pēc minētā raksta publicēšanas) šī prasme izskatīsies aptuveni tā:
Bota izveidošana
Es vēlos, lai šis norādījums būtu noderīgs visiem, tostarp arī iesācējiem 'botu veidotājiem'. Tāpēc šajā nodaļā es diezgan detalizēti aprakstīšu, kā vispār izveidot Telegram‘e botu. Ja jums šī informācija nav nepieciešama — pārejiet uz nākamajiem jums sadaļām.
Atveram lietotni Telegaram, izsaucam visu botu tēvu (viņiem viss kā cilvēkiem) — @BotFather — un vispirms dodam viņam komandu /help, lai atsvaidzinātu atmiņā, ko mēs varam darīt. Tagad mūs interesēs komanda /newbot.

Jo šeit aprakstītais bots jau ir izveidots, demonstrācijas nolūkos es uz īsu laiku izveidošu citu botu (pēc tam to dzēsīšu). Nosaukšu to par DemoHabrBot. Vārdi (username) visiem Telegram botiem jāpabeidz ar vārdu bot, piemēram: MyCoolBot vai my_cool_bot — tas ir priekš botiem. Bet vispirms dodam botam nosaukumu (name) — un tas ir cilvēkiem. Nosaukums var būt jebkurā valodā, saturēt atstarpi, nav jābeidzas ar vārdu bot, un pat nav jābūt unikālam. Šajā piemērā es nosaucu šo robotu Demo Habr.

Tagad izvēlamies robotam vārdu (username, tādu, kas ir robotiem). Nosauksim to par DemoHabrBot. Viss, kas attiecās uz robota nosaukumu (name) vispār nepieder pie tā vārda — username (vai attiecas, bet ar precizitāti līdz pretējai pusi). Pēc tam, kad esam veiksmīgi izveidojuši unikālo robota vārdu, mums ir jākopē un jāsaglabā (stingrā slepenībā!) tokens, kas parādīts ekrānuzņēmumā ar sarkano bultu. Ar tā palīdzību mēs drīzumā iestatīsim iebūvēto Telegram‘a webhook uz mūsu Yandex funkciju.

Un tagad dosim komandu visu robotu tēvam: /mybots, un viņš parādīs mums visu mūsu izveidoto robotu sarakstu. Atstāsim pagaidām novārtā neseno robotu Demo Habr (tas tika izveidots, lai parādītu, kā izveidot robotus, bet mēs to vēl izmantosim šodien citām demonstrācijas vajadzībām), un apskatīsim robotu Gudrās Domas (@SmartThoughtsBot). Noklikšķinām sarakstā uz robota vārda pogas.

Šeit mēs varam konfigurēt mūsu robotu. Nospiežot pogu Rediģēt… mēs pāriesim uz kādas opcijas rediģēšanu. Piemēram, noklikšķinot uz pogas Edit Name mēs varam mainīt robota nosaukumu, sakot, vietā Gudrās Domas, uzrakstīt Trakās Idejas. Botpic — tas ir robota avatar, tam jābūt ne mazāk kā 150 x 150 px. Apraksts — tas ir īss apraksts, ko lietotājs redz, kad pirmo reizi palaiž robotu, kā atbildi uz jautājumu: Ko šis robots var darīt? Par — vēl īsāks apraksts, kas tiek nosūtīts kopā ar saiti uz robotu (https://t.me/SmartThoughtsBot) vai skatoties informāciju par to.

Mums palikuši tikai jāsakārto komandas. Tāpēc nospiežam pogu Edit Commands. Lai standartizētu lietotāju praksi Telegram ieteicams vienmēr izmantot divas komandas: /start un /help, bet ja robotam ir nepieciešami iestatījumi — papildu komandu /settings. Mūsu robots ir vienkāršs kā bumba, tāpēc viņam pagaidām iestatījumi nav nepieciešami. Ierakstām divas pirmās komandas, kuras mēs vēlāk apstrādāsim kodā. Tagad, ja ievades laukā lietotājs ievadīs slīpsvītru (slīpos simbolu: /), parādīsies komandu saraksts ātrai izvēlei. Viss kā attēlā: pa kreisi — iestatām komandas caur robotu tēvu; pa labi šīs komandas jau ir pieejamas lietotājiem mūsu robotā.

Yandex funkcija
Tagad, kad mūsu robots izveidots, pārejam uz Yandex. Mākoņi, lai izveidotu funkciju, kas izpildīs mūsu bota kodu. Ja vēl neesat strādājis ar Yandex.Cloud , iepazīstieties ar materiālu , tad — . Es esmu gandrīz drošs, ka šie divi relativi īsie raksti jums pilnīgi pietiks, lai pamatos izprastu tēmu.
Tātad, konsolē Yandex.Cloud kreisajā navigācijas izvēlnē izvēlamies punktu Cloud Functions, un pēc tam nospiežam pogu Izveidot funkciju. Piešķiram tam nosaukumu un sev – īsu aprakstu.

Pēc pogas nospiešanas Izveidot un pēc dažām sekundēm, jaunā funkcija parādīsies visu funkciju sarakstā. Nospiediet uz tās nosaukuma – tas mūs aizvedīs uz Pārskats mūsu funkcijas lapu. Šeit jāieslēdz (Ieslēgts) pārslēgs Publiskā funkcija, lai tā būtu pieejama no ārējā (no Yandex.Cloud) pasaules, un lauku vērtības Aicinājuma saite un Identifikators — glabāt dziļā noslēpumā no visiem, izņemot sevi un Telegram’a, lai jūsu funkciju nevarētu izsaukt dažādi krāpnieki.

Tagad, izmantojot kreiso izvēlni, pārejam uz Redaktors funkcijām. Lai pagaidām atliekam malā mūsu Gudrās Domas, un izveidosim minimālu šablona funkciju, lai pārbaudītu mūsu bota darbību... Tomēr šajā kontekstā šī funkcija ir mūsu bots... Īsāk sakot, tagad un tieši šeit mēs izveidosim vienkāršāko botu, kas "atspoguļos" (t.i., atgriezīs) lietotāju pieprasījumus. Šo šablonu var izmantot vienmēr, izveidojot jaunus Telegram botus, lai pārliecinātos, ka savienojums ar Telegram’darbojas normāli. Nospiediet Izveidot failu, nosaucam to par index.js, un tiešsaistes Koda redaktorā ielīmējam šajā failā sekojošo kodu:
module.exports.bot = async (event) => {
const body = JSON.parse(event.body);
const msg = {
'method': 'sendMessage',
'chat_id': body.message.chat.id,
'text': body.message.text
};
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': JSON.stringify(msg),
'isBase64Encoded': false
};
};
Konsole Yandex.Cloud tas izskatīsies aptuveni tā:

Tālāk nedaudz zemāk norādām Ieiešanas punkts — index.bot, kur index tas ir faila nosaukums (index.js), un bot — funkcijas nosaukums (module.exports.bot). Visas pārējās jomas atstājam «kā ir», un labajā augšējā stūrī nospiežam pogu Izveidot versiju. Pēc dažām sekundēm šī funkcija versija tiks izveidota. Drīz, pēc tīmekļa atgriezeniskās saites testēšanas , mēs izveidosim jaunu versiju —Tagad, kad mums ir izveidota Gudrās Domas.

Objektu glabātuve
, ļaujiet, kamēr mēs esam konsolē Yandex funkcija, izveidot tā dēvēto baķet ( Yandex.Cloud, izveidosim t.s. bucket (bucket, proti tam, kur iemēram, nav pušķis) attēlu failu glabāšanai, kas tiks izmantoti mūsu botā Gudrās Domas. Kreisajā navigācijas izvēlnē izvēlamies punktu Object Storage, nospiežam pogu Izveidot tvertni, izdomājam nosaukumu, piemēram, attēlu-tvertne, un, galvenais, Piekļuve objektu lasīšanai padarām publisku — citādi Telegram’ā mūsu attēlus neredzēs. Visus pārējos laukus atstājam bez izmaiņām. Nospiežam pogu Izveidot tvertni.

Pēc tam visu tvertņu saraksts var izskatīties apmēram tā (ja tā ir jūsu vienīgā tvertne):

Tagad es piedāvāju nospiest uz tvertnes nosaukuma un iekšā izveidot mapīti, lai kārtotu attēlu glabāšanu dažādiem saviem lietojumiem. Piemēram, Telegram botam Gudrās Domas es izveidoju mapīti ar nosaukumu tg-bot-izspertās-domas (nerunājiet, es sapratīšu šo šifru). Izveidojiet arī kādu.

Tagad var nospiest uz mapes nosaukuma, ieiet tajā un augšupielādēt failus:

Un nospiežot uz faila nosaukuma — iegūt to URL lietošanai mūsu botā un vispār — kaut kur citur (bet, nepārpublicējiet šo URL pavisam lieki, jo datplūsma no Objektu krātuves tiek maksāta).

Tātad, tas arī viss par Objektu krātuvi. Tagad jūs zināsiet, ko darīt, kad redzēsiet aicinājumu augšupielādēt tur failus.
Webhooks
Tagad mēs uzstādīsim webhook — t.i., kad bots saņems atjauninājumu (piemēram, ziņojumu no lietotāja), no servera Telegram mūsu Yandex funkciju tiks nosūtīta pieprasījuma (request) ar datiem. Šī ir rindiņa, ko var vienkārši ielikt pārlūkprogrammas adreses laukā un pēc tam atjaunināt lapu (to jādara tikai vienu reizi): https://api.telegram.org/bot{bot_token}/setWebHook?url={webhook_url}
Vienīgais, ko nomainām {bot_token} uz tokenu, ko saņēmām no bota-vecāka, izveidojot mūsu botu, bet {webhook_url} uz URL mūsu Yandex funkcijas. Minūti! Bet vai Roskomcenzūra aizliedz pakalpojumu sniedzējiem Krievijā apkalpot adresi https://api.telegram.org. Jā, tas ir taisnība. Bet izdomājiet kaut ko. Galu galā varbūt lūgt savam vecmammai Ukrainā, Izraēlā vai Kanādā — tur nav nekādu «krievu cenzoru», un viens Dievs zina, kā cilvēki dzīvo bez tā. Galu galā, pieprasījuma-atbildes procesā instalējot webhook, tam jāizskatās tā:

Testējam. Tam jābūt «spoguļojamiem».

Tā arī ir. Mūsu apsveikumi — tagad Yandex funkcija ir kļuvis Telegram-botu!
Gudrās Domas
Tagad darām Gudrās Domas. Kods ir atvērts un atrodas . Tas ir labi komentēts, un tam ir tikai simts rindiņu. Lasiet to kā operas dižinieces libreto!

Klonējiet projektu un instalējiet atkarības:
git clone https://github.com/stmike/tg-bot-smart-thoughts.git
cd tg-bot-smart-thoughts
npm i
Veiciet nepieciešamās izmaiņas failā index.js (pēc izvēles; varat neko nemainīt). Izveidojiet zip-arhīvu ar failu index.js un mapi node_modules iekšpusē, piemēram, ar nosaukumu smart.zip.

Tagad pārejiet uz mūsu Yandex funkcijas, izvēlieties cilni ZIP-arhīvs, nospiediet pogu Izvēlēties failu, un augšupielādējiet mūsu arhīvu smart.zip. Beigās, augšējā labajā stūrī nospiediet pogu Izveidot versiju.

Pēc dažām sekundēm, kad funkcija tiks atjaunināta, pārbaudīsim mūsu robotu vēlreiz. Tagad tas jau neliekas kā "spogulis", bet sniedz gudras domas!

Uz šo brīdi viss. Citas raksti sekos. Kam līdzīgs ir interesants — pierakstieties jaunumu paziņojumiem. Pierakstīties var šeit, vai uz Telegram-kanālu , vai Twitter .
Saites
Ziedojumi
Avots: habr.com
