Dane z GUS - NIP

0

Witam wszystkich!

Na początku zaznaczę, że nie jestem pewien czy na odpowiednim forum wstawiam mój post. Jeśli nie proszę o korektę.

A teraz do rzeczy..

Klient zażyczył sobie w swoim systemie, aby miał możliwość wyszukania firmy po numerze NIP. Myślę sobie, ok. Idąc tym tropem trafiłem do... GUS. Duża firma posiadająca ogromne ilości danych. Ale ku mojemu zaskoczeniu - negatywnemu - okazało się, że nie! posiadają oni API (darmowe/płatne). Byłem w szoku...
Urywek korespondencji z nimi:

[...] która będzie komunikować się z wyszukiwarką REGON i symulować działania użytkownika na stronie wyszukiwarki, przy czym kod weryfikacyjny musi być pobrany przez wspomnianą aplikację i następnie wprowadzony przez użytkownika, tzn. niedopuszczalne jest rozpoznawanie kodu w sposób automatyczny [...]

Czy możecie mi coś podpowiedzieć/doradzić co zrobić, ew. jak? Bo zupełnie nie wiem jak ten temat ugryźć.. ;/

0
Anoxic napisał(a):

Nie wiem czy o to pomoże, tu masz dwie wyszukiwarki:
https://prod.ceidg.gov.pl/CEIDG/CEIDG.Public.UI/Search.aspx
https://ems.ms.gov.pl/krs/wyszukiwaniepodmiotu

Nie zupełnie mi o to chodziło.., bo wyszukiwarka jest dostępna pod adresem http://www.stat.gov.pl/regon/
Mi bardziej chodzi o implementacje/integracje takowej wyszukiwarki pod własny system. Jakby było API to nie ma problemu, a tak..?!

0

Czy możecie mi coś podpowiedzieć/doradzić co zrobić, ew. jak? Bo zupełnie nie wiem jak ten temat ugryźć.. ;/

Dokładnie tak jak odpisał ci GUS. Gdy użytkownik twojego programu będzie chciał wyszukać firmę po numerze NIP, pobierzesz ze strony odpowiedni token (i/lub inne identyfikatory) oraz obrazek captchy, każesz użytkownikowi przepisać ją i wyślesz wszystko z powrotem.
Na początek polecam prześledzić całą transmisję (a przede wszystkim request, który wysyła przeglądarka). Będziesz musiał ją odtworzyć w swoim programie.

0

Rev a możesz podrzucić czym w tym wypadku musiałbym się zainteresować, bo szczerze przyznam, że nigdy się czymś takim nie interesowałem ani nie robiłem..

0

Wystarczy do tego funkcja, dzięki której będziesz mógł pobrać zawartość podanej strony internetowej. W PHP może być to zestaw z cURL.

0

Dzięki Rev za podpowiedź.. Jednak dalej mam problem. Udało mi się już pobrać kod captcha z ich strony. Ale dalej mam problem z odpowiedzią od nich.. HELP!

POST który musi do nich dotrzeć wygląda następująco:

 
xxxx00&xxxx11=numer_nip&queryTypeRBSet=1nip&verifCodeTF=xxxx
//gdzie xxxx - to kod captcha

wrzucam sobie to do cUrl'a:

 
curl_setopt($ch, CURLOPT_POSTFIELDS, 'ngpdi00=&ngpdi11=7872041662&queryTypeRBSet=1nip&verifCodeTF=ngpdi');

wykorzystuje nagłówki żądania i... pojawia mi się główna strona z wyszukiwarką a nie strona z odpowiedzią... Czy macie jakieś pomysły aby to obejść lub wskazać mi co robię źle?

0

a w drugim zapytaniu przekazujesz ciasteczka odebrane w pierwszym?
"curl cookiejar" w google jak cos

0
dzek69 napisał(a):

a w drugim zapytaniu przekazujesz ciasteczka odebrane w pierwszym?
"curl cookiejar" w google jak cos

W drugim zapytaniu?

Ja to robię tak:

