各大银行的应用宝商店下载地址收集

2020-05-30  本文已影响0人  firefly_

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;
                }
            }
        }
    }
}

上一篇 下一篇

猜你喜欢

热点阅读