【问题标题】:How to access private photos through Flickrj Api?如何通过 Flickrj Api 访问私人照片?
【发布时间】:2011-03-18 09:38:43
【问题描述】:

我正在通过 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());

        }

     }

【问题讨论】:

    标签: private photos flickr flickrj


    【解决方案1】:

    可以通过编辑 flickrj 访问私人数据。

    我在com.aetrion.flickr.photos.PhotosInterface中添加了auth_token参数:

    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。

    【讨论】:

      【解决方案2】:

      要使用 flickrj api 进行经过身份验证的调用,除了您的 apiKey 和秘密之外,您还需要第三个代码 token

      我们通过一次性的第一次调用获得令牌,然后有了令牌,您就可以按照您的期望使用 api 类。

      如果您曾经使用过 flickr iOS/Android 客户端,您会认识到这一点:当您第一次使用该应用程序时,它会向您发送一个 URL 以供您对其进行授权。它的作用是当您授权它时,它会获得这个 token 密钥,然后就可以使用了。没有它,它不是。对于您的 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 行。

      有了令牌,授权就完成了,我可以使用 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;
          }
      }
      

      【讨论】:

        【解决方案3】:

        我不知道这是否会对您有所帮助,但我遇到了类似的问题,即只查看公开照片,并且已经开始工作了。

        我从http://sourceforge.net/projects/flickrj/files/ 下载了 flickrapi-1.2.zip,并在我的 web 应用程序中使用了 flickrapi-1.2.jar。

        Flickr.debugRequest 显示的是 GET 请求,但它从未包含 AuthInterface checkToken(例如)成功强制请求的“auth_token”、“api_sig”等参数。

        无论如何,所以就在今天我从以下位置下载了源代码:

        flickrj.cvs.sourceforge.net/flickrj/

        (如果您有兴趣,可以在以下位置查看修订历史记录:flickrj.cvs.sourceforge.net/viewvc/flickrj/api/build.properties?view=log。)

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

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

        我不知道这是否对你有帮助,但唯一能让我远离精神错乱的东西。

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2013-08-17
            • 1970-01-01
            • 2011-09-24
            • 2019-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-12
            相关资源
            最近更新 更多