showroomで効率的にタネ,星を集めるとのこと
showroomって動画配信兼人気投票ランク煽り系サービスがあって、
headless chromeを使いたくなったのでやって見た。
タネ、星集めとは
showroomは基本的に配信者のランキングがポイントで決まっていて、 そのポイントは無料でゲットできるタネか星を配信者に献上することによって溜まっていくシステムです。 あともちろん、課金してポイントを買うとかいうのもある。
で、無課金勢はどうやってタネを集めるかというと、
- ライブ配信してるページを30秒見る
- 500個タネを取得すると、1時間の取得制限がかかる。
上記のようなルールで、配信が始まる前にmax(500ポイント)まで貯めておいて、配信開始と同時に他のライブを見に言って上限まで収穫して、もう一度贔屓の配信者にタネを献上したりします。 そのまま取得制限が解除される1時間待ち、収穫->献上のサイクルを1時間で3回すことを3周と呼びます。
30秒ライブを視聴する
タネを取得する際の”30秒ライブを視聴する”の条件はどうやら、”他のライブ配信を開いて30秒待つ”と同義らしいので、 そこをある程度自動かしてしまおうという感じです。 1ライブ配信で取得できるタネの数は25個、500個欲しいので、最低20個のタブをひらけばいいということになります。
puppeteerのインストール
環境はMacとnodejsが入ってる前提です。Chromeは特に何もしないでも使える模様。
#nodejsから利用できるchrome dev-toolのラッパー?であるpuppeteerをインストールします。
npm -i puppetter
ライブリストから必要なライブのURLを取得する。
onliveのページからカテゴリをクリック、配信中のURLを取得。
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'});
const page = await browser.newPage();
await page.goto('https://www.showroom-live.com/onlive', {waitUntil: 'networkidle2'});
await page.waitFor(5000);
/* カテゴリの6番目のリストをクリックして、ページの表示をアマチュアにします。 */
const li = await page.$$("#js-categorymenu-list > li")
await li[7].click()
await page.waitFor(5000);
/* 取得したリストのhtmlをパース。aタブのhrefを取り出します */
const livelist = await page.evaluate(()=> {
const node = document.querySelectorAll("a.js-room-link");
const array = [];
for( item of node){
array.push(item.href);
}
return array;
});
/* URLの一覧からsliceで適当に20個に絞り、 console.logでプリントします*/
list=livelist.slice(10,31);
for (i of list){
console.log(i)
}
await browser.close();
})();
chromeでurlを開く
chromeはコマンドラインでurlを呼び出すと、既存のchromeにタブを追加する仕様になってます。 なので、chromeのコマンドラインに取得したurlをわたしてあげれば終わりです。
#!/bin/sh
for i in `node livelist.js`
do
res=`/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-gpu $i`
echo $res
done
このままだと、20個タブをchromeが開いてしまって、PCがおそくなるので適当に時間差をいれた方が良さげ。
あとは放置しておけばタネが上限まで溜まってるって感じです。
しかし、jsのレンダリングには時間かかるな〜。もうすこしnodejs力が欲しいところ。