$head = array(
	'POST /regon/ HTTP/1.1',
	'Host: www.stat.gov.pl',
	'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0 FirePHP/0.7.1',
	'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
	'Accept-Language: pl,en-us;q=0.7,en;q=0.3',
	'Accept-Encoding: gzip, deflate',
	'Referer: http://www.stat.gov.pl/regon/',
	'x-insight: activate',
        'Connection: keep-alive'
); 
$curl = curl_init("http://www.stat.gov.pl/regon/");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $head);
curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__) . 'cookies.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__) . 'cookies.txt');
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'queryTypeRBSet=1nip&crmr300=&crmr311=7872110362&verifCodeTF=crmr3');
$stat= curl_exec($curl);
curl_close($curl);

i stoję w miejscu, bo zamiast otrzymanej strony z wynikiem pojawia się dalej strona z wyszukiwarką... Może ma ktoś jakiś pomysł?

0

Zobacz czy plik z ciastkami się w ogóle tworzy, zwróć uwagę czy dirname zwraca Ci końcowy slash, bo chyba nie i może przez problem z zapisem tego pliku nie przyjmuje Ci ciastek.

Dwa - to ty hardkodujesz captchę w kodzie PHP? Tak to wygląda.. Niby jak to ma działać jak captcha jest przecież różna za każdym razem?

Z tymi nagłówkami to trochę przesadziłeś chyba.. nawet nie wiem co "wygra" w takiej bitwie nagłówków w cURL - te z CURLOPT_HTTPHEADER czy te wygenerowane przez cURL tak czy tak (np. POST /regon/ HTTP/1.x)

0
dzek69 napisał(a):

Zobacz czy plik z ciastkami się w ogóle tworzy, zwróć uwagę czy dirname zwraca Ci końcowy slash, bo chyba nie i może przez problem z zapisem tego pliku nie przyjmuje Ci ciastek.

tak, tworzy mi plik z ciastkami

dzek69 napisał(a):

Dwa - to ty hardkodujesz captchę w kodzie PHP? Tak to wygląda.. Niby jak to ma działać jak captcha jest przecież różna za każdym razem?

Captchę pobieram w innym miejscu i wiem że jest inna. SIC! :P

dzek69 napisał(a):

Z tymi nagłówkami to trochę przesadziłeś chyba.. nawet nie wiem co "wygra" w takiej bitwie nagłówków w cURL - te z CURLOPT_HTTPHEADER czy te wygenerowane przez cURL tak czy tak (np. POST /regon/ HTTP/1.x)

jak nie wrzucę tych nagłówków co zapisałem, to pojawi mi się "błąd" z ich strony.

Sprawa wygląda tak:

  1. Mam gotowy formularz z pobranym kodem Captcha.
  2. Wpisuje NIP i kod i klikam sprawdź.
  3. I teraz wykonuje się między innymi to co zapisałem w poprzednim poście, a więc pobranie odpowiedzi ze strony stat.gov.pl/regon/.
    Ale jest problem, bo.. nie ma żadnej odpowiedzi tylko zwraca się strona z formularzem stat.gov.pl a powinna to być strona z danymi firmy(jeśli istnieje). Właśnie w tym miejscu utknąłem. I nie wiem czy czegoś nie dopatrzyłem czy może coś jednak robię źle.
0

Dziwi mnie dlaczego właśnie w Twoim kodzie nie ma tam jakichś zmiennych tylko tak na sztywno edytowałeś kod, żeby nam tu pokazać, przez co nie ułatwiasz, tylko utrudniasz zrozumienie tego wszystkiego ;)
Może wrzuć ogólnie cały kod, nie tylko ostatni krok, będzie możliwość odpalenia tego u siebie i prześledzenia

0

dzek69 kod nie jest za wielce skomplikowany. Ale masz:

$kod = $_REQUEST['verifCodeTF'];
$nip = $_REQUEST[$kod.'11'];

$head = array(
	'POST /regon/ HTTP/1.1',
	'Host: www.stat.gov.pl',
	'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0 FirePHP/0.7.1',
	'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
	'Accept-Language: pl,en-us;q=0.7,en;q=0.3',
	'Accept-Encoding: gzip, deflate',
	'Referer: http://www.stat.gov.pl/regon/',
	'x-insight: activate',
	'Connection: keep-alive'
);

