4

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

4 に答える 4

1

flickrj api で認証された呼び出しを行うには、apiKey とシークレットに加えて、3 番目のコードであるtokenが必要です。

1 回限りの最初の呼び出しでトークンを取得し、そのトークンを使用して、期待どおりに 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に出力し、プログラムを1分間一時停止しましたThread.sleep(60000);

これで、コンソールからブラウザーに URL をコピーして貼り付け、[OK] をクリックし、[アプリが flickr アカウントを使用できるようにする] をクリックするのに十分な時間ができました。

その直後、プログラムが再開されたときに気になったのは、トークンをコンソールに出力する 70 行目だけでした。

トークンが手元にあるので、承認は完了し、Flickrj api を使用するように設定されました。

3 つのキー (apiKey、secret、token) が手元にあるので、Flickr オブジェクトを作成する静的メソッドを持つ Service クラスを作成できます。

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;
    }
}
于 2013-03-26T17:28:28.397 に答える
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 docs によると、「すべての認証された呼び出しには引数 auth_token api_sig 引数の両方が必要です」..そしてそれが欠けていました。

そこから着想を得て、テキストをリンクし、サーブレットを使用して flickr にアクセスしました。

于 2011-01-11T23:01:57.823 に答える
0

これがあなたに役立つかどうかはわかりませんが、私は公開写真だけを見るのと同じような問題を抱えていて、それ以来それを機能させています。

flickrapi-1.2.zipをhttp://sourceforge.net/projects/flickrj/files/からダウンロードし、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アプリに含めて、プライベートな写真を見ることができました。

私は正確な問題が何であったかについてさらに調査するために時間を費やしていません...何かのためにそれを使用する必要があります:)

それがあなたを助けるかどうかはわかりませんが、その発見が私を狂気から引き離す唯一のものです。

于 2010-08-03T17:21:04.230 に答える
0

別のアプローチに従うことで、この問題を解決することができました。

これが私がこれを解決した方法です。GET メソッドを使用する代わりに、photoSetsInterface (photoSetsInterface.getList(auth.getUser().getId()).getPhotosets()) で getList メソッドを使用しました。このメソッドでは、auth_token を入力パラメーターとして渡すことができます。したがって、すべての写真セットが提供されます。次に、すべてのプライバシー レベルで各フォトセットと画像を取得しました。

そして、PhotosInterface の getNotInSet メソッドを使用して、セットにないすべての写真を撮ることができます。getNotInSet メソッドは、プライバシー レベルに関係なく、セットに含まれていないすべての写真を返します。

サンプル コードは私のブログにあります。

于 2010-10-27T19:59:43.960 に答える