4zakiの日記

技術ブログです。

ApexLegendsのTrackerのAPIをnode.jsで使ってみた。

ApexLegendsのTrackerを覗いていたらAPIが用意されていることに気が付いたので、少し触ってみた。

やりたいこと

node.jsを使って一部情報を取り出す。

参考にしたサイト

medium.com

環境

windows10
Git-bash
node js:v14.16.0

APIキーの取得

以下のサイトにログインをして、「Create Application」で入力を済ませるともらえます。
tracker.gg
f:id:H4zaki:20210303214741p:plain

取り出せる項目を確認する。

ターミナルで以下をたたく。

$ curl https://public-api.tracker.gg/apex/v1/standard/profile/[プラットフォーム]/[アカウント名] -H "TRN-API-KEY: [APIキー]"
((プラットフォームのところにはxboxの場合は「1」,psnの場合は「2」,pcの場合は「5」が入る。))

コード

const https = require('follow-redirects').https;
//プラットフォーム(xbox=1,psn=2,pc=5)
var platform ="[プラットフォーム]";
//ゲームID
var id = "[ゲームID]";
var url = 'https://public-api.tracker.gg/apex/v1/standard/profile/' + platform + '/' + id;

//メイン処理
https.get(url, {
    headers: {
        //APIキー
        "TRN-Api-Key" : "cdda4d52-c67a-4862-acb2-xxxxxxxxxxxx" 
    }
}, function (res) {
    var data = '';
    res.on('data', function (chunk) {
        data += chunk.toString();
    });
    res.on('end', function () { 
        
        var json; 
        try {             
            json = JSON.parse(data);
            //console.log(json.data);
            //取り出したいものを指定&表示
            console.log("アカウント" + json.data.metadata.platformUserHandle);
            console.log("レベル" + json.data.metadata.level);
            console.log("総キル数" + json.data.stats[1].displayValue);
        }
        catch (e) {
            console.log("error: " + e);
        }
    });
    }).on('error', function (err) {
   console.error(err);
   
});

実行

$ node apex.js
アカウント*************
レベル243
総キル数1,576

今回は触りだけ、もしかしたらなんか作るかも。
以上

ARKの起動時に「LowLevelFatalError...」と出るときの対処

ARKの起動時に
LowLevelFatalError
[File:F:\build\trunk\Engine\Source\Runtime\Windows\D3D11RHI\Private\D3D11Util.cpp] [Line: 201]
Unreal Engine is exiting due to D3D device being lost. (Error: 0x887A0020 - 'INTERNAL_ERROR')
....
と出てしまいタイトルまでたどり着けない。

実行環境

*この記事で説明する対処法は私の環境での対処法です。ほかの環境での動作は保証できません

対処法

NVIDIAコントロールパネルの以下の設定を変更する。

3Dの設定の管理->画像のシャープ化
f:id:H4zaki:20200326225005p:plain
オフにする。
f:id:H4zaki:20200326225136p:plain

最近設定をいじっていたので原因を見つけるのはだいぶ早かった。
おわり

node Puppeteerを使ってYoutubeの他人が作成した再生リストをコピー

Youtubeで他人が作成した再生リストを保存する機能があるが、
実際のところ保存というよりはお気に入りやブックマークに近い。

動画を追加したり消したりすることができない。

また再生リストを複製する機能も用意されていないので、自分で一つ一つ再生リストに保存していく方法しかない(多分ない)と思います。
f:id:H4zaki:20200323141828p:plain
なのでPuppeteerで再生リストを複製するスクリプトを書いてみました。

作業環境

  • windows10
  • Git-bash
  • node js:v13.7.0
  • Puppeteer:2.1.0
  • Chromium:80.0.3987.0(Developer Build) (64 ビット)

コード

const fs = require('fs');
const puppeteer = require('puppeteer');
const COOKIES_PATH = 'youtubecookie';

(async () => {

    const browser = await puppeteer.launch({
        headless: false
    })

    const page = await browser.newPage();

    //cookieが作られていない場合ログイン画面からログインし、cookieを保存
    if (fs.existsSync(COOKIES_PATH) == false) {
        await page.goto('https://accounts.google.com/signin/v2/identifier?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Dja%26next%3D%252F%253Fgl%253DJP%2526hl%253Dja&hl=ja&ec=65620&flowName=GlifWebSignIn&flowEntry=ServiceLogin', {
            waitUntil: 'domcontentloaded'
        });
        await page.type('input[name="identifier"]', "ログインメールアドレス");
        await page.click('#identifierNext');
        await page.waitForNavigation({
            timeout: 60000,
            waitUntil: 'domcontentloaded'
        });
        await page.waitFor(1000);
        await page.type('input[name="password"]', "ログインパスワード");
        await page.click('#passwordNext');
        await page.waitForNavigation({
            timeout: 60000,
            waitUntil: 'domcontentloaded'
        });
        const afterCookies = await page.cookies();
        fs.writeFileSync(COOKIES_PATH, JSON.stringify(afterCookies));
    } else {  
        //cookieでログイン
        const cookies = JSON.parse(fs.readFileSync(COOKIES_PATH, 'utf-8'));
        for (let cookie of cookies) {
            await page.setCookie(cookie);
        }

        //コピー元プレイリスト(URL)
        await page.goto('https://www.youtube.com/playlist?list=PL590L5WQmH8dc-kEkuMX3n_EhpMvZxowe', {
            waitUntil: 'domcontentloaded'
        });

        //動画の数を数える
        let listSelector = "#contents > ytd-playlist-video-renderer";
        var list = await page.$$(listSelector);

        //保存処理
        for (let i = 1; i <= list.length; i++) {
            console.log(i + '/' + list.length);
            await page.click('.style-scope:nth-child(' + i + ') > #content > #menu > .style-scope > #button');
            await page.click('.style-scope:nth-child(1) > #items > .style-scope:nth-child(3)');
            await page.waitFor(4000);
            //コピー先(上から何番目か 後で見るもこみ nth-child(2)の場合2番目、nth-child(3)の場合3番目)
            await page.click('#playlists > .style-scope:nth-child(2)');
            //await page.waitFor(3000);
            await page.click('#close-button > button');
            await page.waitFor(1000);
        }
    }
    console.log('finish');
    await browser.close();
})();

コピー先の上から何番目かっていうのは、動画を再生リストに追加する操作をしたときに
f:id:H4zaki:20200323141934p:plain
このように表示表示されると思いますが、ここの上から数えて何番目かです。

あと新しくテスト用で作成したGoogleアカウントだとログインができなかったが、普段使いのアカウントならログインできました。

改善点とか妥協点とか

  • 少し読み込みが長いところとかをwaitForでごまかしてる。(1動画当たり5秒ほどかかる)
  • headlessをtrueにするとエラーを吐いたのでfarseにした。(Chromiumがウィンドウで起動する。メモリは230M前後使用していた。)
  • Youtubeのhtmlタグが特殊でよくわからなかったんで、チェックボックスなどの操作をクリックで操作している。
  • ↑のせいでコピー先とコピー元に同じ動画があると消えてしまう。

多分改良も改善もしないと思いますが、このコードをパクるならこのように不完全なものなので注意してください。

実際に動かしてみた動画

おわり

ARKのlinuxサーバーにmodを導入してみた

他の方がやってる方法でうまく行かなかったので色々調べながら入れました。

本記事ではlinux上でarkmanagerが使用できることを前提で書いています。
詳しくは前に書いた記事を参考にして下さい
4zaki.hatenablog.com

まず、導入したいmodのIDを控える
IDはsteamページURLの「id=」の後に続く数字
例:
https://steamcommunity.com/sharedfiles/filedetails/?id=558651608
の場合「558651608」になります。

modのダウンロードとインストール

# arkmanager installmod 558651608

※「558651608」の部分はmodのIDなので変えてください。
カンマで複数IDを区切ることで複数インストールすることができます。

# arkmanager installmod 558651608,854186603

modを有効にする

GameUserSettings.iniのServerSettingに設定を追加

# vi /home/steam/ARK/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini

   ActiveMods=558651608,854186603

複数ある場合はカンマで区切る。

サーバーの再起動する

おわり

ARKのサーバーを起動しようとすると 「error while loading shared libraries: libsteam_api.so: cannot open shared object file: No such file or directory」と出る

ARKサーバーをアップデートしたところ、サーバーが起動しなくなった。

下記のようなエラーが出る

# ./ShooterGameServer Ragnarok?listen?SessionName=name?ServerPassword=Pass?ServerAdminPassword=Pass?MaxPlayers=10 -server
 -log
./ShooterGameServer: error while loading shared libraries: libsteam_api.so: cannot open shared object file: No such file or directory

原因と対処

エラーの文章を見てみるとlibsteam_api.soがないみたいなことが書いている。
バックアップしておいたファイルと比べてみると
/home/steam/ARK/Engine/Binaries/内のLinuxディレクトリが消えていたので、バックアップからLinuxを持ってきたところ起動するようになった。

バックアップとっていない人はこちらから
drive.google.com


おわり