Ошибка подключения Pyton к API - Python

Узнай цену своей работы

Формулировка задачи:

Создаю программу на Pyton 3.6 для графического отображения данных с биржи btc-e.nz через их API. Документация: https://btc-e.nz/api/3/docs#trades Выдает ошибку:
Листинг программы
  1. Exception in Tkinter callback
  2. Traceback (most recent call last):
  3. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__
  4. return self.func(*args)
  5. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 280, in resize
  6. self.show()
  7. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 351, in draw
  8. FigureCanvasAgg.draw(self)
  9. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\backends\backend_agg.py", line 464, in draw
  10. self.figure.draw(self.renderer)
  11. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\artist.py", line 63, in draw_wrapper
  12. draw(artist, renderer, *args, **kwargs)
  13. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\figure.py", line 1151, in draw
  14. self.canvas.draw_event(renderer)
  15. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\backend_bases.py", line 1823, in draw_event
  16. self.callbacks.process(s, event)
  17. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\cbook.py", line 554, in process
  18. proxy(*args, **kwargs)
  19. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\cbook.py", line 416, in __call__
  20. return mtd(*args, **kwargs)
  21. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\animation.py", line 881, in _start
  22. self._init_draw()
  23. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\animation.py", line 1540, in _init_draw
  24. self._draw_frame(next(self.new_frame_seq()))
  25. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\animation.py", line 1562, in _draw_frame
  26. self._drawn_artists = self._func(framedata, *self._args)
  27. File "C:\Users\User\Documents\Phyton\bot.py", line 86, in animate
  28. data = urllib.request.urlopen(dataLink)
  29. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 223, in urlopen
  30. return opener.open(url, data, timeout)
  31. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 532, in open
  32. response = meth(req, response)
  33. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 642, in http_response
  34. 'http', request, response, code, msg, hdrs)
  35. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 570, in error
  36. return self._call_chain(*args)
  37. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 504, in _call_chain
  38. result = func(*args)
  39. File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 650, in http_error_default
  40. raise HTTPError(req.full_url, code, msg, hdrs, fp)
  41. urllib.error.HTTPError: HTTP Error 403: Forbidden
  42. >>>
Программный код:
Листинг программы
  1. import matplotlib
  2. matplotlib.use("TkAgg")
  3. from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
  4. from matplotlib.figure import Figure
  5. import matplotlib.animation as animation
  6. from matplotlib import style
  7. import tkinter as tk
  8. from tkinter import ttk
  9. import urllib
  10. import json
  11. import pandas as pd
  12. import numpy as np
  13. from matplotlib import pyplot as plt
  14.  
  15. LARGE_FONT= ("Verdana", 12)
  16. NORM_FONT= ("Verdana", 10)
  17. SMALL_FONT= ("Verdana", 8)
  18.  
  19. style.use("ggplot")
  20. f = Figure()
  21. a = f.add_subplot(111)
  22. exchange = "BTC-e"
  23. DatCounter = 9000
  24. programName = "btce"
  25. resampleSize = "15Min"
  26. DataPace = "1d"
  27. candleWidth = 0.008
  28. def changeTimeFrame(tf):
  29. global DataPace
  30. if tf == "7d" and resampleSize == "1Min":
  31. popupmsg("Too much data chosen, choose a smaller time frame or higher OHLC interval")
  32. else:
  33. DataPace = tf
  34. DatCounter = 9000
  35.  
  36. def changeSampleSize(size,width):
  37. global resampleSize
  38. global candleWidth
  39. if DataPace == "7d" and resampleSize == "1Min":
  40. popupmsg("Too much data chosen, choose a smaller time frame or higher OHLC interval")
  41. elif DataPace == "tick":
  42. popupmsg("You're currently viewing tick data, not OHLC.")
  43. else:
  44. resampleSize = size
  45. DatCounter = 9000
  46. candleWidth = width
  47.  
  48. def changeExchange(toWhat,pn):
  49. global exchange
  50. global DatCounter
  51. global programName
  52. exchange = toWhat
  53. programName = pn
  54. DatCounter = 9000
  55.  
  56. def popupmsg(msg):
  57. popup = tk.Tk()
  58. popup.wm_title("!")
  59. label = ttk.Label(popup, text=msg, font=NORM_FONT)
  60. label.pack(side="top", fill="x", pady=10)
  61. B1 = ttk.Button(popup, text="Okay", command = popup.destroy)
  62. B1.pack()
  63. popup.mainloop()
  64.  
  65. def animate(i):
  66. dataLink = 'https://btc-e.nz/api/3/trades/btc_usd?limit=2000'
  67. data = urllib.request.urlopen(dataLink)
  68. data = data.readall().decode("utf-8")
  69. data = json.loads(data)
  70. data = data["btc_usd"]
  71. data = pd.DataFrame(data)
  72. buys = data[(data['type']=="bid")]
  73. buys["datestamp"] = np.array(buys["timestamp"]).astype("datetime64[s]")
  74. buyDates = (buys["datestamp"]).tolist()
  75.  
  76. sells = data[(data['type']=="ask")]
  77. sells["datestamp"] = np.array(sells["timestamp"]).astype("datetime64[s]")
  78. sellDates = (sells["datestamp"]).tolist()
  79. a.clear()
  80. a.plot_date(buyDates, buys["price"], "#00A3E0", label="buys")
  81. a.plot_date(sellDates, sells["price"], "#183A54", label="sells")
  82. a.legend(bbox_to_anchor=(0, 1.02, 1, .102), loc=3,
  83. ncol=2, borderaxespad=0)
  84. title = "BTC-e BTCUSD Prices\nLast Price: "+str(data["price"][1999])
  85. a.set_title(title)
  86.  
  87. class SeaofBTCapp(tk.Tk):
  88. def __init__(self, *args, **kwargs):
  89. tk.Tk.__init__(self, *args, **kwargs)
  90. tk.Tk.iconbitmap(self, default="clienticon.ico")
  91. tk.Tk.wm_title(self, "Sea of BTC client")
  92.  
  93. container = tk.Frame(self)
  94. container.pack(side="top", fill="both", expand = True)
  95. container.grid_rowconfigure(0, weight=1)
  96. container.grid_columnconfigure(0, weight=1)
  97.  
  98. menubar = tk.Menu(container)
  99. filemenu = tk.Menu(menubar, tearoff=0)
  100. filemenu.add_command(label="Save settings", command = lambda: popupmsg("Not supported just yet!"))
  101. filemenu.add_separator()
  102. filemenu.add_command(label="Exit", command=quit)
  103. menubar.add_cascade(label="File", menu=filemenu)
  104. exchangeChoice = tk.Menu(menubar, tearoff=1)
  105. exchangeChoice.add_command(label="BTC-e",
  106. command=lambda: changeExchange("BTC-e","btce"))
  107. exchangeChoice.add_command(label="Bitfinex",
  108. command=lambda: changeExchange("Bitfinex","bitfinex"))
  109. exchangeChoice.add_command(label="Bitstamp",
  110. command=lambda: changeExchange("Bitstamp","bitstamp"))
  111. exchangeChoice.add_command(label="Huobi",
  112. command=lambda: changeExchange("Huobi","huobi"))
  113. menubar.add_cascade(label="Exchange", menu=exchangeChoice)
  114. dataTF = tk.Menu(menubar, tearoff=1)
  115. dataTF.add_command(label = "Tick",
  116. command=lambda: changeTimeFrame('tick'))
  117. dataTF.add_command(label = "1 Day",
  118. command=lambda: changeTimeFrame('1d'))
  119. dataTF.add_command(label = "3 Day",
  120. command=lambda: changeTimeFrame('3d'))
  121. dataTF.add_command(label = "1 Week",
  122. command=lambda: changeTimeFrame('7d'))
  123. menubar.add_cascade(label = "Data Time Frame", menu = dataTF)
  124. OHLCI = tk.Menu(menubar, tearoff=1)
  125. OHLCI.add_command(label = "Tick",
  126. command=lambda: changeTimeFrame('tick'))
  127. OHLCI.add_command(label = "1 minute",
  128. command=lambda: changeSampleSize('1Min', 0.0005))
  129. OHLCI.add_command(label = "5 minute",
  130. command=lambda: changeSampleSize('5Min', 0.003))
  131. OHLCI.add_command(label = "15 minute",
  132. command=lambda: changeSampleSize('15Min', 0.008))
  133. OHLCI.add_command(label = "30 minute",
  134. command=lambda: changeSampleSize('30Min', 0.016))
  135. OHLCI.add_command(label = "1 Hour",
  136. command=lambda: changeSampleSize('1H', 0.032))
  137. OHLCI.add_command(label = "3 Hour",
  138. command=lambda: changeSampleSize('3H', 0.096))
  139. menubar.add_cascade(label="OHLC Interval", menu=OHLCI)
  140.  
  141. tk.Tk.config(self, menu=menubar)
  142. self.frames = {}
  143. for F in (StartPage, BTCe_Page):
  144. frame = F(container, self)
  145. self.frames[F] = frame
  146. frame.grid(row=0, column=0, sticky="nsew")
  147. self.show_frame(StartPage)
  148. def show_frame(self, cont):
  149. frame = self.frames[cont]
  150. frame.tkraise()
  151.  
  152. class StartPage(tk.Frame):
  153. def __init__(self, parent, controller):
  154. tk.Frame.__init__(self,parent)
  155. label = tk.Label(self, text=("""ALPHA Bitcoin trading application
  156. use at your own risk. There is no promise
  157. of warranty."""), font=LARGE_FONT)
  158. label.pack(pady=10,padx=10)
  159. button1 = ttk.Button(self, text="Agree",
  160. command=lambda: controller.show_frame(BTCe_Page))
  161. button1.pack()
  162. button2 = ttk.Button(self, text="Disagree",
  163. command=quit)
  164. button2.pack()
  165.  
  166. class PageOne(tk.Frame):
  167. def __init__(self, parent, controller):
  168. tk.Frame.__init__(self, parent)
  169. label = tk.Label(self, text="Page One!!!", font=LARGE_FONT)
  170. label.pack(pady=10,padx=10)
  171. button1 = ttk.Button(self, text="Back to Home",
  172. command=lambda: controller.show_frame(StartPage))
  173. button1.pack()
  174.  
  175. class BTCe_Page(tk.Frame):
  176. def __init__(self, parent, controller):
  177. tk.Frame.__init__(self, parent)
  178. label = tk.Label(self, text="Graph Page!", font=LARGE_FONT)
  179. label.pack(pady=10,padx=10)
  180. button1 = ttk.Button(self, text="Back to Home",
  181. command=lambda: controller.show_frame(StartPage))
  182. button1.pack()
  183.  
  184. canvas = FigureCanvasTkAgg(f, self)
  185. canvas.show()
  186. canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
  187. toolbar = NavigationToolbar2TkAgg(canvas, self)
  188. toolbar.update()
  189. canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
  190.  
  191. app = SeaofBTCapp()
  192. app.geometry("1280x720")
  193. ani = animation.FuncAnimation(f, animate, interval=5000)
  194. app.mainloop()
Облазил весь интернет не пойму в чем причина. Помогите!!!

Решение задачи: «Ошибка подключения Pyton к API»

textual
Листинг программы
  1. html = requests.get(url, headers={
  2.     'User-Agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
  3.   }).text

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут