Files
QuickAPI/api/douyin/index.php
muzihuaner 6c5e43ae2d 初始化
2026-03-14 23:26:53 +08:00

162 lines
6.2 KiB
PHP

<?php
$counter = intval(file_get_contents("counter.dat"));
$_SESSION['#'] = true;
$counter++;
$fp = fopen("counter.dat","w");
fwrite($fp, $counter);
fclose($fp);
?>
<?php
/**
*@Author: JH-Ahua
* @CreateTime: 2025/8/5 下午2:13
*@email: admin@bugpk.com
*@blog: www.jiuhunwl.cn
*@Api: api.bugpk.com
*@tip: 抖音视频图集去水印解析
*/
header("Access-Control-Allow-Origin: *");
header('Content-type: application/json');
function douyin($url)
{
// 构造请求数据
$header = array('User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1 Edg/122.0.0.0');
// 尝试从 URL 中获取视频 ID
$id = extractId($url);
// 检查 ID 是否有效
if (empty($id)) {
return array('code' => 400, 'msg' => '无法解析视频 ID');
}
// 发送请求获取视频信息
$response = curl('https://www.iesdouyin.com/share/video/' . $id, $header);
$pattern = '/window\._ROUTER_DATA\s*=\s*(.*?)\<\/script>/s';
preg_match($pattern, $response, $matches);
if (empty($matches[1])) {
return array('code' => 201, 'msg' => '解析数据失败' . $response);
}
$videoInfo = json_decode(trim($matches[1]), true);
if (!isset($videoInfo['loaderData'])) {
return array('code' => 201, 'msg' => '数据查找失败' . $response);
}
//替换 "playwm" 为 "play"
$videoResUrl = str_replace('playwm', 'play', $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['video']['play_addr']['url_list'][0]);
$imgurljson = $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['images'];
$imgurl = [];
if (is_array($imgurljson) && isset($imgurljson[0])) {
// 遍历 JSON 数组
foreach ($imgurljson as $item) {
// 检查当前元素是否包含 url_list 标签
if (isset($item['url_list']) && is_array($item['url_list']) && count($item['url_list']) > 0) {
// 将 url_list 的第一个值添加到 $imgurl 数组中
$imgurl[] = $item['url_list'][0];
}
}
}
if (!empty($videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['music'])) {
$music = array(
'title' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['music']['title'],
'author' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['music']['author'],
'avatar' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['music']['cover_large']['url_list'][0],
'url' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['video']['play_addr']['uri'],
);
}
if (empty($videoResUrl) && empty($imgurl)) {
$arr = array(
'code' => 404,
'msg' => '当前分享链接已失效!',
'data' => [],
);
} else {
// 构造返回数据
$arr = array(
'code' => 200,
'msg' => '解析成功',
'data' => array(
'author' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['author']['nickname'],
'uid' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['author']['unique_id'],
'avatar' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['author']['avatar_medium']['url_list'][0],
'like' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['statistics']['digg_count'],
'time' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]["create_time"],
'title' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['desc'],
'cover' => $videoInfo['loaderData']['video_(id)/page']['videoInfoRes']['item_list'][0]['video']['cover']['url_list'][0],
'images' => !empty($imgurl) ? $imgurl : '当前为短视频解析模式',
'url' => count($imgurl) > 0 ? '当前为图文解析,图文数量为:' . count($imgurl) . '张图片' : $videoResUrl,
'music' => $music ?? '音乐为视频原声',
)
);
}
return $arr;
}
function extractId($url)
{
$headers = get_headers($url, true);
if ($headers === false) {
// 如果获取头信息失败,直接使用原始 URL
$loc = $url;
} else {
// 处理重定向头可能是数组的情况
if (isset($headers['Location']) && is_array($headers['Location'])) {
$loc = end($headers['Location']);
} else {
$loc = $headers['Location'] ?? $url;
}
}
// 确保 $loc 是字符串
if (!is_string($loc)) {
$loc = strval($loc);
}
preg_match('/[0-9]+|(?<=video\/)[0-9]+/', $loc, $id);
return !empty($id) ? $id[0] : null;
}
function curl($url, $header = null, $data = null)
{
$con = curl_init((string)$url);
curl_setopt($con, CURLOPT_HEADER, false);
curl_setopt($con, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($con, CURLOPT_RETURNTRANSFER, true);
curl_setopt($con, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($con, CURLOPT_AUTOREFERER, 1);
if (isset($header)) {
curl_setopt($con, CURLOPT_HTTPHEADER, $header);
}
if (isset($data)) {
curl_setopt($con, CURLOPT_POST, true);
curl_setopt($con, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($con, CURLOPT_TIMEOUT, 5000);
$result = curl_exec($con);
if ($result === false) {
// 处理 curl 错误
$error = curl_error($con);
curl_close($con);
trigger_error("cURL error: $error", E_USER_WARNING);
return false;
}
curl_close($con);
return $result;
}
// 使用空合并运算符检查 url 参数
$url = $_GET['url'] ?? '';
if (empty($url)) {
echo json_encode(['code' => 201, 'msg' => 'url为空'], 480);
} else {
$response = douyin($url);
if (empty($response)) {
echo json_encode(['code' => 404, 'msg' => '获取失败'], 480);
} else {
echo json_encode($response, 480);
}
}
?>