因为最近学了点简单的js逆向,就拿芒果TV练练手 https://www.mgtv.com/
一:分析参数
1.首先打开登陆页面并找到登陆时发起的请求链接
2.经观察所发现,登陆需要这几个参数。其中,account为账号,pwd为密码,vcode为我们所输入的验证码。接下来主要是分析pwd的加密

二:开始调试
1.找到入口函数,当然也可以使用全局搜索或者xhr断点以及事件断点。
2.打上断点以后重新请求一次,发现username为账号,password则为加密后的密码在这里插入图片描述

c = honey.encodePassword©为加密后的密码,honey.encodePassword©为加密函数,参数c为我们输入的密码。
3.鼠标放到函数的上面直接点进去
4.将整个模块复制粘贴下来,删除 honey.def(以及最后的 ),这个时调试后得到的
修改后的代码为芒果TVjs
本地搭建nodejs环境并使用execjs运行本段代码即可
三:使用python请求登录接口
在登录的时候遇到一个问题,后端是怎样识别验证码为本次请求所生成的。经过查询资料,发现何种方式。本网站采用的是在响应的验证码中加入了一个cookie,登陆时候需要带着这个cookie即可访问成功,猜测后端会校验验证码是否为本次cookie生成的。
以下为python代码

import execjs
import requests
def getPwd(passwd):"""加密的密码"""js = """function myPassWd(passwd) {function s(i, t, s) {this.e = c(i),this.d = c(t),this.m = c(s),this.chunkSize = 2 * B(this.m),this.radix = 16,this.barrett = new O(this.m)}encodePassword = function(i) {return e(131),time = String(Date.parse(new Date)).substring(0, 10),rd = String(Math.random()),nonce = String(rd + time + time + rd).substring(0, 32),i = time + nonce + i,function(i, t) {var s = new Array,r = t.length,e = 0;for (; e < r;)s[e] = t.charCodeAt(e),e++;for (; s.length % i.chunkSize != 0;)s[e++] = 0;var g, n, d, u = s.length,o = "";for (e = 0; e < u; e += i.chunkSize) {for (d = new k,g = 0,n = e; n < e + i.chunkSize; ++g)d.digits[g] = s[n++],d.digits[g] += s[n++] << 8;var a = i.barrett.powMod(d, i.e),h = 16 == i.radix ? l(a) : f(a, i.radix);o += h + " "}return o.substring(0, o.length - 1)}(new s("10001", "", "A5245A4630DD7CE9D8A967E33A50EB52C2634FD042C4BFBCF5A5C1317A234FD0D1D2C75D083946AF70CE480C399FAD8EEBE9F5A904F30E4D3C91CDD7C27C4D07E27015D46B29A003E9D49834E19041A7BA45A95E6161697975721E88949E8023DA682895086223683593F054E7AAE0E07C40DB33BD80EE5909CE48D17C07D097"), i)};var r, g, A, o = 16,D = o,E = 65536,b = E >>> 1,M = E * E,C = E - 1;function e(i) {r = new Array(i);for (var t = 0; t < r.length; t++)r[t] = 0;g = new k, (A = new k).digits[0] = 1}e(20);n(1e15);function k(i) {this.digits = "boolean" == typeof i && 1 == i ? null : r.slice(0),this.isNeg = !1}function y(i) {var t = new k(!0);return t.digits = i.digits.slice(0),t.isNeg = i.isNeg,t}function n(i) {var t = new k;t.isNeg = i < 0,i = Math.abs(i);for (var s = 0; 0 < i;)t.digits[s++] = i & C,i = Math.floor(i / E);return t}function d(i) {for (var t = "", s = i.length - 1; - 1 < s; --s)t += i.charAt(s);return t}var u = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");function f(i, t) {var s = new k;s.digits[0] = t;for (var r = L(i, s), e = u[r[1].digits[0]]; 1 == K(r[0], g);)r = L(r[0], s),digit = r[1].digits[0],e += u[r[1].digits[0]];return (i.isNeg ? "-" : "") + d(e)}var a = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f");function h(t) {var s = "";for (i = 0; i < 4; ++i)s += a[15 & t],t >>>= 4;return d(s)}function l(i) {for (var t = "", s = (B(i),B(i)); - 1 < s; --s)t += h(i.digits[s]);return t}function N(i) {return 48 <= i && i <= 57 ? i - 48 : 65 <= i && i <= 90 ? 10 + i - 65 : 97 <= i && i <= 122 ? 10 + i - 97 : 0}function v(i) {for (var t = 0, s = Math.min(i.length, 4), r = 0; r < s; ++r)t <<= 4,t |= N(i.charCodeAt(r));return t}function c(i) {for (var t = new k, s = i.length, r = 0; 0 < s; s -= 4, ++r)t.digits[r] = v(i.substr(Math.max(s - 4, 0), Math.min(s, 4)));return t}function p(i, t) {var s;if (i.isNeg != t.isNeg) t.isNeg = !t.isNeg,s = F(i, t),t.isNeg = !t.isNeg;else {s = new k;for (var r, e = 0, g = 0; g < i.digits.length; ++g)r = i.digits[g] + t.digits[g] + e,s.digits[g] = r % E,e = Number(E <= r);s.isNeg = i.isNeg}return s}function F(i, t) {var s;if (i.isNeg != t.isNeg) t.isNeg = !t.isNeg,s = p(i, t),t.isNeg = !t.isNeg;else {var r, e;s = new k;for (var g = e = 0; g < i.digits.length; ++g)r = i.digits[g] - t.digits[g] + e,s.digits[g] = r % E,s.digits[g] < 0 && (s.digits[g] += E),e = 0 - Number(r < 0);if (-1 == e) {for (g = e = 0; g < i.digits.length; ++g)r = 0 - s.digits[g] + e,s.digits[g] = r % E,s.digits[g] < 0 && (s.digits[g] += E),e = 0 - Number(r < 0);s.isNeg = !i.isNeg} else s.isNeg = i.isNeg}return s}function B(i) {for (var t = i.digits.length - 1; 0 < t && 0 == i.digits[t];)--t;return t}function S(i) {var t, s = B(i),r = i.digits[s],e = (s + 1) * D;for (t = e; e - D < t && 0 == (32768 & r); --t)r <<= 1;return t}function w(i, t) {for (var s, r, e, g = new k, n = B(i), d = B(t), u = 0; u <= d; ++u) {for (s = 0,e = u,j = 0; j <= n; ++j, ++e)r = g.digits[e] + i.digits[j] * t.digits[u] + s,g.digits[e] = r & C,s = r >>> o;g.digits[u + n + 1] = s}return g.isNeg = i.isNeg != t.isNeg,g}function x(i, t) {var s, r, e;result = new k,s = B(i);for (var g = r = 0; g <= s; ++g)e = result.digits[g] + i.digits[g] * t + r,result.digits[g] = e & C,r = e >>> o;return result.digits[1 + s] = r,result}function m(i, t, s, r, e) {for (var g = Math.min(t + e, i.length), n = t, d = r; n < g; ++n, ++d)s[d] = i[n]}var z = new Array(0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535);function q(i, t) {var s = Math.floor(t / D),r = new k;m(i.digits, 0, r.digits, s, r.digits.length - s);for (var e = t % D, g = D - e, n = r.digits.length - 1, d = n - 1; 0 < n; --n, --d)r.digits[n] = r.digits[n] << e & C | (r.digits[d] & z[e]) >>> g;return r.digits[0] = r.digits[n] << e & C,r.isNeg = i.isNeg,r}var P = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535);function G(i, t) {var s = Math.floor(t / D),r = new k;m(i.digits, s, r.digits, 0, i.digits.length - s);for (var e = t % D, g = D - e, n = 0, d = n + 1; n < r.digits.length - 1; ++n, ++d)r.digits[n] = r.digits[n] >>> e | (r.digits[d] & P[e]) << g;return r.digits[r.digits.length - 1] >>>= e,r.isNeg = i.isNeg,r}function H(i, t) {var s = new k;return m(i.digits, 0, s.digits, t, s.digits.length - t),s}function I(i, t) {var s = new k;return m(i.digits, t, s.digits, 0, s.digits.length - t),s}function J(i, t) {var s = new k;return m(i.digits, 0, s.digits, 0, t),s}function K(i, t) {if (i.isNeg != t.isNeg) return 1 - 2 * Number(i.isNeg);for (var s = i.digits.length - 1; 0 <= s; --s)if (i.digits[s] != t.digits[s]) return i.isNeg ? 1 - 2 * Number(i.digits[s] > t.digits[s]) : 1 - 2 * Number(i.digits[s] < t.digits[s]);return 0}function L(i, t) {var s, r, e = S(i),g = S(t),n = t.isNeg;if (e < g) return i.isNeg ? ((s = y(A)).isNeg = !t.isNeg,i.isNeg = !1,t.isNeg = !1,r = F(t, i),i.isNeg = !0,t.isNeg = n) : (s = new k,r = y(i)),new Array(s, r);s = new k,r = i;for (var d = Math.ceil(g / D) - 1, u = 0; t.digits[d] < b;)t = q(t, 1), ++u, ++g,d = Math.ceil(g / D) - 1;r = q(r, u),e += u;for (var o = Math.ceil(e / D) - 1, a = H(t, o - d); - 1 != K(r, a);)++s.digits[o - d],r = F(r, a);for (var h = o; d < h; --h) {var f = h >= r.digits.length ? 0 : r.digits[h],l = h - 1 >= r.digits.length ? 0 : r.digits[h - 1],N = h - 2 >= r.digits.length ? 0 : r.digits[h - 2],v = d >= t.digits.length ? 0 : t.digits[d],c = d - 1 >= t.digits.length ? 0 : t.digits[d - 1];s.digits[h - d - 1] = f == v ? C : Math.floor((f * E + l) / v);for (var w = s.digits[h - d - 1] * (v * E + c), m = f * M + (l * E + N); m < w;)--s.digits[h - d - 1],w = s.digits[h - d - 1] * (v * E | c),m = f * E * E + (l * E + N);(r = F(r, x(a = H(t, h - d - 1), s.digits[h - d - 1]))).isNeg && (r = p(r, a), --s.digits[h - d - 1])}return r = G(r, u),s.isNeg = i.isNeg != n,i.isNeg && (s = n ? p(s, A) : F(s, A),r = F(t = G(t, u), r)),0 == r.digits[0] && 0 == B(r) && (r.isNeg = !1),new Array(s, r)}function O(i) {this.modulus = y(i),this.k = B(this.modulus) + 1;var t, s, r = new k;r.digits[2 * this.k] = 1,this.mu = (t = r,s = this.modulus,L(t, s)[0]),this.bkplus1 = new k,this.bkplus1.digits[this.k + 1] = 1,this.modulo = Q,this.multiplyMod = R,this.powMod = T}function Q(i) {var t = I(w(I(i, this.k - 1), this.mu), this.k + 1),s = F(J(i, this.k + 1), J(w(t, this.modulus), this.k + 1));s.isNeg && (s = p(s, this.bkplus1));for (var r = 0 <= K(s, this.modulus); r;)r = 0 <= K(s = F(s, this.modulus), this.modulus);return s}function R(i, t) {var s = w(i, t);return this.modulo(s)}function T(i, t) {var s = new k;s.digits[0] = 1;for (var r = i, e = t; 0 != (1 & e.digits[0]) && (s = this.multiplyMod(s, r)),0 != (e = G(e, 1)).digits[0] || 0 != B(e);)r = this.multiplyMod(r, r);return s}return encodePassword(passwd)}"""ctx = execjs.compile(js)return ctx.call("myPassWd", passwd)#获取验证码 cookie以及保存到本地
verifyImage = requests.get("https://i.mgtv.com/vcode?from=pcclient")
print(verifyImage.cookies.get_dict())
cookie = [k + "=" + v for k, v in verifyImage.cookies.get_dict().items()]
cookie = '; '.join(item for item in cookie)
print(cookie)
imagePath = r"验证码保存路径"
with open(imagePath, "wb") as f:f.write(verifyImage.content)username = "自己账号"
passwd =  "自己的密码"
#使用ocr识别不准确,暂时使用手动输入验证码,也可以使用第三放平台
verifyImage = input("验证码:")
res = requests.post("https://i.mgtv.com/account/loginVerify", data={"sub": 1, "account": username, "pwd": getPwd(passwd), "vcode": verifyImage, "remember": 1}, headers={"cookie": cookie})
#打印登陆成功后的cookie
print(res.cookies.get_dict())
#打印登陆成功后的数据
print(res.text)

芒果TV登陆爬虫练习相关推荐

  1. 芒果TV——百变大咖秀爬虫与数据可视化

    本期是对芒果TV视频评论的一次爬虫与数据分析,耗时两个晚上,总体来说比较普通,值得注意的一点是时间戳的处理. 爬虫方面:由于芒果的评论数据是封装在json里面,所以只需要找到json文件,对需要的数据 ...

  2. 你一定不知道爬虫js逆向还能登录芒果TV吧!

    前言 最近在捣鼓js这一块的知识,顺便给大家分享一个练手学习的小项目,让自己在多了解一下爬虫的魅力,js逆向登录芒果TV 目标地址 网址:8ec200330de7c741bd39afc56e043e6 ...

  3. Python爬虫实战,requests模块,Python实现抓取芒果TV弹幕

    前言 利用Python实现抓取芒果TV弹幕,废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: requests模块: pandas模块 以及一些Python自带 ...

  4. python爬取乘风破浪的姐姐弹幕--芒果TV爬虫

    不知道大家有木有收看兴风作浪 乘风破浪的姐姐们吖?你最喜欢哪个姐姐呢?看看哪个姐姐最受弹幕欢迎吧 今天(昨天),先把芒果TV的<乘风破浪的姐姐>弹幕爬下来再说 from bs4 impor ...

  5. 用Python爬取B站、腾讯视频、芒果TV和爱奇艺视频弹幕

    众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕.不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列.通过分析弹幕,我们可以快速洞察广大观众对于视频 ...

  6. Win10《芒果TV》更新v3.6.0秋收版:新增追剧磁贴、记忆续播、跳转列表

    x Win10版<芒果TV>v3.6.0于2017年8月11日星期五下午已成功登陆Windows商店 热血青春,唱响革命战歌,<秋收起义>正在芒果TV热播,Win10版< ...

  7. 「芒果TV」叶静涛:芒果TV的Spinnaker多云持续交付实践

    亚太内容分发大会暨CDN峰会一直致力于推动CDN产业深度融合发展和市场普及,现已成为亚太地区影响力最大的内容分发网络盛会.十年来,在以阿里云.网宿科技.腾讯云等亚太CDN产业联盟成员孜孜不辍的努力下, ...

  8. Win10《芒果TV》发布两周年纪念特别献礼,陪你度国庆,好礼送不停

    2015年芒果TV和微软中国联姻,在Windows10发布之际,共同宣告了Win10版<芒果TV>的诞生,第一个版本于2015年9月30日登陆Windows商店,历经28次迭代,现在她两岁 ...

  9. Win10《芒果TV》商店版更新v3.2.4:新增跨年事件直播、电视台直播,新年快乐

    听说半个娱乐圈都来了,<芒果TV>UWP版邀您一起,于2016年12月31日晚,观看<湖南卫视2016·2017跨年演唱会>直播,请更新v3.2.4版,主要新增大事件直播和电视 ...

最新文章

  1. WMI技术介绍和应用——WMI概述
  2. Smobiler实现扫描条码和拍照功能(开发日志八)
  3. 【视频课】如何掌握好深度学习之视频分类与行为识别?这一门课足矣!
  4. 量子计算入门-第一部分
  5. Platform.Uno介绍
  6. NLP哪个细分方向最具社会价值?
  7. python 字典练习 记录学生是否交作业的小程序
  8. vue项目:this.function()中关于:this指针失效的问题
  9. c++获取输入数字的位数/获取位数并且将其存入数组中/获取位数存入数组并且利用它解决实际问题
  10. 疯了!程序员崩溃的40个瞬间!!!
  11. 手机Web 开发中图片img 如何等比例缩放
  12. SpringBoot文件上传异常之提示The temporary upload location xxx is not valid
  13. 西安交大传热学大作业matlab,西安交通大学传热学大作业二维温度场热电比拟实验.doc...
  14. HDOJ 1394 Minimum Inversion Number
  15. c++:template使用中的常见报错
  16. 第五十二篇 仿真电路简单说明multisim12 函数发生器 示波器
  17. 计算机上e盘拒绝访问,e盘拒绝访问怎么办,教你win7系统e盘拒绝访问的应对办法...
  18. Mysql事务隔离级别和锁机制(间隙锁、临建锁)
  19. IDC机房设备变更流程
  20. 软件开发基于JavaScript实现快速转换文本语言

热门文章

  1. C++大型项目中使用hpp和h文件代替cpp
  2. 求求你别再“从入门到放弃了”,贵在坚持
  3. endnote找不到国标_Endnote的PDF附件到底怎么放进去?
  4. 《​国家地理杂志》720P 高清全集 468GB 英语中字 BT下载
  5. 思派健康再次冲刺港股:上半年亏损3.5亿 腾讯为大股东
  6. SAP 内部交易(内部抵消)
  7. c语言服装进货管理系统,C语言服装管理系统
  8. 在模具制造领域的25个常见问题解答
  9. Davinci Configurator Pro -- Davinci Developer
  10. 【图文教你下载电影到电脑里】