如何通过Flickrj Api访问私人照片?

时间:2010-07-20 11:46:01

标签: private photos flickr flickrj

我正在通过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 个答案:

答案 0 :(得分: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并使用servlet来访问flickr。

答案 1 :(得分: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);

我是在一个春季MVC应用程序中完成此操作,而不是桌面应用程序,所以在第60行之后,我将URL打印到System.out,然后使用Thread.sleep(60000);暂停程序一分钟

这让我有足够的时间将URL从我的控制台复制粘贴到浏览器,然后点击“确定允许我的应用使用我的flickr帐户”。

在此之后,当程序恢复所有我关心的是第70行,将令牌打印到控制台。

手中有令牌,授权完成,我被设置为使用Flickrj api。

手中有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;
    }
}

答案 2 :(得分:0)

我不知道这是否会对你有所帮助,但是我只看到公开照片时遇到了类似的问题,并且从那时起就开始工作了。

我从http://sourceforge.net/projects/flickrj/files/下载了flickrapi-1.2.zip,并在我的webapp中使用了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。)

我在本地构建了jar,包含在Web应用程序中,可以看到私人照片。

我没有花时间进一步调查确切的问题是什么......需要将它用于某事:)

我不知道这是否会对你有所帮助,但这种发现是唯一让我与疯狂分开的事情。

答案 3 :(得分:0)

我设法通过采用不同的方法来解决这个问题。

这就是我解决这个问题的方法。我没有使用GET方法,而是在photoSetsInterface中使用了getList方法(photoSetsInterface.getList(auth.getUser()。getId())。getPhotosets())。对于此方法,您可以将auth_token作为输入参数传递。因此它为您提供了所有照片集。然后我在所有隐私级别下拍摄了每张照片和重新拍摄的照片。

然后,您可以使用PhotosInterface中的getNotInSet方法拍摄不在集合中的所有照片。无论隐私级别如何,getNotInSet方法都会返回不在集合中的所有照片。

您可以在我的blog中找到示例代码。