Форум сайта python.su
Привет друзья!
Создаю программу на Python 3.6 для графического отображения данных с биржи btc-e.nz через их API.
Документация по API: https://btc-e.nz/api/3/docs#trades
Но на btc-e.nz установлена система анти-бот (анти DDOS) Cloudflare. Из-за этого при запуске программы сервер воспринимает меня как бота и пишет ошибку Error 403: Forbidden.
В теории я понимаю, что нужно отправить серверу информацию что к нему обращается обыкновенный пользователь через какой-нибудь браузер и вести полноценный обмен куками. Только моих знаний Python пока не достаточно чтобы правильно составить программный код и как следствие терплю не удачи.
Прошу помощи в покорении этого эвереста под названием Cloudflare.
Собственно код программы:
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()
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 urllib.request >>> >>> dataLink = 'https://btc-e.nz/api/3/trades/btc_usd?limit=2000' >>> req = urllib.request.Request(dataLink, headers={'User-Agent': 'Firefox'}) >>> data = urllib.request.urlopen(req) >>> data.read()[:100] b'{"btc_usd":[{"type":"bid","price":2475,"amount":0.05040389,"tid":107740480,"timestamp":1497775039},{' >>>
Офлайн