画像掲示板でエラー

画像掲示板の泉で、フォロワー募集板のようなものを作ってみようと思い付き、夜中にプログラム修正をかけつつテスト投稿を何度かやっておりましたが、途中からテスト投稿時にエラーが表示され始めるようになってしまい、慌てて修正前バージョンに戻すといったことをやったりしていました。

とはいえ、戻してもまだエラーが継続する状態となってしまったので、エラー内容をよく見てみると、ニコニコ動画のURLアップロードあたりでエラーがでていることが分かりました。

ログファイルを何かの拍子に破壊したかな?とは思い、ログを眺めてみたりしてみましたが、全部の板で同様のエラーがでてしまっているようで、もう一度コードをしっかり読み直してみることにしました。

ニコ動APIのエラー

ニコニコ動画の貼り付け対応をした10年前頃のコードを読み直してみると、ニコニコのAPIにクエリを投げてサムネイルURLを取ってくるあたりでエラーがでていることが分かりました。

$Q = "https://ext.nicovideo.jp/api/getthumbinfo/".$line_array;
$P = xml_parser_create();
xml_parse_into_struct($P,file_get_contents($Q),$vals,$index);
xml_parser_free($P);

8年前のAPI仕様で書いたコードだったので、APIが遂に終わったんだろうとは思いまして、再度API仕様を調べてみるかと久々にニコニコ動画に行ってみたところ、こんな感じになってました。

ニコニコ緊急メンテナンス

ニコニコ緊急メンテナンス

どうやらニコニコ動画、静画、生放送といったサービスが全部止まっているようで、それらと同じようにAPIも死んでしまっているようでした。

ニコ動緊急メンテ対応

先程のコードをみてわかると思いますが、エラー処理も全くなしでfile_get_contents()でクエリを投げつけてしまっていたので、レスポンスデータが無い変数をパースしようとしてWarnningがでてしまってということのようです。

ということで、ストリームコンテキストで ‘ignore_errors’ => true を指定してステータスをとりあえず取りに行って、200だったらパースに進むといった感じに書き直してみました。

サムネイル画像を取ってくるだけなので、取れなかったらデフォルト画像でもはめこんでおけばOKという適当な感じです。

$Q = "https://ext.nicovideo.jp/api/getthumbinfo/".$line_array;
//ストリームコンテキスト作成
$context = stream_context_create(array(
 //エラー無視
 'http' => array('ignore_errors' => true)
));
$response = file_get_contents($Q, false, $context);
$pos = strpos($http_response_header[0], '200');
if($pos != false){
 $P = xml_parser_create();
 //サムネイル画像を取る
}else{
 //デフォルトのサムネイル画像はめこむ
}

ニコニコ動画でぐぐると「ニコニコ動画 メンテナンス」といったサジェストが出るくらい最近はメンテナンスが増えているのかもしれないですが、これで一安心という感じです。

おわりに:ニコニコ動画API

APIのリクエストURLは10年前からある動画情報取得用のgetthumbinfoを使っていますが、ニコニコ動画APIのページを見ると、何年か前に動画検索APIも用意されているようで、今はスナップショット検索API v2というものにバージョンアップまでされているようでした。

スナップショットAPIを見ると色々とデータが取れそうです。

titleタイトル
descriptionコンテンツの説明文
viewCounter再生数
mylistCounterマイリスト数またはお気に入り数
lengthSeconds再生時間(秒)
thumbnailUrlサムネイルのURL
startTimeコンテンツの投稿時間
lastResBody最新のコメント
commentCounterコメント数
lastCommentTime最終コメント時間
categoryTagsカテゴリタグ
tagsタグ(空白区切り)
tagsExactタグ完全一致(空白区切り)
genreジャンル
genre.keywordジャンル完全一致

同じように、YouTubeにもAPIは用意があるので、この2つを合わせて動画横断検索でも作ったら面白いかもしれないですね。