おてがるにOGPのチェッカーを作る

ちょうど先週に書いたばっかりなので。[Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/)はWebに公開済みのコンテンツしかチェックできないので困る。

異常に雑なWebアプリを作るのにPHPで秒殺できるのはよいですヾ(〃＞＜)ﾉﾞ といふか[oscarotero/Embed: Get info from any web service or page](https://github.com/oscarotero/Embed)を使ってるだけ。

## 手順

 1. 適当な場所を用意する
    * パブリックな場所でやると、踏み台にされて面倒なのでクローズドな場所でやるといいよ
    * 僕はビルトインサーバーが好きなので、それでやります
 2. Composerを入れる
    * https://getcomposer.org/download/
 3. Composerで[`embed/embed`](https://packagist.org/packages/embed/embed)を入れる
    * 独立したリポジトリでやるときは`composer require embed/embed`です
    * 今回は一時的な利用なので僕は`composer g require embed/embed`しました (本格的に運用するならおすすめしません)
 4. コードを置く (`checker.php`を下の方に用意しました)
 5. ビルトインサーバーを起動する
    * `php -S 0.0.0.0:3939 checker.php`

## コード

```checker.php
<?php

// composer global require した場合
require getenv('HOME') . '/.composer/vendor/autoload.php';
// composer require した場合
// require __DIR__ . '/../vendor/autoload.php';

use Embed\Embed;

if (isset($_GET['src'])) {
    header('Content-Type: text/plain');
    readfile(__FILE__ );
    return;
}

?>
<title>OGP Checker</title>
<meta name=”robots” content=”noindex”>
<form method="get">
    <input name="url" value="<?= h((string)($_GET['url'] ?? '')) ?>"></input>
    <button type="submit">submit</button>
</form>
<?php
if (empty($_GET['url']) || !is_string($_GET['url'] ?? '')) {
    return;
}

?>
<hr>
<?php
$info = Embed::create($_GET['url']);

$data = [
    'title' => $info->title,
    'description' => $info->description,
    'url' => $info->url,
    'type' => $info->type,
    'tags' => $info->tags,

    'images' => $info->images,
    'image' => $info->image,
    'imageWidth' => $info->imageWidth,
    'imageHeight' => $info->imageHeight,

    'code' => $info->code,
    'width' => $info->width,
    'height' => $info->height,
    'aspectRatio' => $info->aspectRatio,

    'authorName' => $info->authorName,
    'authorUrl' => $info->authorUrl,

    'providerName' => $info->providerName,
    'providerUrl' => $info->providerUrl,
    'providerIcons' => $info->providerIcons,
    'providerIcon' => $info->providerIcon,

    'publishedDate' => $info->publishedDate,
    'license' => $info->license,
    'linkedData' => $info->linkedData,
    'feeds' => $info->feeds,
];

?>
<details><summary>raw (展開)</summary>
    <pre><?= htmlspecialchars(json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), ENT_QUOTES, 'UTF-8') ?></pre>
</details>

<table border>
    <?php display($data); ?>
</table>

<?php
function h(string $s)
{
    return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}

function display(array $data)
{
    foreach ($data as $k => $v): ?>
    <tr><th><?= h($k) ?></th><td>
        <?php if (is_array($v)): ?>
            <table border>
                 <?php display($v); ?>
            </table>
<?php elseif ($k === 'url' && isset($data['mime']) && strpos($data['mime'], 'image/') === 0): ?>
            <img src="<?= h($v) ?>">
        <?php else: ?>
            <?= h(var_export($v, 1)) ?>
        <?php endif; ?>
        </td>
    <?php endforeach;
}
```

### 表示

まあ最低限の用は足りてるんじゃないですかね。READMEに書いてある項目を雑に出してるだけなので、もっと情報はとれるのかも。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/4121/1c3ed3ed-5fc9-a9ab-5d28-0f1820384047.png)

あとは見やすくなるよう、各自よしなに。