adafi tips

PR / 18歳未満閲覧禁止

DMM 女優検索APIの使い方|取れる項目と動くPHPコード

公開日
更新日
タグ
API
DMM 女優検索APIの使い方|取れる項目と動くPHPコード

DMMの女優検索API(ActressSearch)は、名前・頭文字・スリーサイズ・身長・生年月日で女優を探して、プロフィールと作品一覧のアフィリエイトURLを返すAPIです。2026年10月17日に呼ぶと登録は60,696人。ただし、バストが入っているのは8,791人、身長は6,432人で、プロフィールで絞り込める女優は、全体の1割前後しかいません。

1割前後、という数字には、数えたわたし(記事担当の伊緒)も驚きました。もとにしたのは、2023年12月にオーナーが女優検索APIを試して書いた記録とPHPのコードで、今のAPIで動かし直し、項目ごとの埋まり具合まで数えて書き直しています。

当時のコードは、直さなくても今のAPIで動きます。違っていたのは、返ってくる作品一覧のURLの種類と、データの件数。

「女優軸でブログを作ってるから、このAPIは期待大」と、当時のオーナーはかなり張り切っていたそうです。6万人ぶん数え終わるころには、ミルクティーが2杯目になっていました。

秋の午前、イチョウの落ち葉が積もった公園のベンチで、伊緒が2杯目のミルクティーのカップを両手で包み、目を閉じてひと息ついている

女優検索APIで取れる項目

1人ぶんの応答で返ってくるのは、女優ID・名前・読み・スリーサイズ・カップ・身長・生年月日・血液型・趣味・出身地・画像のURL・作品一覧のURLです。ただし、全員にすべての項目が入っているわけではありません。

60,696人を100人ずつ全部取って、項目ごとに値が入っている人数を数えました。

項目キー値が入っている人数全体に対する割合
画像imageURL16,852人約28%
バストbust8,791人約14%
身長height6,432人約11%
カップcup6,337人約10%
生年月日birthday4,952人約8%
趣味hobby3,955人約7%
血液型blood_type3,743人約6%
出身地prefectures3,399人約6%

空の項目は、null か空の文字列で返ってきます。画像が無い女優は、imageURL の項目そのものがありません。表示するときは、値があるかを1項目ずつ確かめる作りにしておくと安全です。

作品一覧のURL(listURL)は、動画(digital)・月額動画(monthly)・DVD通販(mono)の3つが返ってきます。オーナーのコードにはDVDレンタル(rental)の分岐もありましたが、今の公式リファレンスの項目表には載っておらず、取ったデータにも出てきませんでした。

絞り込みに使えるパラメータ

絞り込みに使えるのは、頭文字・女優ID・キーワード・バスト・ウエスト・ヒップ・身長・生年月日の8つです。カップと出身地では絞り込めません。

絞り込みたいものパラメータ書き方の例
頭文字(50音)initialあ
女優IDactress_id15365
名前の一部keywordいちか
バストgte_bust・lte_bustgte_bust=90 で90cm以上
ウエスト・ヒップ・身長gte_waist・lte_hip・gte_height などバストと同じ
生年月日gte_birthday・lte_birthdaygte_birthday=1995-01-01 で1995年1月1日以降生まれ
並び順sort-birthday(生年月日の新しい順)・bust・id など
1回に取る人数hits初期値20・最大100

試していて、つまずきそうなところが3つありました。

  • 生年月日はハイフン入りで書く。リファレンスの説明には「yyyymmddの形式」とありますが、19950101 と送るとエラー(The gte_birthday field is not in the correct format.)になりました。1995-01-01 なら通ります
  • hits を101以上にするとエラー。The hits field must contain a number less than or equal to 100. が返ります。全員を取りたいときは、100人ずつ offset をずらして呼びます
  • カップ(cup=G など)は、送っても無視される。エラーにはならず、60,696人がそのまま返ってきます。カップで分けたいときは、取ったあとに自分で振り分けます

当時オーナーが書いていたとおり、体型や年齢の条件で女優を引けるのは、このAPIの強みです。たとえば、バスト90cm以上は2,274人、1995年1月1日以降生まれでバスト90cm以上は106人でした。

バストの条件を何通りも変えて数えたのは、仕様を確かめるためです。……90cm以上が2,274人、まで覚えてしまったのは、確かめた副作用にすぎません。

夜のホテルのロビーのソファで、伊緒がタブレットの条件のつまみを指で動かしながら一覧を確かめ、耳まで赤くなっている

2023年のPHPコードを、今のAPIで動かした結果

オーナーが当時書いたコードは、APIのIDを入れ替えるだけで、今も動きました。100人ぶんの名前・プロフィール・作品一覧へのリンクが並び、総データ数は60,696件と表示されます。

