2018年01月03日更新

ライブドアブログロールをhttps化したWordpressで使う方法

ライブドアブログロールは2chまとめブログには必須ツールとされています。しかし、昨今のHTTPS化した方がSEO上も有利になるにも関わらず、HTTPSにすると、ブログロール等、sslに対応していないサイトではスクリプトを読み込めなくなります。ブログロールを使用したい、でもHTTPS化もしたい、という時に使えるスクレイピングfunctionを紹介します。

  • 追加

SSL化する必要性はあるのか

SSLを利用したサイトは、URLがHTTPSのように表示されます。

SSLを利用すると、かいつまんで言うと、フォームに入力したデータを暗号化してくれます。
そのため、クレジットカード情報や個人情報を入力してもそのサイト以外には漏れないような状態にしてくれます。

まとめサイトなど、実際の所は使う必要はほとんどありません。

しかし、最近はSSLを利用していないサイトにフォームが設置されている場合、
「保護されていません」と表示されるようになっています。

ただのブログとは言え、「保護されていません」と出るブログだと、どこか心配になる人もいます。

また、SEO上でも、SSL化したサイトを優先的に表示するとGoogleが表明しています。
そのため、出来るのであれば意味がなくてもした方が良いのが、SSLです。

HTTPSからHTTPのスクリプトは読み込めない。

HTTPSでは通信の漏洩等を防ぐために暗号化するのですから、途中にHTTPの不明なスクリプトが混ざっていると困るわけです。
そのため、HTTPSのサイトからはHTTPのサイトに設置されているスクリプトが読み込めません。
(読み込み方自体はありはしますが、それでは結局保護されていないと警告が出てしまいます。)

ライブドアブログロールはSSL非対応

HTTPSのサイトからHTTPのスクリプトが読み込めないと、ライブドアブログロールのスクリプトが読み込めないという事態に陥ります。

その結果、HTTPS化すると、ライブドアブログロールを設置した部分が白紙になってしまいます。
ブログロールは使いたいけどHTTPのままにしなければいけない…そんなジレンマに陥りました。

考えた結果、サーバー側でライブドアブログロールをスクレイピングしてしまえば良い、との結果に落ち着きました。

ライブドアブログロールをスクレイピングする

ブログロールのスクリプトを調べた所、
ブログロールのデータは、以下のURL内に、表示するURL等のリストが出力されています。
「 "http://blogroll.livedoor.net/" . $blogroll_id . "/roll_data"; 」

ここの部分をスクレイピングし、表示します。
使用するテーマのfunctions.php内に以下のコードをまずは記載します。

//blogrollのURLをJsonで返す
function listblogroll($blogroll_id) {

$url = "http://blogroll.livedoor.net/" . $blogroll_id . "/roll_data";
$dat = get_template_directory() . "/dat/" . $blogroll_id . ".dat";
if (file_exists($dat)) {
$expire = strtotime("-5 minutes");
if (filemtime($dat) > $expire) {
$body = file_get_contents($dat);
$json = json_decode($body, true);
$str = "";
if (isset($json)) {
return ($json[2]);
}

}
}

$option = [
CURLOPT_RETURNTRANSFER => true, //文字列として返す
CURLOPT_TIMEOUT => 3, // タイムアウト時間
];

$ch = curl_init($url);
curl_setopt_array($ch, $option);

$json = curl_exec($ch);
$info = curl_getinfo($ch);
$errorNo = curl_errno($ch);

// OK以外はエラーなので空白配列を返す
if ($errorNo !== CURLE_OK) {
// 詳しくエラーハンドリングしたい場合はerrorNoで確認
// タイムアウトの場合はCURLE_OPERATION_TIMEDOUT
return [];
}

// 200以外のステータスコードは失敗とみなし空配列を返す
if ($info['http_code'] !== 200) {
return [];
}

// 文字列から変換
$body = str_replace(array("blogroll_write_feeds(", "]);"), array("[", "]]"), $json);
$json = json_decode($body, true);

$return_json = [];
foreach ($json[2] as $value) {
$forbidden_flag = false;
foreach (forbidden_words() as $word) {
if (strpos($value["entry_title"], $word) !== false) {
$forbidden_flag = true;
}
}
if ($forbidden_flag == true) {
continue;
}
$return_json[] = $value;
}

$str = "";
$json[2] = $return_json;
$f = file_put_contents($dat, json_encode($json), LOCK_EX);
if (isset($json)) {
return ($json[2]);
}

}

出典:code

この結果、wordpressのテーマ内のdatフォルダに、URLリストのJson配列がテキスト形式で出力されます。
(テーマ内に書き込み可のdatフォルダを設置しなくてはなりません。)

ついでにサイト名リスト一覧も取得しましょう。

