Greasy Fork

来自缓存

Greasy Fork is available in English.

Steam买买买

在软锁区游戏商店页面自动显示widget、社区与愿望单链接

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Steam买买买
// @namespace    http://greasyfork.icu/users/471937
// @version      0.8.0
// @description  在软锁区游戏商店页面自动显示widget、社区与愿望单链接
// @author       油油
// @match        store.steampowered.com/*
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @connect      steamdb.info
// ==/UserScript==

window.addEventListener('load', function () {
    var url_path = location.pathname.split('/'),
        game_id = url_path[url_path.indexOf('app') + 1],
        user_id, game_title, game_image,
        game_subs, game_bundles, game_dlcs,
        steamdb_url = `https://steamdb.info/app/${game_id}/subs/`,
        tmp;

    // 绑定全局变量
    var $ = unsafeWindow.jQuery,
        AddToWishlist = unsafeWindow.AddToWishlist,
        ShowConfirmDialog = unsafeWindow.ShowConfirmDialog,
        ViewProductPage = unsafeWindow.ViewProductPage,
        sessionid = unsafeWindow.g_sessionID

    // 分域名处理
    switch (url_path[1]) {
        case 'widget':
        case 'sub': // 不作处理
            return
        case 'agecheck':
            // 自动agegate
            tmp = document.getElementsByClassName('agegate_birthday_selector')
            if (tmp.length) {
                document.getElementById('ageDay').value = 1
                document.getElementById('ageMonth').value = 'January'
                document.getElementById('ageYear').value = 1901
                ViewProductPage()
            }
        case 'app':
            match_user()
            if (game_id) anti_lock()
            break
    }

    // 匹配用户主页
    function match_user() {
        tmp = $('a.user_avatar').attr('href')
        if (tmp) user_id = tmp.match(/(id|profiles)\/.+?\//)[0]
    }

    // 反锁区
    function anti_lock() {
        tmp = $('#error_box')
        if (tmp[0]) {
            tmp.html('')// 清除原始内容

            // widget iframe
            add_frame(`${location.origin}/widget/${game_id}`, tmp)
            var img_panel, sub_panel
            tmp.append($('<div>').css({ width: '100%', display: 'flex' })
                .append(img_panel = $('<div>'))
                .append(sub_panel = $('<div>').css({ display: 'flex', 'flex-direction': 'column' }))
            )

            // 查询按钮
            var btn_div = $('<div>')
            tmp.append(btn_div)
            add_btn('添加到愿望单', () => {
                AddToWishlist(game_id)
                var wishlist_url = `/wishlist/${user_id}#sort=dateadded`
                if (game_title) wishlist_url += '&term=' + encodeURI(game_title)
                window.open(wishlist_url)
            }, btn_div)
            add_btn('社区中心', `https://steamcommunity.com/app/${game_id}/`, btn_div)

            // SteamDB查询信息
            query_steamDB(page => {
                // 匹配信息
                var title = page.find('.pagehead h1'),
                    icon = page.find('.row.app-row .span4 img'),
                    sub_tables = page.find('#subs table'),
                    dlc_tables = page.find('#dlc table')
                game_title = title.text()
                game_image = icon[0]
                for (var i = 0; i < sub_tables.length; i++) {// 搜索游戏sub+礼包
                    var table = sub_tables[i]
                    switch (table.rows[0].cells[0].innerText.toUpperCase()) {
                        case 'SUBID': // Sub
                            game_subs = iter_steamdb_table(table)
                            break
                        case 'ID': // Bundle
                            game_bundles = iter_steamdb_table(table)
                            break
                    }
                }
                if (dlc_tables.length > 0) game_dlcs = iter_steamdb_table(dlc_tables[0]) // 搜索游戏DLC

                // 写入信息
                if (game_title)
                    $('.pageheader').html(document.title = `买买买: ${game_title}`)
                else
                    $('.pageheader').parent().append(
                        $('<a>').attr('title', 'SteamDB').attr('href', steamdb_url).html('若页面未成功加载购买按钮,可尝试点击该链接后刷新')
                    )
                if (game_image) img_panel.append(
                    $('<a>').attr('title', 'SteamDB').attr('href', steamdb_url).append(game_image)
                )
                add_links('Sub列表', game_subs, '/sub/@/', sub_panel)
                add_links('DLC列表', game_dlcs, '/app/@/', sub_panel)
                add_links('礼包列表', game_bundles, '/bundle/@/', sub_panel)

                // 插入直接购买按钮
                game_subs.forEach(sub => {
                    add_cart_form(sub[0])
                    add_btn(
                        '购买' + sub[1], `javascript:addToCart(${sub[0]})`,
                        btn_div, { class: 'btnv6_green_white_innerfade btn_medium', title: `ID: ${sub[0]}` }
                    )
                })
            })
        }
    }

    // 添加按钮
    function add_btn(text, action, pool, assign = {}) {
        var btn = $('<a>').append($('<span>').append(text))
            .addClass('btnv6_blue_blue_innerfade btn_medium')
            .attr(assign)
        pool.append(btn)
        if (typeof action == 'function') btn.on('click', action)
        else btn.attr('href', action)
    }

    // 添加iframe
    function add_frame(url, pool) {
        var loader
        pool.append(
            loader = $('<iframe>').css('width', '100%')
                .attr('src', url)
                .on('load', () => {
                    var ifr = loader[0]
                    if ($(ifr.contentWindow.document).find('img').length)
                        ifr.style.height = `${ifr.contentWindow.document.body.scrollHeight}px`
                    else ifr.parentNode.removeChild(ifr)
                })
        )
    }

    // 批量添加按钮(DLC、礼包、Sub)
    function add_links(title, data, link_fmt, pool) {
        if (!(data && data.length > 0)) return
        pool.append(title)
        data.forEach(sub => add_btn(
            sub[1], link_fmt.replace(/@/g, sub[0]),
            pool, { class: 'btnv6_blue_hoverfade btn_small', title: `ID: ${sub[0]}` }
        ))
    }

    // SteamDB查询游戏信息
    var cached_page = null
    function query_steamDB(callback) {
        if (cached_page) callback(cached_page)
        else GM_xmlhttpRequest({
            method: 'GET',
            url: steamdb_url,
            onload: response => {
                var page = $(response.responseText)
                callback(cached_page = page)
            }
        })
    }

    // 迭代查询SteamDB package表格
    function iter_steamdb_table(table) {
        var res = []
        for (var tbody of table.tBodies) for (var row of tbody.rows) {
            row = row.cells
            if ($(row[1]).find('a').length > 0) res.push([
                row[0].innerText, // ID
                row[1].innerText, // 标题
            ])
        }
        return res
    }

    // 插入购物车表单
    function add_cart_form(subid) {
        $('body').append($('<form>')
            .attr({ name: `add_to_cart_${subid}`, action: '/cart/', method: 'POST', target: '_blank' })
            .append($('<input>').attr({ type: 'hidden', name: 'sessionid', value: sessionid }))
            .append($('<input>').attr({ type: 'hidden', name: 'action', value: "add_to_cart" }))
            .append($('<input>').attr({ type: 'hidden', name: 'subid', value: subid }))
        )
    }
});