diff --git a/CardMarketBot/CardMarketParser.cs b/CardMarketBot/CardMarketParser.cs index 218ce62..fd2972f 100644 --- a/CardMarketBot/CardMarketParser.cs +++ b/CardMarketBot/CardMarketParser.cs @@ -29,7 +29,7 @@ namespace CardmarketBot this.password = password; } - public List ParseCardMarket() + public List ParseCardMarket(string forceid = "") { ChromeOptions options = new ChromeOptions(); options.AddArgument("start-maximized"); @@ -61,40 +61,40 @@ namespace CardmarketBot cookieContainer.Add(new System.Net.Cookie(name, value, c.Path, c.Domain)); } - cd.Navigate().GoToUrl(@"https://www.cardmarket.com/de/OnePiece/Orders/Sales/Paid"); - //cd.Navigate().GoToUrl(@"https://www.cardmarket.com/de/OnePiece/Orders/Sales/Sent"); - List ids = new List(); List kunden = new List(); - IWebElement element; - try + + if (forceid != "") { - element = cd.FindElement(By.XPath("/html/body/main/section/div[3]/div[4]")); - - string content = element.Text; - - - string[] datas = content.Split("\r\n"); - - - for (int i = 8; i < datas.Length; i += 7) - { - ids.Add(datas[i]); - } + ids.Add(forceid); } - catch(OpenQA.Selenium.NotFoundException) + else { - Console.WriteLine("Keine Verkäufe aktuell"); - return kunden; + cd.Navigate().GoToUrl(@"https://www.cardmarket.com/de/OnePiece/Orders/Sales/Paid"); + + try + { + element = cd.FindElement(By.XPath("/html/body/main/section/div[3]/div[4]")); + + string content = element.Text; + string[] datas = content.Split("\r\n"); + + for (int i = 8; i < datas.Length; i += 7) + { + ids.Add(datas[i]); + } + } + catch (OpenQA.Selenium.NotFoundException) + { + Console.WriteLine("Keine Verkäufe aktuell"); + return kunden; + } } foreach (string id in ids) { - //if (id != "1121844928") continue; - //Console.WriteLine(id); - //id = "1121395158"; - //cd.Navigate().GoToUrl(string.Format(@"https://www.cardmarket.com/de/OnePiece/Orders/1121395158", id)); + cd.Navigate().GoToUrl(string.Format(@"https://www.cardmarket.com/de/OnePiece/Orders/{0}", id)); element = cd.FindElement(By.XPath("/html/body/main/section/div/div[1]/div/div[3]/div[2]/div[2]/div/div")); diff --git a/CardMarketBot/Helper.cs b/CardMarketBot/Helper.cs index b56be5e..e383789 100644 --- a/CardMarketBot/Helper.cs +++ b/CardMarketBot/Helper.cs @@ -65,6 +65,7 @@ public static class Helper { Artikel temp = new Artikel(); var xFound = datas[i].IndexOf("x"); + if (xFound == -1) continue; var am = datas[i].Substring(0, xFound); temp.Amount = Convert.ToInt32(am); temp.GERName = datas[i].Substring(xFound + 1); diff --git a/CardMarketBot/Program.cs b/CardMarketBot/Program.cs index 142acaa..f45021e 100644 --- a/CardMarketBot/Program.cs +++ b/CardMarketBot/Program.cs @@ -2,70 +2,94 @@ using ConsoleApp3.Contracts; using System.Text.RegularExpressions; using CardMarketBot; +using OpenQA.Selenium.DevTools.V113.Network; +using System.Reflection.Metadata.Ecma335; namespace CardmarketBot { internal class Programm { - - static void Main(string[] args) { ICheckSevDesk checkSevDesk = new CheckSevDeskPublicList(); - - - // Kunden aus Cardmarket erstellen + Console.WriteLine("Hallo Herzlich willkommen beim Junker sein Junker der im Junkerloch junkert"); + Console.WriteLine("Was kann ich für dich tun?"); + bool programmexited = false; List kunden = new List(); CardMarketParser cardMarketParser = new CardMarketParser("More-Tcg", "Magnatpower310!!"); - kunden = cardMarketParser.ParseCardMarket(); - - - - // Rechnungen generieren - List rechnungen = new List(); - InvoiceParser invoiceParser = new InvoiceParser(kunden); - rechnungen = invoiceParser.GetInvoices(); - - - - foreach (ModelRechnung item in rechnungen) + while (!programmexited) { - if(item.Invoice == null) continue; - var str_header = item.Invoice.Header; - if (str_header != null) + Console.WriteLine("1) Starte den Hugo, der alle bezahlte Artikeln erfasst"); + Console.WriteLine("2) Starte den Rolfes der Bestellnummern nachkontrolliert"); + Console.WriteLine("3) Beende"); + string? input = Console.ReadLine(); + if (input == null) { - Regex regex = new Regex("[0-9]*$"); - Match matched = regex.Match(str_header); - string verkaufnummer = str_header.Substring(matched.Index); - Console.Write($"Teste {verkaufnummer} : "); - if (checkSevDesk.AlreadyKnown(verkaufnummer)) + continue; + } + switch (input) + { + case "1": + kunden = cardMarketParser.ParseCardMarket(); + break; + + case "2": + { + Console.Write("Verkaufsnummer: "); + string? verkaufsnummer = Console.ReadLine(); + if (verkaufsnummer == null) + { + Console.WriteLine("Fehler"); + continue; + } + kunden = cardMarketParser.ParseCardMarket(verkaufsnummer); + } + break; + + case "3": + programmexited = true; + continue; + default: continue; + + } + + // Rechnungen generieren + List rechnungen = new List(); + InvoiceParser invoiceParser = new InvoiceParser(kunden); + rechnungen = invoiceParser.GetInvoices(); + + foreach (ModelRechnung item in rechnungen) + { + if (item.Invoice == null) continue; + var str_header = item.Invoice.Header; + if (str_header != null) { - Console.Write("wurde noch nicht in Sevdesk erfasst "); - SevdeskService sevdeskService = new SevdeskService("7251554968610b78ca865b2b774b4134"); - sevdeskService.Create(item); - Console.WriteLine("nun in Sevdesk eingetragen"); - checkSevDesk.Write(verkaufnummer); - } - else - { - Console.WriteLine("wurde bereits in Sevdesk erfasst, wird somit übersprungen. Jedoch wird PostCSV erstellt"); + Regex regex = new Regex("[0-9]*$"); + Match matched = regex.Match(str_header); + string verkaufnummer = str_header.Substring(matched.Index); + Console.Write($"Teste {verkaufnummer} : "); + if (checkSevDesk.AlreadyKnown(verkaufnummer)) + { + Console.Write("wurde noch nicht in Sevdesk erfasst "); + SevdeskService sevdeskService = new SevdeskService("7251554968610b78ca865b2b774b4134"); + sevdeskService.Create(item); + Console.WriteLine("nun in Sevdesk eingetragen"); + checkSevDesk.Write(verkaufnummer); + } + else + { + Console.WriteLine("wurde bereits in Sevdesk erfasst, wird somit übersprungen. Jedoch wird PostCSV erstellt"); + } } } + + // Post CSV Erstellen + DeutschePost deutschePost = new DeutschePost(kunden); + deutschePost.GenerateCSV(); + + Console.WriteLine("Fertig"); } - - // Post CSV Erstellen - DeutschePost deutschePost = new DeutschePost(kunden); - deutschePost.GenerateCSV(); - - Console.WriteLine("Fertig"); - Console.ReadLine(); - } - - - - - } } \ No newline at end of file diff --git a/CardMarketBotTests/HelperTests.cs b/CardMarketBotTests/HelperTests.cs index 4b7e99c..21c46fc 100644 --- a/CardMarketBotTests/HelperTests.cs +++ b/CardMarketBotTests/HelperTests.cs @@ -17,5 +17,13 @@ namespace Tests string input2 = "1x Schrottgolem\r\nScrap Golem\r\n#059\r\nMGED\r\nNM\r\n0,10 €\r\n1x Schalenritter\r\nShell Knight\r\n#016\r\nGFP2\r\nNM\r\n0,10 €\r\n2x Chaos-Grepher\r\nChaos Grepher\r\n#039\r\nGFP2\r\nNM\r\n0,10 €\r\n1x Jormungandr, Generaider-Boss der Ewigkeit\r\nJormungandr, Generaider Boss of Eternity\r\n#147\r\nGFP2\r\nNM\r\n0,10 €\r\n3x Querhüter\r\nCross Keeper\r\n#002\r\nPOTE\r\nNM\r\n0,05 €\r\n1x Grausiger Trick des Erzunterweltlers\r\nArchfiend's Ghastly Glitch\r\n#026\r\nTAMA\r\nNM\r\n0,10 €\r\n1x Der sagenhafte Abanc\r\nThe Fabled Abanc\r\n#010\r\nMP22\r\nNM\r\n0,05 €\r\n1x Sagenhafter Andwraith\r\nFabled Andwraith\r\n#024\r\nMP22\r\nNM\r\n0,05 €\r\n1x Treffpunkt der Sta-Brigade\r\nTri-Brigade Rendezvous\r\n#032\r\nMP22\r\nNM\r\n0,05 €\r\n1x Sagenhafter Verrat\r\nFabled Treason\r\n#041\r\nMP22\r\nNM\r\n0,05 €\r\n1x Zoroa, Magistus-Loderkatastrophe\r\nZoroa, the Magistus Conflagrant Calamity\r\n#212\r\nMP22\r\nNM\r\n0,05 €\r\n1x Schreckensklauen-Doppelsäge\r\nScareclaw Twinsaw\r\n#075\r\nDABL\r\nNM\r\n0,05 €\r\n1x Hajun, der geflügelte Mayakashi\r\nHajun, the Winged Mayakashi\r\n#017\r\nMAMA\r\nNM\r\n0,10 €\r\n1x Chaos-Daedalus\r\nChaos Daedalus\r\n#071\r\nBLCR\r\nNM\r\n0,10 €\r\n1x Flammedler Ritter - Roland\r\nInfernoble Knight - Roland\r\n#050\r\nAMDE\r\nNM\r\n0,05 €\r\n1x Chaos-Trugbild-Drache\r\nChaos Mirage Dragon\r\n#013\r\nPHHY\r\nNM\r\n0,20 €\r\n1x Abgrundschauspieler-Generalprobe\r\nAbyss Actors' Dress Rehearsal\r\n#063\r\nPHHY\r\nNM\r\n0,10 €\r\n1x Abgrundschauspieler - Freiheitsautorin\r\nAbyss Actor - Liberty Dramatist\r\n#016\r\nPHHY\r\nNM\r\n0,05 €\r\n1x Numeron-Schöpfung\r\nNumeron Creation\r\n#052\r\nPHHY\r\nNM\r\n0,05 €\r\n1x Abgrundskript - Dramatische Geschichte\r\nAbyss Script - Dramatic Story\r\n#064\r\nPHHY\r\nNM\r\n0,05 €\r\n1x Schwarzflügel - Elphin der Rabe\r\nBlackwing - Elphin the Raven\r\n#038\r\nMAZE\r\nNM\r\n0,10 €\r\n1x Rikka-Blütenblatt\r\nRikka Petal\r\n#047\r\nMAZE\r\nNM\r\n0,05 €\r\n1x D.D. Trainer\r\nD.D. Trainer\r\n#055\r\nDCR-25TH\r\nNM\r\n0,10 €\r\n1x Schwur des Erzunterweltlers\r\nArchfiend's Oath\r\n#092\r\nDCR-25TH\r\nNM\r\n0,10 €\r\n1x Frühe Saat\r\nPrimal Seed\r\n#042\r\nIOC-25TH\r\nNM\r\n0,10 €\r\n1x Neue Grenze\r\nNew Frontier\r\n#054\r\nCYAC\r\nNM\r\n0,05 €\r\n1x Lamia\r\nLamia\r\n#021\r\nBLMR\r\nNM\r\n0,10 €\r\n1x Groll der Viper\r\nViper's Grudge\r\n#022\r\nBLMR\r\nNM\r\n0,10 €\r\n2x Geist Lanzenträger, Speerkämpfer der Unterwelt\r\nGhost Lancer, the Underworld Spearman\r\n#023\r\nBLMR\r\nNM\r\n0,10 €\r\n1x Gazelle, König der mythischen Krallen\r\nGazelle the King of Mythical Claws\r\n#003\r\nDUNE\r\nNM\r\n0,20 €\r\n1x Großflügliger Berfomet\r\nBig-Winged Berfomet\r\n#004\r\nDUNE\r\nNM\r\n0,20 €\r\n1x Spiegel-Schwertritter\r\nMirror Swordknight\r\n#006\r\nDUNE\r\nNM\r\n0,20 €\r\n1x Mächtiger Dinokönig Rex\r\nMighty Dino King Rex\r\n#008\r\nDUNE\r\nNM\r\n0,15 €\r\n1x Altergeist Peritrator\r\nAltergeist Peritrator\r\n#010\r\nDUNE\r\nNM\r\n0,25 €\r\n1x Flammedler Ritter Ricciardetto\r\nInfernoble Knight Ricciardetto\r\n#013\r\nDUNE\r\nNM\r\n0,25 €\r\n1x Flammedler Ritter Turpin\r\nInfernoble Knight Turpin\r\n#014\r\nDUNE\r\nNM\r\n0,20 €\r\n1x Ultimativer glänzender Ritter Ursatron Alpha\r\nUltimate Bright Knight Ursatron Alpha\r\n#021\r\nDUNE\r\nNM\r\n0,20 €\r\n1x Thestalos der Schattenfeuer-Monarch\r\nThestalos the Shadowfire Monarch\r\n#023\r\nDUNE\r\nNM\r\n0,15 €\r\n1x Schimäre das Illusionsungeheuer\r\nChimera the Illusion Beast\r\n#034\r\nDUNE\r\nNM\r\n0,25 €\r\n1x Thelematech Clatis\r\nThelematech Clatis\r\n#045\r\nDUNE\r\nNM\r\n0,15 €\r\n1x Schimärenfusion\r\nChimera Fusion\r\n#052\r\nDUNE\r\nNM\r\n0,20 €\r\n1x Verbannende Fallgrube\r\nBanishing Trap Hole\r\n#077\r\nDUNE\r\nGD\r\n0,10 €\r\n3x Rotäugiger schwarzer Meteordrache\r\nRed-Eyes Black Meteor Dragon\r\n#095\r\nDUNE\r\nNM\r\n0,25 €\r\n1x Magier der Ergebenheit\r\nMagician of Faithfulness\r\n#098\r\nDUNE\r\nNM\r\n0,20 €\r\n1x Kornfeld-Coatl\r\nCornfield Coatl\r\n#005\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Zweiköpfiger Dinokönig Rex\r\nDouble-Headed Dino King Rex\r\n#007\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Behemoth, der König der Hundert Schlachten\r\nBehemoth the King of a Hundred Battles\r\n#024\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Gaia-Lohe, die Kraft der Sonne\r\nGaia Blaze, the Force of the Sun\r\n#042\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Grenosaurier Gigakanone\r\nGrenosaurus Giga-Cannon\r\n#046\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Jurassische Stärke\r\nJurassic Power\r\n#053\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Beta-Evolutionspille - Ultranszendenz\r\nBeta Evolution Pill - Ultranscendance\r\n#063\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Hundert Millionen Jahre Eisgefängnis\r\nMillion-Century Ice Prison\r\n#066\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Das fortwährende Epos von Charles\r\nThe Continuing Epic of Charles\r\n#072\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Kleiner Streit\r\nSmall Scuffle\r\n#078\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Geteilter Spiegel der Unterwelt\r\nSplit Mirror of the Underworld\r\n#079\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Zuttomozaurier\r\nZuttomozaurus\r\n#081\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Finis Terrae, Turm der Nekrowelt\r\nFinis Terrae, Tower of the Necroworld\r\n#082\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Kuibelt der Klingendrache\r\nKuibelt the Blade Dragon\r\n#083\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Sternenstaubgewürm\r\nStardust Wurm\r\n#094\r\nDUNE\r\nNM\r\n0,10 €\r\n1x Diabolica die Drachogeneralin\r\nDiabolica the Draconique General\r\n#096\r\nDUNE\r\nNM\r\n0,10 €\r\n"; Assert.Fail(); } + + [TestMethod()] + public void ParseArtikelnTest1() + { + string fehlerhaft = "4x DON!!\\r\\nDON!!\\r\\nOP-02\\r\\nNM\\r\\n1,99 €"; + string funktioniert = "1x Gizmek Okami, der gefürchtete Sintflut-Drache\r\nGizmek Okami, the Dreaded Deluge Dragon\r\n#121\r\nMP21\r\nNM\r\n0,10 €\r\n3x Gizmek Inaba, der hoppelnde Hase von Hakuto\r\nGizmek Inaba, the Hopping Hare of Hakuto\r\n#130\r\nMP22\r\nNM\r\n0,05 €\r\n3x Gizmek Taniguku, der unbewegliche Intellekt\r\nGizmek Taniguku, the Immobile Intellect\r\n#132\r\nMP22\r\nNM\r\n0,05 €\r\n3x Gizmek Arakami, der Hagelbringer-Eber\r\nGizmek Arakami, the Hailbringer Hog\r\n#133\r\nMP22\r\nNM\r\n0,05 €\r\n3x Stonehenge\r\nStonehenge\r\n#024\r\nBLCR\r\nNM\r\n0,10 €\r\n3x Arahime die manifestierte Mikanko (V.1 - Ultra Rare)\r\nArahime the Manifested Mikanko (V.1 - Ultra Rare)\r\n#032\r\nDUNE\r\nNM\r\n0,30 €\r\n2x Mikanko-Geisterlauf\r\nMikanko Spiritwalk\r\n#076\r\nDUNE\r\nNM\r\n0,10 €"; + Assert.Fail(); + } } } \ No newline at end of file