def parse_vkurse(): from rate.models import Rate url = 'http://vkurse.dp.ua/course.json' response = requests.get(url) # print(response.json()) currency_mapper = { 'Dollar': mch.CURRENCY_USD, 'Euro': mch.CURRENCY_EUR, } for r in response.json(): if r not in currency_mapper: # print('r[xxxxxxx]', r) continue sale = to_decimal(response.json()[r]['sale']) buy = to_decimal(response.json()[r]['buy']) currency = currency_mapper[r] latest_rate = Rate.objects.filter( source=mch.SOURCE_VKURSE, currency=currency, ).last() # Rate() or None print('!!VKURSE!!!!', latest_rate.source, latest_rate.currency, latest_rate.sale, latest_rate.buy) # Rate.objects.create( # source=mch.SOURCE_VKURSE, # currency=currency, # buy=buy, # sale=sale, # ) if latest_rate is None or latest_rate.sale != sale or latest_rate.buy != buy: Rate.objects.create( source=mch.SOURCE_VKURSE, currency=currency, buy=buy, sale=sale, )
def parse_nbu(): url = "https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?json" response = requests.get(url) currency_type_mapper = { # DICT KEY = currency code according to ISO 4217 840: mch.CURRENCY_USD, 978: mch.CURRENCY_EUR, 643: mch.CURRENCY_RUR, } for item in response.json(): if item['r030'] not in currency_type_mapper: continue currency = currency_type_mapper[item['r030']] buy = to_decimal(item['rate']) sale = to_decimal('0.0') # NBU HAS NO SALE RATE last = Rate.objects.filter( source=mch.SOURCE_NBU, currency=currency, ).last() if last is None or last.buy != buy: Rate.objects.create( buy=buy, sale=sale, source=mch.SOURCE_NBU, currency=currency, )
def parse_monobank(): from monobank_api import BaseAPI from rate.models import Rate mono = BaseAPI() response = mono.get_currency() # print('response!!!!!!!!!!!!!!!!!!!', response[0]) currency_mapper = { '840': mch.CURRENCY_USD, '978': mch.CURRENCY_EUR, } for r in response: # print(r['currencyCodeA']) if (str(r['currencyCodeA']) not in currency_mapper) or str(r['currencyCodeB']) != '980': # print(r['currencyCodeA'] * 10) continue sale = to_decimal(r['rateSell']) buy = to_decimal(r['rateBuy']) currency = currency_mapper[str(r['currencyCodeA'])] latest_rate = Rate.objects.filter( source=mch.SOURCE_MONOBANK, currency=currency, ).last() # Rate() or None print('!!!MONOBANK!!!!', latest_rate.source, latest_rate.currency, latest_rate.sale, latest_rate.buy) if latest_rate is None or latest_rate.sale != sale or latest_rate.buy != buy: Rate.objects.create( source=mch.SOURCE_MONOBANK, currency=currency, buy=buy, sale=sale, )
def parse_pumb(): from rate.models import Rate url = 'https://retail.pumb.ua/' response = requests.get(url) response.raise_for_status() source = choices.SOURCE_PUMB soup = BeautifulSoup(response.content, 'lxml') table = soup.find('table') buy_usd = table.find_all('tr')[1].find_all('td')[1].text sale_usd = table.find_all('tr')[1].find_all('td')[2].text buy_euro = table.find_all('tr')[2].find_all('td')[1].text sale_euro = table.find_all('tr')[2].find_all('td')[2].text usd = dict(ccy='USD', buy=buy_usd, sale=sale_usd) euro = dict(ccy='EUR', buy=buy_euro, sale=sale_euro) data = [usd, euro] currency_map = { 'USD': choices.CURRENCY_USD, 'EUR': choices.CURRENCY_EUR, } for row in data: if row['ccy'] in currency_map: buy = to_decimal(row['buy']) sale = to_decimal(row['sale']) currency = currency_map[row['ccy']] last_rate = Rate.objects.filter(source=source, currency=currency).last() if last_rate is None or buy != last_rate.buy or sale != last_rate.sale: Rate.objects.create(currency=currency, source=source, sale=sale, buy=buy)
def parse_kredobank(): from rate.models import Rate url = 'https://kredobank.com.ua/info/kursy-valyut/commercial' response = requests.get(url) response.raise_for_status() source = choices.SOURCE_KREDOBANK soup = BeautifulSoup(response.content, 'lxml') table = soup.find('table') buy_usd = int(table.find_all('tr')[1].find_all('td')[3].text) / 100 sale_usd = int(table.find_all('tr')[1].find_all('td')[2].text) / 100 buy_euro = int(table.find_all('tr')[2].find_all('td')[3].text) / 100 sale_euro = int(table.find_all('tr')[2].find_all('td')[2].text) / 100 usd = dict(ccy='USD', buy=buy_usd, sale=sale_usd) euro = dict(ccy='EUR', buy=buy_euro, sale=sale_euro) data = [usd, euro] currency_map = { 'USD': choices.CURRENCY_USD, 'EUR': choices.CURRENCY_EUR, } for row in data: if row['ccy'] in currency_map: buy = to_decimal(row['buy']) sale = to_decimal(row['sale']) currency = currency_map[row['ccy']] last_rate = Rate.objects.filter(source=source, currency=currency).last() if last_rate is None or buy != last_rate.buy or sale != last_rate.sale: Rate.objects.create(currency=currency, source=source, sale=sale, buy=buy)
def parse_nbu(): from rate.models import Rate url = 'https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?json' response = requests.get(url) # print(response.json()) currency_mapper = { 'USD': mch.CURRENCY_USD, 'EUR': mch.CURRENCY_EUR, } for r in response.json(): if r['cc'] not in currency_mapper: continue sale = to_decimal(r['rate']) buy = to_decimal(r['rate']) currency = currency_mapper[r['cc']] latest_rate = Rate.objects.filter( source=mch.SOURCE_NBU, currency=currency, ).last() # Rate() or None # Rate.objects.create( # source=mch.SOURCE_NBU, # currency=currency, # buy=buy, # sale=sale, # ) if latest_rate is None or latest_rate.sale != sale or latest_rate.buy != buy: Rate.objects.create( source=mch.SOURCE_NBU, currency=currency, buy=buy, sale=sale, ) print('!!!NBU!!!!', latest_rate.source, latest_rate.currency, latest_rate.sale, latest_rate.buy)
def parse_privatbank(): url = "https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5" response = requests.get(url) currency_type_mapper = { 'USD': mch.CURRENCY_USD, 'EUR': mch.CURRENCY_EUR, 'RUR': mch.CURRENCY_RUR, 'BTC': mch.CURRENCY_BTC, } for item in response.json(): if item['ccy'] not in currency_type_mapper: continue buy = to_decimal(item['buy']) sale = to_decimal(item['sale']) last = Rate.objects.filter( source=mch.SOURCE_PRIVATBANK, currency=currency_type_mapper[item['ccy']], ).last() if last is None or last.buy != buy or last.sale != sale: Rate.objects.create( buy=buy, sale=sale, source=mch.SOURCE_PRIVATBANK, currency=currency_type_mapper[item['ccy']], )
def parse_pumb(): url = 'https://www.pumb.ua/' response = requests.get(url) currency_type_mapper = { 'USD': mch.CURRENCY_USD, 'EUR': mch.CURRENCY_EUR, 'RUB': mch.CURRENCY_RUR, } soup = bs4.BeautifulSoup(response.text, 'lxml') data = soup.find('div', {'class': 'exchange-rate'}) chunk_data = data.find('table').find_all('tr') for item in chunk_data: if item.find_all('td'): currency = item.find_all('td')[0].text.strip() if currency not in currency_type_mapper: continue buy = to_decimal(item.find_all('td')[1].text.strip()) sale = to_decimal(item.find_all('td')[2].text.strip()) last = Rate.objects.filter( source=mch.SOURCE_PUMB, currency=currency_type_mapper[currency], ).last() if last is None or last.buy != buy or last.sale != sale: Rate.objects.create( buy=buy, sale=sale, source=mch.SOURCE_PUMB, currency=currency_type_mapper[currency], )
def parse_monobank(): url = "https://api.monobank.ua/bank/currency" response = requests.get(url) currency_type_mapper = { # DICT KEY = currency code according to ISO 4217 840: mch.CURRENCY_USD, 978: mch.CURRENCY_EUR, 643: mch.CURRENCY_RUR } for item in response.json(): if item['currencyCodeA'] not in currency_type_mapper: continue if item['currencyCodeB'] != 980: # 980 = UAH continue buy = to_decimal(item['rateBuy']) sale = to_decimal(item['rateSell']) last = Rate.objects.filter( source=mch.SOURCE_MONOBANK, currency=currency_type_mapper[item['currencyCodeA']], ).last() if last is None or last.buy != buy or last.sale != sale: Rate.objects.create( buy=buy, sale=sale, source=mch.SOURCE_MONOBANK, currency=currency_type_mapper[item['currencyCodeA']], )
def parse_vkurse(): url = "http://vkurse.dp.ua/course.json" response = requests.get(url) currency_type_mapper = { 'Dollar': mch.CURRENCY_USD, 'Euro': mch.CURRENCY_EUR, 'Rub': mch.CURRENCY_RUR, } for key, value in response.json().items(): if key not in currency_type_mapper: continue buy = to_decimal(value['buy']) sale = to_decimal(value['sale']) last = Rate.objects.filter( source=mch.SOURCE_VKURSE, currency=currency_type_mapper[key], ).last() if last is None or last.buy != buy or last.sale != sale: Rate.objects.create( buy=buy, sale=sale, source=mch.SOURCE_VKURSE, currency=currency_type_mapper[key], )
def parse_privatbank(): from rate.models import Rate url = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' response = requests.get(url) # print(response.json()) currency_mapper = { 'USD': mch.CURRENCY_USD, 'EUR': mch.CURRENCY_EUR, } for r in response.json(): if r['ccy'] not in currency_mapper: continue sale = to_decimal(r['sale']) buy = to_decimal(r['buy']) currency = currency_mapper[r['ccy']] latest_rate = Rate.objects.filter( source=mch.SOURCE_PRIVATBANK, currency=currency, ).last() # Rate() or None if latest_rate is None or latest_rate.sale != sale or latest_rate.buy != buy: Rate.objects.create( source=mch.SOURCE_PRIVATBANK, currency=currency, buy=buy, sale=sale, ) print('!!!PRIVAT!!!!', latest_rate.source, latest_rate.currency, latest_rate.sale, latest_rate.buy)
def parse_aval(): rate = [] page = requests.get( 'https://ex.aval.ua/ru/personal/everyday/exchange/exchange/', timeout=5) currency_type_mapper = { 'Доллары США': mch.CURRENCY_TYPE_USD, 'Евро': mch.CURRENCY_TYPE_EUR, 'Рубли': mch.CURRENCY_TYPE_RUR, } soup = BeautifulSoup(page.text, "html.parser") body_currency = soup.findAll('div', class_='body-currency') temp = body_currency[0].findAll('td') for i in temp: rate.append(i.text) for item in rate: if item not in currency_type_mapper: continue currency_type = currency_type_mapper[item] item = rate.index(item) # buy amount = to_decimal(rate[item + 1].replace(',', '.')) last = Rate.objects.filter( source=mch.SOURCE_AVAL, currency_type=currency_type, type_rate=mch.RATE_TYPE_BUY, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_AVAL, currency_type=currency_type, type_rate=mch.RATE_TYPE_BUY, ) # sale amount = to_decimal(rate[item + 2].replace(',', '.')) last = Rate.objects.filter( source=mch.SOURCE_AVAL, currency_type=currency_type, type_rate=mch.RATE_TYPE_SALE, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_AVAL, currency_type=currency_type, type_rate=mch.RATE_TYPE_SALE, )
def parse_nbu(): response = requests.get('https://bank.gov.ua/NBU_Exchange/exchange?json', timeout=5) currency_type_mapper = { '840': mch.CURRENCY_TYPE_USD, '978': mch.CURRENCY_TYPE_EUR, '643': mch.CURRENCY_TYPE_RUR, } for item in response.json(): if item['CurrencyCode'] not in currency_type_mapper: continue currency_type = currency_type_mapper[item['CurrencyCode']] if currency_type == mch.CURRENCY_TYPE_RUR: amount = to_decimal(item['Amount'] / 10) else: amount = to_decimal(item['Amount']) # buy last = Rate.objects.filter( source=mch.SOURCE_NBU, currency_type=currency_type, type_rate=mch.RATE_TYPE_BUY, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_NBU, currency_type=currency_type, type_rate=mch.RATE_TYPE_BUY, ) if currency_type == mch.CURRENCY_TYPE_RUR: amount = to_decimal(item['Amount'] / 10) else: amount = to_decimal(item['Amount']) # sale last = Rate.objects.filter( source=mch.SOURCE_NBU, currency_type=currency_type, type_rate=mch.RATE_TYPE_SALE, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_NBU, currency_type=currency_type, type_rate=mch.RATE_TYPE_SALE, )
def handle(self, *args, **options): def date_generator(): end_date = datetime.now().date() start_date = end_date - relativedelta(years=4) while start_date <= end_date: yield start_date.strftime("%d.%m.%Y") start_date += timedelta(days=1) for archive_date in date_generator(): time.sleep(10) url = f'https://api.privatbank.ua/p24api/exchange_rates?json&date={archive_date}' response = requests.get(url) currency_type_mapper = { 'USD': mch.CURRENCY_USD, 'EUR': mch.CURRENCY_EUR, 'RUB': mch.CURRENCY_RUR, 'BTC': mch.CURRENCY_BTC, } for item in response.json()['exchangeRate']: if 'currency' in item: if item['currency'] not in currency_type_mapper: continue currency = currency_type_mapper[item['currency']] buy = to_decimal(item['purchaseRate']) sale = to_decimal(item['saleRate']) format_date = datetime.strptime( archive_date, '%d.%m.%Y').strftime('%Y-%m-%d %H:%M:%S.%f') lookup_date = datetime.strptime( format_date, '%Y-%m-%d %H:%M:%S.%f') # datetime object latest_rate = Rate.objects.filter( source=mch.SOURCE_PRIVATBANK, currency=currency, created=lookup_date, ).last() """ following compare condition helps to exclude duplicates and fill the voids in data """ if latest_rate is None or latest_rate.buy != buy or latest_rate.sale != sale: rate = Rate.objects.create( created=lookup_date, buy=buy, sale=sale, source=mch.SOURCE_PRIVATBANK, currency=currency, ) rate.created = format_date rate.save( update_fields=['created'] ) # avoids 'auto_now_add' restriction to pass own date
def parse_monobank(): url = 'https://api.monobank.ua/bank/currency' response = requests.get(url, timeout=5) currency_type_mapper = { 840: mch.CURRENCY_TYPE_USD, 978: mch.CURRENCY_TYPE_EUR, 643: mch.CURRENCY_TYPE_RUR, } for item in response.json(): if item['currencyCodeA'] not in currency_type_mapper or item[ 'currencyCodeB'] != 980: continue currency_type = currency_type_mapper[item['currencyCodeA']] # buy amount = to_decimal(item['rateBuy']) last = Rate.objects.filter( source=mch.SOURCE_MONOBANK, currency_type=currency_type, type_rate=mch.RATE_TYPE_BUY, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_MONOBANK, currency_type=currency_type, type_rate=mch.RATE_TYPE_BUY, ) # sale amount = to_decimal(item['rateSell']) last = Rate.objects.filter( source=mch.SOURCE_MONOBANK, currency_type=currency_type, type_rate=mch.RATE_TYPE_SALE, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_MONOBANK, currency_type=currency_type, type_rate=mch.RATE_TYPE_SALE, )
def parse_monobank(): url = 'https://api.monobank.ua/bank/currency' response = requests.get(url) currency_type_mapper = { 840: mch.CURRENCY_TYPE_USD, 978: mch.CURRENCY_TYPE_EUR, } for item in response.json(): if item['currencyCodeA'] not in currency_type_mapper: continue if item['currencyCodeB'] == 980: currency_type = currency_type_mapper[item['currencyCodeA']] # buy rate = to_decimal(item['rateBuy']) last = Rate.objects.filter( source=mch.SOURCE_MONOBANK, currency_type=currency_type, rate_type=mch.RATE_TYPE_BUY, ).last() if last is None or last.rate != rate: Rate.objects.create( rate=rate, source=mch.SOURCE_MONOBANK, currency_type=currency_type, rate_type=mch.RATE_TYPE_BUY, ) # sale rate = to_decimal(item['rateSell']) last = Rate.objects.filter( source=mch.SOURCE_MONOBANK, currency_type=currency_type, rate_type=mch.RATE_TYPE_SALE, ).last() if last is None or last.rate != rate: Rate.objects.create( rate=rate, source=mch.SOURCE_MONOBANK, currency_type=currency_type, rate_type=mch.RATE_TYPE_SALE, )
def parse_privatbank(): url = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' response = requests.get(url, timeout=5) currency_type_mapper = { 'USD': mch.CURRENCY_TYPE_USD, 'EUR': mch.CURRENCY_TYPE_EUR, 'RUR': mch.CURRENCY_TYPE_RUR, } for item in response.json(): if item['ccy'] not in currency_type_mapper: continue currency_type = currency_type_mapper[item['ccy']] # buy amount = to_decimal(item['buy']) last = Rate.objects.filter( source=mch.SOURCE_PRIVATBANK, currency_type=currency_type, type_rate=mch.RATE_TYPE_BUY, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_PRIVATBANK, currency_type=currency_type, type_rate=mch.RATE_TYPE_BUY, ) # sale amount = to_decimal(item['sale']) last = Rate.objects.filter( source=mch.SOURCE_PRIVATBANK, currency_type=currency_type, type_rate=mch.RATE_TYPE_SALE, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_PRIVATBANK, currency_type=currency_type, type_rate=mch.RATE_TYPE_SALE, )
def handle(self, *args, **options): start_date = date(2015, 1, 1) end_date = date.today() currency_type_mapper = { 'USD': mch.CURRENCY_TYPE_USD, 'EUR': mch.CURRENCY_TYPE_EUR, } for single_date in date_range(start_date, end_date): url = f'https://api.privatbank.ua/p24api/exchange_rates?json&date={single_date.strftime("%d.%m.%Y")}' response = requests.get(url).json() for item in response['exchangeRate']: if 'currency' not in item or item[ 'currency'] not in currency_type_mapper: continue currency_type = currency_type_mapper[item['currency']] # buy rate = to_decimal(item['purchaseRate'] ) if 'purchaseRate' in item else to_decimal( item['purchaseRateNB']) rate = Rate.objects.create( rate=rate, source=mch.SOURCE_PRIVATBANK, currency_type=currency_type, rate_type=mch.RATE_TYPE_BUY, ) rate.created = single_date rate.save() # sale rate = to_decimal( item['saleRate']) if 'saleRate' in item else to_decimal( item['saleRateNB']) rate = Rate.objects.create( rate=rate, source=mch.SOURCE_PRIVATBANK, currency_type=currency_type, rate_type=mch.RATE_TYPE_SALE, ) rate.created = single_date rate.save()
def parse_vkurse(): response = requests.get('http://vkurse.dp.ua/course.json', timeout=5) currency_type_mapper = { 'Dollar': mch.CURRENCY_TYPE_USD, 'Euro': mch.CURRENCY_TYPE_EUR, 'Rub': mch.CURRENCY_TYPE_RUR, } for key, value in response.json().items(): if key not in currency_type_mapper: continue currency_type = currency_type_mapper[key] # buy amount = to_decimal(value['buy']) last = Rate.objects.filter( source=mch.SOURCE_BUD_VSEGDA_V_KURSE, currency_type=currency_type, type_rate=mch.RATE_TYPE_BUY, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_BUD_VSEGDA_V_KURSE, currency_type=currency_type, type_rate=mch.RATE_TYPE_BUY, ) # sale amount = to_decimal(value['sale']) # amount = to_decimal(value['sale'][0:-1]) last = Rate.objects.filter( source=mch.SOURCE_BUD_VSEGDA_V_KURSE, currency_type=currency_type, type_rate=mch.RATE_TYPE_SALE, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_BUD_VSEGDA_V_KURSE, currency_type=currency_type, type_rate=mch.RATE_TYPE_SALE, )
def parse_aval(): from rate.models import Rate url = 'https://ex.aval.ua/ru/personal/everyday/exchange/exchange/' response = requests.get(url) assert response.status_code == 200 soup = BeautifulSoup(response.text, 'html.parser') mydivs = soup.findAll("div", {"class": "body-currency"}) rates = mydivs[0].findAll('td', {'class': 'right'}) rates = [to_decimal(rate.text.replace(',', '.')) for rate in rates] rates_to_save = [ {'amount': rates[0], 'currency_type': mch.CURRENCY_TYPE_USD, 'type': mch.RATE_TYPE_SALE}, {'amount': rates[1], 'currency_type': mch.CURRENCY_TYPE_USD, 'type': mch.RATE_TYPE_BUY}, {'amount': rates[2], 'currency_type': mch.CURRENCY_TYPE_EUR, 'type': mch.RATE_TYPE_SALE}, {'amount': rates[3], 'currency_type': mch.CURRENCY_TYPE_EUR, 'type': mch.RATE_TYPE_BUY}, ] for rate in rates_to_save: amount = rate['amount'] last = Rate.objects.filter( source=mch.SOURCE_AVAL, currency_type=rate['currency_type'], type=rate['type'], ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_AVAL, currency_type=rate['currency_type'], type=rate['type'], )
def parse_vkurse(): url = 'http://vkurse.dp.ua/course.json' response = requests.get(url).json() currency_type_mapper = { 'Dollar': mch.CURRENCY_TYPE_USD, 'Euro': mch.CURRENCY_TYPE_EUR, } for item in response: if item not in currency_type_mapper: continue currency_type = currency_type_mapper[item] # buy rate = to_decimal(response[item]['buy']) last = Rate.objects.filter( source=mch.SOURCE_VKURSE, currency_type=currency_type, rate_type=mch.RATE_TYPE_BUY, ).last() if last is None or last.rate != rate: Rate.objects.create( rate=rate, source=mch.SOURCE_VKURSE, currency_type=currency_type, rate_type=mch.RATE_TYPE_BUY, ) # sale rate = to_decimal(response[item]['sale']) last = Rate.objects.filter( source=mch.SOURCE_VKURSE, currency_type=currency_type, rate_type=mch.RATE_TYPE_SALE, ).last() if last is None or last.rate != rate: Rate.objects.create( rate=rate, source=mch.SOURCE_VKURSE, currency_type=currency_type, rate_type=mch.RATE_TYPE_SALE, )
def parse_otpbank(): current_date = date.today().strftime("%d.%m.%Y") url = f'https://ru.otpbank.com.ua/local/components/otp/utils.exchange_rate_arc/exchange_rate_by_date.php' \ f'?curr_date={current_date}&ib_code=otp_bank_currency_rates' response = requests.get(url) response = response.json() currency_type_mapper = { 'USD': mch.CURRENCY_TYPE_USD, 'EUR': mch.CURRENCY_TYPE_EUR, } for item in response['items']: if item['NAME'] not in currency_type_mapper: continue currency_type = currency_type_mapper[item['NAME']] # BUY amount = to_decimal(item['BUY']) last = Rate.objects.filter( source=mch.SOURCE_OTPBANK, currency_type=currency_type, type=mch.RATE_TYPE_BUY, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_OTPBANK, currency_type=currency_type, type=mch.RATE_TYPE_BUY, ) # SALE amount = to_decimal(item['SELL']) last = Rate.objects.filter( source=mch.SOURCE_OTPBANK, currency_type=currency_type, type=mch.RATE_TYPE_SALE, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_OTPBANK, currency_type=currency_type, type=mch.RATE_TYPE_SALE, )
def parse_tascombank(): url = 'https://tascombank.ua/api/currencies' response = requests.get(url) response = response.json() currency_type_mapper = { 'USD': mch.CURRENCY_TYPE_USD, 'EUR': mch.CURRENCY_TYPE_EUR, } for item in response[0]: if item['short_name'] not in currency_type_mapper or item['kurs_type_description'] != 'Обменный': continue currency_type = currency_type_mapper[item['short_name']] # BUY amount = to_decimal(item['kurs_buy']) last = Rate.objects.filter( source=mch.SOURCE_TASCOMBANK, currency_type=currency_type, type=mch.RATE_TYPE_BUY, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_TASCOMBANK, currency_type=currency_type, type=mch.RATE_TYPE_BUY, ) # SALE amount = to_decimal(item['kurs_sale']) last = Rate.objects.filter( source=mch.SOURCE_TASCOMBANK, currency_type=currency_type, type=mch.RATE_TYPE_SALE, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_TASCOMBANK, currency_type=currency_type, type=mch.RATE_TYPE_SALE, )
def parse(day_to_parse): url = f'https://api.privatbank.ua/p24api/exchange_rates?json&date={day_to_parse.strftime("%d.%m.%Y")}' response = requests.get(url) response = response.json() currency_type_mapper = { 'USD': mch.CURRENCY_TYPE_USD, 'EUR': mch.CURRENCY_TYPE_EUR, } for item in response['exchangeRate']: if item['currency'] not in currency_type_mapper: continue currency_type = currency_type_mapper[item['currency']] # BUY amount = to_decimal(item['purchaseRate']) last = Rate.objects.filter( source=mch.SOURCE_PRIVATBANK, currency_type=currency_type, type=mch.RATE_TYPE_BUY, ).last() if last is None or last.amount != amount: Rate.objects.create( created=day_to_parse, amount=amount, source=mch.SOURCE_PRIVATBANK, currency_type=currency_type, type=mch.RATE_TYPE_BUY, ) # SALE amount = to_decimal(item['saleRate']) last = Rate.objects.filter( source=mch.SOURCE_PRIVATBANK, currency_type=currency_type, type=mch.RATE_TYPE_SALE, ).last() if last is None or last.amount != amount: Rate.objects.create( created=day_to_parse, amount=amount, source=mch.SOURCE_PRIVATBANK, currency_type=currency_type, type=mch.RATE_TYPE_SALE, )
def parse_nbu(): current_date = date.today().strftime("%Y%m%d") url = f'https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?date={current_date}&json' response = requests.get(url) response = response.json() currency_type_mapper = { 'USD': mch.CURRENCY_TYPE_USD, 'EUR': mch.CURRENCY_TYPE_EUR, } for item in response: if item['cc'] not in currency_type_mapper: continue currency_type = currency_type_mapper[item['cc']] # BUY amount = to_decimal(item['rate']) last = Rate.objects.filter( source=mch.SOURCE_NBU, currency_type=currency_type, type=mch.RATE_TYPE_BUY, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_NBU, currency_type=currency_type, type=mch.RATE_TYPE_BUY, ) # SALE amount = to_decimal(item['rate']) last = Rate.objects.filter( source=mch.SOURCE_NBU, currency_type=currency_type, type=mch.RATE_TYPE_SALE, ).last() if last is None or last.amount != amount: Rate.objects.create( amount=amount, source=mch.SOURCE_NBU, currency_type=currency_type, type=mch.RATE_TYPE_SALE, )
def handle(self, *args, **options): date_format = '%d.%m.%Y' created = datetime(2018, 1, 1) end = datetime.now() date_generated = [ created + timedelta(days=x) for x in range(8, (end-created).days) ] for created in date_generated: created_str = created.strftime(date_format) url = 'https://api.privatbank.ua/p24api/exchange_rates' params = {'json': '', 'date': created_str} response = requests.get(url, params=params) response.raise_for_status() data = response.json() exchangeRate = data['exchangeRate'] source = choices.SOURCE_PRIVATBANK currency_map = { 'USD': choices.CURRENCY_USD, 'EUR': choices.CURRENCY_EUR, } for row in exchangeRate: if row['currency'] in currency_map: buy = to_decimal(row['purchaseRate']) sale = to_decimal(row['saleRate']) currency = currency_map[row['currency']] last_rate = Rate.objects.filter( source=source, currency=currency, created=created, ).last() if last_rate is None: rate = Rate.objects.create( currency=currency, source=source, sale=sale, buy=buy, ) rate.created = created rate.save(update_fields=('created',))
def parse_alfabank(): url = 'https://alfabank.ua/' response = requests.get(url) currency_type_mapper = { 'USD': mch.CURRENCY_USD, 'EUR': mch.CURRENCY_EUR, 'RUB': mch.CURRENCY_RUR, } soup = bs4.BeautifulSoup(response.text, 'lxml') data = soup.find_all('div', {'class': 'currency-block'}) for item in data: if item.find(lambda span: len(span.attrs) == 2): currency = item.find('div', {'class': 'title'}).text.strip() if currency not in currency_type_mapper: continue buy = to_decimal( item.find('span', { 'data-currency': f'{currency}_BUY' }).text.strip()) sale = to_decimal( item.find('span', { 'data-currency': f'{currency}_SALE' }).text.strip()) last = Rate.objects.filter( source=mch.SOURCE_ALFABANK, currency=currency_type_mapper[currency], ).last() if last is None or last.buy != buy or last.sale != sale: Rate.objects.create( buy=buy, sale=sale, source=mch.SOURCE_ALFABANK, currency=currency_type_mapper[currency], )
def test_edit_rate_admin_correct_payload(admin_client): rate = Rate.objects.last() url = reverse('rate:edit', kwargs={'pk': rate.id}) payload = { 'source': 1, 'currency': 1, 'buy': to_decimal(23.65), 'sale': to_decimal(25.50), format: 'json' } # test auxiliary funcs, just in case. response = admin_client.post(url, payload) assert response.status_code == 302 edited_rate = Rate.objects.filter(id=rate.id).last() assert edited_rate.source == payload['source'] assert edited_rate.currency == payload['currency'] assert edited_rate.buy == payload['buy'] assert edited_rate.sale == payload['sale'] # check success redirect assert response['Location'] == reverse('rate:list') response = admin_client.post(url, payload, follow=True) assert response.status_code == 200
def parse_monobank(): from rate.models import Rate url = 'https://api.monobank.ua/bank/currency' response = requests.get(url) response.raise_for_status() data = response.json()[0:2] source = choices.SOURCE_MONOBANK currency_map = { 840: choices.CURRENCY_USD, 978: choices.CURRENCY_EUR, } for row in data: if row['currencyCodeA'] in currency_map: buy = to_decimal(row['rateBuy']) sale = to_decimal(row['rateSell']) currency = currency_map[row['currencyCodeA']] last_rate = Rate.objects.filter(source=source, currency=currency).last() if last_rate is None or buy != last_rate.buy or sale != last_rate.sale: Rate.objects.create(currency=currency, source=source, sale=sale, buy=buy)
def parse_minora(): from rate.models import Rate url = 'http://vkurse.dp.ua/course.json' response = requests.get(url) response.raise_for_status() data = response.json() source = choices.SOURCE_MINORA currency_map = { 'Dollar': choices.CURRENCY_USD, 'Euro': choices.CURRENCY_EUR, } for key in data: if key in currency_map: currency = currency_map[key] buy = to_decimal(data[key]['buy']) sale = to_decimal(data[key]['sale']) last_rate = Rate.objects.filter(source=source, currency=currency).last() if last_rate is None or buy != last_rate.buy or sale != last_rate.sale: Rate.objects.create(currency=currency, source=source, buy=buy, sale=sale)