connorvg/php-slack

此软件包已被废弃且不再维护。作者建议使用 frlnc/php-slack 软件包。

Slack API 的 PHP 实现,包含 Laravel 绑定

1.2 2014-03-19 16:20 UTC

This package is not auto-updated.

Last update: 2016-08-30 15:02:30 UTC


README

PHP-Slack

一个为 Slack API 设计的 Eloquent ORM 风格的 PHP 实现,并提供 Laravel 绑定以帮助 Laravel 爱好者。

支持的 API 函数

  • users
    • list
  • channels
    • history
    • list
    • mark
  • files
    • list
  • im
    • history
    • list
  • groups
    • history
    • list
  • search
    • all
    • files
    • messages
  • chat
    • postMessage
  • auth
    • test

使用方法

如果您不使用 Laravel,则需要将 Slack API 令牌传递给 Slack 构造函数。

每个(非简单)API 调用都从一个 prepare 函数开始,这是您声明方法的地点。这样做:

Slack::prepare('COMMAND');

这将返回一个 SlackPayload 对象,稍后将用于属性分配并发送到 api.slack。

注意:如果您传递给 prepare 的命令格式不正确或不受支持,则返回值将为 NULL

一旦您有了 SlackPayload 对象,您就可以以非常自然的方式做任何事情。您只需设置变量(参考 Slack API,这因命令而异)然后发送。

要设置变量,操作非常简单。只需这样做:

payloadObject->set($key, $val);

您还可以这样做:

payloadObject->set(['key1' => 'value1', 'key2' => 'value2' /* etc */]);

要发送它,您只需这样做:

$response = payloadObject->send();

响应对象将包含一个与 Slack API JSON 响应等效的 PHP 数组。

您可能想要检查是否有错误,只需这样做:

$hasError = Slack::hasError($payloadObject);    // returns a bool

这允许您,如果您有信心一切都会正确无误,这样做:

$lastTenMessages = Slack::prepare('channels.history')->set(['channel' => 'CHANNEL_CODE', 'count' => 10])->send();

注意:SlackPayload 对象中的设置器和辅助函数总是返回其自身以允许链式调用

辅助函数

需要注意的是,有几个辅助方法,包括特殊用途和通用用途。

通用
  • $payloadObject->message

    接收:String 或 Array。

    这将自动将消息设置为附件或文本对象,具体取决于您发送的数据类型。Array -> Attachment,String -> Text。

  • $payloadObject->channel

    设置目标频道。

  • $payloadObject->username$payloadObject->from

    设置机器人的用户名。

  • $payloadObject->to

    接收:String 或 Array。

    这将自动将 'NAME: ' 应用到发送消息的开头,并带有格式化的用户链接。如果传递了一个数组,则将按如下方式格式化:'USER1, USER2, USER3: '。

  • $payloadObject->emoji

    设置机器人的图标(仅限表情符号,例如:': octocat :' 不要有空格)。

  • $payloadObject->icon

    设置机器人的图标(仅限 URL,例如:'example.com/example.png')。

特殊
  • Slack::message

    接收:$message (String 或 Array),$channel,$from,$to,$icon_emoji,$icon_url。

    这将自动根据给定参数创建消息,并返回 SlackPayload。

响应

在响应对象方面,您有两个选择,默认是一个直接表示 JSON 响应的数组。第二种选择是“动态响应”,允许您以这种方式访问数据:$response->members[0]->name 而不是 $response['members'][0]['name']

要启用动态响应,必须通过 config/app.php 中的 slack.dynamic bool 配置来实现。

实用工具

我实现的 Slack 中一个主要的添加功能是“实用工具”功能。这允许我们非常快速地轮询 Slack API 并缓存数据,这样每次使用时我们就不必重新轮询 Slack。您甚至可以通过这样做来清除缓存

//  Clear the full cache
$utilities->clear();

//  Clear a set of key's caches
$utilities->clear([ 'users.list', 'channels.list' /* etc */ ]);

//  Clear one key's cache
$utilities->clear('files.list');

这个类是在 Slack 实例级别上访问的。基本上,只需这样做

//  For an instance
$slack->utilities();

//  For the Laravel Facade
Slack::utilities();

实用工具包含获取所有列表的方法(只需使用它们的初始键即可)

//  Gets all users
$utilities->users();

