どのように動作し、自分でそれを行うには?
緊急かつ即時に必要な場合:oembedのようなURL情報を返す既製のサーバーを作成しました 。 作業バージョンはここで見ることができます 。
そして今、あなたは面白いオールドを引き裂くことができるポイントのために:
1. Oembed
<title>と<description>については誰もが知っていますが、これについては詳しく説明しません。
Oembedのような形式があります。 多くの大規模なポータルには、自由にoembedエンドポイントがあります。 例:
- Youtube: www.youtube.com/oembed?format=json&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DB8BNdhuABIY
- Twitter: api.twitter.com/1/statuses/oembed.json?id=655102676024369154
- SoundCloud: soundcloud.com/oembed?url=https%3A%2F%2Fsoundcloud.com%2Fharlem_fetty%2Fjugg-feat-monty&format=json
oembed情報から、htmlを解析するよりもはるかに完全なページスクイーズを取得できるため、URLを解析する際の優先事項はoembedリンクを検索することです。
これはoembed.comのパラグラフ4で説明されています 。
この種のリンクを少なくとも1つ、ページの先頭に追加する必要があります。
<link rel="alternate" type="application/json+oembed" href="http://flickr.com/services/oembed?url=http%3A%2F%2Fflickr.com%2Fphotos%2Fbees%2F2362225867%2F&format=json" title="Bacon Lollys oEmbed Profile" /> <link rel="alternate" type="text/xml+oembed" href="http://flickr.com/services/oembed?url=http%3A%2F%2Fflickr.com%2Fphotos%2Fbees%2F2362225867%2F&format=xml" title="Bacon Lollys oEmbed Profile" />
理解できるように、エンドポイントタイプはここで設定されます:xmlまたはjson。 したがって、htmlの解析時にoembedへのリンクが見つかった場合、oembed ednpointから必要な情報を取得して取得できます。 GolangのOembed解析はライブラリに実装されています 。
2.グラフを開く
これはページ上の追加メタデータであり、Google +、Facebookなどがフィードにページのコンテンツを埋め込むために使用します。 詳細はこちらをご覧ください 。 このマークアップは、Habréでさえ、膨大な数のサイトで使用されています。 たとえば、この投稿のソースを見て、「og:」を検索してください。
GolangのOpenGraph解析は、ライブラリに実装されています (ピアに比べて最も完全な機能)。
3.情報を少しずつ収集します
ページにoembedまたはopengraphがない場合、使用可能なデータに満足しています。
- <title>-タイトル用
- <メタ名= "説明">-説明
- <link rel = "image_src">-写真用
- *画像がない場合は、本文から最初の画像を切り取ります
- *説明がない場合は、メインコンテンツのテキストの一部を説明として切り取ります
コンテンツを削除するには、 github.com / dyatlov / go - readabilityを使用します。これは、元のgo- readabilityのフォークであり、ホワイトラベル属性が追加されています(これは、写真を正しく引き出すために必要です)。
これはgithub.com/dyatlov/go-htmlinfoで実装されています 。
4.非HTMLリソースのOembed生成
リンクはページだけでなく、写真やビデオ、アーカイブなどにもリンクできます。 そのようなリンクの場合、情報は当然取得できません。 したがって、自分で生成する必要があります。
Golangにはhttp#DetectContentTypeなどがあります。 この情報に基づいて、最初の数百バイトに基づいて指定されたアドレスにあるコンテンツのタイプを取得できます。 次に、コンテンツのタイプに基づいて、次の手順を実行できます。 画像の場合は、画像ヘッダーのデコードを使用し、この方法でサイズを取得し、それを応答で返します。 これらはすべて、 対応するライブラリに実装されています 。
自分を守る
タスク(明らかなものを除く):
1.リダイレクトを展開し、無限ループに陥らないようにします。 たとえば、 bit.ly / 1cWYIdCはHabrになります。 解決策
2.ローカルリソースへの攻撃に対する保護( ポケットへの攻撃を参照)。 解決策
3.限られた量の情報のみをダウンロードします(Linux ISOイメージへのリンクを取得した場合、すべてをダウンロードする必要はありません)。 解決策
おわりに
私のリポジトリと混oticとした説明への多くの参照をおpoびします。 コードを理解しやすくすると同時に、それを論理モジュールに分解し、独立して再利用できるようにしました。 これが誰かに役立つことを願っています。
完成したサーバーのソースコードはこちらです。 そして彼自身がここにいます 。
使用できるもの:コメントからのURLのURLプレビューの自動読み込み、URLを含む投稿のプレビュー付きポップアップ、およびコンテンツの表示に関連するその他のこと。