$curl = curl_init("http://www.stat.gov.pl/regon/");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $head);
curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__) . 'cookies.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__) . 'cookies.txt');

curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'queryTypeRBSet=1nip&'.$kod.'00=&'.$kod.'11='.$nip.'&verifCodeTF='.$kod);

$nip_req= curl_exec($curl);
curl_close($curl);

echo $nip_req;

wykonując tą operację powinienem otrzymać w $nip_req odpowiedź od stat.gov.pl z danymi firmy. Czy jednak się mylę?

0

A gdzie masz pierwsze połączenie do serwera? Mówiąc "cały kod" właśnie cały kod mam na myśli

0

Nie bardzo Cię rozumiem.
Po kliknięciu "Sprawdź" na formularzu "nipowym" ajaksowo wykonuje ten kod co podałem powyżej.

0

Pasowałoby też fragment kodu, w którym SERWER WWW pobiera captchę i przekazuje ją dalej do użytkownika. Jeżeli uważasz, że to jest cała obsługa pobierania to obawiam się, że zaciągasz captchę po prostu podając jakiś link do obrazka w HTML i ta captcha jest poprawna dla sesji użytkownika - a ty potem próbujesz wykorzystać ją jako serwer.

0

W sumie masz trochę racji bo kod captcha pobieram podając adres http://www.stat.gov.pl/regon/Captcha.jpg?xxx gdzie xxx to numer captchy.

Z tego co zaobserwowałem, to stat.gov.pl zwraca nam 3 stany:

  1. Stronę z wyszukaną firmą
  2. Stronę z informacją, że brak firmy
  3. Błąd o złym kodzie captcha.

Wykonując ajaxowo kod, który odpowiada za obsługę formularza (a więc ten co wpisałem wcześniej) powinienem otrzymać w odpowiedzi od gus którąś z tych 3 informacji. Tak się nie dzieje - zwraca mi stronę z formularzem. Więc wniosek nasuwa mi się sam.. że albo coś źle robię albo nie przekazuję do nich odpowiednich danych...

0

Udało się pograć komuś dane podmiotu na podstawia NIP z bazy GUS REGON?
Jak można, to zrobić?
Ktoś wie jak się, to zrobić i w jakiej technologii?
GUS nie udziela takich informacji? To jakieś tajne?:)
Z kim można się kontaktować?
Istnieją aplikacje/wyszukiwarki(inne niż GUS), które to potrafią?
Więc jest, to jak najbardziej do zrobienia.
Musi istnieć jakieś dostępne przez GUS API.

0

Udało,
Jak zrobić - wszystko jest napisane w tym poście
Jw., technologia dowolna, w jakiej Ci wygodniej
GUS udziela informacji nt. numerów NIP, nie muszą swoich usług wystawiać dla innych
Jeżeli chcesz męczyć ludzi - najlepiej z nikim, to nie jest trudne, wystarczy poczytać
Istnieją, było przeczytać ten topik (to już kolejne pytanie, na które odpowiedź jest w tym temacie!)
Tak
Nie ma API i nie musi, sam urząd pisał, żeby analizować żądania na ich stronie i powtarzać te same operacje u siebie

Czyli podsumowanie: API nie ma i raczej nie będzie, GUS sugeruje zastosować rozwiązania proponowane w tym poście (ale nie kopiuj kodu, bo nie działa, tylko przeczytaj opisowe odpowiedzi), będziesz potrzebował trochę wiedzy (o żądaniach HTTP), żeby to napisać [wszystko jest w np. wiki].

OFF-TOPIC:

Śmiesznie, stawiasz przecinki.

0

Przeczytałem, ale niestety mi nie działa.
czyli podsumowując jak należy, to zrobić:

  1. Wyświetlić użytkownikowi captcha z adresu
    http://www.stat.gov.pl/regon/Captcha.jpg?xxx gdzie xxx to numer captchy: wartość xxx - mam sobie wylosować?

  2. Użytkownik wpisze kod captchy oraz nip, w POST należy przekazać te parametry
    np.
    queryTypeRBSet=1nip&i7pwk00=&i7pwk11=5261040828&verifCodeTF=i7pwk

  3. Robię tak ale zwraca mi stronę i nie ma tam informacji o firmie przypisanej do NIP.
    Co robię nie tak? Jak należy, to dokładanie zrobić?
    Proszę o fragment kodu, który by mi pomógł.
    Proszę o pomoc, dzięki.