そのうえで、今のAPIに合わせて、わたしが次の4か所を直しました。直したあとのコードも、手元のサーバーで動くことを確かめています。

  1. 画像のURLを https:// に置き換える。APIが返す画像のURLは http:// で始まります。httpsのサイトに http:// の画像を置くと、ブラウザが読み込まないことがあります。https:// に変えても、同じ画像が開きました
  2. 画面に出す値をエスケープする。名前や趣味の文字をそのまま出さず、htmlspecialchars を通します
  3. DVDレンタルの分岐を外す。今は rental が返ってこないためです
  4. エラーの理由を読めるようにする。当時のコードは、パラメータが間違っているとPHPの警告が出るだけで、理由が分かりませんでした。しかもその警告には、API IDの入ったURLがそのまま出ます。直したコードでは警告を止め、APIが返すエラーの理由だけを表示します
<?php
// エンドポイント
$url = "https://api.dmm.com/affiliate/v3/ActressSearch";
// パラメータ(使わない条件は空のままでよい)
$params = [
  "api_id" => "あなたのAPI ID",
  "affiliate_id" => "あなたのアフィリエイトID", // 末尾が990〜999のもの
  "gte_bust" => "",        // 例:90 ならバスト90cm以上
  "lte_bust" => "",
  "gte_height" => "",
  "lte_height" => "",
  "gte_birthday" => "",    // 例:1995-01-01(ハイフンが要る)
  "lte_birthday" => "",
  "keyword" => "",
  "hits" => "100",         // 100まで。101にするとエラー
  "offset" => "1",
  "sort" => "-birthday",
  "output" => "json"
];

// 画面に出す値は必ずエスケープする
function h($s) { return htmlspecialchars((string) $s, ENT_QUOTES, 'UTF-8'); }

// エラーのときも、APIが返す理由(JSON)を読めるようにする
$context = stream_context_create(["http" => ["ignore_errors" => true, "timeout" => 30]]);
// @ で、つながらないときの警告を止める(警告には API ID の入った URL がそのまま出る)
$json = @file_get_contents($url . "?" . http_build_query(array_filter($params, "strlen")), false, $context);
$data = json_decode((string) $json, true);
if (($data['result']['status'] ?? '') != '200') {
  // エラーの応答は request の中に API ID を返すので、result の中の理由だけを出す
  exit('APIのエラー:' . h(json_encode($data['result']['errors'] ?? $data['result']['message'] ?? 'APIにつながりませんでした', JSON_UNESCAPED_UNICODE)));
}
$total = $data['result']['total_count'];
$rows = $data['result']['actress'];

// 項目名と、APIのキー
$profile = [
  "女優ID" => "id", "バスト" => "bust", "カップ" => "cup", "ウエスト" => "waist",
  "ヒップ" => "hip", "身長" => "height", "生年月日" => "birthday",
  "血液型" => "blood_type", "趣味" => "hobby", "出身地" => "prefectures",
];
$lists = ["digital" => "動画", "monthly" => "月額動画", "mono" => "DVD通販"];
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>DMM API ACTRESS</title>
</head>
<body>
  <p>総データ数 <?= h($total) ?>件</p>
  <div style="display:flex;flex-wrap:wrap;">
    <?php foreach ($rows as $row) : ?>
      <section style="width:33%;display:flex;gap:1rem;padding:1rem;box-sizing:border-box;">
        <div>
          <?php $img = $row['imageURL']['large'] ?? $row['imageURL']['small'] ?? ''; ?>
          <?php if ($img !== '') : ?>
            <img src="<?= h(str_replace('http://', 'https://', $img)) ?>" alt="<?= h($row['name']) ?>" width="100">
          <?php endif; ?>
          <?php foreach ($lists as $key => $label) : ?>
            <?php if (!empty($row['listURL'][$key])) : ?>
              <div><a href="<?= h($row['listURL'][$key]) ?>" target="_blank" rel="sponsored noopener"><?= $label ?></a></div>
            <?php endif; ?>
          <?php endforeach; ?>
        </div>
        <div>
          <div><?= h($row['name']) ?> <small>[ <?= h($row['ruby']) ?> ]</small></div>
          <?php foreach ($profile as $label => $key) : ?>
            <?php if (!empty($row[$key])) : ?>
              <div><?= $label ?> : <?= h($row[$key]) ?></div>
            <?php endif; ?>
          <?php endforeach; ?>
        </div>
      </section>
    <?php endforeach; ?>
  </div>
  <a href="https://affiliate.dmm.com/api/"><img src="https://p.dmm.co.jp/p/affiliate/web_service/r18_135_17.gif" width="135" height="17" alt="WEB SERVICE BY FANZA" /></a>
</body>
</html>

api_id と affiliate_id は、ご自身のものに書き換えてください。アフィリエイトIDは、末尾が990〜999のものでないとエラーになります。

最後の行の画像は、DMMのAPIを使ったサイトに出すよう決められているクレジットです。公式のクレジット表示のページにあるHTMLを、変えずにそのまま使います。

2023年のオーナーの見立てを、今の数字で見直すと

当時オーナーは、登録が57,125件(2023年12月)あるものの、「有効なデータは6,000〜8,000件くらい」と見ていました。今の数字に当てはめても、この見立ては大きく外れていません。

2023年12月(オーナー)2026年10月17日(伊緒)
登録の人数57,125件60,696件
有効なデータ6,000〜8,000件くらいバストあり8,791人・身長あり6,432人

当時の6,000〜8,000件は、offset を変えて調べた見立てです。今、バスト・身長・生年月日・出身地の4つがそろうのは3,010人でした。

もう1つ、当時「頭文字(たとえば「あ」)で呼ぶと、顔写真の無いデータも混ざる」とも書いていました。今も同じで、画像がある女優は全体の約28%。頭文字「あ」の5,983人で見ても、バストが入っているのは1,011人だけでした。

女優の一覧ページを作るなら、頭文字で全員を並べるより、gte_bust=1 のように「値が入っている人だけ」が返る条件を足すほうが、中身のあるページになります。バストが1cm以上、という条件にすれば、プロフィールの無い女優が外れるからです。

図解。頭文字「あ」で呼ぶと5,983人が返るが、バストが入っているのは1,011人だけで、残りはバストが空のため、プロフィールの空いた女優が多く混ざる。帯の緑の長さは5,983人のうちの1,011人に合わせている。gte_bust=1 を足すと、返るのはバストが1cm以上の人だけになり、プロフィールの無い女優が外れて中身のあるページになる(全体でバストが入っているのは8,791人)。登録は60,696人で、バスト・身長・生年月日・出身地の4つがそろうのは3,010人

オーナーが「ネタに使えそう」と書いていた趣味と出身地は、使うなら少し注意が要ります。趣味が入っているのは3,955人、出身地は3,399人で、どちらも全体の1割に届きません。プロフィールが充実した女優のページで、話題の1つとして使うくらいがちょうどいいと思います。

趣味や出身地は、値が入っている女優のページにだけ出す作りにしておくと、空欄だらけのページになりません。

女優IDで、その女優の作品を取るには

女優検索APIで分かった女優IDを、商品情報API(ItemList)の article=actress と article_id に入れると、その女優の作品だけが返ってきます。女優のプロフィールページの下に、作品の一覧を並べたいときの組み合わせです。

図解。女優検索APIで名前やプロフィールから女優を探し、応答の id(女優ID)を受け取る。その女優IDを、商品情報API(ItemList)の article=actress と article_id=女優ID に入れて呼ぶと、その女優の作品だけが返り、プロフィールページの下に作品の一覧を並べられる。コードを書く前に試すなら、女優検索のツールで女優IDを調べ、商品検索のツールの「絞り込みの種類:女優」「絞り込みのID」に入れる

DMM 女優検索のツールで女優IDを調べて、FANZA・DMM 商品検索のツールの「絞り込みの種類:女優」「絞り込みのID」に入れると、ブラウザだけで流れを確かめられます。

よくある質問

カップ数で女優を絞り込める?

APIでは絞り込めません。cup を送っても無視され、全員が返ってきます。カップは応答の項目には入っているので、取ったあとにPHPなどで振り分けます。カップが入っているのは6,337人でした。

出身地ごとの女優の一覧は作れる?

APIに出身地の条件は無いので、全員を100人ずつ取ってから、prefectures の値で分けます。出身地が入っているのは3,399人で、47都道府県すべてに1人以上いました。ただ、東京都の1,518人に対して、徳島県と鳥取県は1人だけです。「東京」と「東京都」のように書き方がそろっていない値や、海外の地名も混ざっているので、分ける前に表記を整えます。

1回に何人まで取れる?

100人までです。hits を101以上にするとエラーになります。60,696人を全部取るには、offset を1・101・201…とずらしながら、607回の呼び出しが必要です。商品情報APIは offset が50,000までですが、女優検索APIは50,000を超えても最後の1人まで取れました。

女優を人気の順に並べられる?

女優検索APIだけでは難しいです。並び順に選べるのは、名前・バスト・ウエスト・ヒップ・身長・生年月日・女優IDの7つで、人気の順はありません。人気で並べたいときは、商品情報APIを sort=rank(人気順)で取り、作品に出ている女優を数えます。

この記事で作ったAPIは、ツールで試せます

キーワードや条件を変えて、APIが返す実際のデータを確かめられます。

この記事を書いた人

伊緒

オーナーの下で、記事を担当しているスタッフです。オーナーが試したことを聞いて記事にし、公式の資料やAPIで今も合っているかを確かめ直しています。週末の朝は、道場で弓を引いています。

伊緒の自己紹介|伊緒の業務日誌

「API」のほかの記事

すべて見る