Özgür Özer

Junior full stack developer

Messenger Botu Yapımı

Geçtiğimiz salı günü f8 konferansında Messenger Platform isimli sohbet botu platformunu duyuran ve yayına alan Facebook, bot çağını başlatmış oldu. Bizde bugün basit anlamda bir botun nasıl mesaj alıp göndereceğini öğreneceğiz.

İhtiyacımız olan şeyler şu şekilde;

  1. SSL destekli bir domain.
  2. SSH erişimine sahip olduğumuz bir sunucu.
  3. NodeJS ve gerekli paketler (Express, Request, Body-Parser).

İşe bir Facebook uygulaması ve sayfası oluşturarak başlayacağız. Ama halihazırda bir uygulamamız ve sayfası varsa bu adımı atlayabiliriz.

Buradan hızlı bir şekilde uygulamamızı,

Şuradan da aynı şekilde sayfamızı oluşturuyoruz.

Şuradaki All Apps sayfasından uygulamamızın dashboard’una, oradan da Messenger ayarlarına giriyoruz.

Token Generation altından sayfamızı seçip, oluşan Page Access Token‘ı kopyalıyoruz.

Kopyaladığımız token’ı aşağıdaki komutun sonuna ekleyip terminalde çalıştırıyoruz.

curl -X POST "https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=<PAGE_ACCESS_TOKEN>"

Sonuç {“success”:true} ise uygulamamızı sayfamıza bağlamış oluyoruz.

Aşağıdan alabileceğimiz örnek kodlar içerisinden; token değişkenine yukarıdan aldığımız token’ı, verifyToken değişkenine de (sadece doğrulama amaçlı kullanılacak) herhangi bir şeyler yazıyoruz. Https sunucu oluşturma bölümünde görebileceğimiz üzere SSL sertifika dosyalarına ihtiyacımız var. Bu dosyaları SSL’i satın aldığımız siteden temin edebilir veya eğer sistemimizde cPanel vb. bir uygulama kuruluysa oradan da hızlı bir şekilde indirebiliriz. SSL için gerekli dosyalar da şu şekilde; ca (Certificate Authority Bundle), key (Private Key), cert (Certificate).

Dosyalarımızı aşağıdaki ağaç yapısında sunucuya yolluyoruz.

─ bot.js
─ ssl
    └─ ssl.ca
    └─ ssl.key
    └─ ssl.crt

bot.js

/*Gerekli değişkenlerimizi tanımlıyoruz*/
var fs = require("fs"),
	https = require("https"),
	express = require("express"),
	request = require("request"),
	bodyParser = require("body-parser"),
	app = express(),
	jsonParser = bodyParser.json(),
	token = "<PAGE_ACCESS_TOKEN>",
	verifyToken = "<VERIFY_TOKEN>";

/*Https sunucumuzu oluşturuyoruz*/
https.createServer({
	ca: fs.readFileSync("ssl/ssl.ca"),
	key: fs.readFileSync("ssl/ssl.key"),
	cert: fs.readFileSync("ssl/ssl.crt")
}, app).listen(3003);

/*Facebook'un doğrulama yapması için gereken kodlar*/
app.get("/webhook/", function(req, res) {
	if (req.query["hub.verify_token"] === verifyToken) {
		res.send(req.query["hub.challenge"]);
	} else {
		res.send("Error, wrong validation token");
	}
});

/*Messenger'dan botumuza mesaj geldiğinde çalışacak bölüm*/
app.post("/webhook/", jsonParser, function(req, res) {
	messaging_events = req.body.entry[0].messaging;
	for (i = 0; i < messaging_events.length; i++) {
		event = req.body.entry[0].messaging[i];
		sender = event.sender.id;
		if (event.message && event.message.text) {
			text = event.message.text;
			sendTextMessage(sender, "Alınan mesaj: " + text);
		}
	}
	res.sendStatus(200);
});

/*Botumuzdan Messenger'a mesaj gönderme fonksiyonu*/
function sendTextMessage(sender, text) {
	messageData = {
		text: text
	};
	request({
		url: "https://graph.facebook.com/v2.6/me/messages",
		qs: { access_token: token },
		method: "POST",
		json: {
			recipient: { id: sender },
			message: messageData,
		}
	}, function(error, response, body) {
		if (error) {
			console.log("Error sending message: ", error);
		} else if (response.body.error) {
			console.log("Error: ", response.body.error);
		}
	});
}