To dostałem w odpowiedzi:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl"><head><title>G????wny UrzÄ?d Statystyczny  - Rejestr REGON - wyszukiwarka podmiot??w gospodarki narodowej</title><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta name="Keywords" content="regon,wyszukiwarka,podmioty gospodarcze" /><meta name="Description" content="G????wny UrzÄ?d Statystyczny - Portal Statystyki Publicznej" />  <link rel="stylesheet" type="text/css" href="http://www.stat.gov.pl/PI_gus/css_js/gusg2_PLK_HTML.css" /><link rel="stylesheet" type="text/css" href="web/scrn1003a.css" media="screen" /><link rel="stylesheet" type="text/css" href="web/prnt0928.css" media="print" /><script type="text/javascript" src="web/main0925_x.js" ></script><script type="text/javascript" src="web/msgpl0921.js"> </script></head><body onload="init();"> <div id="topNavi"><div id="topNaviMenu"></div><div id="topNaviSearch"></div></div> <div id="blok_baner"><img src="web/img/baner_main770.jpg" border="0" alt="G????wny UrzÄ?d Statystyczny" title="G????wny UrzÄ?d Statystyczny" /></div>  <div id="blok_main"> <div id="belkaNavi"><div id="belkaNaviC1"><ul id="belkaMenu1"><li><a class="topN" href="http://www.stat.gov.pl"><span></span>Strona g????wna GUS</a></li><li><a class="topN" href="http://www.stat.gov.pl/bip/regon_PLK_HTML.htm"><span></span>Informacje o rejestrze REGON</a></li></ul></div></div><div id="belkaNaviC2"></div><div id="printButtonsHeader" ><p style="margin-left:auto; margin-right:auto;"><input type="button" id="doPrint0B" name="doPrint0B" value="Drukuj" /><input type="button" id="cancelPrint0B" name="cancelPrint0B" value="Anuluj" /></p><hr /></div><div id="printHeader" ><div id="printHeaderLogo"><img width="60" height="50" alt="" src="web/img/guslogo.gif" /></div><div style="display:inline;"><div id="printHeaderTextLine1">G????WNY URZÄ?D STATYSTYCZNY</div><div id="printHeaderTextLine2">Dane z wpisu w rejestrze REGON <span id="printHeaderTextLine3"> stan danych na dzie??: </span>2013-02-21</div></div></div> <div id="container"> <div id="topOfContainer"></div><div id="screenTextHeader" ><h1 id="titleHeader" >Rejestr REGON - wyszukiwarka podmiot??w gospodarki narodowej</h1><p style="text-indent:200px;">stan danych na dzie??:<span style="font-weight:bold">2013-02-21</span></p><noscript><p id="noscriptT" class="message">Twoja przeglÄ?darka ma wy??Ä?czonÄ? obs??ugÄ? JavaScript.<br /><br />Do dzia??ania wyszukiwarki potrzebna jest w??Ä?czona obs??uga JavaScript.<br /></p></noscript><p id="nocookieT" class="message" >Twoja przeglÄ?darka ma wy??Ä?czonÄ? obs??ugÄ? mechanizmu cookies.<br /><br />Do dzia??ania wyszukiwarki potrzebna jest w??Ä?czona obs??uga cookies.<br /></p></div><div id="formDiv" ><form id="regonlineForm" name="regonlineForm" method="post" action="http://www.stat.gov.pl/regon/" ><p id="mainMenuT" ><input type="radio" id="by_0regon_RB" name="queryTypeRBSet" value="0regon" /><label id="by_0regonL" for="by_0regon_RB" class="mainMenuLabel">Wyszukiwanie wg numeru REGON</label><input type="radio" id="by_1nip_RB" name="queryTypeRBSet" value="1nip" /><label id="by_1nipL" for="by_1nip_RB" class="mainMenuLabel">Wyszukiwanie wg numeru NIP</label></p><div id="buttonT" ><div>ProszÄ? wprowadziÄ?:</div><span id="criterion0T"><label id="criterion0L" for="criterion0TF">numer REGON podmiotu</label><input type="text" id="criterion0TF" name="criterion0TF" value="" size="10" maxlength="9"  style="position:absolute;left:180px;"/></span><span id="criterion1T"><label id="criterion1L" for="criterion1TF" style="position:relative; right:139px;">numer NIP podmiotu</label><input type="text" id="criterion1TF" name="criterion1TF" value="" size="10" maxlength="10"  style="position:absolute;left:180px;"/></span><div><label id="verifCodeL" for="verifCodeTF">kod weryfikacyjny z obrazka poni??ej</label></div><div>&nbsp;<input type="text" id="verifCodeTF" name="verifCodeTF" value="" size="10" maxlength="5" /></div><script type="text/javascript">var bar0 = barInstance(0);</script><span id="captchaImg" ><img name="captchaImg" width="200" height="50" alt="" src="web/img/dummy.jpg" /></span><div id="otherVerifCodeBSpan" ><div>Je??li kod jest nieczytelny -</div><input type="button" id="otherVerifCodeB" name="otherVerifCodeB" class="submitLinkB" value="Generuj inny kod" /></div><span id="sendQueryBSpan" ><input type="button" id="sendQueryB" name="sendQueryB" value="Szukaj" class="sendButton" /></span></div></form><div id="plsWaitT" ><div>PROSIMY O OCZEKIWANIE NA ODPOWIED??</div><div>TRWA ??Ä?CZENIE Z BAZÄ? DANYCH</div><br /><script type="text/javascript">var bar1 = barInstance(1);</script></div><span style="display:none;"><input type="text" id="pageIx" name="pageIx" value="0" /> <input type="text" id="wasSubmitted" name="wasSubmitted" value="no" /></span></div><div id="dbResponseDiv" ></div><div id="bottomOfContainer"></div></div> <div id="printButtonsFooter"><hr /><p><input type="button" id="doPrint1B" name="doPrint1B" value="Drukuj" /><input type="button" id="cancelPrint1B" name="cancelPrint1B" value="Anuluj" /></p></div> <div id="stopka">G????wny UrzÄ?d Statystyczny<br />00-925 Warszawa, Al. Niepodleg??o??ci 208, tel.: centrala: (48 22) 608 30 00<br />Informatorium:  (48 22) 608 31 63, (48 22) 608 31 64<br />Automatyczna informacja statystyczna: (48 22) 608 31 35, (48 22) 608 31 36<br /><b>Copyright &copy; 1995- 2013&nbsp;GUS</b></div> </div> <br /><br /></body></html>
0

