Skip to content

Instantly share code, notes, and snippets.

@fregmented
Last active February 19, 2018 11:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fregmented/8472b3d68d416b519d5b50b26db3374d to your computer and use it in GitHub Desktop.
Save fregmented/8472b3d68d416b519d5b50b26db3374d to your computer and use it in GitHub Desktop.
SK플래닛 Weather Planet에서 날씨정보 받아오는 파이썬 스크립트입니다. 기상청 AWS station명으로 분단위 실시간 기상정보를 받아옵니다.
from requests import get
from enum import IntEnum
SK_PLANET_APP_KEY = "KEEEEEEY"
class Stations(IntEnum):
def __str__(self):
return "{}".format(self.value)
속초 = 90
양양공항 = 92
북춘천 = 93
철원 = 95
독도 = 96
동두천 = 98
파주 = 99
대관령 = 100
춘천 = 101
백령도 = 102
북강릉 = 104
강릉 = 105
동해 = 106
서울 = 108
김포공항 = 110
인천 = 112
인천공항 = 113
원주 = 114
울릉도 = 115
관악레이더 = 116
수원 = 119
영월 = 121
충주 = 127
서산 = 129
울진 = 130
청주 = 131
대전 = 133
추풍령 = 135
안동 = 136
상주 = 137
포항 = 138
군산 = 140
대구 = 143
전주 = 146
울산공항 = 151
울산 = 152
창원 = 155
광주 = 156
부산 = 159
부산레이더 = 160
통영 = 162
무안공항 = 163
목포 = 165
여수공항 = 167
여수 = 168
흑산도 = 169
완도 = 170
고창 = 172
순천 = 174
첨찰산 = 175
홍성 = 177
제주공항 = 182
제주 = 184
고산 = 185
성산 = 188
서귀포 = 189
진주 = 192
강화 = 201
양평 = 202
이천 = 203
인제 = 211
홍천 = 212
태백 = 216
정선군 = 217
제천 = 221
보은 = 226
북격렬비도 = 229
천안 = 232
보령 = 235
부여 = 236
금산 = 238
부안 = 243
임실 = 244
정읍 = 245
남원 = 247
장수 = 248
고창군 = 251
영광군 = 252
김해시 = 253
순창군 = 254
북창원 = 255
양산시 = 257
보성군 = 258
강진군 = 259
장흥 = 260
해남 = 261
고흥 = 262
의령군 = 263
함양군 = 264
광양시 = 266
진도군 = 268
봉화 = 271
영주 = 272
문경 = 273
청송군 = 276
영덕 = 277
의성 = 278
구미 = 279
영천 = 281
경주시 = 283
거창 = 284
합천 = 285
밀양 = 288
산청 = 289
거제 = 294
남해 = 295
말도 = 300
임자도 = 301
장산도 = 302
가거도 = 303
신지도 = 304
여서도 = 305
소리도 = 306
옥도 = 308
궁촌 = 310
가야산 = 311
주왕산 = 312
양지암 = 313
덕유봉 = 314
성삼재 = 315
무등산 = 316
모악산 = 317
용평 = 318
천부 = 319
향로봉 = 320
원통 = 321
상서 = 322
마현 = 323
송계 = 324
백운 = 325
용문산 = 326
우암산 = 327
중문 = 328
아라 = 329
대흘 = 330
남면 = 351
장흥면 = 352
덕정동 = 353
서탄면 = 355
고덕면 = 356
현덕면 = 358
선단동 = 359
내촌면 = 360
영중면 = 361
분당구 = 364
석수동 = 365
오전동 = 366
신현동 = 367
수택동 = 368
수리산길 = 369
이동묵리 = 370
기흥구 = 371
은현면 = 372
남방 = 373
청북 = 374
백석읍 = 375
강남 = 400
서초 = 401
강동 = 402
송파 = 403
강서 = 404
양천 = 405
도봉 = 406
노원 = 407
동대문 = 408
중랑 = 409
기상청 = 410
마포 = 411
서대문 = 412
광진 = 413
성북 = 414
용산 = 415
은평 = 416
금천 = 417
한강 = 418
중구 = 419
성동 = 421
북악산 = 422
구로 = 423
강북 = 424
남현 = 425
경기 = 430
신곡 = 431
향남 = 432
부천 = 433
안양 = 434
고잔 = 435
역삼 = 436
광명 = 437
군포 = 438
태안진안 = 439
설봉 = 440
김포 = 441
지월 = 442
보개 = 443
하남 = 444
의왕 = 445
남촌 = 446
북내 = 447
산북 = 448
양평옥천 = 449
주교 = 450
오남 = 451
신북 = 452
소하 = 453
하봉암 = 454
읍내 = 455
연천 = 456
춘궁 = 457
퇴촌 = 458
오포 = 459
실촌 = 460
마장 = 461
모가 = 462
흥천 = 463
점동 = 464
가남 = 465
금사 = 466
양성 = 467
서운 = 468
일죽 = 469
고삼 = 470
송탄 = 471
포승 = 472
포천가산 = 473
영북 = 474
관인 = 475
화현 = 476
상패 = 477
왕징 = 478
장남 = 479
미산 = 480
탄현 = 481
광탄 = 482
진동 = 483
창현 = 484
신천 = 485
외서 = 486
대곶 = 487
송산 = 488
서신 = 489
초성리 = 490
군남 = 491
학온동 = 492
세종고운 = 494
하개정 = 495
세종금남 = 496
삽당령 = 497
구룡령 = 498
중면 = 499
양도 = 500
대연평 = 501
교동 = 502
도라산 = 503
포천 = 504
가평조종 = 505
금촌 = 506
창수 = 507
왕산 = 508
관악 = 509
영등포 = 510
공촌동 = 511
인천연수 = 512
덕적도 = 513
대부도 = 514
운평 = 515
안성 = 516
간성 = 517
해안 = 518
사내 = 519
설악동 = 520
강현 = 521
화촌 = 522
주문진 = 523
강문 = 524
봉평 = 525
평창 = 526
신동 = 527
백령면 = 528
원덕 = 529
태하 = 530
가평북면 = 531
의정부 = 532
신둔 = 533
장호원 = 534
서석 = 535
횡성 = 536
임계 = 537
신서 = 538
포천이동 = 539
고양 = 540
남양주 = 541
청평 = 542
영종도 = 543
전곡항 = 544
안산 = 545
경기광주 = 546
양동 = 547
여주 = 548
용인 = 549
오산 = 550
평택 = 551
김화 = 552
대진 = 553
미시령 = 554
화천 = 555
양구 = 556
기린 = 557
팔봉 = 558
내면 = 559
진부 = 560
청일 = 561
영월주천 = 562
북평 = 563
시흥 = 565
연곡 = 566
적성 = 567
일동 = 568
구리 = 569
금곡 = 570
화성 = 571
성남 = 572
청운 = 573
대신 = 574
용인이동 = 575
백암 = 576
장봉도 = 577
호도 = 578
하장 = 579
옥계 = 580
상동 = 581
신림 = 582
안흥 = 583
신남 = 585
북산 = 586
방산 = 587
남산 = 588
능곡 = 589
과천 = 590
치악산 = 591
부론 = 592
양양영덕 = 593
서화 = 594
진부령 = 595
오색 = 596
대화 = 597
양주 = 598
광릉 = 599
금왕 = 600
단양 = 601
진천 = 602
괴산 = 603
옥천 = 604
영동 = 605
대산 = 606
근흥 = 607
홍북 = 608
삽시도 = 609
홍성죽도 = 610
세종연서 = 611
공주 = 612
서천 = 614
논산 = 615
당진 = 616
성거 = 617
청양 = 618
음성 = 619
엄정 = 620
수산 = 621
수안보 = 622
증평 = 623
상당 = 624
속리산 = 625
옥천청산 = 626
태안 = 627
예산 = 628
세종전의 = 629
노은 = 630
송도 = 631
유구 = 632
정안 = 633
아산 = 634
양화 = 635
계룡 = 636
신평 = 637
영춘 = 638
덕산 = 639
청천 = 640
대청 = 641
문화 = 642
세천 = 643
연무 = 644
서부 = 645
춘장대 = 646
가곡 = 647
장동 = 648
부평 = 649
양지 = 650
외촌 = 651
연천청산 = 652
자월도 = 654
소청도 = 655
볼음도 = 656
대천항 = 657
만리포 = 658
계룡산 = 659
면온 = 660
현내 = 661
승봉도 = 662
목덕도 = 663
영흥도 = 664
무의도 = 665
안도 = 666
옹도 = 667
외연도 = 669
양양 = 670
청호 = 671
상하 = 672
진영 = 673
사북 = 674
남이섬 = 675
위성센터 = 676
평화 = 680
원동 = 681
임남 = 682
오창가곡 = 683
춘천신북 = 684
강정 = 685
대곡 = 686
봉산 = 688
풍산 = 690
정산 = 691
백학 = 692
오창 = 693
원효봉 = 694
광덕산 = 695
신기 = 696
서거차도 = 697
해제 = 698
무안 = 699
어청도 = 700
무주 = 701
익산 = 702
진안 = 703
변산 = 704
담양 = 706
지도 = 707
광산 = 708
구례 = 709
나주 = 710
이양 = 711
순천시 = 712
광양읍 = 713
자은도 = 714
하의도 = 716
의신 = 717
상조도 = 718
선유도 = 719
보길도 = 720
금일 = 721
조선대 = 722
거문도 = 723
추자도 = 724
우도 = 725
마라도 = 726
유수암 = 727
장성 = 730
영암 = 731
보성 = 732
함라 = 733
완주 = 734
덕유산 = 735
진봉 = 736
김제 = 737
줄포 = 738
심원 = 739
화순 = 741
운남 = 742
비금 = 743
산이 = 744
성전 = 745
땅끝 = 746
청산도 = 747
벌교 = 748
도양 = 749
백야 = 750
선흘 = 751
서광 = 752
어리목 = 753
함평 = 754
화순북 = 755
위도 = 756
진안주천 = 757
동향 = 758
뱀사골 = 759
복흥 = 760
태인 = 761
강진면 = 762
여산 = 763
신덕 = 764
복내 = 765
여수산단 = 766
포두 = 767
곡성 = 768
염산 = 769
다도 = 770
안좌 = 771
수유 = 772
학산 = 773
전남도청 = 774
월야 = 775
현산 = 776
관산 = 777
유치 = 778
한림 = 779
제주남원 = 780
구좌 = 781
성판악 = 782
과기원 = 783
시종 = 784
북일 = 785
돌산 = 786
도화 = 787
풍암 = 788
압해도 = 789
나로도 = 790
피아골 = 791
표선 = 792
대정 = 793
황전 = 794
옥과 = 795
초도 = 796
하태도 = 797
홍도 = 798
낙월도 = 799
후포 = 800
영양 = 801
온정 = 802
옥산 = 803
청하 = 804
죽장 = 805
선산 = 806
의흥 = 807
호미곶 = 808
대덕 = 809
성주 = 810
황성 = 811
고령 = 812
청도 = 813
부석 = 814
예천 = 815
구룡포 = 816
수비 = 817
마성 = 818
예안 = 819
하회 = 820
공성 = 821
김천 = 822
군위 = 823
칠곡가산 = 824
칠곡 = 825
신령 = 826
경산 = 827
달성 = 828
외동 = 829
기계 = 830
석포 = 831
안계 = 832
은척 = 833
화서 = 834
봉화읍 = 835
현서 = 836
이산 = 837
동로 = 838
길안 = 839
하양 = 840
화북 = 841
산내 = 842
금강송 = 843
영덕읍 = 844
대구북구 = 845
서구 = 846
소보 = 847
청도금천 = 848
지보 = 849
감포 = 850
소곡 = 851
죽변 = 852
팔공산 = 853
삼동 = 854
가파도 = 855
광양백운산 = 856
완도읍 = 857
지산 = 858
토함산 = 859
신암 = 860
월정 = 861
김녕 = 862
외도 = 863
완산 = 864
오등 = 865
용강 = 866
삼각봉 = 867
사제비 = 868
영실 = 869
진달래밭 = 870
윗세오름 = 871
지리산 = 872
원주백운산 = 873
동송 = 874
설악산 = 875
삼척 = 876
문막 = 877
도계 = 878
스키점프 = 879
금악 = 880
새만금 = 881
상무대 = 882
봉성 = 883
과천기상청 = 884
태풍센터 = 885
군산산단 = 886
세종연기 = 887
청남대 = 888
현충원 = 889
신례 = 890
색달 = 891
두서 = 900
울기 = 901
시천 = 902
도천 = 903
사상 = 904
양산상북 = 905
화개 = 906
삼천포 = 907
진해 = 908
서이말 = 909
영도 = 910
매물도 = 911
백천 = 912
상주면 = 913
서하 = 914
삼가 = 915
단성 = 916
사천 = 917
고성 = 918
창녕 = 919
함안 = 920
가덕도 = 921
단장 = 922
기장 = 923
간절곶 = 924
생림 = 925
진북 = 926
송백 = 927
개천 = 929
사량도 = 930
욕지도 = 931
하동 = 932
금남 = 933
수곡 = 934
청덕 = 935
신포 = 936
해운대 = 937
부산진 = 938
금정구 = 939
동래 = 940
북구 = 941
대연 = 942
매곡 = 943
길곡 = 944
대병 = 945
북상 = 946
명사 = 947
삼장 = 948
정자 = 949
사하 = 950
내장산 = 951
장목 = 953
온산 = 954
서수도 = 955
가대암 = 956
십이동파 = 957
갈매여 = 958
해수서 = 959
지귀도 = 960
간여암 = 961
광안 = 962
이덕서 = 963
풍도 = 966
도리도 = 967
남항 = 968
북항 = 969
def get_weather(station_name, get_alert_info=True):
try:
station_id = Stations[station_name]
req_params = {
'version': 2, 'stnid': station_id}
req_header = {
'Accept': "application/json",
'Content-Type': "application/json; charset=UTF-8",
'Accept-Encoding': "gzip, deflate, sdch",
'appKey': SK_PLANET_APP_KEY
}
req = get("https://api2.sktelecom.com/weather/current/minutely",
params=req_params, headers=req_header)
resp = req.json()
try:
if not resp.get("result").get("code") == 9200:
return resp.get("result").get("message")
except Exception as e:
return resp.get("error").get("message")
info = resp.get("weather").get("minutely")[0]
result_string = "관측소({}) {} 현재({}℃)/최고({}℃)/최저({}℃){}"\
"풍속: {}m/s({}){}강수중: {} 강수량(현재): {}{}".format(
get_station_name(resp),
info.get("sky").get("name"),
info.get("temperature").get("tc"),
info.get("temperature").get("tmax"),
info.get("temperature").get("tmin"),
" 습도: {}% ".format(info.get("humidity"))\
if info.get("humidity")
else " ",
info.get("wind").get("wspd"),
get_wind_direction(info.get("wind").get("wdir")),
" 기압: {}hPa ".format(info.get("pressure").get("surface"))\
if info.get("pressure").get("surface")\
else " ",
get_precipitation(info.get("precipitation")),
info.get("rain").get("sinceOntime") \
if info.get("precipitation").get("type") == "1" or \
info.get("precipitation").get("type") == "0" \
else info.get("precipitation").get("sinceOntime"),
"mm"\
if info.get("precipitation").get("type") == "1" or \
info.get("precipitation").get("type") == "0" \
else "cm"
)
if get_alert_info:
if resp.get("common").get("alertYn") == "Y":
result_string += get_alert(*get_station_coord(resp))
if resp.get("common").get("stormYn") == "Y":
result_string += get_typhoon(*get_station_coord(resp))
print(result_string)
return result_string
except Exception as e:
print("에러가 발생하였습니다.", e)
def get_station_coord(resp):
station = resp.get("weather").get("minutely")[0].get("station")
return station.get("latitude"), station.get("longitude")
def get_station_name(resp):
station = resp.get("weather").get("minutely")[0].get("station")
return "{}".format(station.get("name"))
def get_wind_direction(degree):
degree = float(degree)
if degree >= 348.75 or degree < 11.25:
return "N"
elif degree >= 11.25 or degree < 33.75:
return "NNE"
elif degree >= 33.75 or degree < 56.25:
return "NE"
elif degree >= 56.25 or degree < 78.75:
return "ENE"
elif degree >= 78.75 or degree < 101.25:
return "E"
elif degree >= 101.25 or degree < 123.75:
return "ESE"
elif degree >= 123.75 or degree < 146.25:
return "SE"
elif degree >= 146.25 or degree < 168.75:
return "SSE"
elif degree >= 168.75 or degree < 191.25:
return "S"
elif degree >= 191.25 or degree < 213.75:
return "SSW"
elif degree >= 213.75 or degree < 236.25:
return "SW"
elif degree >= 236.25 or degree < 258.75:
return "WSW"
elif degree >= 258.75 or degree < 281.25:
return "W"
elif degree >= 281.25 or degree < 303.75:
return "WNW"
elif degree >= 303.75 or degree < 326.25:
return "NW"
elif degree >= 326.25 or degree < 348.75:
return "NNW"
else:
return "WTF"
def get_precipitation(precipitation_info):
if precipitation_info.get("type") == "0":
return "아니오"
elif precipitation_info.get("type") == "1":
return "네(비)"
elif precipitation_info.get("type") == "2":
return "네(진눈깨비)"
elif precipitation_info.get("type") == "3":
return "네(눈)"
def get_alert(lat, lng):
try:
req_params = {
'version': 2, 'lat': lat, 'lon': lng}
req_header = {
'Accept': "application/json",
'Content-Type': "application/json; charset=UTF-8",
'Accept-Encoding': "gzip, deflate, sdch",
'appKey': SK_PLANET_APP_KEY
}
req = get("https://api2.sktelecom.com/weather/severe/alert",
params=req_params, headers=req_header)
resp = req.json()
try:
if not resp.get("result").get("code") == 9200:
return " 특보 에러: " + resp.get("result").get("message")
except Exception as e:
return " 특보 에러: " + resp.get("error").get("message")
info_list = resp.get("weather").get("alert")
result_string = " 특보 :"
if len(info_list) == 0:
return ""
for info in info_list:
string = " ({})발효시간: {}, 지역: {} 특보내용: {} 비고: {}".format(
info_list.index(info)+1,
info.get("timeRelease"),
info.get("areaName"),
info.get("alert60").get("t1"),
info.get("alert60").get("other")
)
print(string)
result_string += string
return result_string
except Exception as e:
print(e)
return " 날씨특보를 가져오는데 실패하였습니다."
def get_typhoon(lat, lng):
try:
req_params = {
'version': 1, 'lat': lat, 'lon': lng}
req_header = {
'Accept': "application/json",
'Accept-Encoding': "gzip, deflate, sdch",
'appKey': SK_PLANET_APP_KEY
}
req = get("https://api2.sktelecom.com/weather/severe/storm",
params=req_params, headers=req_header)
resp = req.json()
try:
if not resp.get("result").get("code") == 9200:
return " 특보 에러: " + resp.get("result").get("message")
except Exception as e:
return " 특보 에러: " + resp.get("error").get("message")
info_list = resp.get("weather").get("alert")
if len(info_list) == 0:
return ""
result_string = " 태풍정보 :"
for info in info_list:
string = " ({})태풍 제{}호({}) 태풍 등급: {} 현재 위치: {} 중심기압: {}hPa 최대풍속: {}m/s".format(
info_list.index(info)+1,
info.get("number"),
info.get("nameKor"),
info.get("status").get("level"),
info.get("status").get("loc"),
info.get("status").get("ps"),
info.get("status").get("ws")
)
result_string += string
return result_string
except Exception as e:
print(e)
return " 태풍정보를 가져오는데 실패하였습니다."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment