forked from Korbs/4get
captcha and imgur, findthatmeme, yep imagesearch
This commit is contained in:
parent
fa9dc4d6ef
commit
3aa0180774
26 changed files with 1710 additions and 63 deletions
20
README.md
20
README.md
|
@ -23,6 +23,9 @@ https://4get.ca
|
|||
- Yandex
|
||||
- Google
|
||||
- Brave
|
||||
- Yep
|
||||
- Imgur
|
||||
- FindThatMeme
|
||||
|
||||
3. Videos
|
||||
- YouTube
|
||||
|
@ -39,6 +42,17 @@ https://4get.ca
|
|||
5. Music
|
||||
- SoundCloud
|
||||
|
||||
6. Autocompleter
|
||||
- Brave
|
||||
- DuckDuckGo
|
||||
- Yandex
|
||||
- Google
|
||||
- Qwant
|
||||
- Yep
|
||||
- Marginalia
|
||||
- YouTube
|
||||
- SoundCloud
|
||||
|
||||
More scrapers are coming soon. I currently want to add Google web/video/news search, HackerNews (durr orange site!!) and Qwant. A shopping and files tab is also in my todo list.
|
||||
|
||||
# Setup
|
||||
|
@ -166,7 +180,11 @@ certbot --nginx --key-type ecdsa -d www.yourdomain.com -d yourdomain.com
|
|||
|
||||
After doing that certbot should deploy the certificate automatically into your 4get nginx config file. It should be ready to use at that point.
|
||||
|
||||
Ok bye!!!
|
||||
## Captcha
|
||||
|
||||
Right now the setup for this shit is absolutely awful.
|
||||
|
||||
Edit line 190 in `lib/captcha_gen.php` and specify your image sets. You can't disable the captcha right now lol. Just use a previous commit if you want to do that. Call me a shitcoder all you want I've had no energy lately. Images must be stored in `data/captcha`. Create a folder for each category. All files in there should be named from `1.png` to `321839.png`, for example.
|
||||
|
||||
## Tor Setup
|
||||
|
||||
|
|
0
admin.php
Normal file
0
admin.php
Normal file
18
api.txt
18
api.txt
|
@ -30,12 +30,25 @@
|
|||
under your own terms. Please respect the terms of use listed here so
|
||||
that this website may be available to all in the far future.
|
||||
|
||||
P.s fuck whoever botted my site for months on end, choke on my dick
|
||||
lol!!!!
|
||||
|
||||
Get your instance running here ::
|
||||
https://git.lolcat.ca/lolcat/4get
|
||||
|
||||
Thanks!
|
||||
|
||||
|
||||
+ Passes
|
||||
Depending of the instance, you may need to provide a "pass" token
|
||||
in the cookies of your request. These can be obtained from solving
|
||||
a captcha which will allow you to make 100 requests in the next 24
|
||||
hours. In the future, you will be able to ask the serber maintainer
|
||||
for a "pass" which will allow you to bypass the captcha requirement.
|
||||
|
||||
The captcha doesn't need javascript to work.
|
||||
|
||||
|
||||
+ Decode the data
|
||||
All payloads returned by the API are encoded in the JSON format. If
|
||||
you don't know how to tackle the problem, maybe programming is not
|
||||
|
@ -47,8 +60,11 @@
|
|||
+ Check if an API call was successful
|
||||
All API responses come with an array index named "status". If the
|
||||
status is something else than the string "ok", something went wrong.
|
||||
You can supply the content of the "status" string back to your
|
||||
application to inform the user of what went wrong.
|
||||
|
||||
The HTTP code will always be 200 as to not cause issues with CORS.
|
||||
The HTTP code will be 429 if your pass is invalid. It is set to 200
|
||||
otherwise.
|
||||
|
||||
|
||||
+ Get the next page of results
|
||||
|
|
|
@ -17,7 +17,7 @@ class autocomplete{
|
|||
"yep" => "https://api.yep.com/ac/?query={searchTerms}",
|
||||
"marginalia" => "https://search.marginalia.nu/suggest/?partial={searchTerms}",
|
||||
"yt" => "https://suggestqueries-clients6.youtube.com/complete/search?client=youtube&q={searchTerms}",
|
||||
"sc" => "https://api-v2.soundcloud.com/search/queries?q={searchTerms}&client_id=iMxZgT5mfGstBj8GWJbYMvpzelS8ne0E&limit=10&offset=0&linked_partitioning=1&app_version=1693487844&app_locale=en"
|
||||
"sc" => "https://api-v2.soundcloud.com/search/queries?q={searchTerms}&client_id=ArYppSEotE3YiXCO4Nsgid2LLqJutiww&limit=10&offset=0&linked_partitioning=1&app_version=1693487844&app_locale=en"
|
||||
];
|
||||
|
||||
/*
|
||||
|
@ -100,7 +100,7 @@ class autocomplete{
|
|||
|
||||
foreach($js[1] as $item){
|
||||
|
||||
$json[] = strip_tags($item[0]);
|
||||
$json[] = htmlspecialchars_decode(strip_tags($item[0]));
|
||||
}
|
||||
|
||||
echo json_encode(
|
||||
|
|
|
@ -7,6 +7,12 @@ chdir("../../");
|
|||
include "lib/frontend.php";
|
||||
$frontend = new frontend();
|
||||
|
||||
/*
|
||||
Captcha
|
||||
*/
|
||||
include "lib/captcha_gen.php";
|
||||
new captcha($frontend, false);
|
||||
|
||||
[$scraper, $filters] = $frontend->getscraperfilters(
|
||||
"images",
|
||||
isset($_GET["scraper"]) ? $_GET["scraper"] : null
|
||||
|
|
|
@ -7,6 +7,13 @@ chdir("../../");
|
|||
include "lib/frontend.php";
|
||||
$frontend = new frontend();
|
||||
|
||||
/*
|
||||
Captcha
|
||||
*/
|
||||
$null = null;
|
||||
include "lib/captcha_gen.php";
|
||||
new captcha($null, $null, $null, $null, false);
|
||||
|
||||
[$scraper, $filters] = $frontend->getscraperfilters(
|
||||
"music",
|
||||
isset($_GET["scraper"]) ? $_GET["scraper"] : null
|
||||
|
|
|
@ -7,6 +7,12 @@ chdir("../../");
|
|||
include "lib/frontend.php";
|
||||
$frontend = new frontend();
|
||||
|
||||
/*
|
||||
Captcha
|
||||
*/
|
||||
include "lib/captcha_gen.php";
|
||||
new captcha($frontend, false);
|
||||
|
||||
[$scraper, $filters] = $frontend->getscraperfilters(
|
||||
"news",
|
||||
isset($_GET["scraper"]) ? $_GET["scraper"] : null
|
||||
|
|
|
@ -7,6 +7,12 @@ chdir("../../");
|
|||
include "lib/frontend.php";
|
||||
$frontend = new frontend();
|
||||
|
||||
/*
|
||||
Captcha
|
||||
*/
|
||||
include "lib/captcha_gen.php";
|
||||
new captcha($frontend, false);
|
||||
|
||||
[$scraper, $filters] = $frontend->getscraperfilters(
|
||||
"videos",
|
||||
isset($_GET["scraper"]) ? $_GET["scraper"] : null
|
||||
|
|
|
@ -7,6 +7,12 @@ chdir("../../");
|
|||
include "lib/frontend.php";
|
||||
$frontend = new frontend();
|
||||
|
||||
/*
|
||||
Captcha
|
||||
*/
|
||||
include "lib/captcha_gen.php";
|
||||
new captcha($frontend, false);
|
||||
|
||||
[$scraper, $filters] = $frontend->getscraperfilters(
|
||||
"web",
|
||||
isset($_GET["scraper"]) ? $_GET["scraper"] : null
|
||||
|
|
147
captcha.php
Executable file
147
captcha.php
Executable file
|
@ -0,0 +1,147 @@
|
|||
<?php
|
||||
|
||||
if(
|
||||
!isset($_GET["k"]) ||
|
||||
preg_match(
|
||||
'/^c\.[0-9]+$/',
|
||||
$_GET["k"]
|
||||
)
|
||||
){
|
||||
|
||||
header("Content-Type: text/plain");
|
||||
echo "Fuck you";
|
||||
die();
|
||||
}
|
||||
|
||||
header("Content-Type: image/jpeg");
|
||||
|
||||
$grid = apcu_fetch($_GET["k"]);
|
||||
|
||||
if(
|
||||
$grid === false ||
|
||||
$grid[3] === true // has already been generated
|
||||
){
|
||||
|
||||
http_response_code(304); // not modified
|
||||
die();
|
||||
}
|
||||
|
||||
header("Last-Modified: Thu, 01 Oct 1970 00:00:00 GMT");
|
||||
|
||||
// only generate one captcha with this config
|
||||
apcu_store(
|
||||
$_GET["k"],
|
||||
[
|
||||
$grid[0],
|
||||
$grid[1],
|
||||
$grid[2],
|
||||
true // has captcha been generated?
|
||||
],
|
||||
120 // we give user another 2 minutes to solve
|
||||
);
|
||||
|
||||
// generate image
|
||||
|
||||
if(random_int(0,1) === 0){
|
||||
|
||||
$theme = [
|
||||
"bg" => "#ebdbb2",
|
||||
"fg" => "#1d2021"
|
||||
];
|
||||
}else{
|
||||
|
||||
$theme = [
|
||||
"bg" => "#1d2021",
|
||||
"fg" => "#ebdbb2"
|
||||
];
|
||||
}
|
||||
|
||||
$im = new Imagick();
|
||||
$im->newImage(400, 400, $theme["bg"]);
|
||||
$im->setImageBackgroundColor($theme["bg"]);
|
||||
$im->setImageFormat("jpg");
|
||||
|
||||
$noise = [
|
||||
imagick::NOISE_GAUSSIAN,
|
||||
imagick::NOISE_LAPLACIAN
|
||||
];
|
||||
|
||||
$distort = [
|
||||
imagick::DISTORTION_AFFINE,
|
||||
imagick::DISTORTION_SHEPARDS
|
||||
];
|
||||
|
||||
$i = 0;
|
||||
for($y=0; $y<4; $y++){
|
||||
|
||||
for($x=0; $x<4; $x++){
|
||||
|
||||
$tmp = new Imagick("./data/captcha/" . $grid[0][$i][0] . "/" . random_int(1, $grid[0][$i][1]) . ".png");
|
||||
|
||||
// convert transparency correctly
|
||||
$tmp->setImageBackgroundColor("black");
|
||||
$tmp->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
|
||||
|
||||
// distort $tmp
|
||||
$tmp->distortImage(
|
||||
$distort[random_int(0,1)],
|
||||
[
|
||||
0, 0,
|
||||
random_int(-15, 15), random_int(-15, 15),
|
||||
|
||||
100, 0,
|
||||
random_int(80, 120), random_int(-15, 15),
|
||||
|
||||
100, 100,
|
||||
random_int(80, 120), random_int(80, 120),
|
||||
|
||||
0, 100,
|
||||
random_int(-15, 15), random_int(80, 120)
|
||||
],
|
||||
false
|
||||
);
|
||||
|
||||
// append image
|
||||
$im->compositeImage($tmp->getImage(), Imagick::COMPOSITE_DEFAULT, $x * 100, $y * 100);
|
||||
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
// add noise
|
||||
$im->addNoiseImage($noise[random_int(0, 1)]);
|
||||
|
||||
// expand top of image
|
||||
$im->setImageGravity(Imagick::GRAVITY_SOUTH);
|
||||
$im->chopImage(0, -27, 400, 400);
|
||||
$im->extentImage(0, 0, 0, -27);
|
||||
|
||||
// add text
|
||||
$draw = new ImagickDraw();
|
||||
$draw->setFontSize(20);
|
||||
$draw->setFillColor($theme["fg"]);
|
||||
//$draw->setTextAntialias(false);
|
||||
$draw->setFont("./data/captcha/font.ttf");
|
||||
|
||||
$text = "Pick " . $grid[1] . " images of " . str_replace("_", " ", $grid[2]);
|
||||
|
||||
$pos = 200 - ($im->queryFontMetrics($draw, $text)["textWidth"] / 2);
|
||||
|
||||
for($i=0; $i<strlen($text); $i++){
|
||||
|
||||
$im->annotateImage(
|
||||
$draw,
|
||||
$pos,
|
||||
20,
|
||||
random_int(-15, 15),
|
||||
$text[$i]
|
||||
);
|
||||
|
||||
$pos += $im->queryFontMetrics($draw, $text[$i])["textWidth"];
|
||||
|
||||
}
|
||||
|
||||
$im->setFormat("jpeg");
|
||||
$im->setImageCompressionQuality(90);
|
||||
$im->setImageCompression(Imagick::COMPRESSION_JPEG2000);
|
||||
echo $im->getImageBlob();
|
BIN
data/captcha/font.ttf
Normal file
BIN
data/captcha/font.ttf
Normal file
Binary file not shown.
10
images.php
10
images.php
|
@ -10,11 +10,11 @@ $frontend = new frontend();
|
|||
|
||||
$get = $frontend->parsegetfilters($_GET, $filters);
|
||||
|
||||
$frontend->loadheader(
|
||||
$get,
|
||||
$filters,
|
||||
"images"
|
||||
);
|
||||
/*
|
||||
Captcha
|
||||
*/
|
||||
include "lib/captcha_gen.php";
|
||||
new captcha($frontend, $get, $filters, "images", true);
|
||||
|
||||
$payload = [
|
||||
"images" => "",
|
||||
|
|
325
lib/captcha_gen.php
Normal file
325
lib/captcha_gen.php
Normal file
|
@ -0,0 +1,325 @@
|
|||
<?php
|
||||
|
||||
class captcha{
|
||||
|
||||
public function __construct($frontend, $get, $filters, $page, $output){
|
||||
|
||||
/*
|
||||
Validate cookie, if it exists
|
||||
*/
|
||||
if(isset($_COOKIE["pass"])){
|
||||
|
||||
if(
|
||||
// check if key is not malformed
|
||||
preg_match(
|
||||
'/^c[0-9]+\.[A-Za-z0-9]{20}$/',
|
||||
$_COOKIE["pass"]
|
||||
) &&
|
||||
// does key exist
|
||||
apcu_exists($_COOKIE["pass"])
|
||||
){
|
||||
|
||||
// exists, increment counter
|
||||
$inc = apcu_inc($_COOKIE["pass"]);
|
||||
|
||||
// we start counting from 1
|
||||
// when it has been incremented to 102, it has reached
|
||||
// 100 reqs
|
||||
if($inc >= 102){
|
||||
|
||||
// reached limit, delete and give captcha
|
||||
apcu_delete($_COOKIE["pass"]);
|
||||
}else{
|
||||
|
||||
// the cookie is OK! dont die() and give results
|
||||
if($output === true){
|
||||
$frontend->loadheader(
|
||||
$get,
|
||||
$filters,
|
||||
$page
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($output === false){
|
||||
|
||||
echo json_encode([
|
||||
"status" => "The \"pass\" token in your cookies is missing or has expired!!"
|
||||
]);
|
||||
die();
|
||||
}
|
||||
|
||||
/*
|
||||
Validate form data
|
||||
*/
|
||||
$lines =
|
||||
explode(
|
||||
"\r\n",
|
||||
file_get_contents("php://input")
|
||||
);
|
||||
|
||||
$invalid = false;
|
||||
$answers = [];
|
||||
$key = false;
|
||||
$error = "";
|
||||
|
||||
foreach($lines as $line){
|
||||
|
||||
$line = explode("=", $line, 2);
|
||||
|
||||
if(count($line) !== 2){
|
||||
|
||||
$invalid = true;
|
||||
break;
|
||||
}
|
||||
|
||||
preg_match(
|
||||
'/^c\[([0-9]+)\]$/',
|
||||
$line[0],
|
||||
$regex
|
||||
);
|
||||
|
||||
if(
|
||||
$line[1] != "on" ||
|
||||
!isset($regex[0][1])
|
||||
){
|
||||
|
||||
// check if its k
|
||||
if(
|
||||
$line[0] == "k" &&
|
||||
strpos($line[1], "c.") === 0
|
||||
){
|
||||
|
||||
$key = apcu_fetch($line[1]);
|
||||
apcu_delete($line[1]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
$regex = (int)$regex[1];
|
||||
|
||||
if(
|
||||
$regex >= 16 ||
|
||||
$regex <= -1
|
||||
){
|
||||
|
||||
$invalid = true;
|
||||
break;
|
||||
}
|
||||
|
||||
$answers[] = $regex;
|
||||
}
|
||||
|
||||
if(
|
||||
!$invalid &&
|
||||
$key !== false
|
||||
){
|
||||
$check = $key[1];
|
||||
|
||||
// validate answer
|
||||
for($i=0; $i<count($key[0]); $i++){
|
||||
|
||||
if(!in_array($i, $answers)){
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if($key[0][$i][0] == $key[2]){
|
||||
|
||||
$check--;
|
||||
}else{
|
||||
|
||||
// got a wrong answer
|
||||
$check = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if($check === 0){
|
||||
|
||||
// we passed the captcha
|
||||
// set cookie
|
||||
$inc = apcu_inc("cookie");
|
||||
$chars =
|
||||
array_merge(
|
||||
range("A", "Z"),
|
||||
range("a", "z"),
|
||||
range(0, 9)
|
||||
);
|
||||
|
||||
$c = count($chars) - 1;
|
||||
|
||||
$key = "c" . $inc . ".";
|
||||
|
||||
for($i=0; $i<20; $i++){
|
||||
|
||||
$key .= $chars[random_int(0, $c)];
|
||||
}
|
||||
|
||||
apcu_inc($key, 1, $stupid, 86400);
|
||||
|
||||
setcookie(
|
||||
"pass",
|
||||
$key,
|
||||
[
|
||||
"expires" => time() + 86400, // expires in 24 hours
|
||||
"samesite" => "Strict",
|
||||
"path" => "/"
|
||||
]
|
||||
);
|
||||
|
||||
$frontend->loadheader(
|
||||
$get,
|
||||
$filters,
|
||||
$page
|
||||
);
|
||||
return;
|
||||
|
||||
}else{
|
||||
|
||||
$error = "<div class=\"quote\">You were <a href=\"https://www.youtube.com/watch?v=e1d7fkQx2rk\" target=\"_BLANK\" rel=\"noreferrer nofollow\">kicked out of Mensa.</a> Please try again.</div>";
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Generate random grid data to pass to captcha.php
|
||||
*/
|
||||
$dataset = [
|
||||
["birds", 2263],
|
||||
["fumo_plushies", 1006],
|
||||
["minecraft", 848]
|
||||
];
|
||||
|
||||
// get the positions for the answers
|
||||
// will return between 3 and 6 answer positions
|
||||
$range = range(0, 15);
|
||||
$answer_pos = [];
|
||||
|
||||
array_splice($range, 0, 1);
|
||||
|
||||
for($i=0; $i<random_int(3, 6); $i++){
|
||||
|
||||
$answer_pos_tmp =
|
||||
array_splice(
|
||||
$range,
|
||||
random_int(
|
||||
0,
|
||||
14 - $i
|
||||
),
|
||||
1
|
||||
);
|
||||
|
||||
$answer_pos[] = $answer_pos_tmp[0];
|
||||
}
|
||||
|
||||
// choose a dataset
|
||||
$choosen = &$dataset[random_int(0, count($dataset) - 1)];
|
||||
$choices = [];
|
||||
|
||||
for($i=0; $i<count($dataset); $i++){
|
||||
|
||||
if($dataset[$i][0] == $choosen[0]){
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$choices[] = $dataset[$i];
|
||||
}
|
||||
|
||||
// generate grid data
|
||||
$grid = [];
|
||||
|
||||
for($i=0; $i<16; $i++){
|
||||
|
||||
if(in_array($i, $answer_pos)){
|
||||
|
||||
$grid[] = $choosen;
|
||||
}else{
|
||||
|
||||
$grid[] = $choices[random_int(0, count($choices) - 1)];
|
||||
}
|
||||
}
|
||||
|
||||
$key = "c." . apcu_inc("captcha_gen", 1) . "." . random_int(0, 100000000);
|
||||
|
||||
apcu_store(
|
||||
$key,
|
||||
[
|
||||
$grid,
|
||||
count($answer_pos),
|
||||
$choosen[0],
|
||||
false // has captcha been generated?
|
||||
],
|
||||
120 // we give user 2 minutes to get captcha, in case of network error
|
||||
);
|
||||
|
||||
$payload = [
|
||||
"class" => "",
|
||||
"right-left" => "",
|
||||
"right-right" => "",
|
||||
"left" =>
|
||||
'<div class="infobox">' .
|
||||
'<h1>IQ test</h1>' .
|
||||
'Due to getting hit with 20,000 bot requests per day, I had to put this up. Sorry.<br><br>' .
|
||||
'Solving this captcha will allow you to make 100 searches today. I will add a way for legit users to bypass the captcha later. Sorry /g/tards!!' .
|
||||
$error .
|
||||
'<form method="POST" enctype="text/plain" autocomplete="off">' .
|
||||
'<div class="captcha-wrapper">' .
|
||||
'<div class="captcha">' .
|
||||
'<img src="captcha.php?k=' . $key . '" alt="Captcha image">' .
|
||||
'<div class="captcha-controls">' .
|
||||
'<input type="checkbox" name="c[0]" id="c0">' .
|
||||
'<label for="c0"></label>' .
|
||||
'<input type="checkbox" name="c[1]" id="c1">' .
|
||||
'<label for="c1"></label>' .
|
||||
'<input type="checkbox" name="c[2]" id="c2">' .
|
||||
'<label for="c2"></label>' .
|
||||
'<input type="checkbox" name="c[3]" id="c3">' .
|
||||
'<label for="c3"></label>' .
|
||||
'<input type="checkbox" name="c[4]" id="c4">' .
|
||||
'<label for="c4"></label>' .
|
||||
'<input type="checkbox" name="c[5]" id="c5">' .
|
||||
'<label for="c5"></label>' .
|
||||
'<input type="checkbox" name="c[6]" id="c6">' .
|
||||
'<label for="c6"></label>' .
|
||||
'<input type="checkbox" name="c[7]" id="c7">' .
|
||||
'<label for="c7"></label>' .
|
||||
'<input type="checkbox" name="c[8]" id="c8">' .
|
||||
'<label for="c8"></label>' .
|
||||
'<input type="checkbox" name="c[9]" id="c9">' .
|
||||
'<label for="c9"></label>' .
|
||||
'<input type="checkbox" name="c[10]" id="c10">' .
|
||||
'<label for="c10"></label>' .
|
||||
'<input type="checkbox" name="c[11]" id="c11">' .
|
||||
'<label for="c11"></label>' .
|
||||
'<input type="checkbox" name="c[12]" id="c12">' .
|
||||
'<label for="c12"></label>' .
|
||||
'<input type="checkbox" name="c[13]" id="c13">' .
|
||||
'<label for="c13"></label>' .
|
||||
'<input type="checkbox" name="c[14]" id="c14">' .
|
||||
'<label for="c14"></label>' .
|
||||
'<input type="checkbox" name="c[15]" id="c15">' .
|
||||
'<label for="c15"></label>' .
|
||||
'</div>' .
|
||||
'</div>' .
|
||||
'</div>' .
|
||||
'<input type="hidden" name="k" value="' . $key . '">' .
|
||||
'<input type="submit" value="Check IQ" class="captcha-submit">' .
|
||||
'</form>' .
|
||||
'</div>'
|
||||
];
|
||||
|
||||
http_response_code(429); // too many reqs
|
||||
$frontend->loadheader(
|
||||
$get,
|
||||
$filters,
|
||||
"web"
|
||||
);
|
||||
|
||||
echo $frontend->load("search.html", $payload);
|
||||
die();
|
||||
}
|
||||
}
|
|
@ -127,6 +127,11 @@ class proxy{
|
|||
throw new Exception("Too many redirects");
|
||||
}
|
||||
|
||||
if($url == "https://i.imgur.com/removed.png"){
|
||||
|
||||
throw new Exception("Encountered imgur 404");
|
||||
}
|
||||
|
||||
// sanitize URL
|
||||
if($this->validateurl($url) === false){
|
||||
|
||||
|
|
|
@ -901,7 +901,11 @@ class frontend{
|
|||
"ddg" => "DuckDuckGo",
|
||||
"yandex" => "Yandex",
|
||||
"brave" => "Brave",
|
||||
"google" => "Google"
|
||||
"google" => "Google",
|
||||
"yep" => "Yep",
|
||||
//"pinterest" => "Pinterest",
|
||||
"imgur" => "Imgur",
|
||||
"ftm" => "FindThatMeme"
|
||||
]
|
||||
];
|
||||
break;
|
||||
|
@ -1011,10 +1015,30 @@ class frontend{
|
|||
$lib = new wiby();
|
||||
break;
|
||||
|
||||
case "yep":
|
||||
include "scraper/yep.php";
|
||||
$lib = new yep();
|
||||
break;
|
||||
|
||||
case "sc":
|
||||
include "scraper/sc.php";
|
||||
$lib = new sc();
|
||||
break;
|
||||
|
||||
case "pinterest":
|
||||
include "scraper/pinterest.php";
|
||||
$lib = new pinterest();
|
||||
break;
|
||||
|
||||
case "imgur":
|
||||
include "scraper/imgur.php";
|
||||
$lib = new imgur();
|
||||
break;
|
||||
|
||||
case "ftm":
|
||||
include "scraper/ftm.php";
|
||||
$lib = new ftm();
|
||||
break;
|
||||
}
|
||||
|
||||
// set scraper on $_GET
|
||||
|
|
|
@ -26,7 +26,7 @@ class nextpage{
|
|||
apcu_store(
|
||||
$page . "." .
|
||||
$this->scraper .
|
||||
(string)($key),
|
||||
(string)$key,
|
||||
gzdeflate($salt.$iv.$out.$tag),
|
||||
900 // cache information for 15 minutes blaze it
|
||||
);
|
||||
|
|
10
music.php
10
music.php
|
@ -10,11 +10,11 @@ $frontend = new frontend();
|
|||
|
||||
$get = $frontend->parsegetfilters($_GET, $filters);
|
||||
|
||||
$frontend->loadheader(
|
||||
$get,
|
||||
$filters,
|
||||
"music"
|
||||
);
|
||||
/*
|
||||
Captcha
|
||||
*/
|
||||
include "lib/captcha_gen.php";
|
||||
new captcha($frontend, $get, $filters, "music", true);
|
||||
|
||||
$payload = [
|
||||
"class" => "",
|
||||
|
|
10
news.php
10
news.php
|
@ -10,11 +10,11 @@ $frontend = new frontend();
|
|||
|
||||
$get = $frontend->parsegetfilters($_GET, $filters);
|
||||
|
||||
$frontend->loadheader(
|
||||
$get,
|
||||
$filters,
|
||||
"news"
|
||||
);
|
||||
/*
|
||||
Captcha
|
||||
*/
|
||||
include "lib/captcha_gen.php";
|
||||
new captcha($frontend, $get, $filters, "news", true);
|
||||
|
||||
$payload = [
|
||||
"class" => "",
|
||||
|
|
148
scraper/ftm.php
Normal file
148
scraper/ftm.php
Normal file
|
@ -0,0 +1,148 @@
|
|||
<?php
|
||||
|
||||
class ftm{
|
||||
|
||||
public function __construct(){
|
||||
|
||||
include "lib/nextpage.php";
|
||||
$this->nextpage = new nextpage("ftm");
|
||||
}
|
||||
|
||||
public function getfilters($page){
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
private function get($url, $search, $offset){
|
||||
|
||||
$curlproc = curl_init();
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_URL, $url);
|
||||
|
||||
$payload =
|
||||
json_encode(
|
||||
[
|
||||
"search" => $search,
|
||||
"offset" => $offset
|
||||
]
|
||||
);
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_ENCODING, ""); // default encoding
|
||||
curl_setopt($curlproc, CURLOPT_HTTPHEADER,
|
||||
["User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/110.0",
|
||||
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
|
||||
"Accept-Language: en-US,en;q=0.5",
|
||||
"Accept-Encoding: gzip",
|
||||
"Content-Length: " . strlen($payload),
|
||||
"Content-Type: application/json",
|
||||
"DNT: 1",
|
||||
"Connection: keep-alive",
|
||||
"Origin: https://findthatmeme.com",
|
||||
"Referer: https://findthatmeme.com/?search=" . urlencode($search),
|
||||
"Upgrade-Insecure-Requests: 1",
|
||||
"Sec-Fetch-Dest: document",
|
||||
"Sec-Fetch-Mode: navigate",
|
||||
"Sec-Fetch-Site: none",
|
||||
"Sec-Fetch-User: ?1",
|
||||
"X-Auth-Key: undefined",
|
||||
"X-CSRF-Validation-Header: true"]
|
||||
);
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_POST, true);
|
||||
curl_setopt($curlproc, CURLOPT_POSTFIELDS, $payload);
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($curlproc, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
curl_setopt($curlproc, CURLOPT_SSL_VERIFYPEER, true);
|
||||
curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30);
|
||||
curl_setopt($curlproc, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
$data = curl_exec($curlproc);
|
||||
|
||||
if(curl_errno($curlproc)){
|
||||
|
||||
throw new Exception(curl_error($curlproc));
|
||||
}
|
||||
|
||||
curl_close($curlproc);
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function image($get){
|
||||
|
||||
$search = $get["s"];
|
||||
|
||||
$out = [
|
||||
"status" => "ok",
|
||||
"npt" => null,
|
||||
"image" => []
|
||||
];
|
||||
|
||||
if($get["npt"]){
|
||||
|
||||
$count = (int)$this->nextpage->get($get["npt"], "images");
|
||||
}else{
|
||||
|
||||
$count = 0;
|
||||
}
|
||||
|
||||
try{
|
||||
$json =
|
||||
json_decode(
|
||||
$this->get(
|
||||
"https://findthatmeme.com/api/v1/search",
|
||||
$search,
|
||||
$count
|
||||
),
|
||||
true
|
||||
);
|
||||
|
||||
}catch(Exception $error){
|
||||
|
||||
throw new Exception("Failed to fetch JSON");
|
||||
}
|
||||
|
||||
if($json === null){
|
||||
|
||||
throw new Exception("Failed to decode JSON");
|
||||
}
|
||||
|
||||
foreach($json as $item){
|
||||
|
||||
$count++;
|
||||
|
||||
if($item["type"] == "VIDEO"){
|
||||
|
||||
$thumb = "thumb/" . $item["thumbnail"];
|
||||
}else{
|
||||
|
||||
$thumb = $item["image_path"];
|
||||
}
|
||||
|
||||
$out["image"][] = [
|
||||
"title" => date("jS \of F Y @ g:ia", strtotime($item["created_at"])),
|
||||
"source" => [
|
||||
[
|
||||
"url" =>
|
||||
"https://findthatmeme.us-southeast-1.linodeobjects.com/" .
|
||||
$thumb,
|
||||
"width" => null,
|
||||
"height" => null
|
||||
]
|
||||
],
|
||||
"url" => $item["source_page_url"]
|
||||
];
|
||||
}
|
||||
|
||||
if($count === 50){
|
||||
|
||||
$out["npt"] =
|
||||
$this->nextpage->store(
|
||||
$count,
|
||||
"images"
|
||||
);
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
}
|
249
scraper/imgur.php
Normal file
249
scraper/imgur.php
Normal file
|
@ -0,0 +1,249 @@
|
|||
<?php
|
||||
|
||||
class imgur{
|
||||
|
||||
public function __construct(){
|
||||
|
||||
include "lib/nextpage.php";
|
||||
$this->nextpage = new nextpage("imgur");
|
||||
|
||||
include "lib/fuckhtml.php";
|
||||
$this->fuckhtml = new fuckhtml();
|
||||
}
|
||||
|
||||
public function getfilters($page){
|
||||
|
||||
return [
|
||||
"sort" => [ // /score/
|
||||
"display" => "Sort by",
|
||||
"option" => [
|
||||
"score" => "Highest scoring",
|
||||
"relevance" => "Most relevant",
|
||||
"time" => "Newest first"
|
||||
]
|
||||
],
|
||||
"time" => [ // /score/day/
|
||||
"display" => "Time posted",
|
||||
"option" => [
|
||||
"all" => "All time",
|
||||
"day" => "Today",
|
||||
"week" => "This week",
|
||||
"month" => "This month",
|
||||
"year" => "This year"
|
||||
]
|
||||
],
|
||||
"format" => [ // q_type
|
||||
"display" => "Format",
|
||||
"option" => [
|
||||
"any" => "Any format",
|
||||
"jpg" => "JPG",
|
||||
"png" => "PNG",
|
||||
"gif" => "GIF",
|
||||
"anigif" => "Animated GIF",
|
||||
"album" => "Albums"
|
||||
]
|
||||
],
|
||||
"size" => [ // q_size_px
|
||||
"display" => "Size",
|
||||
"option" => [
|
||||
"any" => "Any size",
|
||||
"small" => "Small (500px or less)",
|
||||
"med" => "Medium (500px to 2000px)",
|
||||
"big" => "Big (2000px to 5000px)",
|
||||
"lrg" => "Large (5000px to 10000px)",
|
||||
"huge" => "Huge (10000px and above)"
|
||||
]
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
private function get($url, $get = []){
|
||||
|
||||
$curlproc = curl_init();
|
||||
|
||||
if($get !== []){
|
||||
$get = http_build_query($get);
|
||||
$url .= "?scrolled&" . $get;
|
||||
}
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_URL, $url);
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_ENCODING, ""); // default encoding
|
||||
curl_setopt($curlproc, CURLOPT_HTTPHEADER,
|
||||
["User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/110.0",
|
||||
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
|
||||
"Accept-Language: en-US,en;q=0.5",
|
||||
"Accept-Encoding: gzip",
|
||||
"DNT: 1",
|
||||
"Referer: https://imgur.com/search/",
|
||||
"Connection: keep-alive",
|
||||
"Sec-Fetch-Dest: empty",
|
||||
"Sec-Fetch-Mode: cors",
|
||||
"Sec-Fetch-Site: same-origin",
|
||||
"TE: trailers",
|
||||
"X-Requested-With: XMLHttpRequest"]
|
||||
);
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($curlproc, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
curl_setopt($curlproc, CURLOPT_SSL_VERIFYPEER, true);
|
||||
curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30);
|
||||
curl_setopt($curlproc, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
$data = curl_exec($curlproc);
|
||||
|
||||
if(curl_errno($curlproc)){
|
||||
|
||||
throw new Exception(curl_error($curlproc));
|
||||
}
|
||||
|
||||
curl_close($curlproc);
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function image($get){
|
||||
|
||||
if($get["npt"]){
|
||||
|
||||
$filter =
|
||||
json_decode(
|
||||
$this->nextpage->get(
|
||||
$get["npt"],
|
||||
"images"
|
||||
),
|
||||
true
|
||||
);
|
||||
|
||||
$search = $filter["s"];
|
||||
unset($filter["s"]);
|
||||
|
||||
$sort = $filter["sort"];
|
||||
unset($filter["sort"]);
|
||||
|
||||
$time = $filter["time"];
|
||||
unset($filter["time"]);
|
||||
|
||||
$format = $filter["format"];
|
||||
unset($filter["format"]);
|
||||
|
||||
$size = $filter["size"];
|
||||
unset($filter["size"]);
|
||||
|
||||
$page = $filter["page"];
|
||||
unset($filter["page"]);
|
||||
}else{
|
||||
|
||||
$search = $get["s"];
|
||||
$sort = $get["sort"];
|
||||
$time = $get["time"];
|
||||
$format = $get["format"];
|
||||
$size = $get["size"];
|
||||
$page = 0;
|
||||
|
||||
$filter = [
|
||||
"q" => $search
|
||||
];
|
||||
|
||||
if($format != "any"){
|
||||
|
||||
$filter["q_type"] = $format;
|
||||
}
|
||||
|
||||
if($size != "any"){
|
||||
|
||||
$filter["q_size_px"] = $size;
|
||||
$filter["q_size_is_mpx"] = "off";
|
||||
}
|
||||
}
|
||||
|
||||
$out = [
|
||||
"status" => "ok",
|
||||
"npt" => null,
|
||||
"image" => []
|
||||
];
|
||||
|
||||
try{
|
||||
$html =
|
||||
$this->get(
|
||||
"https://imgur.com/search/$sort/$time/page/$page",
|
||||
$filter
|
||||
);
|
||||
|
||||
}catch(Exception $error){
|
||||
|
||||
throw new Exception("Failed to fetch HTML");
|
||||
}
|
||||
|
||||
$this->fuckhtml->load($html);
|
||||
|
||||
$posts =
|
||||
$this->fuckhtml
|
||||
->getElementsByClassName(
|
||||
"post",
|
||||
"div"
|
||||
);
|
||||
|
||||
foreach($posts as $post){
|
||||
|
||||
$this->fuckhtml->load($post);
|
||||
|
||||
$image =
|
||||
$this->fuckhtml
|
||||
->getElementsByTagName("img")[0];
|
||||
|
||||
$image_url = "https:" . substr($this->fuckhtml->getTextContent($image["attributes"]["src"]), 0, -5);
|
||||
|
||||
$out["image"][] = [
|
||||
"title" =>
|
||||
$this->fuckhtml
|
||||
->getTextContent(
|
||||
$image["attributes"]["alt"]
|
||||
),
|
||||
"source" => [
|
||||
[
|
||||
"url" => $image_url . ".jpg",
|
||||
"width" => null,
|
||||
"height" => null
|
||||
],
|
||||
[
|
||||
"url" => $image_url . "m.jpg",
|
||||
"width" => null,
|
||||
"height" => null
|
||||
]
|
||||
],
|
||||
"url" =>
|
||||
"https://imgur.com" .
|
||||
$this->fuckhtml
|
||||
->getTextContent(
|
||||
$this->fuckhtml
|
||||
->getElementsByClassName(
|
||||
"image-list-link",
|
||||
"a"
|
||||
)
|
||||
[0]
|
||||
["attributes"]
|
||||
["href"]
|
||||
)
|
||||
];
|
||||
}
|
||||
|
||||
if(isset($out["image"][0])){
|
||||
|
||||
// store nextpage
|
||||
$filter["s"] = $search;
|
||||
$filter["sort"] = $sort;
|
||||
$filter["time"] = $time;
|
||||
$filter["format"] = $format;
|
||||
$filter["size"] = $size;
|
||||
$filter["page"] = $page + 1;
|
||||
|
||||
$out["npt"] =
|
||||
$this->nextpage->store(
|
||||
json_encode($filter),
|
||||
"images"
|
||||
);
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
}
|
224
scraper/pinterest.php
Normal file
224
scraper/pinterest.php
Normal file
|
@ -0,0 +1,224 @@
|
|||
<?php
|
||||
|
||||
class pinterest{
|
||||
|
||||
public function __construct(){
|
||||
|
||||
include "lib/nextpage.php";
|
||||
$this->nextpage = new nextpage("pinterest");
|
||||
}
|
||||
|
||||
public function getfilters($page){
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
private function get($url, $get = []){
|
||||
|
||||
$curlproc = curl_init();
|
||||
|
||||
if($get !== []){
|
||||
$get = http_build_query($get);
|
||||
$url .= "?" . $get;
|
||||
}
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_URL, $url);
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_ENCODING, ""); // default encoding
|
||||
curl_setopt($curlproc, CURLOPT_HTTPHEADER,
|
||||
["User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/110.0",
|
||||
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
|
||||
"Accept-Language: en-US,en;q=0.5",
|
||||
"Accept-Encoding: gzip",
|
||||
"DNT: 1",
|
||||
"Connection: keep-alive",
|
||||
"Upgrade-Insecure-Requests: 1",
|
||||
"Sec-Fetch-Dest: document",
|
||||
"Sec-Fetch-Mode: navigate",
|
||||
"Sec-Fetch-Site: none",
|
||||
"Sec-Fetch-User: ?1"]
|
||||
);
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($curlproc, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
curl_setopt($curlproc, CURLOPT_SSL_VERIFYPEER, true);
|
||||
curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30);
|
||||
curl_setopt($curlproc, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
$data = curl_exec($curlproc);
|
||||
|
||||
if(curl_errno($curlproc)){
|
||||
|
||||
throw new Exception(curl_error($curlproc));
|
||||
}
|
||||
|
||||
curl_close($curlproc);
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function image($get){
|
||||
|
||||
$search = $get["s"];
|
||||
|
||||
$out = [
|
||||
"status" => "ok",
|
||||
"npt" => null,
|
||||
"image" => []
|
||||
];
|
||||
|
||||
$filter = [
|
||||
"source_url" => "/search/pins/?q=" . urlencode($search),
|
||||
"rs" => "typed",
|
||||
"data" =>
|
||||
json_encode(
|
||||
[
|
||||
"options" => [
|
||||
"article" => null,
|
||||
"applied_filters" => null,
|
||||
"appliedProductFilters" => "---",
|
||||
"auto_correction_disabled" => false,
|
||||
"corpus" => null,
|
||||
"customized_rerank_type" => null,
|
||||
"filters" => null,
|
||||
"query" => $search,
|
||||
"query_pin_sigs" => null,
|
||||
"redux_normalize_feed" => true,
|
||||
"rs" => "typed",
|
||||
"scope" => "pins", // pins, boards, videos,
|
||||
"source_id" => null
|
||||
],
|
||||
"context" => []
|
||||
]
|
||||
),
|
||||
"_" => substr(str_replace(".", "", (string)microtime(true)), 0, -1)
|
||||
];
|
||||
|
||||
try{
|
||||
$json =
|
||||
json_decode(
|
||||
$this->get(
|
||||
"https://www.pinterest.ca/resource/BaseSearchResource/get/",
|
||||
$filter
|
||||
),
|
||||
true
|
||||
);
|
||||
|
||||
}catch(Exception $error){
|
||||
|
||||
throw new Exception("Failed to fetch JSON");
|
||||
}
|
||||
|
||||
if($json === null){
|
||||
|
||||
throw new Exception("Failed to decode JSON");
|
||||
}
|
||||
|
||||
//print_r($json);
|
||||
|
||||
foreach(
|
||||
$json
|
||||
["resource_response"]
|
||||
["data"]
|
||||
["results"]
|
||||
as $item
|
||||
){
|
||||
|
||||
switch($item["type"]){
|
||||
|
||||
case "pin":
|
||||
|
||||
/*
|
||||
Handle image object
|
||||
*/
|
||||
$images = array_values($item["images"]);
|
||||
$image = &$images[count($images) - 1]; // original
|
||||
$thumb = &$images[1]; // 236x
|
||||
|
||||
$title = [];
|
||||
|
||||
if(
|
||||
isset($item["grid_title"]) &&
|
||||
trim($item["grid_title"]) != ""
|
||||
){
|
||||
|
||||
$title[] = $item["grid_title"];
|
||||
}
|
||||
|
||||
if(
|
||||
isset($item["description"]) &&
|
||||
trim($item["description"]) != ""
|
||||
){
|
||||
|
||||
$title[] = $item["description"];
|
||||
}
|
||||
|
||||
$title = implode(": ", $title);
|
||||
|
||||
if(
|
||||
$title == "" &&
|
||||
isset($item["board"]["name"]) &&
|
||||
trim($item["board"]["name"]) != ""
|
||||
){
|
||||
|
||||
$title = $item["board"]["name"];
|
||||
}
|
||||
|
||||
if($title == ""){
|
||||
|
||||
$title = null;
|
||||
}
|
||||
|
||||
$out["image"][] = [
|
||||
"title" => $title,
|
||||
"source" => [
|
||||
[
|
||||
"url" => $image["url"],
|
||||
"width" => (int)$image["width"],
|
||||
"height" => (int)$image["height"]
|
||||
],
|
||||
[
|
||||
"url" => $thumb["url"],
|
||||
"width" => (int)$thumb["width"],
|
||||
"height" => (int)$thumb["height"]
|
||||
]
|
||||
],
|
||||
"url" => "https://www.pinterest.com/pin/" . $item["id"]
|
||||
];
|
||||
break;
|
||||
|
||||
case "board":
|
||||
|
||||
if(isset($item["cover_pin"]["image_url"])){
|
||||
|
||||
$image = [
|
||||
"url" => $item["cover_pin"]["image_url"],
|
||||
"width" => (int)$item["cover_pin"]["size"][0],
|
||||
"height" => (int)$item["cover_pin"]["size"][1]
|
||||
];
|
||||
}elseif(isset($item["image_cover_url_hd"])){
|
||||
/*
|
||||
$image = [
|
||||
"url" =>
|
||||
"width" => null,
|
||||
"height" => null
|
||||
];*/
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
private function getfullresimage($image, $has_og){
|
||||
|
||||
$has_og = $has_og ? "1200x" : "originals";
|
||||
|
||||
return
|
||||
preg_replace(
|
||||
'/https:\/\/i\.pinimg\.com\/[^\/]+\//',
|
||||
"https://i.pinimg.com/" . $has_og . "/",
|
||||
$image
|
||||
);
|
||||
}
|
||||
}
|
370
scraper/yep.php
Normal file
370
scraper/yep.php
Normal file
|
@ -0,0 +1,370 @@
|
|||
<?php
|
||||
|
||||
class yep{
|
||||
|
||||
public function __construct(){
|
||||
|
||||
include "lib/nextpage.php";
|
||||
$this->nextpage = new nextpage("yep");
|
||||
}
|
||||
|
||||
public function getfilters($page){
|
||||
|
||||
return [
|
||||
"country" => [
|
||||
"display" => "Country",
|
||||
"option" => [
|
||||
"all" => "All regions",
|
||||
"af" => "Afghanistan",
|
||||
"al" => "Albania",
|
||||
"dz" => "Algeria",
|
||||
"as" => "American Samoa",
|
||||
"ad" => "Andorra",
|
||||
"ao" => "Angola",
|
||||
"ai" => "Anguilla",
|
||||
"ag" => "Antigua and Barbuda",
|
||||
"ar" => "Argentina",
|
||||
"am" => "Armenia",
|
||||
"aw" => "Aruba",
|
||||
"au" => "Australia",
|
||||
"at" => "Austria",
|
||||
"az" => "Azerbaijan",
|
||||
"bs" => "Bahamas",
|
||||
"bh" => "Bahrain",
|
||||
"bd" => "Bangladesh",
|
||||
"bb" => "Barbados",
|
||||
"by" => "Belarus",
|
||||
"be" => "Belgium",
|
||||
"bz" => "Belize",
|
||||
"bj" => "Benin",
|
||||
"bt" => "Bhutan",
|
||||
"bo" => "Bolivia",
|
||||
"ba" => "Bosnia and Herzegovina",
|
||||
"bw" => "Botswana",
|
||||
"br" => "Brazil",
|
||||
"bn" => "Brunei Darussalam",
|
||||
"bg" => "Bulgaria",
|
||||
"bf" => "Burkina Faso",
|
||||
"bi" => "Burundi",
|
||||
"cv" => "Cabo Verde",
|
||||
"kh" => "Cambodia",
|
||||
"cm" => "Cameroon",
|
||||
"ca" => "Canada",
|
||||
"ky" => "Cayman Islands",
|
||||
"cf" => "Central African Republic",
|
||||
"td" => "Chad",
|
||||
"cl" => "Chile",
|
||||
"cn" => "China",
|
||||
"co" => "Colombia",
|
||||
"cg" => "Congo",
|
||||
"cd" => "Congo, Democratic Republic",
|
||||
"ck" => "Cook Islands",
|
||||
"cr" => "Costa Rica",
|
||||
"hr" => "Croatia",
|
||||
"cu" => "Cuba",
|
||||
"cy" => "Cyprus",
|
||||
"cz" => "Czechia",
|
||||
"ci" => "Côte d'Ivoire",
|
||||
"dk" => "Denmark",
|
||||
"dj" => "Djibouti",
|
||||
"dm" => "Dominica",
|
||||
"do" => "Dominican Republic",
|
||||
"ec" => "Ecuador",
|
||||
"eg" => "Egypt",
|
||||
"sv" => "El Salvador",
|
||||
"gq" => "Equatorial Guinea",
|
||||
"ee" => "Estonia",
|
||||
"et" => "Ethiopia",
|
||||
"fo" => "Faroe Islands",
|
||||
"fj" => "Fiji",
|
||||
"fi" => "Finland",
|
||||
"fr" => "France",
|
||||
"gf" => "French Guiana",
|
||||
"pf" => "French Polynesia",
|
||||
"ga" => "Gabon",
|
||||
"gm" => "Gambia",
|
||||
"ge" => "Georgia",
|
||||
"de" => "Germany",
|
||||
"gh" => "Ghana",
|
||||
"gi" => "Gibraltar",
|
||||
"gr" => "Greece",
|
||||
"gl" => "Greenland",
|
||||
"gd" => "Grenada",
|
||||
"gp" => "Guadeloupe",
|
||||
"gu" => "Guam",
|
||||
"gt" => "Guatemala",
|
||||
"gg" => "Guernsey",
|
||||
"gn" => "Guinea",
|
||||
"gy" => "Guyana",
|
||||
"ht" => "Haiti",
|
||||
"hn" => "Honduras",
|
||||
"hk" => "Hong Kong",
|
||||
"hu" => "Hungary",
|
||||
"is" => "Iceland",
|
||||
"in" => "India",
|
||||
"id" => "Indonesia",
|
||||
"iq" => "Iraq",
|
||||
"ie" => "Ireland",
|
||||
"im" => "Isle of Man",
|
||||
"il" => "Israel",
|
||||
"it" => "Italy",
|
||||
"jm" => "Jamaica",
|
||||
"jp" => "Japan",
|
||||
"je" => "Jersey",
|
||||
"jo" => "Jordan",
|
||||
"kz" => "Kazakhstan",
|
||||
"ke" => "Kenya",
|
||||
"ki" => "Kiribati",
|
||||
"kw" => "Kuwait",
|
||||
"kg" => "Kyrgyzstan",
|
||||
"la" => "Lao People's Democratic Republic",
|
||||
"lv" => "Latvia",
|
||||
"lb" => "Lebanon",
|
||||
"ls" => "Lesotho",
|
||||
"ly" => "Libya",
|
||||
"li" => "Liechtenstein",
|
||||
"lt" => "Lithuania",
|
||||
"lu" => "Luxembourg",
|
||||
"mk" => "Macedonia",
|
||||
"mg" => "Madagascar",
|
||||
"mw" => "Malawi",
|
||||
"my" => "Malaysia",
|
||||
"mv" => "Maldives",
|
||||
"ml" => "Mali",
|
||||
"mt" => "Malta",
|
||||
"mq" => "Martinique",
|
||||
"mr" => "Mauritania",
|
||||
"mu" => "Mauritius",
|
||||
"yt" => "Mayotte",
|
||||
"mx" => "Mexico",
|
||||
"fm" => "Micronesia, Federated States of",
|
||||
"md" => "Moldova",
|
||||
"mc" => "Monaco",
|
||||
"mn" => "Mongolia",
|
||||
"me" => "Montenegro",
|
||||
"ms" => "Montserrat",
|
||||
"ma" => "Morocco",
|
||||
"mz" => "Mozambique",
|
||||
"mm" => "Myanmar",
|
||||
"na" => "Namibia",
|
||||
"nr" => "Nauru",
|
||||
"np" => "Nepal",
|
||||
"nl" => "Netherlands",
|
||||
"nc" => "New Caledonia",
|
||||
"nz" => "New Zealand",
|
||||
"ni" => "Nicaragua",
|
||||
"ne" => "Niger",
|
||||
"ng" => "Nigeria",
|
||||
"nu" => "Niue",
|
||||
"no" => "Norway",
|
||||
"om" => "Oman",
|
||||
"pk" => "Pakistan",
|
||||
"ps" => "Palestine, State of",
|
||||
"pa" => "Panama",
|
||||
"pg" => "Papua New Guinea",
|
||||
"py" => "Paraguay",
|
||||
"pe" => "Peru",
|
||||
"ph" => "Philippines",
|
||||
"pn" => "Pitcairn",
|
||||
"pl" => "Poland",
|
||||
"pt" => "Portugal",
|
||||
"pr" => "Puerto Rico",
|
||||
"qa" => "Qatar",
|
||||
"ro" => "Romania",
|
||||
"ru" => "Russian Federation",
|
||||
"rw" => "Rwanda",
|
||||
"re" => "Réunion",
|
||||
"sh" => "Saint Helena",
|
||||
"kn" => "Saint Kitts and Nevis",
|
||||
"lc" => "Saint Lucia",
|
||||
"vc" => "Saint Vincent and the Grenadines",
|
||||
"ws" => "Samoa",
|
||||
"sm" => "San Marino",
|
||||
"st" => "Sao Tome and Principe",
|
||||
"sa" => "Saudi Arabia",
|
||||
"sn" => "Senegal",
|
||||
"rs" => "Serbia",
|
||||
"sc" => "Seychelles",
|
||||
"sl" => "Sierra Leone",
|
||||
"sg" => "Singapore",
|
||||
"sk" => "Slovakia",
|
||||
"si" => "Slovenia",
|
||||
"sb" => "Solomon Islands",
|
||||
"so" => "Somalia",
|
||||
"kr" => "Sourth Korea",
|
||||
"za" => "South Africa",
|
||||
"es" => "Spain",
|
||||
"lk" => "Sri Lanka",
|
||||
"sr" => "Suriname",
|
||||
"se" => "Sweden",
|
||||
"ch" => "Switzerland",
|
||||
"tw" => "Taiwan",
|
||||
"tj" => "Tajikistan",
|
||||
"tz" => "Tanzania",
|
||||
"th" => "Thailand",
|
||||
"tl" => "Timor-Leste",
|
||||
"tg" => "Togo",
|
||||
"tk" => "Tokelau",
|
||||
"to" => "Tonga",
|
||||
"tt" => "Trinidad and Tobago",
|
||||
"tn" => "Tunisia",
|
||||
"tr" => "Turkey",
|
||||
"tm" => "Turkmenistan",
|
||||
"ug" => "Uganda",
|
||||
"ua" => "Ukraine",
|
||||
"ae" => "United Arab Emirates",
|
||||
"gb" => "United Kingdom",
|
||||
"us" => "United States",
|
||||
"uy" => "Uruguay",
|
||||
"uz" => "Uzbekistan",
|
||||
"vu" => "Vanuatu",
|
||||
"ve" => "Venezuela",
|
||||
"vn" => "Vietnam",
|
||||
"vg" => "Virgin Islands, British",
|
||||
"vi" => "Virgin Islands, U.S.",
|
||||
"ye" => "Yemen",
|
||||
"zm" => "Zambia",
|
||||
"zw" => "Zimbabwe"
|
||||
]
|
||||
],
|
||||
"nsfw" => [
|
||||
"display" => "NSFW",
|
||||
"option" => [
|
||||
"yes" => "Yes",
|
||||
"maybe" => "Maybe",
|
||||
"no" => "No"
|
||||
]
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
private function get($url, $get = []){
|
||||
|
||||
$curlproc = curl_init();
|
||||
|
||||
if($get !== []){
|
||||
$get = http_build_query($get);
|
||||
$url .= "?" . $get;
|
||||
}
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_URL, $url);
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_ENCODING, ""); // default encoding
|
||||
curl_setopt($curlproc, CURLOPT_HTTPHEADER,
|
||||
["User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/110.0",
|
||||
"Accept: */*",
|
||||
"Accept-Language: en-US,en;q=0.5",
|
||||
"Accept-Encoding: gzip",
|
||||
"DNT: 1",
|
||||
"Origin: https://yep.com",
|
||||
"Referer: https://yep.com/",
|
||||
"Connection: keep-alive",
|
||||
"Sec-Fetch-Dest: empty",
|
||||
"Sec-Fetch-Mode: cors",
|
||||
"Sec-Fetch-Site: same-site"]
|
||||
);
|
||||
|
||||
curl_setopt($curlproc, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($curlproc, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
curl_setopt($curlproc, CURLOPT_SSL_VERIFYPEER, true);
|
||||
curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30);
|
||||
curl_setopt($curlproc, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
$data = curl_exec($curlproc);
|
||||
|
||||
if(curl_errno($curlproc)){
|
||||
|
||||
throw new Exception(curl_error($curlproc));
|
||||
}
|
||||
|
||||
curl_close($curlproc);
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function image($get){
|
||||
|
||||
$search = $get["s"];
|
||||
$country = $get["country"];
|
||||
$nsfw = $get["nsfw"];
|
||||
|
||||
switch($nsfw){
|
||||
|
||||
case "yes": $nsfw = "off"; break;
|
||||
case "maybe": $nsfw = "moderate"; break;
|
||||
case "no": $nsfw = "strict"; break;
|
||||
}
|
||||
|
||||
$out = [
|
||||
"status" => "ok",
|
||||
"npt" => null,
|
||||
"image" => []
|
||||
];
|
||||
|
||||
try{
|
||||
|
||||
$json =
|
||||
json_decode(
|
||||
$this->get(
|
||||
"https://api.yep.com/fs/2/search",
|
||||
[
|
||||
"client" => "web",
|
||||
"gl" => $country == "all" ? $country : strtoupper($country),
|
||||
"no_correct" => "false",
|
||||
"q" => $search,
|
||||
"safeSearch" => $nsfw,
|
||||
"type" => "images"
|
||||
]
|
||||
),
|
||||
true
|
||||
);
|
||||
}catch(Exception $error){
|
||||
|
||||
throw new Exception("Failed to fetch JSON");
|
||||
}
|
||||
|
||||
if($json === null){
|
||||
|
||||
throw new Exception("Failed to decode JSON");
|
||||
}
|
||||
|
||||
foreach($json[1]["results"] as $item){
|
||||
|
||||
if(
|
||||
$item["width"] !== 0 &&
|
||||
$item["height"] !== 0
|
||||
){
|
||||
|
||||
$thumb_width = $item["width"] >= 260 ? 260 : $item["width"];
|
||||
$thumb_height = ceil($item["height"] * ($thumb_width / $item["width"]));
|
||||
|
||||
$width = $item["width"];
|
||||
$height = $item["height"];
|
||||
}else{
|
||||
|
||||
$thumb_width = null;
|
||||
$thumb_height = null;
|
||||
$width = null;
|
||||
$height = null;
|
||||
}
|
||||
|
||||
$out["image"][] = [
|
||||
"title" => $item["title"],
|
||||
"source" => [
|
||||
[
|
||||
"url" => $item["image_id"],
|
||||
"width" => $width,
|
||||
"height" => $height
|
||||
],
|
||||
[
|
||||
"url" => $item["src"],
|
||||
"width" => $thumb_width,
|
||||
"height" => $thumb_height
|
||||
]
|
||||
],
|
||||
"url" => $item["host_page"]
|
||||
];
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
}
|
21
settings.php
21
settings.php
|
@ -161,6 +161,22 @@ $settings = [
|
|||
[
|
||||
"value" => "google",
|
||||
"text" => "Google"
|
||||
],
|
||||
[
|
||||
"value" => "yep",
|
||||
"text" => "Yep"
|
||||
],
|
||||
/*[
|
||||
"value" => "pinterest",
|
||||
"text" => "Pinterest"
|
||||
],*/
|
||||
[
|
||||
"value" => "imgur",
|
||||
"text" => "Imgur"
|
||||
],
|
||||
[
|
||||
"value" => "ftm",
|
||||
"text" => "FindThatMeme"
|
||||
]
|
||||
]
|
||||
],
|
||||
|
@ -243,7 +259,7 @@ if($_POST){
|
|||
// refresh cookie dates
|
||||
$loop = &$_COOKIE;
|
||||
}
|
||||
|
||||
|
||||
foreach($loop as $key => $value){
|
||||
|
||||
foreach($settings as $title){
|
||||
|
@ -262,7 +278,8 @@ foreach($loop as $key => $value){
|
|||
"",
|
||||
[
|
||||
"expires" => -1, // removes cookie
|
||||
"samesite" => "Strict"
|
||||
"samesite" => "Strict",
|
||||
"path" => "/"
|
||||
]
|
||||
);
|
||||
|
||||
|
|
|
@ -283,7 +283,79 @@ h3,h4,h5,h6{
|
|||
WEB
|
||||
*/
|
||||
|
||||
/* Left wrapper */
|
||||
/* Captcha */
|
||||
.captcha-wrapper{
|
||||
position:relative;
|
||||
max-width:400px;
|
||||
margin:17px auto 0;
|
||||
border:1px solid var(--928374);
|
||||
}
|
||||
|
||||
.captcha{
|
||||
padding-bottom:100%;
|
||||
padding-top:6.2%;
|
||||
}
|
||||
|
||||
.captcha-wrapper img{
|
||||
position:absolute;
|
||||
top:0;
|
||||
left:0;
|
||||
width:100%;
|
||||
height:100%;
|
||||
}
|
||||
|
||||
.captcha-controls{
|
||||
position:absolute;
|
||||
top:0;
|
||||
left:0;
|
||||
bottom:0;
|
||||
right:0;
|
||||
top:6.3%;
|
||||
}
|
||||
|
||||
.captcha-wrapper img{
|
||||
display:block;
|
||||
background:#282828;
|
||||
}
|
||||
|
||||
.captcha-wrapper input{
|
||||
display:none;
|
||||
}
|
||||
|
||||
.captcha-wrapper label{
|
||||
float:left;
|
||||
width:25%;
|
||||
height:25%;
|
||||
position:relative;
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.captcha-wrapper label:hover{
|
||||
background:rgba(255,255,255,0.2);
|
||||
}
|
||||
|
||||
.captcha-wrapper input:checked + label{
|
||||
background:rgba(0,0,0,0.5);
|
||||
}
|
||||
|
||||
.captcha-wrapper input:checked + label:after{
|
||||
content:"";
|
||||
position:absolute;
|
||||
left:39%;
|
||||
top:29%;
|
||||
width:20%;
|
||||
height:30%;
|
||||
transform:rotate(45deg);
|
||||
border-right:7px solid var(--ebdbb2);
|
||||
border-bottom:7px solid var(--ebdbb2);
|
||||
box-sizing:border-box;
|
||||
}
|
||||
|
||||
.captcha-submit{
|
||||
float:right;
|
||||
margin:12px 0 4px;
|
||||
}
|
||||
|
||||
.web .left{
|
||||
width:40%;
|
||||
float:left;
|
||||
|
@ -294,6 +366,7 @@ h3,h4,h5,h6{
|
|||
border:1px dashed var(--504945);
|
||||
padding:10px;
|
||||
margin-bottom:17px;
|
||||
overflow:hidden;
|
||||
}
|
||||
|
||||
.infobox .code{
|
||||
|
|
10
videos.php
10
videos.php
|
@ -10,11 +10,11 @@ $frontend = new frontend();
|
|||
|
||||
$get = $frontend->parsegetfilters($_GET, $filters);
|
||||
|
||||
$frontend->loadheader(
|
||||
$get,
|
||||
$filters,
|
||||
"videos"
|
||||
);
|
||||
/*
|
||||
Captcha
|
||||
*/
|
||||
include "lib/captcha_gen.php";
|
||||
new captcha($frontend, $get, $filters, "videos", true);
|
||||
|
||||
$payload = [
|
||||
"class" => "",
|
||||
|
|
68
web.php
68
web.php
|
@ -10,11 +10,11 @@ $frontend = new frontend();
|
|||
|
||||
$get = $frontend->parsegetfilters($_GET, $filters);
|
||||
|
||||
$frontend->loadheader(
|
||||
$get,
|
||||
$filters,
|
||||
"web"
|
||||
);
|
||||
/*
|
||||
Captcha
|
||||
*/
|
||||
include "lib/captcha_gen.php";
|
||||
new captcha($frontend, $get, $filters, true);
|
||||
|
||||
$payload = [
|
||||
"class" => "",
|
||||
|
@ -44,6 +44,35 @@ try{
|
|||
die();
|
||||
}
|
||||
|
||||
/*
|
||||
Prepend Oracle output, if applicable
|
||||
*/
|
||||
include("oracles/encoder.php");
|
||||
include("oracles/calc.php");
|
||||
include("oracles/time.php");
|
||||
include("oracles/numerics.php");
|
||||
$oracles = [new calculator(), new encoder(), new time(), new numerics()];
|
||||
$fortune = "";
|
||||
foreach ($oracles as $oracle) {
|
||||
if ($oracle->check_query($_GET["s"])) {
|
||||
$resp = $oracle->generate_response($_GET["s"]);
|
||||
if ($resp != "") {
|
||||
$fortune .= "<div class=\"infobox\">";
|
||||
foreach ($resp as $title => $r) {
|
||||
if ($title) {
|
||||
$fortune .= "<h3>".htmlspecialchars($title)."</h3><div class=\"code\">".htmlspecialchars($r)."</div>";
|
||||
}
|
||||
else {
|
||||
$fortune .= "<i>".$r."</i><br>";
|
||||
}
|
||||
}
|
||||
$fortune .= "<small>Answer provided by oracle: ".$oracle->info["name"]."</small></div>";
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
$payload["left"] = $fortune;
|
||||
|
||||
$answerlen = 0;
|
||||
|
||||
/*
|
||||
|
@ -475,35 +504,6 @@ if($c !== 0){
|
|||
$payload["left"] .= '</table>';
|
||||
}
|
||||
|
||||
/*
|
||||
Prepend Oracle output, if applicable
|
||||
*/
|
||||
include_once("oracles/encoder.php");
|
||||
include_once("oracles/calc.php");
|
||||
include_once("oracles/time.php");
|
||||
include_once("oracles/numerics.php");
|
||||
$oracles = [new calculator(), new encoder(), new time(), new numerics()];
|
||||
$fortune = "";
|
||||
foreach ($oracles as $oracle) {
|
||||
if ($oracle->check_query($_GET["s"])) {
|
||||
$resp = $oracle->generate_response($_GET["s"]);
|
||||
if ($resp != "") {
|
||||
$fortune .= "<div class=\"infobox\">";
|
||||
foreach ($resp as $title => $r) {
|
||||
if ($title) {
|
||||
$fortune .= "<h3>".htmlspecialchars($title)."</h3><div class=\"code\">".htmlspecialchars($r)."</div>";
|
||||
}
|
||||
else {
|
||||
$fortune .= "<i>".$r."</i><br>";
|
||||
}
|
||||
}
|
||||
$fortune .= "<small>Answer provided by oracle: ".$oracle->info["name"]."</small></div>";
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
$payload["left"] = $fortune . $payload["left"];
|
||||
|
||||
/*
|
||||
Load next page
|
||||
*/
|
||||
|
|
Reference in a new issue