首页 > 其他分享 >JS 逆向

JS 逆向

时间:2024-06-07 16:58:06浏览次数:19  
标签:逆向 index self list JS import font response

# -*- coding:utf-8 -*-
# 字体文件处理网站: https://font.qqe2.com/index-en.html
"""
任务:
    先处理字体文件
        从他的请求当中获取到当前请求附带的字体文件

    爬虫每次运行,获取的数据都是最新的--获取最新的请求--获取最新的字体文件

    固定的请求参数会过期
        1、时间戳
        2、index怎么来的
        3、signkey
            md5加密后的结果

    网页数据每次变动(请求了一下)
        1、每次都会出现一个新的请求,请求当中会生产一个signkey
        2、如果刚刚的signKey: f是生成signkey的代码:
            在这个位置打上断点
            浏览器在下一次请求的时候会执行signKey: f
                当执行到这段代码

    signkey后面的值就是 f
    f又是什么?

"""
import io
import re
import json
import time
import random
import hashlib
# pip install ddddocr
import ddddocr
import requests
# pip install pillow==9.4.0
from PIL import Image, ImageDraw, ImageFont
from urllib.parse import urlencode
# pip install fonttools
from fontTools.ttLib import TTFont
class Movie_Data(object):
    def __init__(self):
        self.ocr = ddddocr.DdddOcr()
        self.url = "https://piaofang.maoyan.com/dashboard-ajax?"
        self.timestamp = int(time.time()*1000)
        self.index = int(1000 * random.random() + 1)
        self.content = f"method=GET&timeStamp={self.timestamp}&User-Agent=TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEyNC4wLjAuMCBTYWZhcmkvNTM3LjM2IEVkZy8xMjQuMC4wLjA=&index={self.index}&channelId=40009&sVersion=2&key=A013F70DB97834C0A5492378BD76C53A"
        self.signkey = hashlib.md5(self.content.encode()).hexdigest()
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
        }

    def parse_data_index(self):
        params = {
            "orderType": "0",
            "uuid": "18affa452e4c8-057e2dc1cfbe0c-78505771-384000-18affa452e55",
            "timeStamp": self.timestamp,
            "User-Agent": "TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEyNC4wLjAuMCBTYWZhcmkvNTM3LjM2IEVkZy8xMjQuMC4wLjA=",
            "index": self.index,
            "channelId": "40009",
            "sVersion": "2",
            "signKey": self.signkey
        }

        url = self.url + urlencode(params)
        response = requests.get(url, headers=self.headers)
        return response.text

    def get_font_index(self, response):
        dict_data = json.loads(response)["fontStyle"]
        font_url = "https:" + re.search(r'opentype"\),url\("(.*?)"\);}',dict_data).group(1)
        resp = requests.get(font_url)
        with open("movie.woff", "wb") as file:
            file.write(resp.content)
        tfont = TTFont("movie.woff")
        font_list = tfont.getGlyphOrder()[2:]
        return font_list

    def parse_font_index(self, font_list):
        charlist = []
        # 加载字体文件
        font = ImageFont.truetype("movie.woff", 40)
        for uchar in font_list:
            uniknow_char = f"\\u{uchar[3:]}".encode().decode("unicode_escape")
            im = Image.new(mode="RGB", size=(42, 40), color="white")
            draw = ImageDraw.Draw(im=im)
            draw.text(xy=(0, 0), text=uniknow_char, fill=0, font=font)
            img_byte = io.BytesIO()
            im.save(img_byte, format="JPEG")
            charlist.append(self.ocr.classification(img_byte.getvalue()))
        return charlist

    def font_replace(self, response, old_font_list, new_font_list):
        font_dict = {}
        for font in list(zip(new_font_list, old_font_list)):
            font_dict[font[0]] = font[1].lower()
        resp = response.replace("&#x", "uni").replace(";","")
        for num, code in font_dict.items():
            resp = re.sub(code, str(num), resp)
        data_list = json.loads(resp)["movieList"]["data"]["list"]
        for data in data_list:
            title = data["movieInfo"]["movieName"]
            price = data["boxSplitUnit"]["num"]
            print(f"电影名称---{title}, 电影票房---{price}")


    def main(self):
        response = self.parse_data_index()
        old_font_list = self.get_font_index(response)
        # print(f"识别之前:{old_font_list}")
        new_font_list = self.parse_font_index(old_font_list)
        # print(f"识别之后:{new_font_list}")
        self.font_replace(response=response, old_font_list=old_font_list, new_font_list=new_font_list)

