Uthenting av data fra brreg.no

Regulæruttrykk, objektorientering, samt problemstillinger omkring optimalisering og sikkerhet.

Uthenting av data fra brreg.no

Innlegg EspenA » 09.08.2007 5:15

Jeg jobber for tiden med et script som skal hente ut data fra brreg.no. Dette fungerer sånn nogenlunde, men det er fortsatt noen problemer og siden regexps langt ifra er min sterkeste side, trenger jeg litt hjelp. mikaelb har allerede hjulpet meg langt på vei, men det er begrenset hvor lenge jeg kan plage enkeltindivider med irriterende spørsmål...

Aktuell kodesnutt: http://norskwebforum.no/pastebin/9233

Problemstilling: Med utgangspunkt i en definert ID skal all data registrert i brreg.no hentes ut, f.eks. på http://w2.brreg.no/enhet/sok/detalj.jsp?orgnr=990593116.

Om $id settes til 990593116 i scriptet, klarer den å hente ut alt, totalt 18 (0-17) ulike verdier. Om vi derimot endrer den til 985094969, blir det bare 14. Scriptet klarer altså ikke å hente ut:

- Internettadresse
- E-postadresse
- Daglig leder/ adm.direktør

Noen som ser feilen?
«The first time someone calls you a horse you punch him on the nose, the second time someone calls you a horse you call him a jerk but the third time someone calls you a horse, well then perhaps it's time to go shopping for a saddle.»skriblerier.net
Brukerens avatar
EspenA
Seniormedlem
 
Innlegg: 6911
Registrert: 17.09.2002 17:24
Bosted: Oslo

Innlegg H1rik_L » 09.08.2007 15:32

Har ikke funnet feilen, men her er en annen kode som ser ut til å fungere:
Kode: Merk alt
<?php

$text = utf8_encode(file_get_contents('http://w2.brreg.no/enhet/sok/detalj.jsp?orgnr=990593116'));
$matches = array();
preg_match_all(
    '#<tr><td.*?><b>(.*?)</b></td><td.*?>(.*?)</td>#i',
    str_replace('> <', '><', preg_replace('#\s+#', ' ', $text)),
    $matches
);
$matches[2] = array_map('trim', array_map('strip_tags', $matches[2]));
print_r($matches[1]);
print_r($matches[2]);

?>
"[A] rabbit wearing a sign that reads 'chinchilla', in a cage marked 'chinchilla cage', and eating food denoted as 'chinchilla food', is nevertheless a rabbit."
- Judge J. Jacobs, US Tax Court
H1rik_L
Seniormedlem
 
Innlegg: 1250
Registrert: 13.09.2004 14:14
Bosted: Grünerløkka, Oslo

Innlegg EspenA » 09.08.2007 15:51

Ikke noe behov for å finne feilen når kodesnutten din fungerer utmerket :) Takker!
«The first time someone calls you a horse you punch him on the nose, the second time someone calls you a horse you call him a jerk but the third time someone calls you a horse, well then perhaps it's time to go shopping for a saddle.»skriblerier.net
Brukerens avatar
EspenA
Seniormedlem
 
Innlegg: 6911
Registrert: 17.09.2002 17:24
Bosted: Oslo

Re: Uthenting av data fra brreg.no

Innlegg jubajuba » 13.01.2012 20:12

Hei,

Jeg vet dette er en veldig gammel post, men skal dette scriptet fungere fortsatt. Jeg får det ikke til å fungere... Jeg får bare "Array ( ) Array ( ) " som resultat
jubajuba
Nytt medlem
 
Innlegg: 2
Registrert: 13.01.2012 20:08

Re: Uthenting av data fra brreg.no

Innlegg Nukleuz » 14.01.2012 1:37

http://development.giaever.org/pastebin ... aBrreg.php

Skrevet litt om. Mulig det finnes en bedre løsning, men denne lager en array av resultatene.

Organisasjonsform: Enkeltpersonforetak

Kode: Merk alt
$Array = array(
    'Organisasjonsform:' => 'Enkeltpersonforetak'
) 
Mvh
Joachim M. Giæver
http://development.giaever.org
Brukerens avatar
Nukleuz
Seniormedlem
 
Innlegg: 1659
Registrert: 09.12.2006 2:08
Bosted: Tromsø

