Skip to content

Instantly share code, notes, and snippets.

@kurema
Last active June 30, 2021 02:19
Show Gist options
  • Save kurema/24ea20fd5f47103ce8f71197b0569352 to your computer and use it in GitHub Desktop.
Save kurema/24ea20fd5f47103ce8f71197b0569352 to your computer and use it in GitHub Desktop.
DMMブックス/ebookjapanで無料本をカートに追加するスクリプト

F12→コンソール、で入力

filename detail
dmm_books.js DMMブックス。jquery利用可。カート100冊。ジャンル毎に無料ページが別。
ebookjapan.js ebookjapan。実行後次ページへ遷移。0円の本のみ対象。カート400冊。

ebookJapanのバグ

  1. 「無料」表示でカートに入れると有料:閲覧無料・購入有料の本がR18で閲覧不可能の場合、カートアイコンが表示されることがあるらしい。その場合、実は有料。「0円」との記載がないので見分けられる。
  2. 「既に購入済みの本は購入できません。」:この場合、カート上で確認不能なので空にするしかない。面倒。日付変更後でバッチ処理が走ってない?AJAXのタイミング?APIはどの本か教えてくれるが、UIでは確認できない。
  3. 「セットに含まれる本が買い物カゴに入っています。」:意味不明だしカートをスクロールしてもそんなのはない。しばらく放置すると解決するかも。謎。
  4. 0円の購入にクーポン(500円引きとか)を利用しようとする。ガチでウザい。購入まで進めるかは確かめていない。

キーワード

  • 分冊系
    • 分冊
    • 単話
    • 連載版
    • 1話
    • 話売り
    • ばら売り
    • 掲載版
      • 雑誌掲載版
  • 試し読み
    • 試し読み
    • 試読
    • お試し版
    • 無料
    • サンプル

30ページくらいの実質分冊本があるけど、それは表示上見分けがつかないこともある。
「試し」だとさすがに誤爆が怖い。

//コミック (BL/TLも含む?)
//https://book.dmm.com/list/free/comic/?floor=Gcomic&article=category&price_max=0&sale=discount&sort=date
//文芸
//https://book.dmm.com/list/free/novel/?floor=Gnovel&price_max=0&sale=discount&sort=date
//ビジネス・実用
//https://book.dmm.com/list/free/otherbooks/?floor=Gotherbooks&price_max=0&sale=discount&sort=date
//女性コミック
//https://book.dmm.com/list/free/comic/?floor=Gcomicf&price_max=0&sale=discount&sort=date
//写真集
//https://book.dmm.com/list/free/photo/?floor=Gphoto&price_max=0&sale=discount&sort=date
//一括でカートに追加します。多分予約とかも?無料かのチェックはしていません。
$('.m-boxDcFlatBtn--addToBasketList a, .m-boxDcFlatBtn--reserveList a, .fn-addBascket a, .fn-addBasketNoText a, .fn-addReserve a').each(function(){$(this).click();})
//Fanzaブックスはなぜかバスケットに追加ボタンがないので、
//「お気に入り追加」→「お気に入りリスト」→「120件表示」→「すべて選択」→「選択項目をバスケットに入れる」
//の手順で一括購入ができます。お気に入り機能を使ってる人は知りません。
//ただし購入済みの作品が追加されたり、無料のはずが有料だったり挙動が怪しいです(たぶん「シリーズまとめる」みたいな機能がオンになっていて、「0円~」表示になってる。うち0円本を購入済みの場合は有料の部を追加している)。。。
//ちなみにバスケットに追加した分は自動でお気に入りから削除されます。便利。
//無料本の検索はURLに
//&price_max=0
//追加とかで。
//
//コミック
//https://book.dmm.co.jp/list/comic/?floor=Abook&price_max=0&sort=date
//小説
//https://book.dmm.co.jp/list/novel/?floor=Anovel&price_max=0&sort=date
//写真集
//https://book.dmm.co.jp/list/photo/?floor=Aphoto&media=photo&price_max=0&sort=date
//下のコードでお気に入りに一括追加します。
$(".m-boxDcFavoritesListBtn.fn-addToFavorites").each((i,e)=>{e.click();});
//下のコードで無料本だけチェックします。
$("p.price").each((i,e)=>{let pr=e.childNodes[3].innerText;if(pr==="---" || pr==="0"){e.closest("li")?.querySelector("input[type='checkbox']").click();}})
//残った有料本は一括チェックで削除でもしてください。
// 「今すぐ読める!無料まんが・本一覧 」
//https://ebookjapan.yahoo.co.jp/free/books/
// 0円と表示がされている本をカートに追加後次ページへ遷移
Array.prototype.forEach.call(Array.prototype.filter.call(document.querySelectorAll(".price"),function(item){return item.firstChild.innerText==="0";}),function(item){let btn=item.closest(".item-container__item").querySelector('.btn');if(btn.attributes["goodstype"]?.value==="1"){btn.click();}});document.querySelector(".pagination__next").click();
// ↑を12秒間隔で8回繰り返し。
var count=8;var interval=12000;var id=0;var i=0;var f=function(){Array.prototype.forEach.call(Array.prototype.filter.call(document.querySelectorAll(".price"),function(item){return item.firstChild.innerText==="0";}),function(item){let btn=item.closest(".item-container__item").querySelector('.btn');if(btn.attributes["goodstype"]?.value==="1"){btn.click();}});document.querySelector(".pagination__next").click();i++;console.log(i);if(i===count){clearInterval(id);document.querySelector("a[href='/cart/']").click();}};f();id=setInterval(f,interval);
//画面全体をカートに追加。無料表示でも有料の場合があるので注意。
document.querySelectorAll(".btn[goodstype='1']").forEach(a=>a.click());document.querySelector(".pagination__next").click();
// ↑を12秒間隔で8回繰り返し。
var count=8;var interval=12000;var id=0;var i=0;var f=function(){document.querySelectorAll(".btn[goodstype='1']").forEach(a=>a.click());document.querySelector(".pagination__next").click();i++;console.log(i);if(i===count){clearInterval(id);document.querySelector("a[href='/cart/']").click();}};f();id=setInterval(f,interval);
// 繰り返し実行中に止めたい時。
clearInterval(id);
//購入
//https://qiita.com/asa-taka/items/888bc5a1d7f30ee7eda2
(async ()=>{for(let i=0;i<10;i++){document.querySelector(".btn.btn--primary").click();await (msec => new Promise(resolve => setTimeout(resolve, msec)))(6000);if(location.href==="https://ebookjapan.yahoo.co.jp/cart/complete/")window.close();}}).call();
//2021/06/10時点で水曜日に「200円以下5巻以上発行第1巻200円引き」クーポンが配布される。
//このクーポンは使用回数に制限がない。なので200円以下の本ならいくらでも入手できる。要らない本ばっかだけど。
//(1)で検索すると第一巻がヒットしやすいのでお勧め。「1巻」とか「1」で良いかも。
//まともなのが欲しいなら割引フィルターを付けた方が良い。
//あと決済手段は登録しておかない方が安全。
//終了後カートに移動。
(async ()=>{let sleep=(msec => new Promise(resolve => setTimeout(resolve, msec)));for(let i=0;i<10;i++){document.querySelector(".btn.btn--primary").click();await sleep(6000);if(location.href==="https://ebookjapan.yahoo.co.jp/cart/complete/"){await sleep(5000);location.href="https://ebookjapan.yahoo.co.jp/cart/";}}}).call();
//200円より高い本はカートから削除。200円以内の場合新しいタブで開く。
(async ()=>{let max=6;let cnt=0;let sleep=(msec => new Promise(resolve => setTimeout(resolve, msec)));let more=document.querySelector(".contents-more>span");if(more.innerText==="開く"){more.click();}await sleep(500);Array.prototype.forEach.call(document.querySelectorAll(".coupon-badge"),(item)=>{if(cnt>=max)return;let atag=item.closest("a");if(atag===null)return;if(parseInt(atag.querySelector(".price>b").innerHTML.replace(",",""))<=200){cnt++;window.open(atag.href);}item.closest("div.book-item").querySelector(".book-item__actions").childNodes[1].click();});}).call();
//無料本から無料購入できそうな本を開く。
//絞り切りが甘いので現状使えない。
Array.prototype.forEach.call(document.querySelectorAll(".tagtxt"),(item)=>{
if(item.innerHTML!=="無料")return;
var li=item.closest("li.item-container__item");
var title=li.querySelector(".book-item__title").innerText;
if(title.indexOf('1')==-1)return;
var alink=li.querySelector("a");
if(alink===null)return;
window.open(alink.href);
});
@kurema
Copy link
Author

kurema commented Apr 29, 2021

ラムダ式を使ってたり使ってなかったりは気分です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment