首页 > 解决方案 > 可用于从 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- urlcurl -I url标头,结果是它与我的 php 在 SSL 端的编译方式甚至卷曲方式有关。我在这里读到一些网站需要更新的安全 ssl 等。

需要注意的是,我还尝试通过即时更改用户代理和其他 cookie 相关值来伪装wget 请求,但仍然没有成功。

我在一个共享主机上,在一个被监禁的 shell 上具有 shell 访问权限,但有许多二进制工具,sed/awk/wget/curl 等,并且主机站点通过添加我可能需要的二进制文件来帮助我解决我的问题,但仍然我不知道该怎么做。

任何帮助是极大的赞赏

标签: phparrayspowershellopensslfacebook-opengraph

解决方案


您可能由于您的用户代理而被阻止。我也尝试了 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时效果很好。


推荐阅读