【发布时间】:2021-03-21 13:18:25
【问题描述】:
我正在尝试使用我自己的服务器测试针对我自己的网站的抓取设置,但是当我这样做时,我从 WPRobot 收到错误消息,提示“错误:插入帖子失败。无法在“/home/myapp”中创建附件文件/public_html/wp-content/uploads/2021/03/162153879_434009211024473_384527521975744737_n.jpg“请设置正确的权限。”如果源不允许其他站点使用 curl 请求复制其内容,我通常会收到此通知。为了解决这个问题,我设置了一个 Puppeteer 脚本,通过在源网站(在本例中为 Instagram)上截取图像文件的屏幕截图来充当代理,但现在我在尝试从我自己的 IIS 服务器下载屏幕截图时遇到了同样的错误。
我没有在我的服务器上添加任何内容,以防止任何人从中卷曲图像文件。事实上,最近有几个站点托管在同一台服务器上。 WPRobot 从那些下载任何图像从来没有问题。除了在删除旧网站后将 Node.js 应用程序上传到默认网站目录之外,我没有进行任何更改,以便在几天后我的主机帐户被暂停之前使用此服务器测试应用程序。
什么会导致无法通过默认网站上的 curl 访问 IIS 10 服务器上的图像?这是 WPRobot 声称未设置正确权限的示例图像http://85.17.219.113/images/2021/3/505648a2-3404-c3e6-618f0fa50fd3.jpg?这可能是由于使用 IP 地址而不是域名造成的吗?文件名的长度可能是个问题吗?
另外:图片大小只有 92kb。我提到这一点是因为我在尝试下载大文件时遇到了 WPRobot 显示相同错误的问题,但该文件远不足以触发该问题。
更新:这似乎是 PHP 中的 file_get_contents 和/或 file_put_contents 的问题,而不是 curl。例如,以下会导致错误:
$page = file_get_contents('http://85.17.219.113/images/2021/3/505648a2-3404-c3e6-618f0fa50fd3.jpg');
try{
file_put_contents('test.jpg', file_get_contents($page));
echo 'file downloaded';
}catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
该代码不会创建文件,也不会回显错误消息,但是当我打开错误报告时,我得到了这个:
Fatal error: Uncaught ValueError: file_get_contents(): Argument #1 ($filename) must not contain any null bytes in C:\xampp\apps\wordpress\htdocs\sources\test.php:16 Stack trace: #0 C:\xampp\apps\wordpress\htdocs\sources\test.php(16): file_get_contents('\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01\x01\x00\x00...') #1 {main} thrown in C:\xampp\apps\wordpress\htdocs\sources\test.php on line 16
我无法解释这个错误。该 URL 如何转换为具有空字节的文件名?
这可以很好地下载图像:
$url = 'http://85.17.219.113/images/2021/3/505648a2-3404-c3e6-618f0fa50fd3.jpg';
// Image path
$img = 'test.jpg';
// Save image
$ch = curl_init($url);
$fp = fopen($img, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
现在我需要在 WPRobot 中找到用于缓存图像并将其保存到文件系统的函数。有谁知道该功能在 WPRobot 中的位置?很高兴知道该插件是如何保存图像的。
【问题讨论】:
-
这可能与 curl 无法使用 javascript 有关吗?我刚刚意识到,即使可以通过 XML 文件访问 RSS 提要,我也必须将特殊代码添加到我的 server.js 文件中,以使其加载 XML 和图像文件。否则它只会加载 server.js。这让我感到震惊,因为我以前从未见过物理文件存在这样的问题。难道是让 server.js 创建 XML 文件使其无法读取 curl,如果是这样,我如何让服务器在 server.js 之前加载物理字段?
-
也许更好的问题是如何更改 node.js 站点的加载顺序,以便在 javascript 文件之前加载某些类型的文件。例如 .xml 和 .jpg 在任何 .js 文件之前加载。
-
我尝试从 RSS 项目的描述字段中删除图像,以查看问题是否只是图像或一般的 XML 文件。奇怪的结果是,尽管加载提要并在其中找不到任何内容,但我仍然收到与图像文件相关的错误。也许 WPRobot 正在尝试自行抓取提要的缓存版本?
-
感谢上帝(如果有宗教信仰,我会这么说)!我刚刚在我的 PC 上运行了一个 curl 测试,并且能够获取整个 XML 文件,所以显然这不是问题所在。我真的很担心一秒钟。
-
在我的本地机器上使用 PHP 中的 curl 运行测试并将结果打印为回显会导致人们期望这样做的所有随机胡言乱语。也许 WPRobot 没有为图像使用 curl。也许他们正在使用 file_get_contents?
标签: php wordpress web-scraping iis