Netflix Plans Fetcher

Get Netflix prices of all countries

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Netflix Plans Fetcher
// @description  Get Netflix prices of all countries
// @author       /u/Wilcooo
// @include      https://www.netflix.com/*
// @grant        GM_getValue
// @grant        GM_setValue
// @run-at       document-start
// @version      1
// @namespace    /u/Wilcooo
// ==/UserScript==

var data = GM_getValue('data',{});


if (location.pathname.startsWith('/signup')) {

    // Getting the prices & current country whenever the Netflix site is opened

    document.addEventListener("DOMContentLoaded", function(event) {

        var geo = netflix.reactContext.models.signupContext.data.geo.requestCountry,
            options = netflix.reactContext.models.signupContext.data.flow.fields.planChoice.options;

        data[geo.id] = {geo:geo, options:options};
        GM_setValue('data',data);

        // Get the exchange rates (used later)
        var exchange_rates = jQuery.getJSON("https://www.floatrates.com/daily/usd.json");


        // Write the result info:

        document.body.innerHTML =
            'Done! You can select another country now.<br><br>' +
            'You can disable this userscript in your userscript manager (f.e. Tampermonkey). You can usually find its icon in the top right.<br><br>' +
            'This is all collected data so far, you can copypasta this table right into EXCEL<br>' +
            'Click <a href="#" onclick="NPFclear()">here</a> to remove everything.<br>'+
            'For more details, type NPFdata in the JS console.<br><br>';


        // Create the table:

        var table = document.createElement('table');
        document.body.appendChild(table);
        table.innerHTML = "<tr><th>Country</th><th>Currency</th><th>Basic</th><th>Standard</th><th>Premium</th><th>Basic (USD)</th><th>Standard (USD)</th><th>Premium (USD)</th></tr>"


        // Add all entries to the table

        Object.keys(data).forEach(function(k) {

            var currency = data[k].options[0].fields.planPriceCurrency.value;
            var prices = data[k].options.map(o => o.fields.planPriceAmount.value || o.fields.planPrice.value.match(/[\d.,]+/)[0] );

            var tr = data[k].tr = document.createElement("tr");
            table.appendChild(tr);
            tr.innerHTML = [data[k].geo.countryName, currency, ...prices].map( x => "<td>" + x + "</td>").join('');


            // Once the exchange rates (requested before) are loaded, calculate & add the converted prices:

            exchange_rates.done(function(exchange_rates) {
                try {
                    var pricesUSD = prices.map( price => (price / exchange_rates[currency.toLowerCase()].rate).toFixed(2) );
                    tr.innerHTML += pricesUSD.map( x => "<td>" + x + "</td>").join('');
                } catch(e){
                    if (currency.toLowerCase() == "usd") {
                        tr.innerHTML += prices.map( x => "<td>" + x + "</td>").join('');
                    } else tr.innerHTML += "<td>Error getting Exchange Rate</td>";
                }
            });
        });

    });

} else location.href = 'https://www.netflix.com/signup/';


// The function that clears all entries

window.NPFclear = function() {
    if (confirm("Ara you sure you want to delete everything???")) {
        GM_setValue('data',{});
        location.href = 'https://www.netflix.com/signup/';
    }
}


// Some styling (CSS) of the table

var style = document.createElement('style');
document.head.appendChild(style);
style.sheet.insertRule(` td { border: 1px solid black; width: 80px; }`);


// Make the data accessible in the JS console
window.NPFdata = data;