捷风app提供了很多企业动态,包括招标,投标,采购和公共资源交易在内的各种数据。
本文案例是对捷风资讯app的接口分析和参数sign的分析。
案例环境:捷风资讯(安卓1.0.5)、charles、
@toc
搜索列表页接口分析
POST-URL:https://jiefengnews.com/api/ds/v2/search
FormData:
{
"db_id":[1],
"filter_conditions":{
"keyword":[[{"key":"bid_company.stock_company.name","value":"宝信软件"}]],
"time":[
{"key":"publish_time",
"value":{"gte":"2017-01-01 00:00:00","lte":"2021-12-24 12:34:20"}}
]
},
"search_word":"宝信软件",
"size":10,
"judge_result":1,
"time_field":"publish_time",
"cursor_field":"cursor",
"export_fields":[
"search_db","title",
"bid_company.stock_company.stock_code",
"bid_company.stock_company.concept_text",
"bid_company.stock_company.name",
"publish_time","bid_money",
"bid_company.stock_company.order_percent",
"bid_company.name"
]
}
搜索接口没有校验,所以可以直接模拟请求。
Python代码:
import requests
data ={
"db_id":[1],
"filter_conditions":{
"keyword":[[{"key":"bid_company.stock_company.name","value":"宝信软件"}]],
"time":[
{"key":"publish_time",
"value":{"gte":"2017-01-01 00:00:00","lte":"2021-12-24 12:34:20"}}
]
},
"search_word":"宝信软件",
"size":10,
"judge_result":1,
"time_field":"publish_time",
"cursor_field":"cursor",
"export_fields":[
"search_db","title",
"bid_company.stock_company.stock_code",
"bid_company.stock_company.concept_text",
"bid_company.stock_company.name",
"publish_time","bid_money",
"bid_company.stock_company.order_percent",
"bid_company.name"
]
}
headers = {
'User-Agent':'MI 9(Android/5.1.1) (com.jiefengnews) UniApp/0.28.0 900x1600',
}
d = requests.post('https://jiefengnews.com/api/ds/v2/search',verify=False,json=data,headers=headers).text
print(d)
详情页接口分析
继续抓包分析
详情页接口:https://jiefengnews.com/api/ds/v2/data/detail
Formdata:
{
"id": "11b4e6578de7cd07c4fafb9cab872789",
"sign": "ldDPLpqqOM5Q3nsxFOfK7IjKjC4DLJuFW_2NYUxCC-v2KGoqMhXeh1cQx9KhUOy-",
"db_id": 1,
"export_fields": ["title", "publish_time", "project_province", "bid_company.name", "owner.name", "bid_money", "agency.name", "raw_html", "bid_company.stock_company.name", "bid_company.stock_company.stock_code", "bid_company.stock_company.full_name", "bid_company.stock_company.order_percent", "search_db"]
}
Formdata中有一个sign参数,没想到相同检索条件下的sign是一个定值。切换栏目后sign才会变。
那其实把每个栏目的sign都复制下来就能采集了。。。
比如:
- 中标:"ldDPLpqqOM5Q3nsxFOfK7IjKjC4DLJuFW_2NYUxCC-v2KGoqMhXeh1cQx9KhUOy-"
- 拿地:"HmB_Fm_Q1O_dYghmU3ESRVMTN022lQE5O1oHH-7xoyo="
- 提前捕获:"T5_hYJPwHVwRM8BlicxXLAUJFIoED5QtlWWS8OaISvcFR3desRuTWctAhT-FwP-D"
- 快讯聚合: "-NCmeQ3bXyUWEaFCQsoZ1w=="
- 对外投资:"DHZWSDEwOLJOh2AplF1TOAVHd16xG5NZy0CFP4XA_4M="
根据你搜索时的分类标签,准备好详情页的sign值即可进行采集了。
源码分析
但是出于礼貌,还是要分析下源码中的sign,看看是怎么写的。
查壳,没壳。
放入Jadx中反编译。
静态分析了半天,未找到符合的sign代码。
所以判断该sign为定值。
请求示例
import requests
headers = {
'User-Agent':'MI 9(Android/5.1.1) (com.jiefengnews) UniApp/0.28.0 900x1600',
}
data_search ={
"db_id":[1],
"filter_conditions":{
"keyword":[[{"key":"bid_company.stock_company.name","value":"宝信软件"}]],
"time":[
{"key":"publish_time",
"value":{"gte":"2017-01-01 00:00:00","lte":"2021-12-24 12:34:20"}}
]
},
"search_word":"宝信软件",
"size":10,
"judge_result":1,
"time_field":"publish_time",
"cursor_field":"cursor",
"export_fields":[
"search_db","title",
"bid_company.stock_company.stock_code",
"bid_company.stock_company.concept_text",
"bid_company.stock_company.name",
"publish_time","bid_money",
"bid_company.stock_company.order_percent",
"bid_company.name"
]
}
d = requests.post('https://jiefengnews.com/api/ds/v2/search',verify=False,json=data_search,headers=headers).text
print(d)
data_detail = {"id":"11b4e6578de7cd07c4fafb9cab872789","sign":"ldDPLpqqOM5Q3nsxFOfK7IjKjC4DLJuFW_2NYUxCC-v2KGoqMhXeh1cQx9KhUOy-","db_id":1,"export_fields":["title","publish_time","project_province","bid_company.name","owner.name","bid_money","agency.name","raw_html","bid_company.stock_company.name","bid_company.stock_company.stock_code","bid_company.stock_company.full_name","bid_company.stock_company.order_percent","search_db"]}
detail = requests.post('https://jiefengnews.com/api/ds/v2/data/detail',verify=False,json=data_detail,headers=headers).text
print(detail)