OGP情報をJavaScriptで書き換えて、facebookやtwitterに反映させることができるかを試してみました。
OGPを書き換える
HTML上に埋め込まれたOGPを書き換えてみます。
今回は以下のように設定しました。
<!-- OGP START --> <meta property="og:type" content="article" /> <meta property="og:description" content="「JavaScriptでOGPを書き換える」のデモページです。" /> <meta property="og:title" content="「JavaScriptでOGPを書き換える」のデモページ | cly7796.net" /> <meta property="og:url" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/01/" /> <meta property="og:image" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/01/img1.jpg" /> <meta property="og:site_name" content="cly7796.net" /> <meta property="og:locale" content="ja_JP" /> <!-- //OGP end --> <!-- twitter START --> <meta name="twitter:card" content="summary" /> <meta name="twitter:site" content="@cly7796net" /> <meta name="twitter:description" content="「JavaScriptでOGPを書き換える」のデモページです。" /> <meta name="twitter:title" content="「JavaScriptでOGPを書き換える」のデモページ | cly7796.net" /> <meta name="twitter:image" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/01/img1.jpg" /> <!-- //twitter end -->
head内にOGP情報を書き換える処理を記述します。
今回はURLに「?page=2」のパラメータがある場合に、title・image・urlを書き換えるようにします。
JavaScript
function ogp_setting() {
	var param = location.search.substring(1).split('&');
	var params = [];
	var paramVal = '';
	for(var i = 0; i < param.length; i++) {
		params[i] = param[i].split('=');
	}
	for(var i = 0; i < params.length; i++) {
		if(params[i][0] == 'page') {
			paramVal = parseFloat(params[i][1]);
		}
	}
	if(paramVal == '2') {
		var title = '[書き換えテスト]' + document.title;
		var url = location.href;
		var image = 'https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/01/img' + paramVal + '.jpg';
		document.title = title;
		var headData = document.head.children;
		for (var i = 0; i < headData.length; i++) {
			// OGPの設定
			var propertyVal = headData[i].getAttribute('property');
			if(propertyVal !== null) {
				if(propertyVal.indexOf('og:title') != -1) {
					headData[i].setAttribute('content', title);
				}
				if(propertyVal.indexOf('og:url') != -1) {
					headData[i].setAttribute('content', url);
				}
				if(propertyVal.indexOf('og:image') != -1) {
					headData[i].setAttribute('content', image);
				}
			}
			// OGP(twitter)の設定
			var nameVal = headData[i].getAttribute('name');
			if(nameVal !== null) {
				if(nameVal.indexOf('twitter:title') != -1) {
					headData[i].setAttribute('content', title);
				}
				if(nameVal.indexOf('twitter:image') != -1) {
					headData[i].setAttribute('content', image);
				}
			}
		}
	}
}
OGP画像は書き換え前と書き換え後で以下を使用しています。
body直後に書き換え処理を実行します。
HTML
<script>ogp_setting();</script>
パラメータ付きのURLでアクセス後にデベロッパーツールで確認すると、OGPが以下のように書き換えられていることが確認できました。
<!-- OGP START --> <meta property="og:type" content="article"> <meta property="og:description" content="「JavaScriptでOGPを書き換える」のデモページです。"> <meta property="og:title" content="[書き換えテスト]「JavaScriptでOGPを書き換える」のデモページ | cly7796.net"> <meta property="og:url" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/01/?page=2"> <meta property="og:image" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/01/img2.jpg"> <meta property="og:site_name" content="cly7796.net"> <meta property="og:locale" content="ja_JP"> <!-- //OGP end --> <!-- twitter START --> <meta name="twitter:card" content="summary"> <meta name="twitter:site" content="@cly7796net"> <meta name="twitter:description" content="「JavaScriptでOGPを書き換える」のデモページです。"> <meta name="twitter:title" content="[書き換えテスト]「JavaScriptでOGPを書き換える」のデモページ | cly7796.net"> <meta name="twitter:image" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/01/img2.jpg"> <!-- //twitter end -->
シェアするリンクで指定するtitleやURLも同様に書き換えるようにします。
HTML
<div id="btn-area"></div>
<script>
var url = location.href;
var title = document.title;
var insert = '';
insert += '<p><a href="http://twitter.com/share?text=' + title + '" onClick="window.open(encodeURI(decodeURI(this.href)), \'tweetwindow\', \'width=650, height=470, personalbar=0, toolbar=0, scrollbars=1, sizable=1\'); return false;" rel="nofollow">tweet</a></p>';
insert += '<p><a href="http://www.facebook.com/share.php?u=' + url + '" onclick="window.open(this.href, \'FBwindow\', \'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes\'); return false;">facebook</a></p>';
document.getElementById('btn-area').innerHTML = insert;
</script>
これで設定は一通り完了したので、実際にシェアして表示を確認してみます。
まずは書き換え前を試してみます。
JavaScriptでOGPを書き換える前のデモページ
facebookでリンクをシェアすると、以下のように表示されました。

twitterでは以下のように表示されました。

次に、書き換え後を試してみます。
JavaScriptでOGPを書き換えた後のデモページ
facebookでリンクをシェアすると、以下のように表示されました。

表示の変更はできませんでしたが、シェアするリンク部分でURLを指定しているので、URLはパラメータ付きのものになっていました。
twitterでは以下のように表示されました。

twitterではツイート時に書き換え後のtitleとURLを含んでいるので、ツイート部分には書き換え後の内容が反映されていました。
ただ、OGPの書き換え後の内容は認識していないようです。
 
OGPを追加する
HTML上にはOGPタグを埋め込まず、JavaScriptでOGPタグを追加するようにしてみます。
パラメータ付きURLでアクセスした場合に、OGPを追加する処理をhead内に記述します。
JavaScript
function ogp_setting() {
	var param = location.search.substring(1).split('&');
	var params = [];
	var paramVal = '';
	for(var i = 0; i < param.length; i++) {
		params[i] = param[i].split('=');
	}
	for(var i = 0; i < params.length; i++) {
		if(params[i][0] == 'page') {
			paramVal = parseFloat(params[i][1]);
		}
	}
	if(paramVal == '2') {
		var title = '[追加テスト]' + document.title;
		var url = location.href;
		var image = 'https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/02/img1.jpg';
		document.title = title;
		var metaData = [
			{
				'property': 'og:type',
				'content': 'article'
			}, {
				'property': 'og:description',
				'content': '「JavaScriptでOGPを書き換える」のデモページ2です。'
			}, {
				'property': 'og:title',
				'content': title
			}, {
				'property': 'og:url',
				'content': url
			}, {
				'property': 'og:image',
				'content': image
			}, {
				'property': 'og:site_name',
				'content': 'cly7796.net'
			}, {
				'property': 'og:locale',
				'content': 'ja_JP'
			}, {
				'name': 'twitter:card',
				'content': 'summary'
			}, {
				'name': 'twitter:site',
				'content': '@cly7796net'
			}, {
				'name': 'twitter:description',
				'content': '「JavaScriptでOGPを書き換える」のデモページ2です。'
			}, {
				'name': 'twitter:title',
				'content': title
			}, {
				'name': 'twitter:image',
				'content': image
			}
		]
		for (var i = 0; i < metaData.length; i++) {
			var meta = document.createElement('meta');
			for (var prop in metaData[i]) {
				meta.setAttribute(prop, metaData[i][prop]);
			}
			document.head.appendChild(meta);
		}
	}
}
body直後に追加処理を実行します。
HTML
<script>ogp_setting();</script>
パラメータ付きのURLでアクセス後にデベロッパーツールで確認すると、OGPが以下のように追加されていることが確認できました。
HTML
<meta property="og:type" content="article"> <meta property="og:description" content="「JavaScriptでOGPを書き換える」のデモページ2です。"> <meta property="og:title" content="[追加テスト]「JavaScriptでOGPを書き換える」のデモページ2 | cly7796.net"> <meta property="og:url" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/02/?page=2"> <meta property="og:image" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/02/img1.jpg"> <meta property="og:site_name" content="cly7796.net"> <meta property="og:locale" content="ja_JP"> <meta name="twitter:card" content="summary"> <meta name="twitter:site" content="@cly7796net"> <meta name="twitter:description" content="「JavaScriptでOGPを書き換える」のデモページ2です。"> <meta name="twitter:title" content="[追加テスト]「JavaScriptでOGPを書き換える」のデモページ2 | cly7796.net"> <meta name="twitter:image" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/02/img1.jpg">
この設定で実際にシェアして表示を確認してみます。
まずはOGPを追加する前を試してみます。
JavaScriptでOGPを追加する前のデモページ
facebookでリンクをシェアすると、以下のように表示されました。

