レ点腫瘍学ノート

Toppukiwikiカスタマイズ箇所自作プラグイン

tweet.inc.php

pukiwiki プラグイン

b723fa4260.png

PukiwikiにTwitterの単体のツイートを埋め込むだけのプラグインです。現在ver2.3が最新版です。

GitHub - m0370/pukiwiki_tweet
Contribute to m0370/pukiwiki_tweet development by creating an account on GitHub.
https://github.com/m0370/pukiwiki_tweet

TLの複数のツイートを埋め込んだり検索結果を表示するような高度な機能は備えていません。JavaScriptを利用しているので自分のpukiwikiサーバにはほとんど負荷をかけません。自分のpukiwikiを「はてなダイアリー」的なブログのように利用するために自作して自分だけで使っていたプラグインですが、せっかく作ったので公開しておきます。

pukiwiki 1.5.4およびPHP 7.0〜PHP 8.3で動作することを確認しています。(v2.6)

ライセンス

ver2.3

ver2.1までの変更点

ver1.0と比べての変化点は、TwitterのサイトからJSONでツイート内容を取得してキャッシュしておく機能が付いた点です。また、ver2.0からver2.1に変わるときにキャッシュファイルの形式を変更しました(拡張子も.datから.txtに変更し、互換性はありません)。

ver2.2の変更点

https://platform.twitter.com/widgets.jsを遅延読み込みで呼び出す方法を、lazysizes.jsを使わずにこのプラグイン単独で対応しています。

具体的には初回スクロール(scroll)または初回マウス移動(mousemove)で発火するjavascriptを使ってwidget.jsを読み込んでいます。このjavascriptはスキンの$head_tagの中に配置するようにしています。初回スクロールで発火するjavasriptは下記のサイトを参考にさせていただきました。なお、widgets.jsをpreloadで読み込むようにすることでさらに高速化が図れます。

JavaScriptファイルをスクロール発火で遅延読み込みさせる方法 | q-Az
JavaScriptのファイル自体を遅延読み込みする方法は色々ありますが、マウスのスクロールに反応してファイルを遅延読み込みさせる方法です。スクロールされることでファイル自体が初めて読み込まれるためファーストビューでそのJavaScriptコードは実行されません。結果としてファーストビューでの速度改
https://q-az.net/lazy-load-script/

ver2.3の変更点

第2引数以降の引数にnoimgまたはnoconvとつけると、それぞれ画像を非表示にしたりリプライツイートのスレッドを非表示にできます。両方を併用することもできます。

ver2.4の変更点

不安定な挙動を微修正しました。遅延読み込みを使用しない場合も複数ツイートを同一ページに貼り付けるとその回数分だけ呼び出していたwidget.jsの呼び出しを、ページごとに1度だけにするようにしました。

ver2.6の変更点

Release v2.6 · m0370/pukiwiki_tweet
ツイートIDの抽出の改善 TwitterからX.comへの変更への対応
https://github.com/m0370/pukiwiki_tweet/releases/tag/v2.6

X(旧Twitter)へのサービス名称変更に合わせて、埋め込み用URLを x.com ドメインに更新しました。また、URLからツイートIDを取得する処理を改善し、より古いツイートでも認識できるようになりました。

ちなみに、このver2.6への変更はchatGPT Plusで利用できるcodexを使って実施しました。プラグインの中身は手打ちでは一切触っていません(VS code自体を開いていません!)。生成AIで何でもできる時代ですね!

しくみ

Twitter Publishで発行されるHTMLタグを出力するだけなので単純な構造です。プラグインの第1引数にツイートIDかツイートのURLのどちらかを記載します。これによって、旧版ver1.0ではフォールバックを記載しておくことができましたが、ver2.0以降ではJSONキャッシュから自動でフォールバックが作成されます。

#tweet(1375069974583074816) // ツイートIDを書く場合
#tweet(https://twitter.com/m0370/status/1375069974583074816) // ツイートURLを書く場合

上記のように記載すれば、下記のようなツイートが表示されます。

Twitter #この7文字を見ただけで心ときめく人がRTしてくれる

— レ点.bot💉💊🧬 (@m0370) March 25, 2021

昔すぎるツイートは読み込めません

ツイートのURLでもツイートIDでも使用できるようにしていますが、ツイートIDかどうかを判定するところを暫定的に9桁で判定しているので、非常に昔のツイート(ツイートIDが8桁以下だった時代)のツイートは読み込めません。

ぼくがTwitterを始めた2007年6月の時点ですでにツイートIDは9000万台なので、ツイートIDが8桁と言えば2007年夏頃までの古いツイートでしょうか…(ちなみに当時のTwitterはまだインターフェイスが日本語化されておらず非常にマイナーでした)。

Twitter #この7文字を見ただけで心ときめく人がRTしてくれる

— レ点.bot💉💊🧬 (@m0370) March 25, 2021

プラグインの中身(ver2.6)

githubに公開しました。(2021.12)

GitHub - m0370/pukiwiki_tweet
Contribute to m0370/pukiwiki_tweet development by creating an account on GitHub.
https://github.com/m0370/pukiwiki_tweet

filetweet_26.inc.php

<?php
// ver1.0 初期バージョン
// ver2.0 JSON取得してキャッシュする。widgets.jsはローカルに置くようにした。
// ver2.1 データ保管方式を .datから.txtに変更、ブラウザのnative loading="lazy"などに対応
// ver2.2 lazysizes.jsなしでの遅延読み込みに対応
// ver2.3 第2引数以降の引数にnoimgまたはnoconvとつけると、それぞれ画像を非表示にしたりリプライツイートのスレッドを非表示にできます。両方を併用することもできます。
// ver2.6 埋め込みURLのドメイン変更とツイートID取得処理を改善