Otrzymałem odpowiedź o nie poprawnych danych, przesyłam zgodnie z tym jak jest opisane na forum.
Co jest nie tak?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl"><head><title>G????wny UrzÄ?d Statystyczny - Rejestr REGON - wyszukiwarka podmiot??w gospodarki narodowej</title><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta name="Keywords" content="regon,wyszukiwarka,podmioty gospodarcze" /><meta name="Description" content="G????wny UrzÄ?d Statystyczny - Portal Statystyki Publicznej" /> <link rel="stylesheet" type="text/css" href="http://www.stat.gov.pl/PI_gus/css_js/gusg2_PLK_HTML.css" /><link rel="stylesheet" type="text/css" href="web/scrn1003a.css" media="screen" /><link rel="stylesheet" type="text/css" href="web/prnt0928.css" media="print" /></head><body> <div id="topNavi"><div id="topNaviMenu"></div><div id="topNaviSearch"></div></div> <div id="blok_baner"><img src="web/img/baner_main770.jpg" border="0" alt="G????wny UrzÄ?d Statystyczny" title="G????wny UrzÄ?d Statystyczny" /></div> <div id="blok_main"> <div id="belkaNavi"><div id="belkaNaviC1"><ul id="belkaMenu1"><li><a class="topN" href="http://www.stat.gov.pl"><span></span>Strona g????wna GUS</a></li><li><a class="topN" href="http://www.stat.gov.pl/bip/regon_PLK_HTML.htm"><span></span>Informacje o rejestrze REGON</a></li></ul></div></div><div id="belkaNaviC2"></div> <div id="container"> <div id="topOfContainer"></div><div id="screenTextHeader" ><h1 id="titleHeader" >Rejestr REGON - wyszukiwarka podmiot??w gospodarki narodowej</h1></div><div id="dbResponseDiv" style="display:block !important;" ><p class="messageP">Twoja przeglÄ?darka przes??a??a niepoprawne dane<br />lub wystÄ?pi?? inny niezidentyfikowany b??Ä?d.<br />ProszÄ? wykonaÄ? operacjÄ? "Od??wie??" w przeglÄ?darce.<br />Je??li problem wystÄ?puje nadal -<br />proszÄ? spr??buowaÄ? ponownie za kilka minut.</p> <p id="bottomHrefsP"><a href="http://www.stat.gov.pl/bip/regon_PLK_HTML.htm" class="bottom-link">Informacje o rejestrze REGON</a><a href="http://www.stat.gov.pl/" class="bottom-link">Strona g????wna GUS</a></p></div><div id="bottomOfContainer"></div></div></div> <div id="stopka">G????wny UrzÄ?d Statystyczny<br />00-925 Warszawa, Al. Niepodleg??o??ci 208, tel.: centrala: (48 22) 608 30 00<br />Informatorium: (48 22) 608 31 63, 31 64, 31 66, 31 61<br />Automatyczna informacja statystyczna: (48 22) 608 31 35, (48 22) 608 31 36<br />Copyright &copy; 1995- 2013Wszelkie prawa zastrze??one. </div> </div><br /><br /></body></html>

