我正在寻找一种创建功能的方法,类似于在Facebook上发布现有网站的链接时。如果这个陈述含糊不清,我会试着详细说明。
当您粘贴链接并提交帖子时,Facebook与您链接会给出一个小页面预览,您发帖(文字可能是一个小图片)
实现这一目标的方法有哪些?
我读过类似的post,但问题是我不需要图像那么多,文字就足够了。
使用PHP,但语言并不重要,因为我正在寻找一个高层次的想法。 以前我在考虑使用cURL解析链接的内容,但事实是在很多情况下,Facebook返回的文本在页面上不可用。
还有其他方法吗?
答案 0 :(得分:1)
据我所知,Facebook从链接页面上的meta name="description"
标记的内容属性中提取。
如果没有可用的元描述标记,它似乎从它可以在页面上找到的第一段<p>
标记的开头拉出来。
图片从页面上的可用<img>
标签中提取,并且可以在发布时选择轮播选择。
最后,链接子文本也是用户可编辑的(启动状态更新,包含一个链接,然后单击出现的链接子文本区域。)
就个人而言,我会选择这样一条路线:cURL页面,解析它以获取元标记描述,如果没有使用基本算法或仅使用第一段标记获取某些可能的数据,然后允许用户编辑所呈现的内容(它对用户更友好,也解决了用户代理的不同回报问题)。将用户面向控件作为ajax,以便您不会遇到问题,只要您的网站访问您要预览的链接。
我建议使用DOM库(如果你对它感到满意并且知道如何处理可能格式错误的html页面,你甚至可以使用DOMDocument)而不是正则表达式来解析<meta>
的页面,{ {1}},也可能是<p>
个标签。构建一个正则表达式,可以正确处理你在“狂野”中遇到的所有无数潜在的不同情况,而不是来自已知的一组网站。通常建议使用QueryPath,并且有覆盖many of the available options的堆栈溢出线程。
大多数现代网站,尤其是大型网站,都非常适合填充元描述标记,特别是对于动态生成的网页。
您也可以抓取<img>
标签的页面,但是您需要在本地托管图片:您可以托管所有图片,然后删除除所选图片以外的所有图片,或者您可以托管缩略图(假设您已安装并打开了图像处理库)。您选择哪个取决于带宽和存储是否更重要,或者是运行<img>
,imagecopyresampled
,imagecopyresized
等的一次性处理等。(选择您拥有的任何内容)手/你最喜欢的)。您不希望热链接到页面上的图像,因为它在带宽方面具有道德性,尤其是在使用热链接预防(引用/等方法)链接任何站点时,最终会出现损坏图像的可能性,或者从到期/等。我个人可能会去存储缩略图。
如果要最终删除自己服务器上的图像/缩略图文件,可以将整个链接实体作为处理到期/等的对象包装起来。自从你提出了一个高层次的想法以来,我将特别留给你。
但问题是在很多情况下,Facebook返回的文字在页面上不可用。
您是否看过该页面的元标记?到目前为止,我已经测试了几页,这通常是在呈现的链接页面上看不到的内容来源,并且似乎是Facebook算法的首选。
答案 1 :(得分:0)
预先完全披露,我是ThumbnailApp.com的开发人员。
这是一个带有可选Javascript SDK的JSON API服务,我认为这正是您所追求的:它将解析字符串以检测任何URL并返回资产的标题,描述和缩略图。如果页面有OpenGraph标签,它将使用那些用于图像缩略图。它目前处于私人测试阶段,但我们每周都会增加更多帐户。
如果您觉得自己真的需要一个自己动手的解决方案:
检查基于python的Webkit2Png和无头浏览器PhantomJs。他们可以将网页呈现为图像(默认大小为800x600),然后你必须编写一些代码来调整大小并裁剪像taswyn所提到的图像。理想情况下,您可以将调整后的图像上传到Amazon S3,然后将其托管在CloudFront等CDN上。
要获取标题和说明,请首先获取网址内容(cURL或其他内容),然后您需要检查content-type
标题以确保它是一个网页。如果是,则可以使用HTML解析器(如SimpleHTMLDOM PHP库)来获取标题和描述元数据。如果你想要像Facebook一样,你还需要检查任何OpenGraph标签,特别是og:image
标签。
另外不要忘记缓存。第一次渲染和描述解析可能需要很长时间。即使您的网站速度很快,您渲染的网页也可能很慢,最好的方法是渲染/解析一次,然后只保存并返回调整后的图像和元数据以用于后续请求。根据您的要求,您可能需要每小时刷新缓存的数据,或者您可以每天刷新一次。
自己做这件事需要花费大量的工作和大量的服务器配置。我觉得使用第三方服务是一种更好的方式,但显然我有偏见:)