CrowdSource: Search Keywords

Click on the circle task number indicators on the left to start working

  1. // ==UserScript==
  2. // @name CrowdSource: Search Keywords
  3. // @version 3.4
  4. // @description Click on the circle task number indicators on the left to start working
  5. // @copyright 2013+, John Stoehr, Tjololo12
  6. // ------------------------------------------------------------------------------------
  7. // @match https://work.crowdsource.com/amt/view*
  8. // @match https://www.google.ca/search*
  9. // @match https://www.google.com/search*
  10. // @match https://www.google.co.uk/search*
  11. // @match https://www.google.it/search*
  12. // @match https://www.google.ng/search*
  13. // @match http://www.bing.com/search*
  14. // @run-at document-end
  15. // @require http://code.jquery.com/jquery-git.js
  16. // @require https://gf.qytechs.cn/scripts/2352-parseuri-license/code/parseuri%20license.js?version=6261
  17. // @grant GM_xmlhttpRequest
  18. // @namespace https://gf.qytechs.cn/users/710
  19. // ==/UserScript==
  20.  
  21. //parseUri.options.strictMode = true;
  22. // Source: http://stackoverflow.com/a/4673436/2405722
  23. String.prototype.format = function() {
  24. var args = arguments;
  25. return this.replace(/\{(\d+)\}/g, function(match, number) {
  26. return args[number] !== undefined ? args[number] : match;
  27. });
  28. };
  29.  
  30. var mturkOrigins = ["https://work.crowdsource.com/amt/view"];
  31. //var googleAPIPrefix="https://ajax.googleapis.com/ajax/services/search/web?v=1.0&";
  32. var googleAPIPrefix="https://www.google.com/search?q=";
  33. //var ip = myIP();
  34. //console.log(ip);
  35. var numTasks = 0;
  36. var interval = 0;
  37. var completedTasks = 0;
  38.  
  39. function myIP() {
  40. try{
  41. GM_xmlhttpRequest({
  42. method: 'GET',
  43. url: "http://smart-ip.net/geoip-json",
  44. synchronous: true,
  45.  
  46. onload: function (xhr) {
  47. r = xhr.responseText;
  48. var data = $.parseJSON(xhr.responseText);
  49. if (data["host"])
  50. googleAPIPrefix+="userip="+data["host"].trim()+"&q=";
  51. else
  52. googleAPIPrefix+="q=";
  53. console.log(googleAPIPrefix);
  54. }
  55. });
  56. }
  57. catch(err){
  58. console.log(err);
  59. }
  60. }
  61.  
  62. function httpGet(theUrl,taskNum)
  63. {
  64. var taskNumber = taskNum;
  65. GM_xmlhttpRequest({
  66. method: 'GET',
  67. url: theUrl,
  68. synchronous: true,
  69.  
  70. onload: function (xhr,taskNum) {
  71. r = xhr.responseText;
  72. //console.log(r);
  73. var ret="";
  74. try{
  75. //var data = $.parseJSON(xhr.responseText);
  76. ret = getUrl(r);
  77. //console.log(taskNumber);
  78. window.postMessage({magicword: "mumbojumbo", task: taskNumber, url: ret}, "*");
  79. }
  80. catch(err){
  81. console.log(err);
  82. console.log(r);
  83. return r;
  84. }
  85. }
  86. });
  87. }
  88.  
  89. function getGoogle(theUrl,taskNum)
  90. {
  91. var taskNumber = taskNum;
  92. GM_xmlhttpRequest({
  93. method: 'GET',
  94. url: theUrl,
  95. synchronous: true,
  96.  
  97. onload: function (xhr,taskNum) {
  98. r = xhr.responseText;
  99. //console.log(r);
  100. var ret="";
  101. try{
  102. //var data = $.parseJSON(xhr.responseText);
  103. ret = createDiv(r);
  104. //console.log(taskNumber);
  105. //window.postMessage({magicword: "mumbojumbo", task: taskNumber, url: ret}, "*");
  106. }
  107. catch(err){
  108. console.log(err);
  109. console.log(r);
  110. return r;
  111. }
  112. }
  113. });
  114. }
  115.  
  116. function checkTasks(){
  117. for (var i = 0; i < numTasks; i++){
  118. var taskNum = i+1;
  119. if (GM_getValue("task-"+taskNum)){
  120. var url = GM_getValue("task-"+taskNum);
  121. $(".task-{0}".format(taskNum)).next().find("input").val(url);
  122. GM_deleteValue("task-"+taskNum);
  123. console.log(url);
  124. completedTasks++;
  125. if (completedTasks == numTasks)
  126. window.clearInterval(interval);
  127. }
  128. else{
  129. console.log("None for "+taskNum);
  130. }
  131. }
  132. }
  133.  
  134. function getRandomInt (min, max) {
  135. return Math.floor(Math.random() * (max - min + 1)) + min;
  136. }
  137. function isMturkOrigin(url) {
  138. for (var i = 0; i < mturkOrigins.length; ++i) {
  139. if (url.indexOf(mturkOrigins[i]) === 0) {
  140. return true;
  141. }
  142. }
  143. return false;
  144. }
  145.  
  146. function getGoogleResults(term,task){
  147. var searchURL = googleAPIPrefix+encodeURIComponent(term);
  148. var ret = httpGet(searchURL, task);
  149. return ret;
  150. }
  151.  
  152. function openDiv(term,task){
  153. var searchURL = googleAPIPrefix+encodeURIComponent(term);
  154. var ret = getGoogle(searchURL, task);
  155. console.log(ret);
  156. return ret;
  157. }
  158. function getUrl(obj){
  159. //console.log(obj["responseData"]);
  160. var html = $.parseHTML(obj);
  161. //var results = obj["responseData"]["results"];
  162. //var responseNum = getRandomInt(0,3);
  163. //var finalUrl = results[responseNum]["unescapedUrl"];
  164. var el = $( '<div></div>' );
  165. var finalUrl = "";
  166. el.html(html);
  167. var element = $("#rso li.g", el).eq(getRandomInt(0,4));
  168. if (element.attr("class") === "g" || element.attr("class") === "g no-sep" && element.attr("id") == null){
  169. var $h3 = element.find("h3.r").first();
  170. if ($h3.length > 0) {
  171. finalUrl = $h3.find("a")[0].href;
  172. }
  173. }
  174. console.log(element);
  175. return finalUrl;
  176. }
  177.  
  178. function sleep(ms) {
  179. var start = new Date().getTime(), expire = start + ms;
  180. while (new Date().getTime() < expire) { }
  181. return;
  182. }
  183.  
  184. if (isMturkOrigin(location.href)) {
  185. // make task number indicator (circle) clickable
  186. $('label[for^=URL]').each(
  187. function() {
  188. numTasks++;
  189. var id = $(this).attr('for');
  190. $(this).append(
  191. $("<button></button>", {
  192. type: "button",
  193. text: "Search "+$(this).attr("for").replace(/URL-?(\d{1,2}).*/, '$1')
  194. }).click(function() {
  195. var $task = $(this).parent().parent().prev();
  196. var taskNumber = parseInt($(this).parent().attr("for").replace(/URL-?(\d{1,2}).*/, '$1'));
  197. $task.addClass("task-" + taskNumber);
  198. var textRepText = $task.text();
  199. var prefix = "Keyword:";
  200. var keywords = $.trim(textRepText.substr(textRepText.indexOf(prefix) + prefix.length));
  201. var keywordsEncoded = encodeURIComponent(keywords).replace(/%20/g, "+");
  202. //console.log(keywords);
  203. // launch google or bing search window/tab
  204. var projectTitle = $(".projectTitle").text();
  205. var domain = $.trim(projectTitle.substr(projectTitle.lastIndexOf(" "))).toLowerCase();
  206. var googleOrigin = (domain.match(/.*bing.*/) ? "http://www.{0}".format(domain) : "http://www.{0}".format(domain));
  207. //openDiv(keywords,taskNumber);
  208. sleep(500); //added in rate limiting because issues. Should be virtually un-noticeable.
  209. window.open("{0}/search?q={1}&magicword={2}&task={3}".format(googleOrigin, keywordsEncoded, "mumbojumbo", taskNumber));
  210. //console.log("{0}/search?q={1}&magicword={2}&task={3}".format(googleOrigin, keywordsEncoded, "mumbojumbo", taskNumber));
  211.  
  212. }));
  213. });
  214. console.log(numTasks);
  215. interval = setInterval(function() {checkTasks();}, 5000);
  216. window.addEventListener("message", function(e) {
  217. if (e.data.magicword === "mumbojumbo") {
  218. console.log("Message Received");
  219. //console.log(e.data);
  220. $(".task-{0}".format(e.data.task)).next().find("input").val(e.data.url);
  221. }
  222. else{
  223. console.log("Also message received");
  224. console.log(e.data);
  225. }
  226. }, false);
  227. } else if (window.opener != null && window.location.href.indexOf("mumbojumbo") > -1) {
  228. console.log(window.opener);
  229. window.opener.postMessage("Child Frame Loaded", "*");
  230. $("#rso li.g").each(function() {
  231. if (($(this).attr("class") === "g" || $(this).attr("class") === "g no-sep") && $(this).attr("id") == null) {
  232. var $h3 = $(this).find("h3.r").first();
  233. if ($h3.length > 0) {
  234. var taskNumber = parseUri(location.href).queryKey.task;
  235. var pageUrl = $h3.find("a")[0].href;
  236. $("<button></button>", {
  237. type: "button",
  238. text: "Submit"
  239. }).click(function() {
  240. window.opener.postMessage({magicword: "mumbojumbo", task: taskNumber, url: pageUrl}, "*");
  241. //GM_setValue("task-"+taskNumber,pageUrl);
  242. //console.log(GM_getValue("task-"+taskNumber));
  243. //setCookie(taskNumber, pageUrl)
  244. window.close();
  245. }).prependTo($h3);
  246. }
  247. }
  248. });
  249. $("#b_results li.b_algo").each(function() {
  250. if ($(this).attr("class") === "b_algo" && $(this).attr("id") == null) {
  251. var $h3 = $(this).find("h2").first();
  252. if ($h3.length > 0) {
  253. var taskNumber = parseUri(location.href).queryKey.task;
  254. var pageUrl = $h3.find("a")[0].href;
  255. $("<button></button>", {
  256. type: "button",
  257. text: "Submit"
  258. }).click(function() {
  259. window.opener.postMessage({magicword: "mumbojumbo", task: taskNumber, url: pageUrl}, "*");
  260. window.close();
  261. }).prependTo($h3);
  262. }
  263. }
  264. });
  265. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址