Что такое кодировка идентификатора вставки, используемая 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();
}