PHP项目:基于ASN的分支逻辑代码正确性验证
代码问题分析与修正
你的代码不符合需求,存在几个关键问题,以下是详细说明和修正方案:
核心需求不匹配问题
- 字段取错:你需要判断的是ASN信息,但代码中使用的是
$api->isp(ISP提供商名称),ip-api返回的ASN字段是$api->as,格式类似"AS1234 China Telecom"。 - 正则匹配错误:你的需求是匹配包含
telecom的ASN,但代码里正则写的是/telekom/i(拼写错误,应为telecom)。
其他代码问题
use语句位置错误:use Facebook\Webdriver;必须放在PHP文件最顶部,不能在变量定义、函数调用等执行语句之后。- 缺少API请求错误处理:如果ip-api请求失败(比如网络故障、返回无效JSON),
json_decode会返回null,直接访问$api->isp会触发致命错误。 - 冗余变量:
$useragent和$hata变量定义后未使用,可删除。 - SSL验证关闭有风险:else块中关闭了SSL证书验证,生产环境下会导致请求易被劫持,建议删除这两行。
sleep等待不可靠:if块中用sleep(1)等待页面加载,无法保证页面完全渲染,应该用WebDriver的显式等待替代。
修正后的代码示例
<?php use Facebook\WebDriver; use Facebook\WebDriver\WebDriverWait; use Facebook\WebDriver\WebDriverExpectedCondition; // 获取访客IP(依赖Cloudflare, fallback到默认REMOTE_ADDR) $ip = $_SERVER['HTTP_CF_CONNECTING_IP'] ?? $_SERVER['REMOTE_ADDR']; // 请求ip-api获取ASN信息 $apiResponse = file_get_contents("http://ip-api.com/json/{$ip}"); if (!$apiResponse) { die("无法获取IP信息"); } $api = json_decode($apiResponse); if (json_last_error() !== JSON_ERROR_NONE) { die("IP信息解析失败"); } // 判断ASN是否包含telecom(不区分大小写) if (preg_match("/telecom/i", $api->as)) { require_once __DIR__ . '/vendor/autoload.php'; $host = 'http://localhost:4444/wd/hub'; $proxyUrl = 'xx.xx.xx.xx:50100'; $capabilities = new Facebook\WebDriver\Remote\DesiredCapabilities([ Facebook\WebDriver\Remote\WebDriverCapabilityType::BROWSER_NAME => 'chrome', Facebook\WebDriver\Remote\WebDriverCapabilityType::PROXY => [ 'proxyType' => 'manual', 'httpProxy' => $proxyUrl, 'sslProxy' => $proxyUrl, ], ]); $driver = Facebook\WebDriver\Remote\RemoteWebDriver::create($host, $capabilities); $driver->get("https://xxxx.com"); $driver->manage()->window()->maximize(); // 显式等待页面加载完成(示例:等待body标签出现) (new WebDriverWait($driver, 10))->until( WebDriverExpectedCondition::presenceOfElementLocated(Facebook\WebDriver\WebDriverBy::tagName('body')) ); $page_source = $driver->getPageSource(); echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'; echo $page_source; $driver->quit(); } else { $url = "https://xxxxx.com"; $curl = curl_init($url); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $resp = curl_exec($curl); if (curl_errno($curl)) { die("请求失败:" . curl_error($curl)); } curl_close($curl); echo $resp; exit; }
内容的提问来源于stack exchange,提问作者Ahmetkaratas
相关产品推荐
相关产品推荐

