七麥js破解,python爬取app榜單


原文鏈接:

 

七麥網app榜單鏈接:https://www.qimai.cn/rank

七麥網analysis參數破解請查看妄為寫代碼,鏈接為:https://mp.weixin.qq.com/s/1E_ONUnMwTFozd9-dB70Yw

前言

在此非常感謝【 妄為寫代碼】,我一直都沒有接觸過js混淆這塊,想找個簡單的js混淆學習,也沒有接觸過chrome的斷點調試,通過作者的講解,已經了解了chrome的斷點調試,也學會了使用snippets進行js測試,也了解了打斷點的需要注意的函數,收獲很大,再次感謝。該作者還有其它網站解析的原創文,有幾篇寫的也很好,有需要的朋友可以關注下。

寫這篇意義,1.記錄自己的學習情況;2.在原文的情況下,進一步完善。

問題

原文只分析到,第一頁的情況,獲取了第一頁的analysis,但是如果滾動條往下滾,可以發現analysis是有了新的變化,同時需要以下7個參數,並且你繼續往下滾,每次的analysis都是會變的。
在這里插入圖片描述
查看斷點,發現出現以下函數:
在這里插入圖片描述

解決

其實最終還是要進入到這個函數體里面:
在這里插入圖片描述
紅色框框的代碼是轉折的重點,一步步點擊,你可以看到,這個函數把參數都放進m這個數組里面去了,同時綠色的框框,把m數組進行了排序,生成了一個字符串。可以看出,就是把所有參數合並在一起了。再往下走,你會發現進入了v函數
在這里插入圖片描述
就是原文里面講的v函數。把拼接的參數,先運行一遍v函數,運行完你會發現m變成這個了
在這里插入圖片描述
再往下運行,你會發現,最終的m是這樣
在這里插入圖片描述
獲取到這個m就成功了,后面跟原文一樣,執行v(C(m_str,b_str))就行
這里說一個改動的地方,原文是取了44的長度,這里直接返回整個長度。在這里插入圖片描述
在此附上我所有的代碼

qimai .js

function C(a, n) { // n || (n = s()), a = a["split"](""); for (var t = a["length"], e = n["length"], r = "charCodeAt", i = 0; i < t; i++) a[i] = m(a[i][r](0) ^ n[i % e][r](0)); return a["join"]("") } function m(n) { var t = "fromCharCode"; return String[t](n) } function v(n) { return n_fun(encodeURIComponent(n)["replace"](/%([0-9A-F]{2})/g, function (a, n) { return m("0x" + n) })) } function n_fun(t) { var n; n = e_from(t.toString(), "binary"); return q_fromB(n) } function e_from(t_str, b) { var r = t_str.length; t = new Uint8Array(r); var i = t_write(t, t_str, b, r); return t } function W(t) { for (var e = [], n = 0; n < t.length; ++n) e.push(255 & t.charCodeAt(n)); return e } function K(t, e, n, r) { for (var i = 0; i < r && !(i + n >= e.length || i >= t.length); ++i) e[i + n] = t[i]; return i } function t_write(t, e, b, r) { return K(W(e), t, 0, r) } l = ["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", "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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"] // l = "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,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,0,1,2,3,4,5,6,7,8,9,+,/" // l = l.split(",") function q_fromB(t) { for (var e, n = t.length, r = n % 3, i = "", o = [], a = 16383, u = 0, c = n - r; u < c; u += a) o.push(s(t, u, u + a > c ? c : u + a)); return 1 === r ? (e = t[n - 1], i += l[e >> 2], i += l[e << 4 & 63], i += "==") : 2 === r && (e = (t[n - 2] << 8) + t[n - 1], i += l[e >> 10], i += l[e >> 4 & 63], i += l[e << 2 & 63], i += "="), o.push(i), o.join("") } function s(t, e, n) { for (var r, i = [], o = e; o < n; o += 3) r = (t[o] << 16 & 16711680) + (t[o + 1] << 8 & 65280) + (255 & t[o + 2]), i.push(a(r)); return i.join("") } function a(t) { return l[t >> 18 & 63] + l[t >> 12 & 63] + l[t >> 6 & 63] + l[63 & t] } function get0analysis(synct, params) { // 生成時間戳 var g = new Date() - 1000 * synct; var e = new Date() - g - 1515125653845; var analy = []; var palist = []; for (var key in params) { palist.push(params[key]) } var mm = palist["sort"]()["join"](""); var mmm = v(mm); var m_str0 = mmm + "@#/rank/indexPlus/brand_id/0@#" + e + "@#0"; var m_str1 = mmm + "@#/rank/indexPlus/brand_id/1@#" + e + "@#1"; var m_str2 = mmm + "@#/rank/indexPlus/brand_id/2@#" + e + "@#2"; var b_str = "00000008d78d46a"; var r0 = v(C(m_str0, b_str)); var r1 = v(C(m_str1, b_str)); var r2 = v(C(m_str2, b_str)); analy.push(r0, r1, r2); return analy } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104

qimai. py

import requests, os, execjs, json headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36", "Content-Type": "application/x-www-form-urlencoded", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", } cookies = dict() def getanaly(synct, params): js_path = "%s/qimai.js" % "/".join(os.path.abspath(__file__).split("/")[:-1]) with open(js_path, 'r') as f: js_content = f.read() ctx = execjs.compile(js_content) new_pwd = ctx.call("get0analysis", synct, params) return new_pwd def qimai(): resp = requests.get('https://www.qimai.cn/rank', headers=headers, verify=False) cookies.update(resp.cookies.get_dict()) synct = cookies.get('synct') for i in range(3): params = { 'brand': 'all', 'country': 'cn', 'device': 'iphone', 'genre': '5000', 'date': '2019-04-17', 'page': 2 # 這里寫1也是可以的 } url = "https://api.qimai.cn/rank/indexPlus/brand_id/" + str(i) analy_list = getanaly(synct, params) params['analysis'] = analy_list[i] resp = requests.get(url=url, params=params, headers=headers, verify=False, cookies=cookies) resjson = json.loads(resp.text) contents = resjson['list'] for content in contents: appInfo = content['appInfo'] print(appInfo) if __name__ == '__main__': qimai() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

效果

在這里插入圖片描述

收獲

1.感覺snippets挺好用的,可以脫離項目單獨寫js運行,測試js是否有效。
2.熟練運用這幾個鍵,在這里插入圖片描述
3.最好懂點前端的知識,我最近在看前端,了解到攔截器,看到Promise.resolve,Promise.reject,才知道攔截器的作用和好處
4.要有耐心啊。。。這還是看着前人走過的路走的,要是我自己研究,不知道這繞來繞去的函數會不會把我繞暈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM