forked from tfornik/RussiaTools
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
12 KiB
318 lines
12 KiB
<?php
|
|
require_once __DIR__ . '/lib/spider.php';
|
|
|
|
class Spider extends BaseSpider {
|
|
|
|
private $host;
|
|
private $customHeaders;
|
|
|
|
public function getName() {
|
|
return "复古片";
|
|
}
|
|
|
|
public function init($extend = "") {
|
|
$this->host = "https://vintagepornfun.com";
|
|
$this->customHeaders = array(
|
|
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
"Referer" => $this->host,
|
|
"Origin" => $this->host,
|
|
"Connection" => "keep-alive"
|
|
);
|
|
}
|
|
|
|
private function _fetch($url, $headers = null) {
|
|
$reqHeaders = $headers ? $headers : $this->customHeaders;
|
|
$html = $this->fetch($url, array('headers' => $reqHeaders));
|
|
return $html;
|
|
}
|
|
|
|
private function _generateRandomString($length = 10) {
|
|
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
$charactersLength = strlen($characters);
|
|
$randomString = '';
|
|
for ($i = 0; $i < $length; $i++) {
|
|
$randomString .= $characters[rand(0, $charactersLength - 1)];
|
|
}
|
|
return $randomString;
|
|
}
|
|
|
|
private function _resolve_myvidplay($url) {
|
|
try {
|
|
$embed = str_replace("/d/", "/e/", $url);
|
|
if (strpos($embed, 'd000d.com') !== false) {
|
|
$embed = str_replace('d000d.com', 'myvidplay.com', $embed);
|
|
}
|
|
if (strpos($embed, 'doood.com') !== false) {
|
|
$embed = str_replace('doood.com', 'myvidplay.com', $embed);
|
|
}
|
|
|
|
$parsedUrl = parse_url($embed);
|
|
$host = $parsedUrl['scheme'] . '://' . $parsedUrl['host'];
|
|
|
|
$hReq = array(
|
|
"User-Agent" => $this->customHeaders['User-Agent'],
|
|
"Referer" => $this->host
|
|
);
|
|
|
|
$r = $this->fetch($embed, array('headers' => $hReq));
|
|
if (!$r) {
|
|
return array('parse' => 1, 'url' => $url, 'header' => $hReq);
|
|
}
|
|
|
|
$m = array();
|
|
preg_match('/\/pass_md5\/[^\'"]+/', $r, $m);
|
|
if (empty($m)) {
|
|
return array('parse' => 1, 'url' => $url, 'header' => $hReq);
|
|
}
|
|
|
|
$hReq["Referer"] = $embed;
|
|
$prefix = trim($this->fetch($host . $m[0], array('headers' => $hReq)));
|
|
|
|
if (substr($prefix, 0, 4) !== "http") {
|
|
return array('parse' => 1, 'url' => $url, 'header' => $hReq);
|
|
}
|
|
|
|
$parts = explode("/", $m[0]);
|
|
$token = end($parts);
|
|
$rnd = $this->_generateRandomString(10);
|
|
|
|
$finalHeaders = array(
|
|
'User-Agent' => $this->customHeaders['User-Agent'],
|
|
'Referer' => $host . '/',
|
|
'Connection' => 'keep-alive'
|
|
);
|
|
|
|
return array(
|
|
'parse' => 0,
|
|
'url' => $prefix . $rnd . '?token=' . $token,
|
|
'header' => $finalHeaders
|
|
);
|
|
} catch (Exception $e) {
|
|
return array('parse' => 1, 'url' => $url, 'header' => $this->customHeaders);
|
|
}
|
|
}
|
|
|
|
public function homeContent($filter) {
|
|
$classes = array(
|
|
array("type_name" => "最新更新", "type_id" => "latest"),
|
|
array("type_name" => "70年代", "type_id" => "70s-porn"),
|
|
array("type_name" => "80年代", "type_id" => "80s-porn"),
|
|
array("type_name" => "亚洲经典", "type_id" => "asian-vintage-porn"),
|
|
array("type_name" => "欧洲经典", "type_id" => "euro-porn-movies"),
|
|
array("type_name" => "日本经典", "type_id" => "japanese-vintage-porn"),
|
|
array("type_name" => "法国经典", "type_id" => "french-vintage-porn"),
|
|
array("type_name" => "德国经典", "type_id" => "german-vintage-porn"),
|
|
array("type_name" => "意大利经典", "type_id" => "italian-vintage-porn"),
|
|
array("type_name" => "经典影片", "type_id" => "classic-porn-movies")
|
|
);
|
|
|
|
$sortConf = array(
|
|
"key" => "order",
|
|
"name" => "排序",
|
|
"value" => array(
|
|
array("n" => "默认", "v" => ""),
|
|
array("n" => "最新", "v" => "date"),
|
|
array("n" => "随机", "v" => "rand"),
|
|
array("n" => "标题", "v" => "title"),
|
|
array("n" => "热度", "v" => "comment_count")
|
|
)
|
|
);
|
|
|
|
$tagConf = array(
|
|
"key" => "tag",
|
|
"name" => "标签",
|
|
"value" => array(
|
|
array("n" => "全部", "v" => ""),
|
|
array("n" => "70年代", "v" => "70s-porn"),
|
|
array("n" => "80年代", "v" => "80s-porn"),
|
|
array("n" => "90年代", "v" => "90s-porn"),
|
|
array("n" => "肛交", "v" => "anal-sex"),
|
|
array("n" => "亚洲", "v" => "asian"),
|
|
array("n" => "大胸", "v" => "big-boobs"),
|
|
array("n" => "金发", "v" => "blonde"),
|
|
array("n" => "经典", "v" => "classic"),
|
|
array("n" => "喜剧", "v" => "comedy"),
|
|
array("n" => "绿帽", "v" => "cuckold"),
|
|
array("n" => "黑人", "v" => "ebony"),
|
|
array("n" => "欧洲", "v" => "european"),
|
|
array("n" => "法国", "v" => "french"),
|
|
array("n" => "德国", "v" => "german"),
|
|
array("n" => "群交", "v" => "group-sex"),
|
|
array("n" => "多毛", "v" => "hairy-porn"),
|
|
array("n" => "跨种族", "v" => "interracial"),
|
|
array("n" => "意大利", "v" => "italian"),
|
|
array("n" => "女同", "v" => "lesbian"),
|
|
array("n" => "熟女", "v" => "milf"),
|
|
array("n" => "乱交", "v" => "orgy"),
|
|
array("n" => "户外", "v" => "public-sex"),
|
|
array("n" => "复古", "v" => "retro"),
|
|
array("n" => "少女", "v" => "teen-sex"),
|
|
array("n" => "3P", "v" => "threesome"),
|
|
array("n" => "老片", "v" => "vintage-porn"),
|
|
array("n" => "偷窥", "v" => "voyeur")
|
|
)
|
|
);
|
|
|
|
$filters = array();
|
|
foreach ($classes as $item) {
|
|
$filters[$item['type_id']] = array($sortConf, $tagConf);
|
|
}
|
|
|
|
return array("class" => $classes, "filters" => $filters);
|
|
}
|
|
|
|
public function homeVideoContent() {
|
|
return array("list" => array());
|
|
}
|
|
|
|
public function categoryContent($tid, $pg = 1, $filter = array(), $extend = array()) {
|
|
if ($tid == "latest") {
|
|
$url = ($pg == 1) ? $this->host : $this->host . "/page/" . $pg . "/";
|
|
} else {
|
|
$base = $this->host . "/category/" . $tid;
|
|
$url = ($pg == 1) ? $base . "/" : $base . "/page/" . $pg . "/";
|
|
}
|
|
|
|
$queryParts = array();
|
|
if (isset($extend['order']) && $extend['order']) {
|
|
$queryParts[] = "orderby=" . $extend['order'];
|
|
}
|
|
if (isset($extend['tag']) && $extend['tag']) {
|
|
$queryParts[] = "tag=" . $extend['tag'];
|
|
}
|
|
|
|
if (!empty($queryParts)) {
|
|
$sep = strpos($url, '?') !== false ? '&' : '?';
|
|
$url .= $sep . implode('&', $queryParts);
|
|
}
|
|
|
|
return $this->_get_list($url, intval($pg));
|
|
}
|
|
|
|
private function _get_list($url, $page = 1) {
|
|
$videos = array();
|
|
$html = $this->_fetch($url);
|
|
if ($html) {
|
|
$articles = array();
|
|
preg_match_all('/<article[^>]*>(.*?)<\/article>/s', $html, $articles);
|
|
if (isset($articles[1])) {
|
|
foreach ($articles[1] as $item) {
|
|
$aMatch = array();
|
|
if (!preg_match('/<a[^>]*href=["\']([^"\']+)["\']/', $item, $aMatch)) {
|
|
continue;
|
|
}
|
|
$href = $aMatch[1];
|
|
|
|
$pic = "";
|
|
$imgMatch = array();
|
|
if (preg_match('/<img[^>]*data-src=["\']([^"\']+)["\']/', $item, $imgMatch)) {
|
|
$pic = $imgMatch[1];
|
|
} elseif (preg_match('/<img[^>]*src=["\']([^"\']+)["\']/', $item, $imgMatch)) {
|
|
$pic = $imgMatch[1];
|
|
}
|
|
|
|
if ($pic && substr($pic, 0, 4) !== "http") {
|
|
$pic = $this->host . $pic;
|
|
}
|
|
|
|
$name = "";
|
|
$headMatch = array();
|
|
if (preg_match('/class="entry-header"[^>]*>(.*?)<\/div>/s', $item, $headMatch)) {
|
|
$name = strip_tags($headMatch[1]);
|
|
} else {
|
|
$titleMatch = array();
|
|
if (preg_match('/title=["\']([^"\']+)["\']/', $item, $titleMatch)) {
|
|
$name = $titleMatch[1];
|
|
}
|
|
}
|
|
$name = trim($name);
|
|
|
|
$remarks = "";
|
|
$remMatch = array();
|
|
if (preg_match('/class="rating-bar"[^>]*>(.*?)<\/div>/s', $item, $remMatch)) {
|
|
$remarks = trim(strip_tags($remMatch[1]));
|
|
}
|
|
|
|
$videos[] = array(
|
|
"vod_id" => $href,
|
|
"vod_name" => $name ? $name : "",
|
|
"vod_pic" => $pic,
|
|
"vod_remarks" => $remarks
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
$pagecount = (!empty($videos) ? $page + 1 : $page);
|
|
return array(
|
|
"list" => $videos,
|
|
"page" => $page,
|
|
"pagecount" => $pagecount,
|
|
"limit" => 20,
|
|
"total" => 999
|
|
);
|
|
}
|
|
|
|
public function detailContent($ids) {
|
|
$html = $this->_fetch($ids[0]);
|
|
if (!$html) {
|
|
return array("list" => array());
|
|
}
|
|
|
|
$metaImg = "";
|
|
$metaMatch = array();
|
|
if (preg_match('/<meta[^>]*property="og:image"[^>]*content=["\']([^"\']+)["\']/', $html, $metaMatch)) {
|
|
$metaImg = $metaMatch[1];
|
|
}
|
|
|
|
$metaDesc = "";
|
|
if (preg_match('/<meta[^>]*property="og:description"[^>]*content=["\']([^"\']+)["\']/', $html, $metaMatch)) {
|
|
$metaDesc = $metaMatch[1];
|
|
}
|
|
|
|
$name = "";
|
|
$h1Match = array();
|
|
if (preg_match('/<h1[^>]*>(.*?)<\/h1>/s', $html, $h1Match)) {
|
|
$name = trim(strip_tags($h1Match[1]));
|
|
}
|
|
|
|
$playUrl = "";
|
|
$m = array();
|
|
if (preg_match('/src=["\'](https?:\/\/(?:[^"\']*(?:d000d|doood|myvidplay)\.[a-z]+)\/e\/[a-zA-Z0-9]+)/i', $html, $m)) {
|
|
$playUrl = $m[1];
|
|
} else {
|
|
$iframeMatch = array();
|
|
if (preg_match('/<iframe[^>]*src=["\']([^"\']*\/e\/[^"\']+)["\']/', $html, $iframeMatch)) {
|
|
$playUrl = $iframeMatch[1];
|
|
}
|
|
}
|
|
|
|
$vodPlayUrl = $playUrl ? 'HD$' . $playUrl : '无资源$#';
|
|
$result = array(
|
|
"list" => array(
|
|
array(
|
|
"vod_id" => $ids[0],
|
|
"vod_name" => $name,
|
|
"vod_pic" => $metaImg,
|
|
"vod_content" => $metaDesc,
|
|
"vod_play_from" => "文艺复兴",
|
|
"vod_play_url" => $vodPlayUrl
|
|
)
|
|
)
|
|
);
|
|
return $result;
|
|
}
|
|
|
|
public function searchContent($key, $quick = false, $pg = 1) {
|
|
return $this->_get_list($this->host . "/page/" . $pg . "/?s=" . urlencode($key), intval($pg));
|
|
}
|
|
|
|
public function playerContent($flag, $id, $vipFlags = array()) {
|
|
if ($flag == 'myvidplay' || strpos($id, 'myvidplay') !== false || strpos($id, 'd000d') !== false || strpos($id, 'doood') !== false) {
|
|
return $this->_resolve_myvidplay($id);
|
|
}
|
|
return array("parse" => 1, "url" => $id, "header" => $this->customHeaders);
|
|
}
|
|
}
|
|
|
|
(new Spider())->run();
|
|
|