7
votes

Obtenez toutes les images d'une carte à partir d'une adresse Web Pinterest


5 commentaires

Il ne charge que 25 car il charge le reste sur la demande via AJAX lorsque vous faites défiler vers le bas, alias "Scroll infini". Je suppose que vous devriez imiter ce défilement. Ou s'ils ont tiré leur doigt, ils obtiendraient déjà leur API.


N'a-t-il aucun moyen de gérer ce que l'on appelle exactement lorsque l'événement Ajax est appelé? C'est une vraie honte à propos de l'API


Hmm, je ne pense pas. Vousurez peut-être mieux d'essayer de le faire dans JavaScript / JQuery, de cette façon, vous pouvez obtenir tous les liens, puis émuler le défilement à la fin, puis après avoir répété jusqu'à ce que le défilement soit terminé, vous pourriez envoyer un tableau de chaîne sur le serveur.


Je n'ai aucune idée de la façon dont je peux écrire un tel script fonctionnel. Avez-vous des liens avec des didacticiels / des extraits de code que vous pourriez me montrer pour simuler un effet JavaScript / renvoyer une chaîne au côté serveur sans recharger la page?


@Nickbull Comment vous aviez implémenté cela avec C #, pouvez-vous vous donner une idée de cette question ..


5 Réponses :


1
votes

Quelques personnes ont suggéré d'utiliser JavaScript pour émuler le défilement.

Je ne pense pas que vous ayez besoin d'émuler du défilement du tout, je pense qu'il vous suffit de trouver le format de l'URIS appelé via AJAX chaque fois que le défilement se produit, puis vous pouvez obtenir chaque "page" des résultats de manière séquentielle. Un petit ingénierie en retard est requis. P>

Utilisation de l'onglet Réseau de l'inspecteur de chrome, je peux voir qu'une fois que j'atteins une certaine distance dans la page, cet URI s'appelle: P>

http://pinterest.com/resource/boardfeedresource/get/?source_url =% 2fdodo% 2fweb-designui-and-mobile% 2F et données =% 7b% 22Options% 22% 3A% 7b% 22board_id% 22% 3a% 22158400180582875562% 22% 2C% 22Access% 22% 3A% 5b% 5D% 2C% 22bookmarks % 22% 3A% 5B% 22LT4xNTg0MDAxMTE4NjcxMTM2ODk6MjV8ZWJjODJjOWI4NTQ4NjU4ZDMyNzhmN2U3MGQyZGJhYTJhZjY2ODUzNTI4YTZhY2NlNmY0M2I1ODYwYjExZmQ3Yw% 3D% 3D% 22% 5D% 7D% 2C% 22context% 22% 3A% 7B% 22app_version% 22% 3A% 22fb43cdb% 22% 7D% 2C% 22module% 22% 3A% 7B % 22Name% 22% 3A% 22Griditems% 22% 2C% 22OPTIONS% 22% 3A% 7B% 22scrollables% 22% 3atre% 2c% 22Show_Grid_footer% 22% 3atre% 2C% 22Coler% 2c% 22Reflow_All% 22% 3atre % 2c% 22Virtualize% 22% 3atre% 2c% 22Item_OPTIONS% 22% 3A% 7B% 22Show_rich_title% 22SHOW_RICH_TITLE% 22% 3Afalse% 2c% 22Squish_giraffe_pins% 22% 3Afalse% 2false% 2c% 2c% 22Afalse_via% 22% 3Afalse% 2c 2c % 22Show_pinner% 22% 3Afalse% 2c% 2C% 22Show_pinned_from% 22% 3atre% 7d% 2c% 22Layout% 22% 22% 22% 7D% 7D% 2C% 22% 3Aserue% 2c% 22Errores EGY% 22% 3A1% 7D & _ = 1377092055381 P>

Si nous décodons cela, nous voyons que c'est surtout JSON P>

