Hey ho,, mono in da haus
Son birkaç aydır botlarla haşır neşirlik sonucu kendime bir bot özeti, how-to'su çıkarmak ve bu özeti paylaşmak niyetiyle sayfama uğramış bulunmaktayım :)
(Burada bir karikatür vardı ama telif yerim diye kaldırdım. Herkese dava açıyorlarmış karikatür paylaşılıyor diye. Karikatürün doğasına hiç uymuyor bence bu tavır :-/ Bunun muhabbeti de hiç çekilmiyor. )
:D Konuya geçeyim..
Daha önce .net core'la yapmıştım ama şimdi node.js'le yaptım. Çünkü node.js de canmış. :)
Yine bir workplace botunu örnekleyeceğim.
Önce botumuzu barındıracak bir klasör oluşturup terminal'de bu klasöre giriyoruz.
npm init
komutunu çalıştırıp istenilen bilgileri mümkün olduğunca dolduruyoruz. Bu bilgiler project.json dosyamızı oluşturuyor.Sonrasında klasörümüzü Visual Studio Code gibi bir editörle açıp içine app.js dosyamızı ekliyoruz. Bu dosyada kodlamaya başlayabiliriz.
Ardından botbuilder paketimizi eklemek için yine terminal'de şu komutu çalıştırıyoruz;
npm install --save botbuilder
Bir dee şu paketi yükleyelim;
npm install --save restify
Şuan .net core'da yaptığımız papağan botundan yapmaya başlamak için hazırız :) Hadi yapalım.
Şöyle bir repo'muz var. Buradaki Node örnekleri gayet yeterli başlangıç için;
https://github.com/Microsoft/BotBuilderBuradaki hello-ChatConnector örneğini alalım;
var restify = require('restify');
var builder = require('botbuilder');
// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
console.log('%s listening to %s', server.name, server.url);
});
// Bot Storage: Here we
register the state storage for your bot.
// Default store:
volatile in-memory store - Only for prototyping!
// We provide adapters
for Azure Table, CosmosDb, SQL Azure, or you can implement your own!
// For samples and
documentation, see: https://github.com/Microsoft/BotBuilder-Azure
var inMemoryStorage = new builder.MemoryBotStorage();
// Create chat connector
for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
appId: process.env.MICROSOFT_APP_ID,
appPassword: process.env.MICROSOFT_APP_PASSWORD
});
// Listen for messages
from users
server.post('/api/messages', connector.listen());
// Create your bot with a
function to receive messages from the user
var bot = new builder.UniversalBot(connector, function (session) {
session.send("🐦 %s", session.message.text);}).set('storage', inMemoryStorage); // Register in memory
storage
Şuan aslında kod olarak hazırız. Ama bu kadarla bitmiyor. Şimdi bu botumuzu yayınlama vakti.
Öncelikle Workplace'e botumuzu Custom Integrations'dan ekleyelim.
Create Custom Integration butonuna tıklayıp botumuzun adını ve açıklamasını girelim.
Bot oluştuktan sonra bize vermiş olduğu App Id, App Secret ve özellikle tek sefer oluşturduktan sonra kaybetmemeniz gereken Access Token bilgilerinizi güvenli bir yere kaydedelim.
Sonrasında webhook'u ayarlamak için Azure'a uğramamız gerekecek evlerden ıraak :S :D
Adresimiz portal.azure.com
Buraya azure hesabımızla giriş yapalım.
Şöyle bir Dashboard gelecek önümüze;
Öncelikle Azure'dan bir "bot channel registration" oluşturalım.
Şimdi Bot Service oluşturma ekranımız gelecek. Buradaki messaging endpoint' çalışan bir endpoint vermemiz gerekiyor. O halde çözüm neydii? Tabii ki ngrok. :)
Şu komutu çalıştıralım;
ngrok http -region=eu -subdomain=zengindomaini 3978
Artık botumuz https://zengindomaini.eu.ngrok.io adresinde geçici olarak da olsa yayında.
Şöyle görelim vs code ekranımızı. Buradaki terminalde çalışmak da pratik oluyor;
Yeniden Azure'a dönebiliriz.
https://zengindomaini.eu.ngrok.io/api/messages
çünkü mesajları kodumuzdan da görebileceğimiz gibi şuradan dinliyoruz;
// Listen for messages from users
server.post('/api/messages', connector.listen());
Create butonuna bastıktan sonra bot servisimiz oluşmuş olmalı.
Hayırlı olsuun artık Azure'da da bir appid'miz ve appsecret'ımız var. Peki nerede? :D Ben şahsen çok zorlanmıştım bulmak için.. Ama bu sırrı sizinle de paylaşacağım.
Azure sol menüdeki Resource Groups'dan Deployments'a, oradan da ilgili deployment'a tıklayıp bilgilerini görebiliyorsunuz.
var connector = new builder.ChatConnector({
appId: process.env.MICROSOFT_APP_ID, //APPID
appPassword: process.env.MICROSOFT_APP_PASSWORD //APPSECRET
});
Eğer bu bilgileri environment olarak ayrı bir dosyadan okumak istiyorsanız
npm install --save dotenv
paketini yükleyip projenize .env uzantılı bir dosya oluşturup bu bilgileri buraya yazıp buradan okutabilirsiniz. Hatta 2 adet .env oluşturup live ve test key'lerini ayrı ayrı tutabilirsiniz.
Ben bunu vs code'un launch.json dosyasına aşağıdaki env ayarını nakşederek yaptım. İşte şöyle;
{
// Use IntelliSense to learn about possible
attributes.
// Hover to view descriptions of existing
attributes.
// For more information, visit:
https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch
Program",
"program": "${workspaceRoot}/src/app.js",
"cwd": "${workspaceRoot}/src",
"env" : {
"NODE_ENV": "dev"
}
}
]
}
Sonra da bunu şöyle kullandım;
if
("dev" === process.env.NODE_ENV) {
console.log("You are using development environments.");
require('dotenv').config({
path: 'settings_test.env'
});
} else {
console.log("You are using live environments.");
console.log("[If you want to use dev environments. Please set
environment variable 'export NODE_ENV=dev']")
require('dotenv').config({
path: process.env.BOT_ENV_FILE
});
}
Son işimiz ise webhook'u ayarlayıp workplace'deki bot integration'a bu webhook adresini eklemek. Eğer isterseniz bu işlemi de Azure üzerinden, Resource Groups -> MonoBot -> Channels üzerinden channel ekleyerek yapabilirsiniz. Bunun için Channel seçimi yaptıktan sonra sizden istenen bilgileri doldurup bu bilgilerin altındaki webhook ve key bilgilerini workplace'deki yerine yapıştırmak.
Şuandan itibaren botumuz bize papağanlık yapabilir.
Referans aldığım linkler;
Bot info;
https://docs.microsoft.com/tr-tr/bot-framework/nodejs/bot-builder-nodejs-quickstart
https://github.com/Microsoft/BotBuilder
Kullanılan komponentlerin platforma göre ön izlemesini yapabileceğimiz yer;
https://docs.botframework.com/en-us/channel-inspector/channels/Facebook?f=Carousel&e=example1
Yalnız ne uzun oldu bu yazı yaaa :S :S
(Burada bir karikatür vardı ama telif yerim diye kaldırdım. Herkese dava açıyorlarmış karikatür paylaşılıyor diye. Karikatürün doğasına hiç uymuyor bence bu tavır :-/ Pişman mısın? Pişmanım gideyim mi?)