Commit c04edc45 authored by jinliang's avatar jinliang

add vps feature

parent 780ee419
...@@ -286,8 +286,9 @@ public class IpResourceServiceImpl implements IpResourceService { ...@@ -286,8 +286,9 @@ public class IpResourceServiceImpl implements IpResourceService {
case "isp": case "isp":
ipResource.setVendorCn("住宅"); ipResource.setVendorCn("住宅");
break; break;
case "aws": //阿里云windows设备,支持代理IP和远程桌面
ipResource.setVendorCn("亚马逊云"); case "remote":
ipResource.setVendorCn("远程设备");
break; break;
} }
ipResource.setStatus(6); ipResource.setStatus(6);
......
...@@ -31,6 +31,7 @@ import com.edgec.browserbackend.browser.repository.IpHistoryRepository; ...@@ -31,6 +31,7 @@ import com.edgec.browserbackend.browser.repository.IpHistoryRepository;
import com.edgec.browserbackend.browser.repository.IpResourceRepository; import com.edgec.browserbackend.browser.repository.IpResourceRepository;
import com.edgec.browserbackend.browser.service.IpAndShopService; import com.edgec.browserbackend.browser.service.IpAndShopService;
import com.edgec.browserbackend.common.client.AliEcsClient; import com.edgec.browserbackend.common.client.AliEcsClient;
import com.edgec.browserbackend.common.client.AliEcsRemoteClient;
import com.edgec.browserbackend.common.client.TenCentEcsClient; import com.edgec.browserbackend.common.client.TenCentEcsClient;
import com.edgec.browserbackend.common.client.ipvClient.IpvClient; import com.edgec.browserbackend.common.client.ipvClient.IpvClient;
import com.edgec.browserbackend.common.client.ipvClient.dto.AppInstanceOpenReq; import com.edgec.browserbackend.common.client.ipvClient.dto.AppInstanceOpenReq;
...@@ -290,6 +291,43 @@ public class BrowserTask { ...@@ -290,6 +291,43 @@ public class BrowserTask {
cloudPlatformOrderRepository.save(cloudPlatformOrder); cloudPlatformOrderRepository.save(cloudPlatformOrder);
result = true; result = true;
} }
} else if (ipResource.getVendorCn().equals("远程设备")) {
//获取阿里云服务器region映射
String aliRegion = RegionMappingEnum.getAliRegion(
ipResource.getRegion());
if (StringUtils.isEmpty(aliRegion)) {
log.error(
"buyIpNewTasks-购买VPS error:查询不到阿里云映射api-region:{}",
ipResource.getRegion());
return;
}
CloudPlatformConfig config = cloudPlatformConfigRepository.findByPlatformAndRegionId(
"ali",
aliRegion);
if (Objects.isNull(config)) {
log.error(
"buyIpNewTasks-购买VPS error:查询不到阿里云模板配置-region:{}",
aliRegion);
return;
}
RunInstancesResponse response = AliEcsRemoteClient.runInstances(
ipResource.getOwner(), ipResource.getUsername(),
ipResource.getPassword(), config);
if (null == response || !response.getStatusCode().equals(200)) {
log.error("{}, fail to buy vps : {}", logs, JSON.toJSON(response));
} else if (Objects.nonNull(response.getBody())) {
String instanceId = response.getBody().getInstanceIdSets()
.getInstanceIdSet().get(0);
cloudPlatformOrder.setPlatformOrderId(instanceId);
cloudPlatformOrder.setPlatformType("remote");
cloudPlatformOrder.setRegionId(aliRegion);
cloudPlatformOrder.setRetryCount(0);
ipResource.setStatus(3);
ipResourceRepository.save(ipResource);
cloudPlatformOrderRepository.save(cloudPlatformOrder);
result = true;
}
} }
/** /**
...@@ -671,6 +709,105 @@ public class BrowserTask { ...@@ -671,6 +709,105 @@ public class BrowserTask {
} }
ipResourceRepository.deleteById(ipResource.getId()); ipResourceRepository.deleteById(ipResource.getId());
} }
} else if("remote".equals(cloudPlatformOrder.getPlatformType())) {
DescribeInstancesResponse response = AliEcsRemoteClient.getDescribeInstances(
ipResource.getOwner(), cloudPlatformOrder.getPlatformOrderId(),
cloudPlatformOrder.getRegionId());
if (!response.getStatusCode().equals(200)) {
log.error(", fail to query ip : {}",
JSON.toJSON(response.getBody()));
}
if (Objects.nonNull(response.getBody())) {
//判断是否重复购买
Instance instance = response.getBody().getInstances()
.getInstance().get(0);
if (instance.getInstanceChargeType().equals("PrePaid")) {
//包年包月 更新ip状态
ipResource.setAddr(
instance.getPublicIpAddress().getIpAddress().get(0));
ipResource.setStatus(0);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd'T'HH:mmX");
Instant instant = Instant.from(
formatter.parse(instance.getExpiredTime()));
ipResource.setValidTime(instant.toEpochMilli());
if (StringUtils.isNotBlank(ipResource.getRegion())
&& region.contains(ipResource.getRegion())) {
ipResource.setProxyUsername(ipResource.getAddr());
ipResource.setProxyPassword(genRandom(3, 12));
ipResource.setSpecialLine(true);
}
ipResourceRepository.save(ipResource);
IpHistory ipHistory = new IpHistory();
ipHistory.setIpNo(ipResource.getAddr());
ipHistory.setPlatformType(
cloudPlatformOrder.getPlatformType());
ipHistory.setPurchasedTime(Instant.now().toEpochMilli());
ipHistoryRepository.save(ipHistory);
return;
}
//查询是否为重复ip
String ipNo = instance.getPublicIpAddress().getIpAddress()
.get(0);
LocalDateTime localDateTime = LocalDateTime.now()
.minus(3, ChronoUnit.MONTHS);
Instant instant = localDateTime.atZone(ZoneId.systemDefault())
.toInstant();
List<IpHistory> ipHistoryList = ipHistoryRepository.findByIpNoAndPurchasedTimeAfter(
ipNo,
instant.toEpochMilli());
if (CollectionUtils.isNotEmpty(ipHistoryList) &&
(Objects.isNull(cloudPlatformOrder.getRetryCount()) ||
cloudPlatformOrder.getRetryCount() < 5)) {
//重新分配ip(删除旧的 购买新的)
AliEcsRemoteClient.deleteInstance(
ipResource.getOwner(),
cloudPlatformOrder.getPlatformOrderId(),
cloudPlatformOrder.getRegionId());
CloudPlatformConfig config = cloudPlatformConfigRepository.findByPlatformAndRegionId(
"ali",
cloudPlatformOrder.getRegionId());
RunInstancesResponse response1 = AliEcsRemoteClient.runInstances(
ipResource.getOwner(), ipResource.getUsername(),
ipResource.getPassword(), config);
if (null == response1 || !response1.getStatusCode()
.equals(200)) {
log.error("queryIpNewTasks, fail to buy vps again : {}",
JSON.toJSON(response));
} else if (Objects.nonNull(response1.getBody())) {
int oldRetryCount =
Objects.isNull(cloudPlatformOrder.getRetryCount())
? 0 : cloudPlatformOrder.getRetryCount();
cloudPlatformOrder.setRetryCount(oldRetryCount + 1);
cloudPlatformOrderRepository.save(cloudPlatformOrder);
String instanceId = response1.getBody()
.getInstanceIdSets().getInstanceIdSet().get(0);
cloudPlatformOrder.setPlatformOrderId(instanceId);
ipResource.setStatus(3);
ipResourceRepository.save(ipResource);
cloudPlatformOrderRepository.save(cloudPlatformOrder);
}
} else {
//将ip改为包年包月
String periodUnit =
ipResource.getUnit().equals("week") ? "Week" : "Month";
ModifyInstanceChargeTypeResponse modifyInstanceChargeTypeResponse =
AliEcsRemoteClient.modifyInstanceChargeType(
ipResource.getOwner(), periodUnit,
ipResource.getPeriod(),
cloudPlatformOrder.getRegionId(),
cloudPlatformOrder.getPlatformOrderId());
if (null == modifyInstanceChargeTypeResponse
|| !modifyInstanceChargeTypeResponse.getStatusCode()
.equals(200)) {
//TODO 目前先抛错误 待确认如何解决
log.error("queryIpNewTasks, fail to buy vps again : {}",
JSON.toJSON(response));
}
}
}
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
...@@ -811,6 +948,32 @@ public class BrowserTask { ...@@ -811,6 +948,32 @@ public class BrowserTask {
} }
} }
} }
} else if ("remote".equals(cloudPlatformOrder.getPlatformType())) {
DescribeInstancesResponse response = AliEcsRemoteClient.getDescribeInstances(
ipResource.getOwner(), cloudPlatformOrder.getPlatformOrderId(),
cloudPlatformOrder.getRegionId());
if (!response.getStatusCode().equals(200)) {
log.error(", fail to query ip : {}",
JSON.toJSON(response.getBody()));
}
if (Objects.nonNull(response.getBody())) {
//判断是否重复购买
Instance instance = response.getBody().getInstances()
.getInstance().get(0);
if (instance.getInstanceChargeType().equals("PrePaid")) {
//包年包夜 更新ip状态
ipResource.setStatus(0);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd'T'HH:mmX");
Instant instant = Instant.from(
formatter.parse(instance.getExpiredTime()));
long epochMilli = instant.toEpochMilli();
if(epochMilli > ipResource.getValidTime()) {
ipResource.setValidTime(epochMilli);
ipResourceRepository.save(ipResource);
}
}
}
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
......
package com.edgec.browserbackend.common.client;
import com.alibaba.fastjson.JSON;
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.service.ecs20140526.AsyncClient;
import com.aliyun.sdk.service.ecs20140526.models.DeleteInstanceRequest;
import com.aliyun.sdk.service.ecs20140526.models.DeleteInstanceResponse;
import com.aliyun.sdk.service.ecs20140526.models.DescribeInstancesRequest;
import com.aliyun.sdk.service.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.sdk.service.ecs20140526.models.ModifyInstanceChargeTypeRequest;
import com.aliyun.sdk.service.ecs20140526.models.ModifyInstanceChargeTypeResponse;
import com.aliyun.sdk.service.ecs20140526.models.RenewInstanceRequest;
import com.aliyun.sdk.service.ecs20140526.models.RenewInstanceResponse;
import com.aliyun.sdk.service.ecs20140526.models.RunInstancesRequest;
import com.aliyun.sdk.service.ecs20140526.models.RunInstancesResponse;
import com.edgec.browserbackend.browser.domain.CloudPlatformConfig;
import com.edgec.browserbackend.common.utils.Aes;
import darabonba.core.client.ClientOverrideConfiguration;
import java.util.concurrent.CompletableFuture;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @Description 阿里云ECS相关api \
* url:https://next.api.aliyun.com/document/Ecs/2014-05-26/overview
* @Data 2024年7月28日
**/
@Service
@RequiredArgsConstructor
@Slf4j
public class AliEcsRemoteClient {
//access_key_id
private static String getAccessKeyId() {
return "LTAI5tEdz1DY4A4oYUawUuNH";
}
//access_key_secret
private static String getAccessKeySecret() {
return "8KWmYgO0QIicZpyulhEwUhZqStrTwe";
}
//launch_template_id
//脚本userData
private static String getUserData() {
return "#!/bin/sh\n"
+ "echo \"users %s:CL:%s\n"
+ "allow %s *\n"
+ "auth strong\n"
+ "proxy -p8880\n"
+ "proxy -p8881 -a\n"
+ "socks -p8882\n"
+ "flush\" | tee /etc/3proxy.cfg\n"
+ "systemctl restart 3proxy";
}
/*
* @Description //创建链接
* @Date 2024/7/25 10:32
**/
private static AsyncClient createClient(String regionId) {
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
.accessKeyId(getAccessKeyId())
.accessKeySecret(getAccessKeySecret())
.build());
String endpoint = String.format("ecs.%s.aliyuncs.com", regionId);
return AsyncClient.builder()
.region(regionId)
.credentialsProvider(provider)
.overrideConfiguration(
ClientOverrideConfiguration.create()
.setEndpointOverride(endpoint)
)
.build();
}
/**
* 创建并运行实例
*/
public static RunInstancesResponse runInstances(String owner,String username, String password, CloudPlatformConfig config) {
AsyncClient client = createClient(config.getRegionId());
RunInstancesResponse runInstancesResponse = null;
String userData = String.format(getUserData(), username, password, username);
try {
RunInstancesRequest runInstancesRequest = RunInstancesRequest.builder()
.regionId(config.getRegionId())
.launchTemplateId(config.getTemplateId())
.userData(Aes.base64Encode(userData.getBytes()))
.password(password)
.build();
log.info("调用aliEcsRemote创建并运行实例,入参:owner:{},regionId:{}", owner, config.getRegionId());
CompletableFuture<RunInstancesResponse> response = client.runInstances(
runInstancesRequest);
runInstancesResponse = response.get();
log.info("调用aliEcsRemote创建并运行实例,响应参数:owner:{},response:{}", owner,
JSON.toJSON(runInstancesResponse));
} catch (Exception e) {
log.error("fail to aliEcsRemote runInstances {}", e.getMessage());
} finally {
client.close();
}
return runInstancesResponse;
}
/**
* 续费实例
*/
public static RenewInstanceResponse renewInstance(String owner, String regionId, String instanceId,
Integer period, String periodUnit){
AsyncClient client = createClient(regionId);
RenewInstanceResponse renewInstanceResponse = null;
try {
RenewInstanceRequest renewInstanceRequest = RenewInstanceRequest.builder()
.instanceId(instanceId)
.period(period)
.periodUnit(periodUnit)
.build();
log.info("调用aliEcsRemote续费实例,入参:owner:{},regionId:{},instanceId:{},period:{},periodUnit:{}", owner, regionId, instanceId, period, periodUnit);
CompletableFuture<RenewInstanceResponse> response = client.renewInstance(
renewInstanceRequest);
renewInstanceResponse = response.get();
log.info("调用aliEcsRemote续费实例,响应参数:owner:{},response:{}", owner,
JSON.toJSON(renewInstanceResponse));
} catch (Exception e) {
log.error("fail to aliEcsRemote runInstances {}", e.getMessage());
} finally {
client.close();
}
return renewInstanceResponse;
}
/**
* 查询单个实例
*/
public static DescribeInstancesResponse getDescribeInstances(String owner, String instanceId,
String regionId) {
AsyncClient client = createClient(regionId);
DescribeInstancesResponse resp = null;
try {
String instanceIds = String.format("[\"%s\"]", instanceId);
DescribeInstancesRequest describeInstancesRequest = DescribeInstancesRequest.builder()
.regionId(regionId)
.instanceIds(instanceIds)
.build();
log.info("调用aliEcsRemote查询单个实例,入参:owner:{},regionId:{},instanceId:{}",
owner, regionId, instanceId);
CompletableFuture<DescribeInstancesResponse> response = client.describeInstances(
describeInstancesRequest);
resp = response.get();
log.info("调用aliEcsRemote查询单个实例,响应参数:owner:{},response:{}", owner,
JSON.toJSON(resp));
} catch (Exception e) {
log.error("fail to aliEcsRemote getDescribeInstances {}", e.getMessage());
} finally {
client.close();
}
return resp;
}
/**
* 删除ECS
*/
public static DeleteInstanceResponse deleteInstance(String owner, String instanceId, String regionId) {
AsyncClient client = createClient(regionId);
DeleteInstanceResponse resp = null;
try {
DeleteInstanceRequest deleteInstanceRequest = DeleteInstanceRequest.builder()
.instanceId(instanceId)
.force(true)
.build();
log.info("调用aliEcsRemote删除ECS实例,入参:owner:{},instanceId:{},regionId{}",
owner, instanceId, regionId);
CompletableFuture<DeleteInstanceResponse> response = client.deleteInstance(
deleteInstanceRequest);
resp = response.get();
log.info("调用aliEcsRemote删除ECS实例,响应参数:owner:{},response:{}", owner,
JSON.toJSON(resp));
} catch (Exception e) {
log.error("fail to aliEcsRemote deleteInstance {}", e.getMessage());
} finally {
client.close();
}
return resp;
}
/**
* 将按量改为包年包月
*/
public static ModifyInstanceChargeTypeResponse modifyInstanceChargeType(String owner,
String periodUnit, int period, String regionId, String instanceId) {
AsyncClient client = createClient(regionId);
ModifyInstanceChargeTypeResponse modifyInstanceChargeTypeResponse = null;
try {
String instanceIds = String.format("[\"%s\"]", instanceId);
ModifyInstanceChargeTypeRequest modifyInstanceChargeTypeRequest =
ModifyInstanceChargeTypeRequest.builder()
.instanceIds(instanceIds)
.regionId(regionId)
.instanceChargeType("PrePaid")
.periodUnit(periodUnit)
.period(period)
.build();
log.info(
"调用aliEcsRemote将实例由量改为包年包月,入参:owner:{},regionId:{},periodUnit:{},period:{}, instanceId{}",
owner, regionId, periodUnit, period, instanceId);
CompletableFuture<ModifyInstanceChargeTypeResponse> response = client.modifyInstanceChargeType(
modifyInstanceChargeTypeRequest);
modifyInstanceChargeTypeResponse = response.get();
log.info("调用aliEcsRemote将实例由量改为包年包月,响应参数:owner:{},response:{}", owner,
JSON.toJSON(modifyInstanceChargeTypeResponse));
} catch (Exception e) {
log.error("fail to aliEcsRemote modifyInstanceChargeType {}", e.getMessage());
} finally {
client.close();
}
return modifyInstanceChargeTypeResponse;
}
}
...@@ -10,15 +10,22 @@ ...@@ -10,15 +10,22 @@
"呼和浩特", "呼和浩特",
"乌兰察布", "乌兰察布",
"成都", "成都",
"河源" "河源",
"南京"
], ],
"港澳台": [ "港澳台": [
"中国香港" "中国香港",
"中国台湾"
], ],
"美国": [ "美国": [
"美国随机", "美国随机",
"硅谷", "硅谷",
"弗吉尼亚" "弗吉尼亚",
"拉斯维加斯",
"纽约",
"洛杉矶",
"迈阿密",
"华盛顿"
], ],
"亚太": [ "亚太": [
"新加坡", "新加坡",
...@@ -27,12 +34,20 @@ ...@@ -27,12 +34,20 @@
"印度尼西亚-雅加达", "印度尼西亚-雅加达",
"菲律宾-马尼拉", "菲律宾-马尼拉",
"日本-东京", "日本-东京",
"韩国-首尔" "韩国-首尔",
"印度-孟买",
"越南-胡志明"
], ],
"欧洲": [ "欧洲": [
"英国-伦敦", "英国-伦敦",
"德国-法兰克福" "德国-法兰克福"
], ],
"南美": [
"巴西-圣保罗"
],
"北美": [
"加拿大"
],
"本地": [ "本地": [
"本地" "本地"
] ]
...@@ -45,16 +60,19 @@ ...@@ -45,16 +60,19 @@
"阿里云-28-28" "阿里云-28-28"
], ],
"上海": [ "上海": [
"阿里云-28-28" "阿里云-28-28",
"腾讯云-28-28"
], ],
"深圳": [ "深圳": [
"阿里云-28-28" "阿里云-28-28"
], ],
"广州": [ "广州": [
"阿里云-28-28" "阿里云-28-28",
"腾讯云-28-28"
], ],
"北京": [ "北京": [
"阿里云-28-28" "阿里云-28-28",
"腾讯云-28-28"
], ],
"呼和浩特": [ "呼和浩特": [
"阿里云-28-28" "阿里云-28-28"
...@@ -68,44 +86,94 @@ ...@@ -68,44 +86,94 @@
"河源": [ "河源": [
"阿里云-28-28" "阿里云-28-28"
], ],
"南京": [
"腾讯云-28-28"
],
"中国香港": [ "中国香港": [
"阿里云-28-28" "阿里云-28-28",
"住宅-28-28",
"远程设备-68-68"
],
"中国台湾": [
"住宅-28-28"
], ],
"美国随机": [ "美国随机": [
"阿里云-28-28" "阿里云-28-28",
"远程设备-68-68"
], ],
"硅谷": [ "硅谷": [
"阿里云-28-28" "阿里云-28-28",
"腾讯云-28-28"
], ],
"弗吉尼亚": [ "弗吉尼亚": [
"阿里云-28-28" "阿里云-28-28",
"住宅-28-28"
],
"拉斯维加斯": [
"住宅-28-28"
],
"纽约": [
"住宅-28-28"
],
"洛杉矶": [
"住宅-28-28"
],
"迈阿密": [
"住宅-28-28"
],
"华盛顿": [
"住宅-28-28"
],
"加拿大": [
"住宅-28-28"
],
"巴西-圣保罗": [
"腾讯云-28-28"
], ],
"英国-伦敦": [ "英国-伦敦": [
"阿里云-28-28" "阿里云-28-28",
"住宅-28-28"
], ],
"德国-法兰克福": [ "德国-法兰克福": [
"阿里云-28-28" "阿里云-28-28",
"腾讯云-28-28"
], ],
"新加坡": [ "新加坡": [
"阿里云-28-28" "阿里云-28-28",
"腾讯云-28-28",
"住宅-28-28"
], ],
"马来西亚-吉隆坡": [ "马来西亚-吉隆坡": [
"阿里云-28-28" "阿里云-28-28",
"住宅-28-28"
], ],
"泰国-曼谷": [ "泰国-曼谷": [
"阿里云-28-28" "阿里云-28-28",
"住宅-28-28"
], ],
"印度尼西亚-雅加达": [ "印度尼西亚-雅加达": [
"阿里云-28-28" "阿里云-28-28",
"腾讯云-28-28",
"住宅-28-28"
], ],
"菲律宾-马尼拉": [ "菲律宾-马尼拉": [
"阿里云-28-28" "阿里云-28-28",
"住宅-28-28"
], ],
"日本-东京": [ "日本-东京": [
"阿里云-28-28" "阿里云-28-28",
"腾讯云-28-28"
], ],
"韩国-首尔": [ "韩国-首尔": [
"阿里云-28-28" "阿里云-28-28",
"腾讯云-28-28",
"住宅-28-28"
],
"印度-孟买": [
"腾讯云-28-28"
],
"越南-胡志明": [
"住宅-28-28"
], ],
"自有": [ "自有": [
"自有-2-2" "自有-2-2"
...@@ -194,6 +262,24 @@ ...@@ -194,6 +262,24 @@
"PayPal-0", "PayPal-0",
"PayPal(中国)-1", "PayPal(中国)-1",
"其他平台-0" "其他平台-0"
],
"腾讯云": [
"亚马逊-1",
"亚马逊日本-0",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-0",
"PayPal(中国)-1",
"其他平台-0"
] ]
}, },
"深圳": { "深圳": {
...@@ -272,6 +358,24 @@ ...@@ -272,6 +358,24 @@
"PayPal-0", "PayPal-0",
"PayPal(中国)-1", "PayPal(中国)-1",
"其他平台-0" "其他平台-0"
],
"腾讯云": [
"亚马逊-1",
"亚马逊日本-0",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-0",
"PayPal(中国)-1",
"其他平台-0"
] ]
}, },
"青岛": { "青岛": {
...@@ -374,10 +478,30 @@ ...@@ -374,10 +478,30 @@
"其他平台-0" "其他平台-0"
] ]
}, },
"南京": {
"腾讯云": [
"亚马逊-1",
"亚马逊日本-0",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-0",
"PayPal(中国)-1",
"其他平台-0"
]
},
"中国香港": { "中国香港": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -392,9 +516,9 @@ ...@@ -392,9 +516,9 @@
"PayPal-1", "PayPal-1",
"其他平台-0" "其他平台-0"
], ],
"亚马逊云": [ "远程设备": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -409,12 +533,48 @@ ...@@ -409,12 +533,48 @@
"PayPal-0", "PayPal-0",
"PayPal(中国)-1", "PayPal(中国)-1",
"其他平台-0" "其他平台-0"
],
"住宅": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
]
},
"中国台湾": {
"住宅": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
] ]
}, },
"美国随机": { "美国随机": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -429,9 +589,9 @@ ...@@ -429,9 +589,9 @@
"PayPal-1", "PayPal-1",
"其他平台-0" "其他平台-0"
], ],
"亚马逊云": [ "远程设备": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -450,7 +610,24 @@ ...@@ -450,7 +610,24 @@
"硅谷": { "硅谷": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
],
"腾讯云": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -469,7 +646,7 @@ ...@@ -469,7 +646,7 @@
"弗吉尼亚": { "弗吉尼亚": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -484,9 +661,9 @@ ...@@ -484,9 +661,9 @@
"PayPal-1", "PayPal-1",
"其他平台-0" "其他平台-0"
], ],
"亚马逊云": [ "住宅": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -502,10 +679,10 @@ ...@@ -502,10 +679,10 @@
"其他平台-0" "其他平台-0"
] ]
}, },
"俄勒冈": { "拉斯维加斯": {
"亚马逊云": [ "住宅": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -521,10 +698,10 @@ ...@@ -521,10 +698,10 @@
"其他平台-0" "其他平台-0"
] ]
}, },
"俄亥俄": { "纽约": {
"亚马逊云": [ "住宅": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -540,10 +717,10 @@ ...@@ -540,10 +717,10 @@
"其他平台-0" "其他平台-0"
] ]
}, },
"英国-伦敦": { "洛杉矶": {
"阿里云": [ "住宅": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -557,10 +734,12 @@ ...@@ -557,10 +734,12 @@
"FactoryMarket-1", "FactoryMarket-1",
"PayPal-1", "PayPal-1",
"其他平台-0" "其他平台-0"
], ]
"亚马逊云": [ },
"迈阿密": {
"住宅": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -576,10 +755,29 @@ ...@@ -576,10 +755,29 @@
"其他平台-0" "其他平台-0"
] ]
}, },
"德国-法兰克福": { "华盛顿": {
"住宅": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
]
},
"英国-伦敦": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -594,9 +792,9 @@ ...@@ -594,9 +792,9 @@
"PayPal-1", "PayPal-1",
"其他平台-0" "其他平台-0"
], ],
"亚马逊云": [ "住宅": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -612,10 +810,10 @@ ...@@ -612,10 +810,10 @@
"其他平台-0" "其他平台-0"
] ]
}, },
"俄罗斯-莫斯科": { "德国-法兰克福": {
"腾讯云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -629,12 +827,10 @@ ...@@ -629,12 +827,10 @@
"FactoryMarket-1", "FactoryMarket-1",
"PayPal-1", "PayPal-1",
"其他平台-0" "其他平台-0"
] ],
}, "腾讯云": [
"法国-巴黎": {
"亚马逊云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -653,7 +849,7 @@ ...@@ -653,7 +849,7 @@
"日本-东京": { "日本-东京": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -668,9 +864,9 @@ ...@@ -668,9 +864,9 @@
"PayPal-1", "PayPal-1",
"其他平台-0" "其他平台-0"
], ],
"亚马逊云": [ "腾讯云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -690,7 +886,7 @@ ...@@ -690,7 +886,7 @@
"新加坡": { "新加坡": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -705,9 +901,9 @@ ...@@ -705,9 +901,9 @@
"PayPal-1", "PayPal-1",
"其他平台-0" "其他平台-0"
], ],
"亚马逊云": [ "腾讯云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -722,12 +918,10 @@ ...@@ -722,12 +918,10 @@
"FactoryMarket-1", "FactoryMarket-1",
"PayPal-1", "PayPal-1",
"其他平台-1" "其他平台-1"
] ],
}, "住宅": [
"澳大利亚-悉尼": {
"阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -741,10 +935,12 @@ ...@@ -741,10 +935,12 @@
"FactoryMarket-1", "FactoryMarket-1",
"PayPal-1", "PayPal-1",
"其他平台-0" "其他平台-0"
], ]
"亚马逊云": [ },
"澳大利亚-悉尼": {
"阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -757,13 +953,30 @@ ...@@ -757,13 +953,30 @@
"Ozon-1", "Ozon-1",
"FactoryMarket-1", "FactoryMarket-1",
"PayPal-1", "PayPal-1",
"其他平台-1" "其他平台-0"
] ]
}, },
"马来西亚-吉隆坡": { "马来西亚-吉隆坡": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
],
"住宅": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -782,7 +995,24 @@ ...@@ -782,7 +995,24 @@
"菲律宾-马尼拉": { "菲律宾-马尼拉": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
],
"住宅": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -801,7 +1031,24 @@ ...@@ -801,7 +1031,24 @@
"泰国-曼谷": { "泰国-曼谷": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
],
"住宅": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -820,7 +1067,41 @@ ...@@ -820,7 +1067,41 @@
"韩国-首尔": { "韩国-首尔": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
],
"腾讯云": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
],
"住宅": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -839,7 +1120,41 @@ ...@@ -839,7 +1120,41 @@
"印度尼西亚-雅加达": { "印度尼西亚-雅加达": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
],
"腾讯云": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
],
"住宅": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -855,10 +1170,29 @@ ...@@ -855,10 +1170,29 @@
"其他平台-0" "其他平台-0"
] ]
}, },
"孟买": { "越南-胡志明": {
"阿里云": [ "住宅": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1",
"全球速卖通-1",
"Wish-1",
"Shopee-1",
"Lazada-0",
"CDiscount-1",
"Joom-1",
"Vova-1",
"乐天-0",
"Ozon-1",
"FactoryMarket-1",
"PayPal-1",
"其他平台-0"
]
},
"印度-孟买": {
"腾讯云": [
"亚马逊-1",
"亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -875,9 +1209,9 @@ ...@@ -875,9 +1209,9 @@
] ]
}, },
"加拿大": { "加拿大": {
"亚马逊云": [ "住宅": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -893,10 +1227,10 @@ ...@@ -893,10 +1227,10 @@
"其他平台-0" "其他平台-0"
] ]
}, },
"巴西": { "巴西-圣保罗": {
"亚马逊云": [ "腾讯云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -915,7 +1249,7 @@ ...@@ -915,7 +1249,7 @@
"迪拜": { "迪拜": {
"阿里云": [ "阿里云": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
...@@ -934,7 +1268,7 @@ ...@@ -934,7 +1268,7 @@
"本地": { "本地": {
"本地": [ "本地": [
"亚马逊-1", "亚马逊-1",
"亚马逊日本-0", "亚马逊日本-1",
"ebay-1", "ebay-1",
"全球速卖通-1", "全球速卖通-1",
"Wish-1", "Wish-1",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment