爬虫逆向破解翻译接口参数

这篇具有很好参考价值的文章主要介绍了爬虫逆向破解翻译接口参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python 请求baidu翻译接口:https://fanyi.baidu.com/v2transapi?from=zh&to=en

步骤一: 查找构建请求参数

JS 断点发现如下参数:

w = {
      from: _.fromLang,
      to: _.toLang,
      query: e,
      transtype: i,
      simple_means_flag: 3,
      sign: b(e),
      token: window.common.token,
      domain: k.getCurDomain(),
      ts: +new Date
},

爬虫逆向破解翻译接口参数,Python,JS,爬虫,js,js逆向

 如图所示参数解析出来对应得值。 

from:翻译文字对应语言代码

to:需要翻译语言代码

query:翻译文字

transtype:固定值【realtime】

sign:根据翻译文字设定得动态加密值

simple_means_flag:固定值【3】

token:固定值【85ecac1256c1bc754ad63419393fecbc】

domain:固定值【common】

ts: 时间戳

步骤二: 断点验证请求种加密参数 并找到加密函数

主要逆向解析值为:sign

js文件查找定位到:b函数

            var r = null;
            t.exports = function(t) {
            var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
            if (null === i) {
                var a = t.length;
                a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10)))
            } else {
                for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, u = s.length, l = []; c < u; c++)
                    "" !== s[c] && l.push.apply(l, function(t) {
                        if (Array.isArray(t))
                            return e(t)
                    }(o = s[c].split("")) || function(t) {
                        if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"])
                            return Array.from(t)
                    }(o) || function(t, n) {
                        if (t) {
                            if ("string" == typeof t)
                                return e(t, n);
                            var r = Object.prototype.toString.call(t).slice(8, -1);
                            return "Object" === r && t.constructor && (r = t.constructor.name),
                            "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0
                        }
                    }(o) || function() {
                        throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
                    }()),
                    c !== u - 1 && l.push(i[c]);
                var p = l.length;
                p > 30 && (t = l.slice(0, 10).join("") + l.slice(Math.floor(p / 2) - 5, Math.floor(p / 2) + 5).join("") + l.slice(-10).join(""))
            }
            for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = (null !== r ? r : (r = window[d] || "") || "").split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {
                var _ = t.charCodeAt(v);
                _ < 128 ? g[y++] = _ : (_ < 2048 ? g[y++] = _ >> 6 | 192 : (55296 == (64512 & _) && v + 1 < t.length && 56320 == (64512 & t.charCodeAt(v + 1)) ? (_ = 65536 + ((1023 & _) << 10) + (1023 & t.charCodeAt(++v)),
                g[y++] = _ >> 18 | 240,
                g[y++] = _ >> 12 & 63 | 128) : g[y++] = _ >> 12 | 224,
                g[y++] = _ >> 6 & 63 | 128),
                g[y++] = 63 & _ | 128)
            }
            for (var b = f, w = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), x = 0; x < g.length; x++)
                b = n(b += g[x], w);
            return b = n(b, k),
            (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)),
            "".concat((b %= 1e6).toString(), ".").concat(b ^ f)
        }
    }

步骤三: 补充执行js环境参数

进行JS修补,补充环境之后得到如下代码:


var r = null;
var window = {}
window.gtk = '320305.131321201';

function e(t, e) {
	(null == e || e > t.length) && (e = t.length);
	for (var n = 0, r = new Array(e); n < e; n++)
		r[n] = t[n];
	return r
}

function n(t, e) {
	for (var n = 0; n < e.length - 2; n += 3) {
		var r = e.charAt(n + 2);
		r = "a" <= r ? r.charCodeAt(0) - 87 : Number(r),
		r = "+" === e.charAt(n + 1) ? t >>> r : t << r,
		t = "+" === e.charAt(n) ? t + r & 4294967295 : t ^ r
	}
	return t
}

function a( t ){
	
	var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
	if (null === i) {
		var a = t.length;
		a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10)))
	} else {
		for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, u = s.length, l = []; c < u; c++)
			"" !== s[c] && l.push.apply(l, function(t) {
				if (Array.isArray(t))
					return e(t)
			}(o = s[c].split("")) || function(t) {
				if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"])
					return Array.from(t)
			}(o) || function(t, n) {
				if (t) {
					if ("string" == typeof t)
						return e(t, n);
					var r = Object.prototype.toString.call(t).slice(8, -1);
					return "Object" === r && t.constructor && (r = t.constructor.name),
					"Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0
				}
			}(o) || function() {
				throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
			}()),
			c !== u - 1 && l.push(i[c]);
		var p = l.length;
		p > 30 && (t = l.slice(0, 10).join("") + l.slice(Math.floor(p / 2) - 5, Math.floor(p / 2) + 5).join("") + l.slice(-10).join(""))
	}
	
	for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = (null !== r ? r : (r = window[d] || "") || "").split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {
		var _ = t.charCodeAt(v);
		_ < 128 ? g[y++] = _ : (_ < 2048 ? g[y++] = _ >> 6 | 192 : (55296 == (64512 & _) && v + 1 < t.length && 56320 == (64512 & t.charCodeAt(v + 1)) ? (_ = 65536 + ((1023 & _) << 10) + (1023 & t.charCodeAt(++v)),
		g[y++] = _ >> 18 | 240,
		g[y++] = _ >> 12 & 63 | 128) : g[y++] = _ >> 12 | 224,
		g[y++] = _ >> 6 & 63 | 128),
		g[y++] = 63 & _ | 128)
	}
	
	for (var b = f, w = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), x = 0; x < g.length; x++)
	{
		b = n(b += g[x], w); 
	}
	
	return b = n(b, k),
	(b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)),
	"".concat((b %= 1e6).toString(), ".").concat(b ^ f)
}

