Ошибка подключения 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д