Re: Uthenting av data fra brreg.no

Innlegg jubajuba » 14.01.2012 3:05

Meget bra. Tusen takk :-) Den kan jeg sikkert bruke til å auto utfylle registreringsskjema nå bruker har tastet inn org.nr.
jubajuba
Nytt medlem
 
Innlegg: 2
Registrert: 13.01.2012 20:08

Re: Uthenting av data fra brreg.no

Innlegg adeneo » 14.01.2012 21:36

Hoi, Jocke!

Litt kort innpå, men jeg skrev noe lignende for kort tid siden til en side jeg har og måtte nok "oppdatere" litt med deler av den koden din da det var enkelte ting som var en del bedre skrevet. :D

Ettersom jeg ikke er så god på PHP så tenkte jeg kanskje du kunne skrive om den koden din til å bli litt mer komplett?

Jeg henter inn e-post med noe slikt:

Kode: Merk alt
preg_match_all('/(<a\shref=")(mailto:)([a-zA-Z@0-9\.]{1,})"/ims',$Content,$mail);
$epost = $mail[3];


Som funker greit nok!

Og på adressen så må man splitte på <br> og deretter på "space" for å få skilt ut postnummer og poststed.

kanskje du til og med har en bedre løsning på hvordan man får dette i ett mer leselig format, jeg bruker i dag html_entity_decode for å bli kvitt alle html entities ettersom de ikke funker i input bokser, og må også kode om til json ettersom dette skal over Ajax.

Jeg har altså en løsning på alt dette som fungerer utmerket, med masse if/else både her og der ettersom brreg sender '-' på tomme felt og annen elendighet, så det er en hel haug med hopp og krumspring i diverse funksjoner for å få rette resultatet, og enda så må jeg til å rette litt på javascript siden, men siden du er slik en ekspert på PHP så hadde jeg håpet at du skrev en skikkelig funksjon for henting av data fra brreg :mrgreen:
adeneo
Medlem
 
Innlegg: 628
Registrert: 08.04.2011 21:09

Re: Uthenting av data fra brreg.no

Innlegg Nukleuz » 17.01.2012 0:05

Hei,

Først: jeg har oppdatert koden litt. Oppdatert kode finnes i linken jeg ga over.

Så.. Adeneo: Kunne du sendt meg på PM den løsningen du har i dag, så skal jeg se om jeg ikke får moddet den til deg :) Litt usikker på hvordan du vil ha det, og da er det ingenting som er bedre en litt kodeknask på dagens løsning :) Bruker ikke slike løsninger i dag selv..
Mvh
Joachim M. Giæver
http://development.giaever.org
Brukerens avatar
Nukleuz
Seniormedlem
 
Innlegg: 1659
Registrert: 09.12.2006 2:08
Bosted: Tromsø

Re: Uthenting av data fra brreg.no

Innlegg adeneo » 22.01.2012 14:51

Har laget en raskt demo (som er litt klipp og lim fra noe annet, så er ikke sikkert alt er som det skal ? ) på hvordan noe slikt bør fungere når det er ferdig, og den kan foreløpig prøves her, bare å taste inn org. nr. i hytt og gevær :shock: : http://webiddy.com/ny/bruker/#registrering

Og så...!
Det tar litt tid, har ikke fått med meg dette før nå Nukleuz, men jeg har en løsning som fungerer greit for meg men tenkte kanskje dette var noe som var nyttig for flere ettersom registreringsskjemaer for bedrifter ofte inneholder et felt for org. nr. og det er litt fancy å hente info rett fra brreg når noen taster inn et org. nr.

Løsningen jeg bruker, litt forkortet, er noe slikt:

Jeg binder en ajax funksjon på keyup i org.nr feltet i registreringsskjemaet:

Kode: Merk alt
$("#orgnr").on('keyup change paste', function() {
      if ($("#orgnr").val().length > 8 && !isNaN($("#orgnr").val())) {
           hentFirma($("#orgnr").val());
      }
});


Denne kjører selvfølgelig på de eventene som er angitt, og sjekker bare at orgnr er over 8 siffer og faktisk er et nummer, og kjører da hentFirma() funksjonen som ser noe slikt ut,

