Implémentation d'un SDK de Traduction Baidu en Java

Dans le cadre d'un projet de construction logicielle, j'ai avancé sur la première expérience : l'implémentation d'un SDK de traduction Baidu. Voici les étapes pricnipales et le code associé.

Tâches de l'expérience

  1. Configuration de l'environnement et des librairies Java (10%)
  2. Compréhension des fonctionnalités de traduction Baidu : traduction générale et traduction dictionnaire (20%)
  3. Implémentation et test du noyau de traduction : chinois vers anglais et anglais vers chinois (30%)
  4. Ajout d'une interface graphique (GUI) pour les mêmes fonctionnalités (30%)
  5. Rapport d'expérience (10%)

Le code ci-dessous montre deux classes principales : TransSDK pour l'appel API via OkHttp et Jackson, et TransApi pour une alternative utilisant la signature MD5.

Classe TransSDK (avec OkHttp et Jackson)

package com.mes.util;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
import org.json.JSONObject;
import java.io.IOException;

public class TransSDK {
    public static final String API_KEY = "uuuuuuuuuuuuuuuuu";
    public static final String SECRET_KEY = "uyuuuuuuuuuuuuuuuuuuuuu";
    static final OkHttpClient CLIENT = new OkHttpClient.Builder().build();

    private static String fetchAccessToken() throws IOException {
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        String bodyContent = "grant_type=client_credentials&client_id=" + API_KEY
                + "&client_secret=" + SECRET_KEY;
        RequestBody body = RequestBody.create(mediaType, bodyContent);
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/oauth/2.0/token")
                .post(body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();
        try (Response response = CLIENT.newCall(request).execute()) {
            JSONObject json = new JSONObject(response.body().string());
            return json.getString("access_token");
        }
    }

    public static String translate(String text, String sourceLang, String targetLang) throws IOException {
        String accessToken = fetchAccessToken();
        MediaType mediaType = MediaType.parse("application/json");
        String jsonPayload = String.format(
            "{\"from\":\"%s\",\"to\":\"%s\",\"q\":\"%s\"}",
            sourceLang, targetLang, text
        );
        RequestBody body = RequestBody.create(mediaType, jsonPayload);
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token=" + accessToken)
                .post(body)
                .addHeader("Content-Type", "application/json")
                .addHeader("Accept", "application/json")
                .build();
        try (Response response = CLIENT.newCall(request).execute()) {
            String jsonResponse = response.body().string();
            ObjectMapper mapper = new ObjectMapper();
            JsonNode root = mapper.readTree(jsonResponse);
            return root.path("result").path("trans_result").get(0).path("dst").asText();
        } catch (IOException e) {
            e.printStackTrace();
            return "Erreur lors de la traduction";
        }
    }
}

Classe TransApi (avec signature MD5)

package com.mes.util;

import java.util.HashMap;
import java.util.Map;

public class TransApi {
    private static final String API_BASE = "https://fanyi-api.baidu.com/api/trans/vip/translate";

    private String appId;
    private String secretKey;

    public TransApi(String appId, String secretKey) {
        this.appId = appId;
        this.secretKey = secretKey;
    }

    public String getTranslation(String query, String from, String to) {
        Map<String, String> params = buildParameters(query, from, to);
        return HttpGet.get(API_BASE, params);
    }

    private Map<String, String> buildParameters(String query, String from, String to) {
        Map<String, String> params = new HashMap<>();
        params.put("q", query);
        params.put("from", from);
        params.put("to", to);
        params.put("appid", appId);

        // Génération d'un sel aléatoire
        String salt = String.valueOf(System.currentTimeMillis());
        params.put("salt", salt);

        // Construction du hash MD5
        String signatureSource = appId + query + salt + secretKey;
        params.put("sign", MD5.md5(signatureSource));

        return params;
    }
}

Ces classes offrent deux approches pour intégrer la traduction automatique Baidu. La première utilise un token d'accès OAuth, tandis que la seconde repose sur une signature contenue dans les paramètres de la requête.

Étiquettes: Java SDK Baidu traduction OkHttp

Publié le 18 juillet à 03h40