php - 可用于从 url 获取 og:image 但在特定文件上失败的 PHP 脚本
问题描述
您好,我正在尝试在 php 中构建一个自定义脚本,以获取数组中的 og:image 属性,然后打印出特定的结果。我使用了以下代码
<?php
$_URL = $_GET['url']; //getting the url from THE url value
function getSiteOG( $url, $specificTags=0 ){
$doc = new DOMDocument();
@$doc->loadHTML(file_get_contents($url));
$res['title'] = $doc->getElementsByTagName('title')->item(0)->nodeValue;
foreach ($doc->getElementsByTagName('meta') as $m){
$tag = $m->getAttribute('name') ?: $m->getAttribute('property');
if(in_array($tag,['description','keywords']) || strpos($tag,'og:')===0) $res[str_replace('og:','',$tag)] = $m->getAttribute('content');
}
return $specificTags? array_intersect_key( $res, array_flip($specificTags) ) : $res;
}
$_ARRAY = getSiteOG("$_URL");
echo $_ARRAY['image'];
?>
当与以下语法一起使用时,例如在我们的网站上
tags.php?url=http://www.stackoverflow.com
它打印出以下结果
https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon@2.png?v=73d79a89bded
这是可以接受的。
该脚本正在使用以下方法在批处理文件上运行
@echo off
PowerShell -Command "(new-object net.webclient).DownloadString('http://yoursite.com/tags.php?url=https://www.banggood.com/TKEXUN-M2-Flip-Phone-2800mAh-3_0-inch-Touch-Screen-Blutooth-FM-Dual-Sim-Card-Flip-Feature-Phone-p-1367504.html')"
PowerShell -Command "(new-object net.webclient).DownloadString('http://yoursite.com/tags.php?url=https://www.banggood.com/Xiaomi-Mi-9T-Pro-Global-Version-6_39-inch-48MP-Triple-Camera-NFC-4000mAh-6GB-64GB-Snapdragon-855-Octa-core-4G-Smartphone-p-1547570.html?ID=564486&cur_warehouse=HK')"
PowerShell -Command "(new-object net.webclient).DownloadString('http://yoursite.com/tags.php?url=https://www.banggood.com/OnePlus-7-6_41-Inch-FHD-AMOLED-Waterdrop-Display-60Hz-NFC-3700mAh-48MP-Rear-Camera-8GB-256GB-UFS-3_0-Snapdragon-855-Octa-Core-4G-Smartphone-p-1499559.html?ID=62208216150349&cur_warehouse=HK')"
这反过来会在屏幕上打印出结果链接,或者当通过管道将文件传输到文件时, 它也适用于另一个批处理脚本上的文件上的 url 列表,但现在没关系
我遇到的问题是
当我尝试从 gearbest 网站获取 og:image 链接时,例如这个
https://www.gearbest.com/headsets/pp_009839056462.html
我没有结果!!!
我已经运行了简单的命令,例如标头wget -qO- url
或curl -I url
标头,结果是它与我的 php 在 SSL 端的编译方式甚至卷曲方式有关。我在这里读到一些网站需要更新的安全 ssl 等。
需要注意的是,我还尝试通过即时更改用户代理和其他 cookie 相关值来伪装wget 请求,但仍然没有成功。
我在一个共享主机上,在一个被监禁的 shell 上具有 shell 访问权限,但有许多二进制工具,sed/awk/wget/curl 等,并且主机站点通过添加我可能需要的二进制文件来帮助我解决我的问题,但仍然我不知道该怎么做。
任何帮助是极大的赞赏
解决方案
您可能由于您的用户代理而被阻止。我也尝试了 curl to gearbest,并得到 403 权限被拒绝错误。Akamai 似乎阻止了此用户代理。
但是当我使用类似的东西curl -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (K HTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" URL
时效果很好。
推荐阅读
- javascript - 在 java 和 javascript 之间共享文件与数据的安全方法
- amazon-ec2 - 使用带有 terraform 的 IAM 角色创建 ec2 实例失败
- python - TensorFlow框架中如何清除某一层的GPU内存?
- javascript - 在 Javascript 中通过 C# 生成电子商务信息
- javascript - javascript:对象数组循环
- c# - 异步编程,在 IIS 上挂起,但在 IIS Express 中运行正常
- json - Flutter:执行 http.put 请求并更改 JSON/API 中的字符串状态
- azure-virtual-machine - 无法在 VM 上安装 terraform 扩展
- dotnetnuke - 2sxc TimelineJS 缩略图失败?PagePeeker.com API 问题?
- html - VueJS - 调用多个图像 src 作为自定义道具