Pybotters

Latest version: v1.2.0

Safety actively analyzes 633486 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 6 of 7

0.4.0

✅ GMOコインのWebSocket API制限により複数購読ができない 50
✅ BybitのDataStoreクラスにタイムスタンプを追加する 47
✅ ws_connectのハンドラ未指定の場合はprintハンドラを選択する 46
✅ Binanceで認証を利用するとPublic APIがパラメーターエラーとなる 44
✅ HTTPリクエストのparams/data引数の指定間違いに警告を表示する 43
✅ Binance Futures USDⓈ-MのDataStoreを実装する 20

✅ DataStore サブクラスインスタンス取得時の型エラーを解決 55
✅ GitHub Actions の matrix 実行で fail-fast を無効化 54
✅ GitHub Actions による自動テスト実行 49

🚀 New Experience

✨ Binance Futures USDⓈ-MのDataStoreを正式に実装しました

BinanceのWebSocketをハンドリングする `pybotters.BinanceDataStore` の実装が完了しました。
リアルタイムで板情報・ティッカー・アカウントのオーダーやポジションなどがDataStoreにキャッシュされ高速に参照することが可能です!
今回はBinance Futures USDⓈ-Mのみ対応しており、Binance Futures COIN-M、Spotは未対応です。
「listenKey」の自動延長はDataStoreのinitializeメソッドの機能で組み込んであるのでこれを利用することで持続的にユーザーストリームを購読できます。

全てのマーケットストリーム・ユーザーストリームを購読しREST APIで初期化する全部入りサンプル🔥
python
async def main():
async with pybotters.Client(apis=apis, base_url='https://fapi.binance.com') as client:
store = pybotters.BinanceDataStore()
await store.initialize(
client.get('/fapi/v2/balance'),
client.get('/fapi/v2/positionRisk?symbol=BTCUSDT'),
client.get('/fapi/v1/openOrders?symbol=BTCUSDT'),
client.post('/fapi/v1/listenKey'),
)

streams = '/'.join([
'btcusdtaggTrade',
'btcusdtmarkPrice',
'btcusdtkline_1m',
'btcusdt_perpetualcontinuousKline_1m',
'btcusdtticker', or btcusdtminiTicker
'btcusdtbookTicker',
'btcusdtforceOrder',
'btcusdtdepth20500ms',
'btcusdtdepth',
store.listenkey,
])
wstask = await client.ws_connect(
f'wss://fstream.binance.com/stream?streams={streams}',
hdlr_json=store.onmessage,
)

while not all([
len(store.markprice),
len(store.kline),
len(store.continuouskline),
len(store.ticker),
len(store.bookticker),
len(store.orderbook) >= 40,
]):
await store.wait()

サンプル: オーダーブックを監視
while True:
pybotters.print(store.orderbook.sorted())
await store.orderbook.wait()


✨ BybitのDataStoreにタイムスタンプ機能を追加しました

BybitのWebSocketで配信される一部データにあるタイムスタンプ(timestamp_e6)を `pybotters.BybitDataStore`に整数型で記録します。
疑似的にBybitのサーバータイムスタンプとして遅延を計ることなとが可能です。
この機能はorderBookL2_25, orderBook_200, instrument_info, klineV2を購読することで利用が可能です。

py
async def main():
async with pybotters.Client() as client:
store = pybotters.BybitDataStore()
wstasks = await asyncio.gather(
client.ws_connect(
'wss://stream.bybit.com/realtime',
send_json={'op': 'subscribe', 'args': [
'orderBookL2_25.BTCUSD|BTCUSDM21', or orderBook_200.100ms.BTCUSD|BTCUSDM21
'instrument_info.100ms.BTCUSD|BTCUSDM21',
'klineV2.1.BTCUSD|BTCUSDM21',
]},
hdlr_json=store.onmessage,
),
client.ws_connect(
'wss://stream.bybit.com/realtime_public',
send_json={'op': 'subscribe', 'args': [
'orderBookL2_25.BTCUSDT', or orderBook_200.100ms.BTCUSDT
'instrument_info.100ms.BTCUSDT',
'candle.1.BTCUSDT',
]},
hdlr_json=store.onmessage,
),
)

while True:
print(store.timestamp_e6)
1623609894038501
await store.wait()


✨ API自動認証をオフにする引数を追加しました

pybottersはREST/WebSocket APIを自動認証していますが、全て自動的に認証を行っていたので一部の取引所のPublic APIは認証により逆にエラーとなっていました。
リクエストメソッドの `auth` 引数を `None` にすることで手動で認証をオフに出来ます。

py
async def main():
async with pybotters.Client(apis=apis) as client:
ERROR
r = await client.get('https://api.binance.com/api/v3/depth', params={'symbol': 'BTCUSDT', 'limit': '10'})
print(await r.json())
{'code': -1101, 'msg': "Too many parameters; expected '2' and received '4'."}

OK
r = await client.get('https://api.binance.com/api/v3/depth', params={'symbol': 'BTCUSDT', 'limit': '10'}, auth=None)
print(await r.json())


細かい新機能

GMOコインのWebSocketにおいて複数チャンネルを購読できない問題を解消しました。
その他は各Issueをご覧ください。

♻ CI/CD

✨ GitHub Actions による自動テスト実行などを追加しました

自動テスト実行などによってpybottersの開発品質が向上します!
こちらは supermomonga 氏にコントリビュートして頂きました💖

0.3.0

✅ 試験的にBinanceのDataStoreを実装する(各取引所のDataStoreを実装する) 20
✅ BybitのInstrumentが重複する 45

🌈 Experimental

✨ 試験的にBinanceのDataStoreを実装しました 20

一部のマーケットストリームとユーザーデータストリームのDataStoreを実装しました。
** **重要** **
基本的にはFutures(USDⓈ-M、COIN-M)でテストをしており、Spotは対応できてない可能性があります。
板情報は未実装です。ベスト値のみ取れる板ティッカー(`bookticker`)のみ使えます。
また、`initialize`のようなメソッドも実装していないのでポジションやオーダーの初期値は取得できません。
完全なDataStoreは今後実装予定です。

実装済みストリーム

- `trade` (Market Streams `trade`, `aggTrade`)
- `bookticker` (Market Streams `bookTicker`)
- `balance` (User Data Streams)
- `position` (User Data Streams)
- `order` (User Data Streams)

ユーザーデータストリーム(USDⓈ-M)の例

WebSocket受信ごとにオーダー・残高・ポジションを表示する。
※`listenKey`の自動keepaliveは現状pybotters側で実装していないので手動でタスク化する必要があります。

py

async def main():
async with pybotters.Client(base_url='https://fapi.binance.com') as client:
store = pybotters.BinanceDataStore()
r = await client.post('/fapi/v1/listenKey')
data = await r.json()
listenKey = data['listenKey']
pybotters.print(data)
wstask = await client.ws_connect(
f'wss://fstream.binance.com/ws/{listenKey}',
hdlr_json=store.onmessage,
)
listentask = asyncio.create_task(keepalive(client))
while True:
pybotters.print(store.order.find())
pybotters.print(store.balance.find())
pybotters.print(store.position.find())
print('-' * 80)
await store.wait()


async def keepalive(client: pybotters.Client):
while not client._session.closed:
await client.put('/fapi/v1/listenKey')
await asyncio.sleep(1800.0) 30 minutes


🐛 Bugfix

🐛 BybitのDataStoreのレコードが重複するバグを修正しました 45

再接続時にレコード重複するバグを修正しました。(Issues参照)

0.2.2

🚀 New Experience

データストアでソート済みの板情報の取得可能にする 40

✨ ソート済みの板情報が取得できるようになりました

FTXの例

py
async def main():
store = pybotters.FTXDataStore()
ws = await client.ws_connect(
'wss://ftx.com/ws',
send_json={'op': 'subscribe', 'channel': 'orderbook', 'market': 'BTC-PERP'},
hdlr_json=store.onmessage,
)
pybotters.print(store.orderbook.sorted())
{
'asks': [

0.2.1

🐛 Bugfix

(hot-fix)FTXのサブアカウントのWebSocket認証に対応した 37

0.2.0

🚀 New Experience

FTXのデータストアを実装した 20
同期リクエストをサポートした 27
apisの暗黙的な読み込みに対応した 36
FTXのサブアカウントのWebSocket認証に対応した 37

✨ FTXのデータストアを実装しました、サブアカウントのWebSocket認証に対応しました

FTXのWebSocketのデータを簡単に扱えるようになりました!

[Reference](https://github.com/MtkN1/pybotters/wiki/Reference#class-pybottersftxdatastore)、および[Exchanges](https://github.com/MtkN1/pybotters/wiki/Exchanges#ftx)をご覧ください。

✨ 同期リクエストをサポートしました

`requests`ライブラリのように、`asyncio`を表面的に使用せずいとも簡単にリクエストが可能になりました!

python
import pybotters

r = pybotters.request('GET', 'https://...', apis=apis)
r = pybotters.get('https://...', params={'foo': 'bar'}, apis=apis)
r = pybotters.post('https://...', data={'foo': 'bar'}, apis=apis)
r = pybotters.put('https://...', data={'foo': 'bar'}, apis=apis)
r = pybotters.delete('https://...', data={'foo': 'bar'}, apis=apis)

print(r.text())
print(r.json())


> NOTE:
この呼び出し方は自動的にセッションを開き必ず閉じるのでkeep-alive接続はありません。
対話モードや検証に利用する際に便利ですが、botとして実装する場合は非同期の`Client`クラスの利用をおすすめします。

詳細は[Advanced Usage](https://github.com/MtkN1/pybotters/wiki/Advanced-Usage#%E5%90%8C%E6%9C%9F%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88)をご覧ください。

✨ apisの暗黙的な読み込みに対応しました

カレントディレクトリにJSONファイルを配置したり、環境変数を設定することで`apis`の設定を省力可能になりました!

詳細は[Advanced Usage](https://github.com/MtkN1/pybotters/wiki/Advanced-Usage#apis%E3%81%AE%E6%9A%97%E9%BB%99%E7%9A%84%E3%81%AA%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF)をご覧ください。

🚧 Specification Change

♻️ BybitDataStore.initialize の引数仕様を変更しました

`initialize`メソッドはリストを受け入れていましたが、可変長引数に変更しました。

python
store = pybotters.BybitDataStore()
before
await store.initialize([
client.get('https://...'),
client.get('https://...'),
])
after
await store.initialize(
client.get('https://...'),
client.get('https://...'),
)

0.1.2

🔧 Bugfix

BybitデータストアのUSDTの契約ポジションが正常に反映されない 34

📖 Documentation

READMEとWikiに取引所APIドキュメントのリンクを追加する 33

Page 6 of 7

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.