実現したいこと
Chrome拡張機能から、ニコニコ動画のスナップショット検索APIを利用したい。
発生している問題・エラーメッセージ
Access to fetch at 'https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search?q=%E5%88%9D%E9%9F%B3%E3%83%9F%E3%82%AF&targets=title&fields=contentId,title,viewCounter&filters[viewCounter][gte]=10000&_sort=-viewCounter&_offset=0&_limit=3&_context=apiguide' from origin 'chrome-extension://【Extension ID】' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
該当のソースコード
・manifest.json
json
1{ 2 "manifest_version": 3, 3 4 // 中略 5 6 "background": { 7 "service_worker": "event.js" 8 }, 9 "permissions": [ 10 "tabs" 11 ], 12 "content_scripts": [ 13 { 14 "matches": ["http://hogehoge/*"], 15 "css": ["style.css"], 16 "js": ["main.js"] 17 } 18 ], 19 "host_permissions": [ 20 "<all_urls>" 21 ] 22}
・main.js
JavaScript
1async function fetchMovie(){ // 特定のhtmlボタンが押されたら発火する 2 await chrome.runtime.sendMessage({name: 'fetchMovie'}); 3} 4 5chrome.runtime.onMessage.addListener((request, options) => { 6 if (request.name === 'movieTitle') { 7 let title = request.data.returnValue; 8 9 const movieTitle = document.getElementById('movieTitle'); 10 movieTitle.textContent = title; 11 } 12});
・events.js
JavaScript
1chrome.runtime.onMessage.addListener((request) => { 2 let returnValue = null; 3 4 if (request.name === 'fetchMovie') { 5 let url = 'https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search' + 6 '?q=%E5%88%9D%E9%9F%B3%E3%83%9F%E3%82%AF&targets=title&fields=contentId,title,viewCounter' + 7 '&filters[viewCounter][gte]=10000&_sort=-viewCounter&_offset=0&_limit=3&_context=apiguide'; 8 9 fetch(url) 10 .then( 11 resp => {resp.json()} 12 ).then( 13 json => {returnValue = json} 14 ); 15 } 16 17 chrome.tabs.query({active: true, currentWindow: true}, (tabs) => { 18 chrome.tabs.sendMessage( 19 tabs[0].id, { 20 name: 'movieTitle', 21 data: {returnValue} 22 } 23 ) 24 }); 25});
試したこと
Chrome 拡張機能の CORS エラーを回避(Manifest V3)を参考に、manifest.jsonに「host_permissions」を追加し、「https: //api.search.nicovideo.jp/*」 や「https: //api.search.nicovideo.jp/api/v2/snapshot/video/contents/*」、「https: //*/*」などを記載してみたのですが、いずれも上手くいきませんでした。(リンクになってしまうので空白入れています。)
また、fetch関数のmodeにno-corsを設定してみたところ空のレスポンスが返ってきました。
回答2件
あなたの回答
tips
プレビュー