ブログロールを利用するときに一番面倒くさいのは、ブログロールでもURLを入力し、自分のサイトのリンク部分にもURLとサイト名のリンクを設置しなければいけない点です。

非常に面倒くさく、わざわざそれようのプラグインを利用しても、プラグインの編集ページを開いたりするのは手間です。
ブログロールに追加さえすればリンクリストも自動で更新するようにしてしまいましょう。

//blogrollのURLをJsonで返す
function listblogroll_site($blogroll_id) {

$url = "http://blogroll.livedoor.net/" . $blogroll_id . "/roll_data";
$dat = get_template_directory() . "/dat/" . $blogroll_id . "_site.dat";
if (file_exists($dat)) {
$expire = strtotime("-5 minutes");
if (filemtime($dat) > $expire) {
$body = file_get_contents($dat);
$json = json_decode($body, true);
$str = "";
if (isset($json)) {
return ($json);
}

}
}

$option = [
CURLOPT_RETURNTRANSFER => true, //文字列として返す
CURLOPT_TIMEOUT => 3, // タイムアウト時間
];

$ch = curl_init($url);
curl_setopt_array($ch, $option);

$json = curl_exec($ch);
$info = curl_getinfo($ch);
$errorNo = curl_errno($ch);

// OK以外はエラーなので空白配列を返す
if ($errorNo !== CURLE_OK) {
// 詳しくエラーハンドリングしたい場合はerrorNoで確認
// タイムアウトの場合はCURLE_OPERATION_TIMEDOUT
return [];
}

// 200以外のステータスコードは失敗とみなし空配列を返す
if ($info['http_code'] !== 200) {
return [];
}

// 文字列から変換
$body = str_replace(array("blogroll_write_feeds(", "]);"), array("[", "]]"), $json);

$json = json_decode($body, true);

//blogrollからのリンクを新規が無いかチェック
$sites = [];
foreach ($json[2] as $key => $value) {
if (!isset($value["entry_link"]) or !preg_match_all('/[^\/]+/', $value["entry_link"], $matches)) {
continue;
}
//print_r($matches);
//フリーブログ対応、URLゲット
if ($matches[0][1] == "blog.livedoor.jp") {
$entry_link = $matches[0][0] . "//" . $matches[0][1] . "/" . $matches[0][2] . "/";
} elseif (preg_match("/[\?]+/", $matches[0][1])) {
$matches[0][1] = substr($matches[0][1], 0, strpos($matches[0][1], '?'));
$entry_link = $matches[0][0] . "//" . $matches[0][1] . "/";
} else {
$entry_link = $matches[0][0] . "//" . $matches[0][1] . "/";
}

if (!in_array($entry_link, $sites)) {
$sitedata_blogroll = $value["feed_id"];
$sites[$sitedata_blogroll]["sitedata_blogroll"] = $value["feed_id"];
$sites[$sitedata_blogroll]["sitedata_title"] = $value["feed_title"];
$sites[$sitedata_blogroll]["sitedata_url"] = $entry_link;
$sites[$sitedata_blogroll]["sitedata_genre"] = $value["category_id"];
}
}

file_put_contents($dat, json_encode($sites), LOCK_EX);

return $sites;

}

出典:code

これで、サイトのリンクリストが完成します。
後は、フィード一覧とリンク一覧を掲載するウィジェットを作ります。

ブログロールのIDを入れるだけで良いようなウィジェットを作成する。

class Blogroll extends WP_Widget {
/**
* Widgetを登録する
*/
function __construct() {
parent::__construct(
'Blogroll', // Base ID
'Blogroll', // Name
array('description' => 'Blogroll') // Args
);
}

/**
* 表側の Widget を出力する
*
* @param array $args 'register_sidebar'で設定した「before_title, after_title, before_widget, after_widget」が入る
* @param array $instance Widgetの設定項目
*/
public function widget($args, $instance) {
$blogroll = $instance['blogroll'];
$disp = isset($instance['disp']) ? $instance['disp'] : 1;
echo $args['before_widget'];
blogroll($blogroll, $disp);
echo $args['after_widget'];
}

/** Widget管理画面を出力する
*
* @param array $instance 設定項目
* @return string|void
*/
public function form($instance) {
$blogroll = isset($instance['blogroll']) ? $instance['blogroll'] : "";
$blogroll_name = $this->get_field_name('blogroll');
$blogroll_id = $this->get_field_id('blogroll');
?>
<p>
<label for="<?php echo $blogroll_id; ?>">Blogroll_id:</label>
<input class="widefat" id="<?php echo $blogroll_id; ?>" name="<?php echo $blogroll_name; ?>" type="text" value="<?php echo esc_attr($blogroll); ?>">
</p>
<p>
<label for="<?php echo $this->get_field_id('disp'); ?>">表示:</label>
<select class="widefat" id="<?php echo $this->get_field_id('disp'); ?>" name="<?php echo $this->get_field_name('disp'); ?>">
<option value="1" <?php echo (isset($instance['disp']) and $instance["disp"] == 1) ? "selected" : ""; ?>>表示</option>
<option value="2" <?php echo (isset($instance['disp']) and $instance["disp"] == 2) ? "selected" : ""; ?>>サイト名リスト</option>
<option value="0" <?php echo (isset($instance['disp']) and $instance["disp"] == 0) ? "selected" : ""; ?>>非表示</option>
</select>
</p>

<?php
}

/** 新しい設定データが適切なデータかどうかをチェックする。
* 必ず$instanceを返す。さもなければ設定データは保存(更新)されない。
*
* @param array $new_instance form()から入力された新しい設定データ
* @param array $old_instance 前回の設定データ
* @return array 保存(更新)する設定データ。falseを返すと更新しない。
*/
function update($new_instance, $old_instance) {
if (!filter_var($new_instance['blogroll'], FILTER_VALIDATE_INT)) {
return false;
}
return $new_instance;
}
}

