php做简单网站教程,全球外贸网,使用flash做网站,PHP做网站的核心是什么目录 〇、引言一、目标二、请求参数分析三、响应分析四、编写爬虫脚本【隧道代理的使用】 〇、引言
无论是学习工作、旅游出行、跨境电商、日常交流以及一些专业领域都离不开翻译工具的支持。本文就带大家通过爬虫的方式开发一款属于自己的翻译工具~
一、目标
如下的翻译接口… 目录 〇、引言一、目标二、请求参数分析三、响应分析四、编写爬虫脚本【隧道代理的使用】 〇、引言
无论是学习工作、旅游出行、跨境电商、日常交流以及一些专业领域都离不开翻译工具的支持。本文就带大家通过爬虫的方式开发一款属于自己的翻译工具~
一、目标
如下的翻译接口 本接口涉及到多种加密以及编码概念没有了解或者不是很熟悉的建议先给 《爬虫工程师必备技术栈——加密解密以及字符编码原理》 这篇文章再仔细看看~ 二、请求参数分析
分析接口对比会发现只有sign和mysticTime是变化的后者也很容易可以看出是13位时间戳。 全局搜索sign可以定位到如下位置 python还原【很简单的加密直接上代码】 ts str(int(time.time() * 1000))str_sign fclientfanyideskwebmysticTime{ts}productwebfanyikeyfsdsogkndfokasodnasosign hashlib.md5((str_sign).encode(utf-8)).hexdigest()三、响应分析 接口的响应是一串乱码所以要来定位到解密位置并用python来还原~ 下断点追到如下是解密的位置 跳进去 t是响应数据是加密过后的上图是js解密逻辑使用的AES解密key和iv都是走的同一加密逻辑而入参o和n都是固定不变的。 跳进y函数 这部分python还原
import hashlib# o -- key ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl
# n -- iv ydsecret://query/iv/ClZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WNbYpJ4key_md5 hashlib.md5((ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl).encode(utf-8)).digest()
iv_md5 hashlib.md5((ydsecret://query/iv/ClZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WNbYpJ4).encode(utf-8)).digest()print(len(key_md5))
print(key_md5)print(len(iv_md5))
print(iv_md5)
整体python还原
from Cryptodome.Cipher import AES
import hashlib
import base64
from Cryptodome.Util.Padding import unpad
import time
import requests
import jsondef decrypt(decrypt_str):key ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHliv ydsecret://query/iv/ClZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WNbYpJ4key_md5 hashlib.md5(key.encode(utf-8)).digest()iv_md5 hashlib.md5(iv.encode(utf-8)).digest()print(key_md5, key_md5)print(iv_md5, iv_md5)aes AES.new(keykey_md5, modeAES.MODE_CBC, iviv_md5)code aes.decrypt(base64.urlsafe_b64decode(decrypt_str))return unpad(code, AES.block_size).decode(utf8)四、编写爬虫脚本【隧道代理的使用】
本脚本完全可以直接CV开一个免费的翻译服务配合使用隧道代理完全可以满足日百万级翻译任务量
关于隧道代理从业这么多年里用过很多家的产品但对比各家的隧道代理价格和实际测试之后这里我比较推荐大家使用青果代理IP
青果代理IP免费体验~
整体使用下来的感受
响应速度快隧道代理池里的IP业务成功率高价格确实很便宜单个IP才0.0014元最重要的一点是可以免费使用任何套餐6小时
知识点补给站 - 隧道代理
隧道代理全球HTTP是利用高性能主机构建的动态代理服务器通过将切换IP的操作放到云端自动管理用户发出的隧道请求实现云端自动切换IP转发用户请求简化用户的操作降低了用户的时间成本隧道代理使用简单开发者接入隧道服务即可如下示例直接集成到程序中极大简化了编程的复杂度。
#codingutf-8
# __author__ 孤寒者
import base64
import hashlib
import json
import timeimport requests
from Cryptodome.Cipher import AES
from Cryptodome.Util.Padding import unpad
from fake_useragent import UserAgentdef generate_proxy():return {http: http://{authkey}:{authpwd}隧道地址,https: http://{authkey}:{authpwd}隧道地址}def generate_sign_and_timestamp():timestamp_13 str(int(time.time() * 1000))str_sign fclientfanyideskwebmysticTime{timestamp_13}productwebfanyikeyfsdsogkndfokasodnasosign hashlib.md5(str_sign.encode(utf-8)).hexdigest()return sign, timestamp_13def generate_ydy_headers():return {Accept: application/json, text/plain, */*,Content-Type: application/x-www-form-urlencoded,Cookie: OUTFOX_SEARCH_USER_ID-66666610.125.88.154; OUTFOX_SEARCH_USER_ID_NCOO1574852965.0963037,Origin: https://fanyi.youdao.com,Referer: https://fanyi.youdao.com/,User-Agent: UserAgent().random,sec-ch-ua: Google Chrome;v119, Chromium;v119, Not?A_Brand;v24,sec-ch-ua-platform: Windows}def decrypt_response(encrypted_str):key ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHliv ydsecret://query/iv/ClZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WNbYpJ4key_md5 hashlib.md5(key.encode(utf-8)).digest()iv_md5 hashlib.md5(iv.encode(utf-8)).digest()aes AES.new(keykey_md5, modeAES.MODE_CBC, iviv_md5)decrypted_data aes.decrypt(base64.urlsafe_b64decode(encrypted_str))return unpad(decrypted_data, AES.block_size).decode(utf-8)def ydy_translate(text, sourceauto, targeten):sign, timestamp_13 generate_sign_and_timestamp()form_data {i: text,from: source,to: target,sign: sign,keyid: webfanyi,client: fanyideskweb,product: webfanyi,appVersion: 1.0.0,vendor: web,pointParam: client,mysticTime,product,mysticTime: timestamp_13,keyfrom: fanyi.web,}response requests.post(urlhttps://dict.youdao.com/webtranslate, headersgenerate_ydy_headers(),dataform_data, proxiesgenerate_proxy())res_dic json.loads(decrypt_response(response.text))# 翻译不了 / 未被识别的语种if res_dic[code] ! 0:return , ydy-translate-failtgt_values_list [result[tgt] for result in res_dic[translateResult][0]]res_data .join(tgt_values_list)source_lang res_dic[type].split(2)[0]return source_lang, res_datawhile True:wait_text input(请输入要翻译的文本)detect_source_lang, trans_result ydy_translate(wait_text)print(f输入文本语言为{detect_source_lang} - 翻译结果{trans_result})