- LegiNote Projet de développement - Partie 2 : Pile technologique et Worker
- Deuxième partie de la série sur le développement du projet LegiNote, qui traite du développement du Worker en utilisant le langage Go. Nous abordons la mise en œuvre de la logique de collecte et de mise à jour des données, ainsi que l'architecture du proj
Texte traduit par l'IA.
Résumé du texte par durumis AI
- Lors du développement du projet LegiNote, nous avons effectué une tâche de récupération d'informations sur les projets de loi à partir de l'API ouverte du Parlement coréen.
- Nous avons utilisé le langage Go pour envoyer des requêtes HTTP afin de demander des données et les avons analysées en les convertissant en structures de données JSON.
- Nous expliquons le processus, de la délivrance de la clé d'API à la demande et à l'analyse des données, et explorons les pistes d'amélioration futures.
Bonjour, je suis StatPan.
Je rédige le journal de développement du projet secondaire LegiNote.
Veuillez consulter le lien suivant pour la partie précédente.
Le worker n°1 : worker-bill
Le nom "bill" a quelque chose de familier, comme le prénom d'un ami étranger. Je me suis inspiré de la signification suivante de ce mot.
Pour trouver des noms de variables et de référentiels appropriés, j'avais précédemment recherché divers mots anglais liés au domaine parlementaire. J'ai donc appliqué ce que j'avais trouvé à l'époque.
Définition du mot bill
Voici les spécifications de l'OpenAPI que le Worker ciblera pour collecter les données.
Paramètres d'entrée
Paramètres d'entrée de l'API d'examen et de traitement des projets de loi
Paramètres de sortie
Paramètres d'entrée de l'API d'examen et de traitement des projets de loi
Les données fournies sont nombreuses et il semble que nous puissions fournir des informations assez détaillées.
Éléments requis pour la requête HTTP
Tout d'abord, examinons ce dont nous avons besoin pour envoyer une requête HTTP avec les paramètres d'entrée ci-dessus.
URL, méthode de requête HTTP(même si ce n'est pas indiqué ici, Get est utilisé. Post n'est pas possible ㅠ), KEY, Type, pIndex, pSize sont nécessaires.
Pour la valeur KEY, comme pour d'autres OpenAPI, vous devez obtenir une clé d'authentification séparée.
Comme il s'agit d'un journal de développement, j'avais prévu d'inclure des liens vers les références... Mais comme il s'agit d'une API encore peu connue, je n'ai pas trouvé d'article sur Google expliquant comment obtenir une clé d'authentification... Pour l'instant, je vais donc simplement vous expliquer cela avec des images...
Page d'accueil
Cliquez sur le bouton "Mon profil" sur l'écran d'accueil.
Mon compte
Écran d'émission de la clé d'API
Dans l'écran ci-dessus, pour l'utilisation prévue ou le contenu, j'ai simplement indiqué que c'était pour un concours de données publiques. Vous n'avez pas à trop vous inquiéter de remplir le contenu, tant que vous n'indiquez pas de raisons douteuses ( ?) en 1 ou 2 lignes, je pense que vous obtiendrez l'approbation immédiatement.
La clé ainsi obtenue vous permettra d'obtenir la KEY nécessaire à l'explication HTTP ci-dessus.
Essayons d'envoyer une requête à l'URL ci-dessus (j'espère qu'à la prochaine mise à jour, la méthode sera également incluse).
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 shown as integer, but it's 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)
```
J'ai pu ainsi vérifier le fonctionnement grâce à ce code.
Un petit conseil : vous devez absolument ajouter l'en-tête (semi-menace). Si vous voulez utiliser cette API correctement, vous devez l'ajouter.
Ensuite, nous remplissons les paramètres obligatoires de l'URL Get.
Pour les valeurs pIndex et pSize, il est indiqué d'utiliser un entier, mais vous pouvez également utiliser un type string (incompréhensible).
Il est possible d'utiliser le format XML pour Type, mais j'ai choisi Json.
Valeur de retour
map[TVBPMBILL11:[map[head:[map[list_total_count:103305] map[RESULT:map[CODE:INFO-000 MESSAGE:Traitement normal terminé.]]]] map[row:[map[AGE:22 BILL_ID:PRC_T2U4C0A8B2Z0A1Y3Y5G2H0F0G5E4F4 BILL_NAME:Proposition de loi portant modification partielle de la loi sur le financement politique 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:Député Go Dong-jin et 10 autres PROPOSER_KIND:Député PROPOSE_DT:2024-08-23 RST_MONA_CD:HS39431V RST_PROPOSER:Go Dong-jin] map[AGE:22 BILL_ID:PRC_O2M4M0L8L2T0R1S3Q5R1P4Q0Y2W2X6 BILL_NAME:Proposition de loi portant modification partielle de la loi sur les partis politiques 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?...
Nous obtenons les résultats ci-dessus.
Personnellement, pour contrôler directement cet objet, je définis toutes les structures et récupère les valeurs. Cela m'a valu de nombreux débogages.
En raison de la limite de caractères, je pense que je devrai continuer la description de la désérialisation de cette valeur dans une structure dans la partie suivante.
Une seule requête a déjà pris toute une partie du journal de développement. Bien sûr, étant donné les caractéristiques de l'utilisation de cette OpenAPI, j'ai passé beaucoup de temps à l'utiliser et à structurer la structure, mais je dois trouver un moyen d'éviter que les autres ne subissent les mêmes souffrances.
Si le comportement de la requête ci-dessus ne correspond pas à vos attentes ou si vous n'êtes pas satisfait de mon code étrange, n'hésitez pas à me le faire savoir.