gpt4 book ai didi

json - 用于同时请求的 perl Mojo 和 JSON

转载 作者:行者123 更新时间:2023-12-01 23:24:39 25 4
gpt4 key购买 nike

我通常不是 Perl 程序员。但是我必须完成这个任务。

以下代码适用于我:

#!/usr/bin/perl

use LWP::UserAgent;
use JSON;
use strict;

my $md5 = $ARGV[0];
$md5 =~ s/[^A-Fa-f0-9 ]*//g;
die "invalid MD5" unless ( length($md5) == 32 );

my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 1 }, timeout => 10);
my $key="12345...7890";
my $url='https://www.virustotal.com/vtapi/v2/file/report';
my $response = $ua->post( $url, ['apikey' => $key, 'resource' => $md5] );
die "$url error: ", $response->status_line unless $response->is_success;
my $results=$response->content;

my $json = JSON->new->allow_nonref;
my $decjson = $json->decode( $results);

print "md5: ",$md5,"\n";
print "positives: ", $decjson->{"positives"}, "\n";
print "total: ", $decjson->{"total"}, "\n";
print "date: ", $decjson->{"scan_date"}, "\n";

现在我想重新编写上面的代码,以便使用 Mojo 使用异步 http。我正在尝试这个:

#!/usr/bin/perl

use warnings;
use strict;
use Mojo;
use Mojo::UserAgent;

my $md5 = $ARGV[0];
$md5 =~ s/[^A-Fa-f0-9 ]*//g;
die "invalid MD5" unless ( length($md5) == 32 );

my ($vt_positives, $vt_scandate, $response_vt);
my $url='https://www.virustotal.com/vtapi/v2/file/report';
my $key="12345...7890";
my $ua = Mojo::UserAgent->new;
my $delay = Mojo::IOLoop->delay;

$ua->max_redirects(0)->connect_timeout(3)->request_timeout(6);
$ua->max_redirects(5);
$delay->begin;

$response_vt = $ua->post( $url => ['apikey' => $key, 'resource' => $md5] => sub {
my ($ua, $tx) = @_;
$vt_positives=$tx->res->json->{"positives"};
print "Got response: $vt_positives\n";
});

Mojo::IOLoop->start unless Mojo::IOLoop->is_running;

第一个代码没问题,第二个不行。发送请求时我一定是做错了什么,因为我似乎收到了 403 响应(不正确的 API 使用)。我也试过 -> json 调用,但没有成功。

即使我正确地完成了请求,我也不确定我是否使用 Mojo 正确解码了 json 结果。

帮助将不胜感激!

最佳答案

编辑

我们似乎错过了真正的问题,即如何发布表单。很抱歉。

发布表单取决于您使用的 Mojolicious 版本。 Until recently (v3.85 -- 2013-02-13) 有一个 post_form 方法。然而,经过反射(reflection),我们决定要么为每种请求类型提供 *_form 方法,要么我们应该做一些更聪明的事情,因此 form generator诞生了。

$response_vt = $ua->post( 
$url,
form => {'apikey' => $key, 'resource' => $md5},
sub { ... }
);

它可以添加到任何请求方法中,使其比旧形式更加一致。另请注意,它应该是一个 hashref,而不是 LWP 允许的 arrayref。顺便说一句,还有一个 json 生成器也可以像这样工作,或者你甚至可以 add your own !

我将保留我原来的答案,显示非阻塞用法,您现在可以根据上述内容进行修改。

原创

从 creaktive 构建逻辑,这就是我要开始的方式。主要区别在于,没有监视器监视以确保有工作正在进行,而是在完成后检查以确保没有闲置者。

我也对解析逻辑做了一些改动,但没什么大不了的。

#!/usr/bin/env perl
use Mojo::Base -strict;
use utf8::all;

use Mojo::URL;
use Mojo::UserAgent;

# FIFO queue
my @urls = qw(
http://sysd.org/page/1/
http://sysd.org/page/2/
http://sysd.org/page/3/
);

# User agent following up to 5 redirects
my $ua = Mojo::UserAgent
->new(max_redirects => 5)
->detect_proxy;

start_urls($ua, \@urls, \&get_callback);

sub start_urls {
my ($ua, $queue, $cb) = @_;

# Limit parallel connections to 4
state $idle = 4;
state $delay = Mojo::IOLoop->delay(sub{say @$queue ? "Loop ended before queue depleated" : "Finished"});

while ( $idle and my $url = shift @$queue ) {
$idle--;
print "Starting $url, $idle idle\n\n";

$delay->begin;

$ua->get($url => sub{
$idle++;
print "Got $url, $idle idle\n\n";
$cb->(@_, $queue);

# refresh worker pool
start_urls($ua, $queue, $cb);
$delay->end;
});

}

# Start event loop if necessary
$delay->wait unless $delay->ioloop->is_running;
}

sub get_callback {
my ($ua, $tx, $queue) = @_;

# Parse only OK HTML responses
return unless
$tx->res->is_status_class(200)
and $tx->res->headers->content_type =~ m{^text/html\b}ix;

# Request URL
my $url = $tx->req->url;
say "Processing $url";
parse_html($url, $tx, $queue);
}

sub parse_html {
my ($url, $tx, $queue) = @_;

state %visited;

my $dom = $tx->res->dom;
say $dom->at('html title')->text;

# Extract and enqueue URLs
$dom->find('a[href]')->each(sub{

# Validate href attribute
my $link = Mojo::URL->new($_->{href});
return unless eval { $link->isa('Mojo::URL') };

# "normalize" link
$link = $link->to_abs($url)->fragment(undef);
return unless grep { $link->protocol eq $_ } qw(http https);

# Don't go deeper than /a/b/c
return if @{$link->path->parts} > 3;

# Access every link only once
return if $visited{$link->to_string}++;

# Don't visit other hosts
return if $link->host ne $url->host;

push @$queue, $link;
say " -> $link";
});
say '';

return;
}

关于json - 用于同时请求的 perl Mojo 和 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15152633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com