这两天写一个python的自动从word读取并向OJ的DIY添加题目的脚本,其中一个最痛苦的地方莫过于图片添加了。没被墙并且以前用过的图床只有flickr,第一次用API的方式写代码,一切都从零开始...

使用flickr API首先要向flickr申请一个应用程序,flickr会提供一个API_KEY和密码API_SECRET

之后去下载了python相关的第三方API,试了 Beej's Python Flickr API 和 flickr.py,两个API都挺郁闷,我需要的只有上传图片和获得图片外链两个功能,而两个都不能直接实现。Beej比较正式一点,是python官方指定的,没有直接获取外链的方法,而且代码又过于抽象,改不出来; flickr.py 代码相对简单很多, 但是没有图片上传方法。于是乎,自己动手,丰衣足食,把flickr.py的1k+行的源码删的剩200行,然后把Beej的代码中的上传部分挪了过来,搞了一整天,终于搞定了 T_T

官方API的大概原理很简单,就是向指定的网页get或者post一些值,然后服务器会返回一个XML结构的数据包,数据包中包含我们需要的信息。

首先要做的要进行身份认证并获取权限,我做的是一个非网页应用,认证需要三步:

第一步要获取一个Frob值,官方API中写的很清楚,方法(method)为"flickr.auth.getFrob",于是得到get的网址:

http://flickr.com/services/rest/?api_key=[api_key]&method=flickr.auth.getFrob&api_sig=[api_sig]

[api_key]就是你申请的api_key,而对于任何一次get或者post,都还要有一个api_sig的值,这个api_sig值是对之前参数的一个验证,他的计算方法是你的密码API_SECRET+所有参数按字典序排序之后的连接得到的字符串,然后进行md5hash之后的值,举例比如说上面的处理后的字符串就是:

[API_SECRET]api_key[API_KEY]methodflickr.auth.getFrob

取md5值就得到了api_sig

之后会返回一个xml格式文档:

<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok"><frob>72157629793683591-1120f17051e65424-60155050</frob></rsp>

stat是"ok"也就表示请求有效,否则的话就表示请求出错,并会得到一个错误信息,如:

<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="fail"><err code="97" msg="Missing signature" />
</rsp>

获取frob之后就进行第二步认证:

调用浏览器打开认证页面:

http://flickr.com/servers/auth/?api_key=[api_key]&perms=write&frob=[frob]&api_sig=[api_sig]
api_sig=md5([api_secret]api_key[api_key]frob[frob]permswrite)

perms=write也就是说需要上传的权限,如果是read则是只读权限。用户登录并认证之后就可以进行第三步认证了:

第三步就是getToken,method='flickr.auth.getToken'

http://flickr.com/services/rest/?api_key=[api_key]&frob=[frob]&method=[method]&api_sig=[api_sig]
api_sig=md5([api_secret]api_key[api_key]frob[frob]method[method])

然后返回得到Token值,最好把Token值保存到一个文件里面,以后每次操作都需要这个Token值,到这里就认证成功了。

认证成功之后就可以进行各项操作了,详细看官方的API方法:http://www.flickr.com/services/api/

上传图片的方法和其他方法是不同的,具体看这里http://www.flickr.com/services/api/upload.api.html,图片一般很大,只能用POST方法发送,而且官网有说:'photo'参数不应该包含在签名中。生成签名时,应包含所有其他 POST 参数。所以得到api_sig时只需包含api_key和auth_token两个参数。

这个在上传时花了好长时间,用各种方法上传都返回API_KEY无效的错误,所以只好拖出了Beej的代码,这才知道,这种大文件的传送必须不能和小的字符串相同,而是使用multipart的形式进行发送,网上查了一下multipart的的结构:

multipart的post信息各部分之间需要用 "--" + boundary 的形式隔开,boundary是随机生成的一个字串

然后是数据描述,接着就是数据了。为了跨平台,换行符是'\r\n'。还要注意,最后是 '--' + boundary + '--'。
另外,在申请头中要添加发送类型和boundary,如下的一段:

Content-Type:multipart/form-data; boundary=ttP6n0b1QZUBJp6bK6gbNw

这样就能够发送成功了,返回的信息中包含有图片的id号,根据id号,执行getInfo的方法(flickr.photos.getInfo),可以得到类似如下的信息:

<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok"><photo id="7008341001" secret="d20e29fbed" server="7191" farm="8" dateuploaded="1332508355" isfavorite="0" license="0" safety_level="0" rotation="0" views="0" media="photo"><owner nsid="60187189@N04" username="Amb.Flickr" realname="amb W" location="" iconserver="6204" iconfarm="7" /><title>pic</title><description /><visibility ispublic="1" isfriend="0" isfamily="0" /><dates posted="1332508355" taken="2012-03-23 21:12:35" takengranularity="0" lastupdate="1332509039" /><permissions permcomment="3" permaddmeta="2" /><editability cancomment="1" canaddmeta="1" /><publiceditability cancomment="1" canaddmeta="0" /><usage candownload="1" canblog="1" canprint="1" canshare="0" /><comments>0</comments><notes /><people haspeople="0" /><tags /><urls><url type="photopage">http://www.flickr.com/photos/ambition0109/7008341001/</url></urls></photo>
</rsp>

得到其中包含的secret,server,farm值就可以构造一个外链了,构造方法看这里http://www.flickr.com/services/api/misc.urls.html

如上的大图外链就是 http://farm8.staticflickr.com/7191/7008341001_d20e29fbed_b.jpg 了

这样,flickr的部分就搞定了~~~

原文地址: http://www.cnblogs.com/ambition/archive/2012/04/11/2442802.html

转载于:https://www.cnblogs.com/ambition/archive/2012/04/12/flickr_api_upanddown.html

使用 flickr API 上传并获取外链相关推荐

  1. 如何用七牛云上传音乐生成外链

    收费的,不推荐使用,可以使用又拍云储存+CDN,再去申请又拍云联盟,一个月10g储存空间+15g流量,基本够用了 1.注册七牛云 2.新建对象储存 3.绑定自己的cdn域名 必须要备过案的域名 免费提 ...

  2. 又拍云+springboot+element实现头像上传并将外链地址存到数据库

    ·第一次尝试将图片以外链的形式存储到又拍云,将url保存到数据库,这样不管什么设备都可以读取得到图片,而且不用考虑vite打包时候的烦人的静态资源问题,这里将又拍云存储和前后端代码和思路记录了一下,方 ...

  3. (Ⅲ)使用七牛云作为图床获取外链方式总结(已更换为使用PicGO+腾讯云COS)

    1. 图床的选择 (1) 什么是图床? 很多技术人写作都有在用 Markdown 轻量级标记语言进行博客写作,这种写作让我们不用像使用 Word 那么麻烦调整排版和格式,而只需专心写作照样完成排版的一 ...

  4. (Ⅲ)使用七牛云作为图床获取外链方式总结(已更换为使用PicGO+腾讯云COS)...

    1. 图床的选择 (1) 什么是图床? 很多技术人写作都有在用 Markdown 轻量级标记语言进行博客写作,这种写作让我们不用像使用 Word 那么麻烦调整排版和格式,而只需专心写作照样完成排版的一 ...

  5. 2019 Google Drive Api 上传文件到谷歌云盘 获取分享下载链接

    如果图片失效或者格式已乱,建议阅读原文   在[案例]搭建 Quizzes 网站,每天赚取 30-50 美元 提到下载站项目,因为整个项目代码加上一些说明,会导致内容太多,所以准备分成几部分,这样看起 ...

  6. 微信小程序上传接口php,微信小程序API 上传、下载

    微信小程序API 上传.下载 wx.uploadFile(OBJECT) 将本地资源上传到开发者服务器.如页面通过 wx.chooseImage 等接口获取到一个本地资源的临时文件路径后,可通过此接口 ...

  7. 阿里云服务器Hadoop java api 上传文件报错 could only be written to 0 of the 1 minReplication nodes.

    问题描述 阿里云服务器命令行使用命令可以上传文件,但HDFS java API上传失败,上传后只有文件名没有数据 报错: could only be written to 0 of the 1 min ...

  8. 修改Chevereto的API上传相册和用户

    文章目录 废话篇 前言 1.下载PicGo插件 2.获取chevereto用户名和相册ID (1)获取用户名 (2)获取相册ID 3.修改chevereto代码 (1)复制php文件 (2)修改php ...

  9. 毕设 CC2530+esp8266使用AT指令上传与获取onenet服务器的数据

    CC2530+esp8266使用AT指令上传与获取onenet服务器的数据 我们首先看效果视频, VID_20221023_175149(0)(0) 我一开始做这个项目的时候我发现对于这个CC2530 ...

最新文章

  1. php7安装执行configure报错error: off_t undefined; check your library configuration
  2. STM32有哪些系列和型号?
  3. cdn属于一种技术吗
  4. 推荐 12 个提升程序员软技能与效率的必备工具,爱了爱了!
  5. python产品缺陷_基于python从redmine-api中获取项目缺陷数据(1)
  6. ajax实战用法详解
  7. 斗鱼搁浅多次终上市 能否凭借电竞直播讲出好故事?
  8. 二手车预测part1
  9. dede自动采集自动伪原创完美版插件 元旦优惠活动
  10. 短文本分类:电力95598工单分类实现
  11. MATLAB:未来搜索算法(FSA)优化BP神经网络权值、阈值用于降水预测
  12. 做淘宝产品标题要找蓝海关键词
  13. echarts全国各省地图数据资源
  14. 使用js关闭浏览器的方法
  15. 云计算介绍 tcp/ip协议介绍及配置
  16. Cortex-M系列处理器对比
  17. namespace 命名空间
  18. Keystone简介
  19. 4.网格系统、下拉菜单
  20. 一个内存不能被written的问题

热门文章

  1. 基于AM57x的GigE工业相机图像采集案例TL5728-IDK开发板
  2. 诺基亚地图——谷歌,苹果地图的挑战者
  3. 最速下降法最优步长的计算
  4. 在下面的html标记中属于双边标记的有,兰大《网页与网站设计》20春平时作业1满分...
  5. 知其所以然之Nacos配置中心源码浅析
  6. 爱奇艺独播视频qsv格式怎么转换为MP4格式
  7. Android GUI系统框架介绍
  8. Au cc插入多轨会话的图文教程
  9. 中科院计算所VIPL实验室2篇AAAI 2020论文导读
  10. Servlet技术总结