- História do Desenvolvimento do Projeto LegiNote 2 - Pilha de Tecnologia e Worker
- A segunda parte da história do desenvolvimento do projeto LegiNote aborda o desenvolvimento de workers usando a linguagem Go. O conteúdo inclui a implementação da lógica de coleta e atualização de dados, além da apresentação da estrutura do projeto.
Texto traduzido pela IA.
Resumo do texto pela IA do durumis
- Durante o desenvolvimento do projeto LegiNote, realizamos a tarefa de obter informações sobre propostas de lei por meio da API aberta do Parlamento Nacional.
- Utilizamos a linguagem Go para solicitar dados por meio de requisições HTTP e, em seguida, analisar os dados JSON recebidos em estruturas de dados.
- Descrevemos o processo desde a emissão da chave de API até a solicitação e análise de dados, buscando aprimoramentos futuros.
Olá, sou o StatPan.
Estou escrevendo sobre o desenvolvimento do projeto paralelo LegiNote.
Para a parte anterior, consulte o seguinte link.
Trabalhador 1: worker-bill
O nome "bill" soa familiar, como o nome de um amigo estrangeiro, e a inspiração veio do significado da palavra.
Para encontrar nomes de variáveis e repositórios adequados, pesquisei várias palavras em inglês relacionadas ao domínio do parlamento anteriormente, e usei uma delas que encontrei naquela época.
Significado da palavra 'bill'
As especificações da OpenAPI do local onde o Worker coletará dados como alvo são as seguintes.
Parâmetros de entrada
Parâmetros de entrada da API de análise e processamento de propostas de lei
Parâmetros de saída
Parâmetros de entrada da API de análise e processamento de propostas de lei
Parece que muitos dados são fornecidos e que informações bastante detalhadas podem ser servidas.
Materiais de solicitação HTTP
Primeiro, vamos ver o que é necessário para fazer uma solicitação HTTP com os parâmetros de entrada acima.
URL, método de solicitação HTTP(não está aqui, mas é Get, Post não é permitido ㅠ), KEY, Type, pIndex, pSize valores.
No caso do valor KEY, você precisará obter uma chave de autenticação separada, assim como em outras APIs abertas.
Como este é um espaço para histórias de desenvolvimento, eu queria fornecer um link para referência, mas... como ainda é menor, não há artigos no Google sobre como obter uma chave de autenticação... Por enquanto, vamos dar uma olhada nas imagens aqui rapidamente...
Tela inicial
Clique no botão Minha página na tela inicial.
Minha página
Tela de emissão de chave de API
Na tela acima, para o propósito ou conteúdo de uso, no meu caso, escrevi brevemente que era para fins de competição de dados abertos. Não precisa se preocupar muito com a parte de preenchimento do conteúdo, acho que você receberá aprovação imediatamente, desde que não sejam 1 ou 2 linhas de razões suspeitas (?).
A chave obtida fornecerá a KEY necessária para a descrição HTTP acima.
Vamos enviar uma solicitação para o URL acima (espero que o método também seja incluído na próxima atualização).
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") // 이건 왜 integer로 표시했는지 모르겠지만 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)
```
Com o código acima, consegui verificar o funcionamento.
Uma dica é que você precisa adicionar o cabeçalho obrigatoriamente. Se quiser usar esta API sem problemas. (semi-ameaça)
Depois, preencha os parâmetros obrigatórios na URL Get.
Os valores de pIndex e pSize são especificados como inteiros, mas você pode usar o tipo string também. (incompreensível)
O método XML também pode ser usado para o tipo, mas escolhi 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?...
Você pode obter o valor resultante acima.
Para controlar diretamente o objeto separadamente, defini todas as structs e obtive os valores, o que também levou a inúmeras depurações.
A conversão de Unmarshal deste valor para struct provavelmente precisará ser continuada na próxima parte devido à limitação de caracteres.
Uma única solicitação consumiu toda uma parte do desenvolvimento. Claro, considerando a natureza do uso desta API aberta, gastei muito tempo usando a API e estabelecendo a estrutura da struct, mas preciso encontrar uma maneira de evitar que outras pessoas passem pelo mesmo sofrimento.
Se algo não funcionar conforme o esperado em uma das solicitações acima ou se você tiver alguma reclamação sobre meu código estranho, por favor, me avise também.