UID Nummer online prüfen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

UID Nummer online prüfen

Beitrag von satmax »

Hallo,

ich möchte gerne die UID-Nummern von Kunden und Lieferanten automatisch aus dem Programm heraus überprüfen.
Dazu gibt es im Internet zum Beispiel die Seite: http://ec.europa.eu/taxation_customs/vi ... ponse.html

Wie gehe ich das unter XBase++ am besten an?

Gruß
Markus
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: UID Nummer online prüfen

Beitrag von georg »

Hallo, Markus -


für solche Anwendungen verwende ich wget.exe. Mit diesem (kostenlosen) Programm lassen sich POST und GET Operationen mit Webseiten ausführen. Ich habe eine Xbase-Klasse dafür geschrieben, mit der man einzelne Aufrufe/ganze Batch-Aufrufe durchführen kann. Bei Interesse würde ich den Quellcode zur Verfügung stellen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: UID Nummer online prüfen

Beitrag von brandelh »

zunächst solltest du dich erkundigen, ob es eine Schnittstelle für Computerprogramme gibt, die könnte einfacher sein als die HTML Seite zu zerlegen.
Wenn nicht ...
1. nach LoadFromUrl() hier suchen - entweder ASINET oder der Code von Phil, den ich veröffentlicht habe (Wissensbasis etc.)
2. Website als Quelltext abspeichern
3. <FORM suchen und Felder analysieren
4. Am Besten HTML abspeichern und den Zielserver austauschen (in meinem LoadFromUrl() Datei upload Beispiel findet man meinen Testserver ... dieser gibt immer die Feldnamen und Inhalte zurück.
5. Aus allen Infos einen CGI String basteln (Variablen & Inhalte zusammenbauen, damit es so aussieht wie mein Testserver STDIN anzeigt). ASINET: GetCgiString( <oHtmlFormElement> ) --> cCgiString
6. Testen ...
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: UID Nummer online prüfen

Beitrag von Tom »

Da die UID-Dienste SOAP-Abfragen unterstützen, wäre das ein Dreizeiler mit Xb2.Net
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: UID Nummer online prüfen

Beitrag von brandelh »

Tom hat geschrieben:Da die UID-Dienste SOAP-Abfragen unterstützen, wäre das ein Dreizeiler mit Xb2.Net
das ist so eine genormte Computerschnittstelle wie ich sie meinte.
Wikipedia und SOAP ...
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: UID Nummer online prüfen

Beitrag von satmax »

Was ich bisher rausgefunden habe, geht das in meinem Fall (Österreich) via Webservice WSDL. Dazu muss eine SSL Verbindung aufgebaut werden. Der Kunde benötigt dazu ein Zertifikat. Ich selbst besitze auch so ein Zertifikak, zahle ja auch Steuern... :).

Hier gibt es das WSDL Dokument: https://finanzonline.bmf.gv.at/fon/ws/u ... rvice.wsdl

SSL Verbindung mit Zertifakt aufbauen
Dann muss ich Parameter übergeben
Methode login aufrufen
Antwort auswerten

Das wäre mit xb2.net ein Dreizeiler (6 Zeilen gelten auch noch. :wink: )?
Gruß
Markus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: UID Nummer online prüfen

Beitrag von Tom »

Hallo, satmax.

Das WSDL liefert Dir die SOAP-Funktionen, die von der Schnittstelle unterstützt werden. Du musst also nur noch den Request formulieren und die SOAP-Anfrage laufen lassen; die Rückgabe enthält dann die gewünschten Werte.

Je nach Formatierung kann man das tatsächlich in einem Dreizeiler unterbringen. :wink:
Herzlich,
Tom
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: UID Nummer online prüfen

Beitrag von satmax »

Auch der SSL Verbindungsaufbau geht mit xb2.net?
Zuletzt geändert von satmax am Di, 22. Okt 2013 14:31, insgesamt 2-mal geändert.
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: UID Nummer online prüfen

Beitrag von satmax »

Da brauche ich dann wohl die pro Version, $799.00 CAD ca. 570 Euro? Ist auch nicht gerade wenig, für einen Dreizeiler. :wink:
Gruß
Markus
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Re: UID Nummer online prüfen

Beitrag von mini990 »

Hallo Georg,
auch wenn dieser Beitrag schon lange zurückliegt....
Mich interessiert die "Wget" Geschichte und hierzu Deine Klasse brennend.
Gibt's hier mehr Info's dazu?

