首先要创建自己的频道, 然后到对应的公告频道中关注这个频道(这时
Discord
会让你选择频道, 选择之前创建的频道就可以了)
https://discord.com/developers/applications
到Discord
开发者地址, 然后创建一个自己的机器人即可
进入设置后 选择
OAuth2
然后 选择第一个子选项
如图: 选择bot
,Administrator
选择Bot
,上传头像,填写名称
配置机器人
下面MESSAGE CONTENT INTENT
(重点没有选择的话,后面获取内容都是空的)
DiscordPHP
类库文档地址 https://packagist.org/packages/team-reflex/discord-php
按照类库composer require team-reflex/discord-php
先在自己的频道发消息, 然后在日志中查看
$message->content
如果为空 (看第三步配置)
/**
* Discord
*/
use App\Models\DiscordMessage;
use Discord\Discord;
use Discord\Exceptions\IntentException;
use Discord\Parts\Channel\Message;
class DiscordUtils
{
// 配置
public $config = [
'token' => 'xxx',
];
// 频道ID
public $channelId = 'xxx';
// 官方ID
public $userId = 'xxx';
/**
* @throws IntentException
*/
public function __construct()
{
$this->init();
}
/**
* 初始化
* @throws IntentException
*/
public function init()
{
$discord = new Discord($this->config);
$discord->on('ready', function (Discord $discord) {
logger("Bot is ready!");
$discord->on('message', function (Message $message, Discord $discord) {
// 在这里处理收到的消息
logger("Received Message :" . $message->content);
// 这里判断只记录 公告频道的官方发布的消息
// 指定频道的
$channel = $message->channel_id === $this->channelId;
// 指定官方
// $official = $message->user_id == $this->userId;
// 消息ID 不为空, 是指定频道, 消息ID是不存在的
if ($channel) {
$data = [
'message_id' => $message->id,
'channel_id' => $message->channel_id,
'user_id' => $message->user_id,
'username' => $message->author->username,
'content_en' => $message->content,
'content' => $message->content,
'timestamp' => $message->timestamp->toDateTimeString(),
];
logger('write: ', $data);
$this->write($data);
}
});
});
$discord->run();
}
/**
* @param $data
*/
public function write($data)
{
try {
if (!DiscordMessage::query()->where('message_id', $data['message_id'])->exists()) {
logger('写入: ', $data);
DiscordMessage::query()->insertGetId($data);
} else {
// 重复写入
logger('Repeat Write Records');
}
} catch (\Exception $e) {
logger('write error');
}
}
}
这里建议使用 进程守护 保持这个命令执行后的进程一直都在
然后在 进程守护 中去管理和重启这个命令(业务逻辑发生修改后需要重启)
注意: 这里不适合使用定时器, 这样会导致服务器或者数据库压力巨大,从而导致宕机
namespace App\Console\Commands;
use App\Library\Api\DiscordUtils;
use Illuminate\Console\Command;
class GetDiscordMessage extends Command
{
/**
* php artisan discord:message >> /dev/null 2>&1
* php artisan discord:message --option -d
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'discord:message';
/**
* The console command description.
*
* @var string
*/
protected $description = '获取Discord消息';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*/
public function handle()
{
logger('执行 - 获取Discord消息');
new DiscordUtils();
}
}