haseco氏になんとなくあったら面白いかも!と言われたのでサイトの宣伝がてらに作ってみました。
基本的な機能は、
「@NoTechnoNoLife 宛にキーワードをポストすると、そのキーワードからNoTechnoNoLifeを検索し、オススメの記事をレコメンドするbot」
ですっ!
それっぽく動けばいいや〜と思っていたのですが、いろいろ作っていると面倒なことがちょいちょいあったのでここにメモとして残しておきます。
WordpressにJSONを返すAPIを作成したい!っが・・・
まずはキーワードを元に、該当する記事のタイトルやURLを返すAPIを作ります。
はじめ、テーマのディレクトリに適当な名前でphpファイルを置いて、/hoge.phpでアクセスしてみたんですがうんともすんとも言わないので、
MTみたいにデザインのテンプレートにファイルを追加するだけでは作れないんだと分かりました。
必要な作業は、
- 新規ページの作成(これがAPIのURL)
- テンプレートにphpファイルを追加(検索機能)
ぐらいです。
もっと他によい方法があるのかもしれませんが、今回はとりあえずこんな感じで行きますよー!
(以下、僕が作成した環境になりますので、適宜自分の好きなファイル名や文言などに置き換えて読んでください。)
Wordpressのテーマディレクトリに.phpファイルを配置する
自分のサーバーのテーマディレクトリに「recommend_entries.php」というphpファイルを作成します。
中身は以下のようにしました。
このTemplate Nameが次のステップのページを作成するときに洗濯するテンプレート名になります。
Wordpressのページを新規作成する
次にAPIとして提供するためのページ(URL)を作成します。
管理画面の左側ペインから「ページ」→「新規作成」で新規作成ページを開きます。
タイトルに「Recommend Entries」と入力して、
属性という表示項目のところのテンプレートを、さきほど作成したテンプレートを指定する。
これでAPIとしての準備はできた!
あとはコーディングだ。。。
記事をレコメンドするphpファイルを書いてみる
このphpファイルがAPIの機能を主に担う。
ここで重要なのが、あるキーワードがこのAPIに投げられたら、そのキーワードを元に本来Wordpressが持っている検索処理を走らせないのだが、
GETパラメータに「s=ほげ」としてしまうとsearch.phpが呼ばれてしまい、このphpファイルが呼ばれない。
これはおそらくWordpressが内部的にこのパラメータがある場合はこのphpとかやってるんでしょうね。
よって、「s」というパラメータは使えないので、今回は「re」を使う。
reを使うんですが、検索機能を使うためにはsにキーワードを入れる必要があるので、結果的に以下のようになった。
さらにちょっとややこしかったのが、Wordpressは特殊文字を実体参照に変換するっぽいので、記事のタイトルに「-(←ハイフン)」があると「–」に変換されてしまう。
なのでmb_decode_numericentity関数を使って復元している。(PHPあまり分からないのでこれで合ってるのかな。。。)
APIのソースコード
json_encode関数の存在を知らなかったので、普通にJSONを組み立ててたらパースできなくてすごいハマった。。。
テンプレートを参考にすると、the_titleやthe_permalinkなんてタグを見かけるんですが、これは中でechoしているので今回は使えません。
代わりに、get_the_titleやget_permalinkを使って取得しています。
この辺のタグについては以下のページが参考になります。
テンプレートタグ - WordPress Codex 日本語版
■GitHub
・gist: 612770 - GitHub
Replayを元にオススメするTwitterBotを作る
APIは出来たのであとはbotだっ!(botはRubyで書いてみました。)
twitterというモジュールを使っています。
ちょっと補足として、replayの取得はTwitter::Base.mentionsメソッドを使って取得するんですが、twitter0.7.0にはこのメソッドがないみたいなのでtwitter0.8.0以降をお使いください。
twitterに関しては以下に詳しく書かれています。
Greenbear Laboratory - Ruby Twitter Gem簡易リファレンス
それと事前にTwitter / アプリケーションを登録でbot用にアプリ申請をしておく必要があります。
これをしないとOAuthが使えないので。
TwitterBotのソースコード
5分前よりも後にreplayされていたら、そのtweetからキーワードを抽出して(正規表現分からなかった...)WordpressのAPIに投げ、結果をつぶやく。
■GitHub
gist: 612998 - GitHub
ちなみにcronは5分毎に実行されるように設定しています。
なのでリアルタイム性はちょっと弱いですね。。。
今は単語だけですが、MeCabなどの形態素解析を使って文章の中からキーワードを引っ張り出して検索しても面白いかもしれません。
Rubyで形態素解析してみた - unnecessary words
(サイトに行って検索テキストボックスにキーワード入力すればいいんじゃない?って言わないでくださいね!)
また一つ無駄なものを作ってしまった...
今回の作品
もしよければフォローしてくださいな。
NoTechnoNoLife (NoTechnoNoLife) on Twitter
■参考リンク
・僕とヒロムとWEB戦争 » WordPressで従来型のページ作成
・Character entity references in HTML 4
・WordPress ページテンプレートについて - tail -f /var/log/こうちかずお.log
- Newer: Rubyの形態素解析「MeCab」で文章から名詞を抽出してみる
- Older: scriptタグにHTML5からサポートされているasync属性を指定すると読み込む順番を担保しないで実行される
Trackback:0
- TrackBack URL for this entry
- http://hisasann.com/cgi-bin/mt/mt-tb.cgi/1261
- Listed below are links to weblogs that reference
- Wordpressを使っておすすめ記事をレコメンドするTwitterBotを作ってみた - NoTechnoNoLife from HouseTect, JavaScriptな情報をあなたに

