1

我正在寻找一种创建功能的方法,类似于在 facebook 中发布指向现有网站的链接。如果这个说法比较模棱两可,我会尽量详细说明。

当您粘贴您的链接并提交您的帖子时,facebook 连同您的链接会提供您正在发布的页面的小预览(文本,可能是小图片)

有什么方法可以实现这一目标?

我读了类似的帖子,但问题是我不需要那么多图片,文字就足够了。

在 PHP 中工作,但语言并不重要,因为我正在寻找一个高级别的想法。以前我在考虑用 cURL 解析链接的内容,但问题是在很多情况下,facebook 返回的文本在页面上不可用。

还有其他方法吗?

4

2 回答 2

1

据我所知,Facebook 从meta name="description"链接页面上标签的内容属性中提取。

如果没有可用的元描述标签,它似乎从<p>它可以在页面上找到的第一个段落标签的开头拉出。

图片是从<img>页面上的可用标签中提取的,在发布时可以选择轮播。

最后,链接子文本也是用户可编辑的(启动状态更新,包含链接,然后单击出现的链接子文本区域)。

就我个人而言,我会采用这样的路线:卷曲页面,解析它以获得元标记描述,如果没有使用基本算法或仅第一段标记获取一些可能的数据,然后允许用户编辑呈现的任何内容(它更友好给用户,还解决了用户代理不同回报的问题)。将面向用户的控件设置为 ajax,这样您的站点访问要预览的链接所花费的时间都不会出现问题。

我建议使用 DOM 库(如果您对它感到满意并且知道如何处理可能格式错误的 html 页面,您甚至可以使用 DOMDocument)而不是正则表达式来解析页面的<meta>,<p>和可能还有<img>标签。构建一个正则表达式可以正确处理您将在“野外”遇到的所有潜在不同情况,而不是从一组已知站点中遇到的情况可能会变得非常粗糙。通常推荐使用QueryPath,并且有涵盖许多可用选项的 stackoverflow 线程。

大多数现代网站,尤其是大型网站,都擅长填充元描述标签,尤其是对于动态生成的页面。

您也可以从页面上抓取<img>标签,但您需要在本地托管图像:您可以托管所有图像,然后删除除所选图像之外的所有图像,或者您可以托管缩略图(假设您有一个图像处理库安装并打开)。您选择哪一个取决于带宽和存储是否更重要,或者运行imagecopyresampledimagecopyresizedGmagick::thumbnailimage等的一次性处理等(选择您手头/您最喜欢的任何东西)。您不希望热链接到页面上的图像,因为它在带宽方面的道德性,特别是在链接任何具有防热链接的站点(引荐来源/等方法)时最终出现损坏图像的可能性,或者从到期/等 就个人而言,我可能会去存储缩略图。

如果您想最终删除自己服务器上的图像/缩略图文件,您可以将整个链接实体包装为处理过期/等的对象。既然你要求一个高层次的想法,我会把具体的实现留给你。

但问题是,在很多情况下,facebook 返回的文本在页面上不可用。

您是否查看过页面的元标记?到目前为止,我已经测试了几个页面,这通常是在呈现的链接页面上不可见的内容的来源,并且似乎是 Facebook 算法的首选。

于 2012-12-17T23:27:04.310 回答
0

预先全面披露,我是ThumbnailApp.com的开发人员。

这是一个带有可选 Javascript SDK 的 JSON API 服务,我认为它完全符合您的要求:它将解析一个字符串以检测任何 url 并返回资产的标题、描述和缩略图。如果页面有 OpenGraph 标签,它将使用这些标签作为图像缩略图。它目前处于私人测试阶段,但我们每周都会添加更多帐户。

如果你觉得你真的需要一个自己动手的解决方案:

查看基于 python 的Webkit2Png和无头浏览器PhantomJs。他们可以将网页呈现为图像(默认大小为 800x600),然后您必须编写一些代码来调整和裁剪图像的大小,就像 taswyn 提到的那样。理想情况下,您会将调整大小的图像上传到 Amazon S3,然后将其托管在 CloudFront 等 CDN 上。

要获取标题和描述,首先获取 URL 内容(cURL 或其他),您需要检查content-type标题以确保它是网页。如果是,您可以使用 HTML 解析器(例如SimpleHTMLDOM PHP 库)来获取标题和描述元数据。如果您希望它与 Facebook 完全一样,您还需要检查任何 OpenGraph 标签,特别是og:image标签。

也不要忘记缓存。第一次渲染和描述解析可能需要很长时间。即使您的网站速度很快,您正在渲染的网页也可能很慢,最好的方法是渲染/解析一次,然后保存并返回调整大小的图像和元数据以供后续请求。根据您的要求,您可能需要每小时刷新一次缓存数据,或者您可以每天刷新一次。

自己做这件事需要大量的工作和大量的服务器配置。我觉得使用 3rd 方服务是更好的选择,但显然我有偏见:)

于 2013-08-28T03:25:51.733 回答