Goldpreis aus dem Internet abfragen

  • WPF

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von nogood.

    Goldpreis aus dem Internet abfragen

    Hallo,
    ich möchte einen kleinen Rechner bauen mit VisualStudio und möchte dafür auch VB.Net verwenden.
    Der Rechner soll je nach Gramm den aktuellen Goldpreis berechnen.

    Meine Frage ist nur, kann ich aus dem Internet den aktuellen Goldpreis (wenn das Programm) startet, den Wert abrufen und in eine Variable schreiben?
    Wenn ja, wie geht das?

    Ich habe dazu leider nichts im Inet gefunden, oder habe die falschen Suchbegriffe gewählt.
    Das ist schon mal gut, hat aber das Problem, das ich dort den letzten Tagesabschluss sehe.
    In diesem Fall wäre heute der 07.06. in der CSV wäre der letzte Eintrag vom 04.06.

    Gibt es sicherheitshalber auch eine Zweite Seite, falls die erste nicht erreichbar ist, evtl mit Tagesaktuellen Daten?

    Ich habe hier gerade etwas unter Yahoo Finance APi gefunden, und werde mich mal schlau lesen und wieder melden.

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

    @Begiinner_for_One Ja die offiziell beste Lösung wäre eine Api. Also ein Möglichkeit, dass dein Programm mit einem anderen Programm // App Kontakt aufnimmt und so die aktuellen Goldpreise auslesen kann. Api ist so zu sagen für dein Programm das was GUI für uns Menschen ist. Ich hab nicht gesucht, aber ich könnte mir vorstellen, dass es ein kostenfreies Api geben müsste (NACHTRAG ja 50 Calls per Month free metals-api.com/pricing).

    Die zweite Lösung (GrauZone) wäre das man von eine Webside mittels Websrcaping den akuellen Kurs auslesen kann.
    Auf der Seite goldprice.io z.b. kann man im Html Quellcode sehen wo die Info steht und diese dann runterladen/verabrbeiten mit z.B. HtmlAgility Pack. Oder per Regex die Textstelle Rausfiltern oder wie auch immer...

    Mein Code von C# via OnlineConverter -> VB... alles ungetestet und aus einem Projekt rauskopiert...
    Mit der einen Funktion kann man den Quellcode der Seite als String runterladen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Collections.Generic
    3. Imports System.IO
    4. Imports System.Linq
    5. Imports System.Net.Http
    6. Imports System.Text
    7. Imports System.Threading.Tasks
    8. Imports System.Windows.Forms
    9. Namespace HtmlPageDL.Models
    10. Module HtmlDL
    11. Async Function DownLoadHomepage(ByVal url As String) As Task(Of String)
    12. Dim client As HttpClient = New HttpClient()
    13. Using response As HttpResponseMessage = Await client.GetAsync(url)
    14. Using content As HttpContent = response.Content
    15. Return Await content.ReadAsStringAsync()
    16. End Using
    17. End Using
    18. End Function
    19. End Module
    20. End Namespace
    codewars.com Rank: 4 kyu
    Kurze Auffrischung 'JsonResponse-Verabreiten' für mich :)



    1. API Key von metals-api.com holen (Konto anlegen...)

    2.Der fertige Link um Abfragen zu erzeugen würde dann so aussehen (Abfrage Gold/€) https://metals-api.com/api/latest?access_key=(Hier deinen ApiKey kopieren)&base=EUR&symbols=XAU
    z.B. würde ein Link dann so aussehen https://metals-api.com/api/latest?access_key=sdfsdfhljk456456FGDH465rfhg&base=EUR&symbols=XAU

    3. diesen Link dann einfach in den Browser eintippen und die Seite 'ansurfen' (die geposteten Links zur Abfrage gehen nicht Du musst erst deinen ApiKey einfügen)

    4. dann müsste so was als Text da stehen: {"success":true,"timestamp":1623147720,"date":"2021-06-08","base":"EUR","rates":{"XAU":1555.0509291699345},"unit":"per ounce"}
    Das wäre die API Response

    5. diese Antwort kopieren und z.B. bei json2csharp.com automatisch in ein c# Klassen-Obj. umwandeln (für VB-Class ?! google).

    Spoiler anzeigen

    C#-Quellcode

    1. public class Rates
    2. {
    3. [JsonProperty("XAU")]
    4. public double XAU { get; set; }
    5. }
    6. public class Root
    7. {
    8. [JsonProperty("success")]
    9. public bool Success { get; set; }
    10. [JsonProperty("timestamp")]
    11. public int Timestamp { get; set; }
    12. [JsonProperty("date")]
    13. public string Date { get; set; }
    14. [JsonProperty("base")]
    15. public string Base { get; set; }
    16. [JsonProperty("rates")]
    17. public Rates Rates { get; set; }
    18. [JsonProperty("unit")]
    19. public string Unit { get; set; }
    20. }


    6. Visual studio Projekt anlegen und per NuGet Manager das Newtonsoft.Json inzufügen (rechte Maus auf Projekt -> NuGetManger -> Suchen -> Newtonsoft.Json -> installieren)
    Das NewtonSoft.Json Dings ermöglicht es das man die Json Response in ein C# Obj. // VB-Obj lesen kann

    Spoiler anzeigen

    C#-Quellcode

    1. //DEBUG
    2. string myJsonResponse = @"{ ""success"":true,""timestamp"":1623151080,""date"":""2021-06-08"",""base"":""EUR"",""rates"":{ ""XAU"":1557.6438061154515},""unit"":""per ounce"" }";
    3. //DEBUG
    4. MyDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);


    7. Der Rest erklärt sich von selbst falls Du bis hier folgen konntest :D

    8. Viel Spass

    -----
    Hier noch der gesamte Code am Stück GUI siehe Screenshot (ich kann nur C#; aber wie gesagt online Converter c' vb gibt es s.o. und etwas Arbeit ist halt immer)

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. using System.Net.Http;
    11. using Newtonsoft.Json;
    12. namespace WF_GoldPreisApi
    13. {
    14. public partial class Form1 : Form
    15. {
    16. readonly HttpClient client = new HttpClient();
    17. Root MyDeserializedClass;
    18. public Form1()
    19. {
    20. InitializeComponent();
    21. }
    22. private async void BtnCallApi_Click(object sender, EventArgs e)
    23. {
    24. RtxbxShow.Text += $"START GET DATA from Api\n";
    25. RtxbxShow.Text += await CallApiAsync();
    26. }
    27. public async Task<string> CallApiAsync()
    28. {
    29. string myJsonResponse = await client.GetStringAsync(
    30. "https://metals-api.com/api/latest?access_key=DeinGeheimerAPi-Key=EUR&symbols=XAU");
    31. MyDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
    32. return myJsonResponse;
    33. }
    34. public double Price = 0;
    35. private void BtnShowDgv_Click(object sender, EventArgs e)
    36. {
    37. List<Root> MyLst = new List<Root>
    38. {
    39. MyDeserializedClass
    40. };
    41. DgvShow.DataSource = MyLst;
    42. //eine FeinUnze entspricht 31,.. gramm
    43. Price = MyDeserializedClass.Rates.XAU / 31.1034768;
    44. LbPreis.Text = $"{Math.Round(Price,2)} €";
    45. }
    46. private void BtnCalcPrice_Click(object sender, EventArgs e)
    47. {
    48. var res = Double.TryParse(TxbxInput.Text, out double TextAsDecimal);
    49. if (res)
    50. {
    51. LbCalcPrice.Text = $"{Math.Round(Price * TextAsDecimal,2).ToString()} €";
    52. return;
    53. }
    54. LbCalcPrice.Text = "Fehler bei Eingabe!";
    55. }
    56. }
    57. //CREATED C# Classes via https://json2csharp.com from jsonResponse
    58. //{"success":true,"timestamp":1623147720,"date":"2021-06-08","base":"EUR","rates":{"XAU":1555.0509291699345},"unit":"per ounce"}
    59. // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
    60. public class Rates
    61. {
    62. [JsonProperty("XAU")]
    63. public double XAU { get; set; }
    64. }
    65. public class Root
    66. {
    67. [JsonProperty("success")]
    68. public bool Success { get; set; }
    69. [JsonProperty("timestamp")]
    70. public int Timestamp { get; set; }
    71. [JsonProperty("date")]
    72. public string Date { get; set; }
    73. [JsonProperty("base")]
    74. public string Base { get; set; }
    75. [JsonProperty("rates")]
    76. public Rates Rates { get; set; }
    77. [JsonProperty("unit")]
    78. public string Unit { get; set; }
    79. }
    80. }
    Bilder
    • VBA2.png

      16,75 kB, 848×566, 57 mal angesehen
    codewars.com Rank: 4 kyu

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