見出し画像

【FANZA】サンプル動画一括ダウンロード方法(Selenium不使用)

【本記事は2022/8/1現在の情報を元に記載しています、FANZA側の仕様変更があった場合は挙動が異なる場合があります】 

今回紹介する方法を実装したソフトウェアをBOOTHで販売しております。
ダウンロードいただけると喜びます。
【2024/01/20更新】
https://sawadai.booth.pm/items/5386760


概要

FANZA(旧DMM.R18)といえば、国内最大級のアダルト動画配信サイトではないでしょうか。
FANZAはサンプル動画をダウンロードしてアフィリエイト素材として活用することが認められてます。(https://support.dmm.com/affiliate/article/47545

そのため、WebサイトやTwitterでアフィリエイトリンクをクリックしてもらうために動画素材が活用できます。(画像よりも動画の方が訴求できるのでありがたいですね!)

そうはいっても動画をダウンロードして、投稿するのは思いのほか面倒で時間がかかります。

そこで、現役エンジニアの筆者がサイトを解析して、効率的なダウンロード方法を見つけたので公開します。

ダウンロード方法

年齢確認

Fanzaは年齢確認画面があるので、いきなりダウンロードしようとしてもできません。
ダウンロードするためには年齢確認を突破する必要があります。
年齢確認は毎回入るわけではないですよね、一度アクセスしたら、しばらくは確認はされず、気がついたら再度年齢確認されるという感じです。
こういった動作はcookieという仕組みを使う事が多いので、cookieを見ていきます。
cookieを見るときは、シークレットウィンドウを使います。

Chrome Developer toolsでCookie確認

『Cookieの確認はNetwork -> ファイルをクリック -> Cookiesをクリック』で確認できます。
まだ年齢確認前ですが、いろいろなCookiesが確認できます。
年齢確認前と確認後のCookiesの値を比較してみましょう。

年齢確認後のCookies

なにやら、【age_check_done】という項目が増えてます。名前的にもこのフラグが可能性高そうです。確認してみましょう。

$ curl https://www.dmm.co.jp/top/ 
Redirecting to: https://www.dmm.co.jp/age_check/=/?rurl=https%3A%2F%2Fwww.dmm.co.jp%2Ftop%2F

age_check_doneをセットせずにアクセスすると年齢確認画面にリダイレクトされているのがわかります。
ではage_check_done=1をセットしてアクセスしてみましょう。

$ curl https://www.dmm.co.jp/top/ -b "age_check_done=1"
<!DOCTYPE html>
<html lang="ja">

<head prefix="og: http://ogp.me/ns# article: http://ogp.me/ns/article#">
  <meta charset="UTF-8">
  <title>FANZA 日本最大級のアダルトポータル (旧DMM.R18)</title>
  <meta name="description" content="【FANZA(ファンザ)】 アダルト動画・DVD通販、アダルトゲーム、ライブチャット、同人誌等の総合アダルトサイト。人気AV女優の独占作品やオリジナルゲームなど各種アダルトコンテンツが豊富!創業20年の実績で多くの会員様にご利用いただいている安心安全なアダルトサイトです。">

無事に年齢確認突破できましたね。
今後ダウンロードをはじめ、アクセスする際にはこのヘッダを付与するのを忘れずに。

URL構造

作品URL:https://www.dmm.co.jp/litevideo/-/detail/=/cid=nnpj00466/
サンプル動画URL:
https://cc3001.dmm.co.jp/litevideo/freepv/n/nnp/nnpj00466/nnpj00466_mhb_w.mp4
サンプル動画URL一般化:https://cc3001.dmm.co.jp/litevideo/freepv/VIDEOID先頭文字/VIDEOID3先頭文字/VIDEOID/VIDEOID_ビットレート.mp4

VIDEOID:作品URLのcid
ビットレート:
300kbps mhb_w
1000kbps dm_w
1500kbps dmb_w
3000kbp smhb_w

pythonだとこんな感じでしょうか。
作品URLからVIDEOIDを取り出し、動画ファイルのURLとして組み立てていきます。

baseurl = "https://cc3001.dmm.co.jp/litevideo/freepv/"
video_name = url.split("cid=")[-1].strip("/")
video_url = "%s%s/%s/%s/%s_mhb_w.mp4"%(baseurl, video_name[0], video_name[0:3], video_name, video_name)

URLリスト作成

今回は一括ダウンロードが目的ですので、ダウンロードする作品リストを作ります。新着順、人気順(=再生回数順前日)、再生回数順全期間の3種類があります。

新着順、60件、2ページ目の作品リストURL
https://www.dmm.co.jp/litevideo/-/list/=/limit=60/sort=date/page=2/

一般化:
https://www.dmm.co.jp/litevideo/-/list/=/limit=件数/sort=並び順/page=ページ数/

作品URLリストから各作品のURLを取得するには、aタグでかつ、リンク先に『/litevideo/-/detail/』が含まれるものになります。
pythonだとこんな感じでしょうか、

res = requests.get(target_url,cookies=data, headers=header)
soup = bs4.BeautifulSoup(res.text, 'html.parser')
video_list = soup.find_all('a', {'href':re.compile("/litevideo/-/detail/.*")})

これでvideo_listは作品URLリストになってますので、一つずつダウンロードしていけばOKです。

動画の長さ

Twitterで動画投稿する場合は140秒までの仕様なので、140秒以上の動画はアップロードに失敗します。
チェック機能の実装方法はいくつかありますが、Pythonだとpymediainfoというライブラリが使えます。

media_info = MediaInfo.parse("XXX.mp4")
duration = media_info.video_tracks[0].duration
if duration > 140000:
    Twitterに投稿しない

これくらいの短いコードで判定できるので、ラクチンですね。

宣伝

今回の方法を実装したソフトウェアをBOOTHで販売しております。
【2023/4更新】Windows版(GUI) / Linux版(CLI)販売しております。
https://bit.ly/3wRpbLo



この記事が気に入ったらサポートをしてみませんか?