1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java有道翻译_java实现有道翻译爬虫

java有道翻译_java实现有道翻译爬虫

时间:2023-08-11 14:17:03

相关推荐

java有道翻译_java实现有道翻译爬虫

我的博文地址

使用的库

mons-codec

主要是为了加密,可以直接用java原生的,这里偷懒了,有点大才小用的感觉。

2.requests-5.0.7

大佬写的java 类似python的requests库

和python的requests用法差不多。

3.fastjson

主要为了解析json字符串,没有要求。

4.实现

实现在上面博文里说的很详细,有道翻译的加密基本没改,唯一修改的就是字符串D: n%A-rKaT5fb[Gy?;N5@Tj

这里主要贴java代码

先引入需要的依赖。

net.dongliu

requests

5.0.7

commons-codec

commons-codec

1.13

com.alibaba

fastjson

1.2.47

然后是主要的实现类

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 mons.codec.digest.DigestUtils;

import net.dongliu.requests.Requests;

public class Fanyi {

private String msg;

private String url="/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 header;

private Map params;

public Fanyi()

{

params=new HashMap();

header=new HashMap();

}

private Map 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 header)

{

this.header=header;

}

public Map getHeaders()

{

if(this.header.get("Referer")==null)

{

this.header.put("Referer", "/");

}

return this.header;

}

public void setUserAgent(String UA)

{

this.header.put("User-Agent", UA);

//设置UserAgent

String cookie=Requests.get("").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, 没有问题,完成。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。