Perl 无法使用twitter api上载图像
我正在使用由Perl 无法使用twitter api上载图像,perl,api,twitter,Perl,Api,Twitter,我正在使用由Net::twitter()提供的twitterapi。我可以发布状态,但无法上传图像 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_k
Net::twitter
()提供的twitterapi。我可以发布状态,但无法上传图像
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.
错误:
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.
在上传上有点稀疏,但它确实说它需要一种叫做媒体的东西
上传
上传(媒体)
参数:媒体必需:媒体
将图片上传到twitter,而不在时间线上发布 返回:图像 但是,它的正上方描述了一个实体介质
media[]
参数是一个带有以下内容的arrayref
解释:
[ $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),
]);
注意,在从这个答案中得到启发后,我还没有测试过这个。 我在perl中也做了类似的事情:
my @filename = ('path/to/image.jepg');
my $result = $nt->update_with_media({status=>'hI',media=>\@filename});
这很有效。虽然这里只有数组引用有效
注:根据文件和@simbabque answer
上传(媒体)
参数:媒体必需:媒体
将图像上传到twitter,而不将其发布在时间线上 返回:图像
我猜这只会上传,但不会显示在时间线上。因此,我使用了
update\u with\u media
方法来发布图像。你能澄清一下这里的二进制模式是什么吗?好的,我在使用这种方法打开文件时尝试了使用binmode,但仍然是相同的错误啊。我原以为你只想上传。这里可能有点混乱,我原以为上传会发布到timeline上,但在我看到你的答案并意识到它的作用并使用update_with_media之后。无论如何,我花了2个小时来完成更新媒体的工作,因为没有合适的文档。我明白了。很高兴它现在起作用了。:)您可以向作者提交补丁并添加更多文档。github repo是在CPAN()上链接的,我相信作者对此表示赞赏。