UEMarketplaceのセール品一覧を出力する

前回(購入済みアセット一覧の出力)に引き続き、
マケプレの情報をChromeのコンソール経由でcsvに吐く話。

使い方

1.マケプレのページを開く。
2.ChromeDeveloperToolのコンソールを表示する。
3.下記のコードを流し込む(お好みで中身を変更してください)
4.ログにcsvが吐かれるのでコピーして保存。
5.Google SpreadSheetにインポート。
6.各行の高さ、各列の幅などを調整。

使い道...?

素直にマケプレで商品眺めたほうがいい気がしないでもない。
ノリで作っただけなので細かいことは気にしないことにする。

// マケプレの商品ソートパラメータ
const SORT_TYPE_EFFECTIVEDATE = 'effectiveDate'
const SORT_TYPE_DISCOUNT = 'discountPercentage'
const SORT_TYPE_TITLE = 'title'
const SORT_TYPE_CURRENTPRICE = 'currentPrice'

// マケプレのセール種別
// イベントについては現状実施期間外なので未チェック
const SALE_TYPE_REGULAR = 'regular%7Cevent'
const SALE_TYPE_EVENT = 'event'

// アセットの商品カテゴリパラメータ
// マケプレにアクセスしたときのurlのassets/以下を参考にしたが、
// 全種類叩いて確認したわけではないので注意
const CATEGORY_2D = 'assets%2F2d'
const CATEGORY_ANIMATIONS = 'assets%2Fanimations'
const CATEGORY_EFFECTS = 'assets%2Ffx'
const CATEGORY_CHARACTERES = 'assets%2Fcharacters'
const CATEGORY_CODEPLUGINS = 'assets%2Fcodeplugins'
const CATEGORY_SOUNDEFFECTS = 'assets%2Fsoundfx'
const CATEGORY_TEXTURES = 'assets%2Ftextures'
const CATEGORY_BLUEPRINTS = 'assets%2Fblueprints'
const CATEGORY_PROPS = 'assets%2Fprops'
const CATEGORY_MATERIALS = 'assets%2Fmaterials'
const CATEGORY_ARCHVIS= 'assets%2Farchvis'
const CATEGORY_WEAPONS= 'assets%2Fweapons'
const CATEGORY_ENVIRONMENTS = 'assets%2environments'
const CATEGORY_MUSIC = 'assets%2music'

function makeUrl(start, count, sortType, sortDir, saleType, category){
    let url = 'https://www.unrealengine.com/marketplace/api/assets?lang=ja&start='+start+'&count='+count+'&sortBy='+sortType+'&sortDir='+sortDir+'&saleType='+saleType
    if(category && 0<category.length){
        return url + '&category=' + category
    }
    return url
}

async function run(sortType, sortDir, saleType, category){
    // 必要なループ回数を調べる
    const pagingQueryResp = await (await fetch(makeUrl(0, 1, sortType, sortDir, saleType, category))).json()
    const loopMax = Math.ceil(pagingQueryResp.data.paging.total/100)
    let buffer = ''
    function writeColumn(body){
        buffer = buffer + '"'+body+'",'
    }
    for(let i=0;i<loopMax;i++)
    {
        // 指定範囲のアセット情報を問い合わせ
        const requestUrl = makeUrl(i*100, 100, sortType, sortDir, saleType, category)
        console.log(requestUrl)
        const response = await fetch(requestUrl)
        console.log(response)
        const responseJson = await response.json()
        console.log(responseJson)
        const elements = responseJson.data.elements
        for (let item of elements)
        {
            // ほしい内容を拾う
            writeColumn('=IMAGE(""'+item.thumbnail+'"", 1)')
            writeColumn(item.title)
            writeColumn(item.description.replaceAll('"', '""'))
            if(item.categories && 0 < item.categories.length){
                writeColumn(item.categories[0].name)
            }else{
                writeColumn('')
            }
            writeColumn(item.seller.name)
            writeColumn(item.price)
            writeColumn(item.discount)
            writeColumn(item.discountPrice)
            writeColumn(item.discountPercentage)
            writeColumn(item.compatibleApps.join(","))
            writeColumn('https://www.unrealengine.com/marketplace/ja/item/'+item.catalogItemId)
            buffer = buffer + '\n'
        }
    }

    // ログに結果を出力
    console.log(buffer)
}

await run(SORT_TYPE_DISCOUNT, 'DESC', SALE_TYPE_REGULAR, CATEGORY_CODEPLUGINS)

コピーして保存するのが面倒ならこれとか使うといいかも github.com 前回と違って認証が必須ではないので、ブラウザからにこだわらなければもう少し何かできる気はする...

あとがき

単純に価格監視がしたいなら、そういうサイトがあるようだ。
ただ、何か不具合があるのか、日本円の価格情報は正しくない。 wishlist制限対策としての使い道はありそう。

forums.unrealengine.com