大众点评APP10.29.3接口分析获得商家列表数据
<!-- TePass start -->
0x006. 使用Xposed hook验证数据如下(只要第一位等于83那就不需要二次解密,79需要二次解密也就是反序列化),Hook代码以及结果如下,如下图: 0x007. 再次使用Xposed Hook测试,返回了一个需要二次解密的DPObject的对象,需要继续分析返回了这个对象之后,的其他操作,如下图: 0x008. 商家店铺列表最终的反序列化,也就是二次解密只有这一行代码,如下图: 0x009. 动态调试Smali代码查看这个返回值的对象内容(每页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 -->
manyuegong
如果不用ddms的话
用户 MacOS 1119 天前回复
manyuegong
大佬能讲下怎么追到返回response 和找到解密的地方的吗?感觉这个app有点难追
用户 MacOS 1119 天前回复
wcs
有视频教程吗?
用户 Windows10 1182 天前回复
布谷
请问可以解密评论内容接口的数据吗?
就是当前这个版本10.29.3的,(这个前缀的:https://itrip.meituan.com/volga/api/v7/trip/poi/select/city)
用户 Windows10 1291 天前回复
admin
@布谷当然可以啦~
作者 Windows10 1202 天前回复
ljmmm
太棒了
用户 Windows10 1331 天前回复
jiakaipeng
@ljmmm你好,留个联系方式,交流一下
用户 Windows10 1316 天前回复
admin
@ljmmm感谢支持。
作者 MacOS 1331 天前回复
jiunliu
你好,我用同样的hook方法,hook对应节点,但是hook没有效果,请问这个是什么原因呢,谢谢啦
用户 Windows10 1514 天前回复
admin
@jiunliu建议使用frida 即时生效。
作者 MacOS 1424 天前回复
freedom
6666 期待后续作品更新
用户 Windows10 1564 天前回复
test
太棒了,很好的学习资料,楼主能贡献下代码学习下吗?
用户 Windows7 1594 天前回复