http://pinterest.com/resource/BoardFeedResource/get/?source_url=/dodo/web-designui-and-mobile/&data=
{
    "options": {
        "board_id": "158400180582875562",
        "access": [],
        "bookmarks": [
            "LT4xNTg0MDAxMTE4NjcwNTk1ODQ6NDl8ODFlMDUwYzVlYWQxNzVmYzdkMzI0YTJiOWJkYzUwOWFhZGFkM2M1MzhiNzA0ZDliZDIzYzE3NjkzNTg1ZTEyOQ=="
        ]
    },
    "context": {
        "app_version": "fb43cdb"
    },
    "module": {
        "name": "GridItems",
        "options": {
            "scrollable": true,
            "show_grid_footer": true,
            "centered": true,
            "reflow_all": true,
            "virtualize": true,
            "item_options": {
                "show_rich_title": false,
                "squish_giraffe_pins": false,
                "show_board": false,
                "show_via": false,
                "show_pinner": false,
                "show_pinned_from": true
            },
            "layout": "variable_height"
        }
    },
    "append": true,
    "error_strategy": 2
}
&_=1377092231234


1 commentaires

Merci beaucoup pour cette réponse - c'est informatif, mais pas assez informatif. J'ai vraiment creusé durement, et il est malheureux que je sois tellement soulevé, comme moi aussi je suis tombé sur ce scénario Json et je me suis demandé ce qui se passait. Notez aussi que les changements de valeur «signets» - un autre mystère. J'ai mis une prime de 50Rep pour une réponse qui peut me dire quelle partie exacte de JSON provoque ces mises à jour et comment la déclencher. Je crois aussi que les informations JSON seules devraient me permettre de demander ces URL, de renvoyer les images HTML et d'identifier des images, puis de coder l'URL des caractères JSON jusqu'à la fin de la partie.



0
votes

Vous pouvez déclencher le point final JSON en faisant une demande avec cet en-tête: x-demandé-with: xmlhttprequest code>

essayez ceci en commande dans la console: p>

curl -H "X-Requested-With:XMLHttpRequest" "http://pinterest.com/resource/CategoryFeedResource/get/?source_url=%2Fall%2Fgeek%2F&data=%7B%22options%22%3A%7B%22feed%22%3A%22geek%22%2C%22scope%22%3Anull%2C%22bookmarks%22%3A%5B%22Pz8xMzc3NjU4MjEyLjc0Xy0xfDE1ZjczYzc4YzNlNDg3M2YyNDQ4NGU1ZTczMmM0ZTQyYzBjMWFiMWNhYjRhMDRhYjg2MTYwMGVkNWQ0ZDg1MTY%3D%22%5D%2C%22is_category_feed%22%3Atrue%7D%2C%22context%22%3A%7B%22app_version%22%3A%22addc92b%22%7D%2C%22module%22%3A%7B%22name%22%3A%22GridItems%22%2C%22options%22%3A%7B%22scrollable%22%3Atrue%2C%22show_grid_footer%22%3Atrue%2C%22centered%22%3Atrue%2C%22reflow_all%22%3Atrue%2C%22virtualize%22%3Atrue%2C%22item_options%22%3A%7B%22show_pinner%22%3Atrue%2C%22show_pinned_from%22%3Afalse%2C%22show_board%22%3Atrue%2C%22show_via%22%3Afalse%7D%2C%22layout%22%3A%22variable_height%22%7D%7D%2C%22append%22%3Atrue%2C%22error_strategy%22%3A2%7D&module_path=App()%3EHeader()%3EDropdownButton()%3EDropdown()%3ECategoriesMenu(resource%3D%5Bobject+Object%5D%2C+name%3DCategoriesMenu%2C+resource%3DCategoriesResource(browsable%3Dtrue))&_=1377658213300" | python -mjson.tool


0 commentaires

2
votes

D'accord, alors je pense que cela peut être (avec quelques altérations) ce dont vous avez besoin.

