最后
不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~
给大家准备的学习资料包括但不限于:
Python 环境、pycharm编辑器/永久激活/翻译插件
python 零基础视频教程
Python 界面开发实战教程
Python 爬虫实战教程
Python 数据分析实战教程
python 游戏开发实战教程
Python 电子书100本
Python 学习路线规划
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
背景介绍
问大家这个版块对于卖家和买家都有很重要的作用。
就买家来说,现在越来越依赖“问大家”作为参考。里面的问题很多都直接指向产品质量和服务质量,从而判断是否值得购买。
但是同时对于卖家来说也直接影响到产品的转化,通过问题和答案可以很好地反映出当前产品的优点和不足,所以做好一板块至关重要。
接口分析
抓包
由于手机tb有链接分享功能,所以可跳过app抓包,直接复制链接到浏览器打开,通过谷歌浏览器开发者工具的帮助可对接口请求进行分析采集。
1、打开手机淘宝,随意浏览个宝贝
2、进入宝贝详情页,进入问大家主页
3、点击分享,复制链接
4、在pc打开页面 得到如下链接
https://web.m.taobao.com/app/mtb/ask-everyone/list?disableNav=YES&refId=39488472991&sourceType=other&suid=0f722e97-817c-4b11-8164-0f38e516a577&ut_sk=1.Xw9%2Frc4Eb0EDAM%2BITeyuscwy_21646297_1646302685667.Copy.ask_detail&un=2284c1b50e41ddbc3911dc70f8aca8ac&share_crt_v=1&un_site=0&spm=a2159r.13376460.0.0&sp_tk=5Lus5Li65Y+v6K+05pyJ5LiN5LiK5b6X5aW954S25Yiw&cpp=1&shareurl=true&short_name=h.fNmGoxI&app=chrome
请求分析
通过谷歌浏览器开发者工具的帮助,发现数据在以下请求中
https://h5api.m.taobao.com/h5/mtop.taobao.social.feed.aggregate/1.0/?jsv=2.4.1&appKey=12574478&t=1646302836315&sign=bd155e6fc120a7cdfba689f7bbf8dc0f&api=mtop.taobao.social.feed.aggregate&v=1.0&ecode=0&timeout=300000&timer=300000&type=jsonp&dataType=jsonp&callback=mtopjsonp2&data=%7B%22pageId%22%3A56301%2C%22env%22%3A1%2C%22bizVersion%22%3A0%2C%22params%22%3A%22%7B%5C%22wdjType%5C%22%3A%5C%221%5C%22%2C%5C%22itemId%5C%22%3A39488472991%7D%22%7D
是个get请求,参数都放在url中,重复请求一些宝贝的问大家内容,发现参数有以下规则
参数分析
通过代码比对发现 t、sign、data 是动态的参数
尝试不带sign参数请求数据发现请求失败了,很明显sign是一个加密参数需要动态计算,所以难点是如何找到sign的生成规则;
sign生成规则
一般说来请求的参数都是js生成,按照这个思路,通过在js资源文件中全局搜索sign及打断点的方式。果不其然,找到了相应的js代码,到目前为止,一切还是挺顺利的
从截图中可以发现
sign是由h()函数生成的,h函数的参数是以下几部分组成
d.token + "&" + i + "&" + g + "&" + c.data
# i 是上面固定参数中的 t,当前的时间戳
# g是上面固定参数中的 appKey
# c.data 是上面固定参数中的data
所以下一步要知道d.token是如何生成的
token的生成规则
还是使用在js资源文件中全局搜索token的方式,发现了相关的js代码
n.prototype.__getTokenFromCookie = function() {
var a = this.options;
return a.CDR && j(y) ? a.token = j(y).split(";")[0] : a.token = a.token || j(z),
a.token && (a.token = a.token.split("_")[0]),
o.resolve()
}
通过对这段js代码分析,发现token原来是从cookie中提取的:
_m_h5_tk=1632671ce1a89f17ac8d06525e4b5226_1555062955474
至此,全部的参数都已经知道生成规则了,接下来可以编写python代码请求数据了。
sign 生成
关于sign的生成公式:
md5Hex(token&t&appKey&data)
如:md5Hex(“645d1f414d4914297dfaab40f3f76016 &1234&4272&{“itemNumId”:“1500011132496”}”)
sign=d2b2f818a03496b296b899a230c03abd
计算js
function get\_sign\_demo(the_params_for_signing) {function t(e, t) {return e << t | e >>> 32 - t
}function n(e, t) {var n, o, i, r, s;return i = 2147483648 & e, r = 2147483648 & t, n = 1073741824 & e, o = 1073741824 & t, s = (1073741823 & e) + (1073741823 & t), n & o ? 2147483648 ^ s ^ i ^ r : n | o ? 1073741824 & s ? 3221225472 ^ s ^ i ^ r : 1073741824 ^ s ^ i ^ r : s ^ i ^ r
}function o(e, t, n) {return e & t | ~e & n
}function i(e, t, n) {return e & n | t & ~n
}function r(e, t, n) {return e ^ t ^ n
}function s(e, t, n) {return t ^ (e | ~n)
}function a(e, i, r, s, a, p, u) {return e = n(e, n(n(o(i, r, s), a), u)), n(t(e, p), i)
}function p(e, o, r, s, a, p, u) {return e = n(e, n(n(i(o, r, s), a), u)), n(t(e, p), o)
}function u(e, o, i, s, a, p, u) {return e = n(e, n(n(r(o, i, s), a), u)), n(t(e, p), o)
}function c(e, o, i, r, a, p, u) {return e = n(e, n(n(s(o, i, r), a), u)), n(t(e, p), o)
}function d(e) {for (var t, n = e.length, o = n + 8, i = (o - o % 64) / 64, r = 16 \* (i + 1), s = new Array(r - 1), a = 0, p = 0; n > p;) {
t = (p - p % 4) / 4, a = p % 4 \* 8, s[t] = s[t] | e.charCodeAt(p) << a, p++
}return t = (p - p % 4) / 4, a = p % 4 \* 8, s[t] = s[t] | 128 << a, s[r - 2] = n << 3, s[r - 1] = n >>> 29, s
}function l(e) {var t, n, o = "",
i = "";for (n = 0; 3 >= n; n++) {
t = e >>> 8 \* n & 255, i = "0" + t.toString(16), o += i.substr(i.length - 2, 2)
}return o
}function f(e) {
e = e.replace(/\r\n/g, "\n");for (var t = "", n = 0; n < e.length; n++) {var o = e.charCodeAt(n);128 > o ? t += String.fromCharCode(o) : o > 127 && 2048 > o ? (t += String.fromCharCode(o >> 6 | 192), t += String.fromCharCode(63 & o | 128)) : (t += String.fromCharCode(o >> 12 | 224), t += String.fromCharCode(o >> 6 & 63 | 128), t += String.fromCharCode(63 & o | 128))
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210511152217670.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poaWd1aWd1,size_16,color_FFFFFF,t_70)
**感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:**
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**