出典:code

出力用のコードです。

function blogroll($blogroll_id, $disp = true) {
$i = 0;
$blogrollnum = $blogroll_id;

//サイト名表示のみ
if ($disp == 2) {
$links = listblogroll_site($blogroll_id);
echo "<ul>";
foreach ($links as $key => $link) {
echo '<li><a target="_blank" href="' . $link["sitedata_url"] . '">' . $link["sitedata_title"] . '</a></li>';
}
echo "</ul>";
return;

}

$links = listblogroll($blogroll_id);

//サイトURL獲得
$entrylist = array();
if (count($links) == 0) {
return "";
}

foreach ($links as $key => $value) {
$data["entry_url"] = $value["entry_link"];
$data["entry_title"] = mb_substr($value["entry_title"], 0, 100, "UTF-8");
$data["entry_blogroll"] = $value["entry_id"];
$data["entry_date"] = $value["posted_at"];
$data["entry_siteid"] = $value["feed_id"];

if (!isset($entrylist[$data["entry_siteid"]]) or $entrylist[$data["entry_siteid"]]["date"] < $data["entry_date"]) {
$entrylist[] = $data;

}

}
if ($disp == 1) {

echo '<div class="blogroll-channel"><ul class="blogroll-list-wrap">';
//sitedataを最新記事へ更新
foreach ($entrylist as $key => $value) {
echo '<li class="blogroll-list"><a href="' . $value["entry_url"] . '" target="_blank">' . $value["entry_title"] . '</a></li>';
}
echo '</ul></div>';
}
if ($disp == true) {

}

echo '
<!--
var blogroll_channel_id = ' . $blogroll_id . ';
// -->
';

}

出典:code

最後にこのブログロールウィジェットを登録しましょう。

add_action('widgets_init', function () {
register_widget('Blogroll');
});

出典:code

ウィジェットの作り方等は、どこか他のページで確認してください。
ひとまずこれで、IDを入力するだけでサイト名リスト一覧かフィード一覧を出力できるようになりました。

ブログロールをスクレイピングする事で出来ること

HTTPSサイトへの表示はもちろんのこと、「なんとかアンテナ」等、ブログロールでの設置を必要とするサイトへの登録も可能になります。
(なんとかアンテナではvar blogroll_channel_idを読み取っています。)

また、登録しているリンク一覧の表示なども可能になりますので、通常のHTTPサイトでも有効です。
毎回リンクページを開いてURLと名前を入力し…とせずとも、
ブログロールにRSSを登録するだけでサイトリストの表示が可能になります。

注意点

なお、これらはHTTPSサイトで表示できない為の苦肉の策です。
ブログロールを利用しつつもそれ以外の方法で表示をしている為、
ライブドアブログロールHTTPSに対応した場合は、そちらを利用することが望ましいでしょう。

シェアする気になったらシェアする

ツイート

ユーザー情報ユーザーの紹介

Gmatom 浜田貴朗

2008年よりコミュニティサイトを運営しつつ、効果の高い広告はバナー広告では無く誘導的コンテンツ広告と気付き、コンテンツ作成を手掛ける。 ポイントサイト・キュレーションサイト・動画自動投稿サイトや自動記事作成ツール、自動フォローツール等ツールの開発等、主にウェブ系の業界にて開発・運営を行っています。 V系バーの立ち上げ・ウェブ戦略・立地戦略等飲食店の立ち上げ・運営も携わっていました。

関連するキーワードキーワードからまとめを探す