├── requirements.txt ├── Dockerfile ├── docker-compose.yml ├── Licence.txt ├── ornek.py ├── flask_doviz_server.py ├── DovizKurlari.py └── README.md /requirements.txt: -------------------------------------------------------------------------------- 1 | ET 2 | flask 3 | markdown 4 | 5 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:slim 2 | 3 | 4 | ADD requirements.txt /app/requirements.txt 5 | RUN pip install -r /app/requirements.txt 6 | 7 | ADD . /app 8 | WORKDIR app 9 | 10 | CMD python /app/flask_doviz_server.py 11 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | doviz_microservis: 4 | container_name: tl_doviz_kurlari 5 | image: tayfunulu/tl_doviz_kurlari 6 | restart: always 7 | ports: 8 | - "5000:5000" 9 | -------------------------------------------------------------------------------- /Licence.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Tayfun ULU 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ornek.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | from DovizKurlari import DovizKurlari 4 | # ornek isimli nesne yaratiliyor. 5 | ornek = DovizKurlari() 6 | print ("Bugunun Kurlar : ") 7 | print ("EURO DEGERI="+ornek.DegerSor("EUR","ForexBuying")) 8 | # deger sor fonksiyonu ile USD'nin degeri sorgulaniyor. 9 | Dolar_Deger = ornek.DegerSor("USD","ForexBuying") 10 | print ("DOLAR DEGERI="+Dolar_Deger) 11 | 12 | # Arsiv konusu 13 | print ("\nArsiv'deki bir degere bakalim. 02.02.2015") 14 | print ("EURO DEGERI="+ornek.Arsiv(2,2,2015,"EUR","ForexBuying")) 15 | # 02.02.2015 tarihindeki USD'in degeri sorgulaniyor. 16 | Dolar_Deger = ornek.Arsiv(2,2,2015,"USD","ForexBuying") 17 | print ("DOLAR DEGERI="+Dolar_Deger) 18 | 19 | print ("\nArsiv'deki bir degere bakalim. 10.02.2015") 20 | print ("EURO DEGERI="+ornek.Arsiv_tarih("10.02.2015","USD","ForexBuying")) 21 | Dolar_Deger = ornek.Arsiv_tarih("10.02.2015","USD","ForexBuying") 22 | print ("DOLAR DEGERI="+Dolar_Deger) 23 | 24 | print ("\nArsiv'deki bir degere bakalim ve hata verdigini gorelim. 01.02.2015") 25 | print ("EURO DEGERI="+ornek.Arsiv_tarih("01.02.2015","EUR","ForexBuying")) 26 | Dolar_Deger = ornek.Arsiv_tarih("01.02.2015","EUR","ForexBuying") 27 | print ("DOLAR DEGERI="+Dolar_Deger) 28 | -------------------------------------------------------------------------------- /flask_doviz_server.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, make_response, jsonify, request 2 | from DovizKurlari import DovizKurlari 3 | import markdown 4 | import markdown.extensions.fenced_code 5 | 6 | 7 | kurlar = DovizKurlari() 8 | 9 | app = Flask(__name__) 10 | 11 | @app.route('/') 12 | def index(): 13 | readme_file = open("README.md", "r") 14 | md_template_string = markdown.markdown(readme_file.read(), extensions=["fenced_code"]) 15 | return md_template_string 16 | 17 | 18 | 19 | @app.route('/api/doviz', methods=['GET', 'POST']) 20 | def api_doviz(): 21 | if request.method == "GET": 22 | return make_response(jsonify(kurlar.DegerSor()), 200) 23 | elif request.method == 'POST': 24 | content = request.json 25 | tarih= content['tarih'] 26 | if "tur" in content: 27 | tur= content['tur'] 28 | return make_response(jsonify(kurlar.Arsiv_tarih(tarih).get(tur.upper())), 201) # 201 = ARSIV 29 | else: 30 | return make_response(jsonify(kurlar.Arsiv_tarih(tarih)), 201) # 201 = ARSIV 31 | 32 | 33 | @app.route('/api/doviz/', methods=['GET', 'POST']) 34 | def api_her_doviz(tur): 35 | if request.method == "GET": 36 | Doviz_Value = kurlar.DegerSor().get(tur.upper()) 37 | if Doviz_Value: 38 | return make_response(jsonify(Doviz_Value), 200) 39 | else: 40 | return make_response(jsonify(Doviz_Value), 404) 41 | elif request.method == "POST": # Arsiv 42 | content = request.json 43 | tarih= content['tarih'] 44 | Doviz_Value = kurlar.Arsiv_tarih(tarih).get(tur.upper()) 45 | if Doviz_Value: 46 | return make_response(jsonify(Doviz_Value), 201) 47 | else: 48 | return make_response(jsonify(Doviz_Value), 404) 49 | 50 | @app.route('/api/doviz///', methods=['GET']) 51 | def gun_ay_yil_api(yil,ay,gun): 52 | if request.method == "GET": 53 | Doviz_Value = kurlar.Arsiv(gun,ay,yil) 54 | if Doviz_Value: 55 | return make_response(jsonify(Doviz_Value), 200) 56 | else: 57 | return make_response(jsonify(Doviz_Value), 404) 58 | 59 | @app.route('/api/doviz////', methods=['GET']) 60 | def gun_ay_yil_tur_api(yil,ay,gun,tur): 61 | if request.method == "GET": 62 | Doviz_Value = kurlar.Arsiv(gun,ay,yil).get(tur.upper()) 63 | if Doviz_Value: 64 | return make_response(jsonify(Doviz_Value), 200) 65 | else: 66 | return make_response(jsonify(Doviz_Value), 404) 67 | 68 | 69 | 70 | if __name__ == '__main__': 71 | app.run(debug=True,host="0.0.0.0") 72 | 73 | -------------------------------------------------------------------------------- /DovizKurlari.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding:utf-8 -*- 3 | # Tayfun ULU 4 | # 2016 5 | # 2020 - Flask ile restful-api ekleme ve sadece python3'e dondurme 6 | 7 | import xml.etree.ElementTree as ET 8 | from urllib.request import urlopen 9 | 10 | class DovizKurlari(): 11 | 12 | def __init__(self): 13 | pass 14 | 15 | def __veri_update(self,zaman="Bugun"): 16 | try : 17 | 18 | if zaman == "Bugun": 19 | self.url="http://www.tcmb.gov.tr/kurlar/today.xml" 20 | else: 21 | self.url=zaman 22 | 23 | tree = ET.parse(urlopen(self.url)) 24 | 25 | root = tree.getroot() 26 | self.son={} 27 | self.Kur_Liste=[] 28 | i = 0 29 | for kurlars in root.findall('Currency'): 30 | Kod= kurlars.get('Kod') 31 | Unit = kurlars.find('Unit').text # 1 32 | isim = kurlars.find('Isim').text # ABD DOLARI 33 | CurrencyName = kurlars.find('CurrencyName').text # US DOLLAR 34 | ForexBuying = kurlars.find('ForexBuying').text # 2.9587 35 | ForexSelling = kurlars.find('ForexSelling').text # 2.964 36 | BanknoteBuying = kurlars.find('BanknoteBuying').text # 2.9566 37 | BanknoteSelling = kurlars.find('BanknoteSelling').text # 2.9684 38 | CrossRateUSD = kurlars.find('CrossRateUSD').text # 1 39 | self.Kur_Liste.append(Kod) 40 | #self.son [Kod] = [Kod,isim,CurrencyName,Unit,ForexBuying,ForexSelling,BanknoteBuying,BanknoteSelling,CrossRateUSD] 41 | self.son [Kod] = { 42 | "Kod":Kod, 43 | "isim":isim, 44 | "CurrencyName":CurrencyName, 45 | "Unit":Unit, 46 | "ForexBuying":ForexBuying, 47 | "ForexSelling":ForexSelling, 48 | "BanknoteBuying":BanknoteBuying, 49 | "BanknoteSelling":BanknoteSelling, 50 | "CrossRateUSD":CrossRateUSD 51 | } 52 | 53 | return self.son 54 | 55 | except : 56 | 57 | return "HATA" 58 | 59 | 60 | def DegerSor (self,*sor): 61 | self.__veri_update() 62 | if not(any(sor)): 63 | return self.son 64 | else: 65 | return self.son.get(sor[0]).get(sor[1]) 66 | 67 | def Arsiv (self,Gun,Ay,Yil,*sor): 68 | a=self.__veri_update(self.__Url_Yap(Gun,Ay,Yil)) 69 | if not(any(sor)): 70 | if a == "HATA": 71 | return {"Hata":"TATIL GUNU"} 72 | return self.son 73 | else : 74 | if a == "HATA": 75 | return "Tatil Gunu" 76 | else: 77 | return self.son.get(sor[0]).get(sor[1]) 78 | 79 | def Arsiv_tarih (self,Tarih="",*sor): 80 | takvim = Tarih.split(".") 81 | Gun = takvim[0] 82 | Ay = takvim[1] 83 | Yil = takvim[2] 84 | a=self.__veri_update(self.__Url_Yap(Gun,Ay,Yil)) 85 | if not(any(sor)): 86 | if a == "HATA": 87 | return {"Hata":"TATIL GUNU"} 88 | return self.son 89 | else : 90 | if a == "HATA": 91 | return "Tatil Gunu" 92 | else: 93 | return self.son.get(sor[0]).get(sor[1]) 94 | 95 | def __Url_Yap (self,Gun,Ay,Yil): 96 | if len (str(Gun)) == 1 : 97 | Gun="0"+str(Gun) 98 | if len (str(Ay)) == 1 : 99 | Ay="0"+str(Ay) 100 | 101 | self.url = ("http://www.tcmb.gov.tr/kurlar/"+str(Yil)+str(Ay)+"/"+str(Gun)+str(Ay)+str(Yil)+".xml") 102 | return self.url 103 | 104 | #Ornek Kullanım için 105 | #from DovizKurlari import DovizKurlari 106 | #ornek = DovizKurlari() 107 | #print ornek.DegerSor("EUR",4) 108 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Doviz Kurlari Api Rest - Microservis - Docker 2 | 3 | Türkiye Cumhuriyeti Merkez Bankası sitesinden XML olarak verileri alarak kullanmanızı sağlayacak Python kodu (nesnesi)'dir. Microservis olarak kullanmak içinde Dockerfile dosyası vardır. 4 | 5 | Eğitim ve bilgilendirme amaçlıdır. Ticari bir beklenti yoktur. 6 | 7 | Bilginin Alındığı Sayfa : www.tcmb.gov.tr - https://www.tcmb.gov.tr/kurlar/today.xml 8 | 9 |
10 | 11 | Örnek olması için Google Cloud'da örnek kod : 12 | 13 | https://dovizkurlari-l6vtviaacq-uc.a.run.app/api/doviz/usd 14 | 15 | https://dovizkurlari-l6vtviaacq-uc.a.run.app/api/doviz 16 | 17 | https://dovizkurlari-l6vtviaacq-uc.a.run.app/api/doviz/2020/04/01 18 | 19 | https://dovizkurlari-l6vtviaacq-uc.a.run.app/api/doviz/2020/04/01/eur 20 | 21 |
22 | 23 |

Docker ile Kullanımı:

24 | 25 | öncelikle docker hub'dan ilgili container image : 26 | 27 | docker pull tayfunulu/tl_doviz_kurlari 28 | 29 | Manual Çalıştırma (arka ekranda çalıştırma) 30 | 31 | docker run --rm -it -d -p 5000:5000 tayfunulu/tl_doviz_kurlari 32 | 33 |
Docker-Compose dosyası 34 | 35 | version: '3' 36 | services: 37 | doviz_microservis: 38 | container_name: tl_doviz_kurlari 39 | image: tayfunulu/tl_doviz_kurlari 40 | restart: always 41 | ports: 42 | - "5000:5000" 43 | 44 |
45 | 46 | Çalışıp çalışmadığını test edelim. 47 | 48 | http://makinenin_ipsi:5000/api/doviz 49 | 50 | örnek 51 | 52 | http://127.0.0.1:5000/api/doviz 53 | 54 | Çalışıyorsa aşağıdaki metotları kullanabilirsiniz. 55 | 56 |
57 | 58 | # RESTFUL-API KULLANIMI 59 | 60 |

/api/doviz

61 | 62 | GET -> Güncel kur bilgilerinin tamamını verir. 63 | 64 | POST -> JSON ile tarih bilgisi gönderirseniz "gun.ay.yil" formatında "01.04.2020" ilgili günün tüm kurlarını verir. Hangi kuru istediğinizi eklerseniz sadece o kurun bilgileri gelir. 65 | 66 | {"tarih":"01.04.2020"} 67 | {"tarih":"01.04.2020","tur":"EUR"} 68 | 69 | 70 |

