JavaScriptでGoogleのニュース記事を取得しようとしています。
ロリポップサーバー(PHPはCGIのみ対応)にajax.phpを置き、JavaScriptからGoogleニュースAPIに、そのPHPを中継させることで記事を取得できています(以下コード)。
検索ワードに『SMAP』と入れると、コンソール画面にSMAP関連の記事が一覧で取得できますが、検索ワードを『SMAP OR AAA』とすると、コンソールに以下のメッセージが表示され取得できません。前者では取得できて後者では取得エラーになる原因が分からず、回避策が分かる方教えていただければ幸いです。
ちなみに『SMAP OR AAA』としたURL『https://news.google.com/rss/search?q=SMAP OR AAA+&hl=ja&gl=JP&ceid=JP:ja』を、urx2.nuで短縮URLに変換し、そのURLをresultUrlに入れるとなぜか取得することができます。同じ短縮URLサービスであるBit.lyでもできるかと試すと、なぜかこちらでは何も取得できません。この動作の違いもよく分からないところです。
以上よろしくお願いいたします。
エラーメッセージ:
Access to XMLHttpRequest at 'https://www.AAAAAAAAAA.com/ajax.php?url=https%3A%2F%2Fnews.google.com%2Frss%2Fsearch%3Fq%3DSMAP%20OR%20AAA%2B%26hl%3Dja%26gl%3DJP%26ceid%3DJP%3Aja' from origin 'file://' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
JavaScript
1 // 検索ワード 2 var keyword = 'SMAP'; 3 4 // GoogleニュースAPIで取得するためのURLを作成 5 var url1 = 'https://news.google.com/rss/search?q=' 6 var url2 = '+&hl=ja&gl=JP&ceid=JP:ja' 7 8 var url = url1 + keyword + url2; 9 url = encodeURIComponent(url); // URLエンコード 10 var resultUrl = 'https://www.AAAAAAAAAAA.com/ajax.php?url=' + url; 11 12 // サーバーにアップしたajax.phpに、上記URLを投げて記事を取得 13 $.ajax({ 14 type: "GET", 15 url: resultUrl, 16 dataType: "xml", 17 crossDomain: true, 18 success: function(res){ 19 $(res).find('item').each(function(){ 20 var title = $(this).find('title').text(); // 記事タイトルを取得 21 console.log(title); // コンソール画面に記事タイトル一覧を出力 22 }) 23 }}); 24
PHP
1<?php 2 3 /// Access-Control-Allow-Originエラーを回避する 4 header("Access-Control-Allow-Origin: *"); 5 6 7 if (isset($_GET["url"]) && preg_match("/^https?:/",$_GET["url"])){ 8 echo file_get_contents($_GET["url"]); 9 } else { 10 echo "error"; 11 } 12 13?>