0

Wskazówka: prócz problemów, o których mówisz zwróć uwagę na to, że ciastka są modyfikowane przez javascript. To chyba takie sprytne zabezpieczenie miało być.

A rozwiązaniu całego problemu proxy nie pomaga stanowość aplikacji webowych. Trzeba zrobić w sumie trzy requesty, które odpowiadają trzem działaniom użytkownika po twojej stronie: 1. krok to uzyskanie ciastek początkowych (które będą identyfikatorem sesji), 2. krok to pobranie captcha i zaprezentowanie go użytkownikowi oraz 3. krok to przesłanie wyników.

To, czego wciąż nie robisz to pobranie captchy po stronie proxy - bez tego system GUS nie będzie mógł powiązać zaprezentowanej captchy z tekstem użytkownika.

0

Zrobiłem tak jak pisałeś, wygląda, że jest postęp, ale zwraca mi błąd z ich strony: Twoja przeglądarka jest nie obsługiwana
Dodaję nagłówki: HTTPHEADER
Co jest nie tak?
Co może być przyczyną?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl"><head><title>G????wny UrzÄ?d Statystyczny  - Rejestr REGON - wyszukiwarka podmiot??w gospodarki narodowej</title><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta name="Keywords" content="regon,wyszukiwarka,podmioty gospodarcze" /><meta name="Description" content="G????wny UrzÄ?d Statystyczny - Portal Statystyki Publicznej" />  <link rel="stylesheet" type="text/css" href="http://www.stat.gov.pl/PI_gus/css_js/gusg2_PLK_HTML.css" /><link rel="stylesheet" type="text/css" href="web/scrn1003a.css" media="screen" /><link rel="stylesheet" type="text/css" href="web/prnt0928.css" media="print" /></head><body> <div id="topNavi"><div id="topNaviMenu"></div><div id="topNaviSearch"></div></div> <div id="blok_baner"><img src="web/img/baner_main770.jpg" border="0" alt="G????wny UrzÄ?d Statystyczny" title="G????wny UrzÄ?d Statystyczny" /></div>  <div id="blok_main"> <div id="belkaNavi"><div id="belkaNaviC1"><ul id="belkaMenu1"><li><a class="topN" href="http://www.stat.gov.pl"><span></span>Strona g????wna GUS</a></li><li><a class="topN" href="http://www.stat.gov.pl/bip/regon_PLK_HTML.htm"><span></span>Informacje o rejestrze REGON</a></li></ul></div></div><div id="belkaNaviC2"></div> <div id="container"> <div id="topOfContainer"></div><div id="screenTextHeader" ><h1 id="titleHeader" >Rejestr REGON - wyszukiwarka podmiot??w gospodarki narodowej</h1></div><div id="dbResponseDiv" style="display:block !important;" ><p class="messageP">Twoja przeglÄ?darka nie jest obs??ugiwana.</p> <p id="bottomHrefsP"><a href="http://www.stat.gov.pl/bip/regon_PLK_HTML.htm" class="bottom-link">Informacje o rejestrze REGON</a><a href="http://www.stat.gov.pl/" class="bottom-link">Strona g????wna GUS</a></p></div><div id="bottomOfContainer"></div></div></div>  <div id="stopka">G????wny UrzÄ?d Statystyczny<br />00-925 Warszawa, Al. Niepodleg??o??ci 208, tel.: centrala: (48 22) 608 30 00<br />Informatorium:  (48 22) 608 31 63, 31 64, 31 66, 31 61<br />Automatyczna informacja statystyczna: (48 22) 608 31 35, (48 22) 608 31 36<br />Copyright &copy; 1995- 2013Wszelkie prawa zastrze??one. </div>  </div><br /><br /></body></html>
0

