Google Analytics APIを使ってWordPressのアクセスランキング的なやつ

googleapis

WordPressでのランキングプラグイン的なヤツだと、投稿数が増えてきたりするとかなり重くなる。

WordPress Popular Postsとか結構悲惨っすよ。

# 特に投稿時には「1分以上掛かる」とか・・・ね。

なので、それらは外部のデータを使ってやったほうが軽くなるし、
Google Analyticsのデータの方が信頼出来そうって事で、
APIを使ってWordPressのアクセスランキングを作ろうって事になりました。

「Googleさん」で探してみるとやっている人がいたので早速、参考にやってみる。

【WordPress】Google Analytics API で人気記事を表示する

1. 「Google APIs Console」で「OAuth 2.0 Client ID」を取得
2. google-api-php-clientでライブラリ取得
3. 【WordPress】Google Analytics API で人気記事を表示するのサンプルを参考に設置

これで簡単にいけました。

このブログの右カラムにもとりあえず置いてみた。
Cronも設定しておいたよー 🙂

で、こっからはくだらないがちょいちょいハマッタ所。

1. curlがサーバーにインストールされていなかった
2. PHPコンパイル時に「curl」が指定されていなかったので、そもそもAPIからデータが取れなかった
3. アクセスしたGoogleアカウントが「GoogleAnalytics」のアカウントと「Google APIs Console」で指定したアカウントと違うため、データ取得に失敗
4. 失敗したまま「Token」をキャッシュしていたので常にエラーになってしまった

ですね。

2. PHPコンパイル時に「curl」が指定されていなかったので、そもそもAPIからデータが取れなかった」では、
「–with-curl」オプションを追加してコンパイルすると、

configure: error: Please reinstall the libcurl distribution –
easy.h should be in /include/curl/

ほえ?curl入ってるけど?って色々と確認したところ、
Ubuntuの「aptitude」で「curl」をインストールしたけど、
そもそもライブラリ的なものが入っていなくてファイルが無いよ?って
エラーだったようだ。

こっちもaptitudeで下記をインストールする。

1
2
$ sudo aptitude install lib-curl4-dev
$ sudo aptitude install libbz2-dev

んでもって、curlのパス確認。

1
2
$ which curl
/usr/bin/curl

なので、「–with-curl=/usr/bin」をPHPのコンパイルオプションに追加して、
再コンパイルでうまくいきました。

余談として、

1
$ make distclean

したほうが安心でっす。

[ GAE ][ Google ][ Twitter ] GAE(Google App Engine)でpython-twitterを使ってタイムライン取得

そういえばあまり「GAE(Google App Engine)」を触っていなかったので、久々にやってみた。

# というよりも、アプリなんか作ったことないんだけどねw

とりあえず、Twitterのタイムラインでも取得するか!って事で、以前使った「python-twitter」でやってみる。

なんか調べると多少ファイルが必要になったり、
一部変更が必要なみたいなので、メモメモ。

  1. python-twitterのファイルをダウンロードし設置

まずはファイルが必要みたいなので、GoogleCodeにある「python-twitter」からファイルをダウンロードしてきた。

そこに入っている、

  • twitter.py(ファイル)
  • simplejson(ディレクトリ)

が必要となるようだ。
なのでまずはこいつをGAEのアプリのドキュメントルートへ設置する。

./
../
app.yaml
index.yaml
main.py
simplejson/
twitter.py
  1. APIクラスでのファイルキャッシュ処理のせいで、正常に実行されないために上書き

普通にドキュメントに書かれているとおりやると、

- AttributeError: 'module' object has no attribute 'getlogin'
- ImportError: No module named _multiprocessing

などのエラーが出るので、main.pyに下記を記述する。

import twitter
 
# twitter.Api.__init__ method for override.
def twitter_api_init_gae(self,
                       username=None,
                       password=None,
                       input_encoding=None,
                       request_headers=None):
   import urllib2
   from twitter import Api
   self._cache = None
 
   self._urllib = urllib2
   self._cache_timeout =  Api.DEFAULT_CACHE_TIMEOUT
   self._InitializeRequestHeaders(request_headers)
   self._InitializeUserAgent()
   self._InitializeDefaultParameters()
   self._input_encoding = input_encoding
   self.SetCredentials(username, password)
 
# overriding API __init__
twitter.Api.__init__ = twitter_api_init_gae

こいつについては、

python-twitterのIssue 59
pengineの Issue 1504 に記載されておりました。

参考URL :

Lazycozy’s Blog – Twitter Bot を作ってみる –
Reinvention of the Wheel – Google App Engineでpython-twitterが動かない件について –

  1. pythonのバージョンは「2.5」

ローカルのPythonがPython2.6の場合、GoogleAppEngineLauncherでPython Pathを記述出来るので、そちらへPython2.5を設定する。

#GAE上のPythonは2.5なので併せた。

  1. ImportError: No module named _ctypes

