各大銀行的應(yīng)用寶商店下載地址收集


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;

/**
 * 各大銀行的應(yīng)用寶下載地址
 * @author wishurhere
 * @date 2020/5/19
 */
public class BankUrlHandle {

    /**
     * 中文正則
     */
    static Pattern chinese_pattern = Pattern.compile("[\u3007\u4E00-\u9FCB\uE815-\uE864]");
    /**
     * 根據(jù)關(guān)鍵字查詢應(yīng)用寶app
     */
    static String APP_SEARCH_URL = "https://sj.qq.com/myapp/searchAjax.htm?kw=%s&sid=";
    /**
     * app在應(yīng)用寶下載鏈接
     */
    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("中國工商銀行",
            "中國農(nóng)業(yè)銀行", "中國銀行", "中國建設(shè)銀行", "中國光大銀行", "江蘇省農(nóng)村信用社聯(lián)合");
        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();

        // 根據(jù)關(guān)鍵詞模糊查詢應(yīng)用寶應(yīng)用
        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("銀行", "信用社", "農(nóng)信");
        // 將中文分割
        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 {
                    // 應(yīng)用名中相同漢字出現(xiàn)次數(shù)
                    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;
                        }
                    }

                    // 應(yīng)用開發(fā)者中相同漢字出現(xiàn)次數(shù)
                    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));
                    // 匹配漢字需要超過一半關(guān)鍵詞才認定是有效的
                    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();
                // 包商村鎮(zhèn)銀行特殊處理
                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;

                /**
                 * 應(yīng)用匹配度
                 */
                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;
                }
            }
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容