def add_new_vmess( v2ray_url, crawl_id: int = 0, interval: int = global_variable.get_conf_int("INTERVAL", default=1800), ) -> bool: try: if v2ray_url == "": return False # 已经存在了,就不管了 data = (global_variable.get_db().query(SubscribeVmss).filter( SubscribeVmss.url == v2ray_url).first()) if data is not None: if (data.death_count is None or data.death_count < global_variable.get_conf_int( "BASE_DEATH_COUNT", default=10)): logger.debug("vmess crawl again {}".format(v2ray_url)) new_db = global_variable.get_db() new_db.query(SubscribeVmss).filter( SubscribeVmss.id == data.id).update({ SubscribeVmss.death_count: int( global_variable.get_conf_int("BASE_DEATH_COUNT", default=30) / 2), }) new_db.commit() return True if v2ray_url.startswith("vmess://"): # vmess try: logger.debug("new vmess is {}".format(v2ray_url)) v = json.loads( utils.base64_decode(v2ray_url.replace("vmess://", ""))) new_db = global_variable.get_db() new_db.add( SubscribeVmss( url=v2ray_url, network_protocol_type="" if v.get("net") is None else v.get("net"), death_count=global_variable.get_conf_int( "BASE_DEATH_COUNT", default=30), next_at=0, is_closed=False, interval=int(interval), crawl_id=int(crawl_id), conf_details=v, )) new_db.commit() return True except sqlalchemy.exc.IntegrityError: pass except (UnicodeDecodeError, json.decoder.JSONDecodeError): pass except: logger.error("err: {}".format(traceback.format_exc())) return False except: logger.error("err: {}".format(traceback.format_exc())) return True
def keep_time_consistent(): need_start = False logger.info("时间校验服务启动") ntp_interval = global_variable.get_conf_int("NTP_INTERVAL", default=64) ntp_host = global_variable.get_conf_str("NTP_HOST", default="ntp.aliyun.com") ntp_port = global_variable.get_conf_int("NTP_PORT", default=123) while True: if not check_time_consistent(ntp_host, ntp_port): break time.sleep(ntp_interval)
def check_by_v2ray_url(test_url: str): try: try: time.sleep(5) headers = { "Connection": "close", "User-Agent": global_variable.get_user_agent(), } start_time = time.time() r = requests.get( url=test_url, proxies={ "http": "socks5://127.0.0.1:{}".format( global_variable.get_conf_int("CHECK_PORT", default=1080) ), "https": "socks5://127.0.0.1:{}".format( global_variable.get_conf_int("CHECK_PORT", default=1080) ), }, timeout=30, headers=headers, ) if r.status_code == 200: request_time = time.time() - start_time del start_time size = sys.getsizeof(r.content) / 1024 network_delay = r.elapsed.microseconds / 1000 / 1000 speed = size / (request_time - network_delay) else: speed = 0 network_delay = 0 r.close() del r except requests.exceptions.Timeout: logger.warning("connect time out") speed = -2 network_delay = -2 except requests.exceptions.ConnectionError: logger.warning("connect error") speed = -3 network_delay = -3 except: speed = -1 network_delay = -1 logger.error(traceback.format_exc()) logger.info("{}kb/s({} ms)\t测试连接{}".format(speed, network_delay, test_url)) return float(speed), float(network_delay) except: logger.error(traceback.format_exc()) return -1, -1
def _find_pid(self): for pid in psutil.pids(): try: p = psutil.Process(pid) if pid == 0 or len(p.cmdline()) == 0: continue for connection in p.connections(): if (connection.type == 1 and (connection.laddr.port == global_variable.get_conf_int( "CHECK_PORT", default=1080) if connection.laddr != () else False) or (connection.raddr.port != global_variable.get_conf_int( "CHECK_PORT", default=1080) if connection.laddr == () else False)): self.pid = pid return except (PermissionError, psutil.AccessDenied, psutil.NoSuchProcess): pass
def _init_route_list(self): for ROUTE in ROUTE_LIST: logger.info("a new route will add {}".format(ROUTE.name)) self.register_blueprint(ROUTE) def _init_service(self): self._init_route_list() self.logger = logger start_task() self.before_request_funcs.setdefault(None, []).append(before_request) self._register_error_handler(None, Exception, error_handler) app = ServiceCentre() @app.route("/favicon.ico") def favicon(): return "" if __name__ == "__main__": app.run( global_variable.get_conf_str("HOST", default="0.0.0.0"), port=global_variable.get_conf_int("PORT", default=5000), threaded=True, )
def format_config(self): v2ray_conf = { "policy": { "system": { "statsInboundUplink": True, "statsInboundDownlink": True } }, "log": { "access": "./v2ray_access.log", "error": "./v2ray_err.log", "loglevel": "warning", }, "inbounds": [ { "tag": "proxy", "port": global_variable.get_conf_int("CHECK_PORT", default=1080), "listen": "127.0.0.1", "protocol": "socks", "sniffing": { "enabled": True, "destOverride": ["http", "tls"] }, "settings": { "auth": "noauth", "udp": True, "ip": None, "address": None, "clients": None, }, "streamSettings": None, }, ], "outbounds": [], "stats": {}, "api": { "tag": "api", "services": ["StatsService"] }, "routing": { "domainStrategy": "IPIfNonMatch", "rules": [ { "type": "field", "port": None, "inboundTag": "api", "outboundTag": "api", "ip": None, "domain": None, }, { "type": "field", "port": None, "inboundTag": None, "outboundTag": "proxy", "ip": None, "domain": [ "geosite:google", "geosite:github", "geosite:netflix", "geosite:steam", "geosite:telegram", "geosite:tumblr", "geosite:speedtest", "geosite:bbc", "domain:gvt1.com", "domain:cachefly.net", "domain:textnow.com", "domain:twitch.tv", "domain:wikileaks.org", "domain:naver.com", ], }, { "type": "field", "port": None, "inboundTag": None, "outboundTag": "proxy", "ip": [ "91.108.4.0/22", "91.108.8.0/22", "91.108.12.0/22", "91.108.20.0/22", "91.108.36.0/23", "91.108.38.0/23", "91.108.56.0/22", "149.154.160.0/20", "149.154.164.0/22", "149.154.172.0/22", "74.125.0.0/16", "173.194.0.0/16", "172.217.0.0/16", "216.58.200.0/24", "216.58.220.0/24", ], "domain": None, }, { "type": "field", "port": None, "inboundTag": None, "outboundTag": "direct", "ip": None, "domain": [ "domain:12306.com", "domain:51ym.me", "domain:52pojie.cn", "domain:8686c.com", "domain:abercrombie.com", "domain:adobesc.com", "domain:air-matters.com", "domain:air-matters.io", "domain:airtable.com", "domain:akadns.net", "domain:apache.org", "domain:api.crisp.chat", "domain:api.termius.com", "domain:appshike.com", "domain:appstore.com", "domain:aweme.snssdk.com", "domain:bababian.com", "domain:battle.net", "domain:beatsbydre.com", "domain:bet365.com", "domain:bilibili.cn", "domain:ccgslb.com", "domain:ccgslb.net", "domain:chunbo.com", "domain:chunboimg.com", "domain:clashroyaleapp.com", "domain:cloudsigma.com", "domain:cloudxns.net", "domain:cmfu.com", "domain:culturedcode.com", "domain:dct-cloud.com", "domain:didialift.com", "domain:douyutv.com", "domain:duokan.com", "domain:dytt8.net", "domain:easou.com", "domain:ecitic.net", "domain:eclipse.org", "domain:eudic.net", "domain:ewqcxz.com", "domain:fir.im", "domain:frdic.com", "domain:fresh-ideas.cc", "domain:godic.net", "domain:goodread.com", "domain:haibian.com", "domain:hdslb.net", "domain:hollisterco.com", "domain:hongxiu.com", "domain:hxcdn.net", "domain:images.unsplash.com", "domain:img4me.com", "domain:ipify.org", "domain:ixdzs.com", "domain:jd.hk", "domain:jianshuapi.com", "domain:jomodns.com", "domain:jsboxbbs.com", "domain:knewone.com", "domain:kuaidi100.com", "domain:lemicp.com", "domain:letvcloud.com", "domain:lizhi.io", "domain:localizecdn.com", "domain:lucifr.com", "domain:luoo.net", "domain:mai.tn", "domain:maven.org", "domain:miwifi.com", "domain:moji.com", "domain:moke.com", "domain:mtalk.google.com", "domain:cachefly.net", "domain:mxhichina.com", "domain:myqcloud.com", "domain:myunlu.com", "domain:netease.com", "domain:nfoservers.com", "domain:nssurge.com", "domain:nuomi.com", "domain:ourdvs.com", "domain:overcast.fm", "domain:paypal.com", "domain:paypalobjects.com", "domain:pgyer.com", "domain:qdaily.com", "domain:qdmm.com", "domain:qin.io", "domain:qingmang.me", "domain:qingmang.mobi", "domain:qqurl.com", "domain:rarbg.to", "domain:rrmj.tv", "domain:ruguoapp.com", "domain:sm.ms", "domain:snwx.com", "domain:soku.com", "domain:startssl.com", "domain:store.steampowered.com", "domain:symcd.com", "domain:teamviewer.com", "domain:tmzvps.com", "domain:trello.com", "domain:trellocdn.com", "domain:ttmeiju.com", "domain:udache.com", "domain:uxengine.net", "domain:weather.bjango.com", "domain:weather.com", "domain:webqxs.com", "domain:weico.cc", "domain:wenku8.net", "domain:werewolf.53site.com", "domain:windowsupdate.com", "domain:wkcdn.com", "domain:workflowy.com", "domain:xdrig.com", "domain:xiaojukeji.com", "domain:xiaomi.net", "domain:xiaomicp.com", "domain:ximalaya.com", "domain:xitek.com", "domain:xmcdn.com", "domain:xslb.net", "domain:xteko.com", "domain:yach.me", "domain:yixia.com", "domain:yunjiasu-cdn.net", "domain:zealer.com", "domain:zgslb.net", "domain:zimuzu.tv", "domain:zmz002.com", "domain:pinquest.com", "domain:samsungdm.com", ], }, { "type": "field", "port": None, "inboundTag": None, "outboundTag": "block", "ip": None, "domain": ["geosite:category-ads"], }, { "type": "field", "port": None, "inboundTag": None, "outboundTag": "direct", "ip": ["geoip:private"], "domain": None, }, { "type": "field", "port": None, "inboundTag": None, "outboundTag": "direct", "ip": ["geoip:cn"], "domain": None, }, { "type": "field", "port": None, "inboundTag": None, "outboundTag": "direct", "ip": None, "domain": ["geosite:cn"], }, ], }, } if self.network == "tcp" or self.network == "auto": # tcp下 v2ray_conf["outbounds"].append({ "protocol": "vmess", "settings": { "vnext": [{ "address": self.ip, "port": int(self.port), "users": [{ "id": self.uuid, "alterId": self.alterId }], }] }, "streamSettings": { "network": "tcp" }, "tag": "out", }) return v2ray_conf elif self.network == "kcp": # kcp 下 v2ray_conf["outbounds"].append({ "protocol": "vmess", "settings": { "vnext": [{ "address": self.ip, "port": int(self.port), "users": [{ "id": self.uuid, "alterId": self.alterId }], }] }, "streamSettings": { "network": "kcp", "kcpSettings": { "mtu": 1350, "tti": 50, "uplinkCapacity": 12, "downlinkCapacity": 100, "congestion": False, "readBufferSize": 2, "writeBufferSize": 2, "header": { "type": self.camouflageType, }, }, }, "tag": "out", }) return v2ray_conf elif self.network == "ws": # ws v2ray_conf["outbounds"].append({ "protocol": "vmess", "settings": { "vnext": [{ "address": self.ip, "port": int(self.port), "users": [{ "id": self.uuid, "alterId": self.alterId }], }] }, "streamSettings": { "network": "ws", "security": self.camouflageTls, "tlsSettings": { "allowInsecure": True, }, "wsSettings": { "path": self.camouflagePath, "headers": { "Host": self.camouflageHost }, }, }, "tag": "out", }) return v2ray_conf else: # h2 v2ray_conf["outbounds"].append({ "protocol": "vmess", "settings": { "vnext": [{ "address": self.ip, "port": int(self.port), "users": [{ "id": self.uuid, "alterId": self.alterId }], }] }, "streamSettings": { "network": "ws", "security": self.camouflageTls, "tlsSettings": { "allowInsecure": True, }, "httpSettings": { "path": self.camouflagePath, "host": [self.camouflageHost], }, }, "tag": "out", }) return v2ray_conf
def format_config(self): ss_config = { "log": { "access": "/var/log/v2ray/access.log", "error": "/var/log/v2ray/error.log", "logLevel": "none", }, "inbounds": [{ "port": global_variable.get_conf_int("CHECK_PORT", default=1080), "listen": "127.0.0.1", "protocol": "socks", "settings": { "udp": True }, "tag": "proxy", }], "outbounds": [ { "settings": {}, "protocol": "freedom", "tag": "direct" }, { "settings": {}, "protocol": "blackhole", "tag": "blocked" }, ], "routing": { "strategy": "rules", "settings": { "domainStrategy": "AsIs", "rules": [ { "type": "field", "ip": ["geoip:cn", "geoip:private"], "outboundTag": "direct", }, { "type": "field", "inboundTag": ["in"], "outboundTag": "out" }, ], }, }, } ss_config["outbounds"].append({ "tag": "out", "protocol": "shadowsocks", "settings": { "servers": [{ "address": self.ip, "method": self.security, "ota": False, "password": self.password, "port": int(self.port), "level": 1, }] }, "streamSettings": { "network": "tcp" }, "mux": { "enabled": False }, }) return ss_config