【问题标题】:unable to upload image using twitter api无法使用 twitter api 上传图片
【发布时间】:2016-06-17 13:37:31
【问题描述】:

我正在使用Net::Twitter(cpan link) 提供的 twitter API。我可以发布状态,但无法上传图片。

Perl 代码:

use strict;
use warnings;
use MIME::Base64;

use Net::Twitter;
use Scalar::Util 'blessed';

# When no authentication is required:
#my $nt = Net::Twitter->new(legacy => 0);
my $consumer_key = "consumerkey";
my $consumer_secret = "consumersecret";
my $token="token";
my $token_secret="tokensecret";

# As of 13-Aug-2010, Twitter requires OAuth for authenticated requests
my $nt = Net::Twitter->new(
    traits   => [qw/API::RESTv1_1/],
    consumer_key        => $consumer_key,
    consumer_secret     => $consumer_secret,
    access_token        => $token,
    access_token_secret => $token_secret,
);
eval { 
#my $result = $nt->update({status=>'some message'}); ##this works fine
my $result = $nt->upload({media=>'/some/path/toimage.jpeg' ,media_data => encode_base64('/some/path/toimage.jpeg')}); #this line produces error
    };

if ( my $err = $@ ) {
    die $@ unless blessed $err && $err->isa('Net::Twitter::Error');

    warn "HTTP Response Code: ", $err->code, "\n",
         "HTTP Message......: ", $err->message, "\n",
         "Twitter error.....: ", $err->error, "\n";
}

错误:

HTTP Response Code: 400

HTTP Message......: Bad Request 

Twitter error.....: media type unrecognized.

【问题讨论】:

    标签: perl api twitter


    【解决方案1】:

    从这个答案here得到启发。

    我在 perl 中也做过类似的事情:

    my @filename = ('path/to/image.jepg');
    my $result = $nt->update_with_media({status=>'hI',media=>\@filename});
    

    这非常有效。虽然这里只有数组引用有效。

    注意:根据文档和来自@simbabque 的答案link

    上传上传(媒体)

    参数:媒体
    必需:媒体
    将图像上传到 twitter 而不在时间轴上发布它们

    返回:图片

    我猜这只会上传但不会显示在时间线上。所以我用update_with_media的方法发图。

    【讨论】:

    • 啊。我以为你只想上传。
    • 这里可能有点混乱,我认为上传最初会发布到时间线,但是在我看到你的答案并意识到它的作用并使用了 update_with_media 之后。无论如何,由于没有适当的文档,我努力了 2 个小时来完成 update_media 的工作。
    • 我明白了。很高兴它现在有效。 :) 您可以向作者提交补丁并添加更多文档。 github repo 链接到 CPAN (github.com/semifor/Net-Twitter) 我相信作者对此表示赞赏。
    【解决方案2】:

    The documentationupload 上有点稀疏,但它确实说它需要一种叫做 media 的东西。

    上传

    上传(媒体)

    参数:媒体
    必需:媒体
    将图像上传到 Twitter,而不在时间轴上发布它们

    返回:图片

    然而,在at update_with_media 的正上方,它描述了一个实体媒体

    media[] 参数是一个数组引用,具有以下内容 解释:

    [ $file ]
    [ $file, $filename ]
    [ $file, $filename, Content_Type => $mime_type ]
    [ undef, $filename, Content_Type => $mime_type, Content => $raw_image_data ]
    

    因此,基于此,我希望您的上传文件看起来像这样:

    my content_of_image_file; # open the file and read its content in binary mode
    my $result = $nt->upload([
      undef,
      'filename_as_it_should_appear_on_twitter.jpeg', # this is a guess
      Content_Type => 'image/jpeg',
      Content => encode_base64($content_of_image_file),
    ]);
    

    请注意,我没有对此进行测试。

    【讨论】:

    • 你能在这里澄清一下什么是二进制模式吗?
    • 好的,我在使用这种方法打开文件时尝试使用 binmode,但仍然出现相同的错误
    猜你喜欢
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多