//  Gets all groups
$utilities->groups();

/* etc */

这些函数中的每一个都有一个相应的非复数版本,允许您指定一个目标

//  A user
public function user($name = null, $id = null);

//  A channel
public function channel($name = null, $id = null);

//  A file
public function file($name = null, $id = null);

//  An im
public function im($id = null, $user = null);

//  A group
public function group($name = null, $id = null);

最后,我们有特定于身份验证的函数

//  Does $slack->prepare('auth.test')->send()
public function auth()

//  Returns the 'url' param from the 'auth.test' packet
public function auth_url()

//  Returns the 'team' param from the 'auth.test' packet
public function auth_team()

//  Returns the 'team_id' param from the 'auth.test' packet
public function auth_team_id()

//  Returns the 'user' param from the 'auth.test' packet
public function auth_user()

//  Returns the 'user_id' param from the 'auth.test' packet
public function auth_user_id()

入站 Webhook(从 Slack 视角看输出的 Webhook!)

对入站 Webhook 的支持感觉非常自然,就像这个包的输出 API 那样。您需要做的只是将 API 请求的参数(来自 Slack 的发送)传递给一个 SlackIncoming 对象。在 Laravel 中,我们简单地这样做

$packet = new ConnorVG\Slack\SlackIncoming(Input::all());

有了这个包,我们可以做很多酷的事情。但最重要的还是这些

$errored = $packet->hasError();
$slack = $packet->slack();

如果 $errored 为真,则表示数据格式不正确或数据缺失,这是一个假请求(非 Slack 请求)的迹象。

如果 $slack 为 null,则表示该数据包来自非验证源(根据您对 Slack 的初始配置确定)。

现在我们已经解决了这个问题,您只需这样做

$slack->ANY_SLACK_FEATURE();

因为 $slack 对象是一个完整的 Slack 实例(就像您自己创建的一样),并设置了正确的 API 密钥来响应用户,随时可以开始。

我们现在需要知道的是 $packet 的内容,内容是 Slack 发送给您的所有内容。这包括它来自哪个频道 ID、来自哪个用户 ID、发送了什么文本等。

有一点需要注意,它与 Slack 发送的常规内容略有不同,我实际上在 source_text 中存储接收到的文本,并将文本作为一个格式化文本,基本上移除了 trigger_word

要访问这些变量中的任何一个,只需这样做

$packet->channel_id;
$packet->user;
$packet->token;

推荐

这可以与 ConnorVG/PHP-WTF 一起使用得非常好,一个用法的例子如下

命令

WTF::addCommand('wolframalpha Query:source', function($wtf, $executer, $args)
{
    $answer = WA::easyQuery($args[0]);

    $executer->slack()->message($answer, $executer->channel_id, 'Wolfram|Alpha', $executer->user_id, ':equation')->send();
});
WTF::addAlias('wolframalpha', 'wa');

Incoming Webhook

Route::post('slack', function()
{
    $packet = new ConnorVG\Slack\SlackIncoming(Input::all());
    $ret = WTF::Execute($packet->text, $packet);

    if (!$ret[0])
    { /* THERE WAS AN ERROR */ }

    return '';
});

Webhook slack.com/services/new -> DIY Integrations & Customisations -> Outgoing WebHooks

687474703a2f2f7075752e73682f37426f6a6b2e

用法

687474703a2f2f7075752e73682f37413948432e

注意:此示例使用 ConnorVG/Laravel-WolframAlphalaravel/laravel

Composer 设置

composer.json 文件的 require 键中添加以下内容

"connorvg/php-slack": "dev-master"

运行 Composer 更新命令

$ composer update

注意:我建议您不要使用 dev-master 版本,并指定一个稳定版本(例如:1.0)

Laravel

如果您使用 Laravel,请添加此服务提供程序

'ConnorVG\Slack\SlackServiceProvider'

同时,此 Facade

'Slack' => 'ConnorVG\Slack\SlackFacade'

您需要将您的首选项添加到 config/app.php

'slack' => array(
//  Your unique Slack API token
    'apikey' => 'XXX',

// Whether or not to limit incoming webhook messages to verified only
    'verified_only' => true,

//  The tokens you wish to associate with API keys
    'installs' => [
        'TOKEN' => 'APIKEY'
    ],

//  Wether or not to use my Dynamic Response model
    'dynamic' => true
)