Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 无法使用twitter api上载图像_Perl_Api_Twitter - Fatal编程技术网

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()上链接的,我相信作者对此表示赞赏。