define('PLUGIN_TWEET_LAZYLOAD', FALSE); // 初回スクロールに反応しての遅延読み込みを有効にするにはTRUEに、使っていないならFALSEに
define('PLUGIN_TWEET_JSURL', 'https://platform.twitter.com/widgets.js'); //デフォルトは https://platform.twitter.com/widgets.js

// 指定された文字列からツイートIDを取得する
function plugin_tweet_get_id($str)
{
    if (preg_match('/(?:https?:\/\/)?(?:x\.com|twitter\.com)\/[^\/]+\/status(?:es)?\/(\d+)/i', $str, $m)) {
        return $m[1];
    }
    if (preg_match('/^\d+$/', $str)) {
        return $str;
    }
    return '';
}

function plugin_tweet_convert()
{
        global $head_tags;
        $tw = func_get_args();
        $tweetid = plugin_tweet_get_id($tw[0]); //URLからもツイートIDからも取得
        if ($tweetid === '') return '';
       $tweeturl = 'https://x.com/user/status/' . $tweetid ;
	$datcache = CACHE_DIR . 'tweet/' . $tweetid . '.txt';

	//オプション設定
	$options = array(
		CURLOPT_SSL_VERIFYPEER => false,
		CURLOPT_RETURNTRANSFER => true,
		CURLOPT_TIMEOUT => 3 //タイムアウト(秒)
	);

	if(file_exists($datcache)){
		//キャッシュがある場合
		$json = file_get_contents($datcache);
		$arr = json_decode($json, true);
		$html = html_entity_decode($arr['html']);
	} else {
		//キャッシュがない場合
		$json_url = 'https://publish.twitter.com/oembed?maxwidth=550&dnt=true&url='. urlencode($tweeturl);
		$ch = curl_init($json_url);
		curl_setopt_array($ch, $options);
		$json = curl_exec($ch);
		$arr = json_decode($json, true);
		curl_close($ch);

		if ($arr === NULL) {
			//json取得失敗
                       $html = '<blockquote class="twitter-tweet"><a href="https://x.com/user/status/' . $tweetid . '">' . $tw[1] . '</a></blockquote>';
		} else {
			//json取得成功
			$html = html_entity_decode($arr['html']);
			//キャッシュする
			file_put_contents($datcache, $json);
		}
	}

	if (PLUGIN_TWEET_LAZYLOAD) {
		//scriptをlazyloadに置換
		$twjs1 = '<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>';
		$twjs2 = '';
		$twjs3 = '<script>function lazyLoadScript(scriptSrc) {var scrollFirstTime = 1;window.addEventListener("scroll", oneTimeFunction, false);window.addEventListener("mousemove", oneTimeFunction, false);function oneTimeFunction() {if (scrollFirstTime === 1) {scrollFirstTime = 0;var adScript = document.createElement("script");adScript.src = scriptSrc;document.body.appendChild(adScript);window.removeEventListener("scroll", oneTimeFunction, false);window.removeEventListener("mousemove", oneTimeFunction, false);}}}lazyLoadScript("' . PLUGIN_TWEET_JSURL . '");</script>';
		$html = str_replace($twjs1, $twjs2, $html);
		if( !in_array($twjs3, $head_tags, true)) {
			$head_tags[] = $twjs3 ;
		}
	}

	if( in_array('noimg', $tw)){
		$twjs4 = 'class="twitter-tweet"';
		$twjs5 = 'class="twitter-tweet" data-cards="hidden"'; //画像非表示
		$html = str_replace($twjs4, $twjs5, $html);
	}

	if( in_array('noconv', $tw)){
		$twjs6 = 'class="twitter-tweet"';
		$twjs7 = 'class="twitter-tweet" data-conversation="none"'; //リプライを非表示
		$html = str_replace($twjs6, $twjs7, $html);
	}
	return <<<EOD
	$html
	EOD;
}
?>

旧版はこちら

tweet.inc.php_ver2.2 - レ点腫瘍学ノート
PukiwikiにTwitterの単体のツイートを埋め込むだけのプラグインです。ツイートが読み込めないときのフォールバックを設定できます。遅延読み込みにも対応しています。
tweet.inc.php_ver2.1 - レ点腫瘍学ノート
PukiwikiにTwitterの単体のツイートを埋め込むだけのプラグインです。ツイートが読み込めないときのフォールバックを設定できます。遅延読み込みにも対応しています。
tweet.inc.php_ver2.0 - レ点腫瘍学ノート
PukiwikiにTwitterの単体のツイートを埋め込むだけのプラグインです。ツイートが読み込めないときのフォールバックを設定できます。遅延読み込みにも対応しています。
tweet.inc.php_ver1.0 - レ点腫瘍学ノート
PukiwikiにTwitterの単体のツイートを埋め込むだけのプラグインです。ツイートが読み込めないときのフォールバックを設定できます。遅延読み込みにも対応しています。

この記事に対するコメント

このページには、まだコメントはありません。

お名前:


添付ファイル: filetweet_26.inc.php 414件 [詳細] filetweet_23.inc.php 1064件 [詳細] filetweet_22.inc.php 666件 [詳細]

更新日:2025-07-19 閲覧数:2165 views.