Program do sprawdzania danych z bazy www

0

Witam. Nawet nie za bardzo wiedziałem, jak sformułować temat. Mam pytanie, czy jest możliwe napisanie programu, który byłby w stanie pobierać z listy (np z arkusza xls czy skopiowanej bezpośrednio do tego programu) numery NIP, wpisać je do formularza na stronie http://www.finanse.mf.gov.pl/web/wp/pp/sprawdzanie-statusu-podmiotu-w-vat , odczytać i zapisać w jakiejś bazie wynik weryfikacji? Oczywiście chodzi o masowe sprawdzenie całej listy, po jednokrotnym uruchomieniu mechanizmu. Strona nie posiada zabezpieczeń typu captcha, obrazki itp. Dla zobrazowania możecie wpisać np. 5250008028. Strona zwróci informację "Podmiot o podanym identyfikatorze podatkowym NIP jest zarejestrowany jako podatnik VAT czynny". Po wpisaniu np 0123456789 pojawi się informacja "Podmiot o podanym identyfikatorze podatkowym NIP nie jest zarejestrowany jako podatnik VAT". Nie pytam, jak to zrobić, bo nie jestem informatykiem i nie potrafiłbym tego zrobić, ale czy w ogóle jest to możliwe.

0

Tak, jest to możliwe. Nie jest to też jakieś mega mega trudne.

Serwis który podałeś udostępnia API które sprawia że programista może napisać kod który pobiera dane z pliku xls etc a następnie wywołuje dla tych danych ileś razy funkcję udostępnioną przez ten serwis i zwraca Ci wynik.

https://nip24.pl/dokumentacja/

Jako source podana jest strona którą podałeś.

0

OK. A do programisty specjalizującego się w jakim języku powinienem się zgłosić z takim zleceniem? Czy po prostu najlepiej zgłosić się do firmy informatycznej, która ma kilku pracowników i zapytać o możliwość wykonania programu i wycenę?

0

Nie ma znaczenia jaki język zostanie zastosowany. Osobiście polecam pythona ale aplikacja może zostać napisana w każdym języku który jest wspierany przez API.

0
gromit napisał(a):

OK. A do programisty specjalizującego się w jakim języku powinienem się zgłosić z takim zleceniem? Czy po prostu najlepiej zgłosić się do firmy informatycznej, która ma kilku pracowników i zapytać o możliwość wykonania programu i wycenę?

Z nip24.pl możesz pobrać dodatek do Excel i weryfikować status podatnika w VAT bez znajomości języka programowania: https://nip24.pl/sprawdzanie-statusu-vat-dodatek-do-excel/

0

Właśnie na to patrzę, założyłem konto i bez problemów po stronie c# uruchomiłem sprawdzanie na koncie darmowym, jednak jest tam tylko 100 zapytań, może ktoś mi podpowie jak zabrać się za odpytywanie strony ministerstwa o nipy - z tego co udało mi się dowiedzieć to zapytania idą jsonm..
pomoże ktoś ?

0

Może Phantomjs dla windows i skrypt sprawdzenieStatusuPodmiotuWVAT.js ze strony:
https://gist.github.com/srsbiz/1cd71dbe79369dd1682ddb2b2275a8e2

0

Funkcja w Excel do sprawdzenia Nip
lub w innych programach w technologii Ole

Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long)

Public Function nipoff(Nipo As String) As String

Dim inputElement As HTMLInputElement
Dim URL

Dim IE
Dim IEField As HTMLInputElement
Dim wyjm As HTMLInputElement
Dim cos As String

If Len(Nipo) <> 10 Then
niof = " Zły Nip "
Exit Function
End If


Set IE = CreateObject("internetexplorer.application")
URL = "https://ppuslugi.mf.gov.pl/?link=VAT&"
IE.Visible = False
IE.Navigate URL

Do While IE.readyState <> 4: DoEvents: Loop
Do While IE.Busy
Sleep (100)
Loop
Sleep (700)
Do While inputElement Is Nothing
Set inputElement = IE.Document.getElementById("b-7")
Loop

inputElement.Value = Nipo
IE.Document.getElementById("b-8").Click
Do While IE.readyState <> 4: DoEvents: Loop
Sleep (500)

Set wyjm = IE.Document.getElementById("caption2_b-3")

