javascript:/* v1.2.0 */(()=>{const t=(t,e)=>{const n=document.getElementById(t);if(!n)throw new Error("予期されないs_idです。",t);n.innerText=e},e=t=>{const e=document.getElementById(t);if(!e)throw new Error("予期されないs_idです。",t);e.style.color="red",e.style.fontWeight="bold"},n=t=>{const e=document.getElementById("qag_buttons");if(!e)return void alert(t);const n=document.getElementById("ok_button"),o=document.getElementById("cancel_button");e.insertAdjacentHTML("beforebegin",`<div style="margin-block-start: 10px;">${t}</div>`),n.disabled=!1,o.disabled=!0,n.focus()},o=(e,n=!1,o=!1)=>{if(void 0===e)return;const{headers:a}=e,r=Number(a.get("rate-remaining")),i=a.get("rate-limit");n||console.log("rate:",r,"/",i),o||(t("qag_rate_remaining",r),t("qag_rate_limit",i));const s=new Date(1e3*Number(e.headers.get("rate-reset"))).toLocaleString().replace(/:\d+$/u,"");return n||console.log("rate-reset:",s),o||t("qag_reset",s),[r,s]},a=(e,n,o)=>{console.log(`fetch ${e} page = ${n}${o?` / ${o}`:""}`),t("qag_current_page",n)},r=(t,e,n=0)=>(a("user",e,n),fetch(`https://qiita.com/api/v2/users/${t}/items?page=${e}&per_page=100`)),i=(t,e,n=0)=>(a("user stocked",e,n),fetch(`https://qiita.com/api/v2/users/${t}/stocks?page=${e}&per_page=100`)),s=(t,e,n=0)=>(a("tag",e,n),fetch(`https://qiita.com/api/v2/tags/${t}/items?page=${e}&per_page=100`)),c=(t,e,n=0)=>(a("search",e,n),fetch(`https://qiita.com/api/v2/items?page=${e}&per_page=100&query=${t}`)),l=t=>new Date(t).toLocaleString(),d=async(n,a)=>{let r,i,s,c,l;try{s=await a(n,1),[c,l]=o(s),i=await s.json(),r=i;const d=(e=>{const n=e.headers.get("link").match(/(?<=\bpage=)(\d+)/gu),o=Number(n.at(-1));return console.log("n_last_page = ",o),t("qag_last_page",o),o})(s);((t,n)=>{if(t>n+1){const o=`***WARNING*** last_page(${t}) > rate_remaining(${n}) + 1`;console.log(`%c${o}`,"color:hotpink;"),e("qag_rate_remaining")}})(d,c);for(let t=2;t<=d;t++)s=await a(n,t,d),o(s,!0),i=await s.json(),r.push(...i);return console.log("fetch完了"),o(s),[r,l,s]}catch(t){return console.log("例外が発生しました。",t),console.log("json=",i),console.log("response=",s),o(s,!1,!0),[r,l,s]}};const g=async(t,o,a)=>{const[g,u,p]=await((t,e,n)=>{switch(t){case"tag":return console.log(`タグ:「${decodeURIComponent(e)}」でfetch開始します。`),d(e,s);case"search":case"organization":return console.log(`検索語:「${decodeURIComponent(e)}」でfetch開始します。`),d(e,c);case"user":if(console.log(`ユーザーID:「${e}」(${n})でfetch開始します。`),"投稿"===n)return d(e,r);if("ストック"===n)return d(e,i);throw new Error("予期されないs_arg2です。",n);default:throw new Error("予期されないswitchです。")}})(t,o,a);((t,o,a)=>{if(!a){const t="ネットワークが未接続のようです。";return console.error(t),void n(t)}if(!t){if(!a.ok){const t=`サーバーの調子が悪いようです。HTTPステータスコード: ${a.status}`;return console.error(t),void n(t)}const t="jsonを取得できませんでした。「"+(o?`${o.toLocaleString()}」まで待ってください。`:"");return console.error(t),void n(t)}if(!a.ok&&"not_found"===t.type){const t="見つかりませんでした。";return console.error(t),void n(t)}if(console.log(t),window.json=t,"rate_limit_exceeded"===t.type){const t="回数制限を超えました。「"+(o?`${o.toLocaleString()}」まで待ってください。`:"");return console.error(t),void n(t)}0===t.length&&(console.log("%c取得した記事数が0件です。","color:hotpink;"),e("qag_last_page"));const r=(t=>`${["title","url","tags","created","updated","comments","likes","stocks","id"].join("\t")}\n${t.map((t=>{return[(e=t.title,e.replaceAll(/\t/gu," ")),t.url,`,${t.tags.map((t=>t.name)).join(",")},`,l(t.created_at),l(t.updated_at),t.comments_count,t.likes_count,t.stocks_count,t.id].join("\t");var e})).join("\n")}`)(t);window.r=r,navigator.clipboard.writeText(r).then((()=>{const t="クリップボードにコピー完了しました。";console.log(t),n(t)}),(()=>{const t=new Blob([r],{type:"text/plain"}),e=document.createElement("a"),o=new Date;e.download=`Qiita記事一覧 ${o.getFullYear()}-${o.getMonth()+1}-${o.getDate()}_${o.getHours()}-${o.getMinutes()}-${o.getSeconds()}.txt`,e.href=URL.createObjectURL(t),e.click(),URL.revokeObjectURL(e.href);const a="クリップボードにコピーできなかったのでダウンロードしました。";console.log(a),n(a)}))})(g,u,p)};(()=>{if("qiita.com"!==location.host){const t="https://qiita.com/のトップページ以外を開いてください。";throw alert(t),new Error(t)}let[t,e]=(()=>{const t=(()=>{const t=location.href.match(/^https:\/\/qiita\.com\/tags\/([^?#/]+)/u);return t?t[1]:null})();if(t)return["tag",t];const e=(()=>{const t=location.href.match(/^https:\/\/qiita\.com\/search\?.*?q=([^?#&/]+)/u);return t?t[1]:null})();if(e)return["search",e];const n=(()=>{const t=location.href.match(/^https:\/\/qiita\.com\/organizations\/([^/]+$)/u);return t?t[1]:null})();if(n)return["organization",`org:${n}`];const o=(()=>{const t=location.href.match(/^https:\/\/qiita\.com\/([^?#/]+)/u);if(!t)return null;const e=t[1];return["api","search","official-columns","official-events","question-feed","release-notes","advent-calendar","qiita-award","privacy","terms","about","official-campaigns","stock","drafts","badges","patches","settings","trend","timeline","opportunities"].includes(e)?null:e})();return o?["user",o]:[null,null]})();if(!t){const t=`未対応のURL「${location.href}」です。タグも検索語もユーザーIDも組織IDも見つかりませんでした。`;throw alert(t),new Error(t)}((t,e,n)=>{let o=document.getElementById("qag_dialog");o&&o.remove(),document.body.insertAdjacentHTML("beforeend",'<dialog id="qag_dialog" style="margin: auto; padding: 10px;">\n\t\t<form id="qag_form">\n\t\t\t<div>次の記事を取得します。</div>\n\t\t\t<div id="qag_target" style="margin-inline-start: 20px; margin-block-start: 10px;"></div>\n\t\t\t<div id="qag_buttons" style="display: flex; justify-content: space-around; margin-block-start: 10px;">\n\t\t\t\t<button id="ok_button">OK</button>\n\t\t\t\t<button id="cancel_button" value="cancel" formmethod="dialog">キャンセル</button>\n\t\t\t</div>\n\t\t</form>\n\t</dialog>'),o=document.getElementById("qag_dialog");const a=document.getElementById("ok_button"),r=document.getElementById("qag_form"),i=document.getElementById("qag_target"),s=document.getElementById("qag_buttons");switch(t){case"tag":i.innerHTML=`<div>\n\t\t\t\t\tタグ: <span>${decodeURIComponent(e)}</span>\n\t\t\t\t</div>`;break;case"search":case"organization":i.innerHTML=`<div>\n\t\t\t\t\t検索語: <span>${decodeURIComponent(e)}</span>\n\t\t\t\t</div>`;break;case"user":i.innerHTML=`<div>\n\t\t\t\t\tユーザー: <span>@${e}</span>\n\t\t\t\t</div>\n\t\t\t\t<div style="display: flex; align-items: center; margin-block-start: 10px;">\n\t\t\t\t\t対象:\n\t\t\t\t\t<div style="display: inline-flex; flex-direction: column; margin-inline-start: 10px;">\n\t\t\t\t\t\t<label><input type="radio" name="target" value="投稿" checked><span>投稿した記事</span></label>\n\t\t\t\t\t\t<label><input type="radio" name="target" value="ストック"><span>ストックした記事</span></label>\n\t\t\t\t\t</div>\n\t\t\t\t</div>`;break;default:throw new Error("予期されないswitchです。")}a.addEventListener("click",(i=>{i.preventDefault(),a.addEventListener("click",(t=>{t.preventDefault(),o.close("completed")}),{once:!0}),a.disabled=1;const c=[...o.querySelectorAll("input")];for(let t=0;t<c.length;t++)c[t].disabled=1;s.insertAdjacentHTML("beforebegin",'<div style="margin-block-start: 10px;">\n\t\t\tページ: <span id="qag_current_page">1</span> / <span id="qag_last_page">?</span>\n\t\t</div>\n\t\t<div>\n\t\t\t残レート: <span id="qag_rate_remaining">?</span> / <span id="qag_rate_limit">?</span>\n\t\t</div>\n\t\t<div>\n\t\t\tリセット日時: <span id="qag_reset">?</span>\n\t\t</div>'),n(t,e,"user"===t?r.elements.target.value:"")}),{once:!0}),o.addEventListener("close",(()=>{console.log("qag_dialog.returnValue =",o.returnValue),o.remove()})),o.showModal(),a.focus()})(t,e,g)})()})();