/api/doviz/_TUR_

71 | 72 | örnek : /api/Doviz/USD 73 | 74 | GET -> Seçilen Kur türünün tüm bilgilerini verir. 75 | 76 | POST -> Seçilen Kur türünün arşiv verisini almak için 77 | 78 | {"tarih":"01.04.2020"} 79 | 80 |

/api/doviz/_yil/ay/gun_

81 | 82 | örnek : /api/doviz/2020/02/08 83 | 84 | GET -> Arşivden ilgili günün tüm kur bilgilerini verir. 85 | 86 |

/api/doviz/_yil/ay/gun/TUR_

87 | 88 | örnek : /api/doviz/2020/02/010/USD 89 | 90 | GET -> Arşivden ilgili günün seçilen kur bilgilerini verir. 91 | 92 |
93 | 94 | Not : Arşiv özelliğinde tatil günleri için Tatil günü olduğunu belirten bir hata döner 95 | 96 | 97 |
98 | 99 | 100 |

Kendi Kodunuzda Nesne olarak Kullanımı :

101 | -------------------------- 102 | 103 | sistemden zip'li olarak çekin veya "git clone" ile direk sistemden clone yapın. 104 | 105 | git clone https://github.com/tayfunulu/DovizKurlari.git 106 | 107 | cd DovizKurlari 108 | 109 | python3 ornek.py 110 | 111 | 112 | Kendi kodunuzda kullanmak için DovizKurlari.py dosyasını kendi projenizin klasörünüze taşıyın. Sonrasında DovizKurları Nesnesi yaratarak, DegerSor fonksiyonu ile istediğiniz değeri sistemden çekebilirsiniz. "DegerSor" fonksiyonu iki parametre alır. 113 | 114 | DegerSor (Parametre1, Parametre2) 115 | 116 | * Parametre verilmezse JSON olarak tüm veriler döner 117 | 118 | Parametre1 = USD, EUR, AUD gibi para cinsinin resmi kısaltmaları 119 | 120 | Parametre2 = Almak istediğiniz değer ; 121 | 122 | "BanknoteBuying" : Alış Değeri 123 | "BanknoteSelling" : Satış Değeri 124 | "CrossRateUSD" : USD ile çapraz kur 125 | "CurrencyName" : Resmi Adı 126 | "ForexBuying" : Forex Alış 127 | "ForexSelling" : Forex Satış 128 | "Kod" : Kodu 129 | "Unit" : 1 130 | "isim" : Türkçe Adı 131 | 132 | Arşivden veri çekmek 133 | 134 | Eski bir tarihteki kur'u ögrenmek için Arsiv veya Arsiv_Tarih fonksiyonlarını kullanabilirsiniz. 135 | 136 | Arsiv ( Gun, Ay, Yil,Parametre1, Parametre2) 137 | 138 | Gun, Ay, Yil = integer veya string olabilir. 139 | 140 | 141 | Arsiv_Tarih (Tarih,Parametre1, Parametre2) 142 | 143 | Tarih = "01.02.2015" Şeklinde bir string veri olmalıdır. 144 | 145 |
146 | 147 |

Local'de Microservis olarak çalıştırılması.

148 | 149 | python3 flask_doviz_server.py 150 | 151 | Sonrasında 5000 portu dinlemeye başlar. Kullanımı yukarıda anlatıldığı gibidir. 152 | --------------------------------------------------------------------------------