<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> <style> #filter-negative,#filter-positive,#input{width:100%;resize:vertical;margin-bottom:15px}.grid{display:flex;flex-wrap:wrap;gap:20px;max-width:1200px;margin:0 auto}.grid__col{padding:10px}.grid__col--3-of-9{flex:3;min-width:300px}.grid__col--1-of-9{flex:1;text-align:left;min-width:200px}#numofkeywords{margin-bottom:10px;font-weight:700;text-align:right;padding-right:10px}#input{height:400px;max-width:100%}#startjob{padding:10px 20px;font-size:16px;cursor:pointer;border:1px solid #007bff;background-color:#007bff;color:#fff;border-radius:5px;transition:background-color .3s}#startjob:hover{background-color:#0056b3}#filter-negative,#filter-positive{max-width:250px}@media (max-width:768px){.grid{flex-direction:column;gap:15px}.grid__col--1-of-9,.grid__col--3-of-9{flex:none;width:100%;max-width:100%}#filter-negative,#filter-positive{max-width:100%;width:calc(50% - 10px);margin-bottom:0}.grid__col--1-of-9{display:flex;flex-wrap:wrap;justify-content:space-around;gap:10px;text-align:center}}@media (max-width:480px){.grid__col--1-of-9{flex-direction:column;align-items:center}#filter-negative,#filter-positive{width:100%;max-width:300px;margin-bottom:10px}} </style> <div class="grid"> <div class="grid__col grid__col--3-of-9"> <div id="numofkeywords"></div> <textarea id="input" rows="15" cols="50" placeholder="Masukkan kata kunci awal, satu per baris"></textarea><br> <button id="startjob" onclick="StartJob()">Start Job</button><br> </div> <div class="grid__col grid__col--1-of-9" align="left"> <h3>Filter Positif</h3> <textarea id="filter-positive" rows="5" cols="50" onkeyup="FilterIfNotWorking()"></textarea><br> <h3>Filter Negatif</h3> <textarea id="filter-negative" rows="5" cols="50" onkeyup="FilterIfNotWorking()"></textarea><br> <button onclick="Download()">Download Keywords</button> </div> </div> <script> var keywordsToDisplay = new Array(); var hashMapResults = {}; var numOfInitialKeywords = 0; var doWork = false; var keywordsToQuery = new Array(); var keywordsToQueryIndex = 0; var queryflag = false; window.setInterval(DoJob, 750); function StartJob() { if(doWork == false) { keywordsToDisplay = new Array(); hashMapResults = {}; keywordsToQuery = new Array(); keywordsToQueryIndex = 0; hashMapResults[""] = 1; hashMapResults[" "] = 1; hashMapResults["  "] = 1; var ks = $('#input').val().split("\n"); var i = 0; for(i = 0; i < ks.length; i++) { keywordsToQuery[keywordsToQuery.length] = ks[i]; keywordsToDisplay[keywordsToDisplay.length] = ks[i]; var j = 0; for(j = 0; j < 26; j++) { var chr = String.fromCharCode(97 + j); var currentx = ks[i] + ' ' + chr; keywordsToQuery[keywordsToQuery.length] = currentx; hashMapResults[currentx] = 1; } } numOfInitialKeywords = keywordsToDisplay.length; FilterAndDisplay(); doWork = true; $('#startjob').val('Stop Job'); } else { doWork = false; alert("Stopped"); $('#startjob').val('Start Job'); } } function DoJob() { if(doWork == true && queryflag == false) { if(keywordsToQueryIndex < keywordsToQuery.length) { var currentKw = keywordsToQuery[keywordsToQueryIndex]; QueryKeyword(currentKw); keywordsToQueryIndex++; } else { if (numOfInitialKeywords != keywordsToDisplay.length) { alert("Done"); doWork = false; $('#startjob').val('Start Job'); } else { keywordsToQueryIndex = 0; } } } } function QueryKeyword(keyword) { var querykeyword = keyword; var queryresult = ''; queryflag = true; $.ajax({ url: "//suggestqueries.google.com/complete/search", jsonp: "jsonp", dataType: "jsonp", data: { q: querykeyword, client: "chrome" }, success: function(res) { var retList = res[1]; var i = 0; for(i = 0; i < retList.length; i++) { var currents = CleanVal(retList[i]); if(hashMapResults[currents] != 1) { hashMapResults[currents] = 1; keywordsToDisplay[keywordsToDisplay.length] = CleanVal(retList[i]); keywordsToQuery[keywordsToQuery.length] = currents; var j = 0; for(j = 0; j < 26; j++) { var chr = String.fromCharCode(97 + j); var currentx = currents + ' ' + chr; keywordsToQuery[keywordsToQuery.length] = currentx; hashMapResults[currentx] = 1; } } } FilterAndDisplay(); var textarea = document.getElementById("input"); textarea.scrollTop = textarea.scrollHeight; queryflag = false; }, error: function(jqXHR, textStatus, errorThrown) { console.error("AJAX Error: ", textStatus, errorThrown); queryflag = false; // Pastikan flag direset bahkan jika ada kesalahan } }); } function CleanVal(input) { var val = input; val = val.replace(/\u003cb\u003e/g, ""); val = val.replace(/\u003c\/b\u003e/g, ""); val = val.replace(/\u0026amp;/g, "&"); val = val.replace(/\u0026/g, ""); // Ini mungkin terlalu agresif, sesuaikan jika perlu val = val.replace(/\u0026#39;/g, "'"); val = val.replace(/#39;/g, "'"); val = val.replace(/\u2013/g, "2013"); // Mengganti en-dash dengan '2013' if (val.length > 4 && val.substring(0, 4) == "http") val = ""; return val; } function Filter(listToFilter) { var retList = listToFilter; if (document.getElementById("filter-positive").value.length > 0) { var filteredList = new Array(); var filterContains = document.getElementById("filter-positive").value.split("\n"); var i = 0; for (i = 0; i < retList.length; i++) { var currentKeyword = retList[i]; var boolContainsKeyword = false; var j = 0; for (j = 0; j < filterContains.length; j++) { if (filterContains[j].length > 0) { if (currentKeyword.indexOf(filterContains[j]) != -1) { boolContainsKeyword = true; break; } } } if (boolContainsKeyword) { filteredList[filteredList.length] = currentKeyword; } } retList = filteredList; } if (document.getElementById("filter-negative").value.length > 0) { var filteredList = new Array(); var filterContains = document.getElementById("filter-negative").value.split("\n"); var i = 0; for (i = 0; i < retList.length; i++) { var currentKeyword = retList[i]; var boolCleanKeyword = true; var j = 0; for (j = 0; j < filterContains.length; j++) { if (filterContains[j].length > 0) { if (currentKeyword.indexOf(filterContains[j]) >= 0) { boolCleanKeyword = false; break; } } } if (boolCleanKeyword) { filteredList[filteredList.length] = currentKeyword; } } retList = filteredList; } return retList; } function FilterAndDisplay() { var i = 0; var sb = ''; var outputKeywords = Filter(keywordsToDisplay); for (i = 0; i < outputKeywords.length; i++) { sb += outputKeywords[i]; sb += '\n'; } document.getElementById("input").value = sb; document.getElementById("numofkeywords").innerHTML = '' + outputKeywords.length + ' : ' + keywordsToDisplay.length; } function FilterIfNotWorking() { if (doWork == false) { FilterAndDisplay(); } } function post_to_url(path, params, method) { method = method || "post"; var form = document.createElement("form"); form.setAttribute("method", method); form.setAttribute("action", path); for(var key in params) { if(params.hasOwnProperty(key)) { var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", key); hiddenField.setAttribute("value", params[key]); form.appendChild(hiddenField); } } document.body.appendChild(form); form.submit(); } function Download() { var inputText = document.getElementById("input").value; var filename = "keywords.txt"; var blob = new Blob([inputText], { type: "text/plain" }); var link = document.createElement("a"); link.href = URL.createObjectURL(blob); link.download = filename; link.click(); URL.revokeObjectURL(link.href); // Bersihkan URL objek setelah diunduh } </script>