調べたところ、デプロイしたものであれば、とりあえず動作するようだが、原因がわかっていないので調査する。

# 2010.03.26追記

GAEのPythonPathが2.5では無く2.6を見ていたらしい。。。

実際に行った対応は、GAELauncherを起動して

gae_python25
gae_python25 posted by (C)kishir

GAELauncherの環境設定のPythonPathを設定する項目へ、
Python2.5のパスを入力する。

この後に「Enter(エンター)」を押さないと、設定が反映されないようだ。。。

その後にLauncherを再起動する。

で再度、環境設定のPythonPathを確認して設定されている事を確認。設定されていればオッケー。

これで正常に動作しました。

  1. main.pyへロジックを記述

下記のロジックでタイムラインを取得する事が可能。

#!/usr/bin/env python
#!-*- coding:utf-8 -*-
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
 
import os
import twitter
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template
 
 
# twitter.Api.__init__ method for override.
def twitter_api_init_gae(self,
                       username=None,
                       password=None,
                       input_encoding=None,
                       request_headers=None):
   import urllib2
   from twitter import Api
   self._cache = None
 
   self._urllib = urllib2
   self._cache_timeout = Api.DEFAULT_CACHE_TIMEOUT
   self._InitializeRequestHeaders(request_headers)
   self._InitializeUserAgent()
   self._InitializeDefaultParameters()
   self._input_encoding = input_encoding
   self.SetCredentials(username, password)
 
# overriding API __init__
twitter.Api.__init__ = twitter_api_init_gae
 
class MainHandler(webapp.RequestHandler):
 
    """
    get.
    """
    def get(self):
        user = users.get_current_user()
        if user:
            u = 'ユーザー名'
            p = 'パスワード'
            api = twitter.Api(username=u, password=p)
            statuses = api.GetUserTimeline()
            l = []
            for s in statuses:
               l.append(s.text.encode('utf-8'))
            template_values = {
                    'list': l,
            }
            path = os.path.join(os.path.dirname(__file__), 'index.html')
            self.response.out.write(template.render(path, template_values))
        else:
            self.redirect(users.create_login_url(self.request.uri))
 
def main():
    application = webapp.WSGIApplication([('/', MainHandler)],
                                      debug=True)
    util.run_wsgi_app(application)
 
if __name__ == '__main__':
    main()

今回はテンプレートモジュールを使用しているので、main.pyと同じディレクトリへ、
「index.html」を設置して対応した。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>GAEでTwitter</title>
<meta name="description" content="GAE Twitter" />
<body>
    <div id="name">
        {% for l in list %}
            {{ l }}
        {% endfor %}
    </div>
</body>
</html>

これでタイムラインがとりあえず取得可能となるので、後は色々といじくることが可能となりそう。

ちなみに取得したタイムラインはHTML上に下記のように表示された。

@komagata 埼玉の人にもらっちゃえば良いよ @komagata 高いっすよねー。まいっちんぐですよ。 そっかpython2.5なのか・・・。2.6じゃだめかw
今日はGAEと戯れてみる バナナマンのpodcastを全部聞いてしまったせいか、寂しいな・・・。 雨が降ってる。。。やだよー。。。
ファックな事に雨が降ってる。。。 次は「3DS」なのかー RT @fladdict: あ、本物だった → Nintendo 3DS 発表。
http://j.mp/9Y7del RT @fladdict: Googleが中国での稼働状況公開ページを作っとるw http://www.google.com/prc/report.html#hl=en
RT @whosaysni: RT @kernel_thread: RT @niryuu: 日本語訳来た Google Japan Blog: 中国における事業展開について http://bit.ly/cA1A44
いいなーこういうの。RT @skmt09: おもろい。http://bit.ly/6ipn6F RT @umelns: おっと! - 米Amazon、早くもiPad用Kindleアプリの情報提供開始 -
http://goo.gl/kKPc - グーグル、中国の検索サイト停止 - http://bit.ly/dCXnE2 @yoshuki おつでしたー 子供をお風呂に入れたー
あ、今日はカバチ最終回か。嫁さまが楽しみにしているドラマなのに・・・。 タスクが6つほどあるな・・・。どうさばくかなー。
おっと、OAuthのバグのせいなのかw 光が丘に「おはしCafeガスト」が出来てたので、来てみた。
メニューの内容が体に良いものがあるので、いまの自分には丁度良いなー デパートみたいにガヤガヤしているところだと、
携帯に掛けても気づかれないんだよなー。。。

GoogleDeveloperDay2008の続き

今週はウイルス性の風邪?にやられていて、
嘔吐なども激しく何も出来ませんでした。。。
まさか会社を早退して病院で注射を打ち、30分位病院で寝るとは思わなかったorz

ってな事でやっと治ったので、
この間の続きを書くことにする。

Google Gadgets API

