Add /organic API
This commit is contained in:
0
www/organic/external/easy-cert/.cache.csv
vendored
Normal file
0
www/organic/external/easy-cert/.cache.csv
vendored
Normal file
|
156
www/organic/external/easy-cert/operators.php
vendored
Normal file
156
www/organic/external/easy-cert/operators.php
vendored
Normal file
@@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
$info = $_SERVER['PATH_INFO'];
|
||||
if ($info !== '') {
|
||||
header('Status: 404');
|
||||
header('Content-Length: 0');
|
||||
exit;
|
||||
}
|
||||
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'GET' && $_SERVER['REQUEST_METHOD'] !== 'HEAD') {
|
||||
header('Status: 405');
|
||||
header('Content-Length: 0');
|
||||
header('Allow: GET, HEAD');
|
||||
exit;
|
||||
}
|
||||
|
||||
$search_url = null;
|
||||
$url = null;
|
||||
$query_id = null;
|
||||
$timestamp = null;
|
||||
|
||||
$limit = $_GET['limit'] ?? null;
|
||||
$offset = intval($_GET['offset'] ?? "0");
|
||||
if ($limit === '') $limit = null;
|
||||
if ($limit !== null) $limit = intval($limit);
|
||||
|
||||
if (isset($_GET['queryId'])) {
|
||||
$query_id = $_GET['queryId'];
|
||||
if ($cache = fopen('.cache.csv', 'r')) {
|
||||
while (($line = fgets($cache)) !== false) {
|
||||
$parts = explode(';', trim($line), 4);
|
||||
$timestamp = intval($parts[0]);
|
||||
if ($parts[1] !== $query_id) continue;
|
||||
$url = $parts[2];
|
||||
$search_url = $parts[3];
|
||||
break;
|
||||
}
|
||||
fclose($cache);
|
||||
}
|
||||
} else {
|
||||
$country = $_GET['country'] ?? null;
|
||||
$postalCode = $_GET['postalCode'] ?? null;
|
||||
$name = $_GET['name'] ?? null;
|
||||
$renew = ($_GET['renew'] ?? 'false') === 'true';
|
||||
|
||||
$search_url = "https://www.easy-cert.com/htm/suchergebnis.htm?suchtyp=einfach&CountryCode=$country&PostalCode=$postalCode&Name=$name";
|
||||
|
||||
if (!$renew && $cache = fopen('.cache.csv', 'r')) {
|
||||
while (($line = fgets($cache)) !== false) {
|
||||
$parts = explode(';', trim($line), 4);
|
||||
$timestamp = intval($parts[0]);
|
||||
if (time() - $timestamp > 60 * 30) continue;
|
||||
if ($parts[3] !== $search_url) continue;
|
||||
$url = $parts[2];
|
||||
$query_id = $parts[1];
|
||||
break;
|
||||
}
|
||||
fclose($cache);
|
||||
}
|
||||
}
|
||||
|
||||
if ($url === null) {
|
||||
$timestamp = time();
|
||||
$s = curl_init($search_url);
|
||||
curl_setopt($s, CURLOPT_RETURNTRANSFER, true);
|
||||
$html = curl_exec($s);
|
||||
preg_match_all('/id="control_([^"]*)" value="([^"]*)"/', $html, $matches, PREG_SET_ORDER);
|
||||
$control = [];
|
||||
foreach ($matches as $m) {
|
||||
$control[$m[1]] = $m[2];
|
||||
}
|
||||
$query_id = $control['iniqueid'];
|
||||
$server_count = $control['countserver'];
|
||||
|
||||
$lines = [];
|
||||
for ($i = 0; $i < 30; $i++) {
|
||||
sleep(1);
|
||||
$s = curl_init("https://www.easy-cert.com/_includes/search/result_items.php");
|
||||
curl_setopt($s, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($s, CURLOPT_HTTPHEADER, [
|
||||
'Referer: https://www.easy-cert.com/htm/suchergebnis.htm',
|
||||
'X-Requested-With: XMLHttpRequest',
|
||||
'X-USE: 1dfd3nsdv234njsdf923masddj123n12l31lg28gsdf2k34',
|
||||
]);
|
||||
curl_setopt($s, CURLOPT_POSTFIELDS, "uniqueid=$query_id&countServer=$server_count");
|
||||
$json = json_decode(curl_exec($s));
|
||||
if ($json->{'count'} >= $server_count) {
|
||||
$url = "https://www.easy-cert.com/" . str_replace('../', '', $json->{'filename'});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($url !== null)
|
||||
file_put_contents('.cache.csv', "$timestamp;$query_id;$url;$search_url\n", FILE_APPEND);
|
||||
}
|
||||
|
||||
if ($url === null) {
|
||||
header("Status: 500");
|
||||
header("Content-Length: 0");
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
$sed = [
|
||||
's/^.*"searchresults":\[//',
|
||||
's/],.*$//',
|
||||
's/},{/},\n {/g',
|
||||
'/^$/d',
|
||||
's/^/ /',
|
||||
's/}$/},/',
|
||||
];
|
||||
|
||||
header("Content-Type: application/json; charset=UTF-8");
|
||||
|
||||
echo '{"searchUrl":' . json_encode($search_url) .
|
||||
',"queryId":' . json_encode($query_id) .
|
||||
',"rawFileUrl":' . json_encode($url) .
|
||||
',"timestamp":' . json_encode(gmdate('Y-m-d\TH:i:s\Z', $timestamp)) .
|
||||
',"limit":' . json_encode($limit) .
|
||||
',"offset":' . json_encode($offset) . ",\"data\":[\n";
|
||||
|
||||
$fd_spec = [
|
||||
0 => ["pipe", "r"], // stdin
|
||||
1 => ["pipe", "w"], // stdout
|
||||
2 => ["pipe", "w"], // stderr
|
||||
3 => ["pipe", "w"], // line count
|
||||
];
|
||||
$offset++;
|
||||
$process = proc_open(
|
||||
['bash', '-c',
|
||||
"curl -s -N " . escapeshellarg($url) . " | " . // fetch data (silent and unbuffered)
|
||||
"xxd -p | " . // convert to hex stream
|
||||
"sed 's/7d2c7b/7d2c0a7b/g' | " . // roughly break up into lines (s/},{/},\n{/g)
|
||||
"xxd -r -p | " . // convert to text stream
|
||||
"sed '" . implode(';', $sed) . "' | " . // apply sed commands
|
||||
"tee >(wc -l 1>&3) | " . // copy stdout into wc and write result into fd 3
|
||||
"tail -n +$offset | " . // apply offset
|
||||
($limit !== null ? " head -n $limit | " : "") . // optionally apply limit
|
||||
"sed '\$s/.$//'"], // remove last comma of last line
|
||||
$fd_spec,
|
||||
$pipes
|
||||
);
|
||||
fclose($pipes[0]);
|
||||
while (($line = fgets($pipes[1])) !== false) {
|
||||
echo $line;
|
||||
}
|
||||
fclose($pipes[1]);
|
||||
$stderr = stream_get_contents($pipes[2]);
|
||||
fclose($pipes[2]);
|
||||
$count = intval(trim(stream_get_contents($pipes[3])));
|
||||
fclose($pipes[3]);
|
||||
$return_value = proc_close($process);
|
||||
|
||||
echo '],"totalCount":' . json_encode($count) . "}\n";
|
74
www/organic/index.php
Normal file
74
www/organic/index.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'GET' && $_SERVER['REQUEST_METHOD'] !== 'HEAD') {
|
||||
header('Status: 405');
|
||||
header('Content-Length: 0');
|
||||
header('Allow: GET, HEAD');
|
||||
exit;
|
||||
}
|
||||
|
||||
$info = $_SERVER['PATH_INFO'];
|
||||
if ($info !== '/' && str_ends_with($info, '/')) {
|
||||
header('Status: 303');
|
||||
header('Content-Length: 0');
|
||||
header('Location: /organic/' . substr($info, 0, -1));
|
||||
exit;
|
||||
}
|
||||
|
||||
$parts = explode('/', $info);
|
||||
if (str_starts_with($info, '/certificates/')) {
|
||||
$id = $parts[2];
|
||||
if (str_ends_with($id, '.txt')) {
|
||||
$id = substr($id, 0, -4);
|
||||
}
|
||||
if (str_contains($id, '/') || !file_exists("certificates/$id.pdf")) {
|
||||
header('Content-Length: 0');
|
||||
header('Status: 404');
|
||||
exit;
|
||||
}
|
||||
if (str_ends_with($parts[2], '.txt')) {
|
||||
$mode = '-layout';
|
||||
if (isset($_GET['raw']) && strtolower($_GET['raw']) === 'true') {
|
||||
$mode = '-raw';
|
||||
}
|
||||
header('Content-Type: text/plain; charset=UTF-8');
|
||||
system("pdftotext $mode 'certificates/$id.pdf' -");
|
||||
exit;
|
||||
}
|
||||
|
||||
if (str_ends_with($id, '.appendix')) {
|
||||
header('Status: 303');
|
||||
header('Location: ' . substr($id, 0, -9));;
|
||||
exit;
|
||||
}
|
||||
|
||||
$cert = shell_exec("pdftotext -raw 'certificates/$id.pdf' -");
|
||||
$appendix = shell_exec("pdftotext -raw 'certificates/$id.appendix.pdf' -");
|
||||
|
||||
$p1 = strpos($cert, "\nI.3 ");
|
||||
$p2 = strpos($cert, "\nI.4 ");
|
||||
echo substr($cert, $p1 + 5, $p2 - $p1 - 5);
|
||||
|
||||
exit;
|
||||
} else if ($info === '/authorities') {
|
||||
header('Content-Length: 0');
|
||||
header('Status: 501');
|
||||
exit;
|
||||
} else if (str_starts_with($info, '/authorities/')) {
|
||||
$code = $parts[2];
|
||||
header('Content-Type: text/plain; charset=UTF-8');
|
||||
echo "Control Authority Code: $code\n";
|
||||
exit;
|
||||
} else if ($info === '/operators') {
|
||||
header('Status: 501');
|
||||
|
||||
exit;
|
||||
} else if (str_starts_with($info, '/operators/')) {
|
||||
$ooid = $parts[2];
|
||||
header('Content-Type: text/plain; charset=UTF-8');
|
||||
echo "Organic Operator Id: $ooid\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
header('Content-Length: 0');
|
||||
header('Status: 404');
|
Reference in New Issue
Block a user