使用 perl 通过 API 在 tumblr 上发布本地图像文件

Posted

技术标签:

【中文标题】使用 perl 通过 API 在 tumblr 上发布本地图像文件【英文标题】:Post local image file on tumblr via API with perl 【发布时间】:2013-05-10 14:56:35 【问题描述】:

我一直在用 perl 弄乱 tumblr API,并得到了几个可以工作的函数。

但是,我无法通过 perl 上传本地图像文件。

这是适用于 URL 的代码

    use LWP::Authen::OAuth;
    use JSON;
    use Data::Dumper;
    use strict;
         my $ua = LWP::Authen::OAuth->new(
             oauth_consumer_key => 'xxx',
             oauth_consumer_secret => 'xxx',
             oauth_token => 'xxx',
             oauth_token_secret => 'xxx',
     );




    my $response;
    $response = $ua->post( 'http://api.tumblr.com/v2/blog/mytumblr.tumblr.com/post', [
         type    => 'photo',
         url    => 'http://www.example.com/mypic.jpg' ,
         caption => 'Test image 1',
     ]);


    if ($response->is_success) 
      print "it worked";
    
    else 
     print "it did not work \n \n \n \n";
     print $response->as_string;
   

但是,当我在帖子参数中将“url”替换为“data”时(按照此处的 API 描述中的说明 - http://www.tumblr.com/docs/en/api/v2#posting),我不断收到来自 tumblr 的错误响应。我尝试了几种输入“数据”参数的方法 - 作为文件的路径,作为二进制表示,作为 URL 编码的二进制表示,作为 url 编码的 base64 二进制表示,将其中一个值作为唯一元素在一个数组中 - 我已经尝试了所有,并且每一个我都会从 tumblr 收到一条错误消息。

那么,有人可以告诉我如何将本地图像文件上传到 tumblr 吗?

【问题讨论】:

你遇到了什么错误? HTTP/1.1 400 Bad Request Connection: close Date: Wed, 15 May 2013 21:48:31 GMT Server: nginx Content-Type: application/json; charset=utf-8 Client-Date: Wed, 15 May 2013 21:48:31 GMT Client-Peer: 66.6.40.14:80 Client-Response-Num: 1 Client-Transfer-Encoding: chunked P3P: CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL" Set-Cookie: tmgioct=519402aea446110439257710; expires=Sat, 13-May-2023 21:48:30 GMT; path=/; httponly "meta":"status":400,"msg":"Bad Request","response":"errors":["Error uploading photo."] 尝试删除标题部分 - 可以吗? 【参考方案1】:

我对 tumblr API 并不完全熟悉,但通过谷歌搜索找到了这个示例:https://gist.github.com/derekg/1198576

我会试试的

$response = $ua->post( 'http://api.tumblr.com/v2/blog/mytumblr.tumblr.com/post', [
     type    => 'photo',
     'data[0]'    => $file_contents , ## LWP::Useragent should automatically urlencode this
     caption => 'Test image 1',
 ]);

根据这个答案https://***.com/a/177866/810448,“data[]”可能也适用于这种情况。

如果 LWP::Useragent 还没有这样做,我还会考虑将“Content-type: application/x-www-form-urlencoded”添加到请求标头中。

【讨论】:

这似乎也不起作用 - 但是这次我似乎遇到了以下错误: HTTP/1.1 401 未授权连接:关闭日期:2013 年 5 月 16 日星期四 17:48:56 GMT 服务器:Apache Vary:Accept-Encoding Content-Length:60 Content-Type:application/json客户端日期:星期四,2013 年 5 月 16 日 17:48:59 GMT 客户端:66.6.40.14:80 客户端响应编号:1 客户端警告:缺少身份验证标头 P3P:CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL" Set-Cookie: tmgioct=51951c0b8ea0630258123660; expires=星期日,2023 年 5 月 14 日 17:48:59 GMT;路径=/; httponly X-Tumblr-Usec: D=3649265 "meta":"status":401,"msg":"Not Authorized","response":[] 还有 - 两个后续问题 - 你用什么来获取文件内容?以及如何在 UA 帖子中设置内容类型?我为每种方法尝试了几种方法(File::Slurp, my $imagepath = 'C:\scripts\vega1.jpg'; open (IMAGE, $imagepath) or die "$!"; my $raw_string = do local $ / = undef; ; ;) - 用于文件上传,使用 $ua->default_header(''Content-type' => 'application/x-www-form-urlencoded' );,或将其指定为POST 请求中的参数 - 全部为空。老实说,我有点困惑

以上是关于使用 perl 通过 API 在 tumblr 上发布本地图像文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Tumblr PHP API 时出现致命错误 cURL 错误 60 [重复]

Tumblr API v2 的“默认回调 URL:”是啥?

Tumblr API v2 的“默认回调 URL:”是啥?

JavaScript 使用jquery从Tumblr API获得最新的5个标题

Tumblr JSON API实现

Tumblr API包装器