Dim ttyu As String

ttyu = wyjm.innerText

IE.Quit
Dim varCzyJest As Integer
varCzyJest = InStr(ttyu, "NIP jest zarejestrowany jako podatnik VAT czynny")
If varCzyJest > 0 Then
nipoff = "Czynny "
Exit Function
End If

Dim varCzy2 As Integer
varCzy2 = InStr(ttyu, "NIP nie jest zarejestrowany jako podatnik VAT")


If varCzy2 > 0 Then
nipoff = "NieCzynny"
Exit Function
End If



nipof = ttyu
End Function
0

Tutaj jest gotowy program który sprawdza kontrahentów ze strony VIES oraz Ministerstwa Finansów http://nipreporter.pl/

0

Poczekaj do grudnia, wtedy MF powinien już udostępnić API do sprawdzenia aktywności NIP. Możesz sprawdzić przy pomocy Vies, ale tam dużo podmiotów brakuje... W sensie, podejrzewam, że tych którzy nie mają europejskiego NIP-u

0

Wszystko super - ale może ktoś pomóc w napisaniu biblioteki c# do pobierania? proszę chociaż o sam fakt jak zacząć z czego korzystać - z nuget Net.Http ? czy może z czegoś innego ? bardzo proszę o pomoc.

0

Implementacja Powyższego algorytmu w C#

public static int CheckVat(string Nipo)
        {
            var type = Type.GetTypeFromProgID("internetexplorer.application");
            dynamic ie = Activator.CreateInstance(type);

            ie.Visible = false;
            ie.Navigate("https://ppuslugi.mf.gov.pl/?link=VAT&");

            while (ie.readyState != 4)
            {
                while (ie.Busy)
                   Thread.Sleep(50);
                Thread.Sleep(50);
            }

            dynamic inputElement = null;
            while (inputElement == null)
              inputElement = ie.Document.getElementById("b-7");

            inputElement.Value = Nipo;
            ie.Document.getElementById("b-8").Click();

            Thread.Sleep(500);
            string ttyu = ie.Document.Body.innerText;
            ie.Quit();
            ie= null;

            if (ttyu.Contains("NIP jest zarejestrowany jako podatnik VAT czynny"))
               return 1;
            else
            if (ttyu.Contains("NIP nie jest zarejestrowany jako podatnik VAT"))
               return 0;

            return -1;
        }

i w Delphi

function VATCheck(Nipo:string):Integer;
var
  IE,inputElement,IEField,wyjm:OleVariant;
  URL:string;
  cos,ttyu:string;
  varCzyJest:Integer;
begin
  Result:=-1;
  if Length(Nipo) <> 10 then
     raise Exception.Create('Zły Nip');

  IE := CreateOleObject('internetexplorer.application');
  IE.Visible := False;
  IE.Navigate('https://ppuslugi.mf.gov.pl/?link=VAT&');

  while IE.readyState <> 4 do
  begin
    while IE.Busy do
      Sleep (50);
    Sleep (50);
  end;

  while VarIsEmpty(inputElement) or VarIsNull(inputElement) do
    inputElement := IE.Document.getElementById('b-7');

  inputElement.Value := Nipo;
  IE.Document.getElementById('b-8').Click;

  Sleep(500);
  ttyu := IE.Document.Body.innerText;
  IE.Quit;
  IE:=null;

  if Pos('NIP jest zarejestrowany jako podatnik VAT czynny', ttyu) > 0 then
     Result := 1
  else
  if Pos('NIP nie jest zarejestrowany jako podatnik VAT', ttyu) > 0 then
     Result := 0;
end;
0

Jak coś napisałam taki wydajny program, który sprawdzi wam tysiące nipów. Oferuje łatwe REST API i panel webowy więc łatwo integruje się z większością Excel i programów księgowych.
Jak coś to priv

1

Tak piszę, bo może niektórzy jeszcze nie wiedzą, ale MF udostępnił API do sprawdzenia aktywności NIP: https://www.finanse.mf.gov.pl/pp/komunikaty/-/asset_publisher/qqR2/content/id/6347532

0
Panczo napisał(a):

