{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/automate-cookie-clicker-with-js/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"a4345adc-cc64-5f32-ad23-1862349053a0","excerpt":"久しぶりの更新です。 最近、Twitterの一部界隈でCookie Clickerというゲームが流行っているようです。 ゲームのパロディ、ヒロイン※の官能小説なども出るほど、日本で人気なようです。 そんなに面白いのかと思ってページを開いてみたら、 ただCookie…","html":"<p>久しぶりの更新です。</p>\n<p>最近、Twitterの一部界隈で<a href=\"http://orteil.dashnet.org/cookieclicker/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Cookie Clicker</a>というゲームが流行っているようです。<br>\nゲームのパロディ、<strong>ヒロイン※の官能小説</strong>なども出るほど、日本で人気なようです。</p>\n<p>そんなに面白いのかと思ってページを開いてみたら、<br>\n<strong>ただCookieを焼くだけのブラウザゲー</strong>でした。</p>\n<p><strong>わけがわからん…。</strong><br>\nおもむろに左側に表示されているCookieを右クリックして「要素を検証」してみたところ、</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\">&lt;div id=\"bigCookie\"…</code></pre></div>\n<p><strong>あ、これはいけるわ。</strong><br>\nと思ってjsを書いてクリック連打を実装しましたが、<br>\n思ったよりもこのゲーム一筋縄では行かないことが分かり、<strong>ハマってしまいました。</strong></p>\n<p>ただCookieを増やすだけでなく、<strong>放っておくだけで実績全解除が出来る</strong>ようなjs<br>\nを目指してみたいと思います。</p>\n<p>※おばあさんです</p>\n<!--more-->\n<h2 id=\"対応ブラウザ\" style=\"position:relative;\"><a href=\"#%E5%AF%BE%E5%BF%9C%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6\" aria-label=\"対応ブラウザ permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>対応ブラウザ</h2>\n<p>Chrome最新版、Safari最新版、Firefox最新版で動作確認しました。<br>\nおそらく、<code>document.querySelector()</code>が使えるブラウザなら大丈夫です。</p>\n<p>普段使っているブラウザがChromeなので、記事ではChromeで説明をしていきます。<br>\n他ブラウザをお使いの方は、適宜読み替えて下さい。</p>\n<h2 id=\"自作のjsをページ内で実行するには\" style=\"position:relative;\"><a href=\"#%E8%87%AA%E4%BD%9C%E3%81%AEjs%E3%82%92%E3%83%9A%E3%83%BC%E3%82%B8%E5%86%85%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF\" aria-label=\"自作のjsをページ内で実行するには permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>自作のjsをページ内で実行するには</h2>\n<p>普段JavaScriptを書いている方ならご存知かと思いますが、<br>\nブラウザのコンソールは、現在のページに対して任意のjsを実行することが出来ます。</p>\n<p>まず、<br>\nChromeの<code>メニュー > 開発/管理 > JavaScriptコンソール</code>をクリックします。<br>\nショートカットは、<code>⌘+Shift+j</code>です。</p>\n<p>試しに２つほどjsを流し込んでみます。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 359px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/44a1e81c7c78b5fc9d2ddcf8663bb199/f5eb6/2e351d28a49190b1d0cfb8e88191406a.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 25.149700598802394%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'101\\'%20viewBox=\\'0%200%20400%20101\\'%20preserveAspectRatio=\\'none\\'/%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/44a1e81c7c78b5fc9d2ddcf8663bb199/5251b/2e351d28a49190b1d0cfb8e88191406a.webp 167w,\n/static/44a1e81c7c78b5fc9d2ddcf8663bb199/7390e/2e351d28a49190b1d0cfb8e88191406a.webp 334w,\n/static/44a1e81c7c78b5fc9d2ddcf8663bb199/4b5c0/2e351d28a49190b1d0cfb8e88191406a.webp 359w\"\n              sizes=\"(max-width: 359px) 100vw, 359px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/44a1e81c7c78b5fc9d2ddcf8663bb199/21521/2e351d28a49190b1d0cfb8e88191406a.png 167w,\n/static/44a1e81c7c78b5fc9d2ddcf8663bb199/86d36/2e351d28a49190b1d0cfb8e88191406a.png 334w,\n/static/44a1e81c7c78b5fc9d2ddcf8663bb199/f5eb6/2e351d28a49190b1d0cfb8e88191406a.png 359w\"\n            sizes=\"(max-width: 359px) 100vw, 359px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/44a1e81c7c78b5fc9d2ddcf8663bb199/f5eb6/2e351d28a49190b1d0cfb8e88191406a.png\"\n            alt=\"流し込んだjs\"\n            title=\"流し込んだjs\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>このページで定義されているグローバルな変数にもアクセスできるので、<br>\n<strong>CookieClickerのゲームを司るGameオブジェクトにもアクセス出来るし、書き換えられます</strong>。</p>\n<p>ただし、ゲームの設定値や挙動自体を変えてしまうのはチートやであって、<br>\n<strong>自動制御</strong>という名目から離れているので、<br>\nあくまで、<strong>ユーザ操作で出来る範囲内の行動しか取らない方針</strong>で行きます。</p>\n<p>行動の最適化はかけていないので、<strong>にわかTAS</strong>みたいな感じと思ってもらえればと思います。</p>\n<h2 id=\"制御に必要な要素を取得する\" style=\"position:relative;\"><a href=\"#%E5%88%B6%E5%BE%A1%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E8%A6%81%E7%B4%A0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B\" aria-label=\"制御に必要な要素を取得する permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>制御に必要な要素を取得する</h2>\n<p>まず、ゲームの進行に必要な要素をjsから制御できるよう抑えていきます。</p>\n<p>このゲームでは、<strong>jQueryが読み込まれていない</strong>らしく、<code>$()</code>が使えません。<br>\n<code>jQuery</code>もundefinedです。</p>\n<p>なので、要素の取得は、お手軽に<code>document.querySelectorAll</code>を使っていきます。<br>\nCSSのセレクタを使って要素を取得できる組み込みメソッドです。</p>\n<h3 id=\"cookie\" style=\"position:relative;\"><a href=\"#cookie\" aria-label=\"cookie permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Cookie</h3>\n<p>セレクタ：<code>#bigCookie</code></p>\n<p>画面左側にあるクリックするCookieです。<br>\n自動制御ならではの高速連打は、Cookie生産量に大きく影響します。</p>\n<h3 id=\"ビルディング\" style=\"position:relative;\"><a href=\"#%E3%83%93%E3%83%AB%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0\" aria-label=\"ビルディング permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ビルディング</h3>\n<p>セレクタ：<code>#products .product</code></p>\n<p>ビルディングの一覧が取得できます。<br>\nこの子らを買わないと実績も生産も何もないので必須です。</p>\n<h3 id=\"アップグレードアイテム\" style=\"position:relative;\"><a href=\"#%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0\" aria-label=\"アップグレードアイテム permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>アップグレードアイテム</h3>\n<p>セレクタ：<code>#upgrades .upgrade</code></p>\n<p>ビルディングの強化や、クリック性能の強化等のアイテムが買えます。<br>\nこれらを買っていくことでどんどんCookie生産効率が上がっていきます。<br>\n実績の解放にも必要です。</p>\n<h3 id=\"ゴールデンcookie\" style=\"position:relative;\"><a href=\"#%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%87%E3%83%B3cookie\" aria-label=\"ゴールデンcookie permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ゴールデンCookie</h3>\n<p>セレクタ：<code>#goldenCookie</code></p>\n<p>何分かに１度ほど出現し、クリックすると良いことが起こるCookieです。<br>\n生産効率の上昇や、実績の解放に関わるしデメリットが無いので抑えておきます。</p>\n<h3 id=\"ニュース\" style=\"position:relative;\"><a href=\"#%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9\" aria-label=\"ニュース permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ニュース</h3>\n<p>セレクタ：<code>#commentsText</code></p>\n<p>画面上部の中央に表示されているニュースです。<br>\nいくら自動制御といえど、このゲームの世界観は楽しみたいものです。<br>\n実績には関係ないのでこれは必須ではありません。</p>\n<h2 id=\"基本的な処理\" style=\"position:relative;\"><a href=\"#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E5%87%A6%E7%90%86\" aria-label=\"基本的な処理 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>基本的な処理</h2>\n<p>自動制御するからには、<strong>１度実行したらあとは放置</strong>で居たいものです。 そして、ゲームの設定をうっかり書き換えてしまうのも怖いので<strong>グローバルは使いたくありません</strong>。 さらに、毎回クエリをかけるわけにもいかないので、DOMはキャッシュしておきたいです。</p>\n<p>ということで、<code>即時関数</code>と<code>setInterval</code>を使います。<br>\nリピートの間隔は、適当に設定して下さい。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token operator\">!</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 長いので省略 var qs = function(selector) { document.querySelectorAll(selector); }; var FPS = 500, // 1秒で処理を実行する回数 upgrades = qs(\"#upgrades .upgrade\"), products = qs(\"#products .product\"), cookie = qs(\"#bigCookie\"), golden = qs(\"#goldenCookie\"); setInterval(function() { // ここに操作を追加 }, 1000 / FPS); }();</span></code></pre></div>\n<p>基本的な枠組みはこんな感じになると思います。</p>\n<p>次に、jQueryが無いので、いくつか汎用関数を作っていきます。<br>\njQueryをjsから読み込ませることも出来るのですが、大した処理もないのでやりません。</p>\n<p>繰り返しを行う<code>each</code>、<br>\n指定した要素が特定のクラスを持っているか調べる<code>hasClass</code>を定義しました</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> <span class=\"token function-variable function\">each</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">arr<span class=\"token punctuation\">,</span> fn</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> arr<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">.</span><span class=\"token function\">call</span><span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> arr<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token function-variable function\">hasClass</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">el<span class=\"token punctuation\">,</span> className</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> el<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">contains</span><span class=\"token punctuation\">(</span>className<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>こんな感じです。 これ以降の処理は、特に記述がない限りsetIntervalの中の関数に書いていきます。</p>\n<h3 id=\"cookieゴールデンcookieをクリック\" style=\"position:relative;\"><a href=\"#cookie%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%87%E3%83%B3cookie%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF\" aria-label=\"cookieゴールデンcookieをクリック permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Cookie・ゴールデンCookieをクリック</h3>\n<p>まず、Cookieをクリックさせてみます。<br>\nクリックイベントを発生させるには、<code>onclick</code>メソッドが使えます。</p>\n<p>ゴールデンCookieも同様に、<strong>出現してようとなかろうとひたすら連打</strong>です。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">cookie<span class=\"token punctuation\">.</span><span class=\"token function\">onclick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> golden<span class=\"token punctuation\">.</span><span class=\"token function\">onclick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>これだけです。設定したFPS分だけCookieがクリックされます。 ゴールデンCookieは出現した瞬間にクリックされるので全く見えません。笑</p>\n<h3 id=\"ビルディングアップグレードを買う\" style=\"position:relative;\"><a href=\"#%E3%83%93%E3%83%AB%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%82%92%E8%B2%B7%E3%81%86\" aria-label=\"ビルディングアップグレードを買う permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ビルディング・アップグレードを買う</h3>\n<p>アイテムを買うのも同様に<code>onclick()</code>で買えます。<br>\n<strong>値段が足りようと足りなかろうとonclick()してしまって問題ない</strong>のですが、</p>\n<p>個人的にあまり好みではありません。<br>\n<strong>ゴールデンCookie連打しておいて何を言ってるんだお前は</strong>という話ですが。笑 ということで先ほど定義した<code>hasClass</code>を利用します。</p>\n<p>購入可能なアイテムには<code>enabled</code>というクラスが付くので、<br>\nアイテムを順に見て行き、<strong>enabledクラスを持っていたら購入</strong>という処理にします。 値段が足りるものを手当たり次第買っていきます。</p>\n<p>同様に、eachの第１引数をupgradesにするだけで、アップグレードも同様に買えます。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">each</span><span class=\"token punctuation\">(</span>products<span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">el</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">hasClass</span><span class=\"token punctuation\">(</span>el<span class=\"token punctuation\">,</span> <span class=\"token string\">'enabled'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> el<span class=\"token punctuation\">.</span><span class=\"token function\">onclick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token function\">each</span><span class=\"token punctuation\">(</span>upgrades<span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">el</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">hasClass</span><span class=\"token punctuation\">(</span>el<span class=\"token punctuation\">,</span> <span class=\"token string\">'enabled'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> el<span class=\"token punctuation\">.</span><span class=\"token function\">onclick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>ここはお好みで。</p>\n<h2 id=\"これでは詰まる\" style=\"position:relative;\"><a href=\"#%E3%81%93%E3%82%8C%E3%81%A7%E3%81%AF%E8%A9%B0%E3%81%BE%E3%82%8B\" aria-label=\"これでは詰まる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>これでは詰まる</h2>\n<p>しかし、これですんなり行くなら苦労しません。</p>\n<p>このゲーム、ビルディングの価格バランスがだいぶ極端なので、<br>\n<strong>買えるけど買わない処理</strong>を挟まないと、ビルディングの所持数に激しく偏りが出ます。 農場や工場など、買ってもしょうがないものは、<strong>必要最低限しか要りません</strong>。</p>\n<p>ビルディング所持数に関連した、実績解放のためには</p>\n<ul>\n<li>指：200個</li>\n<li>おばあさん：128個</li>\n<li>その他：100個</li>\n</ul>\n<p>を所持する必要があります。<br>\nということで、ビルディングの購入ロジックを少し変えます。</p>\n<p>まず、購入する数を制御する配列をFPSの下あたりに定義しておきます。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 全ビルディングを10個ずつ, 50個ずつ、と買い揃えていく var BUY_STEPS = [10, 50, 100, 128, Number.MAX_VALUE]; // 所持数を取得するメソッドを定義 var getOwnedCnt = function(el) { var cnt = el.childNodes[1].childNodes[2]; return cnt ? +cnt.textContent : 0; }</span></code></pre></div>\n<p>次に、eachの部分を書き換えます。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> nextStep <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span> <span class=\"token function\">each</span><span class=\"token punctuation\">(</span>products<span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">el</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">var</span> buyCnt <span class=\"token operator\">=</span> <span class=\"token function\">getOwnedCnt</span><span class=\"token punctuation\">(</span>el<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">hasClass</span><span class=\"token punctuation\">(</span>el<span class=\"token punctuation\">,</span> <span class=\"token string\">'enabled'</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> buyCnt <span class=\"token operator\">&lt;</span> <span class=\"token constant\">BUY_STEPS</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> el<span class=\"token punctuation\">.</span><span class=\"token function\">onclick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span> nextStep <span class=\"token operator\">=</span> nextStep <span class=\"token operator\">&amp;&amp;</span> buyCnt <span class=\"token operator\">>=</span> <span class=\"token constant\">BUY_STEPS</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>nextStep<span class=\"token punctuation\">)</span> <span class=\"token constant\">BUY_STEPS</span><span class=\"token punctuation\">.</span><span class=\"token function\">shift</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>アイテムを単に買い揃えていくことが最適な行動ではないのですが、<br>\nあまり細かいロジック考えるのも面倒なので、思考停止です。</p>\n<p>これで、<strong>値段が足りていてもすでに必要分所持している場合には買わない</strong>ことが可能になります。</p>\n<p>少ない数であれば、高ランクのものも比較的容易に手に入るので、<br>\nタイムマシン、コンデンサあたりを早めに確保し、序盤の生産効率を上昇させています。</p>\n<h2 id=\"特殊な処理\" style=\"position:relative;\"><a href=\"#%E7%89%B9%E6%AE%8A%E3%81%AA%E5%87%A6%E7%90%86\" aria-label=\"特殊な処理 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>特殊な処理</h2>\n<p>これでしばらく運用していたのですが、自動制御の敵がまた現れました。</p>\n<h3 id=\"購入確認ダイアログ\" style=\"position:relative;\"><a href=\"#%E8%B3%BC%E5%85%A5%E7%A2%BA%E8%AA%8D%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0\" aria-label=\"購入確認ダイアログ permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>購入確認ダイアログ</h3>\n<p>ビンゴセンター・研究所を購入すると出るアイテムのいくつかが、 購入前に、<strong>「購入しますか？」という確認ダイアログ</strong>が出ます。</p>\n<p>確認ダイアログの<code>window.confirm</code>は、<br>\nユーザの選択が[はい]なら<code>true</code>、[いいえ]なら<code>false</code>を返す実装になっています。</p>\n<p>ダイアログを操作するより、<strong>関数の動作を変える方が楽なので、上書き</strong>します。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">window<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">confirm</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>これで、ダイアログは出ず、強制的に”はい”が選択されたことになります。<br>\njsの処理を止めるのはこいつだけなので、ここさえ超えてしまえばあとは放って置くだけです。</p>\n<h3 id=\"実績neverclick\" style=\"position:relative;\"><a href=\"#%E5%AE%9F%E7%B8%BEneverclick\" aria-label=\"実績neverclick permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>実績：NeverClick</h3>\n<p>隠れ実績として「Never Click」という実績があります。<br>\nこれは、「１度もCookieをクリックせずに100万Cookie生産する」ことが条件なのですが、</p>\n<p>先ほどの記述だと、無条件にCookieを連打してしまいます。<br>\n<strong>およそ0.03秒で条件失敗です。</strong></p>\n<p>ただし、ゴールデンCookieのクリック数は条件に含まれないようです。</p>\n<p>ということで、隠し称号を取るのであれば、<br>\nCookie.onclick()の行をコメントアウトして下さい。 ゴールデンCookieとアイテム購入で稼いでいきます。</p>\n<h2 id=\"最後に\" style=\"position:relative;\"><a href=\"#%E6%9C%80%E5%BE%8C%E3%81%AB\" aria-label=\"最後に permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>最後に</h2>\n<p>今回は重いきり無駄遣いをしていましたが、</p>\n<p>「このjQueryセレクタで合ってる？」なんて時にコンソールでサクッと書くのが良かったりします。 普通に、jsのデバッグをする際にも使えるので、コンソールから入力するjs、使ってみて下さい。</p>\n<p>最終的に、自分が実績全解放までに使ったjsは、以下のようになりました。<br>\n１週目のプレイでは<code>DONT_BUY_ELDER</code>をfalseにしてあげて、<br>\n頃合いを見てリセットが必要になります。そこまでの自動化は、また後々ということで。</p>","timeToRead":11,"frontmatter":{"title":"CookieClikerをjsから操作してみる","tags":["JavaScript"],"date":"September 21, 2013","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='154'%20viewBox='0%200%20400%20154'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2033c0%2031%200%2032%202%2031s5%202%203%203l-3%201c-2%200-2%201-2%205v5l4-1c6-1%207-2%202-4H3l3-2%203-1%201-1%202-3%201-2%201-1v-1c-2-2-1-4%204-6%204-2%204-2%202-2-3-2-3-5%201-6%203%200%203-1%203-4%200-2%203-4%204-2h8c2%201%203%202%204%201h6c4%201%205%201%206-1%201-1%201-1-1-1-3%201-5%200-5-2s1-2%203-2c4%200%205%200%204-1%200-2%201-3%203-2%203%200%202%202%200%202-1%201%201%201%204%201%206%200%206%200%207-3l2-5c1-3-1-4-4-3h-2c-1-2-3-1-5%202l-3%203-1-3c0-2-1-2-3-2-1%201-3%200-4-1-1-2-2-2-3-1h-5c-3%202-5%200-5-4v-4h6l6%201%203%201c2%200%202%201%202%202l2%202%202%201v-5h5l6-1c0-3%202-2%207%201l4%203c2-1%201-4%200-4l-2-2c-1-3%202-4%204-1v2l2%202h6l-1-2-4-2c-2%200-2-1-1-3h3c0%201%201%202%202%201l2-1V5c0-2%202-1%202%203v6c-2%203-2%204%202%204l4%202c0%203%202%202%203-1%202-4%207-5%2010-2%202%202%202%202%204%201%201-2%205%200%205%202l2%202%202-1c0-3%202-4%208-3l5-1%203-1c2%200%204%206%202%208-2%201-5%200-5-2l-1-2v2c0%203-2%205-5%203h-2c0%202-2%201-4-1-2-1-2-1-3%202%200%203-4%205-4%202s-2-4-4-3h-5c-1-2-2-2-2-1h-5l-3%203c0%202%204%202%205%200%202-1%205%201%205%204l2%207h2c0-2%200-2%204-1%203%201%205%200%202-1v-2c2-2%205-1%203%201v4h3c0-2%204-3%205-1l-1%202-1%202%2013-1c2-1%202-1%203%201s1%202%204%200%204-2%204%202c0%203%200%203-1%202h-2c0%202-3%201-2-1h-1c-3%203-2%204%201%203l3%201c1%201-1%205-2%204v3h3l1-1v-1l1-2c-1-3%202-5%204-3%202%201%200%205-1%205-1-1-2%200-2%203l1%203%201%201%201-1c1-3%204-4%205-2v4l-2%201-1-1-1%202v4l-1%203-1%201-2%201c-1%202-1%203-3%202-2%200-2%200-1%201l1%202c2%200%206-3%206-4l2-3%202-3%202-3%202-4c0-1%201-2%203-2l2%202c0%203-2%204-3%203-2%200-3%201-1%203%202%201-2%205-4%204-1%200-2%200-1%201v5c-4%204-4%205-2%204%204%200%206%202%203%204v3l1%201%201-2c0-1%201-2%203-2l2-1v-1l1-1c0-3%203-3%205-1%201%202-2%205-4%204-1-1-2%200-1%202%200%202-3%204-5%203v2c2%202%205%204%204%202v-1l2-1c1-2%203-2%205%200s-1%204-5%203c-2%200-2%200-1%201l-1%203v2h2c0-2%203-1%204%201%202%202-1%204-4%203l-4-1c-2%200-2%200%200%201s3%202%202%203l2%203c4%201%204%205%201%205h-3c0-1-2-1-2%201-1%202%200%204%202%204s1%205-2%205c-2%201-2%201-1%203h-7c0%202%201%203%203%202%202-2%205%201%204%203s-4%202-6%200c-2-3-3-2-2%201%200%203-3%203-6%200-1-1-1-1-1%201-1%202-6%203-6%201s-2-3-2-1v3c1%202%201%202%203%201h3c3%200%205%202%203%204l-2%201c-2%200-1%201%202%204%203%202%202%204-1%204-2%200-3-1-3-2-1-2-1-2-2-1-2%203-6%203-6%200-1-2-1-2-2-1-2%203-7%202-6-1h-2c-1%201-5%200-5-2%201-2-1-2-2%200l-1%201-3%201h3l1%202%201%201h4l2%201%201%201h1l31%201h31v-5l1-5v5c0%206%202%207%202%201l-1-5-1-2h1l1-8v-7l-1%206c0%207-2%2010-2%205-1-9-1-10%201-11l1-2c0-2-2-3-2-1-1%201-1-6-1-15%201-20%201-20%202-14l2%206-1%202v3l1%203v13l1%2016v15h102l95-1h-8v-3c0-3%200-3%201-1%200%203%200%203%208%203l7%201v-43a499%20499%200%2000-1-46l1-32V0H298a753%20753%200%2000-105%202c0-2-2-2-14-2-15%200-15%200-15%202v3l-2-3c-2-2-2-2-22-2l-20%201v3c0%202%200%203-1%202%200-2-2-3-4-1l-4-2-3-3H0v33m211-21c-2%202-3%202-3%200l-2-1c-2%200-3%201-3%204s0%203%202%202h2l20-1h1l26%201c7%200%208%200%208-2%200-3%200-3-10-3-19%201-30%200-30-1%200-2-2-1-3%201h-2c-2-2-2-2-6%200m138%2034l-1%201c2%200%202%200%200%201l-2%201h-1v1l1%202c0%203%205%205%205%202h1c0%202%202%203%202%201l1-2%201-2c0-2%200-2%201-1%201%202%201%202%201%200l1-2%201%202%201%203v-3c0-2%200-3-2-3l-4-1c-2-2-3-2-6%200M76%2049c-8%202-15%206-14%207h48c2-2%203-3%200-3l-4-2c-4-3-23-5-30-2M44%2081c-2%206-2%2013%200%2023%203%2016%2016%2029%2033%2033%209%202%2010%202%2022%200%207-1%2022-11%2025-16l3-5c5-8%207-18%206-27l-1-9c-1-2-4-3-4-1l-2%201c-5%200-9%200-7%201v2c-1%201-1%201-1-1l-1-2c1-1-5-2-6-1l-4%201c-4%200-4%200-3%205%200%204%201%204%202%203h14l2%201-3%201-1%201%202%201h1l-1%201-1%203c-1%202-2%202-3%201l-4%202-4%203-4%203-3%203v3l-1%201-1-2-1-1h-6c-2%201-4%201-3%202v2h-1l-1-1h-1c-2%200-4-2-2-4l1-2-2%201c-1%201-1%201-2-1-1-1-1-1-1%201s-7%206-10%206c-2%200-6-4-6-5l-1-1-2-1h-1l-1%201-2-1h-1l-1%201v-4h5l-2-2-2-4v-4l1-2%201-1%201-1h-4c0-1%201-2%202-1l1-1v-9h-3l-1-1-4-1c-5%200-5%200-6%205m28-1l-1%205c-2%205-2%206%203%209s7%203%2012-1l6-3c2%200%202%200%201-1-1%200-2-1-1-2l-2-5c-3-3-3-4-10-4s-8%201-8%202M1%2081v73h20l21-1c1-1%200-2-1-2l-2-3-1-2-2%202h2l-2%203c-2%202-2%202-3%201-2-2-2-3%200-5%202-1%202-2%201-2-2-1-2-5-1-7v-4l1-2c0-2%200-2-2%200l-1%203v2l-1%205c2%200%201%202-2%203h-3c-1-1%200-5%201-4%201%200%202-2%201-3-2-2%200-6%202-6h1l-1-1-1-3v-2l-1%202-1%202-1%201v1c-1%201-2%202-1%203%200%202-3%204-5%202s0-6%202-5c2%200%203-1%201-3-2-1%200-4%202-4%201%200%202%200%201-2h-1l-3%201-2%201v2c-1%202-5%203-5%201%200-3%201-5%203-5s2%200%201-3v-2l1-1%201-2%201%201%202%201c1%200%200-2-3-3-2-1-5%203-4%204%200%201-4%202-5%201-2-2%201-6%203-5%201%201%201%201%201-2v-3l1-1v-1h2c0%201%201%202%202%201v-1c-1-2%202-5%204-4%201%200%202%200%201-2%200-2-1-3-3%200h-2l-1%201c-1%203-6%203-6%200l2-3h2l1%201%201-3v-2c1-1%200-1-1-1-3%201-6%203-6%205H6l1-3c1-1%201-2-1-3l-1-2c1%200%202-1%201-2l1-3%203-2v-3l-1%201H8c-1-1-6-2-7-1m279%209l-1%203c0%202%200%203-1%202-3%200-2%200%200%205%204%206%2011%205%2011-1%200-3-4-7-5-5-1%201-1%201-1-1s-2-4-3-3m21%202c0%202%200%203-1%202-2%200-2%201%200%203l3%205c2%205%207%205%209%200%201-3%201-4-4-8-6-6-7-6-7-2m90%2046c2%203%202%207%200%209-1%202-1%202%204%202h5v-13h-5c-5%200-5%200-4%202'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":2.5891472868217056,"src":"/static/863fe7ce7c480cc7491b4d1ca0f1df69/1746d/featured-image.jpg","srcSet":"/static/863fe7ce7c480cc7491b4d1ca0f1df69/466a3/featured-image.jpg 334w,\n/static/863fe7ce7c480cc7491b4d1ca0f1df69/1746d/featured-image.jpg 529w","srcWebp":"/static/863fe7ce7c480cc7491b4d1ca0f1df69/116fa/featured-image.webp","srcSetWebp":"/static/863fe7ce7c480cc7491b4d1ca0f1df69/cd98f/featured-image.webp 334w,\n/static/863fe7ce7c480cc7491b4d1ca0f1df69/116fa/featured-image.webp 529w","sizes":"(max-width: 529px) 100vw, 529px"}}}}}},"pageContext":{"slug":"/automate-cookie-clicker-with-js/","previous":{"fields":{"slug":"/how-to-fix-export-error-in-mysql-workbench/"},"frontmatter":{"title":"MySQLWorkbenchでエクスポートしたSQLがIncorrect table definitionエラーになったときの対処法","tags":["MySQL"]}},"next":{"fields":{"slug":"/ksnctf-crawling-chaos/"},"frontmatter":{"title":"【(」・ω・)」うー!(/・ω・)/にゃー!】 ksnctfのCrawling Chaosを解いてみた","tags":["JavaScript"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}