Slack bot user written in PHP

0.0.3 2016-12-05 21:00 UTC


A simple bot user written in PHP using the Slack Real Time Messaging API


With Composer

Create a new composer.json file and add the following

    "minimum-stability" : "dev",
    "require": {
        "jclg/php-slack-bot": "dev-master"

Then run

composer install


Create a php file called bot.php with the following content

require 'vendor/autoload.php';
use PhpSlackBot\Bot;

// Custom command
class MyCommand extends \PhpSlackBot\Command\BaseCommand {

    protected function configure() {

    protected function execute($message, $context) {
        $this->send($this->getCurrentChannel(), null, 'Hello !');


$bot = new Bot();
$bot->setToken('TOKEN'); // Get your token here
$bot->loadCommand(new MyCommand());
$bot->loadInternalCommands(); // This loads example commands

Then run php bot.php from the command line (terminal).

Example commands

Example commands are located in src/PhpSlackBot/Command/ and can be loaded with $bot->loadInternalCommands();

Ping Pong Command

Type ping in a channel and the bot should answer "Pong" to you.

Count Command

Type count several times in a channel and the bot should answer with 1 then 2...

Date Command

Type date in a channel and the current date.

Planning Poker Command

Type pokerp start in a public channel with your team in order to start a planning poker session.

Direct message the bot with pokerp vote number. The bot will record your vote.

Type pokerp status to see the current status of the session (who has voted).

Type pokerp end in a public channel and the bot will output each vote.

Load your own commands

You can load your own commands by implementing the \PhpSlackBot\Command\BaseCommand.

Then call PhpSlackBot\Bot::loadCommand method for each command you have to load.

"Catch All" command

If you need to execute a command when an event occurs, you can set up a "catch all" command.

This special command will be triggered on all events.

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
$bot->loadCatchAllCommand(new SuperCommand());

Incoming webhooks

The bot can also listen for incoming webhooks.

Commands are triggered from users messages inside Slack and webhooks are triggered from web post requests.

Custom webhooks can be loaded using the PhpSlackBot\Bot::loadWebhook method.

This is useful if you need to control the bot from an external service. For example, with IFTTT

To enable webhooks, use the enableWebserver method before the run method.

You can also set a secret token to prevent unauthorized requests.

$bot->loadInternalWebhooks(); // Load the internal "output" webhook
$bot->enableWebserver(8080, 'secret'); // This will listen on port 8080

Altered in this fork:

Use the parameter "webhook" to trigger the corresponding webhook. In the example case above, the "webhook" value is "output".

The input format can be either JSON or a POST with a json encoded payload, as described here in The webserver differentiates between the two using the Content-Type header.


curl -X POST -H 'Content-Type: application/json; charset=utf8' --data '{"webhook":
 "output", "type" : "message", "text": "This is a message", "channel": "#general"}' http://localhost:8080

POST Fields (json encoded payload):

curl -X POST --data-urlencode 'webhook=output' --data-urlencode 'payload={"type" : "message", "text": "This is a message", "channel": "#general"}' http://localhost:8080

Also, the response from a webhook is now json encoded. The return value from your custom webhook's execute() method will be inside the "data" property of a successful request. Otherwise, an "error" property will be populated.