• PHP Discord获取频道消息功能实现


    1. 关注对应频道

    首先要创建自己的频道, 然后到对应的公告频道中关注这个频道(这时 Discord 会让你选择频道, 选择之前创建的频道就可以了)

    2. 添加机器人

    https://discord.com/developers/applications
    Discord 开发者地址, 然后创建一个自己的机器人即可
    在这里插入图片描述

    3. 配置机器人权限

    进入设置后 选择 OAuth2 然后 选择第一个子选项
    如图: 选择 bot , Administrator
    在这里插入图片描述
    选择 Bot ,上传头像,填写名称
    在这里插入图片描述
    配置机器人
    下面 MESSAGE CONTENT INTENT (重点没有选择的话,后面获取内容都是空的)在这里插入图片描述

    4. 使用 DiscordPHP 类库

    文档地址 https://packagist.org/packages/team-reflex/discord-php
    按照类库 composer require team-reflex/discord-php

    5. 代码示例 (Laravel 框架)

    先在自己的频道发消息, 然后在日志中查看 $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');
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    6. 服务器部署

    这里建议使用 进程守护 保持这个命令执行后的进程一直都在
    然后在 进程守护 中去管理和重启这个命令(业务逻辑发生修改后需要重启)
    注意: 这里不适合使用定时器, 这样会导致服务器或者数据库压力巨大,从而导致宕机

    
    
    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();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    判断一个数组是否包含另一个
    数组19—unshift() :将一个或多个元素添加到数组的开头
    WGCNA教程 官网教程 总结版 代码tutorials 1
    HALCON reference_hdevelop翻译Chapter1 1D Measuring(二)
    1800亿参数,支持中文,3.5万亿训练数据!开源类ChatGPT模型
    shell——sed工具
    ZooKeeper常见面试题
    [Vue] 自定义命令
    2021-06-09 51单片机:两个独立按键控制一个led,k1按下松开led闪烁三次,k2按下LED闪烁五次
    HAL库笔记(重要库函数)
  • 原文地址:https://blog.csdn.net/weixin_41258075/article/details/132968576