Ayo! Menulis Kode
setelah nyobain Ngrok dan Membuat Projek Nodenya, selanjutanya adalah, buatlah source bernama apps.js (sesuai dengan entry point saat temen-temen inisialisasi node tadi ).
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
import module yang telah kita install di step sebelumnya.
/*
Const Data Facebook Detail Apps
*/
const APP_SECRET = "APP_SECRET_ANDA";
const VALID_TOKEN = "VALID TOKEN ANDA";
const SERVER_URL = "https://APAPUNYAMU.ngrok.io";
const ACCESS_TOKEN = "PAGE ACCESS TOKEN";
const server = app.listen(process.env.PORT || 5000, () => {
console.log('Express server listening on port %d in %s mode', server.address().port, app.settings.env);
})
dibawahnya kita mencoba tambahkan kode untuk mengetest apakah projek kita sudah jalan atau belum
/* Hello Data */
app.get('/', (req, res) => {
console.log('Server Ok!');
res.sendStatus(200);
});
dan jalankan perintah tersebut , sebagia berikut :)
$ node apps.js
kemudian, akses SERVER URLnya.artinya server webhook insyaallah sudah siap digunakan.
selanjutnya buat HTTP Verb ( GET ) untuk webhook untuk dipasang sebagai access token di facebook
app.get('/webhook', (req, res) => {
if (req.query['hub.mode'] && req.query['hub.verify_token'] === VALID_TOKEN) {
res.status(200).send(req.query['hub.challenge']);
} else {
res.status(403).end();
}
});
end-point diatas adalah untuk facebook mengecek webhook service kita sudah sesuai/siap digunakan atau belum
Webhook POST
/* Handling Pesan */
app.post('/webhook', (req, res) => {
//console.log(req.body);
if (req.body.object === 'page') {
req.body.entry.forEach((entry) => {
entry.messaging.forEach((event) => {
if (event.message && event.message.text) {
//sendMessage(event);
console.log(event);
}
});
});
res.status(200).end();
}
});
untuk mengecek apakah saat seorang user mengirimkan pesan, akan diterima oleh webhook.
untuk membuat response nya, kita akan membuat fungsi sendMessage(event). pertama import dulu nih module menjalankan request.
npm install request --save
dan tambahkan kode dibawah ini, di baris deklarasi konstanta:
const request = require('request');
lanjut, buatlah fungsi sendMessage , kira-kira kodenya seperti dibawah:
function sendMessage(event) {
let sender = event.sender.id;
let text = event.message.text;
/* Test Data */
console.log("Dikirim ke %s ", sender);
request({
url: 'https://graph.facebook.com/v2.6/me/messages',
qs: {access_token: ACCESS_TOKEN},
method: 'POST',
json: {
recipient: {id: sender},
message: {text: text}
}
}, function (error, response) {
if (error) {
console.log('Error sending message: ', error);
} else if (response.body.error) {
console.log('Error: ', response.body.error);
}
});
}
fungsi diatas akan mereply pesan sesuai dengan pesan yang di tuliskan oleh sender.
untuk nyobain end-point graph lainnya dari facebook, bisa jadi referensi disini
https://developers.facebook.com/tools/explorer
Setup API.ai
yah! kali ini penjelasannya menggunakan api.ai, next time saya tulis versi wit.ai :v :v :v (yang paham pasti ngakak)
https://console.api.ai
register dan buatlah agent baru, isi saja nama agentnya ( yang lain biarkan default )
setelah itu, buat/aktifkan SmartTalk untuk kasus ~~salah beli ~~chatBot yang tidak kaku, bisa juga ditest untuk responsenya seperti apa ? (belum support indonesian)
setelah itu, install module API AI untuk NodeJs
npm install apiai
referensinya ada disini
https://www.npmjs.com/package/apiai
import module API AInya kedalam apps.js
const API_TOKEN = "39e70b551e0140d5bd9debf1b022e2b0";
const aiApp = require('apiai')(API_TOKEN);
setelah itu, kita akan coba rombak function sendMessage menjadi seperti ini
function sendMessage(event) {
let sender = event.sender.id;
let text = event.message.text;
let apiai = aiApp.textRequest(text, {
sessionId: 'anakjalananbro'
});
apiai.on('response', (response) => {
// Response ke Facebook messenger
});
apiai.on('error', (error) => {
console.log(error);
});
apiai.end();
}
pada bagian komentar // Response ke facebook messenger kita akan mengambil response dari API.ai tersebut, dengan skema Response ( JSON ) seperti gambar diatas.
let aiText = response.result.fulfillment.speech;
tambahkan di respnse apiai.on response dengan kode ini
let aiText = response.result.fulfillment.speech;
console.log("response ai %s ", aiText);
request({
url: 'https://graph.facebook.com/v2.6/me/messages',
qs: {access_token: ACCESS_TOKEN},
method: 'POST',
json: {
recipient: {id: sender},
message: {text: aiText}
}
}, (error, response) => {
if (error) {
console.log('Error sending message: ', error);
} else if (response.body.error) {
console.log('Error: ', response.body.error);
}
});
kemudian jalan kan lagi appsnya, dan coba chat dengan pages yang telah dibuat menggunakan bahasa inggris
nah, sekarang chatbotnya sudah manusiawi.
next challenge, menambahkan 3rd party wheater di chatbot.
Setting Intent AI
buka dan buatlah intent didashboard api.ai
kita contohkan, pada user says : how is the weather today in jakarta? sebagai parameter adalah jakarta, nah blok jakarta dan cari geoCity .
intent digunakan untuk mencari maksud dari user ( apa yang ingin dilakukan ) action digunakan untuk mengambil geo-city) dan response adalah ketika tidak ada nama kota yang di maksudkan.
setelah itu, save Intent yang telah dibuat. lanjutnya, buat Webhook untuk 3rd API nya.
buka Fulfillment dan buat Webhook yang akan kita buat dengan end-point http://url.ngrok.io/ai
jangan lupa untuk register di OpenWeatherMap, contoh Responsenya seperti dibawah ini.
{
"coord": {
"lon": 106.85,
"lat": -6.21
},
"weather": [{
"id": 802,
"main": "Clouds",
"description": "scattered clouds",
"icon": "03d"
}],
"base": "stations",
"main": {
"temp": 303.15,
"pressure": 1009,
"humidity": 74,
"temp_min": 303.15,
"temp_max": 303.15
},
"visibility": 9000,
"wind": {
"speed": 5.1,
"deg": 50
},
"clouds": {
"all": 40
},
"dt": 1506679200,
"sys": {
"type": 1,
"id": 8043,
"message": 0.0271,
"country": "ID",
"sunrise": 1506638306,
"sunset": 1506682037
},
"id": 1642911,
"name": "Jakarta",
"cod": 200
}
setelah itu, tambahkan end-point untuk AI nya,
const WEATHER_API_KEY = "WEATHERKEY";
app.post('/ai', (req, res) => {
if (req.body.result.action === 'weather') {
let city = req.body.result.parameters['geo-city'];
console.log(city);
let restUrl = 'http://api.openweathermap.org/data/2.5/weather?APPID='+WEATHER_API_KEY+'&q='+city;
request.get(restUrl, (err, response, body) => {
if (!err && response.statusCode == 200) {
let json = JSON.parse(body);
let msg = json.weather[0].description + ' and the temperature is ' + json.main.temp + ' ℉';
return res.json({
speech: msg,
displayText: msg,
source: 'weather'});
} else {
return res.status(400).json({
status: {
code: 400,
errorType: 'I failed to look up the city name.'}});
}
});
}
});
dan Hasil akhirnya adalah