PHPackages                             gsons/douyu-danmu - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. gsons/douyu-danmu

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

gsons/douyu-danmu
=================

斗鱼直播弹幕接口对接

0.4(7y ago)127MITPHPPHP &gt;=5.3.0

Since Oct 19Pushed 7y ago1 watchersCompare

[ Source](https://github.com/gsons/douyu-danmu)[ Packagist](https://packagist.org/packages/gsons/douyu-danmu)[ Docs](https://github.com/gsons/douyu-danmu)[ RSS](/packages/gsons-douyu-danmu/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (4)DependenciesVersions (5)Used By (0)

douyu-danmu
===========

[](#douyu-danmu)

douyu-danmu 是php版斗鱼直播弹幕监听模块。

参考:

安装
--

[](#安装)

```
composer require gsons/douyu-danmu
```

简单使用
----

[](#简单使用)

通过如下代码，可以初步通过php对弹幕进行处理。

```
require_once __DIR__ . '/src/SocketMsg.php';
require_once __DIR__ . '/src/Room.php';
require_once __DIR__ . '/src/Log.php';

use DouYu\Room;
use Douyu\Log;

date_default_timezone_set('PRC');

defined('DouYuHost') || define('DouYuHost', 'openbarrage.douyutv.com');
defined('DouYuPort') || define('DouYuPort', 8601);

Log::log("程序启动!", LOG::WARN);

// $roomDataArr = getRoomIdArr(0, 99);
$roomDataArr=array_merge(
    getRoomIdArr(0, 99),
    getRoomIdArr(100, 99),
    getRoomIdArr(200, 99),getRoomIdArr(300, 99),getRoomIdArr(400, 99),
    getRoomIdArr(500, 99),getRoomIdArr(600, 99)
);
// print_r(count($roomDataArr));exit;
$roomObjArr = array();
foreach ($roomDataArr as $roomData) {
    array_push($roomObjArr, new  Room(DouYuHost, DouYuPort, $roomData['room_id'], 20));
}
unset($roomDataArr);
foreach ($roomObjArr as $room) {

    try {
        $room->onMessage=function($msg_obj,$roomId) {
            if ($msg_obj) {
                $content='';
                switch ($msg_obj['type']) {
                    case 'chat':
                        $content = "[房间号:{$roomId}] [{$msg_obj['from']['name']}]:{$msg_obj['content']}";
                        break;
                    case 'gift':
                        $content = "[房间号:{$roomId}] [{$msg_obj['from']['name']}]->赠送{$msg_obj['count']}个{$msg_obj['name']}";
                        break;
                    case 'yuwan':
                        $content = "[房间号:{$roomId}] [{$msg_obj['from']['name']}]->赠送{$msg_obj['count']}个{$msg_obj['name']}";
                        break;
                    case 'deserve':
                        $content = "[房间号:{$roomId}] [{$msg_obj['from']['name']}]->赠送{$msg_obj['count']}个{$msg_obj['name']}";
                        break;
                }
               if($content) echo iconv('UTF-8','gbk//IGNORE', $content).PHP_EOL;
               unset($content);
            }
        };
        $room->joinIn();
        $room->start();

    } catch (\Exception $e) {
        gbk_echo($e->getMessage());
        Log::log($e->getMessage(), LOG::ERROR);
    }
    $room->onConnect = function ($linkNum) use ($room) {
        $roomId = $room->getRoomId();
        $content = "成功连接到斗鱼房间号{$roomId},当前连接总数{$linkNum}";
        gbk_echo($content);
        Log::log($content, LOG::WARN);
    };
    $room->onClose = function ($linkNum, $roomID) {
        $content = "由于程序发生异常已关闭连接房间号{$roomID}!当前连接数{$linkNum}";
        gbk_echo($content);
        Log::log($content, LOG::ERROR);
    };
    $room->onError = function ($errorMsg, $roomID) {
        $errorMsg=iconv('gbk//TRANSLIT', 'UTF-8', $errorMsg);
        $content = "无法建立连接,房间号{$roomID},{$errorMsg}";
        gbk_echo($content);
        Log::log($content, LOG::ERROR);
    };
}

function getRoomIdArr($offset = 0, $limit = 99)
{
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => "http://open.douyucdn.cn/api/RoomApi/live?offset={$offset}&limit={$limit}",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_HTTPHEADER => array(
            "cache-control: no-cache",
            "content-type: application/x-www-form-urlencoded"
        ),
    ));
    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);
    if ($err) {
        Log::log('获取房间列表失败:' . $err, LOG::ERROR);
        return array();
    } else {
        $arr = json_decode($response, true);
        if (isset($arr['error']) && isset($arr['data']) && $arr['error'] === 0) {
            return $arr['data'];
        } else {
            return array();
        }

    }
}

function gbk_echo($msg)
{
    echo iconv('UTF-8', 'gbk//IGNORE', $msg).PHP_EOL;
}
```

API
---

[](#api)

#### chat消息

[](#chat消息)

```
    {
        type: 'chat',
        time: '毫秒时间戳(服务器无返回time,此处为本地收到消息时间),Number',
        from: {
            name: '发送者昵称,String',
            rid: '发送者rid,String',
            level: '发送者等级,Number',
            plat: '发送者平台(android,ios,pc_web,unknow),String'
        },
        id: '弹幕唯一id,String',
        content: '聊天内容,String'
    }
```

#### gift消息

[](#gift消息)

```
    {
        type: 'gift',
        time: '毫秒时间戳(服务器无返回time,此处为本地收到消息时间),Number',
        name: '礼物名称,String',
        from: {
            name: '发送者昵称,String',
            rid: '发送者rid,String',
            level: '发送者等级,Number'
        },
        id: '礼物唯一id,String',
        count: '礼物数量,Number',
        price: '礼物总价值(单位鱼翅),Number',
        earn: '礼物总价值(单位元),Number'
    }
```

#### yuwan消息

[](#yuwan消息)

```
    {
        type: 'yuwan',
        time: '毫秒时间戳(服务器无返回time,此处为本地收到消息时间),Number',
        name: '礼物名称,String',
        from: {
            name: '发送者昵称,String',
            rid: '发送者rid,String',
            level: '发送者等级,Number'
        },
        id: '礼物唯一id,String',
        count: '礼物数量,Number'
    }
```

#### deserve消息

[](#deserve消息)

```
    {
        type: 'deserve',
        time: '毫秒时间戳(服务器无返回time,此处为本地收到消息时间),Number',
        name: '初级酬勤，中级酬勤，高级酬勤',
        from: {
            name: '发送者昵称,String',
            rid: '发送者rid,String',
            level: '发送者等级,Number'
        },
        id: '礼物唯一id,String',
        count: '酬勤数量,Number',
        price: '酬勤总价值(单位鱼翅),Number',
        earn: '酬勤总价值(单位元),Number'
    }
```

###  Health Score

23

—

LowBetter than 27% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity9

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~2 days

Total

4

Last Release

2751d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/2070bacb039778c1aa67d7c30d19f8ea2c7d0dcba0bc3df14d3cf0fdb9e902f3?d=identicon)[gsonhub](/maintainers/gsonhub)

---

Top Contributors

[![gsons](https://avatars.githubusercontent.com/u/15610655?v=4)](https://github.com/gsons "gsons (18 commits)")

---

Tags

douyulivedouyutvphpdanmuDouyudouyu-danmu

### Embed Badge

![Health badge](/badges/gsons-douyu-danmu/health.svg)

```
[![Health](https://phpackages.com/badges/gsons-douyu-danmu/health.svg)](https://phpackages.com/packages/gsons-douyu-danmu)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
