mirror of
				https://github.com/taixingyiji/openit.git
				synced 2025-11-04 14:32:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			240 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import yaml
 | 
						|
import socket
 | 
						|
import maxminddb
 | 
						|
import platform
 | 
						|
import os
 | 
						|
import requests
 | 
						|
import flag
 | 
						|
from tqdm import tqdm
 | 
						|
from pathlib import Path
 | 
						|
 | 
						|
 | 
						|
def push(list, outfile):
 | 
						|
    country_count = {}
 | 
						|
    count = 1
 | 
						|
    clash = {'proxies': [], 'proxy-groups': [
 | 
						|
            {'name': 'automatic', 'type': 'url-test', 'proxies': [], 'url': 'https://www.google.com/favicon.ico',
 | 
						|
             'interval': 300}, {'name': '🌐 Proxy', 'type': 'select', 'proxies': ['automatic']}],
 | 
						|
             'rules': ['MATCH,🌐 Proxy']}
 | 
						|
    with maxminddb.open_database('Country.mmdb') as countrify:
 | 
						|
        for i in tqdm(range(int(len(list))), desc="Parse"):
 | 
						|
            x = list[i]
 | 
						|
            try:
 | 
						|
                float(x['password'])
 | 
						|
            except:
 | 
						|
                try:
 | 
						|
                    float(x['uuid'])
 | 
						|
                except:
 | 
						|
                    try:
 | 
						|
                        ip = str(socket.gethostbyname(x["server"]))
 | 
						|
                    except:
 | 
						|
                        ip = str(x["server"])
 | 
						|
                    try:
 | 
						|
                        country = str(countrify.get(ip)['country']['iso_code'])
 | 
						|
                    except:
 | 
						|
                        country = 'UN'
 | 
						|
                    if country == 'TW' or country == 'MO' or country == 'HK':
 | 
						|
                        flagcountry = 'CN'
 | 
						|
                    else:
 | 
						|
                        flagcountry = country
 | 
						|
                    try:
 | 
						|
                        country_count[country] = country_count[country] + 1
 | 
						|
                        x['name'] = str(flag.flag(flagcountry)) + " " + country + " " + str(count)
 | 
						|
                    except:
 | 
						|
                        country_count[country] = 1
 | 
						|
                        x['name'] = str(flag.flag(flagcountry)) + " " + country + " " + str(count)
 | 
						|
                    clash['proxies'].append(x)
 | 
						|
                    clash['proxy-groups'][0]['proxies'].append(x['name'])
 | 
						|
                    clash['proxy-groups'][1]['proxies'].append(x['name'])
 | 
						|
                    count = count + 1
 | 
						|
            # except:
 | 
						|
            # print(list[i])
 | 
						|
            # pass
 | 
						|
 | 
						|
    with open(outfile, 'w') as writer:
 | 
						|
        yaml.dump(clash, writer, sort_keys=False)
 | 
						|
 | 
						|
 | 
						|
def checkenv():
 | 
						|
    home = str(Path.home())
 | 
						|
    mmdbfl = home + '/.config/clash/Country.mmdb'
 | 
						|
    operating_system = str(platform.platform())
 | 
						|
    if operating_system.startswith('macOS'):
 | 
						|
        if 'arm64' in operating_system:
 | 
						|
            clashname='./clash-darwinarm64'
 | 
						|
        else:
 | 
						|
            clashname='./clash-darwinamd64'
 | 
						|
    elif operating_system.startswith('Linux'):
 | 
						|
        clashname='./clash-linuxamd64'
 | 
						|
    elif operating_system.startswith('Windows'):
 | 
						|
        clashname='clash-windowsamd64.exe'
 | 
						|
    else:
 | 
						|
        print('Unsupported Platform')
 | 
						|
        exit(1)
 | 
						|
    print('Running on '+ operating_system)
 | 
						|
 | 
						|
    return clashname, operating_system
 | 
						|
 | 
						|
