feedlyの購読者カウントの取得方法。Yahoo! PipesからAjaxでの取得拒否対策

以前feedlyの購読者数を「Yahoo! Pipes(サービス終了)」を経由して、Ajaxで取得する方法を書きました。

先日、Pocketのシェア数をJavaScriptだけで取得する方法を書きました。上の記事は、Google+のシェア...

ただこの方法、一昨日ぐらいまでは問題なく動作していたのですが、それ以降は購読者数の取得ができなくなってしまいました。

今回は、その原因と、対策について書きたいと思います。

photo by Steve Snodgrass

スポンサーリンク
レクタングル(大)広告

feedlyの購読者数が取得できなくなった原因

昨日ぐらいから、当サイトの「Yahoo! Pipes(サービス終了)」を経由したfeedlyカウントの取得ができなくなりました。

feedlyカウント取得

半日ほど、様子を見ていたのですが、直らないようだったのでChromeのデベロッパーツールでYahoo! Pipesが返すオブジェクトを調べてみました。

すると、本来ならカウント数が出てくるところに、以下のようなHTML文が表示されていました。

クリックすると表示。

"<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en-US"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7 oldie" lang="en-US"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8 oldie" lang="en-US"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en-US"> <!--<![endif]-->
<head>
<title>Access denied | cloud.feedly.com used CloudFlare to restrict access</title>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
<meta name="robots" content="noindex, nofollow" />
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1" />
<link rel="stylesheet" id="cf_styles-css" href="/cdn-cgi/styles/cf.errors.css" type="text/css" media="screen,projection" />
<!--[if lt IE 9]><link rel="stylesheet" id='cf_styles-ie-css' href="/cdn-cgi/styles/cf.errors.ie.css" type="text/css" media="screen,projection" /><![endif]-->
<style type="text/css">body{margin:0;padding:0}</style>
<!--[if lte IE 9]><script type="text/javascript" src="/cdn-cgi/scripts/jquery.min.js"></script><![endif]-->
<!--[if gte IE 10]><!--><script type="text/javascript" src="/cdn-cgi/scripts/zepto.min.js"></script><!--<![endif]-->
<script type="text/javascript" src="/cdn-cgi/scripts/cf.common.js"></script>

</head>
<body>
  <div id="cf-wrapper">
    <div class="cf-alert cf-alert-error cf-cookie-error" id="cookie-alert" data-translate="enable_cookies">Please enable cookies.</div>
    <div id="cf-error-details" class="cf-error-details-wrapper">
      <div class="cf-wrapper cf-header cf-error-overview">
        <h1>
          <span class="cf-error-type" data-translate="error">Error</span>
          <span class="cf-error-code">1006</span>
          <small class="heading-ray-id">Ray ID: XXXXXXXXXXXXXXX &bull; 2015-05-07 11:23:04 UTC</small>
        </h1>
        <h2 class="cf-subheadline" data-translate="error_desc">Access denied</h2>
      </div><!-- /.header -->

      <section></section><!-- spacer -->

      <div class="cf-section cf-wrapper">
        <div class="cf-columns two">
          <div class="cf-column">
            <h2 data-translate="what_happened">What happened?</h2>
            <p>The owner of this website (cloud.feedly.com) has banned your IP address (【Yahoo! PipesのIP】).</p>
          </div>

          
        </div>
      </div><!-- /.section -->

      <div class="cf-error-footer cf-wrapper">
  <p>
    <span class="cf-footer-item">CloudFlare Ray ID: <strong>XXXXXXXXXXXXXXX</strong></span>
    <span class="cf-footer-separator">&bull;</span>
    <span class="cf-footer-item"><span data-translate="your_ip">Your IP</span>: 【Yahoo! PipesのIP】</span>
    <span class="cf-footer-separator">&bull;</span>
    <span class="cf-footer-item"><span data-translate="performance_security_by">Performance &amp; security by</span> <a data-orig-proto="https" data-orig-ref="www.cloudflare.com/5xx-error-landing" id="brand_link" target="_blank">CloudFlare</a></span>
    
  </p>