twitterでは以下のように表示されました。

OGPタグがないため、画像等は表示されていません。
次に、追加後を試してみます。
JavaScriptでOGPを追加した後のデモページ
facebookでリンクをシェアすると、以下のように表示されました。

追加前と同じくOGPでの表示はできませんでしたが、URLのみパラメータ付きのものになっていました。
twitterでは以下のように表示されました。

twitterもfacebook同じくOGPでの表示ができませんでしたが、ツイート部分のtitleとURLは反映されていました。
どちらも追加したOGPの内容を認識できていないようです。
 
OGPを追加する2
先ほどはbody直後に追加処理を実行していましたが、head内でOGPタグを追加する処理を実行するようにしてみます。
head内にOGPを追加する処理を記述します。
JavaScript
 (function() {
	var param = location.search.substring(1).split('&');
	var params = [];
	var paramVal = '';
	for(var i = 0; i < param.length; i++) {
		params[i] = param[i].split('=');
	}
	for(var i = 0; i < params.length; i++) {
		if(params[i][0] == 'page') {
			paramVal = parseFloat(params[i][1]);
		}
	}
	if(paramVal == '2') {
		var title = '[追加テスト2]' + document.title;
		var url = location.href;
		var image = 'https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/03/img1.jpg';
		document.title = title;
		document.write('<meta property="og:type" content="article" />');
		document.write('<meta property="og:description" content="「JavaScriptでOGPを書き換える」のデモページ3です。" />');
		document.write('<meta property="og:title" content="' + title + '" />');
		document.write('<meta property="og:url" content="' + url + '" />');
		document.write('<meta property="og:image" content="' + image + '" />');
		document.write('<meta property="og:site_name" content="cly7796.net" />');
		document.write('<meta property="og:locale" content="ja_JP" />');
		document.write('<meta name="twitter:card" content="summary" />');
		document.write('<meta name="twitter:site" content="@cly7796net" />');
		document.write('<meta name="twitter:description" content="「JavaScriptでOGPを書き換える」のデモページ3です。" />');
		document.write('<meta name="twitter:title" content="' + title + '" />');
		document.write('<meta name="twitter:image" content="' + image + '" />');
	}
})();
パラメータ付きのURLでアクセスすると、OGPが以下のように追加されます。
HTML
<meta property="og:type" content="article"> <meta property="og:description" content="「JavaScriptでOGPを書き換える」のデモページ3です。"> <meta property="og:title" content="[追加テスト2]「JavaScriptでOGPを書き換える」のデモページ3 | cly7796.net"> <meta property="og:url" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/03/?page=2"> <meta property="og:image" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/03/img1.jpg"> <meta property="og:site_name" content="cly7796.net"> <meta property="og:locale" content="ja_JP"> <meta name="twitter:card" content="summary"> <meta name="twitter:site" content="@cly7796net"> <meta name="twitter:description" content="「JavaScriptでOGPを書き換える」のデモページ3です。"> <meta name="twitter:title" content="[追加テスト2]「JavaScriptでOGPを書き換える」のデモページ3 | cly7796.net"> <meta name="twitter:image" content="https://cly7796.net/blog/sample/rewrite-ogp-with-javascript/03/img1.jpg">
この設定で実際にシェアして表示を確認してみます。
まずはOGPを追加する前を試してみます。
JavaScriptでOGPを追加する前のデモページ
facebookでリンクをシェアすると、以下のように表示されました。

twitterでは以下のように表示されました。

先ほどと同じくOGPタグがないため、画像等は表示されていません。
次に、追加後を試してみます。
JavaScriptでOGPを追加した後のデモページ
facebookでリンクをシェアすると、以下のように表示されました。

結果としては先ほどと同じく、URLのみパラメータ付きのものになっていました。
twitterでは以下のように表示されました。

twitterも先ほどと同じく、ツイート部分のtitleとURLは反映されていました。
 
結果
結論としては、JavaScriptでOGPの書き換えや追加を行っても、facebook・twitter共に認識できないようです。
ただ、facebookはシェアするURL、twitterはツイートに含めるtitleとURLを指定できるので、その部分のみ変更することはできます。
 
コメントが承認されるまで時間がかかります。