如何从 PHP 脚本生成的字符串中 select 特定文本?
How to select specific text from a string generated by a PHP script?
我一直在尝试使用多个 PHP 脚本从 Twitch 抓取 HLS 文件。第一个运行 cURL 命令,通过 returns 表示 URL 的 Python 脚本获取 HLS URL,并将生成的字符串转换为纯文本,第二个(不起作用的那个)应该是提取 M3U8 文件并使其能够播放。
第一个脚本(extract.php)
<?php
header('Content-Type: text/plain; charset=utf-8');
$url = "https://pwn.sh/tools/streamapi.py?url=twitch.tv/cgtn_live_russian&quality=1080p60";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$resp = curl_exec($curl);
curl_close($curl);
var_dump($resp);
$undesirable = array("}");
$cleanurl = str_replace($undesirable,"");
echo substr($cleanurl, 39, 898);
?>
这个脚本(我们称它为 extract.php)有效,并且它 returns(纯文本)与 Python 脚本将 return,即:
string(904) "{"success": true, "urls": {"1080p60": "https://video-weaver.fra05.hls.ttvnw.net/v1/playlist/[token].m3u8"}}"
第二个脚本(play.php)
<?php
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Referer:https://myserver.com/" .
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0"
));
$html = file_get_contents("extract.php");
preg_match_all(
'/(http.*?\.m3u8[^&">]+)/',
$html,
$posts, // will contain the article data
PREG_SET_ORDER // formats data into an array of posts
);
foreach ($posts as $post) {
$link = $post[0];
header("Location: $link");
}
?>
第二个脚本(我们称之为 play.php)理论上应该 return M3U8 文件(没有 string(904) " {"success": true, "urls": {"1080p60":) 并使其能够在媒体播放器(例如 VLC)中播放,但它不会 return 任何东西。
谁能告诉我怎么了?我在制作这些 PHP 文件时是否犯了语法或正则表达式错误,或者第二个文件是否因为字符串的其他元素而无法正常工作?
提前致谢。
我认为您可以依靠正则表达式来获取 URL 而不是尝试手动清理字符串。另一种方法是使用 json_decode()
.
无论如何,想法是在 extract.php
中定义一个变量,在本例中是 $resp
。像现在这样通过 echo
执行此操作不会使其在父脚本中可用。
一旦包含 extract.php
,您就可以在 play.php
中引用该变量。
<?php
//extract.php
$resp = '';
$url = "https://pwn.sh/tools/streamapi.py?url=twitch.tv/cgtn_live_russian&quality=1080p60";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$resp = curl_exec($curl);
curl_close($curl);
//play.php
include('./extract.php');
//$resp is set in extraact.php
preg_match_all(
'/(http.*?\.m3u8)/',
$resp,
$posts, // will contain the article data
PREG_SET_ORDER // formats data into an array of posts
);
foreach ($posts as $post) {
$link = $post[0];
}
header("Location: $link");
die();
我一直在尝试使用多个 PHP 脚本从 Twitch 抓取 HLS 文件。第一个运行 cURL 命令,通过 returns 表示 URL 的 Python 脚本获取 HLS URL,并将生成的字符串转换为纯文本,第二个(不起作用的那个)应该是提取 M3U8 文件并使其能够播放。
第一个脚本(extract.php)
<?php
header('Content-Type: text/plain; charset=utf-8');
$url = "https://pwn.sh/tools/streamapi.py?url=twitch.tv/cgtn_live_russian&quality=1080p60";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$resp = curl_exec($curl);
curl_close($curl);
var_dump($resp);
$undesirable = array("}");
$cleanurl = str_replace($undesirable,"");
echo substr($cleanurl, 39, 898);
?>
这个脚本(我们称它为 extract.php)有效,并且它 returns(纯文本)与 Python 脚本将 return,即:
string(904) "{"success": true, "urls": {"1080p60": "https://video-weaver.fra05.hls.ttvnw.net/v1/playlist/[token].m3u8"}}"
第二个脚本(play.php)
<?php
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Referer:https://myserver.com/" .
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0"
));
$html = file_get_contents("extract.php");
preg_match_all(
'/(http.*?\.m3u8[^&">]+)/',
$html,
$posts, // will contain the article data
PREG_SET_ORDER // formats data into an array of posts
);
foreach ($posts as $post) {
$link = $post[0];
header("Location: $link");
}
?>
第二个脚本(我们称之为 play.php)理论上应该 return M3U8 文件(没有 string(904) " {"success": true, "urls": {"1080p60":) 并使其能够在媒体播放器(例如 VLC)中播放,但它不会 return 任何东西。
谁能告诉我怎么了?我在制作这些 PHP 文件时是否犯了语法或正则表达式错误,或者第二个文件是否因为字符串的其他元素而无法正常工作?
提前致谢。
我认为您可以依靠正则表达式来获取 URL 而不是尝试手动清理字符串。另一种方法是使用 json_decode()
.
无论如何,想法是在 extract.php
中定义一个变量,在本例中是 $resp
。像现在这样通过 echo
执行此操作不会使其在父脚本中可用。
一旦包含 extract.php
,您就可以在 play.php
中引用该变量。
<?php
//extract.php
$resp = '';
$url = "https://pwn.sh/tools/streamapi.py?url=twitch.tv/cgtn_live_russian&quality=1080p60";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$resp = curl_exec($curl);
curl_close($curl);
//play.php
include('./extract.php');
//$resp is set in extraact.php
preg_match_all(
'/(http.*?\.m3u8)/',
$resp,
$posts, // will contain the article data
PREG_SET_ORDER // formats data into an array of posts
);
foreach ($posts as $post) {
$link = $post[0];
}
header("Location: $link");
die();