2010-07-20 3 views
4

Я делаю аутентифицированный звонок для доступа к фотографиям через API Flickr. Но я получаю только публичные фотографии, но не частные фотографии.Как получить доступ к приватным фотографиям через Flickrj Api?

Ниже приведен код, я использую,

Flickr f; 
RequestContext requestContext; 
String frob = ""; 
String token = ""; 

DocumentBuilder xmlParser = null; 


public void getImages() throws ParserConfigurationException, IOException, SAXException, FlickrException, URISyntaxException, NoSuchAlgorithmException 
{ 

    DocumentBuilderFactory dcb = DocumentBuilderFactory.newInstance(); 
     try { 
      this.xmlParser = dcb.newDocumentBuilder(); 
     } catch (ParserConfigurationException ex) { 
      ex.printStackTrace(); 
     } 



    f = new Flickr("199d038ad88f6c6c377a4ab2341fb60f","4583b2386d3d6439",new REST()) ; 
    Flickr.debugStream = false; 
    requestContext = RequestContext.getRequestContext(); 
    AuthInterface authInterface = f.getAuthInterface(); 
    //PeopleInterface peopleInterface = f.getPeopleInterface(); 

    try { 
    frob = authInterface.getFrob(); 
    } catch (FlickrException e) { 
    e.printStackTrace(); 
    } 
    System.out.println("frob: " + frob); 


    java.net.URL url =authInterface.buildAuthenticationUrl(Permission.READ, frob); 

    System.out.println(url.toExternalForm()); 

    Desktop desktop = Desktop.getDesktop(); 
    desktop.browse(url.toURI()); 


    // Get the response 
    Auth auth = null ; 
    String aLine = ""; 

    while(aLine.equals("")) 
    { 

    java.io.DataInputStream in = new java.io.DataInputStream(System.in); 
    aLine = in.readLine(); 

    } 

    auth =authInterface.getToken(frob); 
    System.out.println("auth = "+auth); 
    requestContext = RequestContext.getRequestContext(); 
    requestContext.setAuth(auth); 
    f.setAuth(auth); 

    UrlsInterface urlsInterface = f.getUrlsInterface(); 
    PhotosInterface photosInterface = f.getPhotosInterface(); 




    SearchParameters searchParams=new SearchParameters(); 
    searchParams.setSort(SearchParameters.INTERESTINGNESS_DESC); 




    //Execute search with entered tags 

    searchParams.setUserId(auth.getUser().getId()); 


    PhotoList photoList=photosInterface.search(searchParams, 10,1); 


    if(photoList!=null){ 
     //Get search result and check the size of photo result 
     for(int i=0;i<photoList.size();i++){ 
      Photo photo=(Photo)photoList.get(i); 

      System.out.println(photo.getSmallSquareUrl()); 

     } 

    } 

ответ

0

Мне удалось решить эту проблему, выполнив другой подход.

Вот как я решил это. Вместо использования метода GET я использовал метод getList в photoSetsInterface (photoSetsInterface.getList (auth.getUser(). GetId()). GetPhotosets()). Для этого метода вы можете передать auth_token в качестве входного параметра. Поэтому он дает вам все наборы фотографий. Затем я взял каждый фотосет и извлеченные изображения на всех уровнях конфиденциальности.

И тогда вы можете взять все фотографии, которые не находятся в наборе, используя метод getNotInSet в PhotosInterface. Метод getNotInSet возвращает все фотографии, не входящие в набор, независимо от уровня конфиденциальности.

Вы можете найти образец кода в моем blog.

0

Я не знаю, если это поможет, но у меня была аналогичная проблема с видеть только публичные фотографии и с тех пор получил это работает ,

Я загрузил flickrapi-1.2.zip из: http://sourceforge.net/projects/flickrj/files/ и использовал flickrapi-1.2.jar в своем webapp.

Flickr.debugRequest показывал запрос GET, но он никогда не включал параметры «auth_token», «api_sig» и т. Д., Которые AuthInterface checkToken (например) успешно воздействует на запрос.

Во всяком случае, так как раз сегодня я скачал источник из:

flickrj.cvs.sourceforge.net/flickrj/

(Вы можете увидеть историю изменений по адресу: flickrj.cvs.sourceforge.net/ viewvc/flickrj/api/build.properties? view = log, если вам интересно.)

Я построил банку локально, включил ее в веб-приложение и видел частные фотографии.

я не потратил время на дальнейшее расследование о том, что точная проблема была ... нужно использовать это для чего-то :)

Я не знаю, если это поможет, но это находка единственное, что отделяет меня от безумия.

1

Доступ к личным данным возможен путем редактирования flickrj.

Я добавил параметр auth_token в com.aetrion.flickr.photos.PhotosInterface:

public PhotoList search(SearchParameters params, int perPage, int page) 
    throws IOException, SAXException, FlickrException { 
    PhotoList photos = new PhotoList(); 

    List parameters = new ArrayList(); 
    parameters.add(new Parameter("method", METHOD_SEARCH)); 
    parameters.add(new Parameter("api_key", apiKey)); 

    parameters.addAll(params.getAsParameters()); 


    if (perPage > 0) { 
     parameters.add(new Parameter("per_page", "" + perPage)); 
    } 
    if (page > 0) { 
     parameters.add(new Parameter("page", "" + page)); 
    } 
    // 
    String token = RequestContext.getRequestContext().getAuth().getToken(); 
    if (token != null) 
     parameters.add(
     new Parameter(
      "auth_token", 
      RequestContext.getRequestContext().getAuth().getToken() 
     ) 
    ); 
    // 
    parameters.add(
     new Parameter(
      "api_sig", 
      AuthUtilities.getSignature(sharedSecret, parameters) 
     ) 
    ); 

    Response response = transport.get(transport.getPath(), parameters); 

с этим изменением, я был в состоянии получить свои личные фотографии.

Flickr API документы говорят, что "Каждый вызов требует проверки подлинности обаauth_tokenиapi_sigаргументы" .. и что было.

Я взял идею оттуда: link text и использовал сервлет для доступа к flickr.

1

Чтобы сделать аутентифицированные звонки с помощью flickrj api, в дополнение к вашему apiKey и секрету, третий код, токен .

Мы получаем токен с одноразовым первым вызовом, а затем с помощью токена в руке вы можете просто использовать классы api, как и следовало ожидать.

Если вы когда-либо пользовались клиентом flickr iOS/Android, вы это узнаете: при первом использовании приложения он отправит вам URL-адрес для авторизации. Что он делает, когда вы авторизуете его, он получает этот ключ , а затем его хорошо идти. Без этого его нет. То же самое для вашего приложения java.

Я использовал этот пример для этой аутентификации первого шага, с несколькими модификациями, хотя, поскольку я работаю в приложении Spring MVC, а не в настольном приложении. Помните, что вы запускаете этот раз только один раз, и единственным моментом этого является получение ключа маркера.

https://github.com/mohlendo/flickrj/blob/master/examples/AuthExample.java

Линия 55:
frob = authInterface.getFrob();

Единственная цель в Frob является использование его для построения URL аутентификации см строка 60:
URL url = authInterface.buildAuthenticationUrl(Permission.DELETE, frob);

Я сделал это в приложение Spring MVC, а не настольное приложение, поэтому после строки 60 я вместо этого напечатал URL-адрес для System.out, а затем приостановил программу на минуту с помощью Thread.sleep(60000);

Это дало мне достаточно времени, чтобы скопировать URL-адрес с моей консоли в браузер и нажать «ОК, чтобы мое приложение могло использовать мою учетную запись flickr».

Сразу после этого, когда программа возобновляет все, что мне было нужно, это строка 70, которая печатает токен на консоли.

С помощью токена в руке авторизация завершена, и я был настроен на использование Flikrj api.

С помощью 3 ключей в руке (apiKey, secret, token) здесь находится мой класс сервиса со статическим методом для создания объекта Flickr.

import java.io.IOException; 
import java.io.InputStream; 
import java.util.Properties; 

import javax.xml.parsers.ParserConfigurationException; 

import com.aetrion.flickr.Flickr; 
import com.aetrion.flickr.REST; 
import com.aetrion.flickr.RequestContext; 
import com.aetrion.flickr.auth.Auth; 
import com.aetrion.flickr.auth.Permission; 
import com.aetrion.flickr.util.IOUtilities; 

public class FlickrjService { 

    private static Flickr flickr; 

    public static Flickr getFlickr() throws ParserConfigurationException, IOException { 
     InputStream in = null; 
     Properties properties; 
     try { 
      in = FlickrjService.class.getResourceAsStream("/flickrj.properties"); 
      properties = new Properties(); 
      properties.load(in); 
     } finally { 
      IOUtilities.close(in); 
     } 

     flickr = new Flickr(properties.getProperty("flickrj.apiKey"), properties.getProperty("flickrj.secret"), new REST("www.flickr.com")); 
     RequestContext requestContext = RequestContext.getRequestContext(); 
     Auth auth = new Auth(); 
     auth.setPermission(Permission.READ); 
     auth.setToken(properties.getProperty("flickrj.token")); 
     requestContext.setAuth(auth); 
     Flickr.debugRequest = false; 
     Flickr.debugStream = false; 
     return flickr; 
    } 
} 
Смежные вопросы