2013-05-15 17 views
5

Ho giocato con perl con l'API tumblr con perl e ho ottenuto diverse funzioni per funzionare.Invia file immagine locale su tumblr tramite API con perl

Tuttavia, non riesco a caricare file immagine locali tramite perl.

Ecco il mio codice che funziona per gli URL

use LWP::Authen::OAuth; 
    use JSON; 
    use Data::Dumper; 
    use strict; 
     my $ua = LWP::Authen::OAuth->new(
      oauth_consumer_key => 'xxx', 
      oauth_consumer_secret => 'xxx', 
      oauth_token => 'xxx', 
      oauth_token_secret => 'xxx', 
    ); 




    my $response; 
    $response = $ua->post('http://api.tumblr.com/v2/blog/mytumblr.tumblr.com/post', [ 
     type => 'photo', 
     url => 'http://www.example.com/mypic.jpg' , 
     caption => 'Test image 1', 
    ]); 


    if ($response->is_success) { 
     print "it worked"; 
    } 
    else { 
    print "it did not work \n \n \n \n"; 
    print $response->as_string; 
    } 

Tuttavia, quando ho sostituire "url" per "dati" nei parametri post (come indicato nella loro descrizione API qui - http://www.tumblr.com/docs/en/api/v2#posting), continuo a ricevere una risposta di errore da tumblr. Ho provato diversi modi di inserire il parametro "data" - come un percorso per il file, come rappresentazione binaria, come una rappresentazione binaria con codifica URL, come una rappresentazione binaria base64 con codifica url, bloccato uno di quei valori come un unico elemento in un array - ho provato tutti, e con ognuno di essi ho ricevuto un messaggio di errore da tumblr.

Quindi qualcuno può indicarmi come caricare un file di immagine locale su tumblr?

+0

Che errore ottieni? – friedo

+0

'Connessione richiesta HTTP/1.1 400 errata: chiudi Data: Mer 15 maggio 2013 21:48:31 GMT Server: nginx Content-Type: application/json; charset = utf-8 Client-Date: Wed, 15 maggio 2013 21:48:31 GMT Client-Peer: 66.6.40.14:80 Client-Response-Num: 1 Client-Transfer-Encoding: Chunked P3P: CP = "ALL ADM DEV PSAi COM OURO STP IND ONL "Set-Cookie: tmgioct = 519402aea446110439257710; scade = sab, 13-mag-2023 21:48:30 GMT; percorso = /; httponly {"meta": {"stato": 400, "msg": "Richiesta errata"}, "risposta": {"errori": ["Errore caricamento foto."]}} ' –

+0

provare a rimuovere la parte didascalia - funziona? – PHearst

risposta

0

io non sono del tutto familiarità con l'API tumblr, ma un rapido googling mi ha trovato questo esempio: https://gist.github.com/derekg/1198576

vorrei provare

$response = $ua->post('http://api.tumblr.com/v2/blog/mytumblr.tumblr.com/post', [ 
    type => 'photo', 
    'data[0]' => $file_contents , ## LWP::Useragent should automatically urlencode this 
    caption => 'Test image 1', 
]); 

Secondo questa risposta https://stackoverflow.com/a/177866/810448, è possibile che "i dati [] "funzionerebbe anche in questa situazione.

Vorrei anche considerare di aggiungere "Content-type: application/x-www-form-urlencoded" alle intestazioni della richiesta, se LWP :: Useragent non lo sta già facendo.

+0

Anche questo sembra non funzionare - tuttavia questa volta mi sembra di ricevere il seguente errore: –

+0

HTTP/1.1 401 non autorizzato Connessione: chiudi Data: gio, 16 maggio 2013 17:48:56 GMT Server: Apache Vary: Accept-Encoding Content-Length: 60 Content-Type: application/json client Data: giovedì, 16 maggio 2013 17:48:59 GMT client-Peer: 66.6.40.14:80 Client- Response-Num: 1 Client-Warning: Missing Authenticate header P3P: CP = "ALL ADM DEV PSAi COM OUR OTRo STP IND ONL" Set-Cookie: tmgioct = 51951c0b8ea0630258123660; scade = Dom, 14-Mag-2023 17:48:59 GMT; percorso = /; http: X-Tumblr-Usec: D = 3649265 {"meta": {"stato": 401, "msg": "Non autorizzato"}, "risposta": []} –

+0

anche - due domande di follow-up - cosa usi per ottenere il contenuto del file? E come si imposta il tipo di contenuto nel messaggio UA? Ho provato diversi metodi per ciascuno (File :: Slurp, my $ imagepath = 'C: \ scripts \ vega1.jpg'; open (IMAGE, $ imagepath) o die "$!"; my $ raw_string = do {locale $/= undef; ;};) - per i caricamenti di file, utilizzando $ ua-> default_header ('' Content-type '=>' application/x-www-form- urlencoded ') ;, o specificarlo come parametro nella richiesta POST - tutti stanno venendo a vuoto. Sono onestamente un po' confuso –