CAVEATS: strong> p>

  1. C'est PHP, pas C # (mais vous avez dit que vous étiez intéressé par une langue côté serveur). Li>
  2. Ce code accroche à des points finaux (non officiels) de pinterest. Vous devrez changer $ de données et $ Search_Res pour refléter les points d'extrémité appropriés (par exemple, BOARDFEEDRESOUCE) pour vos tâches. Remarque: au moins pour la recherche, Pinterest utilise actuellement deux points d'extrémité, un pour la charge initiale de la page, et une autre pour les actions de défilement infinies. Chacun a sa propre structure de paramètres attendue. Li>
  3. Pinterest n'a pas d'API publique officielle, attendez-vous à ce que cela cumule chaque fois qu'ils changent quelque chose et sans avertissement. Li>
  4. Vous pouvez trouver Pinterestapi.co.uk plus facile à mettre en œuvre et acceptable pour ce que vous faites. LI>
  5. J'ai du code de démonstration / débogage sous la classe qui ne devrait pas être là une fois que vous obtenez les données souhaitées, et une limite d'extraction de la page par défaut que vous voudrez peut-être changer. LI> ol>

    points d'intérêt: strong> p>

    1. Le paramètre de soussecore _ code> prend une horodatage au format JavaScript, c'est-à-dire. Comme une fois unix, mais il a ajouté des millisecondes. Ce n'est pas réellement utilisé pour la pagination. Li>
    2. pagination utilise la propriété bookmarks code>, de sorte que vous effectuez la première demande au "nouveau" point final qui ne le nécessite pas, puis prenez les signets code> code> à partir du résultat et utilisez-le dans votre demande pour obtenir la prochaine «page» des résultats, prenez le Signets code> à partir de ces résultats pour récupérer la page suivante, etc. jusqu'à ce que vous manquiez de résultats ou d'atteindre votre pré -Sette limite (ou vous appuyez sur le serveur Max pour l'heure d'exécution du script). Je serais curieux de savoir exactement ce que les codes code> codes de marque code>. J'aimerais penser qu'il y a de la sauce secrète amusante au-delà d'un identifiant PIN ou d'un autre marqueur de page. Li>
    3. Je saute le HTML, au lieu de faire face à JSON, car il est plus facile (pour moi) que d'utiliser une solution de manipulation DOM ou un tas de regex. li> OL>
      <?php
      
      if(!class_exists('Skrivener_Pins')) {
      
        class Skrivener_Pins {
      
          /**
           * Constructor
           */
          public function __construct() {
          }
      
          /**
           * Pinterest search function. Uses Pinterest's "internal" page APIs, so likely to break if they change.
           * @author [@skrivener] Philip Tillsley
           * @param $search_str     The string used to search for matching pins.
           * @param $limit          Max number of pages to get, defaults to 2 to avoid excessively large queries. Use care when passing in a value.
           * @param $bookmarks_str  Used internally for recursive fetches.
           * @param $pages          Used internally to limit recursion.
           * @return array()        int['id'], obj['image'], str['pin_link'], str['orig_link'], bool['video_flag']
           * 
           * TODO:
              * 
              * 
           */
          public function get_tagged_pins($search_str, $limit = 1, $bookmarks_str = null, $page = 1) {
      
            // limit depth of recursion, ie. number of pages of 25 returned, otherwise we can hang on huge queries
            if( $page > $limit ) return false;
      
            // are we getting a next page of pins or not
            $next_page = false;
            if( isset($bookmarks_str) ) $next_page = true;
      
            // build url components
            if( !$next_page ) {
      
              // 1st time
              $search_res = 'BaseSearchResource'; // end point
              $path = '&module_path=' . urlencode('SearchInfoBar(query=' . $search_str . ', scope=boards)');
              $data = preg_replace("'[\n\r\s\t]'","",'{
                "options":{
                  "scope":"pins",
                  "show_scope_selector":true,
                  "query":"' . $search_str . '"
                },
                "context":{
                  "app_version":"2f83a7e"
                },
                "module":{
                  "name":"SearchPage",
                  "options":{
                    "scope":"pins",
                    "query":"' . $search_str . '"
                  }
                },
                "append":false,
                "error_strategy":0
                }');
            } else {
      
              // this is a fetch for 'scrolling', what changes is the bookmarks reference, 
              // so pass the previous bookmarks value to this function and it is included
              // in query
              $search_res = 'SearchResource'; // different end point from 1st time search
              $path = '';
              $data = preg_replace("'[\n\r\s\t]'","",'{
                "options":{
                  "query":"' . $search_str . '",
                  "bookmarks":["' . $bookmarks_str . '"],
                  "show_scope_selector":null,
                  "scope":"pins"
                },
                "context":{
                  "app_version":"2f83a7e"
                },
                  "module":{
                    "name":"GridItems",
                  "options":{
                    "scrollable":true,
                    "show_grid_footer":true,
                    "centered":true,
                    "reflow_all":true,
                    "virtualize":true,
                    "item_options":{
                      "show_pinner":true,
                      "show_pinned_from":false,
                      "show_board":true
                    },
                    "layout":"variable_height"
                  }
                },
                "append":true,
                "error_strategy":2
              }');
            }
            $data = urlencode($data);
            $timestamp = time() * 1000; // unix time but in JS format (ie. has ms vs normal server time in secs), * 1000 to add ms (ie. 0ms)
      
            // build url
            $url = 'http://pinterest.com/resource/' . $search_res . '/get/?source_url=/search/pins/?q=' . $search_str
                . '&data=' . $data
                . $path
                . '&_=' . $timestamp;//'1378150472669';
      
            // setup curl
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Requested-With: XMLHttpRequest"));
      
            // get result
            $curl_result = curl_exec ($ch); // this echoes the output
            $curl_result = json_decode($curl_result);
            curl_close ($ch);
      
            // clear html to make var_dumps easier to see when debugging
            // $curl_result->module->html = '';
      
            // isolate the pin data, different end points have different data structures
            if(!$next_page) $pin_array = $curl_result->module->tree->children[1]->children[0]->children[0]->children;
            else $pin_array = $curl_result->module->tree->children;
      
            // map the pin data into desired format
            $pin_data_array = array();
            $bookmarks = null;
            if(is_array($pin_array)) {
              if(count($pin_array)) {
      
                foreach ($pin_array as $pin) {
      
                  //setup data
                  $image_id = $pin->options->pin_id;
                  $image_data = ( isset($pin->data->images->originals) ) ? $pin->data->images->originals : $pin->data->images->orig;
                  $pin_url = 'http://pinterest.com/pin/' . $image_id . '/';
                  $original_url = $pin->data->link;
                  $video = $pin->data->is_video;
      
                  array_push($pin_data_array, array(
                    "id"          => $image_id,
                    "image"       => $image_data,
                    "pin_link"    => $pin_url,
                    "orig_link"   => $original_url,
                    "video_flag"  => $video,
                    ));
                }
                $bookmarks = reset($curl_result->module->tree->resource->options->bookmarks);
      
              } else {
                $pin_data_array = false;
              }
            }
      
            // recurse until we're done
            if( !($pin_data_array === false) && !is_null($bookmarks) ) {
      
              // more pins to get
              $more_pins = $this->get_tagged_pins($search_str, $limit, $bookmarks, ++$page);
              if( !($more_pins === false) ) $pin_data_array = array_merge($pin_data_array, $more_pins);
              return $pin_data_array;
            }
      
            // end of recursion
            return false;
          }
      
        } // end class Skrivener_Pins
      } // end if
      
      
      
      /**
       * Debug/Demo Code
       * delete or comment this section for production
       */
      
      // output headers to control how the content displays
      // header("Content-Type: application/json");
      header("Content-Type: text/plain");
      // header("Content-Type: text/html");
      
      // define search term
      // $tag = "vader";
      $tag = "haemolytic";
      // $tag = "qjkjgjerbjjkrekhjk";
      
      if(class_exists('Skrivener_Pins')) {
      
        // instantiate the class
        $pin_handler = new Skrivener_Pins();
      
        // get pins, pinterest returns 25 per batch, function pages through this recursively, pass in limit to 
        // override default limit on number of pages to retrieve, avoid high limits (eg. limit of 20 * 25 pins/page = 500 pins to pull 
        // and 20 separate calls to Pinterest)
        $pins1 = $pin_handler->get_tagged_pins($tag, 2);
      
        // display the pins for demo purposes
        echo '<h1>Images on Pinterest mentioning "' . $tag . '"</h1>' . "\n";
        if( $pins1 != false ) {
          echo '<p><em>' . count($pins1) . ' images found.</em></p>' . "\n";
          skrivener_dump_images($pins1, 5);
        } else {
          echo '<p><em>No images found.</em></p>' . "\n";
        }
      }
      
      // demo function, dumps images in array to html img tags, can pass limit to only display part of array
      function skrivener_dump_images($pin_array, $limit = false) {
        if(is_array($pin_array)) {
          if($limit) $pin_array = array_slice($pin_array, -($limit));
          foreach ($pin_array as $pin) {
            echo '<img src="' . $pin['image']->url . '" width="' . $pin['image']->width . '" height="' . $pin['image']->height . '" >' . "\n";
          }
        }
      }
      
      ?>
      


3 commentaires

Eh bien, cette question a pris du temps pour répondre, mais vous avez essentiellement résolu-la-question - et heureusement, j'ai presque craqué que Signets aussi. Par exemple, en prenant plusieurs des chaînes de signets et puttingthem via un décodeur base64 donne: -> 18788523419059400: 25 | 77a8c15de91998d843301116b034592875347 8fa9ac0b7da855a8eecc b9c1f84 -> 18788523419039267: 49 | 3686b33864aa96a215b28dd5e442afc06e6c7 6615a8adaae9f6f52643 2d47d12 qui suit le format suivant: -> {} pinID: {itemnumber} | {Random Base16 String de 64 caractères} m'aidez-moi à craquer cette dernière partie et je pense que nous l'aurons fait!


Agréable! Je n'aurai probablement pas la chance de creuser davantage jusqu'à ce que je reçoive une pause entre les projets fin octobre. Mon instinct d'intestin suggère une variation des timbres temporels / dates, ou peut-être un hachage de certaines portions de données pour la vérification des erreurs, mais ce sont des poignards dans le noir. Va revisiter quand je reçois un moment :)


J'apprécie de l'aide chaque fois que vous le pouvez, il n'y a pas beaucoup de systèmes de hachage hexdécimaux de 64 caractères. J'ai déjà essayé d'encoder -> {pinid}: {item #}, {pinide}: {item #} et {pinide} dans SHA256 et ce n'était pas fructueux. Le PHP que vous avez fourni des œuvres peu importe, mais ce serait bien si cela était entièrement programmatique! Merci encore pour votre aide en cours :)