Porównaj absolutnie wszystkie nagłówki, które wysyła przeglądarka. Napiszę jeszcze raz - zwróć uwagę na to, że ciastka są modyfikowane przez javascript! COOKIEJAR i COOKIEFILE tutaj nie wystarczą.

Masz tutaj ich skrypty: https://privatepaste.com/409875077d

0

Nie rozumie, co to znaczy: "ciastka są modyfikowane przez javascript"
Oprócz pobrania ciasteczek przy pierwszym request coś należy jeszcze zrobić?
Oprócz przekazywania ich do dwóch kolejnych request?

0

Znaczy to, co znaczą poszczególne słowa. Dane ciastek mogą być zmieniane przez javascript i w efekcie przeglądarka przesyła inne ciastka. Ty pobierasz ciastka od serwera i podajesz je z powrotem takie same. Musisz sam napisać jakiś parser, albo pseudoparser ciastek, bo cURL jest tragiczny, jeżeli chodzi o ciastka (umie tylko przekazać tam i z powrotem i tylko korzystając z plików do ich przechowywania), a wcześniej - DOKŁADNIE przeanalizować wszystkie żądania.

0

Ostrzegam, że kod nawet w połowie nie jest skończony: brakuje zupełnie obsługi błędów, logowania, a nawet parsowania otrzymanych danych. Wymaga pecl http. Do rozpoczęcia nowego requestu wymagany parametr ?reset.

Klasa:

<?php

class NipRequest
{
    const UNINITIALIZED_PHASE = 0;
    const INITIALIZED_PHASE = 1;
    const CAPTCHA_PHASE = 2;
    const REQUEST_PHASE = 3;
    const COMPLETED_PHASE = 4;

    private $phase;

    private $options;
    private $cookies;

    private $info;

    public function __construct()
    {
        $this->phase = self::UNINITIALIZED_PHASE;
        
        $this->options = array(
            'referer' => 'http://www.stat.gov.pl/regon/',
            'useragent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130224 Firefox/21.0',
            'headers' => array(
                'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                'Accept-Language' => 'Accept-Language=pl,en-us;q=0.7,en;q=0.3'
            ),
            'compress' => true,
            'redirect' => 3,
            'connecttimeout' => 10,
            'timeout' => 10
        );

        $this->cookies = array();
    }

    private function add_cookies($cookies)
    {
        $this->cookies = array_merge($this->cookies, $cookies);
    }

    private function update_cookies($response)
    {
        $headers = $response->getHeaders();
        
        if(array_key_exists('Set-Cookie', $headers)) {
            $cookies = http_parse_cookie(implode(';', $headers['Set-Cookie']));
            $this->add_cookies($cookies->cookies);
        }
    }

