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.
- Rejestracja:prawie 8 lat
- Ostatnio:prawie 8 lat
- Postów:2
- Rejestracja:około 11 lat
- Ostatnio:ponad 3 lata
- Postów:518
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ś.

- Rejestracja:około 11 lat
- Ostatnio:ponad 3 lata
- Postów:518
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.
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/

- Rejestracja:ponad 9 lat
- Ostatnio:6 miesięcy
- Lokalizacja:Czudec
- Postów:59
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ś ?
Może Phantomjs dla windows i skrypt sprawdzenieStatusuPodmiotuWVAT.js ze strony:
https://gist.github.com/srsbiz/1cd71dbe79369dd1682ddb2b2275a8e2
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

Tutaj jest gotowy program który sprawdza kontrahentów ze strony VIES oraz Ministerstwa Finansów http://nipreporter.pl/
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;
- Rejestracja:prawie 12 lat
- Ostatnio:prawie 5 lat
- Lokalizacja:Warszawa
- Postów:1683
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
- Rejestracja:ponad 22 lata
- Ostatnio:około 12 godzin
- Postów:3866
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
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?
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
- Rejestracja:ponad 22 lata
- Ostatnio:około 12 godzin
- Postów:3866
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
- Rejestracja:ponad 22 lata
- Ostatnio:około 12 godzin
- Postów:3866
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")
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"));
- Rejestracja:ponad 6 lat
- Ostatnio:ponad 6 lat
- Postów:1
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.