PHP Slack Bot
A simple bot user written in PHP using the Slack Real Time Messaging API https://api.slack.com/rtm, (*1)
Installation
With Composer, (*2)
Create a new composer.json file and add the following, (*3)
{
"minimum-stability" : "dev",
"require": {
"valerijv/php-slack-bot-vpatch": "dev-master"
}
}
Then run, (*4)
composer install
Usage
require 'vendor/autoload.php';
use PhpSlackBot\Bot;
// Custom command
class MyCommand extends \PhpSlackBot\Command\BaseCommand {
protected function configure() {
$this->setName('mycommand');
}
protected function execute($message, $context) {
$this->send($this->getCurrentChannel(), null, 'Hello !');
}
}
$bot = new Bot();
$bot->setToken('TOKEN'); // Get your token here https://my.slack.com/services/new/bot
$bot->loadCommand(new MyCommand());
$bot->run();
Example commands
Example commands are located in src/PhpSlackBot/Command/, (*5)
Ping Pong Command
Type ping in a channel and the bot should answer "Pong" to you., (*6)
Count Command
Type count several times in a channel and the bot should answer with 1 then 2..., (*7)
Date Command
Type date in a channel and the current date., (*8)
Planning Poker Command
https://en.wikipedia.org/wiki/Planning_poker, (*9)
Type pokerp start in a public channel with your team in order to start a planning poker session., (*10)
Direct message the bot with pokerp vote number. The bot will record your vote., (*11)
Type pokerp status to see the current status of the session (who has voted)., (*12)
Type pokerp end in a public channel and the bot will output each vote., (*13)
Load your own commands
You can load your own commands by implementing the \PhpSlackBot\Command\BaseCommand., (*14)
Then call PhpSlackBot\Bot::loadCommand method for each command you have to load., (*15)
"Catch All" command
If you need to execute a command when an event occurs, you can set up a "catch all" command., (*16)
This special command will be triggered on all events and all other commands will be ignored., (*17)
require 'vendor/autoload.php';
use PhpSlackBot\Bot;
// This special command executes on all events
class SuperCommand extends \PhpSlackBot\Command\BaseCommand {
protected function configure() {
// We don't have to configure a command name in this case
}
protected function execute($data, $context) {
if ($data['type'] == 'message') {
$channel = $this->getChannelNameFromChannelId($data['channel']);
$username = $this->getUserNameFromUserId($data['user']);
echo $username.' from '.($channel ? $channel : 'DIRECT MESSAGE').' : '.$data['text'].PHP_EOL;
}
}
}
$bot = new Bot();
$bot->setToken('TOKEN'); // Get your token here https://my.slack.com/services/new/bot
$bot->loadCatchAllCommand(new SuperCommand());
$bot->run();
Incoming webhooks
The bot can also listen for incoming webhooks., (*18)
Commands are triggered from users messages inside Slack and webhooks are triggered from web post requests., (*19)
Custom webhooks can be loaded using the PhpSlackBot\Bot::loadWebhook method., (*20)
This is useful if you need to control the bot from an external service. For example, with IFTTT https://ifttt.com/maker, (*21)
To enable webhooks, use the enableWebserver method before the run method., (*22)
You can also set a secret token to prevent unauthorized requests., (*23)
$bot->enableWebserver(8080, 'secret'); // This will listen on port 8080
$bot->run();
Then, use the parameter "name" to trigger the corresponding webhook :, (*24)
curl -X POST --data-urlencode 'auth=secret' --data-urlencode 'name=output' --data-urlencode 'payload={"type" : "message", "text": "This is a message", "channel": "#general"}' http://localhost:8080