Gruß Stefan
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: UID Nummer online prüfen

Beitrag von georg »

Hallo, Stefan -


klar, das funktioniert immer noch:

Code: Alles auswählen

#DEFINE CRLF Chr(13) + Chr(10)
#DEFINE VERSION "2013.09.19 1.108"

/*
  History
  1.102 - adding log feature
  1.107 - added lBackGround to the :getCollected() method
*/

#INCLUDE "AppEvent.CH"
#INCLUDE "FileIO.CH"
#INCLUDE "Xbp.CH"

CLASS wGet
   EXPORTED:
   VAR CookieFile
   VAR DelayJob
   VAR DelayCalls
   VAR LogRun
   VAR Message
   VAR Params
   VAR ProxyServer
   VAR Referrer
   VAR Result             READONLY
   VAR aResult            READONLY
   VAR Log                READONLY
   VAR aLog               READONLY
   VAR ResultFile
   VAR Retrials
   VAR URL
   VAR UserAgent
   VAR Orders             READONLY

   CLASS VAR KeepFiles

   METHOD init
   METHOD collect
   METHOD get
   METHOD getCollected

   VAR Version             READONLY
ENDCLASS

METHOD wGet:init()
   IF self:KeepFiles == NIL
      KeepFiles := .F.
   ENDIF

   self:CookieFile  := ""
   self:DelayJob    := 0
   self:DelayCalls  := 0
   self:LogRun      := .F.
   self:Message     := ""
   self:Params      := ""
   self:Referrer    := ""
   self:Result      := ""
   self:Retrials    := 0
   self:URL         := ""
   self:UserAgent   := ""
   self:Orders      := {}

   self:Version     := VERSION
RETURN (Self)

METHOD wGet:get(lParallel, lBackGround)
   Local cWriteDoc, cScriptFile, cWriteLine, cSubmitFile, cLine, cCmd, cCmdLine, cUserAgent, cID, cLogFile
   Local lSecureHTTP
   Local nHandle, nSize
   Local oThread

   IF lParallel == NIL
      lParallel := .F.
   ENDIF
   IF lBackGround == NIL
      lBackGround := .T.
   ENDIF

   // validate parameters
   IF Empty(self:URL)
      ConfirmBox(, "No URL to retrieve defined", "Error", XBPMB_OK, XBPMB_CRITICAL)
      QUIT
   ENDIF
   IF At("HTTPS:/", Upper(self:URL)) > 0
      lSecureHTTP := .T.
   ELSE
      lSecureHTTP := .F.
   ENDIF

   // get user agent
   IF Empty(self:UserAgent)
      // cUserAgent := "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.15 ( .NET4.0E)"
      cUserAgent := 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0'
   ELSE
      cUserAgent := self:UserAgent
   ENDIF

   oThread := ThreadObject()
   cID := AllTrim(Str(oThread:threadID)) + "#"
   self:ResultFile := cWriteDoc := "submitresult" + cID + ".html"
   cScriptFile := "postdata" + cID + ".txt"
   cLogFile := "logwget" + cID + ".txt"

   IF !Empty(self:Message)
      cWriteLine := self:Message
      nHandle := fCreate(cScriptFile)
      IF nHandle < 1
         ConfirmBox(, "Error creating script file for submitting.", "Error", XBPMB_OK, XBPMB_CRITICAL)
         RETU(.F.)
      ENDIF
      fWrite(nHandle, cWriteLine, Len(cWriteLine))
      fClose(nHandle)
   ENDIF

   cSubmitFile := "smp" + cID + ".cmd"
   cWriteLine := ""
   IF !Empty(self:ProxyServer)
      cWriteLine := "SET http_proxy=" + self:ProxyServer + CRLF
   ENDIF
   cWriteLine += 'wget '
   IF !Empty(self:Cookiefile)
      cWriteLine += '--load-cookies=' + self:CookieFile + ' --keep-session-cookies --save-cookies=' + self:CookieFile + " "
   ENDIF
   IF self:LogRun
      cWriteLine += '--output-file=' + cLogFile + " "
   ENDIF
   IF lSecureHTTP
      cWriteLine += "--no-check-certificate "
   ENDIF
   IF !Empty(self:ProxyServer)
      cWriteLine += "-proxy=on "
   ENDIF
   IF !Empty(self:Params)
      cWriteLine += self:Params + " "
   ENDIF
   cWriteLine += "--tries=" + AllTrim(Str(self:Retrials + 1)) + " "
   cWriteLine += "--user-agent="  + '"' + cUserAgent + '" '
   cWriteLine += '--output-document=' + cWriteDoc + ' '
   IF !Empty(self:Message)
      cWriteLine += '--post-file=postdata' + cID + '.txt '
   ENDIF
   cWriteLine += '"' + self:URL + '"'

   nHandle := fCreate(cSubmitFile)
   IF nHandle < 1
      ConfirmBox(, "Error creating submit file.", "Error", XBPMB_OK, XBPMB_CRITICAL)
      RETU(.F.)
   ENDIF
   fWrite(nHandle, cWriteLine, Len(cWriteLine))
   fClose(nHandle)

   cCmd := "cmd.exe"
   cCmdLine := "/C smp" + cID + ".cmd"
   nHandle := RunShell(cCmdLine, cCmd, lParallel, lBackGround)

   nHandle := fOpen(cWriteDoc, FO_READ)
   nSize := fSize(nHandle)
   cLine := Space(nSize)
   fRead(nHandle, @cLine, nSize)
   fClose(nHandle)
   self:Result := cLine
   IF self:LogRun
      nHandle := fOpen(cLogFile, FO_READ)
      nSize := fSize(nHandle)
      cLine := Space(nSize)
      fRead(nHandle, @cLine, nSize)
      fClose(nHandle)
      self:Log := cLine
   ENDIF

RETURN (Self)

METHOD Wget:collect()
   Local aSet
   Local cWriteLine
   Local lSecureHTTP

   IF ValType(self:Orders) <> "A"
      self:Orders := {}
   ENDIF

   IF At("HTTPS:/", Upper(self:URL)) > 0
      lSecureHTTP := .T.
   ELSE
      lSecureHTTP := .F.
   ENDIF

   aSet := Array(2)
   aSet[1] := self:Message
   cWriteLine := ""
   IF !Empty(self:ProxyServer)
      cWriteLine := "SET http_proxy=" + self:ProxyServer + CRLF
   ENDIF
   cWriteLine += 'wget '
   IF !Empty(self:Cookiefile)
      cWriteLine += '--load-cookies=' + self:CookieFile + ' --keep-session-cookies --save-cookies=' + self:CookieFile + " "
   ENDIF
   IF self:LogRun
      cWriteLine += '--output-file=%%LOGFILE%% '
   ENDIF
   IF lSecureHTTP
      cWriteLine += "--no-check-certificate "
   ENDIF
   IF !Empty(self:ProxyServer)
      cWriteLine += "-proxy=on "
   ENDIF
   IF !Empty(self:Params)
      cWriteLine += self:Params + " "
   ENDIF
   cWriteLine += '--output-document=%%DOCUMENT%% '
   IF !Empty(self:Message)
      cWriteLine += '--post-file=%%POSTDATA%% '
   ENDIF
   cWriteLine += '"' + self:URL + '"'
   aSet[2] := cWriteLine

   AAdd(self:Orders, AClone(aSet))
RETURN (Self)

METHOD wGet:getCollected(lParallel, lBackGround)
   Local cWriteLine, cIndic, cScriptFile, cDocFile, cCmd, cCmdLine, cLine, cID, cLogFile
   Local nI, nLen, nHandle, nSmpHandle, nSize, nJ
   Local oThread

   IF lParallel == NIL
      lParallel := .F.
   ENDIF
   IF lBackGround == NIL
      lBackGround := .T.
   ENDIF

   self:aResult := {}
   self:aLog := {}

   oThread := ThreadObject()
   cID := AllTrim(Str(oThread:threadID)) + "#"

   nLen := Len(self:Orders)
   IF nLen < 1
      RETU(self)                                // nothing queued, nothing to execute
   ENDIF
   nSmpHandle := fCreate("smp" + cID + ".cmd")
   nJ := 0
   FOR nI := 1 TO nLen
      // prepare index indicator
      cIndic := LTrim(Str(nI))
      // create scriptfile for entry
      cScriptFile := "postdata" + cID + cIndic + ".txt"
      nHandle := fCreate(cScriptFile)
      nSize := Len(self:Orders[nI, 1])
      fWrite(nHandle, self:Orders[nI, 1], nSize)
      fClose(nHandle)
      cWriteLine := self:Orders[nI, 2]
      cWriteLine := StrTran(cWriteLine, "%%POSTDATA%%", cScriptFile) + CRLF
      cDocFile := "SubmitResult" + cID + cIndic + ".html"
      cWriteLine := StrTran(cWriteLine, "%%DOCUMENT%%", cDocFile)
      cLogFile := "logwget" + cID + cIndic + ".txt"
      cWriteLine := StrTran(cWriteLine, "%%LOGFILE%%", cLogFile)
      nSize := Len(cWriteLine)
      fWrite(nSmpHandle, cWriteLine, nSize)
      IF self:DelayJob > 0 .AND. nI < nLen
         IF nJ >= self:DelayCalls
            cWriteLine := "timeout " + Trim(Str(self:DelayJob)) + CRLF
            nSize := Len(cWriteLine)
            fWrite(nSmpHandle, cWriteLine, nSize)
            nJ := -1
         ENDIF
         nJ ++
      ENDIF
   NEXT
   fClose(nSmpHandle)

   cCmd := "cmd.exe"
   cCmdLine := "/C smp" + cID + ".cmd"
   nHandle := RunShell(cCmdLine, cCmd, lParallel, lBackGround)

   nHandle := fOpen(cDocFile, FO_READ)
   nSize := fSize(nHandle)
   cLine := Space(nSize)
   fRead(nHandle, @cLine, nSize)
   fClose(nHandle)
   self:Result := cLine

   FOR nI := 1 TO nLen
      cIndic := LTrim(Str(nI))
      cDocFile := "SubmitResult" + cID + cIndic + ".html"
      nHandle := fOpen(cDocFile, FO_READ)
      nSize := fSize(nHandle)
      cLine := Space(nSize)
      fRead(nHandle, @cLine, nSize)
      fClose(nHandle)
      AAdd(self:aResult, cLine)
      // and the logs as well
      cDocFile := "logwget" + cID + cIndic + ".txt"
      nHandle := fOpen(cDocFile, FO_READ)
      nSize := fSize(nHandle)
      cLine := Space(nSize)
      fRead(nHandle, @cLine, nSize)
      fClose(nHandle)
      AAdd(self:aLog, cLine)
   NEXT

   self:Orders := {}
   self:DelayJob := 0

RETURN (Self)

wget.exe ist über Google leicht zu lokalisieren.

Ich verwende meine Klasse etwa in dieser Art:

Code: Alles auswählen

   oWget := wGet():new()
   oWget:ProxyServer := cProxyAdr
   oWget:UserAgent   := cUserAgent
   oWget:URL := cURL
   oWget:CookieFile := cCookieFile
   oWget:message := ""
   oWget:get(, lBackGround)
   cLine := oWget:result
Die Klasse erzeugt folgende Dateien:

a) smpT#N.cmd
b) postdataT#N.txt
c) submitresultT#N.html
d) logwgetT#N.txt (wenn Logging der wget-Aktivität aktiviert wird).

T ist die Nummer des jeweiligen Threads, in dem die Klasse ausgeführt wird, d.h. Du kannst sie parallel in verschiedenen Threads ausführen, ohne dass es zu Überschneidungen kommt;
N ist die Folgenummer bei einer Batchverarbeitung (oWget:collect() sammelt Anfragen, um sie dann in einem Rutsch mittels oWget:getCollected() auszuführen)

Was das Auslesen der submitresultT#n.html Dateien angeht, kann ich nur auf meinen geplanten Beitrag auf der diesjährigen Jahreshauptversammlung verweisen, dort geht es um den Einsatz von Regular Expressions, etwas, das sich hier fantastisch nutzen lässt.

Und: wget.exe muss der Zugriff auf das Internet erlaubt werden.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: UID Nummer online prüfen

Beitrag von brandelh »

Hallo Georg,

das mit WGET hört sich gut an, hast du das in der Wissensdatenbank abgelegt ?

Normalerweise greife ich immer mit LoadFromUrl() auf selbst erstelle HTML Seiten zu, da kann man alles über interne Variablen regeln und braucht keine cookies.
Aber wer weiß wann ich doch mal welche brauche ;-)
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: UID Nummer online prüfen

Beitrag von georg »

Hallo, Hubert -


nein, es steht noch nicht in der Wissenbasis, aber ich werde das wohl in den kommenden Tagen mal angehen, und auch ein wenig erklären, wie man an die erforderlichen POST-Informationen rankommt.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten