👀
ElixirでFlokiを使ってURLからOGPの値を取得する
ritouです。
OGPを設定する方じゃなくて読む方のやり方です。
HTMLをゴニョるのにこれを使います。
# HTMLを取得
iex(1)> {:ok, %HTTPoison.Response{body: body}} = HTTPoison.get("https://www.youtube.com/watch?v=gsT6eKsnT0M")
{:ok,
%HTTPoison.Response{
body: "...",
...}}
# Flokiでparseする
iex(2)> {:ok, document} = Floki.parse_document(body)
{:ok,
[
{"html",
[
{"style", "font-size: 10px;font-family: Roboto, Arial, sans-serif;"},
{"lang", "ja-JP"}
],
[
{"head", [],
[
{"meta", [{"http-equiv", "X-UA-Compatible"}, {"content", "IE=edge"}],
[]},
...
# metaタグでひっかけた結果からOGP関連の値で必要な物を抜き出す
iex(3)> Floki.find(document, "meta") |> Enum.filter(fn {_, data, []} -> length(data) == 2 end) |> Enum.filter(fn {_, [{_, tag}, {_, _}], []} -> tag in ["og:url", "og:title", "og:image", "og:image:width", "og:image:height"] end)
[
{"meta",
[
{"property", "og:url"},
{"content", "https://www.youtube.com/watch?v=gsT6eKsnT0M"}
], []},
{"meta",
[
{"property", "og:title"},
{"content", "DISH// (北村匠海) - 猫 / THE FIRST TAKE"}
], []},
{"meta",
[
{"property", "og:image"},
{"content", "https://i.ytimg.com/vi/gsT6eKsnT0M/maxresdefault.jpg"}
], []},
{"meta", [{"property", "og:image:width"}, {"content", "1280"}], []},
{"meta", [{"property", "og:image:height"}, {"content", "720"}], []}
]
良さそう。
Discussion