Tak piszę, bo może niektórzy jeszcze nie wiedzą, ale MF udostępnił API do sprawdzenia aktywności NIP: https://www.finanse.mf.gov.pl/pp/komunikaty/-/asset_publisher/qqR2/content/id/6347532

Nie mogę się podłączyć do tego API (Error 400) - komuś to działa?

0

Mi działa

0

A jaki adres usługi podajesz ?

0

sprawdz-status-vat.mf.gov.pl po SSL-u

0

W jaki sposób Pan się podłącza pod ten webserwis?
Próba podłączenia C# z adresem https://sprawdz-status-vat.mf.gov.pl/ kończy się błędem:

Podczas pobierania „https://sprawdz-status-vat.mf.gov.pl/” wystąpił błąd.
Żądanie nie powiodło się. Status HTTP 400: Bad Request.
There was an error downloading 'https://sprawdz-status-vat.mf.gov.pl/$metadata'.
The request failed with HTTP status 404: Not Found.

Próbowałem też otwierać stronę w przeglądarce - też się nie otwiera.

Pozdrawiam

0

Po pierwsze to jest serwis SOAP więc nie podlącza się do niego wpisując adres, trzeba zbudować dokument SOAP, wysłać go na ten adres dodając nagłówki Content-Type i SOAPAction, więc poszukałbym przykładów, jak używać SOAP w C#:
https://stackoverflow.com/questions/4791794/client-to-send-soap-request-and-received-response

0

Dziękuję za podpowiedź. Spróbuję czegoś pod tym kontem jeszcze poszukać. Na razie coś jeszcze robię źle, bo dostaję błąd 500.

0

a w jakim języku udało się Panu podłączyć - może Pan udostępnić kawałek kodu ?

0

Mój kod pewnie wiele ci nie pomoże bo używałem obiektów www.chilkatsoft.com, i napisałem to w VBScript, ale skoro chcesz, to masz:

Function iapiCheckNIPMF(NIP)
 
    Set glb = CreateObject("Chilkat_9_5_0.Global")    
    glb.unlockbundle "xyz"
    Set http = CreateObject("Chilkat_9_5_0.Http")
    
	
	Set soapXml = CreateObject("Chilkat_9_5_0.XML")
    soapXml.Tag = "soapenv:Envelope"
    success = soapXml.addAttribute("xmlns:soapenv", "http://schemas.xmlsoap.org/soap/envelope/")
    success = soapXml.addAttribute("xmlns:ns", "http://www.mf.gov.pl/uslugiBiznesowe/uslugiDomenowe/AP/WeryfikacjaVAT/2018/03/01")
    soapXml.UpdateChildContent "soapenv:Header", ""
    soapXml.UpdateChildContent "soapenv:Body|ns:NIP", NIP

   
    Set req = CreateObject("Chilkat_9_5_0.HttpRequest")
    req.HttpVerb = "POST"
    req.SendCharset = 0
    req.AddHeader "Content-Type", "text/xml; charset=utf-8"
    req.AddHeader "SOAPAction", "http://www.mf.gov.pl/uslugiBiznesowe/uslugiDomenowe/AP/WeryfikacjaVAT/2018/03/01/WeryfikacjaVAT/SprawdzNIP"
    success = req.LoadBodyFromString(soapXml.GetXml(), "utf-8")

    http.FollowRedirects = 1

    Set resp = http.SynchronousRequest("sprawdz-status-vat.mf.gov.pl", 443, 1, req)
    If (resp Is Nothing) Then
        iapiCheckNIPMF = "Brak lączności z uslugą MF API"
    Else
        Set xmlResponse = CreateObject("Chilkat_9_5_0.XML")
        success = xmlResponse.LoadXML(resp.BodyStr)
        iapiCheckNIPMF = xmlResponse.getchildcontent("s:Body|WynikOperacji|Kod") & " - " & xmlResponse.getchildcontent("s:Body|WynikOperacji|Komunikat")
    End If


End Function


msgbox iapiCheckNIPMF("1234567890")
0

Również dziękuję za kod. Z jego pomocą znalazłem błąd u siebie - SOAPAction źle podawałem - teraz udało mi się podłączyć.

Pozdrawiam.

0

Dzięki za pomoc

0

Gotowe rozwiązanie w C#

namespace mfSprawdzVat
{
    public class CheckVat
    {
        public const string mfNS = "http://www.mf.gov.pl/uslugiBiznesowe/uslugiDomenowe/AP/WeryfikacjaVAT/2018/03/01";
        private const string enNS = "http://schemas.xmlsoap.org/soap/envelope/";
        private const string SOAPAction = "http://www.mf.gov.pl/uslugiBiznesowe/uslugiDomenowe/AP/WeryfikacjaVAT/2018/03/01/WeryfikacjaVAT/SprawdzNIP";
        private const string SOAPActionNaDzien = "http://www.mf.gov.pl/uslugiBiznesowe/uslugiDomenowe/AP/WeryfikacjaVAT/2018/03/01/WeryfikacjaVAT/SprawdzNIPNaDzien";
        private const string mfUrl = "https://sprawdz-status-vat.mf.gov.pl";

        private readonly string _url;

        public CheckVat(string url = mfUrl)
        {
            _url = url;
        }

        public WynikOperacji Sprawdz(string nip, DateTime? naDzien = null)
        {
            var param = new Envelope<BodyRequest>() {
                Body = new BodyRequest() {
                    Nip = nip,
                    Data = naDzien
                }
            };

            var xmlString = Serialize<Envelope<BodyRequest>>(param);

            using (var httpClient = new HttpClient())
            {
                var httpContent = new StringContent(xmlString, Encoding.UTF8, "text/xml");
                if (naDzien == null)
                    httpContent.Headers.Add("SOAPAction", SOAPAction);
                else
                    httpContent.Headers.Add("SOAPAction", SOAPActionNaDzien);

                var result = httpClient.PostAsync(_url, httpContent).Result;
                var x = result.Content.ReadAsStringAsync().Result;
                var response = Deserialize<Envelope<BodyResponse>>(x);
                return response.Body.WynikOperacji;
            }
        }

        private T Deserialize<T>(string xml)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            using (TextReader textReader = new StringReader(xml))
            {               
                return (T)serializer.Deserialize(textReader);               
            }
        }

        private string Serialize<T>(T obj)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = new UnicodeEncoding(false, false);
            settings.Indent = true;
            settings.OmitXmlDeclaration = true;

            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

            ns.Add("soapenv", enNS);
            ns.Add("ns", mfNS);

            using (StringWriter textWriter = new StringWriter())
            {
                using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
                {
                    serializer.Serialize(xmlWriter, obj, ns);
                }
                return textWriter.ToString(); 
            }
        }

        [XmlRoot(ElementName = "Envelope", Namespace = enNS)]
        public class Envelope<T>
        {
            public string Header { get; set; }
            public T Body { get; set; }
        }

        public class BodyRequest
        {
            [XmlElement(ElementName = "NIP", Namespace = mfNS)]
            public string Nip { get; set; }
            [XmlElement(Namespace = mfNS, IsNullable = true)]
            public DateTime? Data { get; set; }
        }

        public class BodyResponse
        {
            [XmlElement(Namespace = mfNS)]
            public WynikOperacji WynikOperacji { get; set; }

            [XmlNamespaceDeclarations]
            public XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();

            public BodyResponse()
            {
                xmlns.Add("", mfNS);
            }
        }
    }  

    public class WynikOperacji
    {
        [XmlElement(Namespace = CheckVat.mfNS)]
        public string Kod { get; set; }
        [XmlElement(Namespace = CheckVat.mfNS)]
        public string Komunikat { get; set; }        
    }
}

użycie

            var x = new CheckVat();
            var resp = x.Sprawdz("6612154861");

lub

            var x = new CheckVat();
            var resp = x.Sprawdz("6612154861", DateTime.Parse("2018-02-01"));
0
Panczo napisał(a):

Mój kod pewnie wiele ci nie pomoże bo używałem obiektów www.chilkatsoft.com, i napisałem to w VBScript, ale skoro chcesz, to masz:

......

Dzięki serdeczne za ten kod. Od tygodnia szukałem po necie jak to zrobić w VisualFoxPro i nic jak już coś znalazłem, to klawisz na stronce nie chciał się kliknąć. A ten kod prawie bez zmian (tylko ubrałem w nawiasy parametry w wywołaniach funkcji i usunąłem SETy) zadziałał prawidłowo pod foxem :). Jeszcze raz wielkie dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1