Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 18, 2017 10:32:58

Spetcc
Зарегистрирован: 2017-06-17
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Привет друзья!
Создаю программу на 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()

Ошибка, которую возвращает Python:
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
>>>

Офлайн

#2 Июнь 18, 2017 11:37:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10002
Репутация: +  857  -
Профиль   Отправить e-mail  

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

  
>>> 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},{'
>>>



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version