</div><!-- /.error-footer -->


    </div><!-- /#cf-error-details -->
  </div><!-- /#cf-wrapper -->

  <script type="text/javascript">
  window._cf_translation = {};
  
  
</script>

</body>
</html>"

上記のコードをデベロッパーツールから取り出して、テキストエディターに貼り付けて、HTMLで保存して、ブラウザで表示させると以下のようなメッセージが出ました。

Access denied  cloud.feedly.com used CloudFlare to restrict access

"

Please enable cookies.

Error 1006 Ray ID: XXXXXXXXXXXXXXX ? 2015-05-07 11:23:04 UTCAccess denied

What happened?The owner of this website (cloud.feedly.com) has banned your IP address (【Yahoo! PipesのIP】).

CloudFlare Ray ID: XXXXXXXXXXXXXXX ? Your IP: 【Yahoo! PipesのIP】 ? Performance & security by CloudFlare

"

どうやら、Yahoo! Pipesからのカウント数の取得を拒否られたようです。

feedlyから直接PHPでカウント数を取得する

これを回避するためには、やはりfeedlyから直接PHPで購読者数を取得するしかないようです。

以下は、Wordpressでfeedlyカウントを取得する方法です。

functions.phpの編集

まずは、functions.phpに以下の関数を記入します。

//feedlyの購読者数取得
function get_feedly_count(){
  $feed_url = rawurlencode( get_bloginfo( 'rss2_url' ) );
  $res = '0';
  $subscribers = wp_remote_get( "http://cloud.feedly.com/v3/feeds/feed%2F$feed_url" );
  if (!is_wp_error( $subscribers ) && $subscribers["response"]["code"] === 200) {
    $subscribers = json_decode( $subscribers['body'] );
    if ( $subscribers ) {
      $subscribers = $subscribers->subscribers;
      set_transient( 'feedly_subscribers', $subscribers, 60 * 60 * 12 );
      $res = ($subscribers ? $subscribers : '0');
    }
  }
  return $res;
}

これは、テーマチェッカー(Theme Check)で警告が出ないように書いてあります。

通常のPHPなら、file_get_contents()などを用いて、外部のものを取得するのが一般的なのかもしれませんが、その方法だと、テーマチェッカーで警告が出てしまいます。

なので、外部から何かを取得する場合は、Wordpressの作法にのっとったwp_remote_get()を利用しています。

テンプレートファイルで関数を呼び出す

あとは、利用するテンプレートファイルで、以下のようにfunctions.phpで記入した関数を呼び出します。

<?php echo get_feedly_count(); ?>

これで、feedlyカウントが表示されるようになりました。

feedlyカウントが表示された

まとめ

以前、ようやくAjaxで非同期取得する方法を見つけましたが、Yahoo! Pipesを利用したこの方法は、利用できなくなってしまいました。

サービスを経由した取得は、そのサービスからアクセスが大量に来ることになるので、拒否されてしまうのだと思います。

また、他にサービスを経由しなくていい、非同期取得の方法を思いついたらまた書きたいと思います。

追記(2015年10月):feedlyの非同期取得方法について書きました。

以前、PHPとWordpress関数を利用して、テーマチェッカーでもエラーが出ない「feedly購読者数取得関数」を書きました。 ...

『feedlyの購読者カウントの取得方法。Yahoo! PipesからAjaxでの取得拒否対策』へのコメント

  1. 名前:peco 投稿日:2015/05/20(水) 15:45:11 ID:200f43f9d

    貴重な情報のご提供、ありがとうございます。WP Total Chache等のキャッシュ系プラグインを利用していると取得数が固定されてしまうのですが、どのように対応すればよろしいのでしょうか?

  2. アバター画像 名前:わいひら 投稿日:2015/05/20(水) 17:43:02 ID:10b5043ea

    WP Total Chacheのファイルキャッシュ機能とは、負荷のかかる実行コードを動作させないで、代わりに、今表示されている部分を、単なるHTMLファイルとして作って、以降それを読み込んで高速化を図ろうというものです。
    なので、HTMLファイル(ファイルキャッシュ)を作成した時のカウントに固定されてしまうのが、本来の仕様です。
    実行コードを動作させるには、ファイルキャッシュ機能をオフにする必要があると思います。