Kode: Merk alt
function hentFirma(orgnr) {
                $.ajax({
                        type: 'POST',
                         data: {org : orgnr},
                         url: '/mappe/hentfirma.php',
                         success: function(data) {
                                var FirmaInfo = data.split('-=-');
                                $.each(FirmaInfo, function() {
                                    var key = this.split(':')[0].toLowerCase();
                                    var value = this.split(':')[1];
                                    if (key.match("foretaksnavn$") && value.length > 1) {
                                            $("#firmanavn").val(value);
                                    }else if (key.match("^epost") && value.length > 5) {
                                            $("#email").val(value);
                                    }
                                    else if (key.match("^telefon") && value.length > 5) {
                                        value = value.replace(/ /g,'');
                                            $("#phone").val(value);
                                    }
                                    else if (key.match("^mobil") && value.length > 5) {
                                        value = value.replace(/ /g,'');
                                            $("#phone").val(value);
                                    }
                                    else if (key.match("^postadresse")) {
                                        if (value.length > 3) {
                                            if (value.search(/<br>/) != -1) {
                                                var newval = value.split('<br>');
                                                $("#adress").val(newval[0]);
                                                if (newval[1].search(/ /) != -1) {
                                                    var newval2 = newval[1].split(' ');
                                                    $("#zip").val(newval2[0]);
                                                    $("#city").val(newval2[1]);
                                                   
                                                }else if (newval[1].length > 2) {
                                                    $("#city").val(newval[1]);
                                                }
                                            }else{
                                                $("#adress").val(value);
                                            }
                                        }
                                    }
                                    else if (key.match("^forretningsadresse")) {
                                        if (value.length > 3) {
                                            if (value.search(/<br>/) != -1) {
                                                var newval = value.split('<br>');
                                                $("#adress").val(newval[0]);
                                                if (newval[1].search(/ /) != -1) {
                                                    var newval2 = newval[1].split(' ');
                                                    $("#zip").val(newval2[0]);
                                                    $("#city").val(newval2[1]);
                                                   
                                                }else if (newval[1].length > 2) {
                                                    $("#city").val(newval[1]);
                                                }
                                            }else{
                                                $("#adress").val(value);
                                            }
                                        }
                                    }
                             });
                         },
                         error: function() {
                              self.showError(0);
                         }
               });
}


Nå er dette del av ett større script på en del hundre linjer som validerer data fortløpende og gjør en hel del andre ting som å sjekke passord, passord styrke, validere mailadresser osv, men det er sånn grovt hva som gjøres i JS for å sette inn verdiene fra PHP, alt valideres og filtreres selvfølgelig også i PHP da skjemaet til slutt sendes til en egen PHP fil som setter dataene inn i databasen, også med Ajax selvfølgelig.

PHP filen som kjøres med ajax for å få tilbake resultatet fra brreg er nå bygget om en del med en del av den koden du postet tidligere :mrgreen: , nok en gang forenklet en del da jeg har noen egne klasser og funksjoner jeg bruker for validering, sikkerhet mot XSS i Ajax funksjoner og annet dilldall som jeg har fjernet fra koden nedenfor, men jeg tror dette er omtrent slik det ville sett ut uten mine egendefinerte funksjoner, og det er vel omtrent akkurat det du har postet tidligere, utover at jeg har lagt til e-post adresser i tillegg og at jeg kjører dette fra en Ajax funksjon hvor $_POST inneholder org nummeret som skal slås opp:

Kode: Merk alt
if(isset($_POST['org'])) {
            $org = $_POST['org'];
            $url = 'http://w2.brreg.no/enhet/sok/detalj.jsp?orgnr='.$org;
            $Content = @file_get_contents($url);
            if ( !$Content ) exit('error');
            $Matches = array();
            $mail = @get_mailto($Content);
            preg_match_all( '/\\<[b|p]\\>([^\\n]+)\\<\\/[b|p]\\>/is', $Content, $Matches );
            $Values = getValues( $Matches );
            foreach ( $Values as $Key => $Value ) {
                echo sprintf( "%s%s", $Key, html_entity_decode($Value, ENT_QUOTES, 'UTF-8') )."-=-";
            }
            echo "epost:$mail[0]";
        }
    }
}

function get_mailto($file){
    $MyCount = preg_match_all('/(<a\shref=")(mailto:)([a-zA-Z@0-9\.]{1,})"/ims',$file,$patterns);
    return $patterns[3];
}

