#author("2018-07-02T23:27:06+09:00","","") #author("2018-07-05T01:38:41+09:00","","") #navi(../) * PowerShellでCoinExchange.ioのgetmarketsummaries APIにアクセスしてみる [#ad1a94cd] &htmlinsert(coinexchange.io.html);の''getmarketsummaries'' APIをPowerShellで呼び出す方法の記事になります。 #contents ---- &htmlinsert(coinexchange.io.html);へのリンク~ #htmlinsert(coinexchange.io.logo.html) ---- * 追記 [#bf9fe5e3] -2018/7/5~ ''「サーバーによってプロトコル違反が発生しました. Section=ResponseHeader Detail=CR の後には LF を指定しなければなりません。」''~ が出力されるようであれば、以下リンク記事を参考にしてください。~ -[[Section=ResponseHeader Detail=CR の後には LF...の対処方法>http://win.just4fun.biz/?PowerShell/%E4%BE%8B%E5%A4%96...Section%3DResponseHeader%20Detail%3DCR%20%E3%81%AE%E5%BE%8C%E3%81%AB%E3%81%AF%20LF...%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95]] * 関連資料・記事 [#f398779b] -[[CoinExchange.io API v1 Reference>http://coinexchangeio.github.io/slate/]] -[[マーケット一覧情報取得・getmarkets(PowerShell)>API/CoinExchange.io/マーケット一覧情報取得・getmarkets(PowerShell)]] -[[マーケットサマリ情報取得・getmarketsummaries(PowerShell)>API/CoinExchange.io/マーケットサマリ情報取得・getmarketsummaries(PowerShell)]] -[[指定した通貨ペアのマーケットサマリ情報を取得・getmarketsummary(PowerShell)>API/CoinExchange.io/指定した通貨ペアのマーケットサマリ情報を取得・getmarketsummary(PowerShell)]] -[[MarketID一覧情報を取得する>API/CoinExchange.io/MarketID一覧を取得する・getmarkets(PowerShell)]] -[[仮想通貨一覧を取得・getcurrencies>API/CoinExchange.io/仮想通貨一覧を取得・getcurrencies(PowerShell)]] -[[指定した通貨の通貨情報を取得する・getcurrency>API/CoinExchange.io/指定した通貨の通貨情報を取得する・getcurrency(PowerShell)]] * ''getmarketsummaries''の仕様 [#e655e8ae] 以下、[[CoinExchange.io API v1 Reference>http://coinexchangeio.github.io/slate/]]のgetmarketsummaries APIの抜粋です。 Get Market Summaries This endpoint retrieves summaries for all markets. HTTP Request GET https://www.coinexchange.io/api/v1/getmarketsummaries 'getmarketsummaries' returns JSON structured like this: { "success": "1", "request": "/api/v1/public/getmarketsummaries", "message": "", "result": [ { "MarketID": "1", "LastPrice": "0.00902321", "Change": "2.01", "HighPrice": "0.00961681", "LowPrice": "0.00853751", "Volume": "3043.78746852", "BTCVolume": "3043.78746852", "TradeCount": "1332", "BidPrice": "0.00902321", "AskPrice": "0.00928729", "BuyOrderCount": "7796", "SellOrderCount": "7671" }, { "MarketID": "3", "LastPrice": "0.05000000", "Change": "0.00", "HighPrice": "0.00000000", "LowPrice": "0.00000000", "Volume": "0.00000000", "BTCVolume": "0.00000000", "TradeCount": "0", "BidPrice": "0.00000000", "AskPrice": "0.02000000", "BuyOrderCount": "0", "SellOrderCount": "1" } ] } * getmarketsummaries APIをブラウザでアクセスしてみる [#o9874935] 以下のURLにブラウザでアクセスしてみます。~ - https://www.coinexchange.io/api/v1/getmarketsummaries FirefoxだとJSON形式で確認することができます。~ |''JSON''|''生データ''| |&ref(01.png);|&ref(02.png);| * PowerShellのInvoke-RestMethodを使用してAPIを呼び出してみる [#c669210b] 実際に、&htmlinsert(coinexchange.io.html);の''getmarketsummaries''をInvoke-RestMethodコマンドレットを使用して呼び出してみます。 + セキュリティプロトコルをTLS1.2に変更します。(2018/5/31時点、TLS1.2を指定しないと動作しなくなったので追記) PS C:\> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +呼び出し元のURL情報を各変数に設定しています。 PS C:\> $base_url = "https://www.coinexchange.io/api/" PS C:\> $version = "v1" PS C:\> $method = "getmarketsummaries" +''getmarketsummaries'' APIのURLをInvoke-RestMethodの引数にして実行します。 PS C:\> $response = Invoke-RestMethod -UseBasicParsing "${base_url}${version}/${method}" +''getmarkets''から返却された値を表示しています。 PS C:\> $response success request message result ------- ------- ------- ------ 1 /api/v1/getmarketsummaries {@{MarketID=18; LastPrice=0.01584000; Change=0.32; HighPrice=0.01599963; ... ** 取得した値から各種値を抽出する [#t7869ca8] 上記で取得し、$responseに格納した値を操作してみます。 +取得したレスポンスは以下のようになっています。 PS C:\> $response success request message result ------- ------- ------- ------ 1 /api/v1/getmarketsummaries {@{MarketID=18; LastPrice=0.01584000; Change=0.32; HighPrice=0.01599963; ... + success, request, resultを表示してみます。 PS C:\> $response.success 1 PS C:\> $response.request /api/v1/getmarketsummaries PS C:\> $response.result.Count 689 PS C:\> $response.result[0] MarketID : 18 LastPrice : 0.01584000 Change : 0.32 HighPrice : 0.01599963 LowPrice : 0.01562021 Volume : 4.41002465 BTCVolume : 4.41002465 TradeCount : 404 BidPrice : 0.01584000 AskPrice : 0.01590000 BuyOrderCount : 251 SellOrderCount : 841 上記のresult配列内の情報を見るとMarketIDとなっており、どの銘柄のマーケット情報なのかわからない状態です。~ 以下に、銘柄をgetmarkets APIから検索しMarketIDを取得し、任意の通貨マーケット情報を取得する例を記します。~ getmarketsについては、以下のリンクに記事を公開しています。 -[[マーケット一覧情報取得・getmarkets(PowerShell)>API/CoinExchange.io/マーケット一覧情報取得・getmarkets(PowerShell)]] ** getmarketsとgetmarketsummaries APIを使用し任意の通貨ペアの情報を取得する [#r55209e3] getmarketsummaries APIだとMarketIDしかないので、知りたい通貨ペアのMarketIDを調べる必要があります。~ MarketIDを調べるには、getmarkets APIを使用します。 *** XSH/DOGEペアのマーケット情報を取得してみる [#zfa9850b] 以下の操作例は、XSH/DOGEのマーケット情報する操作例です。 + APIのエンドポイントとバージョン文字列を変数に設定しています。 PS C:\> $base_url = "https://www.coinexchange.io/api/" PS C:\> $version = "v1" +通貨ペアを指定しています。(XSH/DOGE) PS C:\> $MarketAssetCode = "XSH" PS C:\> $BaseCurrencyCode = "DOGE" +APIメソッド名を設定しています。 PS C:\> $method = "getmarkets" + セキュリティプロトコルをTLS1.2に変更します。(2018/5/31時点、TLS1.2を指定しないと動作しなくなったので追記) PS C:\> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + Invoke-RestMethodでgetmarkets APIを呼び出しています。 PS C:\> $markets = Invoke-RestMethod -UseBasicParsing "${base_url}${version}/${method}" +getmarketsで取得した情報は以下の通りです。 PS C:\> $markets success request message result ------- ------- ------- ------ 1 /api/v1/getmarkets {@{MarketID=18; MarketAssetName=Litecoin; MarketAssetCode=LTC; MarketAssetID=2; M... +XSH/DOGEのMarketIDを取得します。 PS C:\> $markets.result | % { if ($_.MarketAssetCode -eq $MarketAssetCode -And $_.BaseCurrencyCode -eq $BaseCurrencyCode) { $MarketID = $_.MarketID; $_; break } } + 取得した情報を表示しています。~ MarketIDが705であるのが確認できます。 MarketID : 705 MarketAssetName : Shield MarketAssetCode : XSH MarketAssetID : 532 MarketAssetType : currency BaseCurrency : Dogecoin BaseCurrencyCode : DOGE BaseCurrencyID : 4 Active : True 尚、上記の1ラインで$MarketID変数にMarketIDの値(今回は705)が代入されます。 PS C:\> $MarketID 705 +getmarketsummaries APIでマーケット情報を取得します。 +APIメソッド名を指定しています。 PS C:\> $method = "getmarketsummaries" + Invoke-RestMethodでgetmarketsummaries APIを呼び出しています。 PS C:\> $response = Invoke-RestMethod -UseBasicParsing "${base_url}${version}/${method}" +getmarketsummariesで取得した情報は以下の通りです。 PS C:\> $response success request message result ------- ------- ------- ------ 1 /api/v1/getmarketsummaries {@{MarketID=18; LastPrice=0.01582001; Change=1.02; HighPrice=0.01599963; ... +上記で取得した(getmarkets API)MarketID(この例では705)を使い、XSH/DOGEのマーケット情報を取り出します。 PS C:\> $response.result | % { if ($_.MarketId -eq $MarketID) { $_; break; } } MarketID : 705 LastPrice : 9.03501247 Change : -9.65 HighPrice : 9.99999973 LowPrice : 9.01202065 Volume : 50527.55224379 BTCVolume : 0.02273740 TradeCount : 21 BidPrice : 9.03501250 AskPrice : 9.75998861 BuyOrderCount : 348 SellOrderCount : 292 以下のスクリーンショットを見ると、同じ値が取得されているのが確認できます。 #ref(04.png) * HTTPステータスなどを一緒に取得したい場合はInvoke-WebRequestが便利! [#m4c92a01] 上記では、Invoke-RestMethodにてJSONをPowerShellで扱いやすい状態に変換してくれますが、~ Webサーバから返却された値を変換せずに取得したい場合は、Invoke-WebRequestコマンドレットを使用します。~ また、取得後にJSONをPowerShellで扱いやすいオブジェクトに変換するには、''ConvertFrom-Json''コマンドレットを使用します。~ 以下に実行例を記します。 + セキュリティプロトコルをTLS1.2に変更します。(2018/5/31時点、TLS1.2を指定しないと動作しなくなったので追記) PS C:\> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + APIのURL作成用の文字列を変数に格納しています。 PS C:\> $base_url = "https://www.coinexchange.io/api/" PS C:\> $version = "v1" PS C:\> $method = "getmarketsummaries" + Invoke-WebRequestコマンドレットでAPIを呼び出し返却された情報を変数に格納しています。 PS C:\> $response = Invoke-WebRequest -UseBasicParsing "${base_url}${version}/${method}" +返却された情報を表示してみます。 PS C:\> $response StatusCode : 200 StatusDescription : OK Content : {"success":"1","request":"\/api\/v1\/getmarketsummaries","message":"","result":[{"MarketID":"18","L astPrice":"0.01582001","Change":"0.42","HighPrice":"0.01599963","LowPrice":"0.01562021","Volume":"4 .3... RawContent : HTTP/1.1 200 OK Transfer-Encoding: chunked Connection: keep-alive x-frame-options: SAMEORIGIN Cache-Control: no-cache Content-Type: application/json Date: Fri, 01 Jun 2018 15:22:18 GMT Set-Cook... Forms : Headers : {[Transfer-Encoding, chunked], [Connection, keep-alive], [x-frame-options, SAMEORIGIN], [Cache-Cont rol, no-cache]...} Images : {} InputFields : {} Links : {} ParsedHtml : RawContentLength : 183771 + HTTPステータスやContent-Typeを簡単に取得することができます。 PS C:\> $response.StatusCode 200 PS C:\> $response.Headers.'Content-Type' application/json + ConvertFrom-Jsonを使ってみます。 PS C:\> $json = ConvertFrom-Json($response.Content) PS C:\> $json success request message result ------- ------- ------- ------ 1 /api/v1/getmarketsummaries {@{MarketID=18; LastPrice=0.01582001; Change=0.42; HighPrice=0.01599963; ... PS C:\> $json.result[0] MarketID : 18 LastPrice : 0.01582001 Change : 0.42 HighPrice : 0.01599963 LowPrice : 0.01562021 Volume : 4.32781232 BTCVolume : 4.32781232 TradeCount : 405 BidPrice : 0.01583001 AskPrice : 0.01590000 BuyOrderCount : 248 SellOrderCount : 842 ** Webの応答を読み取っています。(Waiting for response)を非表示にする方法 [#hd240a1e] 上記のコマンドレットを実行すると、APIサーバとのやり取りのプログレスメッセージが表示されます。~ #ref(03.png) これを非表示にしたい場合は、以下のようにしてください。 非表示にするには、$ProgressPreferenceにSilentlyContinueを設定します。~ 変更前は以下のように Continue が設定されています。 PS C:\> $ProgressPreference Continue 非表示にするには、以下のように変更します。 PS C:\> $ProgressPreference = "SilentlyContinue" 以上、PowerShellを使って、&htmlinsert(coinexchang.io.html);の getmarketsummariesとgetmarkets APIを使って~ 任意の通貨ペアのマーケット情報を取得する操作例でした。 ---- &htmlinsert(coinexchange.io.html);へのリンク~ #htmlinsert(coinexchange.io.logo.html)