如何从返回 403 Forbidden 的网站获取 URL in PHP 的标题
How to get title from URL in PHP from sites returning 403 Forbidden
我正在尝试使用此代码获取 PHP 中几页的标题。它几乎适用于每个 link 除了少数,例如 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);
呼应
Attention Required! | Cloudflare
这似乎受到 Cloudflare 机器人验证页面的保护。但是当我尝试在任何社交网络上 post 这个 link 时,他们能够获得标题和所有需要的元数据。怎么可能?
编辑:
即使我使用 opengraph.io API,我得到:
"root":{
"error":{
"code": 2005
"message": "Got 403 error from server."
}
}
您可以使用 Facebook 的图表 API。
https://graph.facebook.com/v7.0/?fields=og_object&id=https://9gag.com/gag/avPBX3b
JSON 输出:
{
"og_object": {
"id": "994417753967326",
"description": "More memes, funny videos and pics on 9GAG",
"title": "32 Places People Have Mispronounced Their Entire Life",
"type": "article",
"updated_time": "2020-06-12T15:54:27+0000"
},
"id": "https://9gag.com/gag/avPBX3b"
}
您可以阅读更多关于它的用法 here。
只需替换代理字符串,它应该可以正常工作,来自:
$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 已启用验证码验证,因此这很容易绕过它。我对这里的安全性感到困惑,但这超出了这个问题的范围
我正在尝试使用此代码获取 PHP 中几页的标题。它几乎适用于每个 link 除了少数,例如 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);
呼应
Attention Required! | Cloudflare
这似乎受到 Cloudflare 机器人验证页面的保护。但是当我尝试在任何社交网络上 post 这个 link 时,他们能够获得标题和所有需要的元数据。怎么可能?
编辑:
即使我使用 opengraph.io API,我得到:
"root":{
"error":{
"code": 2005
"message": "Got 403 error from server."
}
}
您可以使用 Facebook 的图表 API。
https://graph.facebook.com/v7.0/?fields=og_object&id=https://9gag.com/gag/avPBX3b
JSON 输出:
{
"og_object": {
"id": "994417753967326",
"description": "More memes, funny videos and pics on 9GAG",
"title": "32 Places People Have Mispronounced Their Entire Life",
"type": "article",
"updated_time": "2020-06-12T15:54:27+0000"
},
"id": "https://9gag.com/gag/avPBX3b"
}
您可以阅读更多关于它的用法 here。
只需替换代理字符串,它应该可以正常工作,来自:
$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 已启用验证码验证,因此这很容易绕过它。我对这里的安全性感到困惑,但这超出了这个问题的范围