ディレクトリ型検索エンジンdtnのトップページでは、Bing News Search APIで取得したニュース記事を表示して、ポータルサイトっぽい雰囲気を演出しております。
Bing News Search APIで取得したニュース記事タイトル、記事URLをリンクに仕立てて表示しているだけですが、サイト立ち上げ当初から表示をさせていたので、私自身サイトのチェックをするついでにニュースを眺めるのが習慣になっており、なんとなく欠かせないコンテンツの一つになっておりました。
そのニュース記事のリンクが、ある時期からほとんど壊れてしまっていることに気がついたので、APIの仕様やレスポンスを今一度調べてみることにしました。
結果、APIから受け取る記事URLの文字列が恐ろしく長いものに突如変化し、データを貯めていたSQLのカラムvarchar(255)をはるかに超えてしまっていたことが原因ということが分かりました。DBにため込む際にリンクURLが尻切れになっていたようです。
この記事では、このBing News Search APIのニュース記事表示不具合を修正した経緯についてご紹介したいと思います。
dtn.jpトップページのニュース記事
Bing News Search APIを使ってニュース記事を表示する方法は以前こちらの記事でまとめておりました。
BingのWeb Search API v7に用意されているNews Search APIというAPIを使ってニュース記事をカテゴリ別に取得しておりますが、APIでは最新のニュース記事が無料で取得することができるので、今では貴重なサービスといえます。(かつてはYahooのニュースAPIがありましたが、もうなくなってしまいました。)
ニュース記事のリンクが壊れる
サイトに表示されたニュース記事を見てみようとリンクを進んでみたところ、MSNニュースのエラーページが表示されるようになっていました。先日まで普通に機能をしていたので、何か仕様変更があったのかもしれません。
どうやら、ほとんどのニュース記事のリンク先がこのパターンとなっており、取得したニュース記事のリンクが壊れてしまっているようです。
とはいえ、ニュース記事のタイトルは正確に表示されているので、APIからは普通にjsonのレスポンスが取れているようなので、とりあえずテストプログラムを作ってJSONデータをチェックしてみることにしました。
jsonのレスポンスデータは壊れていない
テストプログラムで取得したjsonデータから記事タイトル、URLを配列で取り出してみると、特に壊れてはいないようです。となると、サイトで表示するためにMySQLに一旦データを貯めるあたりで壊れたということのようです。
下画像の長々しいURL文字列とMySQLのINSERTで壊れたというあたりで原因が分かった方は多いと思いますが、そうです、INSERTするテーブルのカラムの文字数制限を超えてしまっていたので、URLがきちんと保存できていなかったということが原因でした。
ニュース記事のリンク先URLが変化した
2020年12月のレスポンスデータ
Bing News Search APIをを使ってニュース情報を取得し始めた先月のレスポンスデータをみると、ニュース記事は各メディアのサイトURLをそのまま返していたので、URL文字列は長くても100文字程度で収まってくれていました。
R東日本とKDDI、品川開発プロジェクトをコアとした新たな分散型 …
2020年12月のAPIレスポンスのニュース記事タイトル・URL
https://www.excite.co.jp/news/article/DigitalShiftTimes_FN201216_3/
36歳バースデーの平愛梨、夫・長友佑都からのサプライズ …
https://nlab.itmedia.co.jp/nl/articles/2012/16/news078.html
2021年1月のレスポンスデータ
エラーとなっていた直近のニュース情報のデータをみると、URLはどれもmsn.comを経由して各メディアのニュース記事を表示するといった形に変更されており、恐ろしく長いURL文字列に変化をしていました。
【共通テスト速報】作問担当者「難化したと見えるかも」
2021年1月のAPIレスポンスのニュース記事タイトル・URL
https://www.msn.com/ja-jp/news/national/e3-80-90-e5-85-b1-e9-80-9a-e3-83-86-e3-82-b9-e3-83-88-e9-80-9f-e5-a0-b1-e3-80-91-e4-bd-9c-e5-95-8f-e6-8b-85-e5-bd-93-e8-80-85-e3-80-8c-e9-9b-a3-e5-8c-96-e3-81-97-e3-81-9f-e3-81-a8-e8-a6-8b-e3-81-88-e3-82-8b-e3-81-8b
石原プロの58年に“完”裕次郎さん仏前に商号返還…舘「おもちゃ箱のようだった」
https://www.msn.com/ja-jp/news/entertainment/%E7%9F%B3%E5%8E%9F%E3%83%97%E3%83%AD%E3%81%AE%EF%BC%95%EF%BC%98%E5%B9%B4%E3%81%AB-%E5%AE%8C-%E8%A3%95%E6%AC%A1%E9%83%8E%E3%81%95%E3%82%93%E4%BB%8F%E5%89%8D%E3%81%AB%E5%95%86%E5%8F%B7%E8%BF%94%E9%82%84-%E8%88%98
どうやら、Bing News Search APIで提供するニュース情報も、しっかりmsn.comのニュースページを経由して表示するように仕様を変更していたようです。下画像のようなYahooニュースと同じようなつくりになったということのようです。
テーブルのデータを見てみると、どうやら先週頃に突然仕様が変更になっていたみたいです。
URL用のカラムがvarchar(255)
一方、このニュース情報保管用に作ったテーブルをみると、記事URL用に設定したカラムはvarchar(255)で設定していたため、以前のような100文字行かない程度のURLであればうまく収まってくれていたようですが、255文字を超えるような長々しいURLばかりとなってしまったので、尻切れになってしまっていたということのようです。
なんとも情けない原因でお恥ずかしい限りです。カラムの文字制限数を増やしてあっさり解決することができました。
おわりに
ということで、無事にdtn.jpトップページのニュースも正常に戻すことができました。
メディアからニュースデータは買ってるはずなのに、Bing News Search APIでは自分のサイトも経由せずにメディアサイトの直リンクを提供しているので凄いとは思っていましたが、単にAPIを提供しているチームが細かいことを特に気にしてなかっただけだったということなのかもしれないです。