diff --git a/.travis.yml b/.travis.yml index d2951a73..6fde7d4e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,7 +34,7 @@ before_script: - travis_retry wget https://raw.githubusercontent.com/jaggedsoft/php-binance-api/gh-travis/phpunit.xml -O phpunit.xml - travis_retry wget https://github.com/php-coveralls/php-coveralls/releases/download/v2.0.0/php-coveralls.phar -O coveralls.phar - travis_retry wget https://github.com/codacy/php-codacy-coverage/releases/download/1.4.2/codacy-coverage.phar -O codacy.phar - - travis_retry wget https://github.com/phpfmt-next/fmt/raw/master/bin/fmt.phar -O fmt.phar + - travis_retry wget https://github.com/dmzoneill/fmt/raw/master/fmt.phar -O fmt.phar - travis_retry wget https://codecov.io/bash -O codecov.sh - COMPOSER=composer-test.json composer -vvv install --no-interaction --no-suggest - chmod -v +x codecov.sh diff --git a/README.md b/README.md index daf5b0cf..91e1063f 100644 --- a/README.md +++ b/README.md @@ -16,22 +16,1357 @@ This project is designed to help you make your own projects that interact with t > Special thank you to all contributors: **dmzoneill, dxjones, jokaorgua,** and others!! *This package needs help from the community.* Improvements contributed to this project are encouraged, and you will be given full credit for changes. All pull requests welcome. +#### Installation +``` +composer require "jaggedsoft/php-binance-api @dev" +``` +
+ Click for help with installation + +## Install Composer +If the above step didn't work, install composer and try again. +#### Debian / Ubuntu +``` +sudo apt-get install curl +curl -s http://getcomposer.org/installer | php +php composer.phar install +``` +Composer not found? Use this command instead: +``` +php composer.phar require "jaggedsoft/php-binance-api @dev" +``` + +#### Windows: +[Download installer for Windows](https://github.com/jaggedsoft/php-binance-api/#installing-on-windows) + +
+ #### Getting started `composer require jaggedsoft/php-binance-api` ```php require 'vendor/autoload.php'; +// 1. config in home directory +$api = new Binance\API(); +// 2. config in specified file +$api = new Binance\API( "somefile.json" ); +// 3. config by specifying api key and secret $api = new Binance\API("",""); ``` +See [additional options](https://github.com/jaggedsoft/php-binance-api/#config-file-in-home-directory) for more options and help installing on Windows #### Get latest price of a symbol ```php $ticker = $api->prices(); print_r($ticker); // List prices of all symbols -echo "Price of BNB: {$ticker['BNBBTC']} BTC"; +echo "Price of BNB: {$ticker['BNBBTC']} BTC.".PHP_EOL; ``` -### [Documentation](https://github.com/jaggedsoft/php-binance-api/wiki/1.-Getting-Started) -> The primary documentation can be found on the [wiki](https://github.com/jaggedsoft/php-binance-api/wiki). There are also numerous other formats available. if you would like the markdown format of the wiki, you can clone it using: +
+ View Response + +``` +Array +( + [ETHBTC] => 0.05050800 + [LTCBTC] => 0.00967400 + [BNBBTC] => 0.00021479 + [NEOBTC] => 0.00479300 + [123456] => 0.00030000 + [QTUMETH] => 0.03482000 + [EOSETH] => 0.00176100 + [SNTETH] => 0.00008766 + [BNTETH] => 0.00662400 + [BCCBTC] => 0.05629200 + [GASBTC] => 0.00338500 + [BNBETH] => 0.00418603 + [BTMETH] => 0.00018900 + [HCCBTC] => 0.00000180 + [BTCUSDT] => 6028.95000000 + [ETHUSDT] => 304.98000000 + [HSRBTC] => 0.00289000 + [OAXETH] => 0.00136700 + [DNTETH] => 0.00020573 + [MCOETH] => 0.02685800 + [ICNETH] => 0.00395000 + [ELCBTC] => 0.00000053 + [MCOBTC] => 0.00133000 + [WTCBTC] => 0.00117000 + [WTCETH] => 0.02300000 + [LLTBTC] => 0.00001669 + [LRCBTC] => 0.00001100 + [LRCETH] => 0.00016311 + [QTUMBTC] => 0.00178400 + [YOYOBTC] => 0.00000481 + [OMGBTC] => 0.00125600 + [OMGETH] => 0.02497000 + [ZRXBTC] => 0.00003376 + [ZRXETH] => 0.00067001 + [STRATBTC] => 0.00052100 + [STRATETH] => 0.00950200 + [SNGLSBTC] => 0.00002216 + [SNGLSETH] => 0.00043508 + [BQXBTC] => 0.00010944 + [BQXETH] => 0.00241250 + [KNCBTC] => 0.00017060 + [KNCETH] => 0.00340090 + [FUNBTC] => 0.00000313 + [FUNETH] => 0.00006184 + [SNMBTC] => 0.00001761 + [SNMETH] => 0.00035599 + [NEOETH] => 0.09500000 + [IOTABTC] => 0.00006783 + [IOTAETH] => 0.00136000 + [LINKBTC] => 0.00004476 + [LINKETH] => 0.00087796 + [XVGBTC] => 0.00000081 + [XVGETH] => 0.00001611 + [CTRBTC] => 0.00009408 + [CTRETH] => 0.00187010 + [SALTBTC] => 0.00044400 + [SALTETH] => 0.00890000 + [MDABTC] => 0.00021973 + [MDAETH] => 0.00435550 + [MTLBTC] => 0.00116900 + [MTLETH] => 0.02470000 + [SUBBTC] => 0.00002163 + [SUBETH] => 0.00042901 + [EOSBTC] => 0.00008822 + [SNTBTC] => 0.00000438 + [ETC] => 0.00000000 + [ETCETH] => 0.03600000 + [ETCBTC] => 0.00180800 + [MTHBTC] => 0.00001425 + [MTHETH] => 0.00028092 + [ENGBTC] => 0.00007040 + [ENGETH] => 0.00138220 + [DNTBTC] => 0.00001052 + [ZECBTC] => 0.00000000 + [ZECETH] => 0.00000000 + [BNTBTC] => 0.00033501 + [ASTBTC] => 0.00004528 + [ASTETH] => 0.00083990 + [DASHBTC] => 0.04651300 + [DASHETH] => 0.90520000 +) +Price of BNB: 0.00021479 BTC. ``` -git clone https://github.com/jaggedsoft/php-binance-api.wiki.git +
+ +### Get miniTicker for all symbols +```php +$api->miniTicker(function($api, $ticker) { + print_r($ticker); +}); +``` + +
+ View Response + +``` + [7] => Array + ( + [symbol] => LTCUSDT + [close] => 182.85000000 + [open] => 192.62000000 + [high] => 195.25000000 + [low] => 173.08000000 + [volume] => 238603.66451000 + [quoteVolume] => 43782422.11276660 + [eventTime] => 1520497914289 + ) + + [8] => Array + ( + [symbol] => ICXBTC + [close] => 0.00029790 + [open] => 0.00030550 + [high] => 0.00031600 + [low] => 0.00026850 + [volume] => 8468620.53000000 + [quoteVolume] => 2493.60935828 + [eventTime] => 1520497915200 + ) + +``` +
+ +#### Get balances for all of your positions, including estimated BTC value +```php +$ticker = $api->prices(); // Make sure you have an updated ticker object for this to work +$balances = $api->balances($ticker); +print_r($balances); +echo "BTC owned: ".$balances['BTC']['available'].PHP_EOL; +echo "ETH owned: ".$balances['ETH']['available'].PHP_EOL; +echo "Estimated Value: ".$api->btc_value." BTC".PHP_EOL; +``` + +
+ View Response + +``` + [WTC] => Array + ( + [available] => 909.61000000 + [onOrder] => 0.00000000 + [btcValue] => 0.94015470 + ) + + [BNB] => Array + ( + [available] => 1045.94316876 + [onOrder] => 0.00000000 + [btcValue] => 0.21637426 + ) +... (more) +``` +
+ + +#### Get all bid/ask prices +```php +$bookPrices = $api->bookPrices(); +print_r($bookPrices); +echo "Bid price of BNB: {$bookPrices['BNBBTC']['bid']}".PHP_EOL; +``` + +
+ View Response + +``` +Price of BNB: 0.00021491 + +Array +( + [ETHBTC] => Array + ( + [bid] => 0.05053000 + [bids] => 7.21000000 + [ask] => 0.05076000 + [asks] => 13.73600000 + ) + [LTCBTC] => Array + ( + [bid] => 0.00966500 + [bids] => 62.57000000 + [ask] => 0.00967100 + [asks] => 5.48000000 + ) + [BNBBTC] => Array + ( + [bid] => 0.00021010 + [bids] => 6.00000000 + [ask] => 0.00021479 + [asks] => 76.00000000 + ) + [NEOBTC] => Array + ( + [bid] => 0.00476600 + [bids] => 5.16000000 + [ask] => 0.00479900 + [asks] => 276.00000000 + ) + [QTUMETH] => Array + ( + [bid] => 0.03515000 + [bids] => 11.87000000 + [ask] => 0.03599900 + [asks] => 0.60000000 + ) + [EOSETH] => Array + ( + [bid] => 0.00176000 + [bids] => 52.63000000 + [ask] => 0.00177900 + [asks] => 654.44000000 + ) + [SNTETH] => Array + ( + [bid] => 0.00008522 + [bids] => 2347.00000000 + [ask] => 0.00008764 + [asks] => 2151.00000000 + ) + [BNTETH] => Array + ( + [bid] => 0.00662400 + [bids] => 1940.32000000 + [ask] => 0.00683900 + [asks] => 64.89000000 + ) + [BCCBTC] => Array + ( + [bid] => 0.05614300 + [bids] => 2.15000000 + [ask] => 0.05710000 + [asks] => 0.75900000 + ) + [GASBTC] => Array + ( + [bid] => 0.00337800 + [bids] => 597.29000000 + [ask] => 0.00338500 + [asks] => 14.63000000 + ) + [BNBETH] => Array + ( + [bid] => 0.00411497 + [bids] => 375.00000000 + [ask] => 0.00418603 + [asks] => 4.00000000 + ) + [BTMETH] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [HCCBTC] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [BTCUSDT] => Array + ( + [bid] => 5970.00000000 + [bids] => 0.00500000 + [ask] => 5989.96000000 + [asks] => 0.26295200 + ) + [ETHUSDT] => Array + ( + [bid] => 303.86000000 + [bids] => 4.27000000 + [ask] => 304.99000000 + [asks] => 0.11361000 + ) + [HSRBTC] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [OAXETH] => Array + ( + [bid] => 0.00137100 + [bids] => 145.88000000 + [ask] => 0.00139500 + [asks] => 960.81000000 + ) + [DNTETH] => Array + ( + [bid] => 0.00020421 + [bids] => 19401.00000000 + [ask] => 0.00020573 + [asks] => 1.00000000 + ) + [MCOETH] => Array + ( + [bid] => 0.02630000 + [bids] => 20.36000000 + [ask] => 0.02684100 + [asks] => 75.35000000 + ) + [ICNETH] => Array + ( + [bid] => 0.00391600 + [bids] => 51.07000000 + [ask] => 0.00396800 + [asks] => 146.69000000 + ) + [ELCBTC] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [MCOBTC] => Array + ( + [bid] => 0.00132800 + [bids] => 24.64000000 + [ask] => 0.00133200 + [asks] => 8.26000000 + ) + [WTCBTC] => Array + ( + [bid] => 0.00116640 + [bids] => 104.00000000 + [ask] => 0.00118000 + [asks] => 1572.00000000 + ) + [WTCETH] => Array + ( + [bid] => 0.02311400 + [bids] => 0.99000000 + [ask] => 0.02330000 + [asks] => 27.68000000 + ) + [LLTBTC] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [LRCBTC] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [LRCETH] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [QTUMBTC] => Array + ( + [bid] => 0.00178700 + [bids] => 328.30000000 + [ask] => 0.00180500 + [asks] => 50.00000000 + ) + [YOYOBTC] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [OMGBTC] => Array + ( + [bid] => 0.00126100 + [bids] => 61.00000000 + [ask] => 0.00126400 + [asks] => 8.50000000 + ) + [OMGETH] => Array + ( + [bid] => 0.02467200 + [bids] => 60.99000000 + [ask] => 0.02527500 + [asks] => 7.98000000 + ) + [ZRXBTC] => Array + ( + [bid] => 0.00003370 + [bids] => 69.00000000 + [ask] => 0.00003377 + [asks] => 7437.00000000 + ) + [ZRXETH] => Array + ( + [bid] => 0.00065565 + [bids] => 68.00000000 + [ask] => 0.00069171 + [asks] => 123.00000000 + ) + [STRATBTC] => Array + ( + [bid] => 0.00051200 + [bids] => 387.00000000 + [ask] => 0.00052100 + [asks] => 17.90000000 + ) + [STRATETH] => Array + ( + [bid] => 0.00988800 + [bids] => 299.97000000 + [ask] => 0.01084600 + [asks] => 133.91000000 + ) + [SNGLSBTC] => Array + ( + [bid] => 0.00002211 + [bids] => 1028.00000000 + [ask] => 0.00002217 + [asks] => 536.00000000 + ) + [SNGLSETH] => Array + ( + [bid] => 0.00043801 + [bids] => 892.00000000 + [ask] => 0.00043902 + [asks] => 1585.00000000 + ) + [BQXBTC] => Array + ( + [bid] => 0.00011061 + [bids] => 1814.00000000 + [ask] => 0.00011496 + [asks] => 1707.00000000 + ) + [BQXETH] => Array + ( + [bid] => 0.00220610 + [bids] => 109.00000000 + [ask] => 0.00241190 + [asks] => 2606.00000000 + ) + [KNCBTC] => Array + ( + [bid] => 0.00017061 + [bids] => 1109.00000000 + [ask] => 0.00017297 + [asks] => 63.00000000 + ) + [KNCETH] => Array + ( + [bid] => 0.00340090 + [bids] => 3.00000000 + [ask] => 0.00342860 + [asks] => 515.00000000 + ) + [FUNBTC] => Array + ( + [bid] => 0.00000314 + [bids] => 17100.00000000 + [ask] => 0.00000317 + [asks] => 15600.00000000 + ) + [FUNETH] => Array + ( + [bid] => 0.00006186 + [bids] => 4473.00000000 + [ask] => 0.00006467 + [asks] => 42036.00000000 + ) + [SNMBTC] => Array + ( + [bid] => 0.00001760 + [bids] => 3695.00000000 + [ask] => 0.00001781 + [asks] => 623.00000000 + ) + [SNMETH] => Array + ( + [bid] => 0.00034783 + [bids] => 507.00000000 + [ask] => 0.00035350 + [asks] => 1501.00000000 + ) + [NEOETH] => Array + ( + [bid] => 0.09414500 + [bids] => 12.38000000 + [ask] => 0.09599700 + [asks] => 23.38000000 + ) + [IOTABTC] => Array + ( + [bid] => 0.00006791 + [bids] => 2000.00000000 + [ask] => 0.00006857 + [asks] => 1861.00000000 + ) + [IOTAETH] => Array + ( + [bid] => 0.00135101 + [bids] => 1461.00000000 + [ask] => 0.00138938 + [asks] => 21.00000000 + ) + [LINKBTC] => Array + ( + [bid] => 0.00004400 + [bids] => 683.00000000 + [ask] => 0.00004491 + [asks] => 7292.00000000 + ) + [LINKETH] => Array + ( + [bid] => 0.00086045 + [bids] => 682.00000000 + [ask] => 0.00087683 + [asks] => 4286.00000000 + ) + [XVGBTC] => Array + ( + [bid] => 0.00000080 + [bids] => 96600.00000000 + [ask] => 0.00000081 + [asks] => 179622.00000000 + ) + [XVGETH] => Array + ( + [bid] => 0.00001556 + [bids] => 96537.00000000 + [ask] => 0.00001675 + [asks] => 4.00000000 + ) + [CTRBTC] => Array + ( + [bid] => 0.00009346 + [bids] => 2133.00000000 + [ask] => 0.00009470 + [asks] => 1992.00000000 + ) + [CTRETH] => Array + ( + [bid] => 0.00187050 + [bids] => 501.00000000 + [ask] => 0.00189230 + [asks] => 105.00000000 + ) + [SALTBTC] => Array + ( + [bid] => 0.00044400 + [bids] => 181.09000000 + [ask] => 0.00044700 + [asks] => 1144.81000000 + ) + [SALTETH] => Array + ( + [bid] => 0.00866500 + [bids] => 216.71000000 + [ask] => 0.00893900 + [asks] => 237.00000000 + ) + [MDABTC] => Array + ( + [bid] => 0.00021328 + [bids] => 555.00000000 + [ask] => 0.00021973 + [asks] => 236.00000000 + ) + [MDAETH] => Array + ( + [bid] => 0.00425610 + [bids] => 450.00000000 + [ask] => 0.00441450 + [asks] => 511.00000000 + ) + [MTLBTC] => Array + ( + [bid] => 0.00114500 + [bids] => 194.48000000 + [ask] => 0.00117000 + [asks] => 1.40000000 + ) + [MTLETH] => Array + ( + [bid] => 0.02156000 + [bids] => 183.00000000 + [ask] => 0.02436700 + [asks] => 200.97000000 + ) + [SUBBTC] => Array + ( + [bid] => 0.00002116 + [bids] => 520.00000000 + [ask] => 0.00002177 + [asks] => 957.00000000 + ) + [SUBETH] => Array + ( + [bid] => 0.00042121 + [bids] => 202.00000000 + [ask] => 0.00044390 + [asks] => 69.00000000 + ) + [EOSBTC] => Array + ( + [bid] => 0.00008837 + [bids] => 52.00000000 + [ask] => 0.00008901 + [asks] => 565.00000000 + ) + [SNTBTC] => Array + ( + [bid] => 0.00000431 + [bids] => 11731.00000000 + [ask] => 0.00000439 + [asks] => 9000.00000000 + ) + [ETC] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [ETCETH] => Array + ( + [bid] => 0.03600000 + [bids] => 460.15000000 + [ask] => 0.03699600 + [asks] => 30.00000000 + ) + [ETCBTC] => Array + ( + [bid] => 0.00181200 + [bids] => 6.90000000 + [ask] => 0.00183700 + [asks] => 2.72000000 + ) + [MTHBTC] => Array + ( + [bid] => 0.00001400 + [bids] => 400.00000000 + [ask] => 0.00001467 + [asks] => 615.00000000 + ) + [MTHETH] => Array + ( + [bid] => 0.00027316 + [bids] => 399.00000000 + [ask] => 0.00029096 + [asks] => 24939.00000000 + ) + [ENGBTC] => Array + ( + [bid] => 0.00006927 + [bids] => 2896.00000000 + [ask] => 0.00007040 + [asks] => 75.00000000 + ) + [ENGETH] => Array + ( + [bid] => 0.00138220 + [bids] => 1111.00000000 + [ask] => 0.00142990 + [asks] => 2010.00000000 + ) + [DNTBTC] => Array + ( + [bid] => 0.00001053 + [bids] => 11295.00000000 + [ask] => 0.00001065 + [asks] => 8272.00000000 + ) + [ZECBTC] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [ZECETH] => Array + ( + [bid] => 0.00000000 + [bids] => 0.00000000 + [ask] => 0.00000000 + [asks] => 0.00000000 + ) + [BNTBTC] => Array + ( + [bid] => 0.00033500 + [bids] => 15.00000000 + [ask] => 0.00033996 + [asks] => 679.00000000 + ) + [ASTBTC] => Array + ( + [bid] => 0.00004133 + [bids] => 9513.00000000 + [ask] => 0.00004528 + [asks] => 4170.00000000 + ) + [ASTETH] => Array + ( + [bid] => 0.00083830 + [bids] => 4296.00000000 + [ask] => 0.00084900 + [asks] => 999.00000000 + ) + [DASHBTC] => Array + ( + [bid] => 0.04651200 + [bids] => 0.25000000 + [ask] => 0.04659000 + [asks] => 1.00000000 + ) + [DASHETH] => Array + ( + [bid] => 0.90420000 + [bids] => 63.96400000 + [ask] => 0.94375000 + [asks] => 0.36900000 + ) +) +``` +
+ +#### Place a LIMIT order +```php +$quantity = 1; +$price = 0.0005; +$order = $api->buy("BNBBTC", $quantity, $price); +``` + +```php +$quantity = 1; +$price = 0.0006; +$order = $api->sell("BNBBTC", $quantity, $price); +``` + +#### Place a MARKET order +```php +$quantity = 1; +$order = $api->marketBuy("BNBBTC", $quantity); +``` + +```php +$quantity = 0.01; +$order = $api->marketSell("ETHBTC", $quantity); ``` + +
+ View Response + +``` +( + [symbol] => BNBBTC + [orderId] => 7652393 + [clientOrderId] => aAE7BNUhITQj3eg04iG1sY + [transactTime] => 1508564815865 + [price] => 0.00000000 + [origQty] => 1.00000000 + [executedQty] => 1.00000000 + [status] => FILLED + [timeInForce] => GTC + [type] => MARKET + [side] => BUY +) +``` +
+ + +#### Place a STOP LOSS order +```php +// When the stop is reached, a stop order becomes a market order +$type = "STOP_LOSS"; // Set the type STOP_LOSS (market) or STOP_LOSS_LIMIT, and TAKE_PROFIT (market) or TAKE_PROFIT_LIMIT +$quantity = 1; +$price = 0.5; // Try to sell it for 0.5 btc +$stopPrice = 0.4; // Sell immediately if price goes below 0.4 btc +$order = $api->sell("BNBBTC", $quantity, $price, $type, ["stopPrice"=>$stopPrice]); +print_r($order); +``` + +#### Place an ICEBERG order +```php +// Iceberg orders are intended to conceal the true order quantity. +$type = "LIMIT"; // LIMIT, STOP_LOSS_LIMIT, and TAKE_PROFIT_LIMIT +$quantity = 1; +$price = 0.5; +$icebergQty = 10; +$order = $api->sell("BNBBTC", $quantity, $price, $type, ["icebergQty"=>$icebergQty]); +print_r($order); +``` + +#### Getting 24hr ticker price change statistics for a symbol +```php +$prevDay = $api->prevDay("BNBBTC"); +print_r($prevDay); +echo "BNB price change since yesterday: ".$prevDay['priceChangePercent']."%".PHP_EOL; +``` + +#### Complete Account Trade History +```php +$history = $api->history("BNBBTC"); +print_r($history); +``` + +
+ View Response + +``` +Array ( + [0] => Array ( + [id] => 831585 + [orderId] => 3635308 + [price] => 0.00028800 + [qty] => 4.00000000 + [commission] => 0.00200000 + [commissionAsset] => BNB + [time] => 1504805561369 + [isBuyer] => 1 + [isMaker] => + [isBestMatch] => 1 + ) + + [1] => Array ( + [id] => 1277334 + [orderId] => 6126625 + [price] => 0.00041054 + [qty] => 16.00000000 + [commission] => 0.00800000 + [commissionAsset] => BNB + [time] => 1507059468604 + [isBuyer] => 1 + [isMaker] => + [isBestMatch] => 1 + ) + + [2] => Array ( + [id] => 1345995 + [orderId] => 6407202 + [price] => 0.00035623 + [qty] => 30.00000000 + [commission] => 0.01500000 + [commissionAsset] => BNB + [time] => 1507434311489 + [isBuyer] => 1 + [isMaker] => 1 + [isBestMatch] => 1 + ) +) +... (more) +``` +
+ +#### Get Market Depth +```php +$depth = $api->depth("ETHBTC"); +print_r($depth); +``` + +#### Get Open Orders +```php +$openorders = $api->openOrders("BNBBTC"); +print_r($openorders); +``` + +#### Get Order Status +```php +$orderid = "7610385"; +$orderstatus = $api->orderStatus("ETHBTC", $orderid); +print_r($orderstatus); +``` + +#### Cancel an Order +```php +$response = $api->cancel("ETHBTC", $orderid); +print_r($response); +``` + +#### Market History / Aggregate Trades +```php +$trades = $api->aggTrades("BNBBTC"); +print_r($trades); +``` + +#### Get all account orders; active, canceled, or filled. +```php +$orders = $api->orders("BNBBTC"); +print_r($orders); +``` + +#### Get Kline/candlestick data for a symbol +```php +//Periods: 1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,1M +$ticks = $api->candlesticks("BNBBTC", "5m"); +print_r($ticks); +``` +
+ View Response + +``` + [1508560200000] => Array + ( + [open] => 0.00019691 + [high] => 0.00019695 + [low] => 0.00019502 + [close] => 0.00019503 + [volume] => 0.13712290 + ) + + [1508560500000] => Array + ( + [open] => 0.00019502 + [high] => 0.00019693 + [low] => 0.00019501 + [close] => 0.00019692 + [volume] => 1.03216357 + ) + + [1508560800000] => Array + ( + [open] => 0.00019692 + [high] => 0.00019692 + [low] => 0.00019689 + [close] => 0.00019692 + [volume] => 0.22270990 + ) +... (more) +``` +
+ +## WebSocket API + +#### miniTicker return the latest candlestick information for every symbol +```php +$api->miniTicker(function($api, $ticker) { + print_r($ticker); +}); +``` + +
+ View Response + +``` + [18] => Array + ( + [symbol] => ONTBNB + [close] => 0.37649000 + [open] => 0.30241000 + [high] => 0.38112000 + [low] => 0.29300000 + [volume] => 975240.72000000 + [quoteVolume] => 326908.77744250 + [eventTime] => 1523395389582 + ) + + [19] => Array + ( + [symbol] => WANBTC + [close] => 0.00063657 + [open] => 0.00054151 + [high] => 0.00063900 + [low] => 0.00053900 + [volume] => 4443618.00000000 + [quoteVolume] => 2637.76413131 + [eventTime] => 1523395389551 + ) +``` +
+ +#### Realtime Complete Chart Updates via WebSockets +```php +$api->chart(["BNBBTC"], "15m", function($api, $symbol, $chart) { + echo "{$symbol} chart update\n"; + print_r($chart); +}); +``` +
+ View Response + +``` + [1508560200000] => Array + ( + [open] => 0.00019691 + [high] => 0.00019695 + [low] => 0.00019502 + [close] => 0.00019503 + [volume] => 0.13712290 + ) + + [1508560500000] => Array + ( + [open] => 0.00019502 + [high] => 0.00019693 + [low] => 0.00019501 + [close] => 0.00019692 + [volume] => 1.03216357 + ) + + [1508560800000] => Array + ( + [open] => 0.00019692 + [high] => 0.00019692 + [low] => 0.00019689 + [close] => 0.00019692 + [volume] => 0.22270990 + ) +... (more) +``` +
+ +#### Get latest candlestick data only +```php +$api->kline(["BTCUSDT", "EOSBTC"], "5m", function($api, $symbol, $chart) { + //echo "{$symbol} ({$interval}) candlestick update\n"; + $interval = $chart->i; + $tick = $chart->t; + $open = $chart->o; + $high = $chart->h; + $low = $chart->l; + $close = $chart->c; + $volume = $chart->q; // +trades buyVolume assetVolume makerVolume + echo "{$symbol} price: {$close}\t volume: {$volume}\n"; +}); +``` + +#### Trade Updates via WebSocket +```php +$api->trades(["BNBBTC"], function($api, $symbol, $trades) { + echo "{$symbol} trades update".PHP_EOL; + print_r($trades); +}); +``` + +#### Get ticker updates for all symbols via WebSocket +```php +$api->ticker(false, function($api, $symbol, $ticker) { + print_r($ticker); +}); +``` + +#### Get ticker updates for a specific symbol via WebSocket +```php +$api->ticker("BNBBTC", function($api, $symbol, $ticker) { + print_r($ticker); +}); +``` + +#### Realtime updated depth cache via WebSockets +```php +$api->depthCache(["BNBBTC"], function($api, $symbol, $depth) { + echo "{$symbol} depth cache update".PHP_EOL; + //print_r($depth); // Print all depth data + $limit = 11; // Show only the closest asks/bids + $sorted = $api->sortDepth($symbol, $limit); + $bid = $api->first($sorted['bids']); + $ask = $api->first($sorted['asks']); + echo $api->displayDepth($sorted); + echo "ask: {$ask}".PHP_EOL; + echo "bid: {$bid}".PHP_EOL; +}); +``` +
+ View Response + +``` +asks: +0.00020649 1,194 0.24654906 +0.00020600 375 0.07725000 +0.00020586 4 0.00823440 +0.00020576 1 0.00205760 +0.00020564 226 0.04647464 +0.00020555 38 0.00781090 +0.00020552 98 0.02014096 +0.00020537 121 0.02484977 +0.00020520 46 0.09439200 +0.00020519 29 0.05950510 +0.00020518 311 0.06381098 +bids: +0.00022258 5,142 1.14450636 +0.00020316 7 0.00142212 +0.00020315 82 0.01665830 +0.00020314 16 0.00325024 +0.00020313 512 0.10400256 +0.00020238 5 0.01011900 +0.00020154 1,207 0.24325878 +0.00020151 1 0.02015100 +0.00020150 3 0.60450000 +0.00020140 217 0.04370380 +0.00020135 1 0.02013500 +ask: 0.00020518 +bid: 0.00022258 + +``` +
+ +#### User Data: Account Balance Updates, Trade Updates, New Orders, Filled Orders, Cancelled Orders via WebSocket +```php +$balance_update = function($api, $balances) { + print_r($balances); + echo "Balance update".PHP_EOL; +}; + +$order_update = function($api, $report) { + echo "Order update".PHP_EOL; + print_r($report); + $price = $report['price']; + $quantity = $report['quantity']; + $symbol = $report['symbol']; + $side = $report['side']; + $orderType = $report['orderType']; + $orderId = $report['orderId']; + $orderStatus = $report['orderStatus']; + $executionType = $report['orderStatus']; + if ( $executionType == "NEW" ) { + if ( $executionType == "REJECTED" ) { + echo "Order Failed! Reason: {$report['rejectReason']}".PHP_EOL; + } + echo "{$symbol} {$side} {$orderType} ORDER #{$orderId} ({$orderStatus})".PHP_EOL; + echo "..price: {$price}, quantity: {$quantity}".PHP_EOL; + return; + } + //NEW, CANCELED, REPLACED, REJECTED, TRADE, EXPIRED + echo "{$symbol} {$side} {$executionType} {$orderType} ORDER #{$orderId}".PHP_EOL; +}; +$api->userData($balance_update, $order_update); +``` + +
+ View Response + +``` +Order update + [symbol] => BNBETH + [side] => BUY + [orderType] => LIMIT + [quantity] => 2.00000000 + [price] => 0.00623005 + [executionType] => NEW + [orderStatus] => NEW + [rejectReason] => NONE + [orderId] => 4102532 + [clientOrderId] => ULtH25RPmICFH0jvsQiq8y + [orderTime] => 1508637831437 + [eventTime] => 1508637831440 + +BNBETH BUY LIMIT ORDER #4102532 (NEW) +..price: 0.00623005, quantity: 2.00000000 + +Balance update + [BTC] => Array + ( + [available] => 0.18167974 + [onOrder] => 0.00000000 + ) + + [LTC] => Array + ( + [available] => 0.00000000 + [onOrder] => 0.00000000 + ) + + [ETH] => Array + ( + [available] => 26.68739238 + [onOrder] => 2.55103500 + ) +...(more) +``` +
+ + +#### Withdraw +```php +$asset = "BTC"; +$address = "1C5gqLRs96Xq4V2ZZAR1347yUCpHie7sa"; +$amount = 0.2; +$response = $api->withdraw($asset, $address, $amount); +print_r($response); +``` + +#### Withdraw with addressTag +```php +//Required for coins like XMR, XRP, etc. +$address = "44tLjmXrQNrWJ5NBsEj2R77ZBEgDa3fEe9GLpSf2FRmhexPvfYDUAB7EXX1Hdb3aMQ9FLqdJ56yaAhiXoRsceGJCRS3Jxkn"; +$addressTag = "0e5e38a01058dbf64e53a4333a5acf98e0d5feb8e523d32e3186c664a9c762c1 +"; +$amount = 0.1; +$response = $api->withdraw($asset, $address, $amount, $addressTag); +print_r($response); +``` + +#### Get All Withdraw History +```php +$withdrawHistory = $api->withdrawHistory(); +print_r($withdrawHistory); +``` + +#### Get Withdraw History for a specific asset +```php +$withdrawHistory = $api->withdrawHistory("BTC"); +print_r($withdrawHistory); +``` + +#### Get Deposit Address +```php +$depositAddress = $api->depositAddress("VEN"); +print_r($depositAddress); +``` + +#### Get All Deposit History +```php +$depositHistory = $api->depositHistory(); +print_r($depositHistory); +``` + +### Troubleshooting +If you get the following errors, please synchronize your system time. +``` +signedRequest error: {"code":-1021,"msg":"Timestamp for this request was 1000ms ahead of the server's time."} +signedRequest error: {"code":-1021,"msg":"Timestamp for this request is outside of the recvWindow."} +balanceData error: Please make sure your system time is synchronized, or pass the useServerTime option. +``` + +#### useServerTime +```php +//Call this before running any functions +$api->useServerTime(); +``` + +#### Installing on Windows +Download and install composer: +1. https://getcomposer.org/download/ +2. Create a folder on your drive like C:\Binance +3. Run command prompt and type `cd C:\Binance` +4. ```composer require jaggedsoft/php-binance-api``` +5. Once complete copy the vendor folder into your project. + +#### Config file in home directory +If you dont wish to store your API key and secret in your scripts, load it from your home directory +```bash +mkdir -vp ~/.config/jaggedsoft/ +cat > ~/.config/jaggedsoft/php-binance-api.json << EOF +{ + "api-key": "", + "api-secret": "" +} +EOF +``` + +#### Config file in home directory with curl options +```bash +mkdir -vp ~/.config/jaggedsoft/ +cat > ~/.config/jaggedsoft/php-binance-api.json << EOF +{ + "api-key": "", + "api-secret": "", + "curlOpts": { + "CURLOPT_SSL_VERIFYPEER": 0, + "INVALID_CONSTANT_NAME": 42 + } + +} +EOF +``` + + +Optionally add proxy configuration +```bash +mkdir -vp ~/.config/jaggedsoft/ +cat > ~/.config/jaggedsoft/php-binance-api.json << EOF +{ + "api-key": "", + "api-secret": "", + "proto": "https", + "address": "proxy.domain.com", + "port": "1080" +} +EOF +``` + +custom location +```php +$api = new Binance\API( "myfile.json" ); +``` + + +#### Basic stats: Get api call counter +```php +$api->getRequestCount(); +``` + +#### Basic stats: Get total data transferred +```php +$api->getTransfered(); +``` + + + +### Documentation +> There are also numerous other formats available here: +https://github.com/jaggedsoft/php-binance-api/tree/gh-pages diff --git a/examples/constructor.php b/examples/constructor.php index 11e800d8..fb78fc7e 100644 --- a/examples/constructor.php +++ b/examples/constructor.php @@ -2,20 +2,27 @@ require '../php-binance-api.php'; -$api_key = "gW3TsYrpPoSBEX61rvGfor00ATivkbXNp3ODnNhmQpQjv4nfl8LnGXOX1iL9LcHa"; -$api_secret = "bqNINND57jzM8wDYVi6AWRjE9uzF4Q6BJ0V0FvJzdLUmq7c0uhvwUugeW67hx8Bm"; +$api_key = "z5RQZ9n8JcS3HLDQmPpfLQIGGQN6TTs5pCP5CTnn4nYk2ImFcew49v4ZrmP3MGl5"; +$api_secret = "ZqePF1DcLb6Oa0CfcLWH0Tva59y8qBBIqu789JEY27jq0RkOKXpNl9992By1PN9Z"; -$api1 = new Binance\API(); -$balances1 = $api1->balances(); -print count($balances1) . "\n"; +$api = new Binance\API($api_key, $api_secret); +$result = $api->marketBuy( "BNBBTC", 1 ); +print_r( $result ) . "\n"; -$api2 = new Binance\API( "/home/dave/.config/jaggedsoft/php-binance-api.json" ); -$balances2 = $api2->balances(); -print count($balances2) . "\n"; +$api_key = "z5RQZ9n8JcS3HLDQmPpfLQIGGQN6TTs5pCP5CTnn4nYk2ImFcew49v4ZrmP3MGl5"; +$api_secret = "intentionally wrong"; -$api3 = new Binance\API($api_key, $api_secret); -$balances3 = $api3->balances(); -print count($balances3) . "\n"; +$api = new Binance\API($api_key, $api_secret); +$result = $api->marketBuy( "BNBBTC", 1 ); +print_r( $result ) . "\n"; + + +$api_key = "YDjDADdXLCkY1BnjFxKVvBzheIyFjtafSU4yyadffiBXdezyViMi0ngiVBawwd3x"; +$api_secret = "CtWl7kkYB4eKePyosmuGbJH8FBH4ArTB2qOIedHcOYfzALDG2eD46mWVGsf7lrHJ"; // trading disabled + +$api = new Binance\API($api_key, $api_secret); +$result = $api->marketBuy( "BNBBTC", 1 ); +print_r( $result ) . "\n"; diff --git a/php-binance-api.php b/php-binance-api.php index 268bf825..35926396 100644 --- a/php-binance-api.php +++ b/php-binance-api.php @@ -125,7 +125,9 @@ private function setupApiConfigFromFile(string $file = null) return; } if (file_exists($file) === false) { - die("Unable to load config from: " . $file . PHP_EOL); + echo "Unable to load config from: " . $file . PHP_EOL; + echo "Detected no API KEY or SECRET, all signed requests will fail" . PHP_EOL; + return; } $contents = json_decode(file_get_contents($file), true); $this->api_key = isset($contents['api-key']) ? $contents['api-key'] : ""; @@ -148,7 +150,9 @@ private function setupCurlOptsFromFile(string $file = null) return; } if (file_exists($file) === false) { - die("Unable to load config from: " . $file . PHP_EOL); + echo "Unable to load config from: " . $file . PHP_EOL; + echo "No curl options will be set" . PHP_EOL; + return; } $contents = json_decode(file_get_contents($file), true); $this->curlOpts = isset($contents['curlOpts']) && is_array($contents['curlOpts']) ? $contents['curlOpts'] : []; @@ -169,7 +173,9 @@ private function setupProxyConfigFromFile(string $file = null) return; } if (file_exists($file) === false) { - die("Unable to load config from: " . $file . PHP_EOL); + echo "Unable to load config from: " . $file . PHP_EOL; + echo "No proxies will be used " . PHP_EOL; + return; } $contents = json_decode(file_get_contents($file), true); if (isset($contents['proto']) === false) { @@ -525,7 +531,7 @@ public function withdraw(string $asset, string $address, $amount, $addressTag = "wapi" => true, "name" => "API Withdraw", ]; - if (is_null($addressTag) == false && is_empty($addressTag) == false) { + if (is_null($addressTag) === false && is_empty($addressTag) === false) { $options['addressTag'] = $addressTag; } return $this->httpRequest("v3/withdraw.html", "POST", $options, true); @@ -564,7 +570,7 @@ public function depositAddress(string $asset) public function depositHistory(string $asset = null, array $params = []) { $params["wapi"] = true; - if (is_null($asset) == false) { + if (is_null($asset) === false) { $params['asset'] = $asset; } return $this->httpRequest("v3/depositHistory.html", "GET", $params, true); @@ -585,7 +591,7 @@ public function depositHistory(string $asset = null, array $params = []) public function withdrawHistory(string $asset = null, array $params = []) { $params["wapi"] = true; - if (is_null($asset) == false) { + if (is_null($asset) === false) { $params['asset'] = $asset; } return $this->httpRequest("v3/withdrawHistory.html", "GET", $params, true); @@ -660,7 +666,7 @@ public function account() public function prevDay(string $symbol = null) { $additionalData = []; - if (is_null($symbol) == false) { + if (is_null($symbol) === false) { $additionalData = [ 'symbol' => $symbol, ]; @@ -695,14 +701,14 @@ public function aggTrades(string $symbol) */ public function depth(string $symbol) { - if (isset($symbol) == false || is_string($symbol) == false) { + if (isset($symbol) === false || is_string($symbol) === false) { // WPCS: XSS OK. echo "asset: expected bool false, " . gettype($symbol) . " given" . PHP_EOL; } $json = $this->httpRequest("v1/depth", "GET", [ "symbol" => $symbol, ]); - if (isset($this->info[$symbol]) == false) { + if (isset($this->info[$symbol]) === false) { $this->info[$symbol] = []; } $this->info[$symbol]['firstUpdate'] = $json['lastUpdateId']; @@ -720,7 +726,7 @@ public function depth(string $symbol) */ public function balances($priceData = false) { - if (is_array($priceData) == false) { + if (is_array($priceData) === false) { $priceData = false; } @@ -757,7 +763,7 @@ public function getProxyUriString() 'socks5h', ); - if (in_array($uri, $supportedProtocols) == false) { + if (in_array($uri, $supportedProtocols) === false) { // WPCS: XSS OK. echo "Unknown proxy protocol '" . $this->proxyConf['proto'] . "', supported protocols are " . implode(", ", $supportedProtocols) . PHP_EOL; } @@ -765,7 +771,7 @@ public function getProxyUriString() $uri .= "://"; $uri .= isset($this->proxyConf['address']) ? $this->proxyConf['address'] : "localhost"; - if (isset($this->proxyConf['address']) == false) { + if (isset($this->proxyConf['address']) === false) { // WPCS: XSS OK. echo "warning: proxy address not set defaulting to localhost" . PHP_EOL; } @@ -773,7 +779,7 @@ public function getProxyUriString() $uri .= ":"; $uri .= isset($this->proxyConf['port']) ? $this->proxyConf['port'] : "1080"; - if (isset($this->proxyConf['address']) == false) { + if (isset($this->proxyConf['address']) === false) { // WPCS: XSS OK. echo "warning: proxy port not set defaulting to 1080" . PHP_EOL; } @@ -819,7 +825,7 @@ public function setProxy(array $proxyconf) */ private function httpRequest(string $url, string $method = "GET", array $params = [], bool $signed = false) { - if (function_exists('curl_init') == false) { + if (function_exists('curl_init') === false) { throw new \Exception("Sorry cURL is not installed!"); } @@ -832,7 +838,7 @@ private function httpRequest(string $url, string $method = "GET", array $params $query = http_build_query($params, '', '&'); // signed with params - if ($signed == true) { + if ($signed === true) { if (empty($this->api_key)) { throw new \Exception("signedRequest error: API Key not set!"); } @@ -869,12 +875,12 @@ private function httpRequest(string $url, string $method = "GET", array $params } curl_setopt($curl, CURLOPT_USERAGENT, "User-Agent: Mozilla/4.0 (compatible; PHP Binance API)"); // Post and postfields - if ($method == "POST") { + if ($method === "POST") { curl_setopt($curl, CURLOPT_POST, true); // curl_setopt($curlch, CURLOPT_POSTFIELDS, $query); } // Delete Method - if ($method == "DELETE") { + if ($method === "DELETE") { curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); } // proxy settings @@ -902,19 +908,17 @@ private function httpRequest(string $url, string $method = "GET", array $params $output = curl_exec($curl); // Check if any error occurred if (curl_errno($curl) > 0) { - // WPCS: XSS OK. - if ($this->httpDebug) { - echo 'Curl error: ' . curl_error($curl) . "\n"; - } + // should always output error, not only on httpdebug + // not outputing errors, hides it from users and ends up with tickets on github + echo 'Curl error: ' . curl_error($curl) . "\n"; return []; } curl_close($curl); $json = json_decode($output, true); if (isset($json['msg'])) { - // WPCS: XSS OK. - if ($this->httpDebug) { - echo "signedRequest error: {$output}" . PHP_EOL; - } + // should always output error, not only on httpdebug + // not outputing errors, hides it from users and ends up with tickets on github + echo "signedRequest error: {$output}" . PHP_EOL; } $this->transfered += strlen($output); $this->requestCount++; @@ -1026,6 +1030,16 @@ public function candlesticks(string $symbol, string $interval = "5m", int $limit } $response = $this->httpRequest("v1/klines", "GET", $opt); + + if (is_array($response) === false) { + return []; + } + + if (count($response) === 0) { + echo "warning: v1/klines returned empty array, usually a blip in the connection or server" . PHP_EOL; + return []; + } + $ticks = $this->chartData($symbol, $interval, $response); $this->charts[$symbol][$interval] = $ticks; return $ticks; @@ -1234,7 +1248,11 @@ private function chartData(string $symbol, string $interval, array $ticks) "ignored" => $ignored, ]; } - $this->info[$symbol][$interval]['firstOpen'] = $openTime; + + if (isset($openTime)) { + $this->info[$symbol][$interval]['firstOpen'] = $openTime; + } + return $output; } @@ -1414,7 +1432,7 @@ public function displayDepth(array $array) 'bids', ] as $type) { $entries = $array[$type]; - if ($type == 'asks') { + if ($type === 'asks') { $entries = array_reverse($entries); } @@ -1654,7 +1672,7 @@ public function depthCache($symbols, callable $callback) } $json = json_decode($data, true); $symbol = $json['s']; - if ($this->info[$symbol]['firstUpdate'] == 0) { + if (intval($this->info[$symbol]['firstUpdate']) === 0) { $this->depthQueue[$symbol][] = $json; return; } @@ -2021,10 +2039,10 @@ public function userData(&$balance_callback, &$execution_callback = false) } $json = json_decode($data); $type = $json->e; - if ($type == "outboundAccountInfo") { + if ($type === "outboundAccountInfo") { $balances = $this->balanceHandler($json->B); $this->info['balanceCallback']($this, $balances); - } elseif ($type == "executionReport") { + } elseif ($type === "executionReport") { $report = $this->executionHandler($json); if ($this->info['executionCallback']) { $this->info['executionCallback']($this, $report); @@ -2102,6 +2120,10 @@ private function downloadCurlCaBundle() { $output_filename = getcwd() . "/ca.pem"; + if (is_writable(getcwd()) === false) { + die(getcwd() . " folder is not writeable, plese check your permissions"); + } + $host = "https://curl.haxx.se/ca/cacert.pem"; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $host); @@ -2122,106 +2144,19 @@ private function downloadCurlCaBundle() $result = curl_exec($curl); curl_close($curl); + if ($result === false) { + echo "Unable to to download the CA bundle $host" . PHP_EOL; + return; + } + $fp = fopen($output_filename, 'w'); + + if ($fp === false) { + echo "Unable to write $output_filename, please check permissions on folder" . PHP_EOL; + return; + } + fwrite($fp, $result); fclose($fp); } - - /** - * Report - */ - public function report() - { - $phpversion = phpversion(); - $curlversion = phpversion('curl'); - $dns1 = dns_get_record("api.binance.com", DNS_ANY, $authns, $addtl); - $dns2 = dns_get_record($dns1[0]['target'], DNS_ANY, $authns, $addtl); - $uname = php_uname(); - $platform = PHP_OS; - $composer_installed = shell_exec("composer show 2>&1"); - - $fp = @fsockopen("api.binance.com", 443, $errno, $errstr, 0.1); - $api_access = false; - - if (!$fp) { - $api_access = false; - } else { - fclose($fp); - $api_access = true; - } - - $fp = @fsockopen("stream.binance.com", 9443, $errno, $errstr, 0.1); - $stream_access = false; - - if (!$fp) { - $stream_access = false; - } else { - fclose($fp); - $stream_access = true; - } - - $this->downloadCurlCaBundle(); - - $out = fopen('php://output', 'w'); - ob_start(); - - $host = "https://api.binance.com"; - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $host); - curl_setopt($ch, CURLOPT_VERBOSE, 1); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_HEADER, 1); - curl_setopt($ch, CURLOPT_STDERR, $out); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); - $result = curl_exec($ch); - curl_close($ch); - - fclose($out); - $with_system_ca = ob_get_clean(); - - $out = fopen('php://output', 'w'); - ob_start(); - - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $host); - curl_setopt($ch, CURLOPT_VERBOSE, 1); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_HEADER, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); - curl_setopt($ch, CURLOPT_STDERR, $out); - curl_setopt($ch, CURLOPT_CAINFO, getcwd() . '/ca.pem'); - curl_setopt($ch, CURLOPT_CAPATH, '/dev/null'); - $result = curl_exec($ch); - curl_close($ch); - - fclose($out); - $with_downloaded_ca = ob_get_clean(); - - $output = "## Uname: " . PHP_EOL; - $output .= " - " . $uname . PHP_EOL; - $output .= "## Platform: " . PHP_EOL; - $output .= " - " . $platform . PHP_EOL; - $output .= "## PHP Version: " . PHP_EOL; - $output .= " - " . $phpversion . PHP_EOL; - $output .= "## PHP Curl Version: " . PHP_EOL; - $output .= " - " . $curlversion . PHP_EOL; - $output .= "## DNS : " . PHP_EOL; - $output .= "```" . PHP_EOL . print_r($dns1, true) . PHP_EOL . "```" . PHP_EOL; - $output .= "## DNS Extra: " . PHP_EOL; - $output .= "```" . PHP_EOL . print_r($dns2, true) . PHP_EOL . "```" . PHP_EOL; - $output .= "## Curl Using System CA: " . PHP_EOL; - $output .= "```" . PHP_EOL . $with_system_ca . PHP_EOL . "```" . PHP_EOL; - $output .= "## Curl Using Downloaded CA: " . PHP_EOL; - $output .= "```" . PHP_EOL . $with_downloaded_ca . PHP_EOL . "```" . PHP_EOL; - $output .= "## Port Access 443 api.binance.com: " . PHP_EOL; - $output .= " - " . ($api_access ? "open" : "blocked") . PHP_EOL; - $output .= "## Port Access 9443 stream.binance.com: " . PHP_EOL; - $output .= " - " . ($stream_access ? "open" : "blocked") . PHP_EOL; - $output .= "## Composer modules: " . PHP_EOL; - $output .= "```" . PHP_EOL . $composer_installed . PHP_EOL . "```" . PHP_EOL; - - file_put_contents("debug.txt", $output); - } }