- LegiNote Projesi Geliştirme Hikayesi 2 - Teknoloji Yığını ve Worker
- LegiNote projesi geliştirme hikayesinin ikinci bölümünde, Go dili kullanılarak geliştirilen worker geliştirme süreci ele alınmaktadır. Veri toplama ve güncelleme mantığının uygulanması ve proje yapılandırması hakkında bilgi verilmektedir.
AI tarafından çevrilmiş metin.
durumis AI tarafından özetlenen yazı
- LegiNote projesi geliştirilirken Meclis Açık API'sini kullanarak yasa teklifi bilgilerini alma işlemi gerçekleştirildi.
- Go dili kullanılarak HTTP Request ile veri istendi ve alınan JSON verisi yapısal veriye ayrıştırıldı.
- API kimlik doğrulama anahtarı almaktan veri isteğine ve ayrıştırmaya kadar olan süreç açıklanıyor ve gelecekteki iyileştirme yönleri araştırılıyor
Merhaba, StatPan burada.
LegiNote yan proje geliştirme sürecini yazıyorum.
Önceki bölümü aşağıdaki bağlantıdan inceleyebilirsiniz.
Çalışan 1 Numaralı worker-bill
Bill ismi, nedense yabancı bir arkadaşın ismi gibi tanıdık geliyor; aşağıdaki kelime anlamından esinlendim.
Daha önce Meclis alan adı ile ilgili çeşitli İngilizce kelimeler ararken uygun değişken ve depo adı bulmak için, o zaman bulduklarımı kullandım.
bill kelimesinin anlamı
Çalışanın hedeflediği veri toplama noktasının OpenAPI spesifikasyonu şöyledir:
Giriş Parametreleri
Yasa Teklifi İnceleme ve İşleme API Giriş Parametresi
Çıkış Parametreleri
Yasa Teklifi İnceleme ve İşleme API Giriş Parametresi
Sağladığı veriler oldukça fazla ve oldukça detaylı bilgiler sunabileceği görünüyor.
HTTP İsteği İçin Gerekliler
Öncelikle yukarıdaki giriş parametrelerine sahip HTTP İsteği göndermek için nelere ihtiyacımız olduğunu inceleyelim:
URL, HTTP isteği yöntemi(burada belirtilmemiş olsa da, Get metodu kullanılıyor. Post kullanılmıyor :( ), KEY, Type, pIndex, pSize değerlerine ihtiyacımız var.
KEY değeri, diğer OpenAPI'larda olduğu gibi ayrı bir doğrulama anahtarı edinmenizi gerektirir.
Geliştirme hikayesi anlatan bir yerde olduğumuz için, referans varsa bağlantı vererek devam etmek isterdim... ancak henüz az bilindiği için mi bilmiyorum, Google'da doğrulama anahtarını alma yöntemini anlatan bir yazı bulamadım... Şimdilik basitçe resim odaklı bir açıklama yapalım...
Anasayfa
Ana ekrandan 'Kişisel Sayfa' düğmesine tıklayın.
Profilim
Kimlik Doğrulama Anahtarı Alma Ekranı
Yukarıdaki ekranda, kullanım amacı veya içeriği için ben 'Kamu Verisi Yarışması' amacıyla kullandığımı belirttim. Bu bölümü doldururken çok fazla endişelenmenize gerek yok, 1-2 satırlık bir sebep belirttiğiniz sürece (olumsuz bir neden değilse) onaylanacağını düşünüyorum.
Böylece elde ettiğiniz anahtar, yukarıdaki HTTP açıklamasında ihtiyaç duyduğumuz KEY'i sağlayacaktır.
Yukarıdaki URL'ye bir istek gönderelim (bir sonraki güncellemede mutlaka metodu da eklemeyi umuyorum).
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)
```
Yukarıdaki kodla öncelikle çalışıp çalışmadığını kontrol ettim.
Bir ipucu vereyim, Header'ı mutlaka eklemeniz gerekiyor. Bu API'yi sorunsuz kullanmak istiyorsanız... (yarı tehdit)
Sonrasında Get URL'sine gerekli parametreleri ekliyoruz.
pIndex ve pSize değerlerinin integer olması gerekiyor ancak string türünü kullanmanız da çalışıyor. (Anlayamadım)
Type'da xml yöntemi de kullanılabiliyor ancak ben Json'u tercih ettim.
Sonuç Değeri
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?...
Yukarıdaki gibi bir sonuç elde edebilirsiniz.
Ben, bu nesneyi doğrudan kontrol etmek için tüm yapıları tanımlayarak değerleri aldım, bu da sayısız hata ayıklama süreci gerektirdi.
Bu değeri yapıya dönüştürme işlemi, karakter sayısı sınırlaması nedeniyle muhtemelen bir sonraki bölümde devam edecektir.
Geliştirme sürecinde 1 istek, bir bölümü tamamen ele geçirdi. Elbette bu OpenAPI'nin kullanım özelliğine bağlı olarak, API kullanımına ve yapı oluşturmaya çok zaman harcadım. Bu konuda diğer geliştiricilerin aynı sıkıntıları yaşamaması için bir çözüm bulmalıyım.
Yukarıdaki isteklerde beklendiği gibi çalışmayan veya garip koduma kızanlar, lütfen birer sigara da getirsinler.