我正在尝试开发一个小型 Python 工具来与我的 flickr 帐户进行交互。我想保持简单,所以我决定使用我已经在系统中配置的 Flickr 帐户(在线帐户框架)。
我已经研究过应用程序开发人员的在线帐户教程并能够获取我的 Flickr 帐户详细信息。
当我尝试使用 flickrapi 模块时,出现了问题。我尝试了最新版本以及 13.04 中通过 apt 提供的版本。API 略有变化,但两次尝试都以一条消息结束,提示我有一个无效的 oauth 令牌。这是我尝试过的:
来自 flickrapi hg repo 的最新源代码
import flickrapi
flickr = flickrapi.FlickrAPI(u"d87224f0b467093b2a87fd788d950e27", u"4c7e48102c226509",
token=flickrapi.auth.FlickrAccessToken(u"my_token",
u"my_token_secret", u"write",
u'DarGad', u'dargad', u'user_nsid'))
flickr.test.login()
这导致:
ERROR:flickrapi.auth.OAuthFlickrInterface:do_request: Status code 400 received, content:
ERROR:flickrapi.auth.OAuthFlickrInterface: oauth_problem=parameter_absent
ERROR:flickrapi.auth.OAuthFlickrInterface: oauth_parameters_absent=oauth_token
来自 apt-get 的版本(1.2-3)
import flickrapi
flickr = flickrapi.FlickrAPI("d87224f0b467093b2a87fd788d950e27", "4c7e48102c226509",
token="my_token")
flickr.test_login()
结果FlickrError: Error: 98: Invalid auth token
。我还尝试了不同的FlickrAPI
构造函数标志组合(例如store_token
,cache
),但没有成功。
我已经对 Twitter 使用了类似的方法(使用 apt 中的 python-twitter 模块),并且它与我已经配置的帐户完美兼容。
我猜问题出在 flickrapi 上,因为同样的方法也适用于 Shotwell 和 unity-photos-lens。我检查了它们的源代码,没有一个不使用 flickrapi(而且 Shotwell 甚至不是 Python 的)。
我将非常感激任何关于如何让 flickrapi 与在线账户框架配合使用的提示。或者也许有另一个 Python 模块可以与在线账户配合使用?我也试过了flickr.py和python-flickr-api但我的印象是,这两种方法都已经过时了——也没有成功。
答案1
看来我终于找到办法了。
正确的版本应使用来自源代码的版本。Ubuntu 13.04 附带的版本太旧,它使用以前的 flickr auth API。hg 的 2.0-beta 使用新的 oauth API。
问题在于FlickrAPI
构造函数中提供的 token 未传递给内部OAuthFlickrInterface
。为了解决这个问题,我只需要调用:
flickr = flickrapi.FlickrAPI(
# args same as before
)
flickr.token_valid()
如果此方法返回,True
我们可以确保:
rsp = flickr.test.login()
这将执行 API 调用来检查令牌,但在执行此操作之前,它会将令牌对象作为副作用传递给 OAuthFlickrInterface。
我现在可以将 flickrapi 与我的 Ubuntu Flickr 帐户一起使用!