大众点评APP10.29.3接口分析获得商家列表数据


0x01、 目标需求:

  .a) 分析大众点评APP的接口参数以及相关的签名获取的方式

  .b) 需要获取全品类分类接口,美食接口数据,筛选数据接口(只获取带有优惠的商家数据)

0x02、分析背景:

  .a) 大众点评APP版本10.29.3(目前最新版)

  .b) 软件无壳

  .c) 软件通讯过程中采取了信息加密的方式,相同接口参数一致每次返回的加密数据不一致(加解密的算法使用了AES算法,提交的数据并无加密,只有压缩,返回的数据需要先解密,在解压,在反序列化)

  .d) 请求数据使用了压缩后发送数据(并无加密)



0x03、分析流程:

  .a) 通过数据包抓取或敏感函数hook方式获得接口功能

  .b) 通过函数内部参数的组装继续分析参数的来源以及加密的流程

0x04、分析结果结论:

  .a) Header部分截图如下:

    0x001. 该截图内的头部信息为商家列表数据,由于APP的版本不同使用的api接口版本不同,api接口版本在header头部的pragma-os 内描述了要请求服务器的接口版本,其他参数可不提交,正常响应数据,pragma-os必须提交且版本号要对。

APP请求协议



    0x002. 函数调用流程调用如下,分析完毕,继续分析代码

DDMS抓取列表刷新事件



    0x003. 可以看到服务器返回的数据使用AES解密,完成第一次解密,如下图:

解密函数代码



    0x004. 代码Copy出来之后使用Java进行请求解密后的数据如下(部分中文是可见的,还有乱码是因为数据使用了自定义的序列化),如下图:

解密代码复制到java里面执行



    0x005. 继续分析,二次解密算法,请求完成会继续调用其他函数(返回了DPObject对象该对象是自定义的序列化对象),并且判断了byte[]数组的第一位是什么值,再判断走哪个函数,如下图:(付费内容部分,包含代码等)

<!-- TePass start -->

调用解密位置

返回了DPObject对象



    0x006. 使用Xposed hook验证数据如下(只要第一位等于83那就不需要二次解密,79需要二次解密也就是反序列化),Hook代码以及结果如下,如下图:

hook获得返回数据结果

Xposed获得的结果



    0x007. 再次使用Xposed Hook测试,返回了一个需要二次解密的DPObject的对象,需要继续分析返回了这个对象之后,的其他操作,如下图:

Xposed再次验证



    0x008. 商家店铺列表最终的反序列化,也就是二次解密只有这一行代码,如下图:

获得反序列化的对象



    0x009. 动态调试Smali代码查看这个返回值的对象内容(每页25条数据),如下图:

动态调试结果每页25条数据



    0x010. 商家店铺详细数据如下图:

每个商家的详细数据



    0x011. 已提取自定义反序列化代码,且还原数据完毕(在APP端开放了HTTP服务,当然也可以使用Java开放web服务),需请求点评服务器返回的数据进行解密后使用BASE64编码提交过来,直接返回原JSON数据:

测试返回数据成功







    0x012. 搜索请求地址,方法内有数据类型标志,将DPObject.a方法传入这个类下的 public static final c 类型字段,即可返回这个类对象的实体类(截图如下):

封装请求地址的类


反序列化的类型


得到返回的数据



//部分核心代码如下:


package com.hook.http;


import com.dianping.archive.DPObject;
import com.dianping.model.MeishiPoiListResult;
import com.google.gson.Gson;
import com.hook.tools.Base64;
import com.hook.tools.HttpTools;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.GZIPInputStream;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import fi.iki.elonen.NanoHTTPD;

public class HttpServer extends NanoHTTPD {

    public HttpServer(int port){
        super(port);
    }

    public HttpServer(String hostname, int port) {
        super(hostname, port);
    }
    public static String android="Android";
    public static String iphone="iPhone";
    public static String ipad="iPad";

    public static final String model = "AES/CBC/NoPadding";
    /* access modifiers changed from: private */

    /* renamed from: b  reason: collision with root package name */
    public static final byte[] key;
    /* access modifiers changed from: private */

    /* renamed from: c  reason: collision with root package name */
    public static final byte[] iv;

    static {
        byte[] bArr = {92, 115, 116, 117, 112, 113, 6, 112, 112, 3, 3, 4, 6, 118, 0, 112};
        byte b2 = 24;
        for (int i = 0; i < bArr.length; i++) {
            b2 = (byte) (b2 ^ (bArr[i] & 255));
            bArr[i] = b2;
        }
        key = bArr;
        byte[] bArr2 = {0, 118, 122, 10, 3, 116, 124, 10, 5, 117, 6, 5, 3, 4, 2, 37};
        byte b3 = 97;
        for (int length = bArr2.length - 1; length >= 0; length--) {
            b3 = (byte) (b3 ^ (bArr2[length] & 255));
            bArr2[length] = b3;
        }
        iv = bArr2;
    }
    //开放http服务请求到这里

    @Override
    public Response serve(IHTTPSession session){
        Method method = session.getMethod();
        Map<String, String> header = session.getHeaders();

        Map<String, String> parameters = session.getParms();
        InputStream in= HttpServer.class.getResourceAsStream(session.getUri());
        String uri = session.getUri().substring(1);
        StringBuffer sb = new StringBuffer();
        if(Method.GET.equals(method)){
            //get方式
            String queryParams = session.getQueryParameterString();
            sb.append("weifang params:"+queryParams);
            sb.append("<center><H1>WelCome to My Mini WebServer.</H1></center>");
        }else if(Method.POST.equals(method)){
            //post方式
            Map<String, String> files = new HashMap<String, String>();
            try {
                session.parseBody(files);
                String param = new String(files.get("postData").getBytes(),"UTF-8");
                byte[] dataBytes = Base64.decode(param);//getData();

                if (dataBytes[0] == 79){
                    //获取DPObject对象,进行下一步处理
                    DPObject dpObject = new DPObject(dataBytes, 0, dataBytes.length);
                    MeishiPoiListResult meishiPoiListResult = null;
                    try {
                        meishiPoiListResult = dpObject.a(MeishiPoiListResult.q);
                    } catch (com.dianping.archive.a e) {
                        e.printStackTrace();
                    }
                    String utf8Code = new Gson().toJson(meishiPoiListResult == null ? new MeishiPoiListResult() : meishiPoiListResult);
                    sb.append(utf8Code);
                    return newFixedLengthResponse(Response.Status.OK, "Application/json; charset=UTF-8", sb.toString());
                }else{
                    sb.append("数据不符合规范.");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return newFixedLengthResponse(Response.Status.OK, "text/html; charset=UTF-8", sb.toString());
    }


    //    大众点评解密算法
    public static byte[] decode(byte[] bArr) throws Exception {
        byte[] bArr2 = null;

        if (bArr.length % 16 != 0) {
            System.out.println("长度不正确");
            return null;
        }
        Cipher instance = Cipher.getInstance(model);
        instance.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, model.substring(0, 3)), new IvParameterSpec(iv));
        GZIPInputStream gZIPInputStream = new GZIPInputStream(new ByteArrayInputStream(instance.doFinal(bArr)));
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(16384);
        byte[] bArr3 = new byte[4096];
        while (true) {
            int read = gZIPInputStream.read(bArr3);
            if (read > 0) {
                byteArrayOutputStream.write(bArr3, 0, read);
            } else {
                gZIPInputStream.close();
                byteArrayOutputStream.close();
                return byteArrayOutputStream.toByteArray();
            }
        }
    }

    //转换到DPObject对象
    public static byte[] getData() throws Exception {
        String url ="https://mapi.dianping.com/meishi/selectlist/meishifilterlist.bin?" +
                "lastshopids=18603061%2C57045325%2C77447908%2C67733838%2C1622712331%2C2090563%2C128415478%2C65889668%2C24093694%2C130774290" +
                "&parentcategoryid=-1" +
                "&categoryid=10" +
                "&sortid=0" +
                "&mylat=39.8393" +
                "&mylng=116.357" +
                "&maptype=0" +
                "&myacc=1.0" +
                "&locatecityid=2" +
                "&cityid=2" +
                "&nettype=wifi" +
                "&phoneresolution=1600_900" +
                "&connectwifi=00%3A81%3A07%3A2c%3Adb%3A42_55" +
                "&scanwifi=00%3A81%3A07%3A2c%3Adb%3A42_57" +
                "&phonecarrier=mobile" +
                "&selectlocal=false" +
                "&start=50" +
                "&smarttagslength=22" +
                "&userid=0" +
                "&phonemodel=blackshark_dlt-a0" +
                "&lastshopuuids=G2bvVEL0On52dfYB%2Ck69UMq5Lp34nmeeU%2CG8L1FEyEwKpm65Zm%2CiuyQyxmkPLOyFbd9%2CF5U9mMXp1y34E5Mw%2Cl5ZuEVJoXMjVopPf%2CH1EgPNGXmRbqztT6%2CEaugc1MzI4YtBunT%2Ck1B0pLQwCbTE85c9%2Ck1hr0kTaWRjb44P6&lat=39.83930&lng=116.35700&pageType=list&optimus_uuid=9c9644da-9a01-4d93-a10c-91c00229b7ed&optimus_risk_level=71&optimus_code=10";
        //构造header
        Map<String,String> map = new HashMap<>();
        map.put("pragma-os","MApi 1.3 (com.dianping.v1 10.29.3 om_sd_yybcpd DLT-A0; Android 5.1.1)");
        map.put("User-Agent","MApi 1.3 (com.dianping.v1 10.29.3 om_sd_yybcpd DLT-A0; Android 5.1.1)");
//        map.put("Content-Type","UTF-8");
        map.put("pragma-device","865166024315783");
//        map.put("M-SHARK-TRACEID","11755679663184793947d93c1c1591921096857903de3");
//        map.put("pragma-dpid","755679663184793947");
//        map.put("pragma-deviceid","865166024315783");
//        map.put("Accept-Encoding","identity");
//        map.put("Connection","Keep-Alive");


        byte[] bArr = HttpTools.Getcode(url,"UTF-8",map);
        bArr = decode(bArr);
        return bArr;

    }
}


#接口地址说明,只需要传入shopuuid即可shopid填0使用GET请求即可返回数据,解密后反序列化即可.

#请求接口头部必须携带 pragma-os:MApi 1.3 (com.dianping.v1 9.19 om_sd_360sz DLT-A0; Android 5.1.1)

#优惠券详细信息
https://apimobile.meituan.com/dpapi/v2/deal/info/614998945?dpPoiId=0&shopuuid=k9oYRvTyiMk4HEdQ

#获取商家头部视频图片信息
https://mapi.dianping.com/shopping/getMallHeadMediaInfo.bin?shopid=4500489&mallid=4500489&shopuuid=G5wcnV4FRCryz6vb

#获取商家地址
https://mapi.dianping.com/shopping/getMallAddressInfo.bin?shopid=4500489&mallid=4500489&shopuuid=G5wcnV4FRCryz6vb

#获取团购信息 
https://mapi.dianping.com/mapi/wedding/tuangoulist.bin?shopid=1436215670&shopuuid=G7J7smc7S0s6EmFr&page=1&pagename=shop

更多团购
https://mapi.dianping.com/general/platform/dztg/poipaginationshelfproduct.bin?shelfcomponentid=71&shelfnavtagid=200121419&cityid=2&poiid=2888635&shopuuid=laMiiYC0O7ZvtDDr


#商家抵用券接口
https://mapi.dianping.com/api/vc/shop/client/marketnav/load.bin?shopid=22657285&platform=100&shopuuid=H9AsID4m4km8Tt2Y


#获取安全信息(疫情影响) 如:佩戴口罩,每日消毒
https://mapi.dianping.com/shopping/getmallsafeshoppingmodule.bin?shopuuid=G5wcnV4FRCryz6vb

#店铺头部图片视频接口
https://mapi.dianping.com/mapi/mva/headpic.mp?shopid=2471596&shopuuid=H15C0CbuhJFvtJO2

#营业时间信息
https://mapi.dianping.com/mapi/wedding/babyshopbriefinfo.bin?shopid=2471596&shopuuid=H15C0CbuhJFvtJO2

#营业时间信息 信息全
https://mapi.dianping.com/gateway/nibmp/mva/poiext/shopbaseinfo?shopId=15917106&shopuuid=H4HkiewubvOiN1DN&clientType=1


#获取团购套餐顶部的团购标题数据,随时退 过期退
https://mapi.dianping.com/general/platform/dztg/poipaginationshelfnav.bin?cityid=2&shopuuid=H15C0CbuhJFvtJO2

#店铺问答
https://m.dianping.com/mapi/qa/shophotquestion.bin?shopid=67006194&shopuuid=l6yJr0kTWkKa1NHG

#选择城市页面 推荐信息
https://mapi.dianping.com/mapi/common/cityswitch.bin?cityid=2&choosecityid=1&overseas=1

#首页全程热搜数据接口
https://mapi.dianping.com/mapi/searchindexprompt.bin?cityid=1&source=home&mylat=39.99542&mylng=116.47503&locatecityid=2&noprofile=0

#商家页面底部推荐商家数据接口
https://mapi.dianping.com/mapi/friendlikefeeds.bin?mapi_cacheType=0&shopcityid=2&shopid=67006194&shopuuid=l6yJr0kTWkKa1NHG&cityid=2&userlng=116.4811369436372&userlat=39.99672138303247

#代金券接口
https://mapi.dianping.com/general/platform/dztg/dztgshopvouchers.bin?cityid=2&shopid=993896993&platform=1&shopuuid=Ej80Hh0wFMqESCK1


一、2020年6月29日,服务器已经针对相同的UA参数和pragma-os参数做了请求频率限制,每次请求要更换参数值的部分字符串 如标识机型的('MApi 1.3 (com.dianping.v1 10.29.4 om_sd_yybcpd '+random+'; Android 5.1.1)'),如果请求返回403 继续请求.知道返回200状态码位置

二、如果不能反序列化再提供一个转换到json类:com.dianping.base.util.model.a类下的a方法传入Dpobject 返回json的String字符串,代码如下(如果还出现key乱码的自己hook下DPObject 下的a方法得到参数值和返回值,加入最下面的map即可):
package com.dianping.base.util.model;

import com.dianping.archive.DPObject;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class a {
    public static String a(DPObject dPObject) throws JSONException {
        String str = null;
        if (dPObject == null) {
            return null;
        }
        ByteBuffer wrap = ByteBuffer.wrap(dPObject.d());
        long currentTimeMillis = System.currentTimeMillis();
        if (wrap.remaining() > 3) {
            byte b = wrap.get();
            String a2 = a(wrap.getShort());
            a2 = getKey(a2);
            JSONObject jSONObject = new JSONObject();
            if (b == 83) {
                try {
                    a(wrap, a2, jSONObject);
                    str = jSONObject.toString();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else if (b == 79) {
                c(wrap, a2, jSONObject);
                str = jSONObject.get(a2).toString();
            } else if (b == 65) {
                d(wrap, a2, jSONObject);
                str = jSONObject.get(a2).toString();
            }
        }
        long currentTimeMillis2 = System.currentTimeMillis();
        System.out.println("ModelHelper  End@" + currentTimeMillis2);
        System.out.println("ModelHelper  All Takes " + (currentTimeMillis2 - currentTimeMillis) + " ms");
        return str;
    }

    private static int a(ByteBuffer byteBuffer, String str, Object obj) throws JSONException {
        int i;
        if (byteBuffer.remaining() < 2 || byteBuffer.remaining() < (i = byteBuffer.getShort() & -1)) {
            return -1;
        }
        byte[] bArr = new byte[i];
        byteBuffer.get(bArr);
        try {
            String str2 = new String(bArr, "UTF-8");
            if (obj instanceof JSONObject) {
                ((JSONObject) obj).put(getKey(str), str2);
            } else if (obj instanceof JSONArray) {
                ((JSONArray) obj).put(str2);
            }
            return 0;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return -2;
        }
    }

    private static int b(ByteBuffer byteBuffer, String str, Object obj) throws JSONException {
        int i;

        if (byteBuffer.remaining() < 2 || byteBuffer.remaining() < (i = byteBuffer.getInt())) {
            return -1;
        }
        byte[] bArr = new byte[i];
        byteBuffer.get(bArr);
        try {
            String str2 = new String(bArr, "UTF-8");
            if (obj instanceof JSONObject) {
                ((JSONObject) obj).put(str, str2);
            } else if (obj instanceof JSONArray) {
                ((JSONArray) obj).put(str2);
            }
            return 0;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return -2;
        }
    }

    private static int c(ByteBuffer byteBuffer, String str, Object obj) throws JSONException {

        if (byteBuffer.remaining() < 2) {
            return -1;
        }
        JSONObject jSONObject = new JSONObject();
//        jSONObject.put("__name", str);
        if (obj instanceof JSONObject) {
            ((JSONObject) obj).put(str, jSONObject);
        } else if (obj instanceof JSONArray) {
            ((JSONArray) obj).put(jSONObject);
        }
        while (byteBuffer.remaining() > 0) {
            byte b = byteBuffer.get();
            if (b == 77) {
                if (byteBuffer.remaining() < 2) {
                    return -1;
                }
                int e = e(byteBuffer, a(byteBuffer.getShort()), jSONObject);
                if (e != 0) {
                    return e;
                }
            } else if (b == 90) {
                return 0;
            } else {
                return -2;
            }
        }
        return -1;
    }

    private static int d(ByteBuffer byteBuffer, String str, Object obj) throws JSONException {

        if (byteBuffer.remaining() < 2) {
            return -1;
        }
        JSONArray jSONArray = new JSONArray();
        if (obj instanceof JSONObject) {
            ((JSONObject) obj).put(str, jSONArray);
        } else if (obj instanceof JSONArray) {
            ((JSONArray) obj).put(jSONArray);
        }
        short s = (short) (byteBuffer.getShort() & -1);
        for (int i = 0; i < s; i++) {
            int e = e(byteBuffer, str, jSONArray);
            if (e != 0) {
                return e;
            }
        }
        return 0;
    }

    private static int e(ByteBuffer byteBuffer, String str, Object obj) throws JSONException {

        if (byteBuffer.remaining() == 0) {
            return -1;
        }
        switch (byteBuffer.get()) {
            case 65:
                return d(byteBuffer, str, obj);
            case 66:
                return b(byteBuffer, str, obj);
            case 68:
                if (byteBuffer.remaining() < 8) {
                    return -1;
                }
                double d = byteBuffer.getDouble();
                if (obj instanceof JSONObject) {
                    ((JSONObject) obj).put(str, d);
                } else if (obj instanceof JSONArray) {
                    ((JSONArray) obj).put(d);
                }
                return 0;
            case 70:
                if (obj instanceof JSONObject) {
                    ((JSONObject) obj).put(str, false);
                } else if (obj instanceof JSONArray) {
                    ((JSONArray) obj).put(false);
                }
                return 0;
            case 73:
            case 85 /*85*/:
                if (byteBuffer.remaining() < 4) {
                    return -1;
                }
                int i = byteBuffer.getInt();
                if (obj instanceof JSONObject) {
                    ((JSONObject) obj).put(str, i);
                } else if (obj instanceof JSONArray) {
                    ((JSONArray) obj).put(i);
                }
                return 0;
            case 76:
                if (byteBuffer.remaining() < 8) {
                    return -1;
                }
                long j = byteBuffer.getLong();
                if (obj instanceof JSONObject) {
                    ((JSONObject) obj).put(str, j);
                } else if (obj instanceof JSONArray) {
                    ((JSONArray) obj).put(j);
                }
                return 0;
            case 78:
                return 0;
            case 79:
                return c(byteBuffer, a(byteBuffer.getShort()), obj);
            case 83:
                return a(byteBuffer, str, obj);
            case 84:
                if (obj instanceof JSONObject) {
                    ((JSONObject) obj).put(str, true);
                } else if (obj instanceof JSONArray) {
                    ((JSONArray) obj).put(true);
                }
                return 0;
            default:
                return -2;
        }
    }

    private static String a(short s) {
        return getKey("0x" + Integer.toHexString(s & 0xFFFF));
//        return getKey(s);
    }

    private static String getKey(String keyCode){
        Map<String ,String> map = new HashMap<String,String>();
        map.put("0x22e8","dpId");
        map.put("0x4911","mtId");
        map.put("0x5baa","shop");
        map.put("0x349b","shopId");
        map.put("0xd4b7","shopUuid");
        map.put("0xb5c9","shopName");
        map.put("0x23e9","branchName");
        map.put("0x6536","phoneNos");
        map.put("0x2063","address");
        map.put("0xa669","shopPower");
        map.put("0x7851","imUrl");
        map.put("0x46c8","shopListUrl");
        map.put("0x82e3","shopListDesc");
        map.put("0xe5f8","mapUrl");
        map.put("0x9784","shopNum");
        map.put("0x7dac","shopUrl");
        map.put("0xa19e","lat");
        map.put("0xa324","lng");
        map.put("0xc426","saleDesc");
        map.put("0xa91","features");
        map.put("0x31fd","dealContents");
        map.put("0xcce","content");
        map.put("0xf464","buyBar");
        map.put("0xc07a","buyType");
        map.put("0x83af","buyBtns");
        map.put("0x51dd","btnEnable");
        map.put("0x3050","btnTitle");
        map.put("0x6f4e","btnDesc");
        map.put("0x764e","btnTag");
        map.put("0x9df1","priceStr");
        map.put("0x8283","redirectUrl");
        map.put("0xd1d2","detailBuyType");
        map.put("0x270","btnIcons");
        map.put("0x4754","titleColor");
        map.put("0xad82","borderColor");
        map.put("0xe5d4","bgColor");
        map.put("0x1b3a","style");
        map.put("0x7a93","titleTagIcon");
        map.put("0x33fe","categoryId");
        map.put("0xf3ce","onlineConsultUrl");
        map.put("0xfc52","picAspectRatio");
        map.put("0x68a4","shareAble");
        map.put("0xdbf6","id");
        map.put("0x630b","sales");
        map.put("0x9917","salesInfo");
        map.put("0x6c6c","zipList");
        map.put("0x2a32","groupName");
        map.put("0x52fb","time");
        map.put("0x9b02","appVersion");
        map.put("0x7ab8","name");
        map.put("0xd33","jsFiles");
        map.put("0xcce","content");
        map.put("0x3f27","hashcode");
        map.put("0xefe3","jsUpdateVersion");
        map.put("0x66f9","isPreLoadCache");
        map.put("0xcc81","LocalPushList");
        map.put("0x2d04","Address");
        map.put("0x297e","Lat");
        map.put("0x2b04","Lng");
        map.put("0xdab","City");
        map.put("0x91b","ID");
        map.put("0xef84","data");
        map.put("0xbfb","fuck64kdatalist");
        map.put("0x4f31","Shop");
        map.put("0xa49","isPresent");
        map.put("0xc021","shopTagList");
        map.put("0xe654","videoUrl");
        map.put("0x46fd","customGaInfo");
        map.put("0x97b4","starReason");
        map.put("0x90cc","rmsIcon");
        map.put("0x7d41","moreSpuTitle");
        map.put("0xf946","DSRTitle");
        map.put("0xafcc","DSRIcon");
        map.put("0x3628","taxi");
        map.put("0xaa43","moreSpuUrl");
        map.put("0xd6bf","userBriefList");
        map.put("0x33c3","multiRecReason");
        map.put("0x4647","topTag");
        map.put("0xb0ba","similarEntranceTitle");
        map.put("0x416d","scoreTextList");
        map.put("0x270c","shopPowerRate");
        map.put("0x31b8","talentTagList");
        map.put("0x8fd2","hotelExtendResultModel");
        map.put("0xec51","carouselInfo");
        map.put("0xe218","cachedHeight");
        map.put("0xd50e","IsHealthShop");
        map.put("0x147b","HotelExtendInfo");
        map.put("0x4273","HotelExtendResult");
        map.put("0xa605","DSRText");
        map.put("0x46c9","ShopTag");
        map.put("0xfb09","BizStatusTime");
        map.put("0x2db7","PicBottomTag");
        map.put("0x735c","OverallViewUrl");
        map.put("0x861a","SupplyLeadText");
        map.put("0x3cba","shopUuid");
        map.put("0x3003","ComplexShopDealInfos");
        map.put("0x4312","PoiTagList");
        map.put("0x6d40","PicAlignLineNum");
        map.put("0xce9b","DefaultPicHeight");
        map.put("0x1d15","DefaultPicWidth");
        map.put("0x8364","HotelRecommendReason");
        map.put("0x5b30","ShopPowerUrl");
        map.put("0x4797","PicCountStr");
        map.put("0x2d97","VideoCountStr");
        map.put("0x53c8","PoiType");
        map.put("0xfef7","BookingMode");
        map.put("0xc609","ShopServeInfoUrl");
        map.put("0x7494","SearchShopExtraEntry");
        map.put("0xbed5","RecentBizTime");
        map.put("0x8c4e","CruxFeatures");
        map.put("0x647e","PoiId");
        map.put("0xf09b","FriendInfoList");
        map.put("0x160e","SearchDishList");
        map.put("0xad58","RankingListEntry");
        map.put("0x64f4","FavorId");
        map.put("0xc69e","Route");
        map.put("0xc8e","DishItems");
        map.put("0x6fef","LocalName");
        map.put("0xcd5f","GoodReviewCount");
        map.put("0xbf09","BizHours");
        map.put("0x30d5","Abtest");
        map.put("0x2276","ContentEntry");
        map.put("0x9c47","HotelPromoteDesc");
        map.put("0xe9d2","AuthorityTag");
        map.put("0x3776","SearchMovieTagList");
        map.put("0xfda9","ShopDisplayTag");
        map.put("0x479","lineNum");
        map.put("0x46d9","iconCornerRadius");
        map.put("0x2798","TitleInsets");
        map.put("0x8f4b","TagUrl");
        map.put("0x9ebd","BizId");
        map.put("0x862f","TextType");
        map.put("0xffc8","IconAlignType");
        map.put("0x4f79","AlignType");
        map.put("0x63a6","Priority");
        map.put("0x67f3","CornerRadius");
        map.put("0x2d18","IconTextSpacing");
        map.put("0x1cb5","FontSize");
        map.put("0xbfff","BackgroundColor");
        map.put("0x20b1","IconWidth");
        map.put("0xd2b5","IconHeight");
        map.put("0x761b","TextColor");
        map.put("0xa008","BorderColor");
        map.put("0xb0bb","Icon");
        map.put("0xb96a","Text");
        map.put("0x372","Type");
        map.put("0x17e9","SecondLineTagList");
        map.put("0x5a24","ThirdLineTagList");
        map.put("0x25d8","HotelTopLabel");
        map.put("0x3f00","HotelBottomLabel");
        map.put("0x953e","Downgrade");
        map.put("0xcd75","PicEntryList");
        map.put("0x6e3c","ServiceEntryList");
        map.put("0x3dcc","AuthorityIconUrl");
        map.put("0xdd6a","HeaderImageBorderColor");
        map.put("0xffce","CommentColor");
        map.put("0x6acb","MapDistance");
        map.put("0x2a3e","MapWalkDistance");
        map.put("0x69a3","SelectiveLabelUrl");
        map.put("0x9b3b","Point84");
        map.put("0xef15","CommentScore");
        map.put("0x3579","LowestCountText");
        map.put("0x3b86","LastBookingText");
        map.put("0x7697","HideFootbar");
        map.put("0x1de1","Comment");
        map.put("0x1139","ShopStatusDetail");
        map.put("0x2da7","QueryId");
        map.put("0x3668","PromoTags");
        map.put("0x6bf3","GiftTags");
        map.put("0xfd4a","HourRoomTimeText");
        map.put("0xadda","SearchIconItem");
        map.put("0x4d4e","Url");
        map.put("0x395d","Width");
        map.put("0xfdda","Height");
        map.put("0x60cf","IconUrlList");
        map.put("0xce16","UserInfoUrl");
        map.put("0x51ea","HotelLabels");
        map.put("0x210b","AuthorityLabelColor");
        map.put("0xa4db","Children");
        map.put("0x3c8a","Index");
        map.put("0x9c83","AdText");
        map.put("0xbf54","IsPackage");
        map.put("0xf089","HotelInfoV1");
        map.put("0x224c","RegionText");
        map.put("0x2425","HasHotelAndSpotPackage");
        map.put("0xd503","IsRenovationSelectiveShop");
        map.put("0x3592","NaviUrl");
        map.put("0x5064","ContainMeituan");
        map.put("0x9014","ShopPositionInfo");
        map.put("0x5199","ShopExtraTags");
        map.put("0xbb29","ShopStateInformation");
        map.put("0xe7e0","PhoneTip");
        map.put("0xf77a","RecommendReason");
        map.put("0x8d69","HasMeiTuanDeal");
        map.put("0x2e2f","ShareContent");
        map.put("0x8002","RankInfo");
        map.put("0xfee4","BranchInfo");
        map.put("0x89ce","ChainTag");
        map.put("0x22d","ShopExtraInfo");
        map.put("0x91ab","CityName");
        map.put("0xb492","IsWedSelectiveShop");
        map.put("0x8dc1","IsHospitalQueueable");
        map.put("0x75de","NearbyTransport");
        map.put("0x81d5","Wished");
        map.put("0x4b38","Arrived");
        map.put("0x5c2c","ShopStatusTag");
        map.put("0x2dbf","ExtSourceNameText");
        map.put("0x62e1","ExtSourceName");
        map.put("0x84b3","ExtSourceId");
        map.put("0xb4b8","CertifiedHairDresserInfo");
        map.put("0x65c4","HasCarMoPay");
        map.put("0x7eb4","BookType");
        map.put("0xc213","IsBanquetShop");
        map.put("0x220c","IsEduClassTogether");
        map.put("0xc1d","FeastInfo");
        map.put("0xc86a","InfraList");
        map.put("0x99c5","StatusText");
        map.put("0x1bf9","ShopDealInfo");
        map.put("0x5d49","CountDownSeconds");
        map.put("0xff61","DealID");
        map.put("0xdc8d","DealClickUrl");
        map.put("0x3242","DealTitleList");
        map.put("0xab01","SubTagInfo");
        map.put("0xeef0","IconUrl");
        map.put("0xe294","SubDealTitle");
        map.put("0x6fa3","DealType");
        map.put("0x1f71","DealTitle");
        map.put("0xd597","TagInfo");
        map.put("0x9bb6","ShopDealInfos");
        map.put("0x8cbe","ViewType");
        map.put("0x19d9","TagList");
        map.put("0x742b","RecommendDishUrl");
        map.put("0x43e0","HasBankCard");
        map.put("0xf708","Rentable");
        map.put("0x4907","Saleable");
        map.put("0xa5d2","CommunityDesc");
        map.put("0x2ab7","CommuntiyService");
        map.put("0xfa9e","StarGrade");
        map.put("0x5491","GeoPoint");
        map.put("0x4b3f","CoordType");
        map.put("0xe16f","DDBookable");
        map.put("0xb9f2","IsToHomeShop");
        map.put("0x1745","ShopServiceInfoDoList");
        map.put("0x255f","ShopStyle");
        map.put("0x996","IsOrderDish");
        map.put("0x14e5","ShopNearby");
        map.put("0x7291","Desc");
        map.put("0xc06a","Rank");
        map.put("0xf10e","TakeOrder");
        map.put("0x11c5","FriendsVisitInfo");
        map.put("0xa8c0","HotelInfo");
        map.put("0x6a8d","OverseaBigPic");
        map.put("0x49f0","OriName");
        map.put("0x84e","AddressCard");
        map.put("0x3636","OverseaShopNearby");
        map.put("0xed7c","VerticalChannelBookable");
        map.put("0xa79d","HasMultiPic");
        map.put("0xf609","Activity");
        map.put("0x4a71","HotelRankTag");
        map.put("0x6088","AdvancedPics");
        map.put("0xe63f","IsQueueable");
        map.put("0x41df","KtvBookable");
        map.put("0x9702","IsForeignShop");
        map.put("0xea82","StarTips");
        map.put("0xd3a7","HasPay");
        map.put("0xd479","MatchText");
        map.put("0x8846","FullShopName");
        map.put("0x5801","DistanceText");
        map.put("0x4485","BranchCounts");
        map.put("0x3096","IsAdShop");
        map.put("0x21bb","HotelPromoList");
        map.put("0xc7ce","Source");
        map.put("0x5a9c","ReviewCount");
        map.put("0x4992","ShopTotalSales");
        map.put("0xecbf","Bookable");
        map.put("0x203f","HotelJson");
        map.put("0x7945","VoteTotal");
        map.put("0x460d","ShopPromos");
        map.put("0x991","HasDeals");
        map.put("0x69d4","MarketPrice");
        map.put("0x7608","OtaHotelPriceList");
        map.put("0x9e45","HotelDealList");
        map.put("0xd2ef","IsHotelFull");
        map.put("0x5271","DistrictName");
        map.put("0xe4ac","ExtraJson");
        map.put("0x31de","HasPromo");
        map.put("0x9e5c","HasMOPay");
        map.put("0xc5b5","Price");
        map.put("0xd288","LikedActivity");
        map.put("0x6ee2","OriLongitude");
        map.put("0x180d","OriLatitude");
        map.put("0x8d9","HasTakeaway");
        map.put("0x8963","HotelPromoTag");
        map.put("0x65aa","StoreCardGroupList");
        map.put("0x30e7","ScoreEx3");
        map.put("0x30e4","ScoreEx2");
        map.put("0x30e5","ScoreEx1");
        map.put("0x37a6","MovieBookable");
        map.put("0xfd5","WeddingTips");
        map.put("0x7f2","WeddingBookable");
        map.put("0x835c","HotelBooking");
        map.put("0xae5d","HasSeeAlsoShops");
        map.put("0x52d2","IsNewShop");
        map.put("0x865","PublicTransit");
        map.put("0x3229","TicketBookable");
        map.put("0x8d29","PhoneNos");
        map.put("0xac65","PicCount");
        map.put("0xed02","CommendReason");
        map.put("0xcf40","TouristInfo");
        map.put("0xd885","IsHotel");
        map.put("0x991d","NewPage");
        map.put("0x6d34","SearchCategory");
        map.put("0xd8bc","RecommendIcon");
        map.put("0x79ca","Recommends");
        map.put("0x9889","Tourist");
        map.put("0xa4a4","CooperationInfo");
        map.put("0x6a4d","ShopPhotoCategory");
        map.put("0x8fd1","ShopMemberCardID");
        map.put("0x25a8","Announce");
        map.put("0x6d9d","ShopView");
        map.put("0xe58b","IsDishMenu");
        map.put("0xcf04","IsRateFromDP");
        map.put("0x34b2","AuthorityLabelType");
        map.put("0xc8e1","AuthorityLabel");
        map.put("0x1606","MCStatus");
        map.put("0xa69c","Polygon");
        map.put("0x6881","CoordY");
        map.put("0x6886","CoordX");
        map.put("0x1065","LandmarkShopID");
        map.put("0x365f","LandmarkName");
        map.put("0xf426","FloorLabel");
        map.put("0x1b94","FloorNum");
        map.put("0x7ee","LandMarkId");
        map.put("0x45dd","IsLandMark");
        map.put("0x2820","Status");
        map.put("0x7217","CheckInServerVerify");
        map.put("0xd1c9","BranchIDs");
        map.put("0x870f","GroupID");
        map.put("0xa28a","Deals");
        map.put("0x9eb3","Campaign");
        map.put("0xa7f4","Extra");
        map.put("0xbc7e","WriteUp");
        map.put("0xa8af","DishTags");
        map.put("0x88e8","ScoreText");
        map.put("0x7454","ScoreRatio3");
        map.put("0x7457","ScoreRatio2");
        map.put("0x7456","ScoreRatio1");
        map.put("0x1348","Score3");
        map.put("0x1349","Score2");
        map.put("0xecb6","Score1");
        map.put("0x94ec","DefaultPic");
        map.put("0xef2f","Card");
        map.put("0xcb9a","Promos");
        map.put("0xdc73","Promo");
        map.put("0x5795","RegionName");
        map.put("0x7d9b","RegionID");
        map.put("0x73f9","CategoryName");
        map.put("0x9ea0","CategoryID");
        map.put("0x562d","Longitude");
        map.put("0xbe8a","Latitude");
        map.put("0x41db","CrossRoad");
        map.put("0x415","PhoneNo");
        map.put("0xa7b4","CityID");
        map.put("0x454b","PriceText");
        map.put("0xeb1c","AvgPrice");
        map.put("0x3835","ShopType");
        map.put("0xbeb7","ShopPower");
        map.put("0x2efc","AltName");
        map.put("0x881b","BranchName");
        map.put("0xee8f","Name");
        map.put("0x4707","BizTime");
        map.put("0x602f","BizStatus");
        map.put("0x4f07","BizTag");
        map.put("0x629a","PicMode");
        map.put("0xf87b","ModuleAB");
        map.put("0x85d7","ReviewTag");
        map.put("0x143f","extraInfo");
        map.put("0xfb72","ClientShopStyle");
        map.put("0x909d","SimpleMsg");
        map.put("0x8972","ShopBinStatus");
        map.put("0xf7e4","CategoryDesc");
        map.put("0x249a","List");
        map.put("0xcb0d","CoverStyleType");
        map.put("0x177d","RecordCount");
        map.put("0xfa6b","Flags");
        map.put("0x8811","OriginPrice");
        map.put("0xe337","ShowPriceType");
        map.put("0xe11a","Available");
        map.put("0x36e9","Title");
        map.put("0xb102","DetailLink");
        map.put("0x375","Characteristics");
        map.put("0xcd39","BusiInfo");
        map.put("0x9670","BabyProject");
        map.put("0xae32","BabyEnvPics");
        map.put("0x2ddc","PicUrl");
        map.put("0x144","EndTime");
        map.put("0xd98c","ImgRight");
        map.put("0x7f3c","ImgLeft");
        map.put("0xf0b9","ActivityDesc");
        map.put("0x314c","MsgColor");
        map.put("0xc6db","Bgcolor");
        map.put("0x4f3a","Show");
        map.put("0x1244","ShowCountDown");
        map.put("0x3cb6","ViewRatio");
        map.put("0x9444","ActivityDetailInfo");
        map.put("0xfaca","JumperLink");
        map.put("0x9d2c","IssueCouponComponent");
        map.put("0x4061","CouponOptionList");
        map.put("0x12d1","DealStyle");
        map.put("0x2cae","canDetailUrl");
        map.put("0x33b0","ModuleConfigs");
        map.put("0x263e","Key");
        map.put("0xa5b8","Value");
        map.put("0xbae3","moduleAbConfigs");
        map.put("0xddc1","configs");
        map.put("0xddc3","expBiInfo");
        map.put("0x85df","expId");
        map.put("0x9263","expResult");
        map.put("0x9e5e","key");
        map.put("0xe2dd","ModuleKey");
        map.put("0xc8ba","shopid");
        map.put("0x7aed","Interested");
        map.put("0x5910","DealViewDo");
        map.put("0x83df","DetailPhotos");
        map.put("0x24d4","ShortTitle");
        map.put("0xd096","PromoActivityDo");
        map.put("0xbfc","ActivityReport");
        map.put("0xa375","EventList");
        map.put("0xdd21","RefundRatioJL");
        map.put("0xc5a5","StructedDetails");
        map.put("0xb169","IsTort");
        map.put("0x3e2a","QueryBonusResult");
        map.put("0x9b61","HasBonus");
        map.put("0xfcea","DisplayBonus");
        map.put("0x2fe5","SameShopDeals");
        map.put("0x475e","SubTitle");
        map.put("0x4a8a","Photo");
        map.put("0x7c03","OriginalPrice");
        map.put("0x4040","SalesTag");
        map.put("0x7ec","SalesDesc");
        map.put("0x26e9","DetailUrl");
        map.put("0x93b","Id");
        map.put("0xe955","OtherShopDeals");
        map.put("0xab85","TopTitle");
        map.put("0xdcb0","BottomTitle");
        map.put("0x817a","ReviewAbstractList");
        map.put("0x5703","NextStartIndex");
        map.put("0xcbf9","Summary");
        map.put("0xa0ab","CheckInFeed");
        map.put("0x52c3","FeedUser");
        map.put("0xfa5b","LUserId");
        map.put("0x8df6","UserId");
        map.put("0xae3c","UserIdentifier");
        map.put("0x92e3","UserName");
        map.put("0xd8ee","Avatar");
        map.put("0xcc5","UserLevel");
        map.put("0xe63e","ProfileUrl");
        map.put("0x863d","UserType");
        map.put("0xfafc","IsFollowed");
        map.put("0xb454","UserIconType");
        map.put("0xe353","UserLabel");
        map.put("0x37bf","UserSign");
        map.put("0x7ae0","Pendants");
        map.put("0x640d","ImgUrl");
        map.put("0x1733","LinkUrl");
        map.put("0x16ec","UserDesc");
        map.put("0xf839","MainId");
        map.put("0xb672","FeedType");
        map.put("0x4ce9","Honour");
        map.put("0x7a55","Star");
        map.put("0x5b7d","Share");
        map.put("0x99e9","SourceName");
        map.put("0xc6ca","Time");
        map.put("0xcce9","Label0");
        map.put("0xcce8","Label1");
        map.put("0xfbf","ContentTitle");
        map.put("0x5625","RichTitle");
        map.put("0x54a0","AbstractList");
        map.put("0x9658","ActionNote");
        map.put("0xf617","ContentTag");
        map.put("0x57b6","Content");
        map.put("0x929c","RichContent");
        map.put("0x1fa6","TranslateContent");
        map.put("0xd067","RecommendText");
        map.put("0x84f4","RecommendInfoMap");
        map.put("0x7f00","Pictures");
        map.put("0xf4bb","SmallUrl");
        map.put("0xeaf8","BigUrl");
        map.put("0xe2a9","HasTag");
        map.put("0xbf9b","tag");
        map.put("0x345c","picTitle");
        map.put("0xa0da","UploadTime");
        map.put("0xb716","price");
        map.put("0xd4b","PicReportUrl");
        map.put("0xb88c","PhotoDetailUrl");
        map.put("0xf1d1","picTagText");
        map.put("0x9955","PicHeight");
        map.put("0x80cb","PicWidth");
        map.put("0x6a3b","FeedRelevantList");
        map.put("0x9de6","Comments");
        map.put("0x2437","Note");
        map.put("0xa684","StarType");
        map.put("0x2b6b","FeedTagUrl");
        map.put("0xfb0b","IsLike");
        map.put("0x9bbc","LikeCount");
        map.put("0x59b5","LikeUsers");
        map.put("0xd9a6","NoteTagList");
        map.put("0xc41a","FeedScoreList");
        map.put("0xddba","CommentCount");
        map.put("0x3d69","ViewCount");
        map.put("0xb055","EditUrl");
        map.put("0xf919","ReportUrl");
        map.put("0x6ecb","Anonymous");
        map.put("0x57ca","IsCollectable");
        map.put("0xacf5","IsCollected");
        map.put("0xe946","CollectedCount");
        map.put("0x3869","IsDeletable");
        map.put("0x531a","BottomInfo");
        map.put("0x6a33","DisableTips");
        map.put("0x46d0","LikeButton");
        map.put("0x6f1f","ReviewType");
        map.put("0x50bc","LikeListUrl");
        map.put("0xe4d2","GoodShopContent");
        map.put("0x6500","GoodShopTitle");
        map.put("0xd697","TotalReview");
        map.put("0x54cb","ReviewRatio");
        map.put("0x694c","TotalReviewRecommend");
        map.put("0xa0af","DealComments");
        map.put("0x5b7","DetailInfo");
        map.put("0xfb30","TagType");
        map.put("0x1aab","HotelDealGroupDetailInfo");
        map.put("0x88cb","shopuuid");
        map.put("0x9eb0","DealChannelTags");
        map.put("0xcbbd","OnlineConsultUrl");
        map.put("0x5599","MidasAdInfo");
        map.put("0x4ea2","IsAutoTrack");
        map.put("0xfa73","ResourceAb");
        map.put("0xe6be","MidasPicassoAds");
        map.put("0xf81c","MidasPicassoAdGroup");
        map.put("0xcd68","MidasPicassoAdUnit");
        map.put("0xe917","GaUserInfos");
        map.put("0x1d6d","CellData");
        map.put("0x6075","Layout");
        map.put("0xb0f7","Feedbacks");
        map.put("0x788f","ShopPicassoAdGAUserInfo");
        map.put("0xf10b","bussi_id");
        map.put("0x64ed","opquery_id");
        map.put("0x5941","Module_id");
        map.put("0x1c57","Content_id");
        map.put("0xb0fc","Item_id");
        map.put("0x1c89","Shop_id");
        map.put("0x9f2c","Dealgroup_id");
        map.put("0x1547","Biz_id");
        map.put("0x1642","Query_id");
        map.put("0xd17","AdUnits");
        map.put("0x5b5a","TabInfo");
        map.put("0x1068","CommonGroup");
        map.put("0xc649","AdGroups");
        map.put("0x5d5c","PicassoAdData");
        map.put("0x1324","RequestId");
        map.put("0xf02b","IsSurveillance");
        map.put("0xc218","AdBean");
        map.put("0x310c","PackageVer");
        map.put("0x8278","ViewId");
        map.put("0xe601","AdData");
        map.put("0xaf04","resourceAb");
        map.put("0x477b","Tag");
        map.put("0xe854","RemainCount");
        map.put("0xf718","ShopCount");
        map.put("0xfdc","RecallButtons");
        map.put("0x5602","IsNearest");
        map.put("0x4595","mustGroups");
        map.put("0xac4b","optionalGroups");
        map.put("0x234a","dealStructInfo");
        map.put("0xfebf","desc");
        map.put("0x24cc","title");
        map.put("0xd993","copies");
        map.put("0xe23d","items");
        map.put("0x97dd","value");
        map.put("0xf30b","processItems");
        map.put("0x8f0c","type");
        map.put("0x6242","marketPrice");
        map.put("0x56e1","structAttrs");
        map.put("0x6ee6","DealSelectList");
        map.put("0xf2ab","BuName");
        map.put("0xacd4","BuyLimit");
        map.put("0x2628","BuyMixCount");
        map.put("0xab09","IsLimitPerUser");
        map.put("0xf364","DealPurchaseNotesModuleDo");
        map.put("0xdf69","FoldLineNum");
        map.put("0x5de5","PurchaseNotes");
        map.put("0x9d23","PreDisplayDo");
        map.put("0xdac8","show");
        map.put("0xbd0c","Image");
        map.put("0xc261","Ticket");
        map.put("0x7612","Piclen");
        map.put("0xa41b","GeneralPromoDesk");
        map.put("0xe051","PromoDeskRule");
        map.put("0xe8db","Md5Checksum");
        map.put("0x62d3","ScriptUrl");
        return map.get(keyCode)==null?keyCode:map.get(keyCode);
    }

}

<!-- TePass end -->



友情提示:本文只为技术分享交流,请勿非法用途.产生一切法律问题与本人无关



在浏览的同时希望给予作者打赏,来支持作者的服务器维护费用.一分也是爱~