Esempio n. 1
0
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
Esempio n. 2
0
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)
Esempio n. 3
0
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
Esempio n. 4
0
 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
Esempio n. 5
0
    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,
    )
Esempio n. 6
0
    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
Esempio n. 7
0
 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