Motivációs Facebook Messenger Bot létrehozása a Node.js használatával

Ma reggel egy kis mellékprojekten dolgoztam, szórakozásból: Messenger bot, amely rendszeresen motivációs üzeneteket küldhet barátaimnak.

Alapvető Messenger bot létrehozása egyszerű. Számos alapvető oktatóprogram található online, valamint néhány fejlett is, amelyek az NLP-t használják a bot intelligensebbé tételéhez. Célomra csak egy egyszerű botra volt szükségem, amely néhány egyszerű feladatot képes elvégezni.

Ez a cikk oktatóként szolgálhat azok számára, akik el akarják kezdeni az első Messenger robot létrehozását.

Az ötlet

Olyan botot akartam, amely naponta motivációs ajánlatot küldhet a barátaimnak. Technikai szempontból ez azt jelentette, hogy a bot csatlakozni fog egy külső API-hoz, lekérdez egy ajánlatot, és egy adott napszakban elküldi azt egy embercsoportnak.

Amit használtam

  • Node.js a webhookhoz. Használhat más környezetet is, ha szeretné. Személy szerint azt találom, hogy a Node.js beállítást villámgyorsan elvégzi egy ilyen apró projekthez, mint ez.
  • Heroku azért, mert telepítette az alkalmazásomat a felhőn. Ismét vannak más lehetőségek is, de úgy gondolom, hogy a Heroku a legegyszerűbb a kis projektekhez.
  • Saját személyes idézetek API. Ez egy nagyon alapvető API, amelyet évekkel ezelőtt hoztam létre. Ez lehetővé teszi számomra, hogy árajánlatokat szerezzek az adatbázisból vagy az adatbázisból. Van egy élő kezdőlapja is, amely véletlenszerű árajánlatokat szerez és megjelenít.
  • mLab egy MongoDB példány telepítéséhez, hogy nyomon tudja követni azokat a felhasználói információkat, amelyekre a botomnak szüksége volt az üzenetek küldéséhez.

Elkezdeni

Ez az útmutató feltételezi, hogy a Node.js és a Heroku eszközöv telepítve van a rendszerén. Áttekintem e két dolog részleteit, mert feltételezem, hogy az olvasó korábban rendelkezett Node és Heroku tapasztalatokkal.

Az első dolog, amit meg kell tennünk, a csomópont-környezet beállítása. Keresse meg a mappát, ahová el kívánja indítani a projektet, és hajtson végre egy gyors npm init parancsot az alapok beállításához.

Telepítenie kell az Express, a Test elemzőt és a Request alkalmazást, mert egy kicsit felhasználjuk őket. npm telepítés expressz test-elemző kérés - mentés

Annak érdekében, hogy a dolgok gördüljenek, azt szeretnénk, ha az index.js fájlunk így néz ki:

„szigorúan használja”; const express = igényel ('express'); const bodyParser = igényelni ('body-parser'); const request = igényelni ('kérés'); const app = express (); app.set ('port', (process.env.PORT || 8000)); app.use (bodyParser.urlencoded ({kiterjesztett: hamis})); app.use (bodyParser.json ()); // Otthon app.get ('/', funkció (req, res) {res.send ('Hello world!');});
// Indítsa el az app.listen szervert (app.get ('port'), function () {console.log ('porton fut, app.get (' port '));}));

Ennek otthonnak kellene éreznie magát, aki már korábban együtt dolgozott a Node és az Express szolgáltatással.

Most a móka kedvéért. Amikor az alkalmazás fut Heroku-ban (nagyon hamarosan), akkor ellenőriznünk kell azt a Facebook számára. Amikor beállítjuk botunkat, a Facebook felkéri bennünket, hogy adjunk meg egy visszahívási URL-t. Arra is felkér bennünket, hogy adjunk meg egy ellenőrző tokent, amelyet az URL-hez küldünk.

