declare(strict_types=1); header('Content-Type: application/json; charset=utf-8'); function http_get(string $url, int $timeout = 18, string $lang = 'ja-JP,ja'): array { $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => $timeout, CURLOPT_ENCODING => '', CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36', CURLOPT_HTTPHEADER => [ 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: ' . $lang, 'Cache-Control: no-cache', ], CURLOPT_PROXY => jp_pick_proxy(), ]); $html = curl_exec($ch); $http = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return [$http, (string)$html]; } function clean_text(string $s): string { $s = html_entity_decode(strip_tags($s), ENT_QUOTES | ENT_HTML5, 'UTF-8'); $s = preg_replace('/[\r\n\t]+/u', ' ', $s); $s = preg_replace('/\s{2,}/u', ' ', $s); return trim((string)$s); } function getFirst(string $pattern, string $html): string { if (preg_match($pattern, $html, $m)) { return clean_text($m[1]); } return ''; } function is_generic_zen(string $title, string $desc): bool { $badTitles = ['Ähnliche Artikel', 'سلع مشابهة', 'よく似た商品', 'Artikelbezeichnung']; foreach ($badTitles as $b) { if (mb_stripos($title, $b) !== false) return true; } // Generic marketing blurbs in different languages $badSnips = [ 'ZenMarketは海外', 'ZenMarket は海外', // ja 'ZenMarket ist der', // de 'ZenMarket هي أفضل', // ar 'ZenMarket is the best' // en ]; foreach ($badSnips as $s) { if (mb_stripos($desc, $s) !== false) return true; } return false; } $url = $_GET['url'] ?? ''; $code = $_GET['itemCode'] ?? ''; if ($url && !$code && preg_match('/(?:itemCode|item_id)=([A-Za-z0-9_]+)/', $url, $m)) { $code = $m[1]; } if (!$url && $code) { // force the Japanese page $url = "https://zenmarket.jp/ja/mercariproduct.aspx?itemCode={$code}"; } $result = [ 'success' => false, 'http' => 0, 'route' => '', 'url' => $url, 'title' => '', 'description'=> '', 'raw_len' => 0, ]; if (!$url) { $result['error'] = 'missing url or itemCode'; echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); exit; } // 1) Try ZenMarket (Japanese) [$http, $html] = http_get($url, 18, 'ja-JP,ja'); $result['http'] = $http; $result['route'] = 'zen'; $result['url'] = $url; $result['raw_len'] = is_string($html) ? strlen($html) : 0; $title = ''; $desc = ''; // Typical ZenMarket selectors $title = getFirst('/id=["\\\']ctl00_ContentPlaceHolder1_lblItemTitle["\\\'][^>]*>(.*?)<\\/span>/is', $html); if (!$title) $title = getFirst('/class=["\\\']product-title["\\\'][^>]*>(.*?)<\\/[^>]+>/is', $html); if (!$title) $title = getFirst('/