获取指标说明的能力
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
package quant.rich.emoney.entity.config;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.io.Serializable;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
@@ -10,12 +10,8 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
|
||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
@@ -67,11 +63,9 @@ public class EmoneyRequestConfig implements IConfig<EmoneyRequestConfig> {
|
||||
private String authorization;
|
||||
|
||||
/**
|
||||
* 当前 authorization 更新时间
|
||||
* UID
|
||||
*/
|
||||
@JsonSerialize(using = LocalDateTimeSerializer.class)
|
||||
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
|
||||
private LocalDateTime authorizationUpdateTime;
|
||||
private Integer uid;
|
||||
|
||||
/**
|
||||
* <b>用于:</b><ul>
|
||||
@@ -186,6 +180,12 @@ public class EmoneyRequestConfig implements IConfig<EmoneyRequestConfig> {
|
||||
* <b>来源:</b>本例管理
|
||||
*/
|
||||
private String emappViewMode = "1";
|
||||
|
||||
/**
|
||||
* OkHttp 用于注入 User-Agent 规则的 id
|
||||
*/
|
||||
@JsonIgnore
|
||||
private Serializable userAgentPatchRuleId;
|
||||
|
||||
@Getter(AccessLevel.PRIVATE)
|
||||
@Autowired
|
||||
@@ -215,7 +215,7 @@ public class EmoneyRequestConfig implements IConfig<EmoneyRequestConfig> {
|
||||
initFromRandomDeviceInfo();
|
||||
}
|
||||
else {
|
||||
// 都不是 null,则由 fingerprint 来检查各项
|
||||
// 都不是 null,则由 fingerprint 来检查各项。
|
||||
// model 和 softwareType 本应交由 deviceInfoConfig 检查以
|
||||
// 应对可能的通过修改本地 json 来进行攻击的方式,可是本身
|
||||
// deviceInfoConfig 对 model 和 softwareType 的信息也来源
|
||||
@@ -248,12 +248,22 @@ public class EmoneyRequestConfig implements IConfig<EmoneyRequestConfig> {
|
||||
}
|
||||
|
||||
// 注入 OkHttp
|
||||
PatchOkHttp.apply(
|
||||
patchOkHttp();
|
||||
}
|
||||
|
||||
/**
|
||||
* 注入 User-Agent patch 规则
|
||||
*/
|
||||
private EmoneyRequestConfig patchOkHttp() {
|
||||
userAgentPatchRuleId = PatchOkHttp.apply(
|
||||
PatchOkHttpRule.when()
|
||||
.hostEndsWith("emoney.cn")
|
||||
.not(r -> r.hostMatches("appstatic"))
|
||||
.or(a -> a.hostContains("emapp"))
|
||||
.or(b -> b.hasHeaderName("X-Protocol-Id"))
|
||||
.overrideIf("User-Agent", getOkHttpUserAgent()).build());
|
||||
.overrideIf("User-Agent", getOkHttpUserAgent()).build()
|
||||
.setId(userAgentPatchRuleId));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -451,6 +461,45 @@ public class EmoneyRequestConfig implements IConfig<EmoneyRequestConfig> {
|
||||
return node;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据本例信息获取 Relogin ObjectNode
|
||||
* @return 如果 authorization 和 uid 任意 null 则本例返回 null
|
||||
*/
|
||||
@JsonIgnore
|
||||
public ObjectNode getReloginObject() {
|
||||
|
||||
if (ObjectUtils.anyNull(getAuthorization(), getUid())) {
|
||||
return null;
|
||||
}
|
||||
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
ObjectNode node = mapper.createObjectNode();
|
||||
ObjectNode exIdentify = mapper.createObjectNode();
|
||||
exIdentify.put("IMEI", "");
|
||||
exIdentify.put("AndroidID", getAndroidId());
|
||||
exIdentify.put("MAC", "");
|
||||
exIdentify.put("OSFingerPrint", getFingerprint());
|
||||
String exIdentifyString = exIdentify.toString().replace("/", "\\/");
|
||||
|
||||
// 这玩意最好按照顺序来,当前这个顺序是 5.8.1 的顺序
|
||||
String guid = getGuid();
|
||||
node.put("appVersion", getEmoneyVersion());
|
||||
node.put("productId", 4);
|
||||
node.put("softwareType", getSoftwareType());
|
||||
node.put("deviceName", getDeviceName());
|
||||
node.put("ssid", "0");
|
||||
node.put("platform", "android");
|
||||
node.put("token", getAuthorization()); // 和登录不同的地方: token
|
||||
node.put("exIdentify", exIdentifyString);
|
||||
node.put("uid", getUid()); // 和登录不同的地方: uid
|
||||
node.put("osVersion", getAndroidSdkLevel());
|
||||
node.put("guid", guid);
|
||||
node.put("channelId", "1711");
|
||||
node.put("hardware", getHardware());
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置密码:<ul>
|
||||
* <li>null or empty,保存空字符串</li>
|
||||
@@ -483,31 +532,8 @@ public class EmoneyRequestConfig implements IConfig<EmoneyRequestConfig> {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 触发更新 Authorization 的更新时间为现在
|
||||
* @return
|
||||
*/
|
||||
public EmoneyRequestConfig updateAuthorizationTime() {
|
||||
this.authorizationUpdateTime = LocalDateTime.now();
|
||||
public EmoneyRequestConfig afterSaving() {
|
||||
patchOkHttp();
|
||||
return this;
|
||||
}
|
||||
|
||||
public EmoneyRequestConfig mergeTo(EmoneyRequestConfig other) {
|
||||
boolean authorizationUpdated = !Objects.equals(other.authorization, this.authorization);
|
||||
IConfig.super.mergeTo(other);
|
||||
if (authorizationUpdated) {
|
||||
other.updateAuthorizationTime();
|
||||
}
|
||||
return other;
|
||||
}
|
||||
|
||||
public EmoneyRequestConfig mergeFrom(EmoneyRequestConfig other) {
|
||||
boolean authorizationUpdated = !Objects.equals(other.authorization, this.authorization);
|
||||
IConfig.super.mergeFrom(other);
|
||||
if (authorizationUpdated) {
|
||||
this.updateAuthorizationTime();
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import quant.rich.emoney.client.OkHttpClientProvider;
|
||||
import quant.rich.emoney.component.LockByCaller;
|
||||
import quant.rich.emoney.interfaces.ConfigInfo;
|
||||
import quant.rich.emoney.interfaces.IConfig;
|
||||
|
||||
@@ -33,8 +34,6 @@ import quant.rich.emoney.interfaces.IConfig;
|
||||
@ConfigInfo(field = "indexInfo", name =" 指标信息配置", initDefault = true, managed = false)
|
||||
public class IndexInfoConfig implements IConfig<IndexInfoConfig> {
|
||||
|
||||
private static final String CONFIG_IND_ONLINE_PATH = "./conf/extra/config_ind_online.json";
|
||||
|
||||
@JsonView(IConfig.Views.Persistence.class)
|
||||
private String configIndOnlineUrl;
|
||||
|
||||
@@ -46,23 +45,18 @@ public class IndexInfoConfig implements IConfig<IndexInfoConfig> {
|
||||
@Getter(AccessLevel.PRIVATE)
|
||||
private EmoneyRequestConfig emoneyRequestConfig;
|
||||
|
||||
public IndexInfoConfig() {
|
||||
try {
|
||||
String configStr = FileUtil.readString(CONFIG_IND_ONLINE_PATH);
|
||||
configIndOnline = new ObjectMapper().readTree(configStr);
|
||||
}
|
||||
catch (Exception e) {}
|
||||
configIndOnlineUrl = "https://emapp-static.oss-cn-shanghai.aliyuncs.com/down13/emstock/config/ind_config/v1000003/config_ind_online.json";
|
||||
}
|
||||
public IndexInfoConfig() {}
|
||||
|
||||
public String getConfigIndOnlineStr() {
|
||||
return getConfigIndOnline().toPrettyString();
|
||||
}
|
||||
|
||||
public String getOnlineConfigByUrl(String url) throws IOException {
|
||||
@LockByCaller
|
||||
@JsonIgnore
|
||||
public String getOnlineConfigByUrl() throws IOException {
|
||||
synchronized (this) {
|
||||
Request request = new Request.Builder()
|
||||
.url(url)
|
||||
.url(configIndOnlineUrl)
|
||||
.header("Cache-Control", "no-cache")
|
||||
.get()
|
||||
.build();
|
||||
|
||||
@@ -2,6 +2,9 @@ package quant.rich.emoney.entity.config;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Proxy;
|
||||
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonView;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
@@ -77,18 +80,22 @@ public class ProxyConfig implements IConfig<ProxyConfig> {
|
||||
return Proxy.NO_PROXY;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
String proxyIp = "127.0.0.1";
|
||||
int proxyPort = 7897;
|
||||
|
||||
ProxyConfig proxyConfig = new ProxyConfig();
|
||||
proxyConfig.setProxyHost(proxyIp).setProxyPort(proxyPort)
|
||||
.setProxyType(Proxy.Type.SOCKS)
|
||||
.setIgnoreHttpsVerification(false);
|
||||
|
||||
IpInfo result = GeoIPUtil.getIpInfoThroughProxy(proxyConfig);
|
||||
System.out.println("Proxy is usable with through-proxy ip: " + result);
|
||||
public String getProxyUrl() {
|
||||
if (ObjectUtils.anyNull(getProxyType(), getProxyHost(), getProxyPort())) {
|
||||
return null;
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (getProxyType() == Proxy.Type.SOCKS) {
|
||||
sb.append("socks5://");
|
||||
}
|
||||
else if (getProxyType() == Proxy.Type.HTTP) {
|
||||
sb.append("http://");
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
sb.append(getProxyHost()).append(':').append(getProxyPort());
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user