ElixirでFlokiを使ってURLからOGPの値を取得する

1 min read読了の目安(約1400字

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"}], []}
]

良さそう。