magisk+lsposed hook okhttp3采集小红书app端接口(包含完整源码)(2024-09-03)

摘要:
    本文介绍如何通过hook OkHttp3框架来拦截并处理应用的网络响应,特别是在某书APP中,通过深入理解Okhttp3的API,hook RealCall以获取请求和响应数据,实现关键词搜索、笔记和用户等数据的回传操作。

一、原理介绍


1、hook okhttp3类,得到接口数据;


    使用Okhttp3中的call方法,在newRealCall()中初始化了RealCall,hook-okhttp3.RealCall即可拿到请求包。可以直接将关键词搜索的,笔记, 用户等多个数据进行hook回传。

2、hook headers 得到xy_common_params;
3、hook getSessionId方法 得到sid账号信息;
4、上传到数据到服务器HttpHelper类;
5、跳转至app某页面:

java">   public static void open_xhs(Context context,String pagetype,String id){String url="";if(pagetype.equals("user")){       //用户信息页url="xhsdiscover://user/"+id;///xhsdiscover://user/6226f1a200000000210234ee   xhsdiscover://profile  xhsdiscover://home}if(pagetype.equals("search")){   //搜索页//xhsdiscover://search/result?keyword=url="xhsdiscover://search/result?keyword="+id;}if(pagetype.equals("video_feed")){   //视频笔记页url="xhsdiscover://video_feed/"+id;}if(pagetype.equals("item")){     //笔记页url="xhsdiscover://item/"+id;}Uri uri = Uri.parse(url); Intent intent =new Intent(Intent.ACTION_VIEW,uri);;intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);}

二、完整源代码

