📝DMM Development

📝DMM Development

主に DMM Web API について.

DMM WebサービスAPI ver3 #

フロア #

APIを叩くときのサブカテゴリのようなもの.

ref. フロアAPIリファレンス - DMM API

例えばFANZA動画だと以下の通り.

  • videoa : ビデオ(VR含む)
  • videoc : 素人
  • nikkatsu: 成人映画
  • anime : アニメ動画

またfloorごとに割り振られるgenre_idは異なる.

Responseデータ #

bodyにデータが入っている. body>result>itemsを基本的には見る.

  • request: request情報
  • result: response情報.
    • items: 取得結果リスト.

API利用制限 #

利用規約には以下とある.

2.当社は、ウェブサービスの使用につき別途定める内容の制約(アプリケーションの利用範囲・仕様、アクセス回数、アクセス時間、情報更新の頻度、アクセスに関する表示、送信データの容量および特定の情報の記載を含むがこれに限られません)をすることができるものとし、デベロッパーはこれを承諾するものとします。

しかし制限はあるがしきい値の詳細は非公開とアフィリエイトセミナーで言ってた(1次情報).

クレジット表記 #

大事なのでココに書いておく.

Powered by FANZA Webサービス を書く.

DMM API SDK #

公式と非公式合わせて, 各言語ごとにまとめ.

DMM API Web Services #

商品検索API絞り込み #

ジャンル指定で検索するには? #

以下を指定して商品情報APIを叩く.

  • article: “genre”
  • article_id: genre_id

なお複数ジャンルの検索には対応していなさそうなのでクライアント側で複数回. APIを叩いて結果をマージする必要がありそう(実績ベース, ドキュメントなし. article_idに配列を指定してもカンマ区切り文字列指定もできなかった).

キーワード指定で検索するには? #

keyword に単語を設定する. これはWEB UIの検索窓から検索したものと同じものがレスポンスデータとして返る.

そして検索はタイトルと商品説明に対する文字列一致のよう.

監督やレーベルで絞り込むには? #

ref. 商品情報APIリファレンス - DMM API

DMMのAPIドキュメントによると絞り込み項目は以下のようになっているがこれは現在の仕様にドキュメントの修正が反映されていない可能性がある.

女優:actress
作者:author
ジャンル:genre
シリーズ:series
メーカー:maker

たとえばauthorを指定するとなにもレスポンスに情報は存在しない. product apiのiteminfoのMapにあらわれるパラメータでdirectorというものががありそれとdirectorに紐づくIDを指定するとその監督で絞り込むことができる.

{:genre    [{:id 6533, :name "ハイビジョン"}
              {:id 79015, :name "4K"}
              {:id 6548, :name "独占配信"}
              {:id 5063, :name "主観"}
              {:id 4025, :name "単体作品"}
              {:id 6017, :name "ギリモザ"}],
 :maker    [{:id 3152, :name "エスワン ナンバーワンスタイル"}],
 :actress  [{:id 1060824, :name "鷲尾めい", :ruby "わしおめい"}],
 :director [{:id 101211, :name "TAKE-D", :ruby "たけでぃー"}],
 :label    [{:id 3474, :name "S1 NO.1 STYLE"}]}

iteminfoの内容が上の内容だとすると, authorというパラメータは存在せず, 変わりにdirectorとlabelが存在する(そして実際に取得できた).

素人動画ジャンルを取得するには?(videoa/videoc) #

素人ジャンルはfloor codeがvideoa, vidiocに分かれているので注意.

アニメ動画ジャンルを取得するには? #

floor=animeを指定する.

VR動画を取得するには? #

floor=videoa, genre=6793(VR専用)を指定する.

Webサイトだとvideovrのようなパスとなっているがvideoaを指定するよう(2022現在).

またハイクオリティVRにはVR専用のタグが必ずついているのでVRで絞り込みたい場合はVR専用のみで問題ない(変更される可能性はありなのでプログラムの設計はそれを考慮する必要あり).

FANZA Bookの商品情報を取得するには? #

serviceに ebook, floorに comic を指定して商品検索APIを叩く.

DMM API Tips/HOWTO/FAQ #

ジャンルとキーワードの両方で絞り込みはできるか? #

genreとkeywordを両方指定したらgenreが優先された.

おそらくarticle全般も同じ可能性あり. ひとつの項目でしか絞り込めない.

cidのリストを指定して商品APIを呼ぶには? #

商品情報APIはソートのルールと取得件数を指定して一括で情報を取得することを前提としている. リクエストパラメータとしてcid単体の指定はできるので, これを何回もわけてよぶしかなさそう.

数が多ければ並列でのAPIを呼び出して結果をjoinするなどの工夫で高速化は可能. ただし呼び出し回数制限もあるため注意は必要. どちらかというと一括呼び出してでなるべくサーバに負担をかけないように仕様的な工夫をしたほうがいい(礼儀的に).

product_idとcontent_idの違いは? #

cidと略されるcidとは別にproduct_idというものが存在する. 日本語表記では, 商品IDがcontent_id, 品番がproduct_id.

content_idの広義がproduct_idであり, 配信形式を含む.

DMMアフィリエイトのセミナーで開発担当者に直接質問してこの解答を得た. ただ制御的にはcidさえ扱えば良さそう.

DMM APIの呼び出し回数に制限はあるか? #

ある. しかし詳細は非公開とのこと(アフィリエイトセミナーにて).


呼び出し制限のような事象が発生. エラー内容は以下.

  • statsu: 400
  • message: BAD REQUEST
  • api_id: Invalid Request Error

api_idを単位に規制されるようだ. ちなみにgenre-id=4021を指定するつもりが取得数4021を指定してしまった結果41個のスレッドで一斉にAPI呼び出してこうなった…

-> よかった, 10分程度で解除された.

サンプル動画がURL先にないがサイトで公開されているときの取得方法 #

メーカーやDMMの意図があるのでそもそもそれを取得してはいけない可能性ありなのでやらないほうがいい.

とくに最近(2022~)はDMMでは一部のメーカーに限り無料サンプル動画を素材として開放することが正式にアナウンスされている.


無料動画にホスティングされている動画へのURLは以下の形式であることがおおい.

https://cc3001.dmm.co.jp/litevideo/freepv/{maker_code:1digit}/{maker_code:3digits}/{cid}__mhb_w.mp4

ただしやっかいなのが必ずしもこのURLが有効かは限らない. ここに存在するかどうかはHEAD Requestを投げて判定できる. ここに存在しない場合もある程度法則性があるので候補のURLパターンを生成してHEADで総当り検索をかけるとヒットする. この手のテクニックはGitHubで cc3001.dmm.co.jp をキーワードにして検索すると中国人ハッカーたちのスクレイピングコードがたくさんでてくる.

またはAPIで取得できるサンプル動画URLのページをさらにHTML解析するとただしい動画URLがありこちらは確実に取得できる.

動画の週次ランキングや月間ランキングを取得するには? #

APIでは無理(かな?).

APIでのsort:rankを指定して取得できる並び順は最新のランキング.

sort=“match"という値もあるものの取得できる情報はrankと同じ.

同人ジャンルの作品形式の判定方法 #

同人の場合, すべてのジャンルは一つのフロアコードに集約されている(service=“doujin”, floor=“digital_doujin”). そのためAPIレスポンスのimageURLから判定が必要.

;; CG
https://pics.dmm.co.jp/digital/cg/d_205949/d_205949pl.jpg

;; コミック
https://pics.dmm.co.jp/digital/comic/d_227233/d_227233pt.jpg

;; ゲーム
https://pics.dmm.co.jp/digital/game/d_226142/d_226142pt.jpg

;; 音声
https://pics.dmm.co.jp/digital/voice/d_217813/d_217813pl.jpg

またWeb UIからは動画とコスプレ動画の作品形式があるがどちらもCGジャンルに分類される. volumeフィールドかgenreで絞り込みは可能.

DMMスクレイピング #

スクレイピング技術についてはGitHubを検索すると中国人ハッカーのコードばかりでてくる. 彼らはグレートファイアウォールを超えて情報を取りに来るのだろう.

FANZA 年齢認証を突破するには? #

推測ではclickをトリガにしてJavaScriptでページ遷移するためブラウザ操作では突破できなさそう. Script実行による突破も考えられるものの, cookieに属性を設定する方法が楽.

cookieにage_check_done を設定する.

  • ‘cookie’: ‘age_check_done=1’

一度認証を通ったらcookieは保存して使いまわすのがよい.

ref. 🔗FANZAのスクレイピングで年齢確認を突破する方法

追記: URLの末尾に / がないと突破できなくてハマった…

メモ: パラレルな同時取得の実験 #

Clojureの強力なconcurrencyの記法で300スレッドで一気に取得しても問題なかったし数秒でレスポンスが帰ってきた. 倫理的には問題あるが, さすがはDMMのWebサービスだけあって高負荷でも問題なし(やってはいけない).

References #