├── .github └── workflows │ └── static.yml ├── .gitignore ├── README.md ├── composer.json ├── composer.lock ├── etc └── terms.txt ├── src ├── Browser.php ├── Engine │ ├── BingSearch.php │ ├── GoogleSearch.php │ └── SearchEngine.php ├── GoogleCaptchaSolver.php ├── SearchResponse.php └── global.php └── tests ├── BingTest.php └── GoogleTest.php /.github/workflows/static.yml: -------------------------------------------------------------------------------- 1 | name: Static Analysis 2 | 3 | on: [ push ] 4 | 5 | jobs: 6 | static: 7 | name: PHPStan using PHP ${{ matrix.php-versions }} on ${{ matrix.operating-system }} 8 | runs-on: ${{ matrix.operating-system }} 9 | strategy: 10 | matrix: 11 | operating-system: [ ubuntu-latest ] 12 | php-versions: [ '7.3', '7.4', '8.0', '8.1', '8.2', '8.3' ] 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | 18 | - name: Setup PHP 19 | uses: shivammathur/setup-php@v2 20 | with: 21 | php-version: ${{ matrix.php-versions }} 22 | coverage: none 23 | 24 | - name: Install dependencies 25 | run: composer update --no-interaction --no-progress --prefer-dist 26 | 27 | - name: Static analysis 28 | run: vendor/bin/phpstan analyse src --level=1 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://img.shields.io/github/last-commit/Athlon1600/SerpScraper.svg) 2 | ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/Athlon1600/SerpScraper/static.yml) 3 | ![PHP Versions](https://img.shields.io/badge/PHP%20Versions-%3E%3D7.3%20%7C%7C%20%5E8.0-blue) 4 | 5 | 6 | SerpScraper 7 | =========== 8 | 9 | The purpose of this library is to provide an easy, undetectable, and captcha resistant way to extract search results 10 | from popular search engines like Google and Bing. 11 | 12 | ## Installation 13 | 14 | The recommended way to install this is via Composer: 15 | 16 | ```bash 17 | composer require athlon1600/serpscraper "^4.0" 18 | ``` 19 | 20 | ## Extracting Search Results From Google 21 | 22 | ```php 23 | setPreference('results_per_page', 100); 33 | //$google->setPreference('google_domain', 'google.lt'); 34 | //$google->setPreference('date_range', 'hour'); 35 | 36 | $results = array(); 37 | 38 | do { 39 | 40 | $response = $google->search("how to scrape google", $page); 41 | 42 | // error field must be empty otherwise query failed 43 | if(empty($response->error)){ 44 | 45 | $results = array_merge($results, $response->results); 46 | $page++; 47 | 48 | } else if($response->error == 'captcha'){ 49 | 50 | // read below 51 | break; 52 | } 53 | 54 | } while ($response->has_next_page); 55 | ``` 56 | 57 | 58 | ## Solve Google Search captchas automatically 59 | 60 | For this to work, you will need to register for 2captcha.com services, and get an API key. 61 | It is also highly recommended to use a proxy server. 62 | Install a private proxy server on your own VPS here: 63 | https://github.com/Athlon1600/useful#squid 64 | 65 | ```php 66 | getBrowser(); 74 | $browser->setProxy('PROXY:IP'); 75 | 76 | $solver = new GoogleCaptchaSolver($browser); 77 | 78 | while(true){ 79 | $response = $google->search('famous people born in ' . mt_rand(1500, 2020)); 80 | 81 | if ($response->error == 'captcha') { 82 | 83 | echo "Captcha detected!" . PHP_EOL; 84 | 85 | $temp = $solver->solveUsingTwoCaptcha($response, '2CAPTCHA_API_KEY', 90); 86 | 87 | if ($temp->status == 200) { 88 | echo "Captcha solved successfully!" . PHP_EOL; 89 | } else { 90 | echo 'Solving captcha has failed...' . PHP_EOL; 91 | } 92 | 93 | } else { 94 | echo "OK. "; 95 | } 96 | 97 | sleep(2); 98 | } 99 | ``` 100 | 101 | 102 | 103 | ## Extract Search Results from Bing 104 | 105 | ```php 106 | search("search bing using php", $page); 116 | if($response->error == false){ 117 | $results = array_merge($results, $response->results); 118 | } 119 | 120 | if($response->has_next_page == false){ 121 | break; 122 | } 123 | } 124 | 125 | var_dump($results); 126 | 127 | ``` 128 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "athlon1600/serpscraper", 3 | "description": "PHP powered interface for querying the most popular Search Engines", 4 | "keywords": ["google scraper", "bing scraper", "google search", "bing search", "google captcha solver", "google proxy"], 5 | "license": "MIT", 6 | "require": { 7 | "ext-curl": "*", 8 | "athlon1600/php-curl-client": "^1.1", 9 | "athlon1600/php-captcha-solver": "^2.0" 10 | }, 11 | "scripts": { 12 | "test": "phpunit tests", 13 | "serve": "php -S localhost:8000" 14 | }, 15 | "autoload": { 16 | "psr-4": { 17 | "SerpScraper\\": "src/" 18 | }, 19 | "files": [ 20 | "src/global.php" 21 | ] 22 | }, 23 | "require-dev": { 24 | "phpunit/phpunit": "^8.5.39 || ^9.5 || ^10.0", 25 | "phpstan/phpstan": "^1.12" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /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": "4d7e9fbb8743433d7da3b832f9bed064", 8 | "packages": [ 9 | { 10 | "name": "athlon1600/php-captcha-solver", 11 | "version": "v2.0.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/Athlon1600/php-captcha-solver.git", 15 | "reference": "a13f867b5d46bf543a78f9aff9d54b0c296e8fbb" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/Athlon1600/php-captcha-solver/zipball/a13f867b5d46bf543a78f9aff9d54b0c296e8fbb", 20 | "reference": "a13f867b5d46bf543a78f9aff9d54b0c296e8fbb", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "athlon1600/php-curl-client": "^1.1", 25 | "ext-json": "*" 26 | }, 27 | "require-dev": { 28 | "phpunit/phpunit": "8" 29 | }, 30 | "type": "library", 31 | "autoload": { 32 | "psr-4": { 33 | "CaptchaSolver\\": "src/" 34 | } 35 | }, 36 | "notification-url": "https://packagist.org/downloads/", 37 | "license": [ 38 | "MIT" 39 | ], 40 | "authors": [ 41 | { 42 | "name": "Athlon1600", 43 | "email": "Athlon2400@gmail.com" 44 | } 45 | ], 46 | "time": "2020-07-27T21:59:22+00:00" 47 | }, 48 | { 49 | "name": "athlon1600/php-curl-client", 50 | "version": "v1.1.1", 51 | "source": { 52 | "type": "git", 53 | "url": "https://github.com/Athlon1600/php-curl-client.git", 54 | "reference": "b65ddd8e865d82ce3cdb20ff406411aeabdaf75e" 55 | }, 56 | "dist": { 57 | "type": "zip", 58 | "url": "https://api.github.com/repos/Athlon1600/php-curl-client/zipball/b65ddd8e865d82ce3cdb20ff406411aeabdaf75e", 59 | "reference": "b65ddd8e865d82ce3cdb20ff406411aeabdaf75e", 60 | "shasum": "" 61 | }, 62 | "require": { 63 | "ext-curl": "*", 64 | "ext-json": "*" 65 | }, 66 | "require-dev": { 67 | "phpunit/phpunit": "^7.0" 68 | }, 69 | "type": "library", 70 | "autoload": { 71 | "psr-4": { 72 | "Curl\\": "src/" 73 | } 74 | }, 75 | "notification-url": "https://packagist.org/downloads/", 76 | "license": [ 77 | "MIT" 78 | ], 79 | "description": "Simple PHP cURL Client", 80 | "keywords": [ 81 | "php curl client" 82 | ], 83 | "time": "2020-05-15T13:06:46+00:00" 84 | } 85 | ], 86 | "packages-dev": [ 87 | { 88 | "name": "myclabs/deep-copy", 89 | "version": "1.12.0", 90 | "source": { 91 | "type": "git", 92 | "url": "https://github.com/myclabs/DeepCopy.git", 93 | "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" 94 | }, 95 | "dist": { 96 | "type": "zip", 97 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", 98 | "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", 99 | "shasum": "" 100 | }, 101 | "require": { 102 | "php": "^7.1 || ^8.0" 103 | }, 104 | "conflict": { 105 | "doctrine/collections": "<1.6.8", 106 | "doctrine/common": "<2.13.3 || >=3 <3.2.2" 107 | }, 108 | "require-dev": { 109 | "doctrine/collections": "^1.6.8", 110 | "doctrine/common": "^2.13.3 || ^3.2.2", 111 | "phpspec/prophecy": "^1.10", 112 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 113 | }, 114 | "type": "library", 115 | "autoload": { 116 | "files": [ 117 | "src/DeepCopy/deep_copy.php" 118 | ], 119 | "psr-4": { 120 | "DeepCopy\\": "src/DeepCopy/" 121 | } 122 | }, 123 | "notification-url": "https://packagist.org/downloads/", 124 | "license": [ 125 | "MIT" 126 | ], 127 | "description": "Create deep copies (clones) of your objects", 128 | "keywords": [ 129 | "clone", 130 | "copy", 131 | "duplicate", 132 | "object", 133 | "object graph" 134 | ], 135 | "support": { 136 | "issues": "https://github.com/myclabs/DeepCopy/issues", 137 | "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" 138 | }, 139 | "funding": [ 140 | { 141 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 142 | "type": "tidelift" 143 | } 144 | ], 145 | "time": "2024-06-12T14:39:25+00:00" 146 | }, 147 | { 148 | "name": "nikic/php-parser", 149 | "version": "v5.1.0", 150 | "source": { 151 | "type": "git", 152 | "url": "https://github.com/nikic/PHP-Parser.git", 153 | "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" 154 | }, 155 | "dist": { 156 | "type": "zip", 157 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", 158 | "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", 159 | "shasum": "" 160 | }, 161 | "require": { 162 | "ext-ctype": "*", 163 | "ext-json": "*", 164 | "ext-tokenizer": "*", 165 | "php": ">=7.4" 166 | }, 167 | "require-dev": { 168 | "ircmaxell/php-yacc": "^0.0.7", 169 | "phpunit/phpunit": "^9.0" 170 | }, 171 | "bin": [ 172 | "bin/php-parse" 173 | ], 174 | "type": "library", 175 | "extra": { 176 | "branch-alias": { 177 | "dev-master": "5.0-dev" 178 | } 179 | }, 180 | "autoload": { 181 | "psr-4": { 182 | "PhpParser\\": "lib/PhpParser" 183 | } 184 | }, 185 | "notification-url": "https://packagist.org/downloads/", 186 | "license": [ 187 | "BSD-3-Clause" 188 | ], 189 | "authors": [ 190 | { 191 | "name": "Nikita Popov" 192 | } 193 | ], 194 | "description": "A PHP parser written in PHP", 195 | "keywords": [ 196 | "parser", 197 | "php" 198 | ], 199 | "support": { 200 | "issues": "https://github.com/nikic/PHP-Parser/issues", 201 | "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" 202 | }, 203 | "time": "2024-07-01T20:03:41+00:00" 204 | }, 205 | { 206 | "name": "phar-io/manifest", 207 | "version": "2.0.4", 208 | "source": { 209 | "type": "git", 210 | "url": "https://github.com/phar-io/manifest.git", 211 | "reference": "54750ef60c58e43759730615a392c31c80e23176" 212 | }, 213 | "dist": { 214 | "type": "zip", 215 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 216 | "reference": "54750ef60c58e43759730615a392c31c80e23176", 217 | "shasum": "" 218 | }, 219 | "require": { 220 | "ext-dom": "*", 221 | "ext-libxml": "*", 222 | "ext-phar": "*", 223 | "ext-xmlwriter": "*", 224 | "phar-io/version": "^3.0.1", 225 | "php": "^7.2 || ^8.0" 226 | }, 227 | "type": "library", 228 | "extra": { 229 | "branch-alias": { 230 | "dev-master": "2.0.x-dev" 231 | } 232 | }, 233 | "autoload": { 234 | "classmap": [ 235 | "src/" 236 | ] 237 | }, 238 | "notification-url": "https://packagist.org/downloads/", 239 | "license": [ 240 | "BSD-3-Clause" 241 | ], 242 | "authors": [ 243 | { 244 | "name": "Arne Blankerts", 245 | "email": "arne@blankerts.de", 246 | "role": "Developer" 247 | }, 248 | { 249 | "name": "Sebastian Heuer", 250 | "email": "sebastian@phpeople.de", 251 | "role": "Developer" 252 | }, 253 | { 254 | "name": "Sebastian Bergmann", 255 | "email": "sebastian@phpunit.de", 256 | "role": "Developer" 257 | } 258 | ], 259 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 260 | "support": { 261 | "issues": "https://github.com/phar-io/manifest/issues", 262 | "source": "https://github.com/phar-io/manifest/tree/2.0.4" 263 | }, 264 | "funding": [ 265 | { 266 | "url": "https://github.com/theseer", 267 | "type": "github" 268 | } 269 | ], 270 | "time": "2024-03-03T12:33:53+00:00" 271 | }, 272 | { 273 | "name": "phar-io/version", 274 | "version": "3.2.1", 275 | "source": { 276 | "type": "git", 277 | "url": "https://github.com/phar-io/version.git", 278 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 279 | }, 280 | "dist": { 281 | "type": "zip", 282 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 283 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 284 | "shasum": "" 285 | }, 286 | "require": { 287 | "php": "^7.2 || ^8.0" 288 | }, 289 | "type": "library", 290 | "autoload": { 291 | "classmap": [ 292 | "src/" 293 | ] 294 | }, 295 | "notification-url": "https://packagist.org/downloads/", 296 | "license": [ 297 | "BSD-3-Clause" 298 | ], 299 | "authors": [ 300 | { 301 | "name": "Arne Blankerts", 302 | "email": "arne@blankerts.de", 303 | "role": "Developer" 304 | }, 305 | { 306 | "name": "Sebastian Heuer", 307 | "email": "sebastian@phpeople.de", 308 | "role": "Developer" 309 | }, 310 | { 311 | "name": "Sebastian Bergmann", 312 | "email": "sebastian@phpunit.de", 313 | "role": "Developer" 314 | } 315 | ], 316 | "description": "Library for handling version information and constraints", 317 | "support": { 318 | "issues": "https://github.com/phar-io/version/issues", 319 | "source": "https://github.com/phar-io/version/tree/3.2.1" 320 | }, 321 | "time": "2022-02-21T01:04:05+00:00" 322 | }, 323 | { 324 | "name": "phpstan/phpstan", 325 | "version": "1.12.0", 326 | "source": { 327 | "type": "git", 328 | "url": "https://github.com/phpstan/phpstan.git", 329 | "reference": "384af967d35b2162f69526c7276acadce534d0e1" 330 | }, 331 | "dist": { 332 | "type": "zip", 333 | "url": "https://api.github.com/repos/phpstan/phpstan/zipball/384af967d35b2162f69526c7276acadce534d0e1", 334 | "reference": "384af967d35b2162f69526c7276acadce534d0e1", 335 | "shasum": "" 336 | }, 337 | "require": { 338 | "php": "^7.2|^8.0" 339 | }, 340 | "conflict": { 341 | "phpstan/phpstan-shim": "*" 342 | }, 343 | "bin": [ 344 | "phpstan", 345 | "phpstan.phar" 346 | ], 347 | "type": "library", 348 | "autoload": { 349 | "files": [ 350 | "bootstrap.php" 351 | ] 352 | }, 353 | "notification-url": "https://packagist.org/downloads/", 354 | "license": [ 355 | "MIT" 356 | ], 357 | "description": "PHPStan - PHP Static Analysis Tool", 358 | "keywords": [ 359 | "dev", 360 | "static analysis" 361 | ], 362 | "support": { 363 | "docs": "https://phpstan.org/user-guide/getting-started", 364 | "forum": "https://github.com/phpstan/phpstan/discussions", 365 | "issues": "https://github.com/phpstan/phpstan/issues", 366 | "security": "https://github.com/phpstan/phpstan/security/policy", 367 | "source": "https://github.com/phpstan/phpstan-src" 368 | }, 369 | "funding": [ 370 | { 371 | "url": "https://github.com/ondrejmirtes", 372 | "type": "github" 373 | }, 374 | { 375 | "url": "https://github.com/phpstan", 376 | "type": "github" 377 | } 378 | ], 379 | "time": "2024-08-27T09:18:05+00:00" 380 | }, 381 | { 382 | "name": "phpunit/php-code-coverage", 383 | "version": "10.1.16", 384 | "source": { 385 | "type": "git", 386 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 387 | "reference": "7e308268858ed6baedc8704a304727d20bc07c77" 388 | }, 389 | "dist": { 390 | "type": "zip", 391 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", 392 | "reference": "7e308268858ed6baedc8704a304727d20bc07c77", 393 | "shasum": "" 394 | }, 395 | "require": { 396 | "ext-dom": "*", 397 | "ext-libxml": "*", 398 | "ext-xmlwriter": "*", 399 | "nikic/php-parser": "^4.19.1 || ^5.1.0", 400 | "php": ">=8.1", 401 | "phpunit/php-file-iterator": "^4.1.0", 402 | "phpunit/php-text-template": "^3.0.1", 403 | "sebastian/code-unit-reverse-lookup": "^3.0.0", 404 | "sebastian/complexity": "^3.2.0", 405 | "sebastian/environment": "^6.1.0", 406 | "sebastian/lines-of-code": "^2.0.2", 407 | "sebastian/version": "^4.0.1", 408 | "theseer/tokenizer": "^1.2.3" 409 | }, 410 | "require-dev": { 411 | "phpunit/phpunit": "^10.1" 412 | }, 413 | "suggest": { 414 | "ext-pcov": "PHP extension that provides line coverage", 415 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 416 | }, 417 | "type": "library", 418 | "extra": { 419 | "branch-alias": { 420 | "dev-main": "10.1.x-dev" 421 | } 422 | }, 423 | "autoload": { 424 | "classmap": [ 425 | "src/" 426 | ] 427 | }, 428 | "notification-url": "https://packagist.org/downloads/", 429 | "license": [ 430 | "BSD-3-Clause" 431 | ], 432 | "authors": [ 433 | { 434 | "name": "Sebastian Bergmann", 435 | "email": "sebastian@phpunit.de", 436 | "role": "lead" 437 | } 438 | ], 439 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 440 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 441 | "keywords": [ 442 | "coverage", 443 | "testing", 444 | "xunit" 445 | ], 446 | "support": { 447 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 448 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 449 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" 450 | }, 451 | "funding": [ 452 | { 453 | "url": "https://github.com/sebastianbergmann", 454 | "type": "github" 455 | } 456 | ], 457 | "time": "2024-08-22T04:31:57+00:00" 458 | }, 459 | { 460 | "name": "phpunit/php-file-iterator", 461 | "version": "4.1.0", 462 | "source": { 463 | "type": "git", 464 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 465 | "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" 466 | }, 467 | "dist": { 468 | "type": "zip", 469 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", 470 | "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", 471 | "shasum": "" 472 | }, 473 | "require": { 474 | "php": ">=8.1" 475 | }, 476 | "require-dev": { 477 | "phpunit/phpunit": "^10.0" 478 | }, 479 | "type": "library", 480 | "extra": { 481 | "branch-alias": { 482 | "dev-main": "4.0-dev" 483 | } 484 | }, 485 | "autoload": { 486 | "classmap": [ 487 | "src/" 488 | ] 489 | }, 490 | "notification-url": "https://packagist.org/downloads/", 491 | "license": [ 492 | "BSD-3-Clause" 493 | ], 494 | "authors": [ 495 | { 496 | "name": "Sebastian Bergmann", 497 | "email": "sebastian@phpunit.de", 498 | "role": "lead" 499 | } 500 | ], 501 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 502 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 503 | "keywords": [ 504 | "filesystem", 505 | "iterator" 506 | ], 507 | "support": { 508 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 509 | "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", 510 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" 511 | }, 512 | "funding": [ 513 | { 514 | "url": "https://github.com/sebastianbergmann", 515 | "type": "github" 516 | } 517 | ], 518 | "time": "2023-08-31T06:24:48+00:00" 519 | }, 520 | { 521 | "name": "phpunit/php-invoker", 522 | "version": "4.0.0", 523 | "source": { 524 | "type": "git", 525 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 526 | "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" 527 | }, 528 | "dist": { 529 | "type": "zip", 530 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", 531 | "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", 532 | "shasum": "" 533 | }, 534 | "require": { 535 | "php": ">=8.1" 536 | }, 537 | "require-dev": { 538 | "ext-pcntl": "*", 539 | "phpunit/phpunit": "^10.0" 540 | }, 541 | "suggest": { 542 | "ext-pcntl": "*" 543 | }, 544 | "type": "library", 545 | "extra": { 546 | "branch-alias": { 547 | "dev-main": "4.0-dev" 548 | } 549 | }, 550 | "autoload": { 551 | "classmap": [ 552 | "src/" 553 | ] 554 | }, 555 | "notification-url": "https://packagist.org/downloads/", 556 | "license": [ 557 | "BSD-3-Clause" 558 | ], 559 | "authors": [ 560 | { 561 | "name": "Sebastian Bergmann", 562 | "email": "sebastian@phpunit.de", 563 | "role": "lead" 564 | } 565 | ], 566 | "description": "Invoke callables with a timeout", 567 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 568 | "keywords": [ 569 | "process" 570 | ], 571 | "support": { 572 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 573 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" 574 | }, 575 | "funding": [ 576 | { 577 | "url": "https://github.com/sebastianbergmann", 578 | "type": "github" 579 | } 580 | ], 581 | "time": "2023-02-03T06:56:09+00:00" 582 | }, 583 | { 584 | "name": "phpunit/php-text-template", 585 | "version": "3.0.1", 586 | "source": { 587 | "type": "git", 588 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 589 | "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" 590 | }, 591 | "dist": { 592 | "type": "zip", 593 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", 594 | "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", 595 | "shasum": "" 596 | }, 597 | "require": { 598 | "php": ">=8.1" 599 | }, 600 | "require-dev": { 601 | "phpunit/phpunit": "^10.0" 602 | }, 603 | "type": "library", 604 | "extra": { 605 | "branch-alias": { 606 | "dev-main": "3.0-dev" 607 | } 608 | }, 609 | "autoload": { 610 | "classmap": [ 611 | "src/" 612 | ] 613 | }, 614 | "notification-url": "https://packagist.org/downloads/", 615 | "license": [ 616 | "BSD-3-Clause" 617 | ], 618 | "authors": [ 619 | { 620 | "name": "Sebastian Bergmann", 621 | "email": "sebastian@phpunit.de", 622 | "role": "lead" 623 | } 624 | ], 625 | "description": "Simple template engine.", 626 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 627 | "keywords": [ 628 | "template" 629 | ], 630 | "support": { 631 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 632 | "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", 633 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" 634 | }, 635 | "funding": [ 636 | { 637 | "url": "https://github.com/sebastianbergmann", 638 | "type": "github" 639 | } 640 | ], 641 | "time": "2023-08-31T14:07:24+00:00" 642 | }, 643 | { 644 | "name": "phpunit/php-timer", 645 | "version": "6.0.0", 646 | "source": { 647 | "type": "git", 648 | "url": "https://github.com/sebastianbergmann/php-timer.git", 649 | "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" 650 | }, 651 | "dist": { 652 | "type": "zip", 653 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", 654 | "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", 655 | "shasum": "" 656 | }, 657 | "require": { 658 | "php": ">=8.1" 659 | }, 660 | "require-dev": { 661 | "phpunit/phpunit": "^10.0" 662 | }, 663 | "type": "library", 664 | "extra": { 665 | "branch-alias": { 666 | "dev-main": "6.0-dev" 667 | } 668 | }, 669 | "autoload": { 670 | "classmap": [ 671 | "src/" 672 | ] 673 | }, 674 | "notification-url": "https://packagist.org/downloads/", 675 | "license": [ 676 | "BSD-3-Clause" 677 | ], 678 | "authors": [ 679 | { 680 | "name": "Sebastian Bergmann", 681 | "email": "sebastian@phpunit.de", 682 | "role": "lead" 683 | } 684 | ], 685 | "description": "Utility class for timing", 686 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 687 | "keywords": [ 688 | "timer" 689 | ], 690 | "support": { 691 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 692 | "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" 693 | }, 694 | "funding": [ 695 | { 696 | "url": "https://github.com/sebastianbergmann", 697 | "type": "github" 698 | } 699 | ], 700 | "time": "2023-02-03T06:57:52+00:00" 701 | }, 702 | { 703 | "name": "phpunit/phpunit", 704 | "version": "10.5.30", 705 | "source": { 706 | "type": "git", 707 | "url": "https://github.com/sebastianbergmann/phpunit.git", 708 | "reference": "b15524febac0153876b4ba9aab3326c2ee94c897" 709 | }, 710 | "dist": { 711 | "type": "zip", 712 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b15524febac0153876b4ba9aab3326c2ee94c897", 713 | "reference": "b15524febac0153876b4ba9aab3326c2ee94c897", 714 | "shasum": "" 715 | }, 716 | "require": { 717 | "ext-dom": "*", 718 | "ext-json": "*", 719 | "ext-libxml": "*", 720 | "ext-mbstring": "*", 721 | "ext-xml": "*", 722 | "ext-xmlwriter": "*", 723 | "myclabs/deep-copy": "^1.12.0", 724 | "phar-io/manifest": "^2.0.4", 725 | "phar-io/version": "^3.2.1", 726 | "php": ">=8.1", 727 | "phpunit/php-code-coverage": "^10.1.15", 728 | "phpunit/php-file-iterator": "^4.1.0", 729 | "phpunit/php-invoker": "^4.0.0", 730 | "phpunit/php-text-template": "^3.0.1", 731 | "phpunit/php-timer": "^6.0.0", 732 | "sebastian/cli-parser": "^2.0.1", 733 | "sebastian/code-unit": "^2.0.0", 734 | "sebastian/comparator": "^5.0.2", 735 | "sebastian/diff": "^5.1.1", 736 | "sebastian/environment": "^6.1.0", 737 | "sebastian/exporter": "^5.1.2", 738 | "sebastian/global-state": "^6.0.2", 739 | "sebastian/object-enumerator": "^5.0.0", 740 | "sebastian/recursion-context": "^5.0.0", 741 | "sebastian/type": "^4.0.0", 742 | "sebastian/version": "^4.0.1" 743 | }, 744 | "suggest": { 745 | "ext-soap": "To be able to generate mocks based on WSDL files" 746 | }, 747 | "bin": [ 748 | "phpunit" 749 | ], 750 | "type": "library", 751 | "extra": { 752 | "branch-alias": { 753 | "dev-main": "10.5-dev" 754 | } 755 | }, 756 | "autoload": { 757 | "files": [ 758 | "src/Framework/Assert/Functions.php" 759 | ], 760 | "classmap": [ 761 | "src/" 762 | ] 763 | }, 764 | "notification-url": "https://packagist.org/downloads/", 765 | "license": [ 766 | "BSD-3-Clause" 767 | ], 768 | "authors": [ 769 | { 770 | "name": "Sebastian Bergmann", 771 | "email": "sebastian@phpunit.de", 772 | "role": "lead" 773 | } 774 | ], 775 | "description": "The PHP Unit Testing framework.", 776 | "homepage": "https://phpunit.de/", 777 | "keywords": [ 778 | "phpunit", 779 | "testing", 780 | "xunit" 781 | ], 782 | "support": { 783 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 784 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 785 | "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.30" 786 | }, 787 | "funding": [ 788 | { 789 | "url": "https://phpunit.de/sponsors.html", 790 | "type": "custom" 791 | }, 792 | { 793 | "url": "https://github.com/sebastianbergmann", 794 | "type": "github" 795 | }, 796 | { 797 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 798 | "type": "tidelift" 799 | } 800 | ], 801 | "time": "2024-08-13T06:09:37+00:00" 802 | }, 803 | { 804 | "name": "sebastian/cli-parser", 805 | "version": "2.0.1", 806 | "source": { 807 | "type": "git", 808 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 809 | "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" 810 | }, 811 | "dist": { 812 | "type": "zip", 813 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", 814 | "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", 815 | "shasum": "" 816 | }, 817 | "require": { 818 | "php": ">=8.1" 819 | }, 820 | "require-dev": { 821 | "phpunit/phpunit": "^10.0" 822 | }, 823 | "type": "library", 824 | "extra": { 825 | "branch-alias": { 826 | "dev-main": "2.0-dev" 827 | } 828 | }, 829 | "autoload": { 830 | "classmap": [ 831 | "src/" 832 | ] 833 | }, 834 | "notification-url": "https://packagist.org/downloads/", 835 | "license": [ 836 | "BSD-3-Clause" 837 | ], 838 | "authors": [ 839 | { 840 | "name": "Sebastian Bergmann", 841 | "email": "sebastian@phpunit.de", 842 | "role": "lead" 843 | } 844 | ], 845 | "description": "Library for parsing CLI options", 846 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 847 | "support": { 848 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 849 | "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", 850 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" 851 | }, 852 | "funding": [ 853 | { 854 | "url": "https://github.com/sebastianbergmann", 855 | "type": "github" 856 | } 857 | ], 858 | "time": "2024-03-02T07:12:49+00:00" 859 | }, 860 | { 861 | "name": "sebastian/code-unit", 862 | "version": "2.0.0", 863 | "source": { 864 | "type": "git", 865 | "url": "https://github.com/sebastianbergmann/code-unit.git", 866 | "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" 867 | }, 868 | "dist": { 869 | "type": "zip", 870 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", 871 | "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", 872 | "shasum": "" 873 | }, 874 | "require": { 875 | "php": ">=8.1" 876 | }, 877 | "require-dev": { 878 | "phpunit/phpunit": "^10.0" 879 | }, 880 | "type": "library", 881 | "extra": { 882 | "branch-alias": { 883 | "dev-main": "2.0-dev" 884 | } 885 | }, 886 | "autoload": { 887 | "classmap": [ 888 | "src/" 889 | ] 890 | }, 891 | "notification-url": "https://packagist.org/downloads/", 892 | "license": [ 893 | "BSD-3-Clause" 894 | ], 895 | "authors": [ 896 | { 897 | "name": "Sebastian Bergmann", 898 | "email": "sebastian@phpunit.de", 899 | "role": "lead" 900 | } 901 | ], 902 | "description": "Collection of value objects that represent the PHP code units", 903 | "homepage": "https://github.com/sebastianbergmann/code-unit", 904 | "support": { 905 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 906 | "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" 907 | }, 908 | "funding": [ 909 | { 910 | "url": "https://github.com/sebastianbergmann", 911 | "type": "github" 912 | } 913 | ], 914 | "time": "2023-02-03T06:58:43+00:00" 915 | }, 916 | { 917 | "name": "sebastian/code-unit-reverse-lookup", 918 | "version": "3.0.0", 919 | "source": { 920 | "type": "git", 921 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 922 | "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" 923 | }, 924 | "dist": { 925 | "type": "zip", 926 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", 927 | "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", 928 | "shasum": "" 929 | }, 930 | "require": { 931 | "php": ">=8.1" 932 | }, 933 | "require-dev": { 934 | "phpunit/phpunit": "^10.0" 935 | }, 936 | "type": "library", 937 | "extra": { 938 | "branch-alias": { 939 | "dev-main": "3.0-dev" 940 | } 941 | }, 942 | "autoload": { 943 | "classmap": [ 944 | "src/" 945 | ] 946 | }, 947 | "notification-url": "https://packagist.org/downloads/", 948 | "license": [ 949 | "BSD-3-Clause" 950 | ], 951 | "authors": [ 952 | { 953 | "name": "Sebastian Bergmann", 954 | "email": "sebastian@phpunit.de" 955 | } 956 | ], 957 | "description": "Looks up which function or method a line of code belongs to", 958 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 959 | "support": { 960 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 961 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" 962 | }, 963 | "funding": [ 964 | { 965 | "url": "https://github.com/sebastianbergmann", 966 | "type": "github" 967 | } 968 | ], 969 | "time": "2023-02-03T06:59:15+00:00" 970 | }, 971 | { 972 | "name": "sebastian/comparator", 973 | "version": "5.0.2", 974 | "source": { 975 | "type": "git", 976 | "url": "https://github.com/sebastianbergmann/comparator.git", 977 | "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53" 978 | }, 979 | "dist": { 980 | "type": "zip", 981 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", 982 | "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", 983 | "shasum": "" 984 | }, 985 | "require": { 986 | "ext-dom": "*", 987 | "ext-mbstring": "*", 988 | "php": ">=8.1", 989 | "sebastian/diff": "^5.0", 990 | "sebastian/exporter": "^5.0" 991 | }, 992 | "require-dev": { 993 | "phpunit/phpunit": "^10.4" 994 | }, 995 | "type": "library", 996 | "extra": { 997 | "branch-alias": { 998 | "dev-main": "5.0-dev" 999 | } 1000 | }, 1001 | "autoload": { 1002 | "classmap": [ 1003 | "src/" 1004 | ] 1005 | }, 1006 | "notification-url": "https://packagist.org/downloads/", 1007 | "license": [ 1008 | "BSD-3-Clause" 1009 | ], 1010 | "authors": [ 1011 | { 1012 | "name": "Sebastian Bergmann", 1013 | "email": "sebastian@phpunit.de" 1014 | }, 1015 | { 1016 | "name": "Jeff Welch", 1017 | "email": "whatthejeff@gmail.com" 1018 | }, 1019 | { 1020 | "name": "Volker Dusch", 1021 | "email": "github@wallbash.com" 1022 | }, 1023 | { 1024 | "name": "Bernhard Schussek", 1025 | "email": "bschussek@2bepublished.at" 1026 | } 1027 | ], 1028 | "description": "Provides the functionality to compare PHP values for equality", 1029 | "homepage": "https://github.com/sebastianbergmann/comparator", 1030 | "keywords": [ 1031 | "comparator", 1032 | "compare", 1033 | "equality" 1034 | ], 1035 | "support": { 1036 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1037 | "security": "https://github.com/sebastianbergmann/comparator/security/policy", 1038 | "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.2" 1039 | }, 1040 | "funding": [ 1041 | { 1042 | "url": "https://github.com/sebastianbergmann", 1043 | "type": "github" 1044 | } 1045 | ], 1046 | "time": "2024-08-12T06:03:08+00:00" 1047 | }, 1048 | { 1049 | "name": "sebastian/complexity", 1050 | "version": "3.2.0", 1051 | "source": { 1052 | "type": "git", 1053 | "url": "https://github.com/sebastianbergmann/complexity.git", 1054 | "reference": "68ff824baeae169ec9f2137158ee529584553799" 1055 | }, 1056 | "dist": { 1057 | "type": "zip", 1058 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", 1059 | "reference": "68ff824baeae169ec9f2137158ee529584553799", 1060 | "shasum": "" 1061 | }, 1062 | "require": { 1063 | "nikic/php-parser": "^4.18 || ^5.0", 1064 | "php": ">=8.1" 1065 | }, 1066 | "require-dev": { 1067 | "phpunit/phpunit": "^10.0" 1068 | }, 1069 | "type": "library", 1070 | "extra": { 1071 | "branch-alias": { 1072 | "dev-main": "3.2-dev" 1073 | } 1074 | }, 1075 | "autoload": { 1076 | "classmap": [ 1077 | "src/" 1078 | ] 1079 | }, 1080 | "notification-url": "https://packagist.org/downloads/", 1081 | "license": [ 1082 | "BSD-3-Clause" 1083 | ], 1084 | "authors": [ 1085 | { 1086 | "name": "Sebastian Bergmann", 1087 | "email": "sebastian@phpunit.de", 1088 | "role": "lead" 1089 | } 1090 | ], 1091 | "description": "Library for calculating the complexity of PHP code units", 1092 | "homepage": "https://github.com/sebastianbergmann/complexity", 1093 | "support": { 1094 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1095 | "security": "https://github.com/sebastianbergmann/complexity/security/policy", 1096 | "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" 1097 | }, 1098 | "funding": [ 1099 | { 1100 | "url": "https://github.com/sebastianbergmann", 1101 | "type": "github" 1102 | } 1103 | ], 1104 | "time": "2023-12-21T08:37:17+00:00" 1105 | }, 1106 | { 1107 | "name": "sebastian/diff", 1108 | "version": "5.1.1", 1109 | "source": { 1110 | "type": "git", 1111 | "url": "https://github.com/sebastianbergmann/diff.git", 1112 | "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" 1113 | }, 1114 | "dist": { 1115 | "type": "zip", 1116 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", 1117 | "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", 1118 | "shasum": "" 1119 | }, 1120 | "require": { 1121 | "php": ">=8.1" 1122 | }, 1123 | "require-dev": { 1124 | "phpunit/phpunit": "^10.0", 1125 | "symfony/process": "^6.4" 1126 | }, 1127 | "type": "library", 1128 | "extra": { 1129 | "branch-alias": { 1130 | "dev-main": "5.1-dev" 1131 | } 1132 | }, 1133 | "autoload": { 1134 | "classmap": [ 1135 | "src/" 1136 | ] 1137 | }, 1138 | "notification-url": "https://packagist.org/downloads/", 1139 | "license": [ 1140 | "BSD-3-Clause" 1141 | ], 1142 | "authors": [ 1143 | { 1144 | "name": "Sebastian Bergmann", 1145 | "email": "sebastian@phpunit.de" 1146 | }, 1147 | { 1148 | "name": "Kore Nordmann", 1149 | "email": "mail@kore-nordmann.de" 1150 | } 1151 | ], 1152 | "description": "Diff implementation", 1153 | "homepage": "https://github.com/sebastianbergmann/diff", 1154 | "keywords": [ 1155 | "diff", 1156 | "udiff", 1157 | "unidiff", 1158 | "unified diff" 1159 | ], 1160 | "support": { 1161 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1162 | "security": "https://github.com/sebastianbergmann/diff/security/policy", 1163 | "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" 1164 | }, 1165 | "funding": [ 1166 | { 1167 | "url": "https://github.com/sebastianbergmann", 1168 | "type": "github" 1169 | } 1170 | ], 1171 | "time": "2024-03-02T07:15:17+00:00" 1172 | }, 1173 | { 1174 | "name": "sebastian/environment", 1175 | "version": "6.1.0", 1176 | "source": { 1177 | "type": "git", 1178 | "url": "https://github.com/sebastianbergmann/environment.git", 1179 | "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" 1180 | }, 1181 | "dist": { 1182 | "type": "zip", 1183 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", 1184 | "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", 1185 | "shasum": "" 1186 | }, 1187 | "require": { 1188 | "php": ">=8.1" 1189 | }, 1190 | "require-dev": { 1191 | "phpunit/phpunit": "^10.0" 1192 | }, 1193 | "suggest": { 1194 | "ext-posix": "*" 1195 | }, 1196 | "type": "library", 1197 | "extra": { 1198 | "branch-alias": { 1199 | "dev-main": "6.1-dev" 1200 | } 1201 | }, 1202 | "autoload": { 1203 | "classmap": [ 1204 | "src/" 1205 | ] 1206 | }, 1207 | "notification-url": "https://packagist.org/downloads/", 1208 | "license": [ 1209 | "BSD-3-Clause" 1210 | ], 1211 | "authors": [ 1212 | { 1213 | "name": "Sebastian Bergmann", 1214 | "email": "sebastian@phpunit.de" 1215 | } 1216 | ], 1217 | "description": "Provides functionality to handle HHVM/PHP environments", 1218 | "homepage": "https://github.com/sebastianbergmann/environment", 1219 | "keywords": [ 1220 | "Xdebug", 1221 | "environment", 1222 | "hhvm" 1223 | ], 1224 | "support": { 1225 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1226 | "security": "https://github.com/sebastianbergmann/environment/security/policy", 1227 | "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" 1228 | }, 1229 | "funding": [ 1230 | { 1231 | "url": "https://github.com/sebastianbergmann", 1232 | "type": "github" 1233 | } 1234 | ], 1235 | "time": "2024-03-23T08:47:14+00:00" 1236 | }, 1237 | { 1238 | "name": "sebastian/exporter", 1239 | "version": "5.1.2", 1240 | "source": { 1241 | "type": "git", 1242 | "url": "https://github.com/sebastianbergmann/exporter.git", 1243 | "reference": "955288482d97c19a372d3f31006ab3f37da47adf" 1244 | }, 1245 | "dist": { 1246 | "type": "zip", 1247 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", 1248 | "reference": "955288482d97c19a372d3f31006ab3f37da47adf", 1249 | "shasum": "" 1250 | }, 1251 | "require": { 1252 | "ext-mbstring": "*", 1253 | "php": ">=8.1", 1254 | "sebastian/recursion-context": "^5.0" 1255 | }, 1256 | "require-dev": { 1257 | "phpunit/phpunit": "^10.0" 1258 | }, 1259 | "type": "library", 1260 | "extra": { 1261 | "branch-alias": { 1262 | "dev-main": "5.1-dev" 1263 | } 1264 | }, 1265 | "autoload": { 1266 | "classmap": [ 1267 | "src/" 1268 | ] 1269 | }, 1270 | "notification-url": "https://packagist.org/downloads/", 1271 | "license": [ 1272 | "BSD-3-Clause" 1273 | ], 1274 | "authors": [ 1275 | { 1276 | "name": "Sebastian Bergmann", 1277 | "email": "sebastian@phpunit.de" 1278 | }, 1279 | { 1280 | "name": "Jeff Welch", 1281 | "email": "whatthejeff@gmail.com" 1282 | }, 1283 | { 1284 | "name": "Volker Dusch", 1285 | "email": "github@wallbash.com" 1286 | }, 1287 | { 1288 | "name": "Adam Harvey", 1289 | "email": "aharvey@php.net" 1290 | }, 1291 | { 1292 | "name": "Bernhard Schussek", 1293 | "email": "bschussek@gmail.com" 1294 | } 1295 | ], 1296 | "description": "Provides the functionality to export PHP variables for visualization", 1297 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1298 | "keywords": [ 1299 | "export", 1300 | "exporter" 1301 | ], 1302 | "support": { 1303 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1304 | "security": "https://github.com/sebastianbergmann/exporter/security/policy", 1305 | "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" 1306 | }, 1307 | "funding": [ 1308 | { 1309 | "url": "https://github.com/sebastianbergmann", 1310 | "type": "github" 1311 | } 1312 | ], 1313 | "time": "2024-03-02T07:17:12+00:00" 1314 | }, 1315 | { 1316 | "name": "sebastian/global-state", 1317 | "version": "6.0.2", 1318 | "source": { 1319 | "type": "git", 1320 | "url": "https://github.com/sebastianbergmann/global-state.git", 1321 | "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" 1322 | }, 1323 | "dist": { 1324 | "type": "zip", 1325 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", 1326 | "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", 1327 | "shasum": "" 1328 | }, 1329 | "require": { 1330 | "php": ">=8.1", 1331 | "sebastian/object-reflector": "^3.0", 1332 | "sebastian/recursion-context": "^5.0" 1333 | }, 1334 | "require-dev": { 1335 | "ext-dom": "*", 1336 | "phpunit/phpunit": "^10.0" 1337 | }, 1338 | "type": "library", 1339 | "extra": { 1340 | "branch-alias": { 1341 | "dev-main": "6.0-dev" 1342 | } 1343 | }, 1344 | "autoload": { 1345 | "classmap": [ 1346 | "src/" 1347 | ] 1348 | }, 1349 | "notification-url": "https://packagist.org/downloads/", 1350 | "license": [ 1351 | "BSD-3-Clause" 1352 | ], 1353 | "authors": [ 1354 | { 1355 | "name": "Sebastian Bergmann", 1356 | "email": "sebastian@phpunit.de" 1357 | } 1358 | ], 1359 | "description": "Snapshotting of global state", 1360 | "homepage": "https://www.github.com/sebastianbergmann/global-state", 1361 | "keywords": [ 1362 | "global state" 1363 | ], 1364 | "support": { 1365 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1366 | "security": "https://github.com/sebastianbergmann/global-state/security/policy", 1367 | "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" 1368 | }, 1369 | "funding": [ 1370 | { 1371 | "url": "https://github.com/sebastianbergmann", 1372 | "type": "github" 1373 | } 1374 | ], 1375 | "time": "2024-03-02T07:19:19+00:00" 1376 | }, 1377 | { 1378 | "name": "sebastian/lines-of-code", 1379 | "version": "2.0.2", 1380 | "source": { 1381 | "type": "git", 1382 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1383 | "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" 1384 | }, 1385 | "dist": { 1386 | "type": "zip", 1387 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", 1388 | "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", 1389 | "shasum": "" 1390 | }, 1391 | "require": { 1392 | "nikic/php-parser": "^4.18 || ^5.0", 1393 | "php": ">=8.1" 1394 | }, 1395 | "require-dev": { 1396 | "phpunit/phpunit": "^10.0" 1397 | }, 1398 | "type": "library", 1399 | "extra": { 1400 | "branch-alias": { 1401 | "dev-main": "2.0-dev" 1402 | } 1403 | }, 1404 | "autoload": { 1405 | "classmap": [ 1406 | "src/" 1407 | ] 1408 | }, 1409 | "notification-url": "https://packagist.org/downloads/", 1410 | "license": [ 1411 | "BSD-3-Clause" 1412 | ], 1413 | "authors": [ 1414 | { 1415 | "name": "Sebastian Bergmann", 1416 | "email": "sebastian@phpunit.de", 1417 | "role": "lead" 1418 | } 1419 | ], 1420 | "description": "Library for counting the lines of code in PHP source code", 1421 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1422 | "support": { 1423 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1424 | "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", 1425 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" 1426 | }, 1427 | "funding": [ 1428 | { 1429 | "url": "https://github.com/sebastianbergmann", 1430 | "type": "github" 1431 | } 1432 | ], 1433 | "time": "2023-12-21T08:38:20+00:00" 1434 | }, 1435 | { 1436 | "name": "sebastian/object-enumerator", 1437 | "version": "5.0.0", 1438 | "source": { 1439 | "type": "git", 1440 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1441 | "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" 1442 | }, 1443 | "dist": { 1444 | "type": "zip", 1445 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", 1446 | "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", 1447 | "shasum": "" 1448 | }, 1449 | "require": { 1450 | "php": ">=8.1", 1451 | "sebastian/object-reflector": "^3.0", 1452 | "sebastian/recursion-context": "^5.0" 1453 | }, 1454 | "require-dev": { 1455 | "phpunit/phpunit": "^10.0" 1456 | }, 1457 | "type": "library", 1458 | "extra": { 1459 | "branch-alias": { 1460 | "dev-main": "5.0-dev" 1461 | } 1462 | }, 1463 | "autoload": { 1464 | "classmap": [ 1465 | "src/" 1466 | ] 1467 | }, 1468 | "notification-url": "https://packagist.org/downloads/", 1469 | "license": [ 1470 | "BSD-3-Clause" 1471 | ], 1472 | "authors": [ 1473 | { 1474 | "name": "Sebastian Bergmann", 1475 | "email": "sebastian@phpunit.de" 1476 | } 1477 | ], 1478 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1479 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1480 | "support": { 1481 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1482 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" 1483 | }, 1484 | "funding": [ 1485 | { 1486 | "url": "https://github.com/sebastianbergmann", 1487 | "type": "github" 1488 | } 1489 | ], 1490 | "time": "2023-02-03T07:08:32+00:00" 1491 | }, 1492 | { 1493 | "name": "sebastian/object-reflector", 1494 | "version": "3.0.0", 1495 | "source": { 1496 | "type": "git", 1497 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1498 | "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" 1499 | }, 1500 | "dist": { 1501 | "type": "zip", 1502 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", 1503 | "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", 1504 | "shasum": "" 1505 | }, 1506 | "require": { 1507 | "php": ">=8.1" 1508 | }, 1509 | "require-dev": { 1510 | "phpunit/phpunit": "^10.0" 1511 | }, 1512 | "type": "library", 1513 | "extra": { 1514 | "branch-alias": { 1515 | "dev-main": "3.0-dev" 1516 | } 1517 | }, 1518 | "autoload": { 1519 | "classmap": [ 1520 | "src/" 1521 | ] 1522 | }, 1523 | "notification-url": "https://packagist.org/downloads/", 1524 | "license": [ 1525 | "BSD-3-Clause" 1526 | ], 1527 | "authors": [ 1528 | { 1529 | "name": "Sebastian Bergmann", 1530 | "email": "sebastian@phpunit.de" 1531 | } 1532 | ], 1533 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1534 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1535 | "support": { 1536 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1537 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" 1538 | }, 1539 | "funding": [ 1540 | { 1541 | "url": "https://github.com/sebastianbergmann", 1542 | "type": "github" 1543 | } 1544 | ], 1545 | "time": "2023-02-03T07:06:18+00:00" 1546 | }, 1547 | { 1548 | "name": "sebastian/recursion-context", 1549 | "version": "5.0.0", 1550 | "source": { 1551 | "type": "git", 1552 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1553 | "reference": "05909fb5bc7df4c52992396d0116aed689f93712" 1554 | }, 1555 | "dist": { 1556 | "type": "zip", 1557 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", 1558 | "reference": "05909fb5bc7df4c52992396d0116aed689f93712", 1559 | "shasum": "" 1560 | }, 1561 | "require": { 1562 | "php": ">=8.1" 1563 | }, 1564 | "require-dev": { 1565 | "phpunit/phpunit": "^10.0" 1566 | }, 1567 | "type": "library", 1568 | "extra": { 1569 | "branch-alias": { 1570 | "dev-main": "5.0-dev" 1571 | } 1572 | }, 1573 | "autoload": { 1574 | "classmap": [ 1575 | "src/" 1576 | ] 1577 | }, 1578 | "notification-url": "https://packagist.org/downloads/", 1579 | "license": [ 1580 | "BSD-3-Clause" 1581 | ], 1582 | "authors": [ 1583 | { 1584 | "name": "Sebastian Bergmann", 1585 | "email": "sebastian@phpunit.de" 1586 | }, 1587 | { 1588 | "name": "Jeff Welch", 1589 | "email": "whatthejeff@gmail.com" 1590 | }, 1591 | { 1592 | "name": "Adam Harvey", 1593 | "email": "aharvey@php.net" 1594 | } 1595 | ], 1596 | "description": "Provides functionality to recursively process PHP variables", 1597 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 1598 | "support": { 1599 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 1600 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" 1601 | }, 1602 | "funding": [ 1603 | { 1604 | "url": "https://github.com/sebastianbergmann", 1605 | "type": "github" 1606 | } 1607 | ], 1608 | "time": "2023-02-03T07:05:40+00:00" 1609 | }, 1610 | { 1611 | "name": "sebastian/type", 1612 | "version": "4.0.0", 1613 | "source": { 1614 | "type": "git", 1615 | "url": "https://github.com/sebastianbergmann/type.git", 1616 | "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" 1617 | }, 1618 | "dist": { 1619 | "type": "zip", 1620 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", 1621 | "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", 1622 | "shasum": "" 1623 | }, 1624 | "require": { 1625 | "php": ">=8.1" 1626 | }, 1627 | "require-dev": { 1628 | "phpunit/phpunit": "^10.0" 1629 | }, 1630 | "type": "library", 1631 | "extra": { 1632 | "branch-alias": { 1633 | "dev-main": "4.0-dev" 1634 | } 1635 | }, 1636 | "autoload": { 1637 | "classmap": [ 1638 | "src/" 1639 | ] 1640 | }, 1641 | "notification-url": "https://packagist.org/downloads/", 1642 | "license": [ 1643 | "BSD-3-Clause" 1644 | ], 1645 | "authors": [ 1646 | { 1647 | "name": "Sebastian Bergmann", 1648 | "email": "sebastian@phpunit.de", 1649 | "role": "lead" 1650 | } 1651 | ], 1652 | "description": "Collection of value objects that represent the types of the PHP type system", 1653 | "homepage": "https://github.com/sebastianbergmann/type", 1654 | "support": { 1655 | "issues": "https://github.com/sebastianbergmann/type/issues", 1656 | "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" 1657 | }, 1658 | "funding": [ 1659 | { 1660 | "url": "https://github.com/sebastianbergmann", 1661 | "type": "github" 1662 | } 1663 | ], 1664 | "time": "2023-02-03T07:10:45+00:00" 1665 | }, 1666 | { 1667 | "name": "sebastian/version", 1668 | "version": "4.0.1", 1669 | "source": { 1670 | "type": "git", 1671 | "url": "https://github.com/sebastianbergmann/version.git", 1672 | "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" 1673 | }, 1674 | "dist": { 1675 | "type": "zip", 1676 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", 1677 | "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", 1678 | "shasum": "" 1679 | }, 1680 | "require": { 1681 | "php": ">=8.1" 1682 | }, 1683 | "type": "library", 1684 | "extra": { 1685 | "branch-alias": { 1686 | "dev-main": "4.0-dev" 1687 | } 1688 | }, 1689 | "autoload": { 1690 | "classmap": [ 1691 | "src/" 1692 | ] 1693 | }, 1694 | "notification-url": "https://packagist.org/downloads/", 1695 | "license": [ 1696 | "BSD-3-Clause" 1697 | ], 1698 | "authors": [ 1699 | { 1700 | "name": "Sebastian Bergmann", 1701 | "email": "sebastian@phpunit.de", 1702 | "role": "lead" 1703 | } 1704 | ], 1705 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1706 | "homepage": "https://github.com/sebastianbergmann/version", 1707 | "support": { 1708 | "issues": "https://github.com/sebastianbergmann/version/issues", 1709 | "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" 1710 | }, 1711 | "funding": [ 1712 | { 1713 | "url": "https://github.com/sebastianbergmann", 1714 | "type": "github" 1715 | } 1716 | ], 1717 | "time": "2023-02-07T11:34:05+00:00" 1718 | }, 1719 | { 1720 | "name": "theseer/tokenizer", 1721 | "version": "1.2.3", 1722 | "source": { 1723 | "type": "git", 1724 | "url": "https://github.com/theseer/tokenizer.git", 1725 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" 1726 | }, 1727 | "dist": { 1728 | "type": "zip", 1729 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 1730 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 1731 | "shasum": "" 1732 | }, 1733 | "require": { 1734 | "ext-dom": "*", 1735 | "ext-tokenizer": "*", 1736 | "ext-xmlwriter": "*", 1737 | "php": "^7.2 || ^8.0" 1738 | }, 1739 | "type": "library", 1740 | "autoload": { 1741 | "classmap": [ 1742 | "src/" 1743 | ] 1744 | }, 1745 | "notification-url": "https://packagist.org/downloads/", 1746 | "license": [ 1747 | "BSD-3-Clause" 1748 | ], 1749 | "authors": [ 1750 | { 1751 | "name": "Arne Blankerts", 1752 | "email": "arne@blankerts.de", 1753 | "role": "Developer" 1754 | } 1755 | ], 1756 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1757 | "support": { 1758 | "issues": "https://github.com/theseer/tokenizer/issues", 1759 | "source": "https://github.com/theseer/tokenizer/tree/1.2.3" 1760 | }, 1761 | "funding": [ 1762 | { 1763 | "url": "https://github.com/theseer", 1764 | "type": "github" 1765 | } 1766 | ], 1767 | "time": "2024-03-03T12:36:25+00:00" 1768 | } 1769 | ], 1770 | "aliases": [], 1771 | "minimum-stability": "stable", 1772 | "stability-flags": [], 1773 | "prefer-stable": false, 1774 | "prefer-lowest": false, 1775 | "platform": { 1776 | "ext-curl": "*" 1777 | }, 1778 | "platform-dev": [], 1779 | "plugin-api-version": "2.6.0" 1780 | } 1781 | -------------------------------------------------------------------------------- /etc/terms.txt: -------------------------------------------------------------------------------- 1 | facebook 2 | youtube 3 | google 4 | gmail 5 | hotmail 6 | xxnx 7 | xvideos 8 | amazon 9 | translator 10 | xxx 11 | pornos 12 | facebook login 13 | yahoo 14 | google translate 15 | yahoomail 16 | google maps 17 | ebay 18 | whatsapp 19 | porn 20 | instagram 21 | traductor 22 | weather 23 | redtube 24 | netflix 25 | outlook 26 | pokemon go 27 | twitter 28 | xhamster 29 | fahrenheit 30 | youporn 31 | olx 32 | craigslist 33 | msn 34 | grammes 35 | free porn 36 | beeg 37 | youtube mp3 38 | snapchat 39 | you 40 | messenger 41 | news 42 | sex 43 | videos pornotube 44 | ali express 45 | walmart 46 | bbc news 47 | google trad 48 | clash of clans 49 | linkedin 50 | tubidy 51 | pinterest 52 | vminecraft 53 | glob 54 | whatsapp web 55 | mincraft 56 | badoo 57 | bideo porno 58 | video porn 59 | ikea 60 | live score 61 | cnn 62 | cable news network 63 | e okul 64 | youtube to mp3 65 | olympics 66 | auol 67 | uolo 68 | speed test 69 | speedometer test 70 | minecraft 71 | traduttore 72 | game 73 | games 74 | paypal 75 | tiempos 76 | daily mail 77 | pornhub 78 | crikbuzz 79 | sahibinden 80 | MercadoLibre 81 | ok google 82 | libero mail 83 | milliyet 84 | bild 85 | marca 86 | marcar 87 | google tradutor 88 | euro 2016 89 | google onedrive 90 | ryanair 91 | traduttor 92 | myn 93 | skype 94 | aleg 95 | espn 96 | ebay kleinanzeigen 97 | factory automation 98 | football association 99 | mail 100 | mailen 101 | mails 102 | nynet 103 | beezars 104 | allegro 105 | convertidos 106 | sexuality video 107 | wp 108 | sex videos 109 | flipkart 110 | home depot 111 | home-depot 112 | hotel 113 | hotelaria 114 | restaurant 115 | restauration 116 | fox news 117 | iphone 7 118 | chaturbate 119 | ebay uk 120 | national basketball association 121 | nba 122 | g drive 123 | google drive 124 | bet365 125 | pokemom 126 | after service 127 | akciova spolecnost 128 | dropbox 129 | bed 365 130 | bookers 131 | booking 132 | zalando 133 | oranges 134 | calcu 135 | omegle 136 | indeed 137 | calculator 138 | calculators 139 | mp3 140 | pandora 141 | target 142 | zara 143 | airbnb 144 | best buy 145 | brazzers 146 | irctc 147 | cricbuzz 148 | uc browser 149 | phim sex 150 | gmx 151 | satta matka 152 | tubemate 153 | traductor google 154 | juegos 155 | hotels 156 | putlocker 157 | donald trump 158 | patriot ordnance factory 159 | pof 160 | restaurants 161 | bbc sports 162 | wells fargo 163 | pirate bay 164 | tumblr 165 | office 365 166 | office365 167 | youtube converter 168 | goggle docs 169 | billionaire boys club 170 | bbc 171 | wikipedia 172 | el mundo 173 | traduzir 174 | cam4 175 | leboncoin 176 | pizza hut 177 | pizzahut deals 178 | santander 179 | hentai 180 | el pais 181 | subway surfers 182 | brazzer 183 | brazzers 184 | roblox 185 | soundcloud 186 | bank of america 187 | google play 188 | gum tree 189 | spotify 190 | dominos 191 | interia 192 | goggle chrome 193 | staeam 194 | steam 195 | international mathematics olympiad 196 | playstore 197 | apple 198 | groupon 199 | itube.com 200 | amazon uk 201 | amazon united kingdom 202 | cricinfo 203 | argos 204 | atgis 205 | augos 206 | tube8 207 | xxx video 208 | facebook lite 209 | adna klasnik 210 | odnoklassniki 211 | imdb 212 | aol mail 213 | aol mailbox 214 | sports 215 | man united 216 | justin bieber 217 | state bank india online 218 | american online inc 219 | sbi online 220 | google docs 221 | backpages 222 | lowes 223 | cosco 224 | aol 225 | bing 226 | wwe 227 | anti virus 228 | dich 229 | hdfc netbanking 230 | auto trader 231 | candy crush 232 | perfect girl 233 | expedia 234 | vodafone 235 | adidas 236 | porn tube 237 | pornstar tube 238 | kooora 239 | trivago 240 | liber 241 | nike 242 | viber 243 | google chrome 244 | chrome 245 | chromed 246 | trip advisor 247 | automated surface observing system 248 | whatsapp messenger 249 | line 250 | macys 251 | skyscanner 252 | facebook en espa ol 253 | decathlon 254 | shareit 255 | snap deal 256 | snapdeal 257 | 24h 258 | internet movie database 259 | banco de venezuela 260 | reddit 261 | icloud 262 | uber 263 | trump 264 | game of thrones 265 | aright move 266 | peppa pig 267 | deadpool 268 | national football league 269 | nfl 270 | samsung 271 | world star hip hop 272 | aloewishes 273 | anime goog 274 | mp3xd 275 | lotto 276 | meenakshisundaram 277 | metros 278 | monsieur 279 | alvyda 280 | american airlines 281 | ansaa 282 | flashscore 283 | real madrid 284 | itunes 285 | accuweather 286 | yandex 287 | youtube downloader 288 | capital one 289 | dailymotion 290 | hsbc 291 | email 292 | pages jaunes 293 | google earth 294 | mcdonalds 295 | asck 296 | clean master 297 | amazon prime 298 | ask 299 | imo 300 | porno gratis 301 | pornogratis 302 | usps tracking 303 | zillows 304 | kohls 305 | paytm 306 | gta 307 | costco 308 | facebook messenger 309 | happy wheels 310 | kim kardashian 311 | porn video 312 | toys r us 313 | cricket scoreboard 314 | cricket scores 315 | traducir 316 | mercado libre 317 | mexican restaurants near me 318 | nfl scores 319 | dravi 320 | star wars 321 | google scholar 322 | cooi math gams 323 | cool math game 324 | solitaire 325 | afton bladet 326 | google news 327 | google images 328 | tinder 329 | chase 330 | goggle images 331 | caf 332 | iltalehti 333 | vpn 334 | goggle news 335 | iphone 6s 336 | selena gomez 337 | mp3 converter 338 | aresanel 339 | driver 340 | suicide squad 341 | mobile 342 | mobili 343 | wallpapers 344 | wc 345 | forever 21 346 | powerball 347 | ticketmaster 348 | web whatsapp 349 | a erocam aor omes 350 | asrnel 351 | bbc weather 352 | hotmaillogin 353 | corrosion of conformity 354 | windows 10 355 | easyjet 356 | hot 357 | litre 358 | mapquest 359 | vn express 360 | kizi 361 | youtube videos 362 | bradesco 363 | lol 364 | clarin 365 | photo edit 366 | photography editing 367 | trenitalia 368 | candy crush saga 369 | fanatik 370 | mappy 371 | b6 12 372 | meteos 373 | celsius 374 | firefox 375 | grand theft auto 376 | greater toronto area 377 | kik 378 | next 379 | victoria secret 380 | sexo 381 | teamviewer 382 | etsy 383 | bla bla car 384 | indian railway 385 | lazada 386 | pnr-status 387 | hotstar 388 | x video 389 | bidmate 390 | jogos 391 | mfacebook 392 | la caixa 393 | t-mobile 394 | hillary clinton 395 | restaurant near me 396 | ymz 397 | tmz 398 | Ariana Grande 399 | sky news 400 | mp3 juice 401 | ig 402 | cool math 403 | the walking dead 404 | ilta-sanomat 405 | arsenal 406 | asana 407 | barca 408 | barcelona 409 | barcelonistas 410 | sky sports 411 | ultimate fighting championship 412 | taylor swift 413 | banisteriopsis 414 | general motors 415 | genetically modified 416 | gm 417 | le monde 418 | web 419 | kurir 420 | chased 421 | prince 422 | 123movies 423 | kayak 424 | b lic 425 | minion 426 | music downloader 427 | youtube music 428 | edmodo 429 | cars 430 | hola 431 | att 432 | happy birthday 433 | dee 434 | iphone 6 435 | wish 436 | papa johns 437 | sat 438 | major league baseball 439 | mlb 440 | australian broadcasting corporation 441 | index 442 | indexer 443 | credit karma 444 | snap tube 445 | aloha tube 446 | banco estado 447 | kickass 448 | aphotoshop 449 | abc 450 | fifa 16 451 | db 452 | deutsche bahn 453 | iphone 5s 454 | actualitees 455 | messi 456 | kylie jenner 457 | utorrent 458 | image 459 | terra 460 | google classrooms 461 | rediffmail 462 | torrents 463 | extra torrent 464 | xdj 465 | starbucks 466 | movies 467 | matka 468 | wordreference 469 | anime 470 | sarkari result 471 | retrica 472 | 4shared 473 | kahoot 474 | habe 475 | ups track 476 | 9 gag 477 | antozone 478 | auroson 479 | auroxone 480 | gazeteler 481 | tesco 482 | bank2u 483 | downloads 484 | mango 485 | ok 486 | qvc 487 | unicredit 488 | banco bilbao vizcaya argentaria 489 | bbvas 490 | horoscope 491 | 24 sata 492 | baqnesco 493 | credit agricole 494 | bed bath and beyond 495 | buienradar 496 | old navy 497 | arefour 498 | dictionaries 499 | dictionary 500 | foot locker 501 | footlocker 502 | j.c. penney 503 | pnr status 504 | amerikano 505 | aricanas 506 | gamestop 507 | nordstrom 508 | bookmyshow 509 | liverpool 510 | rambler 511 | major league baseball scores 512 | mlb scores 513 | nba scores 514 | the pirate bay 515 | golden state warriors 516 | onedrive 517 | cheap flights 518 | vertalen 519 | cheapest flights 520 | citi bank 521 | outlook 365 522 | chase online 523 | watch series 524 | david bowie 525 | google flights 526 | bbc football 527 | united airlines 528 | bernie sanders 529 | testing 530 | tests 531 | toyota 532 | webmail 533 | ajva 534 | fitbit 535 | java 536 | american express 537 | gay porn 538 | ivanovic 539 | television guide 540 | tv guide 541 | cristiano ronaldo 542 | rihanna 543 | southwest airlines 544 | sw airlines 545 | java -djava.security.policy 546 | oppure 547 | ovvero 548 | spider man 549 | online sbi 550 | bmw 551 | music 552 | ynet 553 | dragon ball super 554 | iphones 555 | anerucab exoress 556 | verizon 557 | icicinet banking 558 | roku 559 | popcorn time 560 | pornhd 561 | delfi 562 | sabah 563 | hello 564 | eme 565 | winrar 566 | youtubes music 567 | n 568 | united states post office 569 | east 570 | premier league 571 | piano 572 | skies 573 | sky 574 | mp3 downloader 575 | asda 576 | geometry dash 577 | foot 578 | football 579 | flashlight 580 | mobile de 581 | tubegalore 582 | photoshop 583 | ps4 584 | 360 security 585 | thesaurus 586 | ups 587 | free sex 588 | uninterrupted power supply 589 | adobe reader 590 | subway 591 | league of legends 592 | movistar 593 | guardian 594 | guardians 595 | fedex 596 | gmail login 597 | applock 598 | naruto 599 | apps 600 | grand theft auto 5 601 | o2 602 | anemei 603 | currency converter 604 | emoji 605 | walgreen 606 | john lewis 607 | milf 608 | wechat 609 | hd porn 610 | download 611 | moto gp 612 | sears 613 | autozone 614 | bideos porno gratis 615 | huffington post 616 | porn hd 617 | telecinco 618 | chatro 619 | chatroulet 620 | la repubblica 621 | photo grid 622 | animal jam 623 | apple store 624 | avitop 625 | palmeiras 626 | aldis 627 | candy camera 628 | christian outreach centre 629 | segunda mano 630 | videos porno gratis 631 | bonprix 632 | carrefour 633 | cinemark 634 | new look 635 | times of india 636 | truecaller 637 | antera vasna 638 | fnac 639 | live cricket score 640 | live cricket scoreboard 641 | program tv 642 | netbanking 643 | conor mcgregor 644 | comcast 645 | mail online 646 | halifax 647 | adobe flash player 648 | coco 649 | teen porn 650 | pubmed 651 | honda 652 | lottery 653 | plenty of fish 654 | a bola 655 | bee bee 656 | expressing 657 | expression 658 | lloyds 659 | amel 660 | amelie 661 | adele 662 | frozen 663 | people 664 | video one 665 | hyundai 666 | spiegel 667 | captain america civil war 668 | kendall jenner 669 | national hockey league 670 | federation internationale de football association 671 | fifa 672 | natwest 673 | beyonce 674 | dragon city 675 | drudge report 676 | iphone se 677 | nudevista 678 | fandango 679 | google-analytics 680 | bod 681 | harry potter 682 | champions league 683 | us bank 684 | microsoft 685 | mundo deportivo 686 | fc barcelona 687 | hay day 688 | chelsea 689 | le figaro 690 | mp3 music downloading 691 | xbox one 692 | ford 693 | volkswagen 694 | angelina jolie 695 | leos 696 | el confidencial 697 | michael kors 698 | translate google 699 | british airways 700 | eurosport 701 | afipo 702 | la nacion 703 | mega 704 | warrior 705 | jota 706 | record 707 | b anco do brasil 708 | fallout 4 709 | nicki minaj 710 | pac-man 711 | mercedes 712 | rojadirecta 713 | slither 714 | societe generale 715 | avob 716 | avon 717 | mia khalifa 718 | one piece 719 | fifa 15 720 | booking.com 721 | jav 722 | anco santander 723 | chromecast 724 | lego 725 | cartolas 726 | telegram 727 | radio 728 | sex tube 729 | myfreecams 730 | shazam 731 | sudoku 732 | asds 733 | jeux 734 | urban dictionary 735 | deezer 736 | marks and spencer 737 | air france 738 | cars game 739 | staple 740 | video downloader 741 | acura games 742 | camera 360 743 | car g 744 | car game 745 | la poste 746 | vlc 747 | abast 748 | airasia 749 | mahjong 750 | paris 751 | pdf 752 | porno xxx 753 | pornografia xxx 754 | pornos xxx 755 | portable document format 756 | temple run 2 757 | avast 758 | avsst 759 | dainikbhaskar 760 | fedex track 761 | fedex tracking 762 | porn movies 763 | porno movies 764 | whatsapp download 765 | 9apps 766 | k mart 767 | launcher 768 | otto 769 | laredoute 770 | serie a 771 | conforama 772 | debenhams 773 | kmart 774 | white pages 775 | whitepages 776 | meetic 777 | cinepolis 778 | lojas americanas 779 | redbox 780 | bershka 781 | garanti 782 | mx player 783 | tokopedia 784 | zalo 785 | viamichelin 786 | correios 787 | tredyol 788 | cargams 789 | traductor de google 790 | yahoo finance 791 | johnny depp 792 | leonardo dicaprio 793 | ok cupid 794 | buzzfeed 795 | bancoombia 796 | pizza 797 | george boole 798 | corriere 799 | expressen 800 | anime flv 801 | aprint 802 | earth day 803 | periscope 804 | spanish to english 805 | xfinity 806 | rezultati 807 | asprint 808 | william hill 809 | william shakespeare 810 | nordea 811 | sprint 812 | scholar 813 | scholarship 814 | barclay 815 | barclays 816 | ask.fm 817 | national lottery 818 | tiscali 819 | cub 820 | el comercio 821 | isis 822 | samsung galaxy s7 823 | audi 824 | blogger 825 | el universal 826 | the revenant 827 | quot 828 | quotes 829 | rio 2016 830 | google analytics 831 | halloween 832 | miniclip 833 | western union 834 | katy perry 835 | one direction 836 | a naked girl 837 | boo hoo 838 | focus 839 | neymar 840 | banco provincial 841 | yelp 842 | delta 843 | drake 844 | film streaming 845 | nissan 846 | batman 847 | hoverboard 848 | quizlet 849 | snap 850 | yahoo news 851 | british telecom 852 | brad pitt 853 | copa america 854 | juventus 855 | sonic 856 | bekmen 857 | tesla 858 | avianca 859 | google calendar 860 | verizon wireless 861 | sex stories 862 | hangout 863 | jworg 864 | barbie 865 | bundesliga 866 | chatting 867 | moneycontrol 868 | television online 869 | meme 870 | photo 871 | free games 872 | free gaming 873 | freeware games 874 | need for speed 875 | cricket 876 | harley quinn 877 | provincial 878 | michael jackson 879 | tango 880 | vivo 881 | goggle mail 882 | cartoon network 883 | paris saint-germain 884 | burger king 885 | camera 886 | comuniazo 887 | primark 888 | angry birds 889 | alibaba 890 | boot 891 | global positioning system 892 | office depot 893 | batman vs superman 894 | dragon ball z 895 | party city 896 | banki 897 | adblock 898 | euro 899 | imgur 900 | akinator 901 | curries 902 | curry 903 | flash player 904 | google mail 905 | opera 906 | piano tiles 907 | planetromeo 908 | banco do brasil 909 | kfc 910 | bancosantander chile 911 | keyboard 912 | pacman 913 | 8ball pool 914 | bnp 915 | british national party 916 | el corte ingles 917 | f1 918 | zedge 919 | app lock 920 | applications lock 921 | free porn videos 922 | jennifer lawrence 923 | literot 924 | literotica 925 | louis vuitton 926 | river island 927 | sex xxx 928 | what 929 | bluestacks 930 | galinha pintadinha 931 | gossip 932 | margot robbie 933 | miley cyrus 934 | barnes and noble 935 | gitt 936 | make my trip 937 | michael 938 | pegasus 939 | plants vs zombies 940 | hobby lobby 941 | waze 942 | canadian tire 943 | e-mag 944 | american eagle 945 | gta san andreas 946 | dubsmash 947 | falabella 948 | gazeta 949 | stradivarius 950 | uc mini 951 | urban outfitters 952 | zing 953 | extras 954 | casto 955 | rotten tomatoes 956 | stephen curry 957 | club penguin 958 | mlb standings 959 | cat 960 | kanye west 961 | cici 962 | scratch 963 | zeta 964 | national rail 965 | train running status 966 | vikings 967 | time 968 | free mobile 969 | adobe 970 | naked girl 971 | fabswingers 972 | flickr 973 | transformers 974 | english soccer premier league 975 | mac 976 | kickers 977 | shemale 978 | enterprise 979 | songs 980 | emoji keyboard 981 | tetris 982 | mario 983 | live television 984 | lufthansa 985 | vivastreet 986 | gaps 987 | mobo market 988 | dick sporting goods 989 | nude 990 | sexy 991 | trade me 992 | scotiabank 993 | livecricket 994 | shopclues 995 | american eagle 996 | submarino 997 | elmundo 998 | chatroulette 999 | flower 1000 | internet -------------------------------------------------------------------------------- /src/Browser.php: -------------------------------------------------------------------------------- 1 | options[CURLOPT_CONNECTTIMEOUT] = 10; 15 | $this->options[CURLOPT_TIMEOUT] = 15; 16 | 17 | // sometimes google routes the connection through IPv6 which just makes this more difficult to deal with - force it to always use IPv4 18 | $this->options[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4; 19 | } 20 | } -------------------------------------------------------------------------------- /src/Engine/BingSearch.php: -------------------------------------------------------------------------------- 1 | browser->get("https://www.bing.com/account/general")->body; 19 | 20 | // parse various session values from that page 21 | preg_match_all('/]*name="\b(guid|sid|ru|uid)\b"[^>]*value="(.*?)"/i', $form_html, $matches, PREG_SET_ORDER); 22 | 23 | if ($matches) { 24 | 25 | // change some of them 26 | $options = array( 27 | 'rpp' => $count, 28 | 'pref_sbmt' => 1, 29 | ); 30 | 31 | foreach ($matches as $match) { 32 | $options[$match[1]] = $match[2]; 33 | } 34 | 35 | // submit the form and get the cookie that determines the number of results per page 36 | $this->browser->get("https://www.bing.com/account/?" . http_build_query($options)); 37 | } 38 | } 39 | 40 | // en-us, en-gb, it-IT, ru-RU... 41 | protected function setSearchMarket($search_market) 42 | { 43 | $body = $this->browser->get("https://www.bing.com/account/general")->body; 44 | 45 | if (preg_match('/browser->get($url); 51 | } 52 | } 53 | 54 | // override 55 | public function setPreference($name, $value) 56 | { 57 | parent::setPreference($name, $value); 58 | 59 | if ($name == 'search_market') { 60 | $this->setSearchMarket($value); 61 | } 62 | 63 | if ($name == 'results_per_page') { 64 | $this->setResultsPerPage($value); 65 | } 66 | } 67 | 68 | function extractResults($html) 69 | { 70 | // ads ID=SERP,5417.1,Ads ID=SERP,5106.1 71 | // bing local ID=SERP,5079.1 72 | // bing local ID=SERP,5486.1 73 | 74 | // news ID=SERP,5371.1 75 | 76 | // result ID=SERP,5167.1 77 | // result ID=SERP,5151.1 78 | 79 | preg_match_all('/

getOption('results_per_page', 10) + 1; 87 | 88 | $query = rawurlencode($query); 89 | $response = $this->browser->get("https://www.bing.com/search?q={$query}&first={$start}"); 90 | 91 | $sr = new SearchResponse($response); 92 | 93 | if ($response->error) { 94 | $sr->error = $response->error; 95 | } else { 96 | 97 | $body = $response->body; 98 | 99 | $sr->results = $this->extractResults($body); 100 | $sr->has_next_page = strpos($body, "\"sw_next\">Next") !== false; 101 | } 102 | 103 | return $sr; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/Engine/GoogleSearch.php: -------------------------------------------------------------------------------- 1 | preferences['results_per_page'] = 100; 14 | $this->preferences['google_domain'] = 'google.com'; 15 | } 16 | 17 | private function getNextPage($html) 18 | { 19 | if (preg_match('/preferences['google_domain'] . '' . $matches[1]; 21 | return htmlspecialchars_decode($url); 22 | } 23 | 24 | return false; 25 | } 26 | 27 | private function decodeLink($link) 28 | { 29 | if (preg_match('/\\/url\\?q=(.*?)&/', $link, $matches) == 1) { 30 | $link = $matches[1]; 31 | } else if (preg_match('/interstitial\\?url=(.*?)&/', $link, $matches) == 1) { 32 | $link = $matches[1]; 33 | } 34 | 35 | $link = htmlspecialchars_decode($link); 36 | 37 | return rawurldecode($link); 38 | } 39 | 40 | private function extractResults($raw_html) 41 | { 42 | // TODO: maybe do it in blocks? extract result blocks first?
43 | if (isset($this->preferences['detailed_results'])) { 44 | 45 | $ret = array(); 46 | 47 | if (preg_match_all('/

]*>(.*?)<\/a.*?(.*?)<\/span>/is', $raw_html, $matches) > 0) { 48 | 49 | for ($i = 0; $i < count($matches[0]); $i++) { 50 | 51 | $ret[] = array( 52 | 'url' => $this->decodeLink($matches[1][$i]), 53 | 'title' => $matches[2][$i], 54 | 'snippet' => $matches[3][$i] 55 | ); 56 | } 57 | 58 | return $ret; 59 | } else { 60 | return array(); 61 | } 62 | } 63 | 64 | // must contain http otherwise it's a relative link to google which we're not interested in 65 | if (preg_match_all('/ 0) { 66 | 67 | // depending on user agent, links returned are sometimes prefixed with /url?q= ... remove it 68 | $urls = $matches[1]; 69 | $results = array(); 70 | 71 | foreach ($urls as $url) { 72 | 73 | // these are Google-specific links 74 | if (strpos($url, 'ved=2') === false) { 75 | continue; 76 | } 77 | 78 | $url = $this->decodeLink($url); 79 | 80 | $results[] = $url; 81 | } 82 | 83 | return $results; 84 | } 85 | 86 | return array(); 87 | } 88 | 89 | private function prepare_url($query, $page) 90 | { 91 | $results_per_page = $this->preferences['results_per_page']; 92 | $google_domain = $this->preferences['google_domain']; 93 | 94 | $vars = array( 95 | 'q' => $query, 96 | 'start' => ($page - 1) * $results_per_page, 97 | 'client' => 'navclient', // probably useless 98 | 'gbv' => 1, // no javascript 99 | 'complete' => 0, // 0 to disable instant search and enable more than 10 results 100 | 'num' => $results_per_page, // number of results 101 | 'pws' => 0, // do not personalize my search results 102 | 'nfpr' => 1, // do not auto correct my search queries 103 | 'ie' => 'utf-8', 104 | 'oe' => 'utf-8' 105 | ); 106 | 107 | $vars = @array_merge($vars, (array)$this->preferences['query_params']); 108 | 109 | if (isset($this->preferences['date_range'])) { 110 | 111 | $str = substr($this->preferences['date_range'], 0, 1); 112 | 113 | if (in_array($str, array('h', 'd', 'w', 'm', 'y'))) { 114 | $vars['tbs'] = 'qdr:' . $str; 115 | } 116 | } 117 | 118 | // do query building ourselves to get the url 119 | $url = 'https://www.' . $google_domain . '/search?' . http_build_query($vars, '', '&'); 120 | 121 | return $url; 122 | } 123 | 124 | // visits a special URL that disables ALL country redirects 125 | function ncr() 126 | { 127 | $this->browser->get('https://www.google.com/ncr'); 128 | } 129 | 130 | function search($query, $page_num = 1) 131 | { 132 | $url = $this->prepare_url($query, $page_num); 133 | 134 | // fetch response 135 | $curl_response = $this->browser->get($url); 136 | 137 | $response = new SearchResponse($curl_response); 138 | $html = $curl_response->body; 139 | 140 | if ($curl_response->status == 200) { 141 | 142 | // extract urls 143 | $response->results = $this->extractResults($html); 144 | 145 | // is there another page of results for this query? 146 | $response->has_next_page = $this->getNextPage($html) == true; 147 | 148 | } else { 149 | 150 | // something must have went wrong 151 | if ($curl_response->status == 429) { 152 | $response->error = 'captcha'; 153 | } else if ($curl_response->error) { 154 | $response->error = $curl_response->error; 155 | } else { 156 | $response->error = 'Bad Http Status: ' . $curl_response->status; 157 | } 158 | } 159 | 160 | return $response; 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /src/Engine/SearchEngine.php: -------------------------------------------------------------------------------- 1 | browser = new Browser(); 18 | } 19 | 20 | public abstract function search($query, $page_num); 21 | 22 | /** 23 | * @return Browser 24 | */ 25 | public function getBrowser() 26 | { 27 | return $this->browser; 28 | } 29 | 30 | public function setPreference($name, $value) 31 | { 32 | $this->preferences[$name] = $value; 33 | } 34 | 35 | // ALIAS 36 | public function setOption($name, $value) 37 | { 38 | $this->setPreference($name, $value); 39 | } 40 | 41 | public function getOption($name, $default = null) 42 | { 43 | return array_key_exists($name, $this->preferences) ? $this->preferences[$name] : $default; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/GoogleCaptchaSolver.php: -------------------------------------------------------------------------------- 1 | browser = $browser; 18 | } 19 | 20 | protected function getFormParams($html) 21 | { 22 | return array( 23 | 'continue' => htmlspecialchars_decode(Utils::getInputValueByName($html, 'continue')), 24 | 'q' => Utils::getInputValueByName($html, 'q') 25 | ); 26 | } 27 | 28 | public function solveUsingTwoCaptcha(SearchResponse $response, $key, $timeout = 90) 29 | { 30 | $solver = new TwoCaptcha\Client([ 31 | 'key' => $key, 32 | 'proxy' => $this->browser->getProxy() 33 | ]); 34 | 35 | $curl = $response->getCurlResponse(); 36 | 37 | $site_key = Utils::findSiteKey($curl->body); 38 | 39 | // not on captcha page 40 | if ($site_key) { 41 | 42 | $request = new TwoCaptcha\InRequest(); 43 | $request->key = $key; 44 | $request->googlekey = $site_key; 45 | $request->pageurl = $curl->info->url; 46 | $request->data_s = Utils::findDataSVariable($curl->body); 47 | 48 | $solution = $solver->solveReCaptchaV2($request, $timeout); 49 | 50 | $form_data = $this->getFormParams($curl->body); 51 | $form_data['g-recaptcha-response'] = $solution; 52 | 53 | return $this->browser->post('https://www.google.com/sorry/index', $form_data); 54 | } 55 | 56 | return null; 57 | } 58 | } -------------------------------------------------------------------------------- /src/SearchResponse.php: -------------------------------------------------------------------------------- 1 | curl_response = $curl_response; 28 | } 29 | 30 | public function getCurlResponse() 31 | { 32 | return $this->curl_response; 33 | } 34 | 35 | public function __toString() 36 | { 37 | $status = $this->error ? 'error' : 'success'; 38 | return "SearchResponse Status: {$status}, result count: " . count($this->results); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/global.php: -------------------------------------------------------------------------------- 1 | search('google or bing'); 12 | 13 | $this->assertGreaterThan(0, count($response->results)); 14 | } 15 | 16 | public function testSearchWithMoreResults() 17 | { 18 | $bing = new BingSearch(); 19 | $bing->setPreference('results_per_page', 50); 20 | 21 | $response = $bing->search("bing versus google"); 22 | 23 | $this->assertGreaterThan(40, count($response->results)); 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /tests/GoogleTest.php: -------------------------------------------------------------------------------- 1 | search('something random'); 12 | 13 | $this->assertGreaterThan(80, count($res->results)); 14 | } 15 | } 16 | 17 | --------------------------------------------------------------------------------