2012-12-17 36 views
2

我正在尋找一種方法來創建功能,類似於當您發佈鏈接到Facebook中已有的網站時。如果這個陳述很模糊,我會盡量詳細說明。一種實現Facebook的鏈接共享功能的方式

當你貼上你的鏈接,並提交您的文章,FACEBOOK與你一起鏈接給頁面的預覽小,你要留言(文字,可以是一個小圖像)

什麼是實現這一目標的途徑?

我讀了類似的post,但事情是,我不需要太多的圖像,文字就足夠了。

使用PHP,但語言並不重要,因爲我正在尋找一個高層次的想法。 以前我在考慮用cURL解析鏈接的內容,但問題是,在很多情況下,facebook返回的文本在頁面上不可用。

還有其他方法嗎?

回答

1

從我所知道的,Facebook從鏈接頁面上的meta name="description"標記的內容屬性拉。

如果沒有元描述標籤可用,它似乎從第一段<p>標籤開始拉它可以在頁面上找到它。

從頁面上的可用<img>標籤中提取圖像,並從發佈時提供輪播選擇。

最後,鏈接子文本也是用戶可編輯的(啓動狀態更新,包含鏈接,然後單擊顯示的鏈接子文本區域)。

就我個人而言,我會走這樣的路線:捲曲頁面,解析它的元標記描述,如果不是使用基本算法或僅僅是第一段標記抓取一些可能的數據,然後允許用戶編輯任何(對用戶更友好,同時也解決了用戶代理的不同回報問題)。將用戶作爲ajax面對控件,以便在您的網站訪問您想要預覽的鏈接所需時間不長的情況下不會出現問題。

我建議你使用DOM庫(你甚至可以使用DOM文檔,如果你熟悉它,並知道如何處理可能畸形的HTML頁面),而不是正則表達式解析頁面爲<meta><p>,並有可能也<img>標籤。建立一個正則表達式,能夠正確處理所有可能遇到的「野外」與從已知網站中遇到的所有無數種不同情況,都可能會變得非常粗糙。通常會推薦QueryPath,並且有覆蓋many of the available options的stackoverflow線程。

大多數現代網站,尤其是大型網站,都擅長填充元描述標籤,尤其是動態生成的網頁。

您也可以爲<img>標籤刮取頁面,但您需要在本地託管這些圖像:您可以託管所有圖像,然後刪除除選擇的圖像之外的所有圖像,也可以託管縮略圖(假設您安裝並打開了圖像處理庫)。你選擇哪一個取決於帶寬和存儲是否更重要,或者是一次性處理運行imagecopyresampledimagecopyresized,Gmagick::thumbnailimage等等(選擇你手邊/你喜歡的任何東西)。你不想熱鏈接到頁面上的圖像,這是因爲它在帶寬方面的道德性,尤其是在鏈接任何網站與熱鏈接預防(引用/等方法)時可能導致破碎的圖像,或者從到期/等我個人可能會去存儲縮略圖。

如果您想要最終刪除您自己的服務器上的圖像/縮略圖文件,您可以將整個鏈接實體作爲處理到期/ etc等的對象進行打包。自從你提出了一個高層次的想法以來,我會將特定的實施留給你。

但事情是,在很多情況下,facebook返回的文本在頁面上不可用。

你看過頁面的meta標籤嗎?到目前爲止,我已經測試了幾頁,這通常是在呈現的鏈接頁面上不可見的內容來自哪裏,並且似乎是Facebook算法的首選。

0

前期充分披露,我是開發人員ThumbnailApp.com

這是一個帶有可選Javascript SDK的JSON API服務,我認爲它完全符合您的要求:它將解析字符串以檢測任何URL並返回資產的標題,描述和縮略圖。如果頁面具有OpenGraph標記,則它將使用這些圖像縮略圖。目前它正處於私人測試階段,但我們每週都會增加更多帳戶。

如果你覺得你真的需要做它自己的解決方案:

結帳蟒蛇基於Webkit2Png和模擬瀏覽器PhantomJs。他們可以將網頁渲染到圖像上(默認大小爲800x600),那麼您必須編寫一些代碼來調整圖像大小並裁剪圖像,例如提到的taswyn。理想情況下,您可以將調整大小的圖像上傳到Amazon S3,然後將其託管在CDN(如CloudFront)上。

要獲得標題和說明,請先獲取URL內容(cURL或其他),然後您需要檢查content-type標題以確保它是網頁。如果是,則可以使用HTML解析器(如SimpleHTMLDOM PHP庫)來獲取標題和描述元數據。如果你想要的確如Facebook一樣,你還需要檢查任何OpenGraph標籤,特別是og:image標籤。

也別忘了緩存。第一個渲染和描述解析可能需要很長時間。即使您的網站速度很快,您渲染的網頁速度可能會很慢,最好的方法是渲染/解析一次,然後保存並返回調整後的圖像和元數據以用於後續請求。根據您的要求,您可能需要每隔一小時刷新一次緩存的數據,否則您可能每天都會刷新一次。

要做到這一點,你自己需要相當多的工作和大量的服務器配置。我覺得使用第三方服務是更好的方式,但顯然我有偏見的意見:)