function getValues( $Arr ) {
     if ( !isset( $Arr[1] ) )
        return false;
     $Values = array();
     foreach ( $Arr[1] as $Value ) {
        if ( strpos( $Value, ':' ) )
            $Key = trim( $Value );
        else
            $Values[ isset( $Key ) ? $Key : $Value ] = trim( $Value );
    }
    return $Values;
}
?>


Som du sikker ser legger jeg bare på -=- mellom verdiene, og splitter det i javascript før hver verdi valideres og settes inn i skjemaet, normalt ville det nok vært bedre å bruke json_encode, men det virket enklere å bare legge til en unik streng og så splitte ut i fra den, enn å knote med å gjøre om til json for så konvertere tilbake i javascript igjen.

Som sagt så er dette bare små deler av større scripts, og jeg har bare forsøkt å trekke ut deler for å vise omtrent hvordan jeg gjør det, men jeg tenkte det kunne være nyttig med en PHP funksjon som var litt mer ryddig og ga tilbake et json resultat som var rimelig pålitelig, og på den måten ville det vært enklere for andre å implementere dette, men jeg ser også for meg at det må brukes Ajax, i hvertfall i tilfeller med registreringsskjemaer og slikt, da det blir håpløst om siden skal lastes på nytt hver gang man taster inn org. nr.

Dette opplegget ser ut til å fungere glimrende for meg, og resultatene kommer nærmest umiddelbart, og når man har tastet inn org.nr så fylles resten av skjemaet ut med de dataene som er tilgjengelige fra brreg, og det blir rene oppslagsverket for å sjekke orgnr i brreg, selv om det egentlig er bare en hjelpende hånd for autofill av registreringsskjemaer for bedrifer.
Jeg regner med at flere lager slike skjemaer fra tid til annen, og da kan man vel i hvert fall finne en del hjelp her i denne tråden, og samtidig kanskje finne en PHP dings på din pastebin som henter all data, også e-post, fra brreg og bare echo'er eller printer dette slik at det kan tas igjen med Ajax eller noe lignende.
adeneo
Medlem
 
Innlegg: 628
Registrert: 08.04.2011 21:09

Re: Uthenting av data fra brreg.no

Innlegg Nukleuz » 23.01.2012 10:50

Jarra! :-)


Såååå. Håper at det var noe slikt du mente :P

Merk deg at du kan hente ut bare noen felt, om ønskelig. Dette har jeg gjort for å redusere mengde data man eventuelt skal sende mellom med evt Ajax. Når man gjør det så er den ikke strict, heller mer %LIKE%.

Eks:
Kode: Merk alt

$BrReg 
= new BrRegData( 1800, dirname( __FILE__ ) . DIR_SEP . 'Cache', '0770' );
$Reply = $BrReg->__fetch( '999999999/Navn/Telefon/' );
 


I HandleAjaxRequest.js har jeg søkt med "986529551/Navn/Adresse/Telefon/Mobil/Post/Innehaver/leder". Leder har jeg tatt med fordi det er noen firmaer som ikke har innhaver, men leder navnet blir da å hete "INNEHAVER_FORNAVN" likevel (986529551 hentes jo selvfølgelig ut fra input).

returnedObj.png
Returnert object
returnedObj.png (95.72 KiB) Vist 7047 ganger


(Har ikke finpusset så jævlig på JS, så kan godt hende det smeller i andre nettlereser.... Jeg har brukt Chrome 16.0.912.75 i Ubuntu 11.10)

Edit: Kom med litt mer forklaring jeg.

Edit2: La til "KONTAKTPERSON" også. Noen firmaer har visst det. Nå er prioriteringen slik: INNEHAVER » DAGLIG_LEDER__ADM_DIREKT__R » KONTAKTPERSON, altså finnes ikke INNEHAVER, så prøver vi på neste. "Selection" i Ajax-requesten ble da også slik: /Navn/Adresse/Telefon/Mobil/Post/Innehaver/leder/person
Mvh
Joachim M. Giæver
http://development.giaever.org
Brukerens avatar
Nukleuz
Seniormedlem
 
Innlegg: 1659
Registrert: 09.12.2006 2:08
Bosted: Tromsø

Re: Uthenting av data fra brreg.no

Innlegg adeneo » 23.01.2012 13:39

Se der, det er jo genialt :mrgreen:

Ser mye hyggeligere ut som klasser og ved å hente resultatet på klientesiden med dot notation i stedet for min lille "spanske" med noen skilletegn, må oppdatere litt jeg nå (må bare få dette til å funke med de fire innloggingsmulighetene jeg har på den siden jeg holder med :shock: som støtter innlogging via OpenID, Google og FB, samt en intern løsning med høyere adgang osv. er ikke bare å bare ), men må først få lest i mellom alt og forstå hva som foregår fra topp til bunn, har ikke rukket det enda, bare skummet fort igjennom men det ser helt knall ut.

Det er pussig at ikke brreg har noen skikkelig struktur, men enkelte ganger så inneholder dataene noen merkelige greier, og jeg har sett at det på enkelte adresser er angitt som "c/o Advokat Bjerke <br> Ølstien 4 <br> 3120 Oslo" osv. og det finnes andre rariteter også, men man kan liksom ikke ta høyde for alt, har forøvrig ikke tenkt på at enkelte kanskje bruker MVA foran org nr osv. som var godt observert av deg.
Har også lagt merke til at man får tilbake flere typer navn, adresser og telefonnummer, og at det mest fornuftige er å velge kun en av de, i en eller annen rekkefølge, og det ser fornuftig ut det som er gjort.

Det må da være flere som trenger noe slikt, da registreringsskjemaer finnes snart over alt, og automatiske oppslag er finfine saker og det har lissom manglet en slags ferdig plugin for registrering av Norske brukere.
Laget forøvrig et postnummer oppslag for en stund siden, men med direkte oppslag i brreg for firmaer og nå som de fleste private har en nettleser med autofill, så ser jeg ikke helt vitsen ved å implementere automatisk oppslag av postnummer i et slikt skjema lenger, men en litt sånn "ultimate registreringsskjema plugin", som var enkel å grei å implementere måtte ha vært kjekt for noen og hver, og den løsningen din med php klasser og et enkelt javascript er vel så nærme man kommer noe sånt kanskje, selv om det sikkert ikke er like lett for helt "newbies" å forstå hvordan man setter opp noe slikt.
adeneo
Medlem
 
Innlegg: 628
Registrert: 08.04.2011 21:09

Re: Uthenting av data fra brreg.no

Innlegg Nukleuz » 23.01.2012 14:47

Flott! Ta deg tiden til å lese gjennom det, også kan du jo leke deg litt. Javascript biten jeg har skrevet er nok ikke stein solid, og ble slengt i hop for å vise. Skal man få en mer sømløs/feilfri løsning må man nok jobbe mer med den.

Det man i hovesak bare trenger for å brukt seg av denne er jo "bare" disse tre klassene. Og man kan god bruke den i statiske sider, hvis man skyr JS. Eks slengt opp her (kilde).

Ganske simpelt. Men akk så mye kode... Og du vil sikkert merke på kommenteringen at jeg er litt sveiseblind. Må gå legge meg nå ;-)
Mvh
Joachim M. Giæver
http://development.giaever.org
Brukerens avatar
Nukleuz
Seniormedlem
 
Innlegg: 1659
Registrert: 09.12.2006 2:08
Bosted: Tromsø

Re: Uthenting av data fra brreg.no

Innlegg adeneo » 23.01.2012 15:49

Gå og legg deg du ... ZzZzZzZzZz du fortjener det, jeg vet hvor mye tid det fort vekk går med på å skrive slikt, og at det sannsynligvis er skrevet maange flere linjer som har blitt borte etterhvert som man finner løsninger på diverse problemer osv. Det er pussig hvor lang tid selv enkle ting man trodde skulle være gjort i en fei ofte egentlig tar når man først begynner!

Skal se om jeg rekker å se litt mer på det i morgen, er noe opptatt i kveld, selv om jeg nok ender opp ved edb apparatet i perioder allikevel, som vanlig.
adeneo
Medlem
 
Innlegg: 628
Registrert: 08.04.2011 21:09


Gå til Avansert PHP

Hvem er i forumet

Brukere som leser i dette forumet: Ingen registrerte brukere og 4 gjester