java">package com.coin.userinfo;import android.app.AndroidAppHelper;
import android.content.Context;
import android.content.Intent;
import android.util.Log;import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.widget.Toast;import org.json.JSONObject;import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import utils.HttpHelper;import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class MainHook implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {Log.i("byc","===================app-start1=========================");//XposedBridge.log("===================app-start1==========================");// 判断当前启动的目标程序是否是要hook的应用程序  技术支持:metabycf or byc6352 or  39848872if (loadPackageParam.packageName.equals("com.xingin.xhs")) {Log.i("byc","===================xhs-start=========================");//XposedBridge.log("===================xhs-Sid=========================");XposedHelpers.findAndHookMethod("com.xingin.account.entities.UserInfo", // 包名+类名loadPackageParam.classLoader,"getSessionId",     // 要hook的方法名称new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);}// hook之后@Overrideprotected void afterHookedMethod(MethodHookParam param)throws Throwable {super.afterHookedMethod(param);// 打印方法返回值信息String result = param.getResult().toString();//XposedBridge.log("====xhs-sid-Cookie:---" + result);Log.i("byc","====xhs-sid-Cookie:---" + result);}});//hook okhttp 得到接口数据Class<?> RealCall = XposedHelpers.findClass("okhttp3.RealCall", loadPackageParam.classLoader);XposedHelpers.findAndHookMethod(RealCall, // 包名+类名"execute",new XC_MethodHook() {// hook之后@Overrideprotected void afterHookedMethod(MethodHookParam param)throws Throwable {super.afterHookedMethod(param);Object result = param.getResult();
//                            XposedBridge.log("====param:---" + result.toString());Object request = XposedHelpers.getObjectField(result, "request");Object headers = XposedHelpers.getObjectField(request, "headers");
//                            XposedBridge.log("====headers:---" + headers.toString());String[] fields = (String[]) XposedHelpers.getObjectField(headers, "namesAndValues");String xy_common_params = null;for (int x = 0; x < fields.length; x = x + 1) {try {if (fields[x].equals("xy-common-params")) {xy_common_params = fields[x + 1];break;}} catch (Exception e) {e.printStackTrace();}}if (xy_common_params != null) {//XposedBridge.log("====xy-common-paramsaders:---" + xy_common_params);Log.i("byc","====xy-common-paramsaders:---" + xy_common_params);// todo 等待发送到服务端队列//}Object body = XposedHelpers.callMethod(result, "body");Object source = XposedHelpers.callMethod(body, "source");XposedHelpers.callMethod(source, "request", Long.MAX_VALUE);Object getBuffer = XposedHelpers.callMethod(source, "getBuffer");Object cloneBuffer = XposedHelpers.callMethod(getBuffer, "clone");String message = (String) XposedHelpers.callMethod(cloneBuffer, "readString", StandardCharsets.UTF_8);
//                            XposedBridge.log("====message:---" + message);//Log.i("byc",request.toString());//Log.i("byc", message);//关键词搜索if (result.toString().contains("search/recommend?keyword=") || result.toString().contains("search/notes?keyword=")) {// todo message//XposedBridge.log("------------search---------" + message);Log.i("byc","------------search---------");Log.i("byc",request.toString());Log.i("byc", message);//String strBase64 = Base64.encodeToString(message.getBytes(),   Base64.DEFAULT);}//用户主页if (result.toString().contains("user/info?user_id=")) {//XposedBridge.log("------------user---------" + message);//Log.i("byc","------------user---------" + message);//String strBase64 = Base64.encodeToString(message.getBytes(),   Base64.DEFAULT);Log.i("byc","------------user---------");upload_userinfo(message);}//详情页if (result.toString().contains("note/feed?note_id=") || result.toString().contains("note/videofeed?note_id=")) {//XposedBridge.log("------------note---------" + message);Log.i("byc","------------note---------" + message);//String strBase64 = Base64.encodeToString(message.getBytes(),   Base64.DEFAULT);//xhsHttpClient(strBase64, "note");}//切换账号if (result.toString().contains("/api/sns/v4/user/login/password")) {}}});}}private void upload_userinfo(String data){try{Log.i("byc",data);JSONObject jsonObject = new JSONObject(data);String userid=jsonObject.getJSONObject("data").getString("userid");Log.i("byc",userid);String url="http://*********:10012/put/user/info?key=234181402307&user_id="+userid;HttpHelper.http_post(url,data);}catch (Exception e){Log.e("byc",e.getMessage().toString());}}}

三、数据传输类

java">
package utils;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;public class HttpHelper {/*** 获取网页HTML源代码* @param http_url 网页路径*/public static String http_get(String http_url) throws Exception {URL url=new URL(http_url);HttpURLConnection conn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(5000);conn.addRequestProperty("Connection","close");conn.setRequestMethod("GET");if(conn.getResponseCode()==200){InputStream inStream=conn.getInputStream();byte[] data=read(inStream);String html=new String(data,"UTF-8");return html;//MyLog.i("byc","ok");}return null;}/*** 读取流中的数据*/public static byte[] read(InputStream inputStream) throws IOException {ByteArrayOutputStream outputStream=new ByteArrayOutputStream();byte[] b=new byte[1024];int len=0;while((len=inputStream.read(b))!=-1){outputStream.write(b);}inputStream.close();return outputStream.toByteArray();}public static boolean http_post(String http_url,String data) {try {boolean result=false;URL url = new URL(http_url);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");conn.setRequestProperty("Connection", "close");//"close"conn.setRequestProperty("Content-Type", "application/json");conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);conn.connect();OutputStream os = conn.getOutputStream();os.write(data.getBytes(StandardCharsets.UTF_8));os.flush();os.close();int responseCode = conn.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {InputStream input = conn.getInputStream();StringBuilder sb = new StringBuilder();int ss;while ((ss = input.read()) != -1) {sb.append((char) ss);}MyLog.i("请求结果 = " + sb.toString());//android.util.Log.e("tag", "请求结果 = " + sb.toString());input.close();result=true;}return result;} catch (Exception e) {MyLog.i("出现异常: " + e.toString());//android.util.Log.e("tag", "出现异常: " + e.toString());//e.printStackTrace();return false;}}
}

四、封面


http://www.ppmy.cn/embedded/107287.html

相关文章

AR 眼镜之-系统通知定制(通知弹窗)-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 系统通知定制 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;实现系统通知的监听 2&#xff09;系统通知显示&#xff1a;通知弹窗 2. &#x1f4a0; 实现系统通知的监听 2.1 继承 NotificationLi…

MySQL数据库安装(详细)—>Mariadb的安装(day21)

该网盘链接有效期为7天&#xff0c;有需要评论区扣我&#xff1a; 通过网盘分享的文件&#xff1a;mariadb-10.3.7-winx64.msi 链接: https://pan.baidu.com/s/1-r_w3NuP8amhIEedmTkWsQ?pwd2ua7 提取码: 2ua7 1 双击打开安装软件 本次安装的是mariaDB&#xff0c;双击打开mar…

java fastxml json 科学计数法转换处理

背景&#xff1a; 由于 canal 切换为 tx dbbridge后&#xff0c;发现dbbridge对于canal的兼容性存在较大问题&#xff0c;从而引发 该文档的实践。 就目前发现 dbbrige 的字段 大小写 和 数据类型格式 从binlog 写入kafka 同canal 都会存在差异。 canal之前导出都是小写&…

erlang学习:用ETS和DETS存储数据2

今日学习创建一个ETS表 下面是代码实现 -module(lib_trigrams).-export([make_ets_set/0, make_ets_ordered_set/0]). for_each_trigram_in_the_english_language(F, A0) ->{ok, Bin0} file:read_file("test.txt"),Bin zlib:gunzip(Bin0),scan_word_list(binar…

softmax里边的exp用拟合验证精度。

文章目录 要验证Softmax函数中的指数运算&#xff08;exp函数&#xff09;对精度的影响&#xff0c;可以通过拟合一个函数来近似Softmax函数&#xff0c;并比较两者的输出结果。 import numpy as np import matplotlib.pyplot as plt# Softmax函数 def softmax(x):e_x np.exp…

Java【操作符】

参考&#xff1a;高效掌握 Java 中的各种操作符&#xff0c;包括算术操作符、关系操作符和逻辑操作符_java与操作符-CSDN博客 - 搜索 (bing.com) 操作符的优先级 1.后缀操作符&#xff1a;a a-- 2.一元操作符&#xff1a;a --a - ~ ! 3.乘性操作符&#xff1a;* / % …

AI科学家:自动化科研的未来之路

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;AI已经在众多领域中展现了强大的潜力&#xff0c;尤其是在科研方面的应用正在引起广泛关注。最近&#xff0c;Sakana AI与牛津大学和不列颠哥伦比亚大学联合推出了一款被称为“AI科学家”的自动化科研工具&am…

Go语言的编程规则和秘籍

Go语言有一些严格的编码规则&#xff0c;这些规则旨在帮助你避免常见的错误和漏洞&#xff0c;同时也使你的代码更易于被Go社区理解。本文将介绍其中两条重要的规则。 首先需要记住&#xff0c;Go编译器的目的是帮助你提升代码质量&#xff0c;而不是让你的开发过程变得复杂。…

Python爬虫使用实例-漫kzhan

环境配置 pip install shutil parsel pillow pypdf1/ 单个章节 singleChapter 需要获取参数&#xff1a;chapter_id与comic_id&#xff0c;可能要sign和uid 获取请求地址 urlhttps://comic.mkzhan.com/chapter/content/v1/ # 请求地址获取请求参数 data{chapter_id:499…

Go异常处理机制

Go 语言的异常处理机制一直是社区讨论和争议的焦点。Go 采用了一种独特的错误处理方式&#xff0c;主要通过返回错误值来处理异常情况&#xff0c;而不是使用传统的 try-catch-finally 异常处理模型。以下是一些社区中关于 Go 异常处理的常见争议点&#xff1a; 1.社区争论意见…

【嵌入式学习笔记】---- 时钟源时钟树 RCC

微观引入时钟源 在芯片内部&#xff0c;布满了各种逻辑电路&#xff0c;通过数字信号进行通信 假设芯片内部存在如下这种逻辑电路&#xff1a; ①状态&#xff1a;当A、B均输入1时&#xff0c;与门输出1&#xff0c;异或门输出0&#xff0c;故此时寄存器的值为0 ②状态&…

5.sklearn-朴素贝叶斯算法、决策树、随机森林

文章目录 环境配置&#xff08;必看&#xff09;头文件引用1.朴素贝叶斯算法代码运行结果优缺点 2.决策树代码运行结果决策树可视化图片优缺点 3.随机森林代码RandomForestClassifier()运行结果总结 本章学习资源 环境配置&#xff08;必看&#xff09; Anaconda-创建虚拟环境…

图形几何-如何将凹多边形分解成若干个凸多边形

凹多边形的概念 凹多边形是指至少有一个内角大于180度的多边形。与之相对&#xff0c;凸多边形的所有内角均小于或等于180度&#xff0c;且任意两点之间的连线都完全位于多边形内部。将凹多边形分解成若干个凸多边形是计算几何中的一个重要问题。 分解原理 将凹多边形分解为凸…

(游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)

游戏名称: 外卖员模拟器. 游戏类型: 3D, 科幻, 角色扮演 (RPG), 开放世界, AI, VR. 游戏的主要目的: 技术测试/验证. 1 文案 (超低空科幻流派) 2030 年, 基于 AI (人工智能) 的 自动驾驶 和 人形机器人 技术已经大规模普及使用, 但是 AI 的能力遭遇了瓶颈, AI 只能解决 99%…

ActiViz实战:使用vtkDistanceWidget实现两点测距功能

文章目录 一、效果图预览二、实现步骤三、C#完整实例代码一、效果图预览 二、实现步骤 1、通过vtkCellPicker拾取点坐标 2、通过vtkDistanceRepresentation2D设置起始点和结束点位置 3、通过vtkDistanceRepresentation2D的GetAxis()获取vtkAxisActor2D对象,并设置连线的样式 …

『功能项目』坐骑UI搭建及脚本控制显/隐【19】

本章项目成果展示 我们打开上一篇18怪物消亡掉落宝箱的项目&#xff0c; 本章要做的事情是搭建一个坐骑UI界面&#xff0c;并通过键盘B键/右侧坐骑按钮控制坐骑UI界面的显示与隐藏 在背包Bag上创建一个父物体&#xff0c; 命名为Middle 修改Bag的尺寸 将下面资源图片放进Art文…

【Go语言成长之路】 模糊测试

文章目录 模糊测试一、前提二、创建项目三、添加待测试代码四、添加单元测试五、添加模糊测试 模糊测试 ​ 本教程介绍了 Go 中模糊测试的基础知识。通过模糊测试&#xff0c;随机数据会针对您的测试运行&#xff0c;以尝试找到漏洞或导致崩溃的输入。可以通过模糊测试发现的漏…

避雷!避雷top!杭州拱墅金地·威新科技大厦

“我们领导说了&#xff0c;不用在乎业主的心态” 此话居然是从物业保安口中说的话&#xff0c;震惊啦我的三观&#xff01;&#xff01;&#xff01; 图片源于网络 在8月28日上午在杭州拱墅金地威新科技园3T幢举行网剧开机仪式&#xff0c;在准备举行仪式的过程中遭到物业驱逐…

最新VS code配置C/C++环境(tasks.json, launch.json,c_cpp_properties.json)及运行多个文件、配置Cmake

目录 一、VScode配置C/C环境&#xff0c;需设置tasks.json, launch.json文件 二、安装C/C扩展&#xff0c;配置tasks.json、launch.json、c_cpp_properties.json文件 (1)安装c/c扩展 (2)配置tasks.json文件 (3)配置launch.json文件 (4)配置中的参数(属性)说明 (5)运行程序(运行…

Monkey日志ANR、CRASH、空指针异常及其他异常数据分析

引言 在Android开发过程中&#xff0c;monkey测试是一种常用的随机测试手段&#xff0c;用于模拟用户的各种操作来发现应用中的稳定性问题。通过monkey测试生成的日志文件包含了丰富的信息&#xff0c;包括应用程序崩溃&#xff08;Crash&#xff09;、无响应&#xff08;ANR&…