if __name__ == '__main__':
    movie = Movie_Data()
    movie.main()




标签:逆向,index,self,list,JS,import,font,response
From: https://www.cnblogs.com/tudoot/p/18237488

相关文章

  • js
    特点不完善有很多默认遵守的规则语法注释://空*#单行注释/**/#多行注释书写位置1.<head><script>第一种位置</script></head><body>2.第二种位置body底部</body>3.直接写一个js脚本,引入<scriptsrc=''>第三种方式</script&......
  • web开发者必备:用nvm-windows优雅地使用多个版本的Node.js 附下载链接
    一、为什么要安装多个版本的node.js现在开发前端项目,有的需要node.js版本是18以上的,或者其他版本,然而电脑上安装的是v16,直接升级到18,又怕影响老项目,最好的办法就是安装多个版本,需要哪个切换一下就行。网上有一些安装多个版本node.js的做法,很麻烦。推荐nvm这个工具,很方便。nvm全......
  • vue+cesium+heatmap.js 实现热力图
    效果如下图:1.安装heatmap.jsnpmi heatmap.js官网:heatmap.js:DynamicHeatmapsfortheWeb(patrick-wied.at)2.把这两个文件放到项目里heatmap.jsimportutilfrom"./util"importh337from'heatmap.js'/***@description二维热力图类,基于h337类扩展*@......
  • 学习前端3DThreejs一篇就够了,从入门到实战
    vue安装three.jsnpminstall--savethree引入three.jsimport*asTHREEfrom'three'three.js结构### three.js坐标创建一个场景scene场景,camera相机,renderer渲染器创建一个场景this.scene=newTHREE.Scene()创建一个透视摄像机this.camera=newTHR......
  • HTML5+CSS3+JS小实例:网格图库
    实例:网格图库技术栈:HTML+CSS+JS效果:源码:【HTML】<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">......
  • Navicat生成ER关系图 逆向数据库到模型
    选中表格右击  点击右下角的按钮切换到ER视图:  那些表与表之间相连接的就是外键,这个应该没问题。然后,我想到我要给领导汇报一下我的工作情况呀,直接截图截不完整不说,还很模糊。所以我想,会不会有什么办法可以将得到的关系图导出成pdf或者图片格式的文件呢?找了一会儿,发现......
  • 【JS封装-数组操作】强化编程实践:精选JavaScript函数封装集锦-关于数组操作(数组去重、
    目录数组去重数组快速排序过滤数组映射数组数组扁平化数组求和数组最大值数组最小值数组切片数组乱序(洗牌算法)数组去重/***去除数组中的重复项。*@param{Array}array要去重的数组。*@returns{Array}去重后的数组。*/functionuniqueArray(array......
  • Three.js入门指南:从基础到实践的三维渲染之旅
    threejs相关资料threejs官网threejs案例安装(Installation)使用NPM和构建工具进行安装对于大多数用户而已,从npm包注册表中心安装并使用构建工具会是一个更推荐的方案。因为项目需要的依赖越多,就越有可能遇到静态托管无法轻易解决的问题。而使用构建工具,导入本地J......
  • 前端 JS 经典:阿里云文件上传思路
    前言:功能点概括:1、多选文件2、选择文件夹3、拖拽4、选择后形成一个列表,列表里有一些信息5、有进度条6、控制并发数7、可取消8、展示统计信息1.交互实现交互的目标是要拿到file对象。只要拿到file对象,就能通过网络上传。1.1如何选择多文件给input添加multip......
  • 微前端学习笔记(5):从import-html-entry发微DOM/JS/CSS隔离
    import-html-entry 是qiankun中一个举足轻重的依赖,用于获取子应用的HTML和JS,同时对HTML和JS进行了各自的处理,以便于子应用在父应用中加载。 import-html-entry主要是实现了以下几个能力拉取url对应的html并且对html进行了一系列的处理拉取上述html中所......