Qt 调用讯飞翻译

 将appid appkey appsecret替换即可,只是简单的调用,自己封装,源代码https://download.csdn.net/download/yonggandess/35319430https://download.csdn.net/download/yonggandess/35319430

#include "dialog.h"
#include "ui_dialog.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QMessageAuthenticationCode>
#include <QMap>
#include <QDateTime>
#include <QDebug>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QEventLoop>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    qDebug()<< getUrl("你好,我是中国人","cn","en");
}

Dialog::~Dialog()
{
    delete ui;
}

QString Dialog::getUrl(const QString &msg,const QString&from,const QString&to )
{
    const QString apisecret = "";
    const QString apikey    = "";
    const QString appid     = "";

    //用小牛翻译还是普通翻译
    bool useniuTrans = true;
    QString trans = useniuTrans ? "ntrans" : "itrans";
    QString ts = useniuTrans ? "ots" : "its";
    QString host = QString("%1.xfyun.cn").arg(trans);
    QString url = QString("https://%1/v2/%2").arg(host).arg(ts);
    QString format = "ddd, dd MMM yyyy HH:mm:ss";
    QLocale loc = QLocale(QLocale::English, QLocale::UnitedStates);
    QDateTime t = QDateTime::currentDateTime();
    QString dateString = loc.toString(t.toUTC(), format) + " GMT";
    QString digest = "SHA-256=";
    QByteArray hash256Base64 = QCryptographicHash::hash(getJson(msg,from,to,appid).toUtf8(),QCryptographicHash::Sha256).toBase64();
    digest += hash256Base64;

    QString signature_origin = "host: " + host + "\n";
    signature_origin += "date: " + dateString + "\n";
    signature_origin += "POST " + QString("/v2/%1 ").arg(ts) + "HTTP/1.1" + "\n";
    signature_origin += "digest: " + digest;

    QByteArray s_o = NULL, api = NULL;
    QByteArray signature = QMessageAuthenticationCode::hash(s_o.append(signature_origin),
                                                            api.append(apisecret), QCryptographicHash::Sha256).toBase64();


    //签名信息
    QString authorization = "api_key=\"";
    authorization += apikey + "\"";
    authorization += ",algorithm=";
    authorization += "\"hmac-sha256\"";
    authorization += ",headers=";
    authorization += "\"host date request-line digest\"";
    authorization += ",signature=\"";
    authorization += signature + "\"";

    QList<QPair<QString, QString>> formData;
    formData.append(QPair<QString,QString>{"Content-Type","application/json"});
    formData.append(QPair<QString,QString>{"Accept","application/json,version=1.0"});
    formData.append(QPair<QString,QString>{"Host",QString("%1.xfyun.cn").arg(trans)});
    formData.append(QPair<QString,QString>{"Date",dateString});
    formData.append(QPair<QString,QString>{"Digest",digest});

    formData.append(QPair<QString,QString>{"Authorization",authorization});
    QString result;

    QByteArray body_ = getJson(msg,from,to,appid).toUtf8();

    //post
    QByteArray  responseData = this->post(url,formData,body_);

    //json解析

    QString res_;
    QJsonObject root =  QJsonDocument::fromJson(responseData).object();
    int code = root.value("code").toInt();
    if(0 == code) {
        QJsonObject dataObj = root.value("data").toObject();
        QJsonObject resultObj = dataObj.value("result").toObject();
        res_ = resultObj.value("trans_result").toObject().value("dst").toString();
    }else{
        qDebug()<<"ifly trans error!";
    }

    return res_;
}

QString Dialog::getJson(const QString &msg, const QString &from, const QString &to,const QString&appid)
{
    //common
    QJsonObject commonObj;
    commonObj.insert("app_id",appid);

    //business
    QJsonObject businessObj;
    businessObj.insert("from",from);
    businessObj.insert("to",to);
    //data
    QJsonObject dataobj;

    dataobj.insert("text",QString(msg.toUtf8().toBase64()));

    QJsonObject obj;
    obj.insert("common",QJsonValue(commonObj));
    obj.insert("business",QJsonValue(businessObj));
    obj.insert("data",QJsonValue(dataobj));
    return QString(QJsonDocument(obj).toJson()).simplified();
}

QByteArray Dialog::post(const QString &url, QList<QPair<QString, QString>> header, const QByteArray &body)
{
    QUrl url_(url);
    QNetworkRequest request(url_);

    for(auto item : header)
        request.setRawHeader(item.first.toUtf8(),item.second.toUtf8());

    QNetworkAccessManager manager;
    QNetworkReply* reply = manager.post(request,body);
    QEventLoop loop;

    connect(reply,&QNetworkReply::finished,&loop,&QEventLoop::quit);

    loop.exec();
    QByteArray responseData = reply->readAll();

    delete reply;reply = nullptr;

    return responseData;
}

Guess you like

Origin blog.csdn.net/yonggandess/article/details/121028867
Recommended