import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 各大银行的应用宝下载地址
* @author wishurhere
* @date 2020/5/19
*/
public class BankUrlHandle {
/**
* 中文正则
*/
static Pattern chinese_pattern = Pattern.compile("[\u3007\u4E00-\u9FCB\uE815-\uE864]");
/**
* 根据关键字查询应用宝app
*/
static String APP_SEARCH_URL = "https://sj.qq.com/myapp/searchAjax.htm?kw=%s&sid=";
/**
* app在应用宝下载链接
*/
static String APP_DOWNLOAD_URL = "https://sj.qq.com/myapp/detail.htm?apkName=%s";
public static void main(String[] args) {
ArrayList<String> banks = Lists.newArrayList("中国工商银行",
"中国农业银行", "中国银行", "中国建设银行", "中国光大银行", "江苏省农村信用社联合");
for (String bank : banks) {
doQuery(bank);
}
}
private static void doQuery(String bankName) {
if (StringUtils.isEmpty(bankName)) {
return;
}
System.out.println("========================= " + bankName + "=========================");
RestTemplate restTemplate = new RestTemplate();
// 根据关键词模糊查询应用宝应用
String url = String.format(APP_SEARCH_URL, bankName);
String result = restTemplate.getForObject(url, String.class);
AppStore object = JSONObject.parseObject(result, AppStore.class);
if (object == null || object.getObj() == null
|| CollectionUtils.isEmpty(object.getObj().getItems())) {
return;
}
List<String> exceptChinese = Lists.newArrayList("银", "行");
List<String> exceptWords = Lists.newArrayList("贷款", "直销");
List<String> keywords = Lists.newArrayList("银行", "信用社", "农信");
// 将中文分割
List<String> stringList = splitChinese(bankName);
object.getObj().getItems()
.stream()
.filter(o -> (keywords.stream().anyMatch(s -> o.getAppDetail().getAppName().contains(s))
|| o.getAppDetail().getDescription().contains("信用社"))
// 官方版标签
// && o.getAppDetail().getFlag().equals("16469"))
// && (o.getAppDetail().getDescription().contains("手机银行")
// || o.getAppDetail().getDescription().contains(bankName))
&& exceptWords.stream().noneMatch(s -> o.getAppDetail().getAppName().contains(s)))
.peek(o -> {
if (o.getAppDetail().getAppName().equals(bankName)) {
o.setCount(bankName.length());
} else {
// 应用名中相同汉字出现次数
int appNameCount = 0;
Matcher matcher = chinese_pattern.matcher(o.getAppDetail().getAppName());
while (matcher.find() && stringList.contains(matcher.group())) {
if (!exceptChinese.contains(matcher.group())) {
appNameCount = appNameCount + 1;
}
}
// 应用开发者中相同汉字出现次数
int authorNameCount = 0;
Matcher matcher1 = chinese_pattern.matcher(o.getAppDetail().getAuthorName());
while (matcher1.find() && stringList.contains(matcher1.group())) {
if (!exceptChinese.contains(matcher1.group())) {
authorNameCount = authorNameCount + 1;
}
}
int match = Math.max(authorNameCount, appNameCount);
System.out.println(String.format("查询银行:%s, 搜索app:%s, 匹配度:%s",
bankName, o.getAppDetail().getAppName(), match));
// 匹配汉字需要超过一半关键词才认定是有效的
if (match >= bankName.length() / 2) {
o.setCount(match);
}
}
}).filter(o -> o.getCount() != null)
// 选出匹配度最高的
.max(Comparator.comparing(AppStore.ObjBean.ItemsBean::getCount))
.ifPresent(o -> {
String pkgName = o.getPkgName();
// 包商村镇银行特殊处理
if (bankName.contains("包商村") && pkgName.equals("cn.com.bsb.mbank")) {
pkgName = "com.yitong.mbank.bsczb";
} else if (bankName.equals("齐鲁银行")) {
pkgName = "com.iss.qilubank";
}
String pkgUrl = String.format(APP_DOWNLOAD_URL, pkgName);
System.out.println(bankName + ",下载地址:" + pkgUrl);
});
}
/**
* 分割中文
* @param str
* @return
*/
public static List<String> splitChinese(String str) {
List<String> sb = new ArrayList<>();
// 只匹配一个中文字符
Matcher matcher = chinese_pattern.matcher(str);
while (matcher.find()) {
sb.add(matcher.group());
}
return sb;
}
@Data
public static class AppStore {
/**
* total : null
* count : null
* obj : {"items":[{"type":2,"pkgName":"com.icbc","appDetail":{"appName":"中国工商银行","authorName":"中国工商银行股份有限公司","pkgName":"com.icbc"}}]}
*/
private Object total;
private Object count;
private ObjBean obj;
@Data
public static class ObjBean {
private List<ItemsBean> items;
@Data
public static class ItemsBean {
private int type;
private String pkgName;
/**
* 应用匹配度
*/
private Integer count;
private AppDetailBean appDetail;
@NoArgsConstructor
@Data
public static class AppDetailBean {
private String appName;
private String authorName;
private String pkgName;
private String flag;
private String categoryName;
private String description;
}
}
}
}
}
网友评论