├── cache └── .gitkeep ├── config.example.json ├── package.json ├── config.example.php ├── composer.json ├── .gitignore ├── cron.php ├── readme.md ├── uploader └── uploader.php ├── uploader-js └── upload.js ├── downloader └── downloader.php └── composer.lock /cache/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiPath": "", 3 | "username": "", 4 | "password": "" 5 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "instagram-private-api": "^1.39.2" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /config.example.php: -------------------------------------------------------------------------------- 1 | '', 5 | 'username' => '', 6 | 'password' => '' 7 | ]; -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": { 3 | "mgp25/instagram-php": "dev-master#6c1c6049370f4835efbf31b0b90c1db6ad623166" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # php 2 | vendor 3 | config.php 4 | 5 | # js 6 | node_modules 7 | config.json 8 | 9 | # both 10 | cache/* 11 | !cache/.gitkeep 12 | last.json 13 | next.json 14 | log.txt 15 | -------------------------------------------------------------------------------- /cron.php: -------------------------------------------------------------------------------- 1 | download($config['apiPath']); 12 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # tanmt insta uploader 2 | 3 | Connect to API endpoint, check for new images, post to insta if found. 4 | 5 | This repo contains both a JS and a PHP implementation 6 | 7 | 8 | ## Setup 9 | 10 | - Deploy somewhere (e.g. a Pi) 11 | 12 | ### PHP version 13 | - `composer install` to install dependencies 14 | - duplicate `config.example.php` and call it `config.php`, populate fields 15 | - call `cron.php` (with a cron) 16 | 17 | ### JS version 18 | 19 | - `npm install` to install dependencies 20 | - duplicate `config.example.json` and call it `config.json`, populate fields 21 | - call `uploader-js/upload.js` (with a cron) -------------------------------------------------------------------------------- /uploader/uploader.php: -------------------------------------------------------------------------------- 1 | lastJsonPath); 13 | $lastData = json_decode($lastJson); 14 | 15 | $nextJson = file_get_contents($this->nextJsonPath); 16 | $nextData = json_decode($nextJson); 17 | 18 | // if we have already uploaded this image, stop 19 | if (isset($lastData->last_modified) && isset($nextData->last_modified) && $nextData->last_modified === $lastData->last_modified) { 20 | // $this->log("Image hasn't changed since last upload: " . $lastData->title); 21 | return; 22 | } else { 23 | $this->log("Uploading image: " . $nextData->title); 24 | } 25 | 26 | try { 27 | // $this->connect($username, $password); 28 | // $photo = new \InstagramAPI\Media\Photo\InstagramPhoto($nextData->imagePath); 29 | $caption = "$nextData->title\n\n$nextData->tags"; 30 | // $this->instagram->timeline->uploadPhoto($photo->getFile(), ['caption' => $caption]); 31 | 32 | $this->log("Insta image uploaded: \n" . $nextData->imagePath . "\n" . $caption); 33 | 34 | file_put_contents($this->lastJsonPath, $nextJson); 35 | $this->log("Last JSON updated"); 36 | 37 | } catch (\Exception $e) { 38 | $this->log("Insta upload error: " . $e->getMessage()); 39 | } 40 | } 41 | 42 | private function connect($username, $password) 43 | { 44 | $this->instagram = new \InstagramAPI\Instagram(); 45 | 46 | try { 47 | $this->instagram->login($username, $password); 48 | } catch (Exception $e) { 49 | $this->log("Insta login error: " . $e->getMessage()); 50 | exit(); 51 | } 52 | } 53 | 54 | private function log($log) 55 | { 56 | echo $log . "\n"; 57 | 58 | $fp = fopen($this->logFile, 'a'); 59 | fwrite($fp, date("Y-m-d H:i:s") . ": " . $log . "\n"); 60 | fclose($fp); 61 | } 62 | } 63 | 64 | $uploader = new Uploader(); 65 | $uploader->upload(); 66 | -------------------------------------------------------------------------------- /uploader-js/upload.js: -------------------------------------------------------------------------------- 1 | const { IgApiClient } = require('instagram-private-api'); 2 | const { appendFile, readFile, writeFile } = require('fs'); 3 | const { promisify } = require('util'); 4 | 5 | const readFileAsync = promisify(readFile); 6 | const appendFileAsync = promisify(appendFile); 7 | const writeFileAsync = promisify(writeFile); 8 | const ig = new IgApiClient(); 9 | 10 | const cachePath = `${__dirname}/../cache/`; 11 | const lastJsonPath = `${__dirname}/../last.json`; 12 | const nextJsonPath = `${__dirname}/../next.json`; 13 | const logFile = `${__dirname}/../log.txt`; 14 | 15 | (async () => { 16 | const lastData = await getData(lastJsonPath); 17 | const nextData = await getData(nextJsonPath); 18 | if (!lastData || !nextData) return; 19 | 20 | if (lastData.last_modified && nextData.last_modified && Math.ceil(nextData.last_modified) === Math.ceil(lastData.last_modified)) { 21 | // log("Image hasn't changed since last upload: " + lastData.title); 22 | return; 23 | } else { 24 | log("Uploading image: " + nextData.title); 25 | } 26 | 27 | try { 28 | await login(); 29 | 30 | caption = `${nextData.title}\n\n${nextData.tags}`; 31 | 32 | await uploadImage(nextData.imagePath, caption); 33 | await log(`${nextData.title} - image uploaded`); 34 | 35 | await writeFileAsync(lastJsonPath, JSON.stringify(nextData)); 36 | 37 | } catch (e) { 38 | await log(e.message); 39 | } 40 | })(); 41 | 42 | async function login() { 43 | const config = require(`${__dirname}/../config.json`); 44 | ig.state.generateDevice(config.username); 45 | // ig.state.proxyUrl = config.proxy; 46 | await ig.account.login(config.username, config.password); 47 | } 48 | 49 | async function getData(file) { 50 | try { 51 | const data = await readFileAsync(file); 52 | if (!data) return; 53 | return JSON.parse(data); 54 | } catch (e) { 55 | return; 56 | } 57 | } 58 | 59 | async function uploadImage(image, caption) { 60 | const publishResult = await ig.publish.photo({ 61 | file: await readFileAsync(image), 62 | caption: caption, 63 | }); 64 | return publishResult; 65 | } 66 | 67 | async function log(message) { 68 | const date = new Date(); 69 | const formattedMessage = `${date.toString()}: ${message}\n`; 70 | await appendFileAsync(logFile, formattedMessage); 71 | console.log(formattedMessage); 72 | } -------------------------------------------------------------------------------- /downloader/downloader.php: -------------------------------------------------------------------------------- 1 | json = file_get_contents($url); 14 | $data = json_decode($this->json); 15 | 16 | $storedJson = file_get_contents($this->jsonPath); 17 | $storedData = json_decode($storedJson); 18 | 19 | // if we have already uploaded this image, stop 20 | if (isset($storedData->last_modified) && ceil($storedData->last_modified) === ceil($data->last_modified)) { 21 | // $this->log("Image hasn't changed since last upload: " . $storedData->title); 22 | return; 23 | } else { 24 | $this->log("Downloading new image: " . $data->title); 25 | } 26 | 27 | // if we haven't already downloaded the image, do so 28 | $imageName = basename($data->image); 29 | $imagePath = $this->cachePath . $imageName; 30 | if (!file_exists($imagePath)) { 31 | file_put_contents($imagePath, fopen($data->image, "r")); 32 | $this->log("Image downloaded: " . $imageName); 33 | } else { 34 | $this->log("Image exists: " . $imageName); 35 | } 36 | 37 | $imagePath = $this->checkImageRatio($imagePath); 38 | 39 | $data->imagePath = $imagePath; 40 | $this->json = json_encode($data); 41 | 42 | file_put_contents($this->jsonPath, $this->json); 43 | $this->log("Local JSON updated"); 44 | 45 | } catch (\Exception $e) { 46 | $this->log("Error: " . $e->getMessage()); 47 | } 48 | } 49 | 50 | private function log($log) 51 | { 52 | echo $log . "\n"; 53 | 54 | $fp = fopen($this->logFile, 'a'); 55 | fwrite($fp, date("Y-m-d H:i:s") . ": " . $log . "\n"); 56 | fclose($fp); 57 | } 58 | 59 | private function checkImageRatio($imagePath) 60 | { 61 | $maxLandscapeRatio = 1.8/1; 62 | $maxPortraitRatio = 5/4; 63 | 64 | $imageDimensions = getimagesize($imagePath); 65 | $width = $imageDimensions[0]; 66 | $height = $imageDimensions[1]; 67 | $rotation = 0; 68 | 69 | $exif = exif_read_data($imagePath); 70 | if(!empty($exif['Orientation']) && 71 | ($exif['Orientation'] === 6 || $exif['Orientation'] === 8)) { 72 | $width = $imageDimensions[1]; 73 | $height = $imageDimensions[0]; 74 | 75 | if ($exif['Orientation'] === 6) { 76 | $rotation = 270; 77 | } 78 | if ($exif['Orientation'] === 8) { 79 | $rotation = 90; 80 | } 81 | } 82 | 83 | if ($width > $height && $width/$height > $maxLandscapeRatio) { 84 | $newHeight = floor($width / $maxLandscapeRatio); 85 | $x = 0; 86 | $y = -floor(($newHeight - $height) / 2); 87 | $imagePath = $this->resizeImage($imagePath, $width, $newHeight, $x, $y, $rotation); 88 | } else if ($height > $width && $height/$width > $maxPortraitRatio) { 89 | $newWidth = floor($height / $maxPortraitRatio); 90 | $y = 0; 91 | $x = -floor(($newWidth - $width) / 2); 92 | $imagePath = $this->resizeImage($imagePath, $newWidth, $height, $x, $y, $rotation); 93 | } 94 | 95 | return $imagePath; 96 | } 97 | 98 | private function resizeImage($imagePath, $width, $height, $x, $y, $rotation) 99 | { 100 | $pathinfo = pathinfo($imagePath); 101 | 102 | if ($pathinfo['extension'] == "jpg" || $pathinfo['extension'] == "jpeg") { 103 | $src = imagecreatefromjpeg($imagePath); 104 | } else if ($pathinfo['extension'] == "png") { 105 | $src = imagecreatefrompng($imagePath); 106 | } else if ($pathinfo['extension'] == "gif") { 107 | $src = imagecreatefromgif($imagePath); 108 | } else { 109 | return; 110 | } 111 | 112 | $newImagePath = $pathinfo['dirname'] . '/' . $pathinfo['filename'] . '-insta.' . $pathinfo['extension']; 113 | 114 | $tmp = imagecreatetruecolor($width, $height); 115 | $backgroundColor = imagecolorallocate($tmp, 255, 255, 255); 116 | imagefill($tmp, 0, 0, $backgroundColor); 117 | $rotatedSrc = imagerotate($src, $rotation, 0); 118 | imagecopyresampled($tmp, $rotatedSrc, 0, 0, $x, $y, $width, $height, $width, $height); 119 | imagejpeg($tmp, $newImagePath, 100); 120 | imagedestroy($src); 121 | imagedestroy($tmp); 122 | 123 | return $newImagePath; 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "7791c7194e4630fef587b0662867d38d", 8 | "packages": [ 9 | { 10 | "name": "binsoul/net-mqtt", 11 | "version": "0.2.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/binsoul/net-mqtt.git", 15 | "reference": "286b28e6014739b19e0e7ce0cd5871cdd0cef9b3" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/binsoul/net-mqtt/zipball/286b28e6014739b19e0e7ce0cd5871cdd0cef9b3", 20 | "reference": "286b28e6014739b19e0e7ce0cd5871cdd0cef9b3", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "~5.6|~7.0" 25 | }, 26 | "require-dev": { 27 | "friendsofphp/php-cs-fixer": "~1.0", 28 | "phpunit/phpunit": "~4.0||~5.0" 29 | }, 30 | "type": "library", 31 | "extra": { 32 | "branch-alias": { 33 | "dev-master": "1.0-dev" 34 | } 35 | }, 36 | "autoload": { 37 | "psr-4": { 38 | "BinSoul\\Net\\Mqtt\\": "src" 39 | } 40 | }, 41 | "notification-url": "https://packagist.org/downloads/", 42 | "license": [ 43 | "MIT" 44 | ], 45 | "authors": [ 46 | { 47 | "name": "Sebastian Mößler", 48 | "email": "code@binsoul.de", 49 | "homepage": "https://github.com/binsoul", 50 | "role": "Developer" 51 | } 52 | ], 53 | "description": "MQTT protocol implementation", 54 | "homepage": "https://github.com/binsoul/net-mqtt", 55 | "keywords": [ 56 | "mqtt", 57 | "net" 58 | ], 59 | "time": "2017-04-03T20:17:02+00:00" 60 | }, 61 | { 62 | "name": "binsoul/net-mqtt-client-react", 63 | "version": "0.3.2", 64 | "source": { 65 | "type": "git", 66 | "url": "https://github.com/binsoul/net-mqtt-client-react.git", 67 | "reference": "6a80fea50e927ebb8bb8a631ea7903c22742ded5" 68 | }, 69 | "dist": { 70 | "type": "zip", 71 | "url": "https://api.github.com/repos/binsoul/net-mqtt-client-react/zipball/6a80fea50e927ebb8bb8a631ea7903c22742ded5", 72 | "reference": "6a80fea50e927ebb8bb8a631ea7903c22742ded5", 73 | "shasum": "" 74 | }, 75 | "require": { 76 | "binsoul/net-mqtt": "~0.2", 77 | "php": "~5.6|~7.0", 78 | "react/promise": "~2.0", 79 | "react/socket": "~0.8" 80 | }, 81 | "require-dev": { 82 | "friendsofphp/php-cs-fixer": "~1.0", 83 | "phpunit/phpunit": "~4.0||~5.0" 84 | }, 85 | "type": "library", 86 | "extra": { 87 | "branch-alias": { 88 | "dev-master": "1.0-dev" 89 | } 90 | }, 91 | "autoload": { 92 | "psr-4": { 93 | "BinSoul\\Net\\Mqtt\\Client\\React\\": "src" 94 | } 95 | }, 96 | "notification-url": "https://packagist.org/downloads/", 97 | "license": [ 98 | "MIT" 99 | ], 100 | "authors": [ 101 | { 102 | "name": "Sebastian Mößler", 103 | "email": "code@binsoul.de", 104 | "homepage": "https://github.com/binsoul", 105 | "role": "Developer" 106 | } 107 | ], 108 | "description": "Asynchronous MQTT client built on React", 109 | "homepage": "https://github.com/binsoul/net-mqtt-client-react", 110 | "keywords": [ 111 | "client", 112 | "mqtt", 113 | "net" 114 | ], 115 | "time": "2017-08-20T08:06:53+00:00" 116 | }, 117 | { 118 | "name": "clue/http-proxy-react", 119 | "version": "v1.3.0", 120 | "source": { 121 | "type": "git", 122 | "url": "https://github.com/clue/php-http-proxy-react.git", 123 | "reference": "eeff725640ed53386a6adb05ffdbfc2837404fdf" 124 | }, 125 | "dist": { 126 | "type": "zip", 127 | "url": "https://api.github.com/repos/clue/php-http-proxy-react/zipball/eeff725640ed53386a6adb05ffdbfc2837404fdf", 128 | "reference": "eeff725640ed53386a6adb05ffdbfc2837404fdf", 129 | "shasum": "" 130 | }, 131 | "require": { 132 | "php": ">=5.3", 133 | "react/promise": " ^2.1 || ^1.2.1", 134 | "react/socket": "^1.0 || ^0.8.4", 135 | "ringcentral/psr7": "^1.2" 136 | }, 137 | "require-dev": { 138 | "clue/block-react": "^1.1", 139 | "phpunit/phpunit": "^5.0 || ^4.8", 140 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" 141 | }, 142 | "type": "library", 143 | "autoload": { 144 | "psr-4": { 145 | "Clue\\React\\HttpProxy\\": "src/" 146 | } 147 | }, 148 | "notification-url": "https://packagist.org/downloads/", 149 | "license": [ 150 | "MIT" 151 | ], 152 | "authors": [ 153 | { 154 | "name": "Christian Lück", 155 | "email": "christian@lueck.tv" 156 | } 157 | ], 158 | "description": "Async HTTP proxy connector, use any TCP/IP-based protocol through an HTTP CONNECT proxy server, built on top of ReactPHP", 159 | "homepage": "https://github.com/clue/php-http-proxy-react", 160 | "keywords": [ 161 | "async", 162 | "connect", 163 | "http", 164 | "proxy", 165 | "reactphp" 166 | ], 167 | "time": "2018-02-13T16:31:32+00:00" 168 | }, 169 | { 170 | "name": "clue/socks-react", 171 | "version": "v0.8.7", 172 | "source": { 173 | "type": "git", 174 | "url": "https://github.com/clue/php-socks-react.git", 175 | "reference": "0fcd6f2f506918ff003f1b995c6e78443f26e8ea" 176 | }, 177 | "dist": { 178 | "type": "zip", 179 | "url": "https://api.github.com/repos/clue/php-socks-react/zipball/0fcd6f2f506918ff003f1b995c6e78443f26e8ea", 180 | "reference": "0fcd6f2f506918ff003f1b995c6e78443f26e8ea", 181 | "shasum": "" 182 | }, 183 | "require": { 184 | "evenement/evenement": "~3.0|~1.0|~2.0", 185 | "php": ">=5.3", 186 | "react/promise": "^2.1 || ^1.2", 187 | "react/socket": "^1.0 || ^0.8.6" 188 | }, 189 | "require-dev": { 190 | "clue/block-react": "^1.1", 191 | "clue/connection-manager-extra": "^1.0 || ^0.7", 192 | "phpunit/phpunit": "^6.0 || ^5.7 || ^4.8.35", 193 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" 194 | }, 195 | "type": "library", 196 | "autoload": { 197 | "psr-4": { 198 | "Clue\\React\\Socks\\": "src/" 199 | } 200 | }, 201 | "notification-url": "https://packagist.org/downloads/", 202 | "license": [ 203 | "MIT" 204 | ], 205 | "authors": [ 206 | { 207 | "name": "Christian Lück", 208 | "email": "christian@lueck.tv" 209 | } 210 | ], 211 | "description": "Async SOCKS4, SOCKS4a and SOCKS5 proxy client and server implementation, built on top of ReactPHP", 212 | "homepage": "https://github.com/clue/php-socks-react", 213 | "keywords": [ 214 | "async", 215 | "proxy", 216 | "reactphp", 217 | "socks client", 218 | "socks protocol", 219 | "socks server", 220 | "tcp tunnel" 221 | ], 222 | "time": "2017-12-17T14:47:58+00:00" 223 | }, 224 | { 225 | "name": "corneltek/getoptionkit", 226 | "version": "2.6.0", 227 | "source": { 228 | "type": "git", 229 | "url": "https://github.com/c9s/GetOptionKit.git", 230 | "reference": "995607ddf4fc90ebdb4a7d58fe972d581ad8495f" 231 | }, 232 | "dist": { 233 | "type": "zip", 234 | "url": "https://api.github.com/repos/c9s/GetOptionKit/zipball/995607ddf4fc90ebdb4a7d58fe972d581ad8495f", 235 | "reference": "995607ddf4fc90ebdb4a7d58fe972d581ad8495f", 236 | "shasum": "" 237 | }, 238 | "require": { 239 | "php": ">=5.3.0" 240 | }, 241 | "type": "library", 242 | "extra": { 243 | "branch-alias": { 244 | "dev-master": "2.6.x-dev" 245 | } 246 | }, 247 | "autoload": { 248 | "psr-4": { 249 | "GetOptionKit\\": "src/" 250 | } 251 | }, 252 | "notification-url": "https://packagist.org/downloads/", 253 | "license": [ 254 | "MIT" 255 | ], 256 | "authors": [ 257 | { 258 | "name": "Yo-An Lin", 259 | "email": "yoanlin93@gmail.com" 260 | } 261 | ], 262 | "description": "Powerful command-line option toolkit", 263 | "homepage": "http://github.com/c9s/GetOptionKit", 264 | "time": "2017-06-30T14:54:48+00:00" 265 | }, 266 | { 267 | "name": "evenement/evenement", 268 | "version": "v3.0.1", 269 | "source": { 270 | "type": "git", 271 | "url": "https://github.com/igorw/evenement.git", 272 | "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" 273 | }, 274 | "dist": { 275 | "type": "zip", 276 | "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", 277 | "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", 278 | "shasum": "" 279 | }, 280 | "require": { 281 | "php": ">=7.0" 282 | }, 283 | "require-dev": { 284 | "phpunit/phpunit": "^6.0" 285 | }, 286 | "type": "library", 287 | "autoload": { 288 | "psr-0": { 289 | "Evenement": "src" 290 | } 291 | }, 292 | "notification-url": "https://packagist.org/downloads/", 293 | "license": [ 294 | "MIT" 295 | ], 296 | "authors": [ 297 | { 298 | "name": "Igor Wiedler", 299 | "email": "igor@wiedler.ch" 300 | } 301 | ], 302 | "description": "Événement is a very simple event dispatching library for PHP", 303 | "keywords": [ 304 | "event-dispatcher", 305 | "event-emitter" 306 | ], 307 | "time": "2017-07-23T21:35:13+00:00" 308 | }, 309 | { 310 | "name": "guzzlehttp/guzzle", 311 | "version": "6.4.1", 312 | "source": { 313 | "type": "git", 314 | "url": "https://github.com/guzzle/guzzle.git", 315 | "reference": "0895c932405407fd3a7368b6910c09a24d26db11" 316 | }, 317 | "dist": { 318 | "type": "zip", 319 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0895c932405407fd3a7368b6910c09a24d26db11", 320 | "reference": "0895c932405407fd3a7368b6910c09a24d26db11", 321 | "shasum": "" 322 | }, 323 | "require": { 324 | "ext-json": "*", 325 | "guzzlehttp/promises": "^1.0", 326 | "guzzlehttp/psr7": "^1.6.1", 327 | "php": ">=5.5" 328 | }, 329 | "require-dev": { 330 | "ext-curl": "*", 331 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", 332 | "psr/log": "^1.1" 333 | }, 334 | "suggest": { 335 | "psr/log": "Required for using the Log middleware" 336 | }, 337 | "type": "library", 338 | "extra": { 339 | "branch-alias": { 340 | "dev-master": "6.3-dev" 341 | } 342 | }, 343 | "autoload": { 344 | "psr-4": { 345 | "GuzzleHttp\\": "src/" 346 | }, 347 | "files": [ 348 | "src/functions_include.php" 349 | ] 350 | }, 351 | "notification-url": "https://packagist.org/downloads/", 352 | "license": [ 353 | "MIT" 354 | ], 355 | "authors": [ 356 | { 357 | "name": "Michael Dowling", 358 | "email": "mtdowling@gmail.com", 359 | "homepage": "https://github.com/mtdowling" 360 | } 361 | ], 362 | "description": "Guzzle is a PHP HTTP client library", 363 | "homepage": "http://guzzlephp.org/", 364 | "keywords": [ 365 | "client", 366 | "curl", 367 | "framework", 368 | "http", 369 | "http client", 370 | "rest", 371 | "web service" 372 | ], 373 | "time": "2019-10-23T15:58:00+00:00" 374 | }, 375 | { 376 | "name": "guzzlehttp/promises", 377 | "version": "v1.3.1", 378 | "source": { 379 | "type": "git", 380 | "url": "https://github.com/guzzle/promises.git", 381 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" 382 | }, 383 | "dist": { 384 | "type": "zip", 385 | "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", 386 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", 387 | "shasum": "" 388 | }, 389 | "require": { 390 | "php": ">=5.5.0" 391 | }, 392 | "require-dev": { 393 | "phpunit/phpunit": "^4.0" 394 | }, 395 | "type": "library", 396 | "extra": { 397 | "branch-alias": { 398 | "dev-master": "1.4-dev" 399 | } 400 | }, 401 | "autoload": { 402 | "psr-4": { 403 | "GuzzleHttp\\Promise\\": "src/" 404 | }, 405 | "files": [ 406 | "src/functions_include.php" 407 | ] 408 | }, 409 | "notification-url": "https://packagist.org/downloads/", 410 | "license": [ 411 | "MIT" 412 | ], 413 | "authors": [ 414 | { 415 | "name": "Michael Dowling", 416 | "email": "mtdowling@gmail.com", 417 | "homepage": "https://github.com/mtdowling" 418 | } 419 | ], 420 | "description": "Guzzle promises library", 421 | "keywords": [ 422 | "promise" 423 | ], 424 | "time": "2016-12-20T10:07:11+00:00" 425 | }, 426 | { 427 | "name": "guzzlehttp/psr7", 428 | "version": "1.6.1", 429 | "source": { 430 | "type": "git", 431 | "url": "https://github.com/guzzle/psr7.git", 432 | "reference": "239400de7a173fe9901b9ac7c06497751f00727a" 433 | }, 434 | "dist": { 435 | "type": "zip", 436 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", 437 | "reference": "239400de7a173fe9901b9ac7c06497751f00727a", 438 | "shasum": "" 439 | }, 440 | "require": { 441 | "php": ">=5.4.0", 442 | "psr/http-message": "~1.0", 443 | "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" 444 | }, 445 | "provide": { 446 | "psr/http-message-implementation": "1.0" 447 | }, 448 | "require-dev": { 449 | "ext-zlib": "*", 450 | "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" 451 | }, 452 | "suggest": { 453 | "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" 454 | }, 455 | "type": "library", 456 | "extra": { 457 | "branch-alias": { 458 | "dev-master": "1.6-dev" 459 | } 460 | }, 461 | "autoload": { 462 | "psr-4": { 463 | "GuzzleHttp\\Psr7\\": "src/" 464 | }, 465 | "files": [ 466 | "src/functions_include.php" 467 | ] 468 | }, 469 | "notification-url": "https://packagist.org/downloads/", 470 | "license": [ 471 | "MIT" 472 | ], 473 | "authors": [ 474 | { 475 | "name": "Michael Dowling", 476 | "email": "mtdowling@gmail.com", 477 | "homepage": "https://github.com/mtdowling" 478 | }, 479 | { 480 | "name": "Tobias Schultze", 481 | "homepage": "https://github.com/Tobion" 482 | } 483 | ], 484 | "description": "PSR-7 message implementation that also provides common utility methods", 485 | "keywords": [ 486 | "http", 487 | "message", 488 | "psr-7", 489 | "request", 490 | "response", 491 | "stream", 492 | "uri", 493 | "url" 494 | ], 495 | "time": "2019-07-01T23:21:34+00:00" 496 | }, 497 | { 498 | "name": "lazyjsonmapper/lazyjsonmapper", 499 | "version": "v1.6.3", 500 | "source": { 501 | "type": "git", 502 | "url": "https://github.com/lazyjsonmapper/lazyjsonmapper.git", 503 | "reference": "51e093b50f4de15d2d64548b3ca743713eed6ee9" 504 | }, 505 | "dist": { 506 | "type": "zip", 507 | "url": "https://api.github.com/repos/lazyjsonmapper/lazyjsonmapper/zipball/51e093b50f4de15d2d64548b3ca743713eed6ee9", 508 | "reference": "51e093b50f4de15d2d64548b3ca743713eed6ee9", 509 | "shasum": "" 510 | }, 511 | "require": { 512 | "corneltek/getoptionkit": "2.*", 513 | "php": ">=5.6" 514 | }, 515 | "require-dev": { 516 | "friendsofphp/php-cs-fixer": "^2.7.1", 517 | "phpunit/phpunit": "6.*" 518 | }, 519 | "bin": [ 520 | "bin/lazydoctor" 521 | ], 522 | "type": "library", 523 | "autoload": { 524 | "psr-4": { 525 | "LazyJsonMapper\\": "src/" 526 | } 527 | }, 528 | "notification-url": "https://packagist.org/downloads/", 529 | "license": [ 530 | "Apache-2.0" 531 | ], 532 | "authors": [ 533 | { 534 | "name": "SteveJobzniak", 535 | "homepage": "https://github.com/SteveJobzniak", 536 | "role": "Developer" 537 | } 538 | ], 539 | "description": "Advanced, intelligent & automatic object-oriented JSON containers for PHP.", 540 | "homepage": "https://github.com/SteveJobzniak/LazyJsonMapper", 541 | "keywords": [ 542 | "development", 543 | "json" 544 | ], 545 | "time": "2018-05-02T16:57:09+00:00" 546 | }, 547 | { 548 | "name": "mgp25/instagram-php", 549 | "version": "dev-master", 550 | "source": { 551 | "type": "git", 552 | "url": "https://github.com/mgp25/Instagram-API.git", 553 | "reference": "6c1c6049370f4835efbf31b0b90c1db6ad623166" 554 | }, 555 | "dist": { 556 | "type": "zip", 557 | "url": "https://api.github.com/repos/mgp25/Instagram-API/zipball/6c1c6049370f4835efbf31b0b90c1db6ad623166", 558 | "reference": "6c1c6049370f4835efbf31b0b90c1db6ad623166", 559 | "shasum": "" 560 | }, 561 | "require": { 562 | "binsoul/net-mqtt-client-react": "^0.3.2", 563 | "clue/http-proxy-react": "^1.1.0", 564 | "clue/socks-react": "^0.8.2", 565 | "ext-bcmath": "*", 566 | "ext-curl": "*", 567 | "ext-exif": "*", 568 | "ext-gd": "*", 569 | "ext-mbstring": "*", 570 | "ext-zlib": "*", 571 | "guzzlehttp/guzzle": "^6.2", 572 | "lazyjsonmapper/lazyjsonmapper": "^1.6.1", 573 | "php": ">=5.6", 574 | "psr/log": "^1.0", 575 | "react/event-loop": "^0.4.3", 576 | "react/promise": "^2.5", 577 | "react/socket": "^0.8", 578 | "symfony/process": "^3.4|^4.0", 579 | "valga/fbns-react": "^0.1.8", 580 | "winbox/args": "1.0.0" 581 | }, 582 | "require-dev": { 583 | "friendsofphp/php-cs-fixer": "^2.11.0", 584 | "monolog/monolog": "^1.23", 585 | "phpunit/phpunit": "^5.7 || ^6.2", 586 | "react/http": "^0.7.2" 587 | }, 588 | "suggest": { 589 | "ext-event": "Installing PHP's native Event extension enables faster Realtime class event handling." 590 | }, 591 | "type": "library", 592 | "autoload": { 593 | "psr-4": { 594 | "InstagramAPI\\": "src/" 595 | } 596 | }, 597 | "notification-url": "https://packagist.org/downloads/", 598 | "license": [ 599 | "RPL-1.5", 600 | "proprietary" 601 | ], 602 | "authors": [ 603 | { 604 | "name": "mgp25", 605 | "email": "me@mgp25.com", 606 | "role": "Founder" 607 | }, 608 | { 609 | "name": "SteveJobzniak", 610 | "homepage": "https://github.com/SteveJobzniak", 611 | "role": "Developer" 612 | } 613 | ], 614 | "description": "Instagram's private API for PHP", 615 | "keywords": [ 616 | "api", 617 | "instagram", 618 | "php", 619 | "private" 620 | ], 621 | "time": "2017-12-19T18:59:37+00:00" 622 | }, 623 | { 624 | "name": "psr/http-message", 625 | "version": "1.0.1", 626 | "source": { 627 | "type": "git", 628 | "url": "https://github.com/php-fig/http-message.git", 629 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 630 | }, 631 | "dist": { 632 | "type": "zip", 633 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 634 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 635 | "shasum": "" 636 | }, 637 | "require": { 638 | "php": ">=5.3.0" 639 | }, 640 | "type": "library", 641 | "extra": { 642 | "branch-alias": { 643 | "dev-master": "1.0.x-dev" 644 | } 645 | }, 646 | "autoload": { 647 | "psr-4": { 648 | "Psr\\Http\\Message\\": "src/" 649 | } 650 | }, 651 | "notification-url": "https://packagist.org/downloads/", 652 | "license": [ 653 | "MIT" 654 | ], 655 | "authors": [ 656 | { 657 | "name": "PHP-FIG", 658 | "homepage": "http://www.php-fig.org/" 659 | } 660 | ], 661 | "description": "Common interface for HTTP messages", 662 | "homepage": "https://github.com/php-fig/http-message", 663 | "keywords": [ 664 | "http", 665 | "http-message", 666 | "psr", 667 | "psr-7", 668 | "request", 669 | "response" 670 | ], 671 | "time": "2016-08-06T14:39:51+00:00" 672 | }, 673 | { 674 | "name": "psr/log", 675 | "version": "1.1.2", 676 | "source": { 677 | "type": "git", 678 | "url": "https://github.com/php-fig/log.git", 679 | "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" 680 | }, 681 | "dist": { 682 | "type": "zip", 683 | "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", 684 | "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", 685 | "shasum": "" 686 | }, 687 | "require": { 688 | "php": ">=5.3.0" 689 | }, 690 | "type": "library", 691 | "extra": { 692 | "branch-alias": { 693 | "dev-master": "1.1.x-dev" 694 | } 695 | }, 696 | "autoload": { 697 | "psr-4": { 698 | "Psr\\Log\\": "Psr/Log/" 699 | } 700 | }, 701 | "notification-url": "https://packagist.org/downloads/", 702 | "license": [ 703 | "MIT" 704 | ], 705 | "authors": [ 706 | { 707 | "name": "PHP-FIG", 708 | "homepage": "http://www.php-fig.org/" 709 | } 710 | ], 711 | "description": "Common interface for logging libraries", 712 | "homepage": "https://github.com/php-fig/log", 713 | "keywords": [ 714 | "log", 715 | "psr", 716 | "psr-3" 717 | ], 718 | "time": "2019-11-01T11:05:21+00:00" 719 | }, 720 | { 721 | "name": "ralouphie/getallheaders", 722 | "version": "3.0.3", 723 | "source": { 724 | "type": "git", 725 | "url": "https://github.com/ralouphie/getallheaders.git", 726 | "reference": "120b605dfeb996808c31b6477290a714d356e822" 727 | }, 728 | "dist": { 729 | "type": "zip", 730 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", 731 | "reference": "120b605dfeb996808c31b6477290a714d356e822", 732 | "shasum": "" 733 | }, 734 | "require": { 735 | "php": ">=5.6" 736 | }, 737 | "require-dev": { 738 | "php-coveralls/php-coveralls": "^2.1", 739 | "phpunit/phpunit": "^5 || ^6.5" 740 | }, 741 | "type": "library", 742 | "autoload": { 743 | "files": [ 744 | "src/getallheaders.php" 745 | ] 746 | }, 747 | "notification-url": "https://packagist.org/downloads/", 748 | "license": [ 749 | "MIT" 750 | ], 751 | "authors": [ 752 | { 753 | "name": "Ralph Khattar", 754 | "email": "ralph.khattar@gmail.com" 755 | } 756 | ], 757 | "description": "A polyfill for getallheaders.", 758 | "time": "2019-03-08T08:55:37+00:00" 759 | }, 760 | { 761 | "name": "react/cache", 762 | "version": "v1.0.0", 763 | "source": { 764 | "type": "git", 765 | "url": "https://github.com/reactphp/cache.git", 766 | "reference": "aa10d63a1b40a36a486bdf527f28bac607ee6466" 767 | }, 768 | "dist": { 769 | "type": "zip", 770 | "url": "https://api.github.com/repos/reactphp/cache/zipball/aa10d63a1b40a36a486bdf527f28bac607ee6466", 771 | "reference": "aa10d63a1b40a36a486bdf527f28bac607ee6466", 772 | "shasum": "" 773 | }, 774 | "require": { 775 | "php": ">=5.3.0", 776 | "react/promise": "~2.0|~1.1" 777 | }, 778 | "require-dev": { 779 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" 780 | }, 781 | "type": "library", 782 | "autoload": { 783 | "psr-4": { 784 | "React\\Cache\\": "src/" 785 | } 786 | }, 787 | "notification-url": "https://packagist.org/downloads/", 788 | "license": [ 789 | "MIT" 790 | ], 791 | "description": "Async, Promise-based cache interface for ReactPHP", 792 | "keywords": [ 793 | "cache", 794 | "caching", 795 | "promise", 796 | "reactphp" 797 | ], 798 | "time": "2019-07-11T13:45:28+00:00" 799 | }, 800 | { 801 | "name": "react/dns", 802 | "version": "v0.4.19", 803 | "source": { 804 | "type": "git", 805 | "url": "https://github.com/reactphp/dns.git", 806 | "reference": "6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9" 807 | }, 808 | "dist": { 809 | "type": "zip", 810 | "url": "https://api.github.com/repos/reactphp/dns/zipball/6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9", 811 | "reference": "6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9", 812 | "shasum": "" 813 | }, 814 | "require": { 815 | "php": ">=5.3.0", 816 | "react/cache": "^1.0 || ^0.6 || ^0.5", 817 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", 818 | "react/promise": "^2.1 || ^1.2.1", 819 | "react/promise-timer": "^1.2", 820 | "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5" 821 | }, 822 | "require-dev": { 823 | "clue/block-react": "^1.2", 824 | "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35" 825 | }, 826 | "type": "library", 827 | "autoload": { 828 | "psr-4": { 829 | "React\\Dns\\": "src" 830 | } 831 | }, 832 | "notification-url": "https://packagist.org/downloads/", 833 | "license": [ 834 | "MIT" 835 | ], 836 | "description": "Async DNS resolver for ReactPHP", 837 | "keywords": [ 838 | "async", 839 | "dns", 840 | "dns-resolver", 841 | "reactphp" 842 | ], 843 | "time": "2019-07-10T21:00:53+00:00" 844 | }, 845 | { 846 | "name": "react/event-loop", 847 | "version": "v0.4.3", 848 | "source": { 849 | "type": "git", 850 | "url": "https://github.com/reactphp/event-loop.git", 851 | "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f" 852 | }, 853 | "dist": { 854 | "type": "zip", 855 | "url": "https://api.github.com/repos/reactphp/event-loop/zipball/8bde03488ee897dc6bb3d91e4e17c353f9c5252f", 856 | "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f", 857 | "shasum": "" 858 | }, 859 | "require": { 860 | "php": ">=5.4.0" 861 | }, 862 | "require-dev": { 863 | "phpunit/phpunit": "~4.8" 864 | }, 865 | "suggest": { 866 | "ext-event": "~1.0", 867 | "ext-libev": "*", 868 | "ext-libevent": ">=0.1.0" 869 | }, 870 | "type": "library", 871 | "autoload": { 872 | "psr-4": { 873 | "React\\EventLoop\\": "src" 874 | } 875 | }, 876 | "notification-url": "https://packagist.org/downloads/", 877 | "license": [ 878 | "MIT" 879 | ], 880 | "description": "Event loop abstraction layer that libraries can use for evented I/O.", 881 | "keywords": [ 882 | "asynchronous", 883 | "event-loop" 884 | ], 885 | "time": "2017-04-27T10:56:23+00:00" 886 | }, 887 | { 888 | "name": "react/promise", 889 | "version": "v2.7.1", 890 | "source": { 891 | "type": "git", 892 | "url": "https://github.com/reactphp/promise.git", 893 | "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d" 894 | }, 895 | "dist": { 896 | "type": "zip", 897 | "url": "https://api.github.com/repos/reactphp/promise/zipball/31ffa96f8d2ed0341a57848cbb84d88b89dd664d", 898 | "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d", 899 | "shasum": "" 900 | }, 901 | "require": { 902 | "php": ">=5.4.0" 903 | }, 904 | "require-dev": { 905 | "phpunit/phpunit": "~4.8" 906 | }, 907 | "type": "library", 908 | "autoload": { 909 | "psr-4": { 910 | "React\\Promise\\": "src/" 911 | }, 912 | "files": [ 913 | "src/functions_include.php" 914 | ] 915 | }, 916 | "notification-url": "https://packagist.org/downloads/", 917 | "license": [ 918 | "MIT" 919 | ], 920 | "authors": [ 921 | { 922 | "name": "Jan Sorgalla", 923 | "email": "jsorgalla@gmail.com" 924 | } 925 | ], 926 | "description": "A lightweight implementation of CommonJS Promises/A for PHP", 927 | "keywords": [ 928 | "promise", 929 | "promises" 930 | ], 931 | "time": "2019-01-07T21:25:54+00:00" 932 | }, 933 | { 934 | "name": "react/promise-timer", 935 | "version": "v1.5.1", 936 | "source": { 937 | "type": "git", 938 | "url": "https://github.com/reactphp/promise-timer.git", 939 | "reference": "35fb910604fd86b00023fc5cda477c8074ad0abc" 940 | }, 941 | "dist": { 942 | "type": "zip", 943 | "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/35fb910604fd86b00023fc5cda477c8074ad0abc", 944 | "reference": "35fb910604fd86b00023fc5cda477c8074ad0abc", 945 | "shasum": "" 946 | }, 947 | "require": { 948 | "php": ">=5.3", 949 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", 950 | "react/promise": "^2.7.0 || ^1.2.1" 951 | }, 952 | "require-dev": { 953 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" 954 | }, 955 | "type": "library", 956 | "autoload": { 957 | "psr-4": { 958 | "React\\Promise\\Timer\\": "src/" 959 | }, 960 | "files": [ 961 | "src/functions_include.php" 962 | ] 963 | }, 964 | "notification-url": "https://packagist.org/downloads/", 965 | "license": [ 966 | "MIT" 967 | ], 968 | "authors": [ 969 | { 970 | "name": "Christian Lück", 971 | "email": "christian@lueck.tv" 972 | } 973 | ], 974 | "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.", 975 | "homepage": "https://github.com/reactphp/promise-timer", 976 | "keywords": [ 977 | "async", 978 | "event-loop", 979 | "promise", 980 | "reactphp", 981 | "timeout", 982 | "timer" 983 | ], 984 | "time": "2019-03-27T18:10:32+00:00" 985 | }, 986 | { 987 | "name": "react/socket", 988 | "version": "v0.8.12", 989 | "source": { 990 | "type": "git", 991 | "url": "https://github.com/reactphp/socket.git", 992 | "reference": "7f7e6c56ccda7418a1a264892a625f38a5bdee0c" 993 | }, 994 | "dist": { 995 | "type": "zip", 996 | "url": "https://api.github.com/repos/reactphp/socket/zipball/7f7e6c56ccda7418a1a264892a625f38a5bdee0c", 997 | "reference": "7f7e6c56ccda7418a1a264892a625f38a5bdee0c", 998 | "shasum": "" 999 | }, 1000 | "require": { 1001 | "evenement/evenement": "^3.0 || ^2.0 || ^1.0", 1002 | "php": ">=5.3.0", 1003 | "react/dns": "^0.4.13", 1004 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", 1005 | "react/promise": "^2.6.0 || ^1.2.1", 1006 | "react/promise-timer": "^1.4.0", 1007 | "react/stream": "^1.0 || ^0.7.1" 1008 | }, 1009 | "require-dev": { 1010 | "clue/block-react": "^1.2", 1011 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" 1012 | }, 1013 | "type": "library", 1014 | "autoload": { 1015 | "psr-4": { 1016 | "React\\Socket\\": "src" 1017 | } 1018 | }, 1019 | "notification-url": "https://packagist.org/downloads/", 1020 | "license": [ 1021 | "MIT" 1022 | ], 1023 | "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", 1024 | "keywords": [ 1025 | "Connection", 1026 | "Socket", 1027 | "async", 1028 | "reactphp", 1029 | "stream" 1030 | ], 1031 | "time": "2018-06-11T14:33:43+00:00" 1032 | }, 1033 | { 1034 | "name": "react/stream", 1035 | "version": "v1.1.0", 1036 | "source": { 1037 | "type": "git", 1038 | "url": "https://github.com/reactphp/stream.git", 1039 | "reference": "50426855f7a77ddf43b9266c22320df5bf6c6ce6" 1040 | }, 1041 | "dist": { 1042 | "type": "zip", 1043 | "url": "https://api.github.com/repos/reactphp/stream/zipball/50426855f7a77ddf43b9266c22320df5bf6c6ce6", 1044 | "reference": "50426855f7a77ddf43b9266c22320df5bf6c6ce6", 1045 | "shasum": "" 1046 | }, 1047 | "require": { 1048 | "evenement/evenement": "^3.0 || ^2.0 || ^1.0", 1049 | "php": ">=5.3.8", 1050 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5" 1051 | }, 1052 | "require-dev": { 1053 | "clue/stream-filter": "~1.2", 1054 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" 1055 | }, 1056 | "type": "library", 1057 | "autoload": { 1058 | "psr-4": { 1059 | "React\\Stream\\": "src" 1060 | } 1061 | }, 1062 | "notification-url": "https://packagist.org/downloads/", 1063 | "license": [ 1064 | "MIT" 1065 | ], 1066 | "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", 1067 | "keywords": [ 1068 | "event-driven", 1069 | "io", 1070 | "non-blocking", 1071 | "pipe", 1072 | "reactphp", 1073 | "readable", 1074 | "stream", 1075 | "writable" 1076 | ], 1077 | "time": "2019-01-01T16:15:09+00:00" 1078 | }, 1079 | { 1080 | "name": "ringcentral/psr7", 1081 | "version": "1.2.2", 1082 | "source": { 1083 | "type": "git", 1084 | "url": "https://github.com/ringcentral/psr7.git", 1085 | "reference": "dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c" 1086 | }, 1087 | "dist": { 1088 | "type": "zip", 1089 | "url": "https://api.github.com/repos/ringcentral/psr7/zipball/dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c", 1090 | "reference": "dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c", 1091 | "shasum": "" 1092 | }, 1093 | "require": { 1094 | "php": ">=5.3", 1095 | "psr/http-message": "~1.0" 1096 | }, 1097 | "provide": { 1098 | "psr/http-message-implementation": "1.0" 1099 | }, 1100 | "require-dev": { 1101 | "phpunit/phpunit": "~4.0" 1102 | }, 1103 | "type": "library", 1104 | "extra": { 1105 | "branch-alias": { 1106 | "dev-master": "1.0-dev" 1107 | } 1108 | }, 1109 | "autoload": { 1110 | "psr-4": { 1111 | "RingCentral\\Psr7\\": "src/" 1112 | }, 1113 | "files": [ 1114 | "src/functions_include.php" 1115 | ] 1116 | }, 1117 | "notification-url": "https://packagist.org/downloads/", 1118 | "license": [ 1119 | "MIT" 1120 | ], 1121 | "authors": [ 1122 | { 1123 | "name": "Michael Dowling", 1124 | "email": "mtdowling@gmail.com", 1125 | "homepage": "https://github.com/mtdowling" 1126 | } 1127 | ], 1128 | "description": "PSR-7 message implementation", 1129 | "keywords": [ 1130 | "http", 1131 | "message", 1132 | "stream", 1133 | "uri" 1134 | ], 1135 | "time": "2018-01-15T21:00:49+00:00" 1136 | }, 1137 | { 1138 | "name": "symfony/process", 1139 | "version": "v4.3.6", 1140 | "source": { 1141 | "type": "git", 1142 | "url": "https://github.com/symfony/process.git", 1143 | "reference": "3b2e0cb029afbb0395034509291f21191d1a4db0" 1144 | }, 1145 | "dist": { 1146 | "type": "zip", 1147 | "url": "https://api.github.com/repos/symfony/process/zipball/3b2e0cb029afbb0395034509291f21191d1a4db0", 1148 | "reference": "3b2e0cb029afbb0395034509291f21191d1a4db0", 1149 | "shasum": "" 1150 | }, 1151 | "require": { 1152 | "php": "^7.1.3" 1153 | }, 1154 | "type": "library", 1155 | "extra": { 1156 | "branch-alias": { 1157 | "dev-master": "4.3-dev" 1158 | } 1159 | }, 1160 | "autoload": { 1161 | "psr-4": { 1162 | "Symfony\\Component\\Process\\": "" 1163 | }, 1164 | "exclude-from-classmap": [ 1165 | "/Tests/" 1166 | ] 1167 | }, 1168 | "notification-url": "https://packagist.org/downloads/", 1169 | "license": [ 1170 | "MIT" 1171 | ], 1172 | "authors": [ 1173 | { 1174 | "name": "Fabien Potencier", 1175 | "email": "fabien@symfony.com" 1176 | }, 1177 | { 1178 | "name": "Symfony Community", 1179 | "homepage": "https://symfony.com/contributors" 1180 | } 1181 | ], 1182 | "description": "Symfony Process Component", 1183 | "homepage": "https://symfony.com", 1184 | "time": "2019-10-28T17:07:32+00:00" 1185 | }, 1186 | { 1187 | "name": "valga/fbns-react", 1188 | "version": "0.1.8", 1189 | "source": { 1190 | "type": "git", 1191 | "url": "https://github.com/valga/fbns-react.git", 1192 | "reference": "4bbf513a8ffed7e0c9ca10776033d34515bb8b37" 1193 | }, 1194 | "dist": { 1195 | "type": "zip", 1196 | "url": "https://api.github.com/repos/valga/fbns-react/zipball/4bbf513a8ffed7e0c9ca10776033d34515bb8b37", 1197 | "reference": "4bbf513a8ffed7e0c9ca10776033d34515bb8b37", 1198 | "shasum": "" 1199 | }, 1200 | "require": { 1201 | "binsoul/net-mqtt": "~0.2", 1202 | "evenement/evenement": "~2.0|~3.0", 1203 | "ext-mbstring": "*", 1204 | "ext-zlib": "*", 1205 | "php": "~5.6|~7.0", 1206 | "psr/log": "~1.0", 1207 | "react/event-loop": "^0.4.3", 1208 | "react/promise": "~2.0", 1209 | "react/socket": "~0.8" 1210 | }, 1211 | "require-dev": { 1212 | "friendsofphp/php-cs-fixer": "~2.4", 1213 | "monolog/monolog": "~1.23" 1214 | }, 1215 | "suggest": { 1216 | "ext-event": "For more efficient event loop implementation.", 1217 | "ext-gmp": "To be able to run this code on x86 PHP builds." 1218 | }, 1219 | "type": "library", 1220 | "autoload": { 1221 | "psr-4": { 1222 | "Fbns\\Client\\": "src/" 1223 | } 1224 | }, 1225 | "notification-url": "https://packagist.org/downloads/", 1226 | "license": [ 1227 | "MIT" 1228 | ], 1229 | "authors": [ 1230 | { 1231 | "name": "Abyr Valg", 1232 | "email": "valga.github@abyrga.ru" 1233 | } 1234 | ], 1235 | "description": "A PHP client for the FBNS built on top of ReactPHP", 1236 | "keywords": [ 1237 | "FBNS", 1238 | "client", 1239 | "php" 1240 | ], 1241 | "time": "2017-10-09T07:54:13+00:00" 1242 | }, 1243 | { 1244 | "name": "winbox/args", 1245 | "version": "v1.0.0", 1246 | "source": { 1247 | "type": "git", 1248 | "url": "https://github.com/johnstevenson/winbox-args.git", 1249 | "reference": "389a9ed9410e6f422b1031b3e55a402ace716296" 1250 | }, 1251 | "dist": { 1252 | "type": "zip", 1253 | "url": "https://api.github.com/repos/johnstevenson/winbox-args/zipball/389a9ed9410e6f422b1031b3e55a402ace716296", 1254 | "reference": "389a9ed9410e6f422b1031b3e55a402ace716296", 1255 | "shasum": "" 1256 | }, 1257 | "require": { 1258 | "php": ">=5.3.3" 1259 | }, 1260 | "type": "library", 1261 | "autoload": { 1262 | "psr-4": { 1263 | "Winbox\\": "src/" 1264 | } 1265 | }, 1266 | "notification-url": "https://packagist.org/downloads/", 1267 | "license": [ 1268 | "MIT" 1269 | ], 1270 | "authors": [ 1271 | { 1272 | "name": "John Stevenson", 1273 | "email": "john-stevenson@blueyonder.co.uk" 1274 | } 1275 | ], 1276 | "description": "Windows command-line formatter", 1277 | "homepage": "http://github.com/johnstevenson/winbox-args", 1278 | "keywords": [ 1279 | "Escape", 1280 | "command", 1281 | "windows" 1282 | ], 1283 | "time": "2016-08-04T14:30:27+00:00" 1284 | } 1285 | ], 1286 | "packages-dev": [], 1287 | "aliases": [], 1288 | "minimum-stability": "stable", 1289 | "stability-flags": { 1290 | "mgp25/instagram-php": 20 1291 | }, 1292 | "prefer-stable": false, 1293 | "prefer-lowest": false, 1294 | "platform": [], 1295 | "platform-dev": [] 1296 | } 1297 | --------------------------------------------------------------------------------