steam好友昵称更新

将你的steam好友昵称更改为其乐论坛id

// ==UserScript==
// @name         steam好友昵称更新
// @namespace    http://tampermonkey.net/
// @version      0.51
// @description  将你的steam好友昵称更改为其乐论坛id
// @author       duya12345
// @match        https://keylol.com/t*
// @match        https://steamcommunity.com/*/friends*
// @match        https://steamrepcn.com*
// @icon         https://keylol.com/favicon.ico
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==

//用户配置区
var show_steamName = 0; //是否将steam名字也放入昵称
var name_prefix = "keylol_"; //昵称前缀
var name_suffix = "" //昵称后缀
var mode = 2; //程序运行模式


(async function() {
    'use strict';
    if(mode == 1){
        if(window.location.href.search("keylol.com") != -1){
            get_ql_info();
            goto_friend();
        }
        else if(window.location.href.search("steamcommunity.com") != -1){
            window.onload = function(){
                let post_steamId = GM_getValue("post_steamId");
                let post_qlName = GM_getValue("post_qlName");
                let friends_steamId = Array.from(document.getElementsByClassName("selectable friend_block_v2 persona")).map(a => a.getAttribute("data-steamid"));//读取拥有的好友steamid
                let friends_steamName = Array.from(document.getElementsByClassName("selectable friend_block_v2 persona")).map(a => a.getAttribute("data-search").split(" ;")[0])//读取拥有的好友steam昵称
                let sessionId = get_sessionid();
                let nickName;
                for(let i = 0; i < friends_steamId.length; i++){
                    for(let j = 0; j < post_steamId.length; j++){
                        if(friends_steamId[i] == post_steamId[j]){
                            nickName = name_prefix + post_qlName[j] + name_suffix;
                            if(show_steamName){
                                nickName += '/' + friends_steamName[i];
                            }
                            change_nick(sessionId, post_steamId[j], nickName);
                        }
                    }
                }
                console.log("done it all");
            }
        }
    }
    else if(mode == 2){
        var step = GM_getValue("step");
        if(step == 1 && window.location.href.search("steamcommunity.com") != -1){
            window.onload = function(){
                let friends_steamId = Array.from(document.getElementsByClassName("selectable friend_block_v2 persona")).map(a => a.getAttribute("data-steamid"));//读取拥有的好友steamid
                let re = new RegExp(name_prefix+".*?"+name_suffix);
                let skip = Array.from(document.getElementsByClassName("friend_block_content")).map(a => !a.innerText.split("\n")[0].replace("*", "").search(re))//如果名字同时包含前缀后缀,即为true
                GM_setValue("friends_steamId", friends_steamId);
                GM_setValue("step", ++step);
                GM_setValue("my_steamURL", window.location.href);
                GM_setValue("skip", skip);
                window.open("https://steamrepcn.com/");
            }
        }
        else if(step == 2 && window.location.href.search("steamrepcn.com") != -1){
            let friends_steamId = GM_getValue("friends_steamId");
            let qlName = new Array();
            let skip = GM_getValue("skip");
            for(let i = 0, j = 0, amount = skip.filter(a => a==false).length; i < friends_steamId.length; i++){
                if(skip[i]){
                    qlName.push("");
                }
                else{
                    qlName.push(await wait_qlName(friends_steamId[i]));
                    console.log("进度: %d/%d  获取到昵称:%s", ++j, amount, qlName[i]);
                }
            }
            GM_setValue("qlName", qlName);
            GM_setValue("step", ++step);
            window.open(GM_getValue("my_steamURL"));
        }
        else if(step == 3 && window.location.href.search("steamcommunity.com") != -1){
            window.onload = function(){
                let friends_steamName = Array.from(document.getElementsByClassName("selectable friend_block_v2 persona")).map(a => a.getAttribute("data-search").split(" ;")[0])//读取拥有的好友steam昵称
                let friends_steamId = GM_getValue("friends_steamId");
                let skip = GM_getValue("skip");
                let sessionId = get_sessionid();
                let nickName;
                let qlName = GM_getValue("qlName");
                let changed_amount = 0;
                for(let i = 0, amount = qlName.length; i < amount; i++){
                    if(skip[i]){
                        console.log("进度: %d/%d, 此用户昵称已符合格式,跳过", i+1, amount);
                        continue;
                    }
                    if(qlName[i] != "未绑定"){
                        nickName = name_prefix + qlName[i] + name_suffix;
                        if(show_steamName){
                            nickName += '/' + friends_steamName[i];
                        }
                        changed_amount++;
                        change_nick(sessionId, friends_steamId[i], nickName);
                    }
                    else{
                        nickName = "此用户没有keylol账号,跳过";
                    }
                    console.log("进度: %d/%d, 更改昵称:%s", i+1, amount, nickName);
                }
                console.log("程序已运行完毕,一共更改了%d个好友的昵称", changed_amount);
                GM_setValue("step", 4);
            }
        }
        else{
            GM_setValue("step", 1);
        }
    }
})();

