Ошибка подключения Pyton к API - Python
Формулировка задачи:
Создаю программу на Pyton 3.6 для графического отображения данных с биржи btc-e.nz через их API.
Документация: https://btc-e.nz/api/3/docs#trades
Выдает ошибку:
Программный код:
Облазил весь интернет не пойму в чем причина. Помогите!!!
Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__ return self.func(*args) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 280, in resize self.show() File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 351, in draw FigureCanvasAgg.draw(self) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\backends\backend_agg.py", line 464, in draw self.figure.draw(self.renderer) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\artist.py", line 63, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\figure.py", line 1151, in draw self.canvas.draw_event(renderer) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\backend_bases.py", line 1823, in draw_event self.callbacks.process(s, event) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\cbook.py", line 554, in process proxy(*args, **kwargs) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\cbook.py", line 416, in __call__ return mtd(*args, **kwargs) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\animation.py", line 881, in _start self._init_draw() File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\animation.py", line 1540, in _init_draw self._draw_frame(next(self.new_frame_seq())) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\animation.py", line 1562, in _draw_frame self._drawn_artists = self._func(framedata, *self._args) File "C:\Users\User\Documents\Phyton\bot.py", line 86, in animate data = urllib.request.urlopen(dataLink) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 223, in urlopen return opener.open(url, data, timeout) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 532, in open response = meth(req, response) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 642, in http_response 'http', request, response, code, msg, hdrs) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 570, in error return self._call_chain(*args) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 504, in _call_chain result = func(*args) File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 650, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbidden >>>
import matplotlib matplotlib.use("TkAgg") from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg from matplotlib.figure import Figure import matplotlib.animation as animation from matplotlib import style import tkinter as tk from tkinter import ttk import urllib import json import pandas as pd import numpy as np from matplotlib import pyplot as plt LARGE_FONT= ("Verdana", 12) NORM_FONT= ("Verdana", 10) SMALL_FONT= ("Verdana", 8) style.use("ggplot") f = Figure() a = f.add_subplot(111) exchange = "BTC-e" DatCounter = 9000 programName = "btce" resampleSize = "15Min" DataPace = "1d" candleWidth = 0.008 def changeTimeFrame(tf): global DataPace if tf == "7d" and resampleSize == "1Min": popupmsg("Too much data chosen, choose a smaller time frame or higher OHLC interval") else: DataPace = tf DatCounter = 9000 def changeSampleSize(size,width): global resampleSize global candleWidth if DataPace == "7d" and resampleSize == "1Min": popupmsg("Too much data chosen, choose a smaller time frame or higher OHLC interval") elif DataPace == "tick": popupmsg("You're currently viewing tick data, not OHLC.") else: resampleSize = size DatCounter = 9000 candleWidth = width def changeExchange(toWhat,pn): global exchange global DatCounter global programName exchange = toWhat programName = pn DatCounter = 9000 def popupmsg(msg): popup = tk.Tk() popup.wm_title("!") label = ttk.Label(popup, text=msg, font=NORM_FONT) label.pack(side="top", fill="x", pady=10) B1 = ttk.Button(popup, text="Okay", command = popup.destroy) B1.pack() popup.mainloop() def animate(i): dataLink = 'https://btc-e.nz/api/3/trades/btc_usd?limit=2000' data = urllib.request.urlopen(dataLink) data = data.readall().decode("utf-8") data = json.loads(data) data = data["btc_usd"] data = pd.DataFrame(data) buys = data[(data['type']=="bid")] buys["datestamp"] = np.array(buys["timestamp"]).astype("datetime64[s]") buyDates = (buys["datestamp"]).tolist() sells = data[(data['type']=="ask")] sells["datestamp"] = np.array(sells["timestamp"]).astype("datetime64[s]") sellDates = (sells["datestamp"]).tolist() a.clear() a.plot_date(buyDates, buys["price"], "#00A3E0", label="buys") a.plot_date(sellDates, sells["price"], "#183A54", label="sells") a.legend(bbox_to_anchor=(0, 1.02, 1, .102), loc=3, ncol=2, borderaxespad=0) title = "BTC-e BTCUSD Prices\nLast Price: "+str(data["price"][1999]) a.set_title(title) class SeaofBTCapp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) tk.Tk.iconbitmap(self, default="clienticon.ico") tk.Tk.wm_title(self, "Sea of BTC client") container = tk.Frame(self) container.pack(side="top", fill="both", expand = True) container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) menubar = tk.Menu(container) filemenu = tk.Menu(menubar, tearoff=0) filemenu.add_command(label="Save settings", command = lambda: popupmsg("Not supported just yet!")) filemenu.add_separator() filemenu.add_command(label="Exit", command=quit) menubar.add_cascade(label="File", menu=filemenu) exchangeChoice = tk.Menu(menubar, tearoff=1) exchangeChoice.add_command(label="BTC-e", command=lambda: changeExchange("BTC-e","btce")) exchangeChoice.add_command(label="Bitfinex", command=lambda: changeExchange("Bitfinex","bitfinex")) exchangeChoice.add_command(label="Bitstamp", command=lambda: changeExchange("Bitstamp","bitstamp")) exchangeChoice.add_command(label="Huobi", command=lambda: changeExchange("Huobi","huobi")) menubar.add_cascade(label="Exchange", menu=exchangeChoice) dataTF = tk.Menu(menubar, tearoff=1) dataTF.add_command(label = "Tick", command=lambda: changeTimeFrame('tick')) dataTF.add_command(label = "1 Day", command=lambda: changeTimeFrame('1d')) dataTF.add_command(label = "3 Day", command=lambda: changeTimeFrame('3d')) dataTF.add_command(label = "1 Week", command=lambda: changeTimeFrame('7d')) menubar.add_cascade(label = "Data Time Frame", menu = dataTF) OHLCI = tk.Menu(menubar, tearoff=1) OHLCI.add_command(label = "Tick", command=lambda: changeTimeFrame('tick')) OHLCI.add_command(label = "1 minute", command=lambda: changeSampleSize('1Min', 0.0005)) OHLCI.add_command(label = "5 minute", command=lambda: changeSampleSize('5Min', 0.003)) OHLCI.add_command(label = "15 minute", command=lambda: changeSampleSize('15Min', 0.008)) OHLCI.add_command(label = "30 minute", command=lambda: changeSampleSize('30Min', 0.016)) OHLCI.add_command(label = "1 Hour", command=lambda: changeSampleSize('1H', 0.032)) OHLCI.add_command(label = "3 Hour", command=lambda: changeSampleSize('3H', 0.096)) menubar.add_cascade(label="OHLC Interval", menu=OHLCI) tk.Tk.config(self, menu=menubar) self.frames = {} for F in (StartPage, BTCe_Page): frame = F(container, self) self.frames[F] = frame frame.grid(row=0, column=0, sticky="nsew") self.show_frame(StartPage) def show_frame(self, cont): frame = self.frames[cont] frame.tkraise() class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self,parent) label = tk.Label(self, text=("""ALPHA Bitcoin trading application use at your own risk. There is no promise of warranty."""), font=LARGE_FONT) label.pack(pady=10,padx=10) button1 = ttk.Button(self, text="Agree", command=lambda: controller.show_frame(BTCe_Page)) button1.pack() button2 = ttk.Button(self, text="Disagree", command=quit) button2.pack() class PageOne(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = tk.Label(self, text="Page One!!!", font=LARGE_FONT) label.pack(pady=10,padx=10) button1 = ttk.Button(self, text="Back to Home", command=lambda: controller.show_frame(StartPage)) button1.pack() class BTCe_Page(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = tk.Label(self, text="Graph Page!", font=LARGE_FONT) label.pack(pady=10,padx=10) button1 = ttk.Button(self, text="Back to Home", command=lambda: controller.show_frame(StartPage)) button1.pack() canvas = FigureCanvasTkAgg(f, self) canvas.show() canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True) toolbar = NavigationToolbar2TkAgg(canvas, self) toolbar.update() canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True) app = SeaofBTCapp() app.geometry("1280x720") ani = animation.FuncAnimation(f, animate, interval=5000) app.mainloop()
Решение задачи: «Ошибка подключения Pyton к API»
textual
Листинг программы
html = requests.get(url, headers={ 'User-Agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' }).text
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д