5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

ちょうど先週に書いたばっかりなので。Facebook Sharing DebuggerはWebに公開済みのコンテンツしかチェックできないので困る。

異常に雑なWebアプリを作るのにPHPで秒殺できるのはよいですヾ(〃><)ノ゙ といふかoscarotero/Embed: Get info from any web service or pageを使ってるだけ。

手順

  1. 適当な場所を用意する
    • パブリックな場所でやると、踏み台にされて面倒なのでクローズドな場所でやるといいよ
    • 僕はビルトインサーバーが好きなので、それでやります
  2. Composerを入れる
  3. Composerで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

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

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?