2.requests-5.0.7
大佬写的java 类似python的requests库
github地址:
https://github.com/zhangjingpu/requests
和python的requests用法差不多。
3.fastjson
主要为了解析json字符串,没有要求。
实现在上面博文里说的很详细,有道翻译的加密基本没改,唯一修改的就是字符串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"));