2010-05-19 7 views
5

J'ai environ 300 images que je veux télécharger sur mon nouveau compte Tumblr, car mon ancien site wordpress a été piraté et je ne souhaite plus utiliser wordpress.Téléchargement de plusieurs images via Tumblr API

J'ai téléchargé une image par jour pendant 300 jours, et j'aimerais pouvoir prendre ces images et les télécharger sur mon site tumblr en utilisant l'API.

Les images sont actuellement locales, stockées dans/images /. Ils ont tous la date à laquelle ils ont été téléchargés comme les dix premiers caractères du nom de fichier, (01-01-2009-filename.png) et je suis allé aussi envoyer ce paramètre de date. Je veux être en mesure de voir la progression du script en produisant les réponses de l'API à mon error_log. Voici ce que j'ai jusqu'ici, basé sur la page tumblr api.

// Authorization info 
$tumblr_email = '[email protected]'; 
$tumblr_password = 'password'; 

// Tumblr script parameters 
$source_directory = "images/"; 

// For each file, assign the file to a pointer 

Voici la première pierre d'achoppement. Comment puis-je obtenir toutes les images dans le répertoire et les parcourir? Une fois que j'ai une boucle for ou while mis en place, je suppose que c'est la prochaine étape

$post_data = fopen(dir(__FILE__) . $source_directory . $current_image, 'r'); 
$post_date = substr($current_image, 0, 10); 


// Data for new record 
$post_type = 'photo'; 

// Prepare POST request 
$request_data = http_build_query(
    array(
     'email' => $tumblr_email, 
     'password' => $tumblr_password, 
     'type' => $post_type, 
     'data' => $post_data, 
     'date' => $post_date, 
     'generator' => 'Multi-file uploader' 
    ) 
); 

// Send the POST request (with cURL) 
$c = curl_init('http://www.tumblr.com/api/write'); 
curl_setopt($c, CURLOPT_POST, true); 
curl_setopt($c, CURLOPT_POSTFIELDS, $request_data); 
curl_setopt($c, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($c); 
$status = curl_getinfo($c, CURLINFO_HTTP_CODE); 
curl_close($c); 

// Output response to error_log 
error_log($result); 

Alors, je suis coincé sur la façon d'utiliser PHP pour lire un répertoire de fichiers, boucle à travers chacun des fichiers, et faire choses au nom/avec le fichier lui-même. J'ai également besoin de savoir comment définir le paramètre de données, comme dans le cas du multi-part/formdata. Je ne sais rien sur cURL.

Répondre

1

Vous pouvez utiliser la fonction glob pour obtenir rapidement un tableau de fichiers correspondant à un motif. C'est:

foreach (glob('images/*.png') as $current_image) { 
    ... 
}

Pour faire télécharger boucle le fichier, vous pouvez tout simplement passer le nom de fichier préfixé avec un @ (voir la description CURLOPT_POSTFIELDS à http://www.php.net/curl_setopt). À la minute où vous lui passez un handle de fichier PHP, ce qui n'a pas beaucoup de sens. Remplacez $post_data par:

$post_data = '@' . dirname(__FILE__) . '/' . $current_image;

Et vous devriez être bon.

0

J'ai eu ce travail avec ce code:

<?php 
// Authorization info 
$tumblr_email = 'email'; 
$tumblr_password = 'password'; 
$tumblr_url = 'yourtumblr.tumblr.com'; 

$directory = getcwd(); 
$images = glob("./{*.jpeg,*.gif,*.png,*jpg}", GLOB_BRACE); 
if ($images) { 
foreach($images as $image) { 

$post_data = $directory."/".$image; 

// Data for new record 
$post_type = 'photo'; 
$post_title = 'The post title'; 
$post_body = 'This is the body of the post.'; 

// Prepare POST request 
$request_data = http_build_query(
    array(
     'email'  => $tumblr_email, 
     'password' => $tumblr_password, 
     'type'  => 'photo', 
     'state'  => 'queue', 
     'data'  => file_get_contents($post_data), 
     'group'  => $tumblr_url 
    ) 
); 

// Send the POST request (with cURL) 
$c = curl_init('http://www.tumblr.com/api/write'); 
curl_setopt($c, CURLOPT_POST, true); 
curl_setopt($c, CURLOPT_POSTFIELDS, $request_data); 
curl_setopt($c, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($c); 
$status = curl_getinfo($c, CURLINFO_HTTP_CODE); 
curl_close($c); 

// Check for success 
if ($status == 201) { 
    echo "Success! The new post ID is $result.\n"; 
} else if ($status == 403) { 
    echo 'Bad email or password'; 
} else { 
    echo "Error: $result\n"; 
} 

} 

} else { 

echo "No images in folder :("; 

} 
?> 
+0

Ce code ne fonctionne plus. Je recommanderais https://gist.github.com/velocityzen/1242662 – westondeboer