将其另存为 getSignEncrypt.js 在node环境下运行可得到加密后参数值【sign】

步骤四: Python 执行js动态得到加密参数

python种执行js需导入模块【execjs】

js_file = "D:/Projects/abc.js"
with open(js_file, "r")as f:
    js_tamp = f.read()

jsDrive = execjs.compile( js_tamp )
sign = jsDrive.call( 'a', trans )

步骤五:发送请求得到翻译后结果集合

 完整请求代码:

import time
import execjs
import requests


trans = input( '请输入要翻译得文案:' )

js_file = "./getSignEncrypt.js"
with open(js_file, "r")as f:
    js_tamp = f.read()

jsDrive = execjs.compile( js_tamp )
sign = jsDrive.call( 'a', trans )

data = {
    "from": "zh",
    "to": "zh",
    "query": trans,
    "simple_means_flag": 3,
    "sign": sign,
    "token": "85ecac1256c1bc754ad63419393fecbc",
    "domain": "common",
    "ts": int( time.time() * 1000 )
}

header = {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "en,zh-CN;q=0.9,zh;q=0.8,ja;q=0.7",
    "Acs-Token": "1704798513422_1704883339706_WWWhQaSrjFtjvNWfXZYiy0mm0b94KOtCcvgpLipfwBwvOR3ETXvhJu4VUqdUbHqNk+wCNxdB7rnwbmJ7lc0uadQCtTsFWetHBUm7VUo71qkSo2G21OFmpjbZ9rhGL4hYgy3PTGUj/ErSbsyYOpl6OQE8PaAC3Sv2HipfGQ6B5z82IO5s9i3sejx6YKrG6ErNb+Uv019WU3giQFegmYk7IUm3CvnhN8nFvPaZwOyoXJzQ8W5JkZyMtFQVX7uoMHchTUvEMmsxDcb/ShDNWVWa+++L2xp+vCAW2+OR8Y2p3xpWDdhp3KEhC/kpGX75VkJARgZ3a4x2IvFWJrDhGtB/KwaPVqxSXr5DgLR9VpTDxKnS2zY/eOfOztMp/HEn1jf4d1LYkYwe01/MGac/mPINHW+N2kTHRpzsnA8u32kNcRsm1+ZGrh2m9tWaDebPF/Njf7yZHm5nwb/eKe0hiv6oBclv3+GXmznmG8Cc+U000Aoq8Zk+R9Ht0Ow7iaUM8RFD",
    "Host": "fanyi.baidu.com",
    "Origin": "https://fanyi.baidu.com",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Referer": "https://fanyi.baidu.com",
    "X-Requested-With": "XMLHttpRequest",
    "Cookie": "REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BIDUPSID=8CD7BC00DC822E5612A2EF9AB4566896; PSTM=1693744950; BAIDUID=8CD7BC00DC822E56741E842C9C5EB981:SL=0:NR=10:FG=1; MCITY=-233%3A; H_WISE_SIDS_BFESS=39712_39841_39902_39819_39909_39934_39936_39933_39943_39941_39938_39930_39732_39997_40009; H_PS_PSSID=39997_40076; H_WISE_SIDS=39997_40076; BAIDUID_BFESS=8CD7BC00DC822E56741E842C9C5EB981:SL=0:NR=10:FG=1; ZFY=haZlWdnMqSuVP8UY3jzqH9yRVGZ9jtY4HRxDOliN:Azw:C; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BA_HECTOR=0k2l85852la120alal20ah8hg1uvbt1ipslhu1s; delPer=0; PSINO=7; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1704247282,1704711563,1704787335,1704883262; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1704883271; ab_sr=1.0.1_ZmVmZmQ1YzkwMTViMzBmNDFlMzgxNzNjZGIxZmUxYjRlNjE5MzZkNjllOWYzMzE5NjRlNGFlMDg3YWRmYjAyYzk0MGNjN2RjOTViOTU3ZTA3OTlkNWRjYTIyMDNhNzEwYTczYWQ3ZTA4MmE2ZTcxNjEyNDNmODgwZmM2ZDA0YzVhNDU5MDMyODg2YWJhYmE5OGEwMzU3MDQyN2QxNzVjYQ==",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'

print( data )
print( header )

resp = requests.post( url, data = data, headers = header )
retData =  resp.json()

print( retData[ 'trans_result'][ 'data' ][0] )

执行代码输出如下:

爬虫逆向破解翻译接口参数,Python,JS,爬虫,js,js逆向文章来源地址https://www.toymoban.com/news/detail-816287.html

到了这里,关于爬虫逆向破解翻译接口参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【爬虫JS逆向-工具篇】浏览器内存漫游加密参数Hook实战教程

    【作者主页】: 吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建

    2024年02月22日
    浏览(52)
  • Python爬虫:抖音 JS XB逆向解析

    哈喽兄弟们,抖音现在有JS加密,以前的方法爬不了饿了,今天来实现一下某音短视频的JS逆向解析。 知识点 动态数据抓包`在这里插入代码片` requests发送请求 X-Bogus 参数逆向 环境模块 python 3.8               运行代码 pycharm 2022.3           辅助敲代码 requests 

    2024年02月08日
    浏览(57)
  • 关于 Python 爬虫 JS 逆向的入门指南

    请注意,这篇指南只是一个概述,为了深入理解和实践,你可能需要额外的学习和实践。         Python 爬虫经常遇到需要逆向 JavaScript 生成的网站内容和逻辑的情况。这种技能对于爬取动态网站,尤其是那些使用了复杂 JS 逻辑和反爬虫技术的网站,尤其重要。 Python 爬虫概

    2024年01月16日
    浏览(44)
  • 【逆向爬虫】Python中执行调用JS的多种方法汇总

    “以前的数据靠买,现在的数据靠爬”,越来越多的学者通过网络爬虫来获取数据。但是做爬虫的人都知道,现在的很多网站都在和我们斗智斗勇,防护普遍越来越好,并且越有价值的网站在这方面越强,哪怕是小一点的网站也多多少少存在一些反爬。而JS逆向又是网络反爬

    2024年02月04日
    浏览(73)
  • JS逆向案例:破解登录密码

    本人不是专业IT人员,但是对python爬虫这块非常感兴趣,在抖音上看了zhen老师的python全栈直播课程,果断选择加入zhen老师的VIP大家庭,给zhen老师投稿发文章还能挣钱, 50元 。 废话不多说,进入主题。最近在学习 JS逆向 方面的知识,由于之前做过12306的自动抢票软件,因此对

    2024年02月05日
    浏览(41)
  • python爬虫之JS逆向基础小案例:网抑云数据获取

    嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 所用软件 解释器: python 3.8 编辑器: pycharm 2022.3 使用的模块 第三方模块: requests 数据请求 execjs pip install pyexecjs 内置模块(无需安装): nodejs 模块安装: win + R 输入cmd 输入安

    2024年01月20日
    浏览(47)
  • Python爬虫:js逆向调式操作及调式中遇到debugger问题

    1. 前言 本篇博客主要讲解js逆向调式操作及调式中遇到debugger问题,内容参考自网上的一些视频讲解结合自己所做过的爬虫测试,觉得小编总结的还不错的读者记得点赞支持一下( 内容仅供学习使用 )。 2. js逆向调式操作 2.1 DOM事件断点 比如虎牙直播登录操作,想快速找到找到

    2024年02月13日
    浏览(48)
  • Python爬虫:利用JS逆向抓取携程网景点评论区图片的下载链接

    1. 前言 文章内容可能存在版权问题,为此,小编不提供相关实现代码,只是从js逆向说一说到底怎样实现这个的过程,希望能够帮助到那些正在做js逆向相关操作的读者,需要代码的读者单独私信我吧!不过,需要注意的是: 代码仅供学习,不能用于商业活动,望读者切记。

    2024年02月15日
    浏览(70)
  • JS逆向解密秀动app(网页接口)实现抢票【python异步请求】

       HI,上一期我出了js逆向解析五邑大学的AES加密实现模拟登录,后台不少人想让我去解析一下秀动app,去实现抢票。我看因此本文就是介绍如何去实现js逆向解析秀动网页端口实现抢票。 (本文拿最近的场:广州姜云升2022巡演) 一.逆向分析过程 首先,我们想要进入下单的

    2024年01月23日
    浏览(42)
  • Python爬虫如何解决提交参数js加密

    注意!!!! 仅做知识储备莫拿去违法乱纪,有问题指出来,纯做笔记记录 由于¥%…………%#%** 所以!@#¥……*……* 啥也不说直接上代码 如何找到这块单独出来的js 代码需要有一定的前端打断点的知识,在这里我就不指出了😅。 草稿箱里很古早的一篇也忘记后面有没有

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包