Ez azt jelenti, hogy be kell állítanunk egy útvonalat, amelyet a visszahívási URL-nek fogunk megadni. Az index.js fájlban a következőkre lesz szükség:

app.get ('/ mybot', függvény (req, res) {if (req.query ['hub.verify_token'] === 'THIS_IS_MY_VERIFICATION_TOKEN') {res.send (req.query ['hub.challenge'] );} res.send ('Rossz token!');});

Ne felejtse el a fent megadott tokent!

Tegyük fel gyorsan ezt a csinos kis dolgot a felhőben, mielőtt továbbmennénk. Mivel Heroku-t használunk, szükségünk lesz egy Procfile-ra a könyvtárunkban, csak web: node index.js-vel.

Ezután szeretnénk létrehozni ezt a projektet Heroku-ban, és továbbvinni azt, ami eddig volt. A terminálon a következőket kell tennie:

> git init> heroku létrehozás> git add. > git activ -m 'basic setup'> git push heroku master

Ez mind Heroku számára (egyelőre). Megtaláljuk az alkalmazást a Heroku-n, és itt az ideje, hogy a Facebook kommunikáljon vele.

A Facebook alkalmazás beállítása

A lépés elvégzéséhez létre kell hoznia egy Facebook oldalt. Itt létrehozhat egy új Facebook oldalt.

Keresse fel a https://developers.facebook.com/apps webhelyet, és hozzon létre egy új alkalmazást.

Ha ez megtörtént, kattintson a Messenger-kártya mellett található Beállításra.

A következő oldalon fontos a Webhooks szakasz. Kattintson a gombra egy új Webhook beállításához, és a következők fogadják Önt:

Az utolsó lépés: Szerezze be az alkalmazás hozzáférési jogkivonatát. A Webhooks szakasz felett található. Megjegyzés: Az oldalhoz hozzáférési jogkivonat különbözik az ellenőrző tokentől. Biztosítsa az oldal hozzáférési jogkivonatának biztonságát; később szükség lesz rá.

Végül térjen vissza a terminálra, és írja be:

curl -X POST "https://graph.facebook.com/v2.6/me/subsched_apps?access_token= "

Ez arra készteti a Facebook alkalmazást üzenetek küldésére.

Egyszerű visszhang

Annak ellenőrzéséhez, hogy a dolgok működnek-e, botjainknak üzeneteket kell fogadniuk, és visszhangjuk őket.

A POST útvonalat hozzá kell adnunk a Node alkalmazásunkhoz.

const token = " „
app.post ('/ webhook /', function (req, res) {var messaging_events = req.body.entry [0] .messaging; for (var i = 0; i 
sendTextMessage funkció (feladó, szöveg) {var messageData = {text: text}; kérés ({url: 'https://graph.facebook.com/v2.6/me/messages', kérdések: {hozzáférési_token: token}, módszer: 'POST', json: {címzett: {id: feladó}, üzenet: messageData,}}, funkció (hiba, válasz, test) {if (hiba) {console.log ('Error:', error);} egyébként, ha (response.body.error) {console.log ('Error : ', response.body.error);}}); }

A logika itt egyszerű: ha üzenet érkezik, visszhangozza azt egy „!” Betűvel.

Lássuk, működik-e ez. Ennek teszteléséhez nyissa meg az alkalmazás oldalát a Facebookon, és tesztelje a „Üzenet küldése” gombot (Megjegyzés: ha nem látszik gombot, akkor beállítania kell az oldalához).

Működik!

Szóval, mit tanultak eddig?

  1. Amikor üzenet érkezik, a csomópont alkalmazás POST kérést kap az üzenet eseményekkel, amelyek többek között tartalmazzák az üzenet szövegét és a feladó azonosítóját (amit egy egyszerű konzolnaplóval ellenőrizhetnénk).
  2. Ahhoz, hogy valamit vissza lehessen küldeni, POST-kérelmet kell benyújtanunk egy bizonyos URL-re olyan paraméterekkel, mint például a hozzáférési jogkivonat, a címzett azonosítója és az üzenet szövege.

Ez jó információ a következő lépéshez.

A felhasználók nyomon követése

Jó jel az, hogy a kérésben megkapjuk a címzettek azonosítóit. Ha olyan botot akarok létrehozni, amely naponta üzenetet küld több felhasználónak, nyomon kell követnünk ezeket az azonosítókat.

Az mLab segítségével követtem nyomon a fogadó azonosítókat. Használhatja kedvenc adatbázis-tárhely szolgáltatását, ha szeretné. Nem akarok mélyedni ennek részleteire, de ide küldöm a kódomat referenciaként.

const mongo = igényelni ('mongodb'). MongoClient;
addUserToDB függvény (feladó) {
var mLabUri = "mongodb: //" + process.env.userId + ":" + process.env.userPass + "@ ds157641.mlab.com: 57641 / motivate-bot";
mongo.connect (mLabUri, function (hibás, kliens) {if (err) {dob err; res.end (err);} else {var db = client.db ("motivál-bot"); db.collection (" címzettek "). findOne ({" küldő ": küldő}, funkció (hibás, eredmény) {if (eredmény === null) {// A felhasználót nem találja; most hozzáadja var data = {" küldő ": küldő}; db .collection ("címzettek"). insertOne (adatok, funkció (hiba, res) {if (err) {console.log (err);} if (res) {console.log (res);} client.close () ;});} else {// Talált felhasználó client.close ();}});}}); }

Ez a funkció ellenőrzi az adatbázist, hogy lássa, látta-e már a feladót korábban. Ha nem, akkor hozzáadja.

Nem akarjuk, hogy ezt a funkciót minden alkalommal meghívják, amikor a felhasználó üzenetet küld nekünk. Lehet, hogy emlékezzünk a felhasználóra, amikor valami hasonló van a „Start” -hoz.

Módosítsuk egy kicsit a POST funkciót,

app.post ('/ webhook /', function (req, res) {var messaging_events = req.body.entry [0] .messaging; for (var i = 0; i 

Ha megértette ezt a logikát, akkor könnyen megértheti, hogy a felhasználókat is törölhetjük, ha kérik. Végső funkciónknak így kell kinéznie:

app.post ('/ webhook /', function (req, res) {var messaging_events = req.body.entry [0] .messaging; for (var i = 0; i 

Idézetek beszerzése

Megemlítettem, hogy személyes Quotes API-t fogom használni. Véletlenszerű árajánlatot szerezni ezen az API-n keresztül egyszerű - csak GET kérést kell benyújtania. Ezt megtettem a Node kérési modul segítségével.

függvény getQuote (visszahívás) {kérés ({url: "https://getquote.herokuapp.com/getmotivational", módszer: "GET"}, funkció (hiba, válasz, test) {if (hiba) {console.log ( "Hiba:", hiba);} egyébként, ha (response.body.error) {console.log ("Error:", response.body.error);}
     var parsedBody = JSON.parse (test);
var quote = "\" "+ parsedBody.data.text +" \ "-" + parsedBody.data.author; visszahívás (idézet); }); }

Használhatja a többi API-t is, ha úgy dönt. Tetszik az enyém, mert szeretem az adatbázisban található idézetek.

Üzenetküldés Periodikusan

Van egy szerver, van címzettek gyűjteménye, módunk van árajánlatokat szerezni. Csak annyit kell tennie, hogy botunk naponta egyszer árajánlatot küldjön az összes feliratkozó címzettnek.

Egy egyszerű megoldás a JavaScript setInterval használata

Mielőtt még valami ilyesmit megteszünk, van egy probléma. A Facebook Messenger Platformjának 24 órás üzenetküldő ablaka van. Ez azt jelenti, hogy botunk üzenetet küldhet egy felhasználónak legfeljebb 24 órával az üzenetüket követően. Ezt követően a felhasználónak új üzenetet kell küldenie botunknak, hogy üzenetet kapjon. Nem ezt akarjuk.

Ennek átéléséhez be kell állítanunk az előfizetési üzeneteket. Követnie kell a Facebook utasításait, és kérést kell küldenie az előfizetési üzenetküldés engedélyezéséhez. Vegye figyelembe, hogy a jóváhagyás eltartása akár 5 munkanapot is igénybe vehet.

Feltételezve, hogy előfizetési üzenetküldés van beállítva, üzeneteket küldhet a felhasználóknak a 24 órás ablakon túl, NON_PROMOTIONAL_SUBSCRIPTION üzenetcímke hozzáadásával.

Ez azt jelenti, hogy a sendTextMessage funkciónak most így kell kinéznie:

sendTextMessage funkció (feladó, szöveg) {var messageData = {text: text}; kérés ({url: "https://graph.facebook.com/v2.6/me/messages", kérdések: {hozzáférési_token: token}, módszer: "POST", json: {címzett: {id: küldő}, üzenet: messageData, címke: "NON_PROMOTIONAL_SUBSCRIPTION"}}, funkció (hiba, válasz, test) {if (hiba) {console.log ("Error:", hiba);} máshol, ha (response.body.error) {konzol .log ("Hiba:", response.body.error);}}); }

Az egyetlen különbség a JSON hasznos teher tagje.

Eddig itt van, amit tettünk:

  • Létrehozta és telepítette a Node alkalmazást
  • Készített egy egyszerű botot, amely válaszokat küldhet
  • Létrehozott egy olyan funkciót, amely véletlenszerű motivációs idézetet kérhet
  • Csatlakoztatva van egy adatbázishoz, hogy nyomon követhesse a feliratkozott felhasználókat

A következőt fogjuk tenni:

  • Küldjön motivációs ajánlatot minden feliratkozott felhasználó számára
  • Használja a setInterval rendszert idézőjelek küldésére

Mindkettő egyszerű: Először csak átnézünk az előfizető felhasználók listáját, és mindegyiküknek árajánlatot küldünk. Ezután implementáljuk a setInterval-t

sendDailyMessage () függvény {getQuote (function (quote) {
var mLabUri = "mongodb: //" + process.env.userId + ":" + process.env.userPass + "@ ds157641.mlab.com: 57641 / motivate-bot";
mongo.connect (mLabUri, function (hibás, kliens) {if (err) {dob err; res.end (err);} else {var db = client.db ("motivál-bot"); db.collection (" címzettek "). find (). toArray (függvény (err, docs) {for (var i = 0; i 
setInterval (sendDailyMessage, 60000); // 1 perc teszteléshez

És… voila.

Botunknak minden percben új motivációs ajánlatot kell küldenie minden felhasználónknak. Természetesen ezt 24 órára szeretnénk változtatni (86400000 milliszekundum), ha biztosak vagyunk benne, hogy működik (teszteltem az enyém, működött).

Ez az oktatóprogram csupán egy egyszerű bevezetés volt. A Messenger robotok sokkal többet tehetnek, nem csak üzenetek küldését. Lehet, hogy a jövőben többet fogok játszani velük, és újabb oktatóanyagot fogok írni. Időközben megkérdezem a barátaimat, hogy iratkozzanak fel a botomra.

- -

Megjegyzés a Heroku-ról: Ha szabadon dolgozik, akkor a szerver egy idő után aludni fog, ha erre nincs kérés. Mivel azt akarjuk, hogy botunk ébren maradjon, meg kell kerülnünk ezt a korlátozást. Ennek sokféle módja van, de a legegyszerűbb (véleményem szerint) az, hogy időnként ping-e meg saját URL-jét.

const http = igényel ("http"); setInterval (function () {http.get ("http://yours.herokuapp.com");}, 300000); // 5 perc