これは今度使う必要があるので聞いておきたかった。
けど知ってることばっかり。
調べれば誰でも出来ることの紹介だったので、
ちょっと残念だったなー。

でも1つおもしろいのを教えて貰った。

iGoogleがver.2というのが開発されていて、
今なら誰でも触れるとのことだったので早速試してみた。

Googleアカウントにログインしてから下記URLへアクセス。
http://www.google.com/ig/sandbox

アクセスするとSandboxへのサインアップを求められるので、
入力。
現在は英語しか対応していないとの事なので、英語で設定する。

YouTubeにも上がってた。
http://jp.youtube.com/watch?v=H6KVwATfCdM

上記を見ると解るとおり、
従来は上部にタブがあったのが左サイドに変更されている。

ちょっと気分を変えたくなったら的なノリで使ってみる。

Googleソフトウェアエンジニアの日常

これはかなり興味があった。
実際にどのような流れで一日を過ごしているのかを
発表者自らのスケジュールを公開してくれた。

みんなも興味があったみたいで、
かなりの人数が居たし質疑応答ではかなりみんな積極的に質問していた。

この後は懇談会があったみたいだが、
自分は体調が最悪だったので速効帰った。

そういえば、
帰宅してからなんかもらったなーと思って中身を確認したら、
Tシャツなどが入ってた。

でも町中じゃー着れないよなーw

GoogleDeveloperDay2008に参加してきました

今日のGoogleDeveloperDay2008

10:00〜12:00
基調講演

12:00〜12:45
GoogleAppEngine

12:45〜14:00
お昼休憩

14:00〜14:45
Androidアプリケーションの構築(基礎編)

15:00〜15:45
Android Dalvik VMの内側

16:00〜16:45
Google Gadgets API

17:00〜17:45
Googleのソフトウェアエンジニアの日常

この流れで参加しました。
後半はタバコ休憩もろくに行かずにメインホールに入り浸りですw

まずは、
「GoogleAppEgine」
こちらは出た当初に弄っておいたので、
話がスムーズに解って良かった。

このGoogleAppEngine自体の目的は、
Webアプリの開発って面倒だよね。
何故か?
サーバの設定やホスティングなど色々な問題があるから。
ではそれを解決しよう!
という目的でつくられたのがGoogleAppEngineなんですよね。

下記講演・質疑応答にて気になったものを列挙してみた。
・現状はPythonのみだが、他の言語の対応も今後は考えている。
・分散型データストア(Joinに対応していない)
・今後、バッチ処理が出来るようにも考えている。
・このさきずっと無償である。
・全文検索は日々考えられているが、詳細は言えない。
・サーバのホスティングはどこで行われているかの詳細は言えないが、
 全世界の人が使用できるように努力している。
・DOS攻撃には何らかのツールなどで対応出来るように考えている。
・セキュリティに関しても詳細は言えないが、Googleで最善を尽くす。
 (現状はHttps,SSLはサポートしていない。)
・申し込みに関しては、現在日本の通信会社に問題があるとされているので、
 すぐに対応出来るようにしたい。
 
次にAndroid

実際言葉は知っていたが、
そもそも何かを全然知らなかったwので聞いてみました。

「オープンで無償の初めてのモバイル プラットフォーム」

http://code.google.com/intl/ja/android/

こちらに詳しく記載されています。

ただ言語がJAVAだと言うことで、
ちょっとショック。。。
JAVAほとんど触ったことが無いっすよorz

でもこれがあれば機能面では、
iPhoneにも勝てるのではないでしょうか?
実際に動かしているところを見てかなり興味が惹かれたっす。

そういえば、
Android Developer Challengeが
今年の末か来年の初めに第2回が開催されるらしいです。

賞金が

Android デベロッパー チャレンジ I では、4月14日までに応募された中から最も有望な 50 のアプリケーションのデベロッパーに、
その開発をさらに促す資金として 25,000 米ドルの賞金が提供されます。
選ばれた 50 のデベロッパーはさらに選抜され、
10 デベロッパーに27 万 5,000 米ドル、もう 10 デベロッパーに10 万米ドルの賞金が提供されます。

らしいですよー。
興味がある人は是非!

残りは長くなりそうだから、
明日にするかなw

GoogleさんからPINコードが届きました

以前メールでGoogleさんから

このたび、郵送にて個人識別番号 (PIN) をお送りいたしました。

のようなメールが届きました。

で、
今日実際に届いたっす。
これは、
Google AdSenseを使っている人は、
識別番号を入力してね。
って事らしい。

なので、
早速Google AdSenseの管理画面で入力しておこう。

そうしないと・・・

4 か月以内に PIN の入力がない場合、お客様のウェブ ページに公共サービス広告 (英語) が表示されるようになります。 6 か月以内に PIN を入力いただけない場合、お客様のアカウントは無効になり、未払いの収益は、しかるべき広告主様に払い戻されます。

らしいっすよ。