ディレクトリ型検索エンジン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ニュースのエラーページが表示されるようになっていました。先日まで普通に機能をしていたので、何か仕様変更があったのかもしれません。

Bing News Search APIのリンクが壊れている
MSNニュースのエラー画面が表示された

どうやら、ほとんどのニュース記事のリンク先がこのパターンとなっており、取得したニュース記事のリンクが壊れてしまっているようです。

とはいえ、ニュース記事のタイトルは正確に表示されているので、APIからは普通にjsonのレスポンスが取れているようなので、とりあえずテストプログラムを作ってJSONデータをチェックしてみることにしました。

jsonのレスポンスデータは壊れていない

テストプログラムで取得したjsonデータから記事タイトル、URLを配列で取り出してみると、特に壊れてはいないようです。となると、サイトで表示するためにMySQLに一旦データを貯めるあたりで壊れたということのようです。

下画像の長々しいURL文字列とMySQLのINSERTで壊れたというあたりで原因が分かった方は多いと思いますが、そうです、INSERTするテーブルのカラムの文字数制限を超えてしまっていたので、URLがきちんと保存できていなかったということが原因でした。

Bing News Search APIでのJSONレスポンスデータは問題ない
JSONの生データのURLはきちんと表示されていた

ニュース記事のリンク先URLが変化した

2020年12月のレスポンスデータ

Bing News Search APIをを使ってニュース情報を取得し始めた先月のレスポンスデータをみると、ニュース記事は各メディアのサイトURLをそのまま返していたので、URL文字列は長くても100文字程度で収まってくれていました。

R東日本とKDDI、品川開発プロジェクトをコアとした新たな分散型 …
https://www.excite.co.jp/news/article/DigitalShiftTimes_FN201216_3/

36歳バースデーの平愛梨、夫・長友佑都からのサプライズ …
https://nlab.itmedia.co.jp/nl/articles/2012/16/news078.html

2020年12月のAPIレスポンスのニュース記事タイトル・URL

2021年1月のレスポンスデータ

エラーとなっていた直近のニュース情報のデータをみると、URLはどれもmsn.comを経由して各メディアのニュース記事を表示するといった形に変更されており、恐ろしく長い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

2021年1月のAPIレスポンスのニュース記事タイトル・URL

どうやら、Bing News Search APIで提供するニュース情報も、しっかりmsn.comのニュースページを経由して表示するように仕様を変更していたようです。下画像のようなYahooニュースと同じようなつくりになったということのようです。

APIのレスポンスはmsnニュースのURLとなった
読売新聞の記事をmsnニュースで表示

テーブルのデータを見てみると、どうやら先週頃に突然仕様が変更になっていたみたいです。

URL用のカラムがvarchar(255)

一方、このニュース情報保管用に作ったテーブルをみると、記事URL用に設定したカラムはvarchar(255)で設定していたため、以前のような100文字行かない程度のURLであればうまく収まってくれていたようですが、255文字を超えるような長々しいURLばかりとなってしまったので、尻切れになってしまっていたということのようです。

なんとも情けない原因でお恥ずかしい限りです。カラムの文字制限数を増やしてあっさり解決することができました。

おわりに

ということで、無事にdtn.jpトップページのニュースも正常に戻すことができました。

メディアからニュースデータは買ってるはずなのに、Bing News Search APIでは自分のサイトも経由せずにメディアサイトの直リンクを提供しているので凄いとは思っていましたが、単にAPIを提供しているチームが細かいことを特に気にしてなかっただけだったということなのかもしれないです。

ABOUT dtn.jp

この運営ブログをみてdtn.jpの運営サイトに興味をお持ちになった方は下記のリンク集からサイトをご参照ください。PHP・SQL・JS・HTML・CSSや様々なAPIでゼロから立ち上げたサイトを複数運営しています。

dtn.jp関連サイト

  • ディレクトリ型検索エンジンdtn大手は全てサービスを終了してしまい、中小でも運営を継続するところがほとんど無くなったディレクトリ型検索エンジンを、2002年から細々運営しております。今も申請されたサイトは実際に管理人が訪問して確認後に登録しています。是非登録どうぞ。
  • 猫ネコサーチエンジン猫・ペットサイト専用のディレクトリ型検索エンジンです。登録サイトはサイトのスクリーンショット付きでカテゴリに掲載をいたします。
  • 画像掲示板の泉画像・YouTube・ニコニコ動画・Tiktokの貼り付けが可能な匿名画像掲示板です。27ジャンルに分かれた掲示板に、それぞれ100スレッドまで立てることが可能です。
  • ツイータンTwitter APIを使って10分おきに収集したTwitterトレンドワード・人気ハッシュタグデータを、月別に集計してランキング形式で公開しています。年間トレンドワードも公開中。
  • Keyword Tool++Yahooショッピングや楽天のトレンドワードデータを日次収集し、EC系の人気キーワードをラインキング形式でご紹介しています。各ワードの検索ボリュームや関連語、24か月の検索ボリュームをグラフで確認が可能です。
  • 消費者金融の泉カードローン商品を取り扱う金融業者を一覧で比較可能としたサイトです。カテゴリ別、人気度別、限度額別、金利別に比較可能です。
  • TrendinGファッションブランドを人気アイテムヒット率でランキング化し、一覧でご紹介しているサイトです。

各サイトの開発方法などについて

各サイトの開発方法や運用トラブルについては、当ブログで不定期にご紹介しています。Twitterで新着記事のお知らせもしています。宜しければフォロー下さい。