0
votes
#!/usr/bin/env bash 
##
## File: getpins.bsh 
## 
## Copyrighted by +A.M.Danischewski  2016+ (c)
## This program may be reutilized without limits, provided this 
## notice remain intact. 

## If this breaks one day, then just fire up firefox Developer Tools and check the network traffic to 
## capture "copy as curl" of the calls to the search page (filter with BaseSearchResource), then the 
## call to feed more data (filter with SearchResource). 
## 
## Do a search on whatever you want remove the cookie header, and add -o ret2.html -D h2.txt -c c1.txt, 
## then search replace the search terms as SEARCHTOKEN1 and SEARCHTOKEN2. 
## 
## Description this script facilitates alternate browsers, by caching images/pins 
## from pinterest. This script is hardwired for two search terms. First create a directory 
## to where you want the images to go, then cd there. 
##  Usage: 
##    $> cd /big/drive/auto_gyros 
##    $> getpins.bsh "sleek autogyros"
## 
## Expect around 900 images to land wherever you select, so make sure you have space! =) 
##

declare -r ORIG_IMGS="pin_orig_imgs.txt"
declare -r TMP_IMGS="pin_imgs.txt"
declare -r UA_HEADER="User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.$(($RANDOM%10))) Gecko/20100101 Firefox/19.0"

 ## Say Hello to the main page and get a cookie. 
declare PINCMD1=$(cat << EOF
curl -o ret1.html -D h1.txt -c c1.txt -H 'Host: www.pinterest.com' -H '${UA_HEADER}' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'Connection: keep-alive' 'https://www.pinterest.com/'
EOF
)
 ## Start a search for our dear search terms. 
declare PINCMD2=$(cat << EOF
curl -H 'X-APP-VERSION: ea7a93a' -o ret2.html -D h2.txt -c c1.txt -H 'Host: www.pinterest.com' -H '${UA_HEADER}' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'X-Pinterest-AppState: active' -H 'X-NEW-APP: 1'  -H 'X-Requested-With: XMLHttpRequest' -H 'Referer: https://www.pinterest.com' -H 'Connection: keep-alive' 'https://www.pinterest.com/resource/BaseSearchResource/get/?source_url=%2Fsearch%2Fpins%2F%3Fq%3DSEARCHTOKEN1%2520SEARCHTOKEN2%26rs%3Dtyped%260%3DSEARCHTOKEN1%257Ctyped%261%3DSEARCHTOKEN2%257Ctyped&data=%7B%22options%22%3A%7B%22restrict%22%3Anull%2C%22scope%22%3A%22pins%22%2C%22constraint_string%22%3Anull%2C%22show_scope_selector%22%3Atrue%2C%22query%22%3A%22SEARCHTOKEN1+SEARCHTOKEN2%22%7D%2C%22context%22%3A%7B%7D%2C%22module%22%3A%7B%22name%22%3A%22SearchPage%22%2C%22options%22%3A%7B%22restrict%22%3Anull%2C%22scope%22%3A%22pins%22%2C%22constraint_string%22%3Anull%2C%22show_scope_selector%22%3Atrue%2C%22query%22%3A%22SEARCHTOKEN1+SEARCHTOKEN2%22%7D%7D%2C%22render_type%22%3A1%2C%22error_strategy%22%3A0%7D&module_path=App%3EHeader%3ESearchForm%3ETypeaheadField(support_guided_search%3Dtrue%2C+resource_name%3DAdvancedTypeaheadResource%2C+tags%3Dautocomplete%2C+class_name%3DbuttonOnRight%2C+prefetch_on_focus%3Dtrue%2C+support_advanced_typeahead%3Dnull%2C+hide_tokens_on_focus%3Dundefined%2C+search_on_focus%3Dtrue%2C+placeholder%3DSearch%2C+show_remove_all%3Dtrue%2C+enable_recent_queries%3Dtrue%2C+name%3Dq%2C+view_type%3Dguided%2C+value%3D%22%22%2C+input_log_element_type%3D227%2C+populate_on_result_highlight%3Dtrue%2C+search_delay%3D0%2C+is_multiobject_search%3Dtrue%2C+type%3Dtokenized%2C+enable_overlay%3Dtrue)&_=1454779874891' 
EOF
)
 ## Load further images. 
declare PINCMD3=$(cat << EOF
curl -H 'X-APP-VERSION: ea7a93a' -D h3.txt -c c1.txt -H 'Host: www.pinterest.com' -H '${UA_HEADER}' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'X-Pinterest-AppState: active' -H 'X-NEW-APP: 1'  -H 'X-Requested-With: XMLHttpRequest' -H 'Referer: https://www.pinterest.com' -H 'Connection: keep-alive' 'https://www.pinterest.com/resource/SearchResource/get/?source_url=%2Fsearch%2Fpins%2F%3Fq%3DSEARCHTOKEN1%2520SEARCHTOKEN2%26rs%3Dtyped%260%3DSEARCHTOKEN1%257Ctyped%261%3DSEARCHTOKEN2%257Ctyped&data=%7B%22options%22%3A%7B%22layout%22%3Anull%2C%22places%22%3Afalse%2C%22constraint_string%22%3Anull%2C%22show_scope_selector%22%3Atrue%2C%22query%22%3A%22SEARCHTOKEN1+SEARCHTOKEN2%22%2C%22scope%22%3A%22pins%22%2C%22bookmarks%22%3A%5B%22_NEW_BOOK_MARK_%22%5D%7D%2C%22context%22%3A%7B%7D%7D&module_path=App%3EHeader%3ESearchForm%3ETypeaheadField(support_guided_search%3Dtrue%2C+resource_name%3DAdvancedTypeaheadResource%2C+tags%3Dautocomplete%2C+class_name%3DbuttonOnRight%2C+prefetch_on_focus%3Dtrue%2C+support_advanced_typeahead%3Dnull%2C+hide_tokens_on_focus%3Dundefined%2C+search_on_focus%3Dtrue%2C+placeholder%3DSearch%2C+show_remove_all%3Dtrue%2C+enable_recent_queries%3Dtrue%2C+name%3Dq%2C+view_type%3Dguided%2C+value%3D%22%22%2C+input_log_element_type%3D227%2C+populate_on_result_highlight%3Dtrue%2C+search_delay%3D0%2C+is_multiobject_search%3Dtrue%2C+type%3Dtokenized%2C+enable_overlay%3Dtrue)&_=1454779874911'
EOF
)
 ## Exactly 2 search terms in a single string are expected, you can hack it up if 
 ## you want something else.  
declare SEARCHTOKEN1=$(echo "${1}" | cut -d " " -f1)
declare SEARCHTOKEN2=$(echo "${1}" | cut -d " " -f2)

PINCMD3=$(sed "s/SEARCHTOKEN1/${SEARCHTOKEN1}/g" <<< "${PINCMD3}") 
PINCMD3=$(sed "s/SEARCHTOKEN2/${SEARCHTOKEN2}/g" <<< "${PINCMD3}") 
PINCMD2=$(sed "s/SEARCHTOKEN1/${SEARCHTOKEN1}/g" <<< "${PINCMD2}") 
PINCMD2=$(sed "s/SEARCHTOKEN2/${SEARCHTOKEN2}/g" <<< "${PINCMD2}") 

function lspinimgs() { grep -o "\"url\": \"http[s]*://[^\"]*.pinimg.com[^\"]*.jpg\"" "${1}" | cut -d " " -f2 | tr -d "\""; }
function mkpinorig() { sed "s#\(^http.*\)\(com/\)\([^/]*\)\(/.*jpg\$\)#\1\2originals\4#g" "${1}" > "${2}"; }    
function getpinbm() { grep -o "bookmarks\": [^ ]* "  "${1}" | sed "s/^book.*\[\"//g;s/\"\].*\$//g" | sort | uniq | grep -v "-end-"; }
function changepinbm() { PINCMD3=$(sed "s/\(^.*\)\(bookmarks%22%3A%5B%22\)\(.*\)\(%22%5D.*\$\)/\1\2${1}\4/g" <<< "${PINCMD3}"); }
function cleanup() { rm ret*html c1.txt "${TMP_IMGS}" h{1..3}.txt "${ORIG_IMGS}"; } 

function main() { 
eval "${PINCMD1}" 
eval "${PINCMD2}"
for ((i=3,lasti=2; i<10000; i++,lasti++)); do 
 pinbm=$(getpinbm "ret${lasti}.html")
 [[ -z "${pinbm}" ]] && break 
 changepinbm "${pinbm}"
 eval "${PINCMD3}" > "ret${i}.html"
done 
for a in *.html; do lspinimgs "${a}" >> "${TMP_IMGS}"; done
mkpinorig "${TMP_IMGS}" "${ORIG_IMGS}"
IFS=$(echo -en "\n\b") && for a in $(sort "${ORIG_IMGS}" | uniq); do 
 wget --tries=3 -E -e robots=off -nc --random-wait --content-disposition --no-check-certificate -p --restrict-file-names=windows,lowercase,ascii --header "${UA_HEADER}" -nd "$a"  
done
cleanup 
} 

main 
exit 0

0 commentaires

2
votes

Probablement un peu en retard mais avec le projet Open Source Py3-Pinterest, vous pouvez le faire facilement:

Obtenez d'abord toutes les épingles comme objets de la carte, ils incluent l'URL d'image d'origine également. P>

for pin in board_pins:
    url = pin['image']
    # process image url..


2 commentaires

J'ai essayé cette approche mais faisant face à deux problèmes (a) l'exemple de code n'a pas, board_url = cible_board ['URL] en tant que paramètre dans Pinterest.board_feed (..) et (b) même lorsque j'utilise le code Exemple, ce qui est retourné dans PIN_BATCH est une liste vide.


j'y jetterais un œil