API dla bota Facebook Messenger

|
Robert
| komentarze | PHP

Tym razem wpis trochę z innej beczki, w klimatach PHP do którego czuję sentyment, a to dla tego, że od tego języka zazynałem swoją przygodę. Jakiś czas temu znajomi którzy grają w pewną grę chcieli być na bieżąco z aktualizcjami. Najprostrzym rozwiązaniem byłby bot dla Messengera. Tutaj sprawa się mocno komplikuje. Przekopałem się przez kilka już nieaktualnych bibliotek które chciałyby, lecz już niemogą, zintegrować mój kod z FB i radośnie reagować na wiadomości które wyślę. Te czasy są nieprzychylne takim pomysłom. Kiedyś było lepiej, napisało się bota w Pythonie dla IRC który niegdyś był popularny czy też kiedy ludzie korzystali z XMPP, ale świat idzie do przodu i Ty też powinieneś.

Sprawa wygląda smutno, bo pełen wachlarz funkcjonalności dostępny jest po uiszczeniu opłaty, to ominąłem ucząc znajomych jak zostać developerem na FB. :D Potem poszło z górki, na końcu wpisu umieszczę link do mojej biblioteki PHP. W teorii użycie jest bardzo proste i bardzo podobne do koncepcji wywołań, tak, jak to jest wykonane w Express Router. Zabawna (wg. mnie) ciekawostka: na to rozwiązanie wpadłem, zanim w ogóle poznałem Express.js, nie mówiąc już o Routerze. Rejestrujesz poprzez wyrażenia regularne funkcję która ma na to wyrażenie reagować, proste? Zobaczmy. Oto webhook:

//dołączamy bibliotekę z moim api (kontroler)
require_once('./libs/fb.php');
//dołączamy bibliotekę z funkcjami (model)
require_once('./libs/bot.php');

Następnie inicjujemy obiekt api. Przekazujemy do niego trzy wartości typu string, kolejno: identyfikator aplikacji, ustalony token weryfikacyjny aplikacji oraz Twój ID na Facebooku.

$fb = new \fb\fb(
	'APP ID FB',
	'TOKEN WERYFIKACYJNY',
	'NAJLEPIEJ TWÓJ NUMER UŻYTKOWNIKA NA FB, ADMIN ID'
);

Definiujemy sobie następnie wyzwalacze. Jak widzisz, rejestrujemy funkcje które mają reagować na konkretne wyrażenia regularne.

/*****	quickReply przy innym niż pomoc	*****/
$fb->trigger('/^(?!pomóż( mi)?|pomocy?|help( me)?)/i','bot::nothelp');

/*****			POWITANIE I POMOC	*****/
$fb->trigger('/^(hej|wita(j|m)|siema|elo|cześć|czesc)$/i','bot::hej');
$fb->trigger('/^(pomóż( mi)?|pomocy?|help( me)?)$/i','bot::pomoc');
$fb->trigger('/^(co tam|co (tam )?słychać|jak tam)\??$/i','bot::hejka');

/*****			DOMYŚLNE			*****/
$fb->trigger('/.*/','bot::default');

Kiedy już wszystkie wyzwalacze są zdefiniowane, uruchamay api:

$fb->run();

To już wszystko, jeśli chodzi o webhook bota. Dalej magia dzieje się w samej bibliotece. Przykładowa funkcja:

static function pomoc($fb)
{

	$fb->addQuickReply(['pomoc','subskrybcje','subskrybuj']);

	$fb->message('Działające polecenia:

		* pomoc
		* subskrybcje

		Więcej: pomoc [polecenie] lub [polecenie]');

	return true;
}

Jak widzisz, funkcja otrzymuje w argumencie obiekt API na którym dalej operuje. Tutaj dozwolone jest wszystko, co tylko chcesz, najważniejsze, aby metoda była statyczna, zawierała wywołanie metody "message" API. Metoda o nazwie addQuickReply służy do definiowania przycisków z szybką odpowiedzią które pojawią się pod wysłaną przez bota wiadomością. Jeśli funkcja zwróci wartość true wtedy pętla wywoływań API zostaje przerwane.

Jeszcze dla doprecyzowania, co się dzieje pod "maską" zamieszczam funkcję wywołującą wyzwalacze:

public function run()
{
	foreach($this->triggers as $regExp => $func)
	{
		if (preg_match($regExp,$this->message))
		{
			if ($func($this) === true)
				break;
		}
	}
}

Jak widać, wszystko dzieje się w pętli foreach które iteruje tablicę funkcji których kluczami są zdefinowane wyrażenia regularne. Gdy wyzwalacz zwraca prawdę, pętla jest przerywana i kod kończy działanie. Daje to taką możliwość, że wyzwalacz może sprawdzić słowa które zostały wpisane, jeśli dana operacja się nie powiedzie, przejść do kolejnego wyzwalacza. Tutaj przykład metody domyślnej, która wyzwalana jest zawsze, jeśli inny wyzwalacz nie zostanie dopasowany:

static function default($fb)
{
	if (empty($fb->message))
		return true;

	$fb->message('Nie znam tego polecenia: '.self::polecenie($fb->message).'

		Jeśli potrzebujesz listę poleceń, napisz: pomoc');

	return true;
}

Biblioteka wraz z przykładem znajduje się na GitHubie: https://github.com/maganiczny/fb_msg_bot_api