Api-Schnittstelle zu Deepl-Übersetzer

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Api-Schnittstelle zu Deepl-Übersetzer

    Hallo,

    ich bastel unter Visual Studio 2015 Express mit Visual Basic in meinem Programm an einem automatischen Übersetzungstool, dass Datensätze aus einer Datenbank automatisch durch Deepl.com übersetzen soll. Die entsprechende Api und den Auth-Key habe ich. Egal was ich versuche, ich fliege immer mit ner Fehlermeldung raus.

    VB.NET-Quellcode

    1. Dim url As String = "https://api.deepl.com/v2/translate?auth_key=mein_api_key&text=Uhr&target_lang=de"
    2. Try
    3. Dim myRequest As Net.HttpWebRequest = DirectCast(Net.WebRequest.Create(url), Net.HttpWebRequest)
    4. Dim myResponse As WebResponse = myRequest.GetResponse()
    5. Catch ex As WebException
    6. MsgBox(ex.ToString)
    7. End Try


    Im Chrome gibt er mir bei Eingabe der URL die richtige Übersetzung von Uhr in einer XML raus. IN VB kommt immer folgende Fehlermeldung:

    System.Net.WebException: Die zugrunde liegende Verbindung wurde geschlossen. Unerwarteter Fehler beim Senden. System.IO.IOException: Fehler bei Authentifizierung, da die Gegenstelle den Transportstream geschlossen hat....

    Die Api-Seite zeigt mir folgenden HTTP-Request

    POST /v2/translate?auth_key=mein_api_key> HTTP/1.0
    Host: api.deepl.com
    User-Agent: YourApp
    Accept: */*
    Content-Length: 54
    Content-Type: application/x-www-form-urlencoded

    auth_key=mein_api-key&text=Hello, world&target_lang=DE

    Irgendwie bin ich aber zu blöd diesen Code in mein VB einzubauen. Kann mir von euch jemand einen Denkanstoß geben?

    Dankeschön auf jeden Fall.

    :)
    Danke. Habe das jetzt mal wie folgt umgebaut, der Fehler kommt aber immer noch.

    VB.NET-Quellcode

    1. Dim url As String = "https://api.deepl.com/v2/translate?auth_key=mein_api_key&text=Uhr&target_lang=de"
    2. Try
    3. Dim Container As CookieContainer = New CookieContainer
    4. Dim Request As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
    5. Request.Method = "POST"
    6. Request.Host = "api.deepl.com"
    7. Request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
    8. Request.ContentType = "application/x-www-form-urlencoded"
    9. Request.CookieContainer = Container
    10. Request.Accept = "*/*"
    11. Dim Post As String = url
    12. Dim byteArray() As Byte = Encoding.UTF8.GetBytes(url)
    13. Request.ContentLength = byteArray.Length
    14. Dim DataStream As Stream = Request.GetRequestStream()
    15. DataStream.Write(byteArray, 0, byteArray.Length)
    16. DataStream.Close()
    17. Dim Response As HttpWebResponse = CType(Request.GetResponse(), HttpWebResponse)
    18. DataStream = Response.GetResponseStream()
    19. Dim reader As New StreamReader(DataStream)
    20. Dim ServerResponse As String = reader.ReadToEnd()
    21. reader.Close()
    22. DataStream.Close()
    23. Response.Close()
    24. Catch ex As WebException
    25. MsgBox(ex.ToString)
    26. End Try
    Danke. Aber auch hier komme ich nicht weiter. Deepl gibt mir ja

    POST /v2/translate?auth_key=mein_api_key> HTTP/1.0
    Host: api.deepl.com
    User-Agent: YourApp
    Accept: */*
    Content-Length: 54
    Content-Type: application/x-www-form-urlencoded
    auth_key=mein_api-key&text=Hello, world&target_lang=DE

    vor. Bis auf die erste (POST...) und letzte Zeile (auth_key...) krieg ich auch alles hin. Wie muss ich denn diese Zeilen einbauen? Oder was kommt in meine Variable URL?
    Die Adresse sollte https://api.deepl.com/v2/translate sein.

    Wie du die Daten in die Anfrage bekommst ist auf der verlinkten Seite zu sehen. Da ist ein Beispielcode.

    von der Seite kopiert:

    C#-Quellcode

    1. WebRequest request = WebRequest.Create("http://www.contoso.com/PostAccepter.aspx ");
    2. // Set the Method property of the request to POST.
    3. request.Method = "POST";
    4. // Create POST data and convert it to a byte array.
    5. string postData = "This is a test that posts this string to a Web server.";
    6. byte[] byteArray = Encoding.UTF8.GetBytes(postData);
    7. // Set the ContentType property of the WebRequest.
    8. request.ContentType = "application/x-www-form-urlencoded";
    9. // Set the ContentLength property of the WebRequest.
    10. request.ContentLength = byteArray.Length;
    11. // Get the request stream.
    12. Stream dataStream = request.GetRequestStream();
    13. // Write the data to the request stream.
    14. dataStream.Write(byteArray, 0, byteArray.Length);
    15. // Close the Stream object.
    16. dataStream.Close();
    17. // Get the response.
    18. WebResponse response = request.GetResponse();
    Danke, aber auch wenn ich das so umsetzte erfolgt die gleiche Fehlermeldung

    VB.NET-Quellcode

    1. Try
    2. Dim Request As HttpWebRequest = CType(WebRequest.Create("https://api.deepl.com/v2/translate"), HttpWebRequest)
    3. Request.Method = "POST"
    4. Dim postData As String = "?auth_key=mein_api_key&text=Briefmarken&target_lang=en"
    5. Dim byteArray() As Byte = Encoding.UTF8.GetBytes(url)
    6. Request.ContentType = "application/x-www-form-urlencoded"
    7. Request.ContentLength = byteArray.Length
    8. Dim DataStream As Stream = Request.GetRequestStream()
    9. DataStream.Write(byteArray, 0, byteArray.Length)
    10. DataStream.Close()
    11. Dim Response As HttpWebResponse = CType(Request.GetResponse(), HttpWebResponse)
    12. Catch ex As WebException
    13. MsgBox(ex.ToString)
    14. End Try


    Wo habe ich denn jetzt den Bock geschossen?

    slice schrieb:

    Die API erwartet einen POST-Request, das was du da versuchst ist eher ein GET.


    Hab mal in die Doku geschaut, sowohl GET wie auch POST ist akzeptiert. Wobei POST empfohlen ist.

    @amdus
    Versuch mal das, so bekomme ich eine Exception, wgen HTTP Status 403(forbidden) vermutlich weil ich einen falschen Key verwendet hab.

    VB.NET-Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Private WithEvents WC As WebClient
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Dim url As String = "https://api.deepl.com/v2/translate"
    6. Dim args As String = "auth_key=mein_api_key&text=Briefmarken&target_lang=en"
    7. WC = New WebClient
    8. WC.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
    9. WC.UploadStringAsync(New Uri(url), args)
    10. End Sub
    11. Private Sub WC_UploadStringCompleted(sender As Object, e As UploadStringCompletedEventArgs) Handles WC.UploadStringCompleted
    12. If e.Error Is Nothing Then
    13. Debug.WriteLine(e.Result)
    14. Else
    15. Throw New Exception(e.Error.Message)
    16. End If
    17. End Sub
    18. End Class


    amdus schrieb:

    Wo habe ich denn jetzt den Bock geschossen?


    Vermutlich wegen des ? in postData als ersten Char, braucht man beim POST nicht, beim GET bedeutet das, nach dem ? beginnt das erste Argument, nach jedem & ein weiteres. Der rest der Verkettung mit dem & ist OK.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Takafusa“ ()

    amdus schrieb:

    Wo habe ich denn jetzt den Bock geschossen?


    Vermutlich wegen des ? in postData als ersten Char, braucht man beim POST nicht, beim GET bedeutet das, nach dem ? beginnt das erste Argument, nach jedem & ein weiteres. Der rest der Verkettung mit dem & ist OK.
    [/quote]

    Danke, aber am ? lag es nicht. Den anderen Quelltext versuche ich auch gerne, muss den erstmal in Visual Basic übersetzen...

    amdus schrieb:

    muss den erstmal in Visual Basic übersetzen...


    Ob du das nun mit WebClient oder WebRequest oder HttpWebRequest machst ist egal, mach einfach mal ein neues leeres VB Projekt und versuche meinen Code. Füge aber deinen ApiKey ein. Ich bekam eine 403 für "forbidden", hab ja auch kein recht auf die Daten ohne richtigen APi-Key. Wenn ich nicht falsch liege wird es funktionieren.

    Takafusa schrieb:

    amdus schrieb:

    muss den erstmal in Visual Basic übersetzen...


    Ob du das nun mit WebClient oder WebRequest oder HttpWebRequest machst ist egal, mach einfach mal ein neues leeres VB Projekt und versuche meinen Code. Füge aber deinen ApiKey ein. Ich bekam eine 403 für "forbidden", hab ja auch kein recht auf die Daten ohne richtigen APi-Key. Wenn ich nicht falsch liege wird es funktionieren.


    Danke, werde ich morgen machen und dann Bescheid geben. Für heute raucht mir der Kopf...
    Habe das jetzt mal ausprobiert, so wie du sagtest, auch mit dem richtigen Auth_key. Trotzdem kommt der Fehler

    Eine Ausnahme vom Typ "System.Exception" ist in Test_VB.exe aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.
    Zusätzliche Informationen: Die zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden..
    Statt zu raten.. Sag uns doch mal was die Fehlermeldung sagt bei welcher Code Zeile? Da wird sicher nicht nur "System.Exception" kommen sondern dein Visual Studio wird beim Debuggen zur Fehlerhaften Zeile springen.
    Schau dir dann an ob in allen Variablen das drin steht was drin stehen soll.

    Und GANZ WICHTIG. Mach das Try-Catch weg solange du keinen funktionierenden Code hast und du nicht explizit Fehler behandelst die man behandeln kann.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Nachdem mir @amdus seinen Key via PN zum probieren zur Verfügung gestellt hat(er/sie kann ja einen neuen generieren lassen), habe ich das mal probiert. Hab ein neues Projekt erstellt, meinen Code via Copy&Paste eingefügt und den API-Key reineditiert. Es funktionierte sofort. Keine Ahnung was amdus falsch gemacht hat.



    amdus, kam mit meinem Code wirklich so eine Exception? Oder hattest du das Ausgabefenster nicht offen, und dachtest weil keine Reaktion vom Programm kam es geht nicht? Wie du auf dem Screenshot ganz unten sehen kannst klappt es.

    Du kannst also meinen Code zum durchstarten nutzen, trage den key aber richtig ein. Also nur mein_api_key in args mit dem richtigen austauschen und gut.

    Denk dran einen neuen Key zu generieren ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Takafusa“ ()

    Die exception werfen wir ja selbst, du hast deinen API key nicht in args drin. Da steht mein_api_key in der Variable args aber nicht dein richtiger. Evtl. zeigt da VS was falsches an, eigentlich sollte die 403 meldung kommen. Welches Studio verwendest du? Wenn < 2019, mach ml ein Update. In irgendeiner alten version, hatte ich hin und wieder Probleme mit nichts sagenden Exceptions. Glaube war die 2015er.

    Der RemoteServer hat einen Fehler zurückgegeben: (403) unzulässig.

    @amdus
    Ist dir vllt. bei deinen Vorherigen versuchen ein fehler bei der "verkettung" der Parameter passiert?

    Werf mal die ganze Zeile Dim args as String ......... raus, und füge die beiden ein, mach deinen Key zwischen die beiden "" in der oberen Zeile.

    VB.NET-Quellcode

    1. Dim apiKey As String = ""
    2. Dim args As String = "auth_key=" & apiKey & "&text=Briefmarken&target_lang=en"


    Bilder
    • Unbenannt.png

      17,89 kB, 886×478, 165 mal angesehen

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Takafusa“ ()

    Das Problem besteht nach wie vor. Trotzdem vielen Dank vor allem an Takafusa.

    Den Code habe ich, mit richtigem Api-Key, 1:1 übernommen. Ich weiß echt nicht wo der Fehler liegen kann.

    Ich benutze Visual Studio 2015, vielleicht liegt es ja daran, wie Takafusa meint. Vielleicht probiere ich das nochmals nach einem Update auf 2019 aus. Allerdings hängt da ein Riesen-Projekt hinter und ich weiß nicht welche Auswirkungen ein Update von 2015 auf 2019 für dieses Projekt hat.

    Vielen Dank nochmals.

    amdus schrieb:

    Ich benutze Visual Studio 2015, vielleicht liegt es ja daran, wie Takafusa meint.


    Nicht ganz korrekt, ich hatte Probleme mit nichts sagenden Exceptions in einer älteren Version vom Studio, ich glaube es war die 2015er, kann auch die 2012er gewesen sein. Kann auch sein das die Exception korrekt ist, wir wissen ja nicht warum nicht klappt. Das sollte eigendlich soweit auch mit der 2015er Version funktionieren.

    Ich kann jetzt auch nur raten. VPN oder sowas, oder du hast ausgehende Verbindungen in der Firewall blockiert, eine Antiviren-Lösung kann auch Probleme machen. Zusätzliche Desktop-Firewalls wie Comodo z.B. kann viele Ursachen haben. Du kannst mal versuchen von irgendwo einfach einen String herunterzuladen(webclient) und gucken was passiert.


    Edit:

    amdus schrieb:

    llerdings hängt da ein Riesen-Projekt hinter und ich weiß nicht welche Auswirkungen ein Update von 2015 auf 2019 für dieses Projekt hat.


    @amdus Solltest du so Upgraden können. Einfach eine kopie upgraden.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Takafusa“ ()

    Altes .Net Framework? Eventuell bietet der Webserver nur neuere TLS Versionen an, die in älteren Version vom .Net Framework nicht aktiv sind.