free-ss[2018-3-13更新]

原来的改版已经失效,另起炉灶搞个新的采集方式

目前為 2018-03-13 提交的版本,檢視 最新版本

// ==UserScript==
// @name         free-ss[2018-3-13更新]
// @version      0.0.6
// @homepage     http://xieshang.ren/2018/03/01/Tampermonkey_free_ss_plus/
// @description  原来的改版已经失效,另起炉灶搞个新的采集方式
// @author       XSC
// @match        http*://free-ss.site/
// @match        http*://free-ss.gq/

// @require      https://cdn.jsdelivr.net/npm/[email protected]/base64.min.js
// @grant        GM_setClipboard
// @run-at       document-end
// @home-url     https://www.xieshang.ren
// @namespace    https://greasyfork.org/users/163852
// ==/UserScript==
// @0.0.6   2018-3-13 老师又更新了代码,表格也开始躲猫猫了,那么亲们,别偷懒了,自己选吧(┬_┬)
// @0.0.5   2018-3-8   更换界面,使用[国家][加密方式]双条件的方式进行复制,下一版本增加全选功能,先回家吃饭了:-)
// @0.0.4   2018-3-6   增加一条明文,用于判断脚本是否失效
// @0.0.3   2018-2-28  修复失效
// @0.0.2   2018-2-24  修改表格判断方式
// @0.0.1   2018-2-7   初始版本
(function() {

    var ss_urls = new Array(0);
    var ss_num=0;
    var ss_txt='';
    var ss_check='';
    var ss_content='';
    var s3=document.createElement("table");
    var data_table=new Array(0);
    var countrylist=new Array(0);
    var encryptlist=new Array(0);
	var ss_selecttxt='';
	var ss_setconfigtxt='';
	var goodtab = new Array(0);
	var tabchoicetxt = '';

    // Your code here...
	function print(str) {
		console.log(str);
	}

	function loadconfig() {

	}

	function saveconfig() {
		GM_setValue("EC_aes_cfb", document.querySelector("#ecset_cfb").checked);
	}

    function genCheckBox(id, name, value, showText, parentIndex, isCheck) {
        var check1 = '';
        if (!isCheck) {
            check1 = "<input type='checkbox' parentIndex=" + parentIndex + " name=".concat(name).concat(" value=").concat(value).concat(" alt=").concat(showText).concat(" /><span>").concat(showText).concat("</span>");
            return check1;
        } else {
            check1 = "<input type='checkbox' parentIndex=" + parentIndex + " name=".concat(name).concat(" checked='checked' value=").concat(value).concat(" alt=").concat(showText).concat(" /><span>").concat(showText).concat("</span>");
            return check1;
        }
    }
	
    function genradioBox(id, parentIndex, value, showText, name, isCheck) {
        var check1 = '';
        if (!isCheck) {
            check1 = "<input type='radio' parentIndex=" + parentIndex + " name=".concat(name).concat(" value=").concat(value).concat(" alt=").concat(showText).concat(" id=").concat(id).concat(" /><span>").concat(showText).concat("</span>");
            return check1;
        } else {
            check1 = "<input type='radio' parentIndex=" + parentIndex + " name=".concat(name).concat(" checked='checked' value=").concat(value).concat(" alt=").concat(showText).concat(" /><span>").concat(showText).concat("</span>");
            return check1;
        }
    }

	function layer_setconfig(){
		var i = 0;
		ss_setconfigtxt = "";
		ss_setconfigtxt += "请勾选上自动勾起的协议类型<br></br>";
		ss_setconfigtxt += "<form name='countryform'>";
		ss_setconfigtxt += "<fieldset><legend>加密</legend>";
		ss_setconfigtxt += genCheckBox(i, "ecset_cfb", i, "cfb", i, true);
		ss_setconfigtxt += "&nbsp;&nbsp;&nbsp;&nbsp;";
		i++;
		ss_setconfigtxt += genCheckBox(i, "ecset_ctr", i, "ctr", i, true);
		ss_setconfigtxt += "&nbsp;&nbsp;&nbsp;&nbsp;";
		i++;
		ss_setconfigtxt += genCheckBox(i, "ecset_gcm", i, "gcm", i, true);
		ss_setconfigtxt += "&nbsp;&nbsp;&nbsp;&nbsp;";
		i++;
		ss_setconfigtxt += genCheckBox(i, "ecset_rc4_md5", i, "rc4-md5", i, true);
		ss_setconfigtxt += "&nbsp;&nbsp;&nbsp;&nbsp;";
		i++;
		ss_setconfigtxt += genCheckBox(i, "ecset_salsa20", i, "salsa20", i, true);
		ss_setconfigtxt += "&nbsp;&nbsp;&nbsp;&nbsp;";
		i++;
		ss_setconfigtxt += genCheckBox(i, "ecset_chacha20", i, "chacha20", i, true);
		ss_setconfigtxt += "&nbsp;&nbsp;&nbsp;&nbsp;";
		i++;
		ss_setconfigtxt += "</fieldset>";
	}

	//配置按钮事件
	function show_setconfig(){
        layer_setconfig();
		layer.open({
            closeBtn: 0,
			title:'配置参数',
			area:['250px','250px'],
			btn:['保存','取消'],
			btn1:function(){
				saveconfig();
			},
            btn2:function(){
                mainlayer();
            },
			content: "需要自动选择的协议:"
		});
	}

    function check_box() {
        var i;

        ss_content += "<fieldset><legend>国家</legend>";

        //建立国家列表
        ss_content += "<form name='countryform'>";
        for(i = 0; i < countrylist.length; i++)
        {
            ss_content += genCheckBox(i, "ct_"+i, i, countrylist[i], 0, true);
            ss_content += "&nbsp;&nbsp;&nbsp;&nbsp;";
        }
        ss_content += "</fieldset>";

        ss_content += "<fieldset><legend>加密</legend>";
        //建立加密列表
        for(i = 0; i < encryptlist.length; i++)
        {
            if(encryptlist[i].indexOf('gcm') > -1 || encryptlist[i].indexOf('ctr') > -1)
			{
				ss_content += genCheckBox(i, "ec_"+i, i, encryptlist[i], 0, false);
			}else{
				ss_content += genCheckBox(i, "ec_"+i, i, encryptlist[i], 0, true);
			}
            ss_content += "&nbsp;&nbsp;&nbsp;&nbsp;";
        }
        ss_content += "</fieldset>";
        print(ss_content);
    }
	
	

    function gettab(tabmax){
        var j;
        var tab = document.getElementsByTagName("table");
        print('选择表格:' + tabmax);

        var tabindex ,tabmaxnum = 0, test = 0;

        print('表格' + tabmax + '最长');
        s3 = tab[tabmax]; //获取第一个表格
        ss_num = s3.rows.length;
        print('表格行数:' + ss_num);

        data_table = new Array(0);
        countrylist = new Array(0);
        encryptlist = new Array(0);
        for(var i = 0; i < s3.rows.length - 1; i++){
            data_table[i] = new Array(0);
            var j;
            for(j = 0; j < s3.rows[i + 1].cells.length - 1; j++){
                data_table[i].push(s3.rows[i + 1].cells[j].innerHTML.toString());
            }
            //var url = 'ss://'+(data_table[i][4]+':'+data_table[i][3]+'@'+data_table[i][1]+':'+data_table[i][2])+'#'+data_table[i][6]+'('+data_table[i][0]+')';
            //print(url);

            //获取国家列表
            if(countrylist.length == 0)
            {
                countrylist.push(data_table[i][6]);
            }else{
                for(j = 0; j < countrylist.length; j++)
                {
                    if(countrylist[j] == data_table[i][6])
                        break;
                }
                if(j == countrylist.length)
                {
                    countrylist.push(data_table[i][6]);
                    print('c'+countrylist.length);
                }
            }
            //加密方式
            if(encryptlist.length == 0)
            {
                encryptlist.push(data_table[i][4]);
            }else{
                for(j = 0; j < encryptlist.length; j++)
                {
                    if(encryptlist[j] == data_table[i][4])
                        break;
                }
                if(j == encryptlist.length)
                {
                    encryptlist.push(data_table[i][4]);
                    print('e'+encryptlist.length);
                }
            }
        }
		
        print("服务器数量:"+data_table.length);
    }

	function makecopydata() {
		var i, j;
		ss_selecttxt = '';
		var data = new Array(0);
		var unsel_country = new Array(0);
		var unsel_country_num = 0;
		var unsel_encrypt = new Array(0);
		var unsel_encrypt_num = 0;
		var max = 0;


		//筛选国家
		print("没有选择的国家有");
		for(i = 0; i < countrylist.length; i++)
		{
			if($("input[name='ct_"+i+"']").is(':checked') == false)
			{
				unsel_country.push($("input[name='ct_"+i+"']").attr('alt'));
				unsel_country_num++;
				print(unsel_country[unsel_country.length - 1]);
			}
		}
		//筛选加密
		print("没有选择的加密有");
		for(i = 0; i < encryptlist.length; i++)
		{
			if($("input[name='ec_"+i+"']").is(':checked') == false)
			{
				unsel_encrypt.push($("input[name='ec_"+i+"']").attr('alt'));
				unsel_encrypt_num++;
				print(unsel_encrypt[unsel_encrypt.length - 1]);
			}
		}

		if(unsel_country_num > unsel_encrypt_num)
		{
			max = unsel_country_num;
		}else{
			max = unsel_encrypt_num;
		}
		print("开始筛选服务器");
		ss_selecttxt = '';
		for(i = 0; i < data_table.length; i++)
		{
			var need = 1;
			print(data_table[i][1] + "-" + data_table[i][6] + "-" + data_table[i][4]);
			for(j = 0; j < max && need; j++)
			{
				if(j < unsel_country_num)
				{
					print("[国家]"+unsel_country[j]);
					//if(data_table[i][6] == unsel_country[j])
					if(data_table[i][6].indexOf(unsel_country[j]) > -1)
					{
						need = 0;
						print("丢弃[国家]"+data_table[i][1]);
						continue;
					}
				}
				if(j < unsel_encrypt_num)
				{
					print("[加密]"+unsel_encrypt[j]);
					//if(data_table[i][4] == unsel_encrypt[j])
					if(data_table[i][4].indexOf(unsel_encrypt[j]) > -1)
					{
						need = 0;
						print("丢弃[加密]"+data_table[i][1]);
						continue;
					}
				}
			}
			if(need)
			{
				var url1 = data_table[i][4]+':'+data_table[i][3]+'@'+data_table[i][1]+':'+data_table[i][2];
				var url2 = 'ss://'+Base64.encodeURI(url1)+'#'+data_table[i][6]+'('+data_table[i][0]+')';
				ss_selecttxt += url2 + '\r\n';
			}
		}
	}

	function choicetab() {
        var j;
        var tab = document.getElementsByTagName("table");

        var tabindex ,tabmax = 0, tabmaxnum = 0, goodtablen = 0;

		tabchoicetxt = "<fieldset><legend>请选择正确的一条</legend><form name='tabchoiceform'>";
        for(tabindex = 0; tabindex < tab.length; tabindex++)
        {
            print('表格' + tabindex + '长' + tab[tabindex].rows.length);
            if(tab[tabindex].rows.length > 10)
            {
				goodtab[goodtablen] = new Array(0);
				goodtab[goodtablen].push(tabindex);
				goodtab[goodtablen].push(tab[tabindex].rows[1].cells[1].innerHTML.toString()+'&nbsp;&nbsp;'+tab[tabindex].rows[1].cells[2].innerHTML.toString()+'&nbsp;&nbsp;'+tab[tabindex].rows[1].cells[3].innerHTML.toString()+'&nbsp;&nbsp;'+tab[tabindex].rows[1].cells[4].innerHTML.toString());
				print(goodtab[goodtablen][0]);
				print(goodtab[goodtablen][1]);
				tabchoicetxt += genradioBox(goodtab[goodtablen][0], "tab_"+goodtab[goodtablen][0], goodtab[goodtablen][0], goodtab[goodtablen][1], "tab_group", false) + "<br/>";
				goodtab.push();
				goodtablen++;
            }
        }
		tabchoicetxt += "</fieldset>";
		print(tabchoicetxt);
	}
	
    function mainlayer() {
        layer.open({
            type: 0,
			fixed: false, //不固定
            title:'服务器('+ss_num+'条) ',
            area:['800px','300px'],
			
            btn:['复制'],
            yes:function(){
				makecopydata();
                var txt = ss_selecttxt;
                GM_setClipboard(txt);
                layer.msg('已复制到剪切板');
            },
			
//            btn:['配置','复制'],
//            yes:function(){
//				show_setconfig();
//            },
//            btn2:function(){
//				makecopydata();
//                var txt = ss_selecttxt;
//                GM_setClipboard(txt);
//                layer.msg('已复制到剪切板');
//            },
            content: ss_content
        });
    }

	function getselecttab(){
		var choiceindex;
		var i;
		
		print("表格数:"+goodtab.length);
		for(i = 0; i < goodtab.length - 1; i++)
		{
			print("判断表格:" + "input[parentIndex='tab_"+goodtab[i][0]+"']");
			if($("input[parentIndex='tab_"+goodtab[i][0]+"']").is(':checked') == true)
			{
				choiceindex = goodtab[i][0];
			}
		}
		print("选择表格:" + choiceindex);
		gettab(choiceindex);
		check_box();
		mainlayer();
	}
	

    FREESS_NET = {
        askcheck: function () {
			
			layer.open({
				type: 0,
				title:'请选择与页面相同的那条',
				area:['500px','200px'],
				btn:['确认','取消'],
				fixed: false, //不固定
				yes:function(){
					getselecttab();
				},
				btn2:function(){
					makecopydata();
					var txt = ss_selecttxt;
					GM_setClipboard(txt);
					layer.msg('已复制到剪切板');
				},
				content: tabchoicetxt
			});
        },

        run:function(){
            //this.geturls();
            choicetab();
			this.askcheck();
        },
};

    $(document).ready(function() {
        // 等待3s,数据加载后执行
        setTimeout(function(){
            FREESS_NET.run();
        },2000);
    });


})();