前回の続きからwordpress記事を作成するのに必要なDMMAPIのデータ加工を解説します、データはjson形式で取得されるので必要な部分を抜き出したり、数万件のデータをすべて取得するための工夫などの説明が中心になってます。
完成形のスクリプトをベロンと表示するだけだと面白くないので、僕が普段開発する際の手順を追いながら作業画面を動画で掲載してみました。文字や画像だけだと伝わらない事も動画だと理解できたりするので参考になれば嬉しいです。
今回改造するWPテーマはcocoon
今回は無料で高性能&アダルトOKなWPテーマのcocoonを改造して自動アダルト動画まとめサイトを作ってみようと思います。ワードプレスの構造は大体一緒なので他に使いたいテーマがあればなんでもOKです。
ただし、親テーマのアプデ時に改造した内容が上書きされて消されちゃう可能性もあるので、必ず子テーマを設けてそっちを改造するようにして下さい。子テーマを作成するプラグインとかもありますんで、なるべく最新の物を使って作業した方が間違いないです。
親テーマとか子テーマとかよく分からんという方は、とりあえずcocoonでお試し運用するのをオススメします。
テスト用サイトの作成
wordpressやcocoonのインストール方法などは詳しく解説しているサイトがたくさんありますし、それぞれの公式ページでも丁寧に説明されていますので確認して下さい。
今回は「ブラックマンバ@パリピ」というギャル系動画特化したサンプルサイトを用意しました、これからこのブログを自動更新サイトに改造していきます。
当然ですがまだ何もしていないのでcocoonのデフォルト状態です。
ワードプレステーマの改造
改造といっても触るファイルは一つだけですし特別なツールも使いません、普通に「wordpressのメニュー > 外観 > テーマファイルエディター > functions.php」に追記するだけです。
上の方でもちょっと書きましたが、選択しているfunctions.phpが子テーマの物になっているか確認して下さい。親テーマのfunctions.phpに手を加えてしまうと、テーマのアプデ時に上書きされてせっかく書いたスクリプトが消えてきまう可能性があるのでご注意です。
FANZA動画データをwordpressに反映させる
僕がwordoressを改造する時はfunctions.phpに書いたスクリプトをショートコードにして、テスト用の記事上に計算結果を直接表示して確認しながらコードを書いてます。開発の正しいやり方は違うと思いますが、個人が自分で使うように作るスクリプトくらいなら特に問題ないかなと思います。
誰かに譲ったり公開したりする場合はテスト用の非公開wordoressを作ってそこでテストし、完璧に完成してから情報を出すようにした方が迷惑が掛からないと思います。
テーマのfunctions.phpにユーザー定義関数を作る
まずはシンプルにユーザー定義関数を追加してブログ上にちゃんと反映されるか確認してみます、インストール直後のwordpressには「hello world」というサンプル記事がデフォルトで用意されてますんで、そこにうんこと表示させてみましょう。
function fanza_get_video(){
return('うんこ');
}
add_shortcode('fanza_get_video', 'fanza_get_video');
本当は記事に値を出力させて確認するやり方は開発手順としては正しくないです、本来はwordpressをデバックモードにして確認したい値をlogに出力するのが普通のやり方だと思いますが、僕はめんどくさいのでいつもこんな感じで直接確認してます。
FANZA動画データを記事に表示してみる
ちゃんとうんこが出たんで、次はFANZAのリクエストURLからデータを取得して値を表示してみます。前回の記事で作ったギャル動画を出力するリクエストURLをfile_get_contentsで叩いてデータを取得します。
function fanza_get_video(){
$request_url='https://api.dmm.com/affiliate/v3/ItemList?api_id=[APIID]&affiliate_id=[アフィリエイトID]&site=FANZA&service=digital&floor=videoa&hits=2&article=genre&article_id=1034';
$res_data=json_decode(@file_get_contents($request_url), true);
var_dump($res_data);
return($res_data);
}
add_shortcode('fanza_get_video', 'fanza_get_video');
表示できました、ちょっと雰囲気掴めてきましたか?後は全表示されている動画データから欲しい物だけ抽出して綺麗に整形して表示させれば記事になりそうですよね。結構簡単でしょ?
条件指定用のパラメータ変数を作る
リクエストURLがこのままだと動画データの抽出条件を変える時に分かりにくいので、パラメータだけを別のブロックに分けて見やすくしてみます。
function fanza_get_video(){
$search_option=array(
'api_id' => 'APIID',
'affiliate_id' => 'アフィリエイトID',
'site' => 'FANZA',
'service' => 'digital',
'floor' => 'videoa',
'hits' => 2,
'article' => 'genre',
'article_id' => 1034,
);
$request_url='https://api.dmm.com/affiliate/v3/ItemList?'.http_build_query($search_option, '&');
$res_data=json_decode(@file_get_contents($request_url), true);
var_dump($res_data);
return($res_data);
}
add_shortcode('fanza_get_video', 'fanza_get_video');
リクエストURLとパラメータの指定を別のブロックに切り離す事で再利用しやすくなりました、これでギャル以外の動画が欲しくなっても値を変える場所がすぐに分かりますね。
データを要素別に表示する
お次は取得したFANZAデータから必要な要素だけを取り出します、DMMAPIはjson形式でデータが返ってくるので「$res_data[‘階層1’][‘階層2’][‘階層3’][‘階層4’]…」と必要なデータ位置まで下がっていけばアクセスできます。
DMMAPIの検索結果は大抵複数なので、すべてのレコードを順番に表示するためは検索結果の件数分forで繰り返し処理します。
function fanza_get_video(){
$search_option=array(
'api_id' => 'APIID',
'affiliate_id' => 'アフィリエイトID',
'site' => 'FANZA',
'service' => 'digital',
'floor' => 'videoa',
'hits' => 20,
'article' => 'genre',
'article_id' => 1034,
);
$request_url='https://api.dmm.com/affiliate/v3/ItemList?'.http_build_query($search_option, '&');
$res_data=json_decode(@file_get_contents($request_url), true);
//var_dump($res_data["result"]["result_count"]);
for( $n = 0; $n < $res_data["result"]["result_count"]; $n++ ){
print($res_data["result"]["items"][$n]["content_id"]).'<br>';
print($res_data["result"]["items"][$n]["title"]).'<br>';
print($res_data["result"]["items"][$n]["volume"]).'<br>';
print($res_data["result"]["items"][$n]["review"]["count"]).'<br>';
print($res_data["result"]["items"][$n]["review"]["average"]).'<br>';
print($res_data["result"]["items"][$n]["URL"]).'<br>';
print($res_data["result"]["items"][$n]["affiliateURL"]).'<br>';
print($res_data["result"]["items"][$n]["imageURL"]["large"]).'<br>';
print($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']).'<br>';
print($res_data["result"]["items"][$n]["date"]).'<br>';
var_dump($res_data["result"]["items"][$n]["iteminfo"]["genre"]).'<br>';
var_dump($res_data["result"]["items"][$n]["iteminfo"]["actress"]).'<br>';
}
return($res_data);
}
add_shortcode('fanza_get_video', 'fanza_get_video');
記事作成に必要な要素をDMMAPIから抜き出す事ができました、取得したデータの内、ジャンルと女優情報が配列のままですが、後で配列のまま使うのでこれでOKです。
前回の続きから動画データを取得する工夫
DMMAPIの商品検索APIはyoutubeAPIのnext_page_token(API上の次ページボタンみたいな)的な気の利いた仕組みがないですし、1度のAPI実行で100件までしか取得できないので持続的に動画データを取得するには何件目までのレコードを取得済みか自前で記録しておく必要があります。
商品検索APIにはレコードの取得開始位置を指定するoffsetパラメータが用意されているので、自前で記録した取得済みレコード番号をoffsetパラメータにセットする事で、疑似的に前回の続きから動画データを取得できるぜ、という仕組みを考えてみました。
例えば300件の動画を100件ずつ取得する場合、イメージ的にはこんな感じ。
取得済みのレコード番号を保存する
番号だけ保存するなら簡単にwp_optionsに追加とかでもいいんですが、後で動画の重複チェックもやりたいので取得済みの動画情報を保存するテーブルをワードプレスのデータベースに作ります。このテーブル内に保存したレコードの件数をカウントすれば取得済みレコード件数も分かりますね。
一応課題として新作がリリースされた場合、API側のレコードの番号が+1されちゃって取得済みレコード件数と合わなくなり、データ収集の際新作の件数分間が飛ぶ事になっちゃいますが、FANZAの動画作品は数十万件あるのでそんなに影響ないかなと無視しております。
完璧にすべての動画データを取得するのであれば、処理実行の度、新作を何らかの基準で検知してその件数分取得済みレコードの総数からマイナスしてやればいい感じになりそうな気がします。
wordpressのデータベースにテーブルを作るスクリプトを書いてもいいんですが、最初の1回しか使わないスクリプトでコードが長くなっちゃうのは嫌なので、phpMyAdminから直接テーブルを追加しちゃいましょう。
function fanza_get_video(){
require_once(ABSPATH. "wp-admin/includes/upgrade.php");
global $wpdb;
$table_name = $wpdb->prefix. "fanza_video";
$wpdb->query( $wpdb->prepare(
"INSERT IGNORE INTO $table_name(
fanza_video_content_id,
fanza_video_title
) VALUE(%s, %s)",
'うんこ1',
'うんこ2'
));
$search_option=array(
'api_id' => 'APIID',
'affiliate_id' => 'アフィリエイトID',
'site' => 'FANZA',
'service' => 'digital',
'floor' => 'videoa',
'hits' => 20,
'article' => 'genre',
'article_id' => 1034,
);
$request_url='https://api.dmm.com/affiliate/v3/ItemList?'.http_build_query($search_option, '&');
$res_data=json_decode(@file_get_contents($request_url), true);
//var_dump($res_data["result"]["result_count"]);
for( $n = 0; $n < $res_data["result"]["result_count"]; $n++ ){
print($res_data["result"]["items"][$n]["content_id"]).'<br>';
print($res_data["result"]["items"][$n]["title"]).'<br>';
print($res_data["result"]["items"][$n]["volume"]).'<br>';
print($res_data["result"]["items"][$n]["review"]["count"]).'<br>';
print($res_data["result"]["items"][$n]["review"]["average"]).'<br>';
print($res_data["result"]["items"][$n]["URL"]).'<br>';
print($res_data["result"]["items"][$n]["affiliateURL"]).'<br>';
print($res_data["result"]["items"][$n]["imageURL"]["large"]).'<br>';
print($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']).'<br>';
print($res_data["result"]["items"][$n]["date"]).'<br>';
var_dump($res_data["result"]["items"][$n]["iteminfo"]["genre"]).'<br>';
var_dump($res_data["result"]["items"][$n]["iteminfo"]["actress"]).'<br>';
}
return($res_data);
}
add_shortcode('fanza_get_video', 'fanza_get_video');
テストデータのうんこを挿入する所までできました、色々新要素が出てきたので補足します。
$wpdbはwordpressのデータベースを操作する独自関数の塊で「$wpdb->〇〇〇」で任意の関数を呼び出す事ができまして、今回は$wpdb->prepareでレコードを挿入しようとしています。ただし$wpdbを使う前にglobalで宣言しないとこれらの関数は使えません、pythonのライブラリをimportするみたいな感じですね。
さらにデータベースにレコードを挿入するには関数実行時に「upgrade.php」を読み込んでおく必要があるので、require_onceで呼び出しています。
後は取得済み動画データを管理する「fanza_video」テーブルに同一動画のデータを入れたくないので、content_idが重複したレコードは挿入しないように設定しています。
レコードの重複チェックは自前で書くと結構面倒臭いんですが、mysqlのユニークキーとINSERT IGNORE INTOのコンボで簡単に実装する事ができます。テーブル内の重複チェックをしたいカラムにユニークキーを設定し、INSERTにIGNOREを付けるだけでデータベース挿入時に同一のデータが存在する場合挿入しない、なければ挿入する。という動きになります。
ユニークキーはTEXT型では設定できないのでfanza_video_content_idをVARCHAR型の100桁にしています、content_idは10桁くらいなのでそんなにいらないと思いますが、一応大は小を兼ねておきました。
offsetパラメータを設定する
取得済みの動画データを管理するテーブルまで完成したので、このテーブル内の件数をカウントしてoffsetパラメータへセットして連続的にFANZA動画を取得する仕組みに仕上げます。
function fanza_get_video(){
require_once(ABSPATH. "wp-admin/includes/upgrade.php");
global $wpdb;
$table_name = $wpdb->prefix. "fanza_video";
$fanza_video_count = $wpdb->query( $wpdb->prepare("SELECT * from $table_name") );
var_dump($fanza_video_count);
$fanza_video_total_count = 11285;
$fanza_hits = 3;
$fanza_offset = $fanza_video_total_count - $fanza_video_count - $fanza_hits + 1;
if( $fanza_offset <= 0 ){
$fanza_offset = 1;
};
$search_option=array(
'api_id' => 'APIID',
'affiliate_id' => 'アフィリエイトID',
'site' => 'FANZA',
'service' => 'digital',
'floor' => 'videoa',
'hits' => $fanza_hits,
'offset' => $fanza_offset,
'sort' => 'date',
'article' => 'genre',
'article_id' => 1034,
);
$request_url='https://api.dmm.com/affiliate/v3/ItemList?'.http_build_query($search_option, '&');
$res_data=json_decode(@file_get_contents($request_url), true);
//var_dump($res_data["result"]["result_count"]);
for( $n = 0; $n < $res_data["result"]["result_count"]; $n++ ){
print($res_data["result"]["items"][$n]["content_id"]).'<br>';
print($res_data["result"]["items"][$n]["title"]).'<br>';
print($res_data["result"]["items"][$n]["volume"]).'<br>';
print($res_data["result"]["items"][$n]["review"]["count"]).'<br>';
print($res_data["result"]["items"][$n]["review"]["average"]).'<br>';
print($res_data["result"]["items"][$n]["URL"]).'<br>';
print($res_data["result"]["items"][$n]["affiliateURL"]).'<br>';
print($res_data["result"]["items"][$n]["imageURL"]["large"]).'<br>';
print($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']).'<br>';
print($res_data["result"]["items"][$n]["date"]).'<br>';
var_dump($res_data["result"]["items"][$n]["iteminfo"]["genre"]).'<br>';
var_dump($res_data["result"]["items"][$n]["iteminfo"]["actress"]).'<br>';
$wpdb->query( $wpdb->prepare(
"INSERT IGNORE INTO $table_name(
fanza_video_content_id,
fanza_video_title
) VALUE(%s, %s)",
$res_data["result"]["items"][$n]["content_id"],
$res_data["result"]["items"][$n]["title"]
));
}
return($res_data);
}
add_shortcode('fanza_get_video', 'fanza_get_video');
まず前回作ったうんこ挿入ブロックをFANZA動画を繰り返し処理するforの中へ移動、DMMAPIのデータをfanza_videoテーブルへ入れるように変更しテストします。
DMMAPIのパラメータにoffsetとデータを発売日の降順に並び替えるためsortも追加しました。
後はFANZAのサイトからギャルのジャンルに振り分けられている動画件数を調べて$fanza_video_total_countへセットし、offsetに指定するレコード件数を計算しています。
作業動画でやるのを忘れていましたが、offsetの計算結果が0以下になる場合は1にするというのを14行目でやっています。
テスト用記事に何度かアクセスすると、取得済みテーブルのデータが前回処理の続きから追加され自動的に連番で取得できているのが確認できましたんでこれで完成です。
まとめ
ずいぶん長くなっちゃったので今回は一度ここで区切りまして、次回wordpress記事の自動生成機能を作っていきます(‘ω’)ノ
DMMの商品データを一括取得するアプリ「DeepKiss」
DMMの商品をツイッターに投稿したりアフィリエイトサイトを作りたかったんですが、DMMAPIでは100件刻みでしかデータ取得が出来なかったのでMAX50,000件まで1発で取得できるデスクトップアプリを作りました。
使っている様子はこんな感じ。
DMMの商品データが大量にあればブログのランキング記事も簡単に作れるようになりますし、商品データベースとして用いればアフィリエイトサイトの構築も難しくないです。取得できる項目には在庫情報も含まれているので、限定品やレア物をピックアップすればそのまませどり用のリストにも使えます。
データ取得はアプリにお任せ、商品紹介でゴリゴリ稼ぎたい方はぜひお試し下さいm(_ _)m
個人開発プログラマーを応援するメンバーシップを始めました('ω')ノ
質問・要望・共同作業など、みんなのやりたい事をスマイルがお手伝いします。立ち上げたばかりでよく分かってないので、とりあえず何でもありやってみます。
コメント
現在こちらのシリーズを順番に追っています。
分からないなりに何とか進めてwp-cronでワードプレス記事の自動投稿機能を実装するの記事の最後のスクリプトまでたどり着きました。ジャンルとかIDを自分に合うように設定してやってみたのですがどうもうまく動作しません。心当たりがあるとしたらこの記事のテーブルを作成してテストデータを…というところです。ここはwordpressにコードを書き込むのではないステップがあったのでお手上げになり飛ばしてました。動画内でされているようなphpMyAdminでの操作をしなければならないということでしょうか?
管理人のスマイルです(‘ω’)ノ
>動画内でされているようなphpMyAdminでの操作をしなければならないということでしょうか?
データベースにFANZA商品データ用のテーブルを作成していないという事でしょうか?であれば動かないと思います。
苦手であれば操作はphpMyAdminじゃなくても構わないです。
このシリーズで作っている動画まとめサイトはAPIから直接商品情報を記事に表示しているわけじゃなくて、いったんワードプレスのデータベースに動画情報を保存し、そこから記事へ読み込む仕組みになっています。
よろしくお願いしますm(_ _)m
ありがとうございます。phpmyadminでテーブルを作りました。動画の通りに進めたのですが、この記事のwordpressのテーブルを作成してテストデータを…というタイトルの動画の5:52あたりのような挙動にならず「返り値が空でした」とでます。動画の通りページのリロードもしました。テーブルの作り方は名前も含めて動画をまねています。スクリプトはコピペしてAPIIDとアフィリエイトIDだけ自分の物を入れてます。他にも変えるべき場所はありますか?
管理人のスマイルです(‘ω’)ノ
> 5:52あたりのような挙動にならず「返り値が空でした」とでます。
「返り値が空でした」ならFANZAのデータが上手くテーブルに保存されていないんだと思います。文字だけでは何が原因か分からないのでお問い合わせから作業画面のスクショを送って貰えますか?
よろしくお願いしますm(_ _)m
お問い合わせの返信も含め大変丁寧に対応していただきありがとうございました。
前のテーマに特にこだわりはなかったのでテーマをcocoonに変更してもう一度全て作り直した結果上手く動作するようになりました!繰り返しの質問に何度も答えていただき本当にありがとうございました。今後ともよろしくお願いします。
色々勉強させてただいております。
既出ですが、wordpressのテーブルを作成してテストデータを…というタイトルの動画の5:52あたりの挙動にはなりません泣。APIIDとアフィリエイトIDを除き、その他はすべて真似ていますが、DBでは返り値が空でした (行数 0)。何度もリロードやら、キャッシュ削除なども試みましたが、ダメでした。ワードプレスの記事ではFANZAの商品情報を取得できているみたいですが、、、。素人なだけに、どこを見直せばいいのやらまったくわかりません。ご教授頂けませんか?
管理人のスマイルです(‘ω’)ノ
>既出ですが、wordpressのテーブルを作成してテストデータを…というタイトルの動画の5:52あたりの挙動にはなりません泣。
文字だけでは何が原因か分からないのでお問い合わせから作業画面のスクショを送って貰えますか?
よろしくお願いしますm(_ _)m