我的博文地址
https://www.cnblogs.com/lingdurebing/p/11618902.html
使用的库
1.commons-codec
主要是为了加密,可以直接用java原生的,这里偷懒了,有点大才小用的感觉。
2.requests-5.0.7
大佬写的java 类似python的requests库
github地址:https://github.com/zhangjingpu/requests
和python的requests用法差不多。
3.fastjson
主要为了解析json字符串,没有要求。
4.实现
实现在上面博文里说的很详细,有道翻译的加密基本没改,唯一修改的就是字符串D: n%A-rKaT5fb[Gy?;N5@Tj
这里主要贴java代码
先引入需要的依赖。
<dependency> <groupId>net.dongliu</groupId> <artifactId>requests</artifactId> <version>5.0.7</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
然后是主要的实现类
import java.io.IOException; package com.yang.easySpider; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.apache.commons.codec.digest.DigestUtils; import net.dongliu.requests.Requests; public class Fanyi { private String msg; private String url="http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"; private String D="n%A-rKaT5fb[Gy?;N5@Tj"; private String bv; private String salt; private String sign; private String ts; private Map<String,Object> header; private Map<String,Object> params; public Fanyi() { params=new HashMap<String,Object>(); header=new HashMap<String,Object>(); } private Map<String,Object> getParams(String msg) { params.put("i", setMsg(msg));//设置msg同时更新ts,salt,sign; params.put("from","AUTO"); params.put("to","AUTO"); params.put("smartresult","dict"); params.put("client","fanyideskweb"); params.put("sign",this.sign); params.put("bv",this.bv); params.put("ts",this.ts); params.put("salt",this.salt); params.put("doctype","json"); params.put("version", "2.1"); params.put("keyfrom", "fanyi.web"); params.put("action", "FY_BY_REALTlME"); return params; } public String getResult(String msg) { return Requests.post(url).headers(getHeaders()).body(getParams(msg)).send().readToText(); //得到json格式的文本 } public void setHeaders(Map<String,Object> header) { this.header=header; } public Map<String,Object> getHeaders() { if(this.header.get("Referer")==null) { this.header.put("Referer", "http://fanyi.youdao.com/"); } return this.header; } public void setUserAgent(String UA) { this.header.put("User-Agent", UA); //设置UserAgent String cookie=Requests.get("http://fanyi.youdao.com").headers(this.header).send().getHeader("Set-Cookie").split(";")[0]+";"; //得到Cookie //设置Cookie this.header.put("Cookie", cookie); this.bv=getBv(UA);//设置UA的同时要更新bv,因为bv是通过加密UA得到的。 } private String getSalt() { this.salt=String.valueOf(this.ts)+String.valueOf(((int)Math.random()*10)); return this.salt; } private String getSign() { return getMd5("fanyideskweb"+this.msg+this.salt+this.D); } private String getTs() { return String.valueOf(System.currentTimeMillis()); } private String getBv(String UserAgent) { return getMd5(UserAgent); } private String getMd5(String val) { return DigestUtils.md5Hex(val); } public String setMsg(String msg) { this.msg=msg; //设置需要翻译的内容 this.ts=getTs();//更新ts this.salt=getSalt();//更新salt //设置翻译内容的同时更新ts,salt this.sign=getSign(); //有了翻译内容,salt才能得到sign,网易主要靠此判断 return this.msg; } }
测试一下
public static void main( String[] args ) { Fanyi fanyi=new Fanyi(); fanyi.setUserAgent("Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"); String st=fanyi.getResult("hello"); System.out.print(st); JSONObject json=JSONObject.parseObject(st); JSONArray ja=(JSONArray) ((JSONArray) json.get("translateResult")).get(0); JSONObject js=(JSONObject) ja.get(0); System.out.print(js.get("tgt")); }
Ok, 没有问题,完成。
参考博文连接地址:https://blog.csdn.net/suixinlun/article/details/93976400