Terminalden js dosyamızın bulunduğu dizine gelip node bot.js komutunu çalıştırarak https sunucumuzu ve gelen istekleri dinlemeye başlıyoruz.

Son olarak Messenger sayfasının Webhooks bölümünden Setup Webhooks‘a basıp, açılan modal içerisine aşağıdaki gibi botumuzun çalıştığı adresi, kodlarımızda belirttiğimiz verifyToken değerini ve Subscription Fields bölümündeki checkbox’ları seçip Verify and Save butonuna basıyoruz.

Artık botumuzla konuşabiliriz :)

Botumuzun kullanıcılarla etkileşimini artırabilmek için düz metin dışında resim gönderebilir veya Facebook’un hazırlamış olduğu yapılandırılmış mesajları (structured messages) kullanabiliriz.

Bunun için sendTextMessage fonksiyonumuzda ufak bir değişiklik yapmamız gerekiyor. Fonksiyonun ikinci parametresi olan text‘i messageData olarak değiştiriyor ve içerideki messageData değişkenini kaldırıyoruz.

function sendTextMessage(sender, messageData) {
	request({
		//burası olduğu gibi kalıyor
	});
}

Kullanıcı resim yazdığında ona rastgele bir resim göndermek istiyoruz diyelim. Bunun için botumuzun mesajları aldığı bölümü aşağıdaki gibi değiştiriyoruz.

if (event.message && event.message.text) {
	text = event.message.text;
	if (text == "resim") {
		messageData = {
			"attachment": {
				"type": "image",
				"payload": {
					"url": "https://unsplash.it/320/180/?random"
				}
			}
		};
	} else {
		messageData = { text: "Alınan mesaj: " + text };
	}
	sendTextMessage(sender, messageData);
}

Ya da bir soru cevap oyunu yaptığımızı düşünelim. Kullanıcıdan aksiyon alıp geri cevap vermek istediğimizde ise buton şablonunu kullanabiliriz. Burada messageData içeriğinin değiştiğini ve gelen payload’u dinleyebilmek için de if (event.postback) şeklinde yeni bir bölümün eklendiğine dikkat edelim.

if (event.message && event.message.text) {
	text = event.message.text;
	if (text == "soru") {
		messageData = {
			"attachment": {
				"type": "template",
				"payload": {
					"template_type": "button",
					"text": "Apple Inc. kaç yılında kurulmuştur?",
					"buttons": [{
						"type": "postback",
						"title": "A: 1976",
						"payload": "aSikki"
					}, {
						"type": "postback",
						"title": "B: 1977",
						"payload": "bSikki"
					}]
				}
			}
		};
	} else {
		messageData = { text: "Alınan mesaj: " + text };
	}
}
if (event.postback) {
	text = event.postback.payload;
	if (text == "aSikki") {
		messageData = { text: "Doğru cevap verdiniz." };
	} else if (text == "bSikki") {
		messageData = { text: "Yanlış cevap verdiniz." };
	}
}
sendTextMessage(sender, messageData);

Bunlar dışında bir kaç farklı şablon daha var. Onlara da şuradaki dokümantasyon sayfasından ulaşabiliriz.

Botumuz şu an çalışıyor fakat bizden başkasına cevap veremiyor. Herkese açık olabilmesi için yapılması gereken bazı şeyler var. Messenger sayfasının App Review for Messenger bölümündeki Request Permissions butonuna tıklıyoruz ve açılan modal içerisinden pages_messaging checkbox’ını işaretliyoruz ve Add 1 Item butonuna basıyoruz.

Add 1 Item butonundan sonra App Review sayfasına yönlendiriliyoruz. Current Submission bölümünde tamamlamamız gereken; uygulama ikonu, gizlilik politikası gibi bazı adımlar olduğunu fark ediyoruz.

Eksik adımları hallettikten sonra aktifleşen Submit for Review butonuna basıyoruz ve botumuzu onaylanması için Facebook’a gönderiyoruz.

Şu an Messenger Platform beta aşamasında olduğu için botumuzu direkt herkese açık bir şekilde yayınlayamıyoruz. Review’dan sonuç gelmesini beklememiz gerekiyor. Tabi cevap gelmesi bir kaç hafta sürebilir. Ama botumuzu denetmek istediğimiz kişileri Roles sayfasından developer olarak ekleyip davet gönderebiliriz.

Şimdilik anlatacaklarım bunlar. Daha fazla bilgi için dokümantasyon sayfasına bakmayı unutmayın..