- Historia del desarrollo del proyecto LegiNote 2 - Pila tecnológica y Worker
- La segunda parte de la historia del desarrollo del proyecto LegiNote, que trata sobre el desarrollo del Worker utilizando el lenguaje Go. Se presenta la implementación de la lógica de recopilación y actualización de datos, así como la forma en que se estr
Texto traducido por IA.
Resumen de la publicación por la IA de durumis
- Durante el desarrollo del proyecto LegiNote, realizamos la tarea de obtener información sobre proyectos de ley utilizando la API abierta de la Asamblea Nacional.
- Utilizamos el lenguaje Go para solicitar datos a través de solicitudes HTTP y procesar los datos JSON recibidos en estructuras.
- Explicamos el proceso desde la obtención de la clave de API hasta la solicitud y procesamiento de datos, y exploramos posibles mejoras futuras.
Hola, soy StatPan.
Estoy escribiendo sobre el desarrollo del proyecto paralelo de LegiNote.
Para la parte anterior, consulta el siguiente enlace.
Trabajador 1: worker-bill
El nombre 'bill' suena como el nombre de un amigo extranjero, ¿verdad? Me inspiré en el significado de la siguiente palabra.
Para encontrar nombres de variables y repositorios adecuados, busqué varias palabras en inglés relacionadas con el dominio del parlamento, y usé una de las que encontré en ese entonces.
Significado de la palabra 'bill'
Las especificaciones de OpenAPI del lugar donde el Worker recopilará datos como objetivo son las siguientes.
Parámetros de entrada
Parámetros de entrada de la API de revisión y procesamiento de proyectos de ley
Parámetros de salida
Parámetros de entrada de la API de revisión y procesamiento de proyectos de ley
Parece que proporciona muchos datos y puede proporcionar información bastante detallada.
Elementos necesarios para la solicitud Http
Primero, veamos qué se necesita para la solicitud Http de los parámetros de entrada anteriores.
URL, método de solicitud Http(aunque no se muestra aquí, es Get, no se permite Post ㅠ), KEY, Type, pIndex, pSize son los valores.
En el caso del valor KEY, al igual que con otras OpenAPI, deberá obtener una clave de autenticación por separado.
Como estamos hablando del desarrollo, quería incluir un enlace a la referencia, pero... como todavía es un tema menor, no encuentro ningún artículo en Google que explique cómo obtener la clave de autenticación... En primer lugar, permítanme explicar brevemente con imágenes...
Pantalla de inicio
Haz clic en el botón Mi página en la pantalla de inicio.
Mi página
Pantalla de emisión de claves de API
En la pantalla anterior, en el apartado Propósito de uso o Contenido, en mi caso, escribí brevemente que era para un concurso de datos públicos. No te preocupes demasiado por completar este apartado, ya que creo que te aprobarán con solo 1 o 2 líneas, siempre y cuando no sean razones poco apropiadas (?).
Esa clave que obtienes te emitirá la KEY necesaria para la explicación HTTP anterior.
Vamos a enviar una solicitud a la URL anterior (espero que en la próxima actualización también se incluya el método).
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 integer is displayed but it's a string 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)
```
Pude verificar el funcionamiento utilizando el código anterior.
Un consejo: asegúrate de agregar el encabezado. Si quieres usar esta API sin problemas, tienes que hacerlo (semiamenaza).
Después, completa los parámetros obligatorios en la URL Get.
Los valores de pIndex y pSize se muestran como enteros, pero funcionan incluso si usas el tipo string. (No lo entiendo).
También puedes usar el formato xml para Type, pero yo elegí Json.
Valor resultante
map[TVBPMBILL11:[map[head:[map[list_total_count:103305] map[RESULT:map[CODE:INFO-000 MESSAGE:정상 처리되었습니다.]]]] map[row:[map[AGE:22 BILL_ID:PRC_T2U4C0A8B2Z0A1Y3Y5G2H0F0G5E4F4 BILL_NAME:정치자금법 일부개정법률안 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:고동진의원 등 10인 PROPOSER_KIND:의원 PROPOSE_DT:2024-08-23 RST_MONA_CD:HS39431V RST_PROPOSER:고동진] map[AGE:22 BILL_ID:PRC_O2M4M0L8L2T0R1S3Q5R1P4Q0Y2W2X6 BILL_NAME:정당법 일부개정법률안 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?...
Puedes obtener el valor resultante anterior.
Para controlar directamente ese objeto por separado, definí todas las estructuras y obtuve los valores, pero eso también me llevó muchos procesos de depuración.
Creo que tendré que continuar con la parte de descomprimir en estructura ese valor en la siguiente parte debido a la limitación de caracteres.
Una sola solicitud ocupó toda una parte del registro de desarrollo. Por supuesto, debido a la naturaleza de esta API, se pasó mucho tiempo usándola y estableciendo la estructura de la estructura, pero necesito encontrar una manera de evitar que otros pasen por el mismo dolor.
Si alguna de las solicitudes anteriores no funciona como se espera o si no te gusta mi código extraño, por favor, tráeme también cigarrillos.