随机 Alist 文件夹内的视频文件 PHP 接口进阶版

本次教程会加上 Alist 的安装教程,接口 Token 也不需要手动󠄐󠄹󠅀󠄪󠄥󠄢󠄞󠄡󠄤󠄞󠄢󠄠󠄥󠄞󠄡󠄣󠄠󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄐󠄹󠅀󠄪󠄥󠄢󠄞󠄡󠄤󠄞󠄢󠄠󠄥󠄞󠄡󠄣󠄠󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄣󠄩󠄦󠄨󠄡󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠇕󠅸󠆍󠇗󠆖󠆫󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠄐󠄹󠅀󠄪󠄥󠄢󠄞󠄡󠄤󠄞󠄢󠄠󠄥󠄞󠄡󠄣󠄠󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄣󠄩󠄦󠄨󠄡󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠇕󠅸󠆍󠇗󠆖󠆫󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮󠅒󠅢󠄟󠄮󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄣󠄩󠄦󠄨󠄡󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠇕󠅸󠄐󠄹󠅀󠄪󠄥󠄢󠄞󠄡󠄤󠄞󠄢󠄠󠄥󠄞󠄡󠄣󠄠󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄣󠄩󠄦󠄨󠄡󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠇕󠅸󠆍󠇗󠆖󠆫󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮󠆍󠇗󠆖󠆫󠇕󠅽󠆊󠇕󠄐󠄹󠅀󠄪󠄥󠄢󠄞󠄡󠄤󠄞󠄢󠄠󠄥󠄞󠄡󠄣󠄠󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄤󠄣󠄩󠄦󠄨󠄡󠄥󠄤󠄬󠅒󠅢󠄟󠄮󠇕󠅸󠆍󠇗󠆖󠆫󠇕󠅽󠆊󠇕󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮󠆞󠆒󠄐󠇗󠅹󠅸󠇖󠆍󠅳󠇖󠅹󠅰󠇖󠆌󠅹󠄬󠅒󠅢󠄟󠄮获取和手动填写。

Alist 安装教程

下载 Alist 安装包,点击下载,上传服务器随便一个文件夹内,也可以在宝塔面板新建一个网站,上传到你域名那个文件夹里。

安装命令

# 解压下载的文件,得到可执行文件:
tar -zxvf alist-xxxx.tar.gz
# 授予程序执行权限:
chmod +x alist
# 运行程序
./alist server

密码更改

# 高于 v3.25.0 版本
# 随机生成一个密码
./alist admin random
# 手动设置一个密码 `NEW_PASSWORD`是指你需要设置的密码
./alist admin set NEW_PASSWORD

添加进程守护

此时上面步骤安装完了,宝塔面板软件商店下载进程守护,怎么填写,启动命令填 alist 文件夹名称/alist server,进程目录同样也是 Alist 文件夹目录

反向代理

这个步骤非常关键,宝塔面板,网站打开你的域名,找到反向代理 目标 url http://127.0.0.1:5244,这个时候你要去服务器防火墙/安全组去放开 5244 端口,放开了就可以成功访问 Alist 了。

代码部分

Token 代码改成 Json 输出以便随机视频接口更好的获取 Token

<?php
header('Content-Type: application/json');

$url = 'http://你的 Alist 域名/api/auth/login';
$data = json_encode([
    'username' => 'Alist 用户名',
    'password' => 'Alist 密码'
]);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode == 200) {
    echo $response;
} else {
    echo json_encode([
        'error' => true,
        'message' => "请求失败,HTTP 状态码: $httpCode"
    ]);
}

视频代码

<?php
header('Content-Type: application/json');

// 配置部分
$config = [
    'alist_url' => 'http(s)://Alist 域名',
    'token_api' => 'https://域名 token.php',
    'target_folder' => '文件夹称',
    'video_extensions' => ['mp4', 'mkv', 'avi', 'mov', 'flv', 'wmv', 'webm']
];

/**
 * 从 API 获取 AList token
 */
function fetchAlistToken($tokenApiUrl) {
    $response = file_get_contents($tokenApiUrl);
    $result = json_decode($response, true);
    
    if (!$result || $result['code'] !== 200 || empty($result['data']['token'])) {
        throw new Exception('Failed to fetch AList token');
    }
    
    return $result['data']['token'];
}

/**
 * 生成直链
 */
function generateUrl($alistUrl, $filePath) {
    return rtrim($alistUrl, '/') . '/d' . $filePath;
}

/**
 * 获取文件列表
 */
function getAlistFiles($path, $alistUrl, $alistToken) {
    $url = $alistUrl . '/api/fs/list';
    $options = [
        'http' => [
            'method' => 'POST',
            'header' => [
                "Authorization: " . $alistToken,
                "Content-Type: application/json"
            ],
            'content' => json_encode(['path' => $path])
        ]
    ];
    
    $response = file_get_contents($url, false, stream_context_create($options));
    return json_decode($response, true);
}

/**
 * 获取视频文件列表
 */
function getTargetVideos($config) {
    // 首先获取 token
    $alistToken = fetchAlistToken($config['token_api']);
    
    // 获取文件列表
    $result = getAlistFiles($config['target_folder'], $config['alist_url'], $alistToken);
    
    if ($result['code'] !== 200) {
        return ['error' => $result['message'] ?? '请求失败'];
    }

    $videoFiles = [];
    foreach ($result['data']['content'] as $file) {
        if ($file['is_dir'] || !isset($file['name'])) continue;
        
        $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
        if (in_array($ext, $config['video_extensions'])) {
            $filePath = $file['path'] ?? $config['target_folder'] . '/' . $file['name'];
            $videoFiles[] = [
                'name' => $file['name'],
                'path' => $filePath,
                'size' => $file['size'] ?? 0,
                'modified' => $file['modified'] ?? '',
                'url' => generateUrl($config['alist_url'], $filePath),
                'thumbnail' => generateUrl($config['alist_url'], $filePath) . '?thumbnail=true'
            ];
        }
    }
    
    return $videoFiles;
}

// 主逻辑
try {
    $videos = getTargetVideos($config);
    
    if (isset($videos['error'])) {
        throw new Exception($videos['error']);
    }

    if (empty($videos)) {
        throw new Exception('未找到视频文件');
    }

    $randomVideo = $videos[array_rand($videos)];
    
    echo json_encode([
        'success' => true,
        'data' => $randomVideo,
        'total' => count($videos)
    ], JSON_UNESCAPED_UNICODE);

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
}
?>

好了教程到此结束,有疑问可以在评论区问我或者在初离群里找我 星海.

请登录后发表评论

    没有回复内容