Как получить доступ к личным фотографиям через Flickrj Api? - PullRequest
4 голосов
/ 20 июля 2010

Я звоню с аутентификацией для доступа к фотографиям через Flickr 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());

        }

     }

Ответы [ 4 ]

1 голос
/ 26 марта 2013

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

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

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

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

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

Строка 55:
frob = authInterface.getFrob();

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

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

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

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

С токеном в руке авторизация завершена, и я был настроен на использование API-интерфейса Flickrj.

Имея 3 ключа в руках (apiKey, secret, token), вот мой класс Service со статическим методом для создания объекта 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;
    }
}
1 голос
/ 12 января 2011

Можно получить доступ к личным данным, отредактировав 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 аргументы "... и этого не было.

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

0 голосов
/ 27 октября 2010

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

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

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

Образец кода можно найти в моем блоге .

0 голосов
/ 03 августа 2010

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

Я скачал flickrapi-1.2.zip из: http://sourceforge.net/projects/flickrj/files/ и использовал flickrapi-1.2.jar в моем веб-приложении.

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, если выВы заинтересованы.)

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

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

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

...