Смотреть fxmlbaseparser.php с тестовым использованием кода сторонней страницы для парсинга
<?php
// Можно сохранить в отдельном файле fxmlbaseparser.php и использовать во всех проектах через include "fxmlbaseparser.php";
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
header("Access-Control-Allow-Headers: Accept, Content-Type");
if($_SERVER['REQUEST_METHOD']=='OPTIONS') exit;
class fxmlBaseParser{
public $actual_page;
public $_PL = [];
public function getScheme(){
$scheme = $_SERVER['REQUEST_SCHEME'] ?? 'http';
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
$scheme = $_SERVER['HTTP_X_FORWARDED_PROTO'];
} elseif (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
$scheme = 'https';
}
return $scheme;
}
public function __construct(){
$requesturl = $this->getScheme()."://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$this->actual_page = preg_replace("/([\?&](w_lang|box_client|get_callback)=.*)/", "", $requesturl);
$this->BASE=$this->getScheme()."://$_SERVER[HTTP_HOST]";
}
public function sU($u,$d=""){
if (!$u) return $d;
if (!$d) return $u;
// Разделяем URL и данные POST-запроса
$ur = explode("#POST", $u);
$dr = explode("#POST", $d);
// Если URL начинается с 'curl', возвращаем его
if (strpos($u, "curl") === 0) return $u;
// Добавляем "?" или "&" для параметров
$ur[0] .= (strpos($ur[0], "?") === false) ? "?" : "&";
$ur[0] .= $dr[0];
// Обрабатываем данные POST-запроса
if (!empty($ur[1]) || !empty($dr[1])) {
$ur[0] .= "#POST" . ($ur[1] ?? '') . (($ur[1] && $dr[1]) ? "&" : "") . ($dr[1] ?? '');
}
return $ur[0];
}
public function getParse($url,$crs="android|direct|rf",$id=0){
$xdata="s$id";
if(isset($_POST[$xdata])|| ($_SERVER["REQUEST_METHOD"]=="POST"&&isset($_GET["get_url"]))){
return $_POST[$xdata];
}
else{
$post=$this->sU($this->actual_page,"get_url=".urlencode($url)."#POST$xdata=%s");
$prs=["parse"=>"$url","cors"=>$crs,"fastremote"=>false,"async"=>["post"=>$post]];
print json_encode($prs);
exit;
}
}
public function add($ch) {
if ($ch === null) return;
// Установка флага с переносом строки
if (isset($ch["br"])) $this->withbr = true;
// Объединение значений с addbefore и noaddbr, если они установлены
if ($this->addbefore !== null) {
$ch["before"] = $this->addbefore . $ch["before"];
$this->addbefore = null;
}
if ($this->noaddbr !== null) {
$ch["noaddbr"] = $this->noaddbr;
$this->noaddbr = null;
}
// Замена ключей
foreach (["url" => "playlist_url", "stream" => "stream_url", "icon" => "logo_30x30"] as $old => $new) {
if (isset($ch[$old])) {
$ch[$new] = $ch[$old];
unset($ch[$old]);
}
}
// Установка логотипа по умолчанию
if (!isset($ch["logo_30x30"])) $ch["logo_30x30"] = "none";
// Добавление BASE к относительным путям
$this->addBaseToPaths($ch, ["url", "playlist_url", "stream", "stream_url", "parser", "presearch"], $this->BASE);
// Обработка меню и подменю
if (isset($ch["menu"])) $this->addBaseToPaths($ch["menu"], ["playlist_url"], $this->BASE);
if (isset($ch["submenu"])) $this->addBaseToPaths($ch["submenu"], ["logo_30x30" => $this->BASEICON, "playlist_url", "stream_url", "parser"], $this->BASE);
// Обработка подтверждений
if (isset($ch["confirm"])) $this->addBaseToPaths($ch["confirm"], [], $this->BASE);
// Добавление иконок
$this->addBaseToPaths($ch, ["logo_30x30"], $this->BASEICON);
// Добавляем канал в список
$this->_PL["channels"][] = $ch;
}
private function addBaseToPaths(&$array, $fields, $base) {
foreach ($fields as $field => $customBase) {
$baseToUse = is_string($field) ? $customBase : $base;
$key = is_string($field) ? $field : $customBase;
if (isset($array[$key]) && strpos($array[$key], "/") === 0) {
$array[$key] = $baseToUse . $array[$key];
}
}
}
public function render() {
// Добавляем BASE к относительным путям иконки
$this->addBaseToPaths($this->_PL, ["icon"], $this->BASE);
// Добавляем BASE к относительным путям в меню
if (is_array($this->_PL["menu"])) {
foreach ($this->_PL["menu"] as $kk => $vv) {
$this->addBaseToPaths($this->_PL["menu"][$kk], ["url", "playlist_url", "stream", "stream_url", "parser"], $this->BASE);
}
}
// Добавление сообщения об FXML и вывод JSON
$this->_PL = array_merge(["fxml" => "This page contains FXML code from PHP generator fxmlBaseParser class! Open it in the Fork browser or any other browser that supports FXML code."], $this->_PL);
echo json_encode($this->_PL);
return $this;
}
}
$FXML=new fxmlBaseParser();
// Удалите этот блок, если не нужен тест. Он добавляет кнопку "Test" в плейлист и выводит результат парсинга в виде HTML-кода при нажатии на кнопку.
if(@$_GET["mode"]=="test"){
$link="https://api.ninsel.ws/embed/movie/1212";
$html= $FXML->getParse($link,"android|direct|rf");
$FXML->add(["title"=>"Result parse","description"=>htmlspecialchars($html)]);
}
else $FXML->add(["title"=>"Test","playlist_url"=>$FXML->actual_page."?mode=test","description"=>$FXML->actual_page]);
$FXML->render();
?>