def filter(config):
 | 
						|
    list = config["proxies"]
 | 
						|
    # print(list)
 | 
						|
    ss_supported_ciphers = ['aes-128-gcm', 'aes-192-gcm', 'aes-256-gcm',
 | 
						|
                            'aes-128-cfb', 'aes-192-cfb', 'aes-256-cfb', 'aes-128-ctr', 'aes-192-ctr', 'aes-256-ctr',
 | 
						|
                            'rc4-md5', 'chacha20-ietf', 'xchacha20', 'chacha20-ietf-poly1305',
 | 
						|
                            'xchacha20-ietf-poly1305']
 | 
						|
    ssr_supported_obfs = ['plain', 'http_simple', 'http_post', 'random_head', 'tls1.2_ticket_auth',
 | 
						|
                          'tls1.2_ticket_fastauth']
 | 
						|
    ssr_supported_protocol = ['origin', 'auth_sha1_v4', 'auth_aes128_md5', 'auth_aes128_sha1', 'auth_chain_a',
 | 
						|
                              'auth_chain_b']
 | 
						|
    vmess_supported_ciphers = ['auto', 'aes-128-gcm', 'chacha20-poly1305', 'none']
 | 
						|
    iplist = {}
 | 
						|
    passlist = []
 | 
						|
    count = 1
 | 
						|
    clash = {'proxies': [], 'proxy-groups': [
 | 
						|
            {'name': 'automatic', 'type': 'url-test', 'proxies': [], 'url': 'https://www.google.com/favicon.ico',
 | 
						|
             'interval': 300}, {'name': '🌐 Proxy', 'type': 'select', 'proxies': ['automatic']}],
 | 
						|
             'rules': ['MATCH,🌐 Proxy']}
 | 
						|
    with maxminddb.open_database('Country.mmdb') as countrify:
 | 
						|
        for i in tqdm(range(int(len(list))), desc="Parse"):
 | 
						|
            try:
 | 
						|
                x = list[i]
 | 
						|
                authentication = ''
 | 
						|
                x['port'] = int(x['port'])
 | 
						|
                try:
 | 
						|
                    ip = str(socket.gethostbyname(x["server"]))
 | 
						|
                except:
 | 
						|
                    ip = x['server']
 | 
						|
                try:
 | 
						|
                    country = str(countrify.get(ip)['country']['iso_code'])
 | 
						|
                except:
 | 
						|
                    country = 'UN'
 | 
						|
                if x['type'] == 'ss':
 | 
						|
                    try:
 | 
						|
                        if x['cipher'] not in ss_supported_ciphers:
 | 
						|
                            ss_omit_cipher_unsupported = ss_omit_cipher_unsupported + 1
 | 
						|
                            continue
 | 
						|
                        if country != 'CN':
 | 
						|
                            if ip in iplist:
 | 
						|
                                ss_omit_ip_dupe = ss_omit_ip_dupe + 1
 | 
						|
                                continue
 | 
						|
                            else:
 | 
						|
                                iplist[ip] = []
 | 
						|
                                iplist[ip].append(x['port'])
 | 
						|
                        x['name'] = str(flag.flag(country)) + ' ' + str(country) + ' ' + str(count) + ' ' + 'SSS'
 | 
						|
                        authentication = 'password'
 | 
						|
                    except:
 | 
						|
                        continue
 | 
						|
                elif x['type'] == 'ssr':
 | 
						|
                    try:
 | 
						|
                        if x['cipher'] not in ss_supported_ciphers:
 | 
						|
                            continue
 | 
						|
                        if x['obfs'] not in ssr_supported_obfs:
 | 
						|
                            continue
 | 
						|
                        if x['protocol'] not in ssr_supported_protocol:
 | 
						|
                            continue
 | 
						|
                        if country != 'CN':
 | 
						|
                            if ip in iplist:
 | 
						|
                                continue
 | 
						|
                            else:
 | 
						|
                                iplist.append(ip)
 | 
						|
                                iplist[ip].append(x['port'])
 | 
						|
                        authentication = 'password'
 | 
						|
                        x['name'] = str(flag.flag(country)) + ' ' + str(country) + ' ' + str(count) + ' ' + 'SSR'
 | 
						|
                    except:
 | 
						|
                        continue
 | 
						|
                elif x['type'] == 'vmess':
 | 
						|
                    try:
 | 
						|
                        if 'udp' in x:
 | 
						|
                            if x['udp'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        if 'tls' in x:
 | 
						|
                            if x['tls'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        if 'skip-cert-verify' in x:
 | 
						|
                            if x['skip-cert-verify'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        if x['cipher'] not in vmess_supported_ciphers:
 | 
						|
                            continue
 | 
						|
                        x['name'] = str(flag.flag(country)) + ' ' + str(country) + ' ' + str(count) + ' ' + 'VMS'
 | 
						|
                        authentication = 'uuid'
 | 
						|
                    except:
 | 
						|
                        continue
 | 
						|
                elif x['type'] == 'trojan':
 | 
						|
                    try:
 | 
						|
                        if 'udp' in x:
 | 
						|
                            if x['udp'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        if 'skip-cert-verify' in x:
 | 
						|
                            if x['skip-cert-verify'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        x['name'] = str(flag.flag(country)) + ' ' + str(country) + ' ' + str(count) + ' ' + 'TJN'
 | 
						|
                        authentication = 'password'
 | 
						|
                    except:
 | 
						|
                        continue
 | 
						|
                elif x['type'] == 'snell':
 | 
						|
                    try:
 | 
						|
                        if 'udp' in x:
 | 
						|
                            if x['udp'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        if 'skip-cert-verify' in x:
 | 
						|
                            if x['skip-cert-verify'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        x['name'] = str(flag.flag(country)) + ' ' + str(country) + ' ' + str(count) + ' ' + 'SNL'
 | 
						|
                        authentication = 'psk'
 | 
						|
                    except:
 | 
						|
                        continue
 | 
						|
                elif x['type'] == 'http':
 | 
						|
                    try:
 | 
						|
                        if 'tls' in x:
 | 
						|
                            if x['tls'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        x['name'] = str(flag.flag(country)) + ' ' + str(country) + ' ' + str(count) + ' ' + 'HTT'
 | 
						|
                        # authentication = 'userpass'
 | 
						|
                    except:
 | 
						|
                        continue
 | 
						|
                elif x['type'] == 'socks5':
 | 
						|
                    try:
 | 
						|
                        if 'tls' in x:
 | 
						|
                            if x['tls'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        if 'udp' in x:
 | 
						|
                            if x['udp'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        if 'skip-cert-verify' in x:
 | 
						|
                            if x['skip-cert-verify'] not in [False, True]:
 | 
						|
                                continue
 | 
						|
                        x['name'] = str(flag.flag(country)) + ' ' + str(country) + ' ' + str(count) + ' ' + 'SK5'
 | 
						|
                        # authentication = 'userpass'
 | 
						|
                    except:
 | 
						|
                        continue
 | 
						|
                else:
 | 
						|
                    print(x)
 | 
						|
                    print('unsupported')
 | 
						|
                    continue
 | 
						|
                if ip in iplist and x['port'] in iplist[ip]:
 | 
						|
                    if country != 'CN':
 | 
						|
                        continue
 | 
						|
                    else:
 | 
						|
                        if x[authentication] in passlist:
 | 
						|
                            continue
 | 
						|
                        else:
 | 
						|
                            passlist.append(x[authentication])
 | 
						|
                            pass
 | 
						|
                else:
 | 
						|
                    try:
 | 
						|
                        iplist[ip].append(x['port'])
 | 
						|
                    except:
 | 
						|
                        iplist[ip] = []
 | 
						|
                        iplist[ip].append(x['port'])
 | 
						|
 | 
						|
                clash['proxies'].append(x)
 | 
						|
                clash['proxy-groups'][0]['proxies'].append(x['name'])
 | 
						|
                clash['proxy-groups'][1]['proxies'].append(x['name'])
 | 
						|
                count = count + 1
 | 
						|
 | 
						|
            except:
 | 
						|
                print('shitwentwrong' + str(x))
 | 
						|
                continue
 | 
						|
 | 
						|
    return clash
 |