php - 如何从返回 403 Forbidden 的站点中的 PHP 中的 URL 获取标题
问题描述
我正在尝试使用此代码在 PHP 中获取几页的标题。它适用于几乎所有链接,除了少数链接,例如 9gag。
function download_page($url)
{
$agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
return $data;
}
function get_title_tag($str)
{
$pattern = '/<title[^>]*>(.*?)<\/title>/is';
if(preg_match_all($pattern, $str, $out))
{
return $out[1][0];
}
return false;
}
$url = "https://9gag.com/gag/avPBX3b";
$data = download_page($url);
echo $extracted_title = get_title_tag($data);
它呼应
需要注意!| Cloudflare
这似乎受到 Cloudflare 机器人验证页面的保护。但是当我尝试在任何社交网络上发布此链接时,他们可以获得标题和所需的所有元数据。这怎么可能?
编辑:
即使我使用 opengraph.io API,我也会得到:
"root":{
"error":{
"code": 2005
"message": "Got 403 error from server."
}
}
解决方案
只需替换代理字符串,它应该可以正常工作,来自:
$agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36';
至:
$agent = 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)';
如果存在标准代理字符串,我看到 CloudFlare 已启用验证码,因此这很容易绕过它。我对这里的安全性感到困惑,但这超出了这个问题的范围
推荐阅读
- curl - 如何在 ETH(Web3 或 Curl 方法)中发送内部交易?
- laravel - Laravel 混合获取 Eloquent 急切加载嵌套多个模型
- amazon-web-services - OpsGenie Cloudwatch 集成与传入 SNS 集成
- c++ - 创建自己的整数类
- java - Java:类型转换是否会在运行时导致操作?
- java - 直接从 zip 文件中读取特定子目录 [Java]
- javascript - 如何避免双击不同的按钮?
- curl - 如何使用 cURL 从亚马逊 S3 存储桶中删除文件
- python - matplotlib 轴的 relim(嵌入在 pyqt 中)不起作用是我之前放大的
- rest - Airflow REST API - 如何获取已执行任务的历史记录?