文章内容
主页预览
文章内容直接get主页就可以拿到,页面内容太长,这里就不贴具体内容了,chrome自行查看。URL结构也非常简单,只需要修改后面的文章id就可以。
搜索界面
============ 2019年8月10日更新
一点资讯的搜索接口有调整,新的搜索接口:
Post 请求
请求url:
https://a1.go2yd.com/Website/channel/news-list-for-keyword?display=%E4%B8%B4%E6%B5%B7%E5%85%A8%E5%B8%82%E8%A2%AB%E6%B7%B9&word_type=token&ctype=overall&cstart=0&cend=10&refresh=1&fields=ctype&fields=url&fields=dtype&fields=image&fields=image_urls&fields=title&fields=source&fields=date&fields=comment_count&fields=like&channel_fake=suggest&version=999999&appid=web_mixapp&platform=1&distribution=com.yidianzixun
参数中的display是搜索的关键词
请求头:
user-agent:Mozilla/5.0 (Linux; Android 8.1.0; Redmi 5A Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 hap/1.5/xiaomi com.miui.hybrid/1.5.0.1 com.yidian.hybrid.main/1.6.6 ({"packageName":"com.xiaomi.market","type":"other","extra":{}})
content-type:application/json; charset=utf-8
content-length: 2
accept-encoding:gzip
cookie:JSESSIONID=constant-session-1
image.png
============ 旧版搜索(已经不能使用)
搜索界面预览 (请使用chrome的手机模拟)
搜索接口
这个接口返回的是输入框输入之后提示出来的信息,这个其实要比点击搜索之后给出的要好,因为这个里面给出的信息很多。大概结构是这样:
注意到可能提示出不同类型的东西,重点看type,type有5个类型:
- keyword:用户输入的关键词
- sugkwd: suggest keyword
- media: 号主
- user_channel:用户自建频道
- category:可以看成是官方的频道
这里备用一下完整的参数请求,实际上大胆去掉后面两个参数,并不影响我们获取内容。
http://www.yidianzixun.com/home/q/search_channel?word=XXX&appid=web_yidian&_=1555302409064
热搜(10个)
在搜索界面会提示当前的热搜关键词, 接口页面:
热搜接口
http://www.yidianzixun.com/home/q/hot_search_keywords?appid=web_yidian&_=1555306597594
首页推荐
基础url
http://www.yidianzixun.com/home/q/news_list_for_channel
请求参数
channel_id: best
cstart: 10
cend: 20
infinite: true
refresh: 1
__from__: wap
docids: 0LjEONKq,0LatpVAx,V_02ccJplc,0K16WkK2,0Lh5Rowk
_spt: yz~eaodhoy~;:8:
appid: web_yidian
_: 1555308767037
我们不断的下拉,查看异步请求,filter设置为 channel?
然后对比请求发现参数的规律如下
- channel_id: 频道id, 推荐页面为best, 其他页面为数字串
- cstart: 开始页面
- cend: 停止页面
- _spt: 一个略微变化的参数
其他参数都是固定值。所以我们需要追踪_spt这个参数。全局搜索一下_spt,只有一个文件中发现了这个字符串
定位到这个函数中function(e, t, i), 我们给函数打上一堆断点,然后F5刷新页面,稍等一会,页面会加载到断点的位置暂停,我们按F8可以继续执行。然后不断的按下F8,我们可以看到各个变量的值,
执行到59行时:
t.encodeToken = function(e, t, i, n)
这时候拿到channel_id,保存在变量t中,这里拿到的t是best,当然,不同的广场标签对应channel不一样。这个id明文传输在参数中。
继续F8,我们开始进入到第一个循环中,变量o的初始值为sptoken,循环会把arguments中除了第一个字符串全部追加的o的后面,arguments中有四个字符串
image.png
看下这几个字符串都是什么,
- Argument[0] : 资源地址,不用看,这里不需要
- Argument[1]:很好猜,就是channel_id
- Argument[2]:这个不清楚
- Argument[3]:这个不清楚
现在就差后面两个参数,我们不断上划加载数据然后重复F8的过程看看数据的变化:
image.png可以看到后面两个参数就是起止数目,参数中的cstart和cend。于是到此为止,可以说基本破解成功了。我们写个python函数:
def get_spt(channel_id, cstart, gap=10):
"""
Get sptoken for yidian main pain, which is _sp param in request header.
:param start: cstart param in request header.
:param channel_id: channel_id param in request header.
:return: sptoken string
"""
cend = cstart + gap
s = 'sptoken' + str(channel_id) + str(cstart) + str(cend)
spt = ''
for c in s:
tmp = 10 ^ (ord(c))
spt = spt + chr(tmp)
return spt
对比一下网站的参数:
image.png
image.png
搞定!
个人首页
这里有个地方很有意思啊, 该网站对web的访问控制是通过明文参数控制的
#这个里面的文章都会连接到App下载界面
http://www.yidianzixun.com/channel/m596204?appid=&sharedl=0
# 这个就可以点开文章
http://www.yidianzixun.com/channel/m596204
个人首页
然后,链接地址就出现在了对应的标签中。很容易找到。
网友评论