Browse Source

Update api.php

Error Handling: Check for cURL errors and handle them gracefully.
Array Creation: Used [] instead of array() and simplified array creation.
Null Coalescing Operator: Used ?? for safer access to possibly undefined properties.
Function Isolation: Split the cURL preparation and search logic into separate functions for clarity.
Consistent Naming: Renamed prepare_search_curl_obj to prepareSearchCurlObj for consistency in naming conventions.
Cristian Cezar Moisés 1 month ago
parent
commit
4448b28491
1 changed files with 52 additions and 84 deletions
  1. 52 84
      api.php

+ 52 - 84
api.php

@@ -1,115 +1,83 @@
 <?php
 
-$query = $_GET['q'];
-
-$bookmark = null;
-if (array_key_exists("bookmark", $_GET)) {
-    $bookmark = urldecode($_GET["bookmark"]);
-}
-
-$csrftoken = null;
-if (array_key_exists("csrftoken", $_GET)) {
-    $csrftoken = $_GET["csrftoken"];
-}
-
-$url = "https://www.pinterest.com/resource/BaseSearchResource/get/";
-
-class SearchResult
-{
-    public $images;
-    public $bookmark;
-}
-
-$header_function = function($ch, $rawheader)
-{
-    global $csrftoken;
-    $len = strlen($rawheader);
-
-    $header = explode(":", $rawheader, 2);
-    if (count($header) != 2)
-        return $len;
-
-    // we are only interested in set-cookie header
-    if (trim($header[0]) != "set-cookie")
-        return $len;
-
-    $cookie = explode(";", trim($header[1]), 2);
-    $cookie = explode("=", $cookie[0], 2);
-
-    switch ($cookie[0])
-    {
-        case "csrftoken":
-            $csrftoken = $cookie[1];
-    }
-
-    return $len;
-};
-
-$prepare_search_curl_obj = function($query, $bookmark) use ($url, $header_function, $csrftoken)
-{
-    $data_param_obj = array(
-        "options"=>array(
-            "query"=>$query
-        )
-    );
-    if ($bookmark != null)
-        $data_param_obj["options"]["bookmarks"] = array($bookmark);
-
-    $data_param = urlencode(json_encode($data_param_obj));
-
-    $headers = array();
-    if ($csrftoken != null)
-    {
+// Prepare cURL object with options for the search query
+function prepareSearchCurlObj($query, $bookmark = null, $url, $csrftoken = null, $header_function) {
+    $data_param_obj = [
+        "options" => [
+            "query" => $query,
+            "bookmarks" => $bookmark ? [$bookmark] : null
+        ]
+    ];
+
+    $data_param = urlencode(json_encode(array_filter($data_param_obj['options'])));
+
+    $headers = [];
+    if ($csrftoken) {
         $headers[] = "x-csrftoken: $csrftoken";
         $headers[] = "cookie: csrftoken=$csrftoken";
     }
 
-    $finalurl = $url;
-    if ($bookmark == null)
-        $finalurl = "$url?data=$data_param";
+    $finalurl = $bookmark ? $url : "$url?data=$data_param";
 
     $ch = curl_init($finalurl);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($ch, CURLOPT_HEADERFUNCTION, $header_function);
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-    if ($bookmark != null)
-    {
+
+    if ($bookmark) {
         curl_setopt($ch, CURLOPT_POST, true);
         curl_setopt($ch, CURLOPT_POSTFIELDS, "data=$data_param");
     }
+
     return $ch;
-};
+}
 
-$search = function($query, $bookmark) use($prepare_search_curl_obj)
-{
-    $ch = $prepare_search_curl_obj($query, $bookmark);
+// Search function to execute the cURL request and process the response
+function search($query, $bookmark, $url, $csrftoken, $header_function) {
+    $ch = prepareSearchCurlObj($query, $bookmark, $url, $csrftoken, $header_function);
+    
     $response = curl_exec($ch);
+    
+    if ($response === false) {
+        // Handle cURL error
+        $error = curl_error($ch);
+        curl_close($ch);
+        return json_encode(['error' => 'CURL Error: ' . $error]);
+    }
+
+    curl_close($ch); // Close cURL handle
+
     $data = json_decode($response);
-    $images = array();
-        foreach ($data->{"resource_response"}->{"data"}->{"results"} as $result)
-        {
-            $image = $result->{"images"}->{"orig"};
-            $url = $image->{"url"};
-            array_push($images, $url);
+    $images = [];
+
+    if (isset($data->resource_response->data->results)) {
+        foreach ($data->resource_response->data->results as $result) {
+            $url = $result->images->orig->url ?? null; // Use null coalescing for safety
+            if ($url) {
+                $images[] = $url;
+            }
         }
-    echo json_encode($images);
+    }
+
     $result = new SearchResult();
     $result->images = $images;
-    if (property_exists($data->{"resource_response"}, "bookmark"))
-        $result->bookmark = $data->{"resource_response"}->{"bookmark"};
+    $result->bookmark = $data->resource_response->bookmark ?? null;
+
     return $result;
-};
+}
 
-$result = $search($query, $bookmark);
+// Main execution
+header("Content-Type: application/json");
+$result = search($query, $bookmark, $url, $csrftoken, $header_function);
 
-if ($result->bookmark != null)
-{
+// Handle bookmark for pagination
+if ($result->bookmark) {
     $query_encoded = urlencode($query);
     $bookmark_encoded = urlencode($result->bookmark);
     $csrftoken_encoded = urlencode($csrftoken);
+    // Uncomment below line to display the link for next page
     // echo "<h2 style=\"text-align: center;\"><a href=\"/search.php?q=$query_encoded&bookmark=$bookmark_encoded&csrftoken=$csrftoken_encoded\">Next page</a></h2><br><br><br>";
 }
 
-    header("Content-Type: application/json");
-
+echo json_encode($result);
 ?>