首页>软件资讯>常见问题

常见问题

利用Fiddler抓包安卓app数据

发布时间:2023-01-17 15:49:37人气:1803

平时爬网页的数据比较多,最近尝试抓包安卓app的数据,发现Fiddler配合模拟器还是挺好用的。


一开始我用的夜神模拟器,发现用Fiddler只能抓包首页的数据,点行情和龙虎榜都没有新的包进来。查了下说是现在开盘啦app会侦测模拟器,然后拒绝数据请求。


最后换了雷电模拟器4,虽然网上很多说雷电4要配xpose框架才行,不过亲测试了下,没有xpose也可以完美抓包。记录一下这次抓包的步骤,以便后续使用。


1.在官网下载安装雷电4模拟器,注意版本


2.启动雷电模拟器,开启root权限


3.通过git bash命令窗口操作:


# 将fiddler生成的证书,转换为.pem文件

openssl x509 -inform DER -in FiddlerRoot.cer -out fiddler.pem

# 解析出证书的hash值(因为安卓证书文件名是根据hash值存的)

openssl x509 -inform PEM -subject_hash_old -in fiddler.pem | head -1

# 将该hash值作为新的文件名以".0"结尾

cat fiddler.pem > 269953fb.0

# 将.0文件,通过雷电4自带的文件管理器,放到下面目录,权限修改为-rw-r-r,并重启雷电4

/system/etc/security/cacerts

1.png


4.  重启雷电模拟器,在设置-安全-信任的凭据-系统中找到DO-NOT-TRUST-FiddlerRoot,说明证书安装成功

5. 设置代理,在雷电模拟器4中wifi设置代理配置是无效的。我们用adb方式设置。

在雷电模拟器安装目录下有adb.exe可执行文件。我们通过cmd操作:

# 进入雷电4的安装目录

adb.exe devices

# 执行以下命令,给雷电模拟器4设置全局代理

adb.exe shell settings put global http_proxy 本机ip:fiddler端口

2.png


6. 设置后重启雷电模拟器4,就可以用Fiddler来抓包啦。



现在尝试抓包开盘啦app的行情数据。点开行情-个股-随意一只股票-然后点上面的行情数据,就可以在Fiddler上面看到抓到的接口。

3.png


然后就可以用Python来模拟请求了,写了个粗糙的代码,印证抓包成功。

4.png


那如何用这个接口来抓包所有行情数据勒?看了下post请求的参数,改一下StockID就可以了,再写个粗糙的代码(就随机取10个share),最后dic转换一下cols,方便查看。

5.png


import requests

import time

import re

import pandas as pd

import numpy as np

from rediscluster import StrictRedisCluster


pd.set_option('display.max_columns', None)

pd.set_option('display.max_rows', None)


# 用了公司的redis节点,这里隐匿一下

startup_nodes = [

    {"host":"xxx","port":7001},

    {"host":"xxx","port":7003},

    {"host":"xxx","port":7002}

]

rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)

new_codes = rc.hkeys("handicap:cache:HANDICAP_DATA:STOCK")


headers = {

    'users-Agent': 'Dalvik/2.1.0 (Linux; U; Android 7.1.2; SM-N9760 Build/N2G48C)',

}

df=pd.DataFrame()

for i in new_codes[:10]:

    try:

        url = 'https://apphq.longhuvip.com/w1/api/index.php'

        datas = {

            'a':'GetStockPanKou_Narrow',

            'apiv':'w31',

            'c':'StockL2Data',

            'VerSion':'5.7.0.12',

            'State':'1',

            'PhoneOSNew':'1',

            'DeviceID':'ffffffff-e9db-b10c-0000-000000b287e5',

            'StockID':str(i),

                 }

        r = requests.post(url, headers=headers, data=datas)

        data = r.json()

        hq_data = data['real']

        tmp_df = pd.DataFrame([hq_data])

        tmp_df['day']=data['day']

        tmp_df['code']=data['code']

        tmp_df['name']=data['name']

        tmp_df['preclose_px']=data['preclose_px']

        df = pd.concat([df, tmp_df], axis=0)

        time.sleep(0.5)

    except Exception as e:

        print(e)

        continue

print(df)


dic={'actualcirculation_value':'实际流通值','amount_in':'内盘','amount_out':'外盘',

     'amplitude':'振幅','avg_px':'均价','circulation_amount':'流通股','circulation_value':'流通值',

     'down_px':'跌停','up_px':'涨停','dyn_pb_rate':'市净率','high_px':'高','low_px':'低','last_px':'past_px',

     'market_value':'总市值','open_px':'开','pe_rate':'市盈率','phcj_turnover':'盘后额','phcj_volume':'盘后量',

     'PledgeRatio':'质押比','px_change':'px_change', 'entrust_rate':'委比','px_change_rate':'px_change_rate', 'time':'time',

     'total_amount':'总手','total_shares':'总股本','total_turnover':'金额','turnover_ratio':'换手',

     'vol_ratio':'量比','day':'day','code':'code','name':'name','preclose_px':'昨收'}


order=['day','code','name','preclose_px', 'time','up_px', 'down_px',

       'high_px', 'low_px', 'open_px', 'last_px', 'avg_px', 'amount_in', 'amount_out',

       'px_change', 'px_change_rate', 'turnover_ratio', 'total_amount', 'total_turnover', 'vol_ratio',

       'amplitude', 'entrust_rate', 'pe_rate', 'dyn_pb_rate',

       'circulation_amount', 'circulation_value', 'total_shares', 'market_value',

       'actualcirculation_value', 'PledgeRatio']

df=df[order]

new_cols=[]

for i in list(df.columns):

    new_cols.append(dic[i])

df.columns=new_cols

print(df)



上一条:使用 Minitab Connect 保持决策流畅性

下一条:使用这个插件,fiddler抓包直接生成httprunner脚本