www.googleapis.com:443 (Crypt-SSLeay can’t verify hostnames) 対策

事象

5月末くらいから YouTube から動画リンクが取得できなくなっていたので対処。
サブルーチン部分だけテストしてみると、www.googleapis.com:443 (Crypt-SSLeay can’t verify hostnames) が返されていた。
API側で変更でもあったのかと思い確認したが、ブラウザから URL を叩けば正常に JSON が返されているため別の要因だと考えられる。

サンプルスクリプトは以下のようなものです。

#!/usr/bin/env perl
# =========================================================================== #
#
#
# --------------------------------------------------------------------------- #
use strict;
use warnings;
use utf8;
use Encode;
use URI::Escape;
use LWP::Simple;
use DateTime;
use HTTP::Cookies;

# =========================================================================== #
# YouTube API v3 利用設定
#
# --------------------------------------------------------------------------- #
# レスポンスはJSON形式
use JSON;
my %youtube_api_params = (
uri => 'https://www.googleapis.com/youtube/v3/search?',
key => 'API用キー',
part => 'id,snippet'
);

$youtube_api_params{keyword} = 'かしゆか';

# =========================================================================== #
# LWP::UserAgent 設定
#
# --------------------------------------------------------------------------- #
# MSWin32: C:\Users\daisuke\AppData\Local\Temp
# linux : /tmp/
# darwin : /tmp/
my $jar = HTTP::Cookies->new( autosave=> 1 );
if ($^O =~ 'MSWin32') { $jar->{file} = "$ENV{'TMP'}\\lwp_cookies.dat"; }
elsif ($^O =~ 'linux' || $^O =~ 'darwin') { $jar->{file} = '/tmp/lwp_cookies.dat';}

my $try_times = 3;
my $interval = 1;
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36');
#$ua->proxy('http','http://prox.jp:8080');
$ua->cookie_jar($jar);

ddump( get_youtube_video_links(%youtube_api_params));

# =========================================================================== #
# subroutine
#
# --------------------------------------------------------------------------- #

sub get_youtube_video_links{
# =========================================================================== #
# キーワードにマッチした動画リンクを YouTube API を利用して収集する
# --------------------------------------------------------------------------- #
%youtube_api_params = @_;
undef $youtube_api_params{links};
$youtube_api_params{keyword} = uri_escape_utf8( $youtube_api_params{keyword} );
my $req_uri = $youtube_api_params{uri}.'q='.$youtube_api_params{keyword}.'&key='.$youtube_api_params{key}.'&part='.$youtube_api_params{part};
print $req_uri."\n";
# URLへアクセスし応答内容を取得し、videoIDを抽出して動画へのリンクを作成する
my $res = $ua->get($req_uri);
if ($res->is_success) {
my $json_text = $res->content;
print $json_text;
my $data = decode_json($json_text);
for( my $i=0; $i<=$#{$data->{items}}; $i++ ){
push( @{ $youtube_api_params{links} }, 'https://www.youtube.com/watch?v='.$data->{items}[$i]->{id}->{videoId} );
}
} else {
print $res->status_line."\n";
}

return %youtube_api_params;
}

sub ddump{
# =========================================================================== #
# DEBUG: データ構造確認(Data::Dumper)
# --------------------------------------------------------------------------- #
use Data::Dumper;
print Dumper @_;
}

__END__

これを実行すると、以下のような結果が標準出力されるはず。


https://www.googleapis.com/youtube/v3/search?q=%E3%81%8B%E3%81%97%E3%82%86%E3%81%8B&key=APIのキー&part=id,snippet
500 Can't connect to www.googleapis.com:443 (Crypt-SSLeay can't verify hostnames)
$VAR1 = 'key';
$VAR2 = 'APIのキー';
$VAR3 = 'links';
$VAR4 = undef;
$VAR5 = 'uri';
$VAR6 = 'https://www.googleapis.com/youtube/v3/search?';
$VAR7 = 'part';
$VAR8 = 'id,snippet';
$VAR9 = 'keyword';
$VAR10 = '%E3%81%8B%E3%81%97%E3%82%86%E3%81%8B';

対策

LWP を use した後に以下の行を追加する。

$ENV{‘PERL_LWP_SSL_VERIFY_HOSTNAME’} = 0;

単純にこのエラーを無視するというだけの暫定対処なのかもしれない。
そもそも、このエラーが出るということは Google API (www.googleapis.com) が利用する SSL の証明書でホスト名などのミスマッチが発生しているということなのだろうか。

参考

stackoverflow – Crypt-SSLeay can’t verify hostnames

スポンサーリンク

シェアする

フォローする

スポンサーリンク