- Storie di sviluppo del progetto LegiNote 2 - Stack tecnologico e worker
- Il secondo capitolo della storia dello sviluppo del progetto LegiNote, che tratta dello sviluppo di worker utilizzando il linguaggio Go. Viene presentato il modo in cui è stata implementata la logica di raccolta e aggiornamento dei dati e la struttura del
Testo tradotto dall'IA.
Riepilogo del post generato dall'IA di durumis
- Durante lo sviluppo del progetto LegiNote, abbiamo lavorato all'estrazione di informazioni su progetti di legge utilizzando la OpenAPI del Parlamento.
- Abbiamo utilizzato il linguaggio Go per inviare richieste HTTP e recuperare i dati, quindi abbiamo eseguito il parsing dei dati JSON ricevuti in strutture dati.
- Spieghiamo il processo dall'ottenimento della chiave API alla richiesta e al parsing dei dati, esplorando le possibili direzioni di miglioramento future.
Ciao, sono StatPan.
Sto scrivendo la cronistoria dello sviluppo del progetto LegiNote.
Per la parte precedente, consultare il seguente link.
Worker 1: worker-bill
Il nome "bill" mi sembra familiare, come quello di un amico straniero, e l'ispirazione deriva dal significato di questa parola.
Per trovare nomi di variabili e repository appropriati, in passato ho cercato diverse parole inglesi relative al dominio del Parlamento, e ho applicato quelle trovate in quel momento.
Significato della parola 'bill'
La specifica OpenAPI del punto in cui il Worker raccoglierà i dati di destinazione è la seguente.
Parametri di input
Parametri di input dell'API di esame e trattamento dei progetti di legge
Parametri di output
Parametri di input dell'API di esame e trattamento dei progetti di legge
Sembra che fornisca molti dati e che sia possibile fornire informazioni piuttosto dettagliate.
Elementi necessari per la richiesta HTTP
Innanzitutto, vediamo cosa è necessario per la richiesta HTTP dei parametri di input sopra descritti.
URL, metodo di richiesta HTTP(non specificato qui, ma è Get, non Post purtroppo), KEY, Type, pIndex, pSize sono i valori.
Per quanto riguarda il valore KEY, come per altre OpenAPI, è necessario ottenere una chiave di autenticazione separata.
Poiché si tratta di una storia di sviluppo, volevo inserire un link di riferimento, ma a quanto pare è ancora poco diffuso, quindi non riesco a trovare su Google un articolo che spieghi come ottenere la chiave di autenticazione... Per ora, vorrei spiegare brevemente con immagini...
Schermata iniziale
Nella schermata iniziale, premere il pulsante "My Page".
Mia pagina
Schermata di rilascio della chiave API
Nella schermata sopra, per quanto riguarda lo scopo o il contenuto dell'utilizzo, nel mio caso ho semplicemente scritto "scopo di partecipazione a una competizione di dati pubblici". Non c'è bisogno di preoccuparsi troppo della compilazione di questa parte, penso che verrà approvata subito, a meno che non si inserisca qualcosa di inappropriato in 1-2 righe...
La chiave ottenuta in questo modo rilascerà la KEY necessaria per la spiegazione HTTP sopra.
Proviamo a inviare una richiesta all'URL sopra indicato (spero che nella prossima versione venga inclusa anche il metodo).
go```go package main import ( "encoding/json" "fmt" "io" "log" "net/http" "net/url" ) func procErr(e error, msg string) { if e != nil { log.Fatal(e, msg) } } func main() { rawUrl := "https://open.assembly.go.kr/portal/openapi/TVBPMBILL11" parsedUrl, err := url.Parse(rawUrl) procErr(err, "err after parsedUrl") params := url.Values{} KEY := "your_key" //change this procErr(err, "err after req, 27") req.Header.Add("Content-Type", "application/json") req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36") params.Add("KEY", KEY) params.Add("Type", "json") // JSON 좋.아 params.Add("pIndex", "1") // this is why it is an integer, I don't know params.Add("pSize", "1") client := &http.Client{} reqURL := fmt.Sprintf("%s?%s", rawUrl, params.Encode()) req, err := http.NewRequest(http.MethodGet, reqURL, nil) res, err := client.Do(req) procErr(err, "err, after client do") defer res.Body.Close() var jsonMap any response, err := io.ReadAll(res.Body) procErr(err, "err after read response") err = json.Unmarshal(response, &jsonMap) procErr(err, "err after json unmarshal") fmt.Println(jsonMap)
```
Con il codice sopra, sono riuscito a verificare il funzionamento.
Un consiglio: è necessario aggiungere l'intestazione (Header). Se si desidera utilizzare questa API senza problemi (minaccia velata).
Successivamente, si completano i parametri obbligatori nell'URL Get.
I valori di pIndex e pSize sono indicati come interi, ma funzionano anche se si applica il tipo string. (Incomprensibile)
È possibile utilizzare anche il formato XML per il tipo, ma io ho scelto JSON.
Valore di ritorno
map[TVBPMBILL11:[map[head:[map[list_total_count:103305] map[RESULT:map[CODE:INFO-000 MESSAGE:Elaborazione completata correttamente.]]]] map[row:[map[AGE:22 BILL_ID:PRC_T2U4C0A8B2Z0A1Y3Y5G2H0F0G5E4F4 BILL_NAME:Progetto di legge recante modifiche parziali alla legge sui finanziamenti politici BILL_NO:2203179 CMT_PRESENT_DT: CMT_PROC_DT: CMT_PROC_RESULT_CD: COMMITTEE_DT: COMMITTEE_PROC_DT: CURR_COMMITTEE: CURR_COMMITTEE_ID: LAW_PRESENT_DT: LAW_PROC_DT: LAW_PROC_RESULT_CD: LAW_SUBMIT_DT: LINK_URL:https://likms.assembly.go.kr/bill/billDetail.do?billId=PRC_T2U4C0A8B2Z0A1Y3Y5G2H0F0G5E4F4 PROC_DT: PROC_RESULT_CD: PROPOSER:On. Go Dong-jin e altri 10 PROPOSER_KIND:Membro del Parlamento PROPOSE_DT:2024-08-23 RST_MONA_CD:HS39431V RST_PROPOSER:Go Dong-jin] map[AGE:22 BILL_ID:PRC_O2M4M0L8L2T0R1S3Q5R1P4Q0Y2W2X6 BILL_NAME:Progetto di legge recante modifiche parziali alla legge sui partiti politici BILL_NO:2203178 CMT_PRESENT_DT: CMT_PROC_DT: CMT_PROC_RESULT_CD: COMMITTEE_DT: COMMITTEE_PROC_DT: CURR_COMMITTEE: CURR_COMMITTEE_ID: LAW_PRESENT_DT: LAW_PROC_DT: LAW_PROC_RESULT_CD: LAW_SUBMIT_DT: LINK_URL:https://likms.assembly.go.kr/bill/billDetail.do?...
Si ottiene il valore di ritorno sopra indicato.
Per controllare direttamente l'oggetto, ho definito tutte le strutture e ho ottenuto i valori, ma anche questo ha richiesto molti debug.
A causa del limite di caratteri, penso che dovrei continuare la descrizione di come eseguire l'unmarshalling in una struttura nella prossima puntata.
Una singola richiesta ha occupato un intero capitolo dello sviluppo. Certo, a causa delle caratteristiche di questa OpenAPI, ho impiegato molto tempo per utilizzare l'API e costruire la struttura della struttura, ma devo trovare un modo per evitare che altri debbano affrontare le stesse difficoltà.
Se durante lo sviluppo si verificano problemi di funzionamento o se non si è soddisfatti del mio codice bizzarro, si prega di fornire anche una sigaretta.