DACエンジニアブログ:アドテクゑびす界

DACのエンジニアやマーケター、アナリストが執筆するアドテクの技術系ブログです。

Railsたった14行でアドサーバーAPIができた話

こんにちは。駆け出しエンジニアの近江です。

最近Railsにハマっているので、私が2年間担当しているアドサーバの、簡易版をRailsで作ってみました。 広告やキャンペーンを登録する管理画面はある前提で、ここからたった14行追加するだけでアドサーバーのHTTP APIを作りたいと思います。ついでに配信期間の制御も入れたいと思います。  

テーブル構成

まずホーム画面イメージです。 oomi_capture1

キャンペーン、広告、サイト、エリア、サイズ、広告主の6つのテーブルがあります。 広告のアップロードは※CarrierWaveを使ってユーザーがローカルから画像アップロードしたら指定したディレクトリに保存されるようにしてます。

※CarrierWave…ファイルアップロード用のgemで、画像アップロードした時の保存先や表示する際の参照先などが簡単に実装できます。

 

キャンペーン作成

キャンペーン作成画面です。 oomi_capture2 キャンペーン作成前に広告、サイト、エリア、サイズ、広告主を先に登録しておきます。 登録したデータはこのキャンペーン作成画面でプルダウンから選べるようになってます。 配信期間は開始、終了日時をプルダウンから選択します。 後ほど説明するAPIのところで、配信期間内でなければ画像を表示しないようにするためです。

 

API作成

ユーザーがURLで枠情報を指定してAPIとして叩けるように、API用のルーティング設定を行います。

まずはAPI用のコントローラーの作成 rails g controller Apis

次にルーティング設定 vi config/routes.rb(一番下の2行を追加!)

[ruby] Rails.application.routes.draw do

root 'top#index'

resources :advertisers resources :sites resources :areas resources :sizes resources :creatives resources :campaigns

resources :apis get '/api/SITE=:site/AREA=:area/SIZE=:size' => 'apis#index' [/ruby]

 

ルーティング設定に追加された事を確認(一番下がAPIに使うURLの定義です。) rake routes

[ruby] apis GET /apis(.:format) apis#index POST /apis(.:format) apis#create new_api GET /apis/new(.:format) apis#new edit_api GET /apis/:id/edit(.:format) apis#edit api GET /apis/:id(.:format) apis#show PATCH /apis/:id(.:format) apis#update PUT /apis/:id(.:format) apis#update DELETE /apis/:id(.:format) apis#destroy GET /api/SITE=:site/AREA=:area/SIZE=:size(.:format) apis#index [/ruby]

 

コントローラーの設定 vi app/controllers/apis_controller.rb(9行追加!)

[ruby] class ApisController < ApplicationController def index @campaign = Campaign.find_by(site: params[:site], area: params[:area], size: params[:size]) @creative = Creative.find_by(name: @campaign.creative) if @campaign.startdate > DateTime.now || @campaign.enddate < DateTime.now @creative = nil end end end [/ruby]

このコントローラーの設定で、URLからパラメータを受け取り、データベースからキャンペーンを特定し、 該当するキャンペーンの広告名に紐づくデータをクリエイティブテーブルから取得します。 そしてここで配信期間を確認します。 現在時刻が該当したキャンペーンの配信期間内でなければ、取得したクリエイティブテーブルの中身をnilにしています。

 

表示部分 vi app/views/apis/index.html.erb(3行追加!)

[ruby] <% if @creative %> <%= image_tag @creative.file.url %> <% end %> [/ruby]

コントローラーから受け取ったクリエイティブデータを確認し、trueであれば画像を表示する。nilになってたら表示しない。

 

実際にAPIを叩いて画像が返ってきた時のブラウザイメージ oomi_capture3

はい、ソースに2+9+3=14行追加するだけでHTTP APIを作ることができました。

まだ配信期間の判定しかできてないですが、更に広告をローテーションしつつimpを考慮してキャンペーンの選択ができるようになると、だいぶアドサーバらしくなるので、どんどん機能拡張していきたいと思います。 弊社のアドサーバーラインナップに並ぶ日も近い!?