    public function get_phase()
    {
        return $this->phase;
    }

    public function initialize()
    {
        $request = new HttpRequest('http://www.stat.gov.pl/regon/', HttpRequest::METH_GET, $this->options);

        $response = $request->send();
        $this->update_cookies($response);

        $this->phase = self::INITIALIZED_PHASE;
    }

    public function fetch_captcha()
    {
        if($this->phase < self::INITIALIZED_PHASE)
            throw new Exception('Cannot get captcha until initialized phase');

        if(!isset($this->captcha))
        {
            $request = new HttpRequest('http://www.stat.gov.pl/regon/Captcha.jpg?' . rand(1, 999), HttpRequest::METH_GET, $this->options);
            $request->setCookies($this->cookies);

            $response = $request->send();
            $this->update_cookies($response);
            $this->captcha = $request->getResponseBody();  
        }

        $this->phase = self::CAPTCHA_PHASE;

        return $this->captcha;
    }

    public function send_request($captcha, $nip)
    {
        if($this->phase != self::CAPTCHA_PHASE)
            throw new Exception('Cannot send request unless in captcha phase');

        $post_fields = array(
            'queryTypeRBSet' => '1nip',
            $captcha . '00' => '',
            $captcha . '11' => $nip,
            'verifCodeTF' => $captcha
        );

        $request = new HttpRequest('http://www.stat.gov.pl/regon/', HttpRequest::METH_POST, $this->options);

        $this->add_cookies(array(
            'lastCritIx' => '1',
            'isAmbiguousAnswer' => 'false',
            'toGenerNewVerifCode' => 'false',
            'cCodeHistory' => $captcha,
            'openingPageType' => '',
            'focusedObjIdGlobal' => 'verifCodeTF',
            'focusedObjCursorPos' => '5',
            'lastCCode' => $captcha,
            'criterion1TF' => $nip,
            'browser' => 'FF-21.0',
            'testCookie' => ''
        ));

        $request->setPostFields($post_fields);
        $request->setCookies($this->cookies);
        $response = $request->send();
        $this->update_cookies($response);

        $this->phase = self::COMPLETED_PHASE;

        $this->info = $request->getResponseBody();
    }

    public function get_response()
    {
        if($this->phase != self::COMPLETED_PHASE)
            throw new Exception('Cannot get response until it\'s sent');

        return $this->info;
    }
}

Przykładowe użycie:

<?php

require 'NipRequest.class.php';

session_start();

if(!isset($_SESSION['request']) || isset($_GET['reset']))
    $_SESSION['request'] = new NipRequest();
$request = &$_SESSION['request'];

if(isset($_GET['captcha'])) {
    header('Content-type: image/jpeg');
    
    print $request->fetch_captcha();
} else {
    if($request->get_phase() < NipRequest::INITIALIZED_PHASE)
        $request->initialize();

    if($request->get_phase() > NipRequest::CAPTCHA_PHASE || (isset($_POST['captcha']) && isset($_POST['nip']))) {
        if($request->get_phase() != NipRequest::COMPLETED_PHASE)
            $request->send_request($_POST['captcha'], $_POST['nip']);

        print $request->get_response();
    } else {
        ?>
            <img src="?captcha">
            <form method="post">
                captcha: <input type="text" name="captcha"><br>
                nip: <input type="text" name="nip"><br>
                <input type="submit" value="wyslij">
            </form>
        <?php
    }
}
0

Czy można to samo osiągnąć za pomocą samego Curl'a ?

0

i tak, i nie, zależy o co pytasz

po stronie serwera (php) curl wystarczy, ale musisz wysłać captchę do oglądającego stronę, curlem captchy nie pokonasz ;)

0

W sensie użyć cURL zamiast pecl http? Tak, bo w gruncie rzeczy ten drugi jest tylko nakładką na tego pierwszego. W swojej przykładowej klasie użyłem go ze względu na lepszą integrację z PHP oraz wbudowane parsowanie nagłówków, w tym ciasteczek. To ostatnie jest tutaj kluczowe i w przypadku korzystania z cURL trzeba by je ręcznie parsować.

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