//其乐帖子页面的操作
function get_ql_info(){
    var post_steamId = Array.from(document.getElementsByClassName("steam_connect_user_bar_link steam_connect_user_bar_link_profile")).map(a => a.getAttribute("href")).map(b => b.replace(/\D+/g, ''))//读取一页帖子中的steamid
    var post_qlName = Array.from(document.getElementsByClassName("pls favatar")).map(a => a.getElementsByClassName("pi")[0]).map(a => a.getElementsByClassName("authi")[0]).map(a => a.getElementsByClassName("xw1")[0]).map(a => a.innerText)//读取一页帖子中的论坛账号
    GM_setValue("post_steamId", post_steamId);
    GM_setValue("post_qlName", post_qlName);
}

//进入自己的steam好友界面
async function goto_friend(){
    var ql_profile_url = document.getElementsByClassName("dropdown")[1].firstChild.href
    let ql_profile_xml = await goto_qlProfife(ql_profile_url)
    console.log(ql_profile_xml)
    var my_steamId = ql_profile_xml.getElementsByClassName("pbm mbm bbda cl")[ql_profile_xml.getElementsByClassName("pbm mbm bbda cl").length-1].getElementsByClassName("pf_l")[0].children[3].lastChild.href.replace(/\D+/g, "");
    window.open("https://steamcommunity.com/profiles/" + my_steamId + "/friends/", "_blank");
}

//进入自己的其乐个人资料界面
function goto_qlProfife(get_url) {
    return new Promise((resolve, reject) => {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", get_url, true);
        xhr.onload = () => resolve(string2XML(xhr.responseText))
        xhr.send();
    });
}

//steam好友页面的操作
//发送更改昵称请求
function change_nick(sessionid, steamId, nickname){
    var formData = new FormData()
    formData.append("nickname", nickname);
    formData.append("sessionid", sessionid);
    var post_url = "https://steamcommunity.com/profiles/" + steamId +"/ajaxsetnickname/";
    var xhr = new XMLHttpRequest();
    xhr.open("POST", post_url, true);
    xhr.send(formData);
}

//下面那个函数的同步封装
function wait_qlName(steamId){
    return new Promise(resolve => {
        setTimeout(() => {
            setTimeout(async function(){
                resolve(await steamId2qlName(steamId));
            }, random_num(500,1500));
        })
    })
}

//从steamcnrep获取steamid对应的其乐用户名
function steamId2qlName(steamId){
    return new Promise((resolve, reject) => {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "https://steamrepcn.com/profiles/"+steamId+"/content", true);
        xhr.onload = () => resolve(string2XML(JSON.parse(xhr.responseText).html).getElementsByClassName("profile_other")[0].getElementsByClassName("col")[0].getElementsByClassName("btn btn-v")[0].innerText.split("\n")[2].replace(/\s+/g, ""));
        xhr.send();
    });
}

//读取seesionid
function get_sessionid(){
    let sessionid = 0;
    let steam_cookie = document.cookie.split("; ").map(a => a.split("="))
    steam_cookie.forEach(element => {
        if(element[0] == "sessionid"){
            sessionid = element[1];
        }
    });
    return sessionid;
}

//通用函数
//将字符串转换成xml对象
function string2XML(xmlString) {
    var parser = new DOMParser();
    var xmlObject = parser.parseFromString(xmlString, "text/html");
    return xmlObject;
}

//生成范围内随机整数
function random_num(min, max){
    return Math.floor(Math.random()*(max-min+1)+min);
}