pastebin.com вставить идентификатор алфавита / кодировки? - PullRequest
0 голосов
/ 02 марта 2020

Что такое кодировка идентификатора вставки, используемая pastebin.com?

с помощью API очистки , я удалила 390 обновление: 890 идентификаторов вставки, и нашел следующие 58 символов:

0123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz

и эта кодировка была постоянной с момента вставки id # 39 из 890 .. это все? они используют некоторую кодировку base58?

для полноты, вот код скрапа, который я написал:

инспектор БД:

<?php
declare(strict_types = 1);
init();
$db = getDB();
$ids = $db->query("SELECT paste_id FROM pastebin_ids")->fetchAll(PDO::FETCH_NUM);
foreach ($ids as &$id) {
    $id = $id[0];
}
unset($id);
$ids_concat = implode("", $ids);
$unique = [];
$last_unique = 0;
$id_counter = 0;
foreach ($ids as $id) {
    ++ $id_counter;
    for ($i = 0; $i < strlen($id); ++ $i) {
        if (! in_array($id[$i], $unique)) {
            $last_unique = $id_counter;
            $unique[] = $id[$i];
        }
    }
}
natsort($unique);
$unique = implode("", $unique);
var_dump([
    "ids" => $ids,
    "count" => count($ids),
    "concat" => $ids_concat,
    "unique" => $unique,
    "last_unique" => $last_unique
]);

function getDB(): PDO
{
    static $cached = null;
    if ($cached !== null) {
        return $cached;
    }
    $dbfile = __DIR__ . DIRECTORY_SEPARATOR . "pastebin_ids.db3";
    if (! is_file($dbfile)) {
        throw new \LogicException("DATABASE IS MISSING!");
    }
    $cached = new \PDO('sqlite:' . $dbfile, '', '', array(
        \PDO::ATTR_EMULATE_PREPARES => false,
        \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
    ));
    return $cached;
}

function init()
{
    if (@include_once ("hhb_.inc.php")) {
        // completely optional, better error reporting
        // (ErrorException & co)
        hhb_init();
    }
}

скребок:

    <?php
    declare(strict_types = 1);
    require_once ('hhb_.inc.php');
    init();
    $ch = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_ENCODING => '',
        CURLOPT_RETURNTRANSFER => 1
    ));
    $db = getDB();
    // $db->query("INSERT OR IGNORE INTO pastebin_ids (paste_id) VALUES('lol');");
    var_dump($db->query("SELECT * FROM pastebin_ids;")->fetchAll(PDO::FETCH_ASSOC));
    curl_setopt($ch, CURLOPT_URL, 'https://scrape.pastebin.com/api_scraping.php?limit=99999');
    $insert_stm = $db->prepare('INSERT OR IGNORE INTO pastebin_ids (paste_id) VALUES(?);');
    while (1) {
        sleep(30);
        $data = curl_exec($ch);
        if (empty($data)) {
            var_dump($data, curl_error($ch));
            throw new \RuntimeException("curl_exec failed!");
        }
        $data = json_decode($data, true);
        if (! is_array($data)) {
            var_dump($data, curl_error($ch));
            throw new \RuntimeException("json_decode failed!");
        }

        foreach ($data as $paste) {
            /**
             * array(9) {
             * ["scrape_url"]=>
             * string(58) "https://scrape.pastebin.com/api_scrape_item.php?i=EftBtJ8X"
             * ["full_url"]=>
             * string(29) "https://pastebin.com/EftBtJ8X"
             * ["date"]=>
             * string(10) "1583132402"
             * ["key"]=>
             * string(8) "EftBtJ8X"
             * ["size"]=>
             * string(3) "423"
             * ["expire"]=>
             * string(1) "0"
             * ["title"]=>
             * string(53) "SOCKS Proxy List - 02/03/20 08:00 AM by PremSocks.com"
             * ["syntax"]=>
             * string(4) "text"
             * ["user"]=>
             * string(9) "PremSocks"
             * }
             */
            $key = $paste["key"] ?? null;
            if (empty($key)) {
                var_dump($data, $paste);
                throw new \LogicException('KEY WAS EMPTY!');
            }
            $insert_stm->execute(array(
                $key
            ));
            $isNewId = $insert_stm->rowCount();
            if ($isNewId) {
                echo "new id: " . $key . "\n";
            } else {
                echo ".";
            }
        }
    }

    function getDB(): PDO
    {
        static $cached = null;
        if ($cached !== null) {
            return $cached;
        }
        $dbfile = __DIR__ . DIRECTORY_SEPARATOR . "pastebin_ids.db3";
        if (! is_file($dbfile)) {
            $schema = getSchema();
        }
        $cached = new \PDO('sqlite:' . $dbfile, '', '', array(
            \PDO::ATTR_EMULATE_PREPARES => false,
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
        ));
        if (! empty($schema)) {
            $cached->exec($schema);
        }
        return $cached;
    }

    function getSchema(): string
    {
        $schema = <<<'SCHEMA'
        -- DROP TABLE IF EXISTS pastebin_ids;
        CREATE TABLE IF NOT EXISTS pastebin_ids(
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            paste_id TEXT UNIQUE
        );
        SCHEMA;
        return $schema;
    }

    function init()
    {
        hhb_init();
    }
...