您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Export HIT information for Discord chat
- // ==UserScript==
- // @name Discord HIT Export
- // @description Export HIT information for Discord chat
- // @version 1.01
- // @include https://www.mturk.com/mturk/findhits*
- // @include https://www.mturk.com/mturk/viewhits*
- // @include https://www.mturk.com/mturk/sorthits*
- // @include https://www.mturk.com/mturk/searchbar*selectedSearchType=hitgroups*
- // @include https://www.mturk.com/mturk/viewsearchbar*selectedSearchType=hitgroups*
- // @include https://www.mturk.com/mturk/sortsearchbar*HITGroup*
- // @include https://www.mturk.com/mturk/preview*
- // @exclude https://www.mturk.com/mturk/findhits?*hit_scraper*
- // @grant GM_setClipboard
- // @author Alden McLaren (Based on IRC Export by Cristo + clickhappier)
- // @namespace facebook.com/groups/mturkmembers
- // ==/UserScript==
- // v3.0c notes:
- // modified by clickhappier to reformat output in more logical ordering/separating/labeling,
- // since I thought it was unnecessarily unclear to read with the separators in the middle of each
- // type of information (label, value, separator, relevant url) instead of between the different types,
- // and wanted to be clearer about what the TO values represented;
- // also wanted to remove unnecessary linebreaks in the output that caused it to spread one HIT's info
- // across several IRC comments, which made it hard to tell where one HIT's info stopped and another began
- // (though after the version I initially modified, Cristo did later do away with all but one linebreak);
- // also fixed Amazon fiddling with HIT name cell contents after Oct 20, 2014 change;
- // also fixed Turkopticon mirror API domain to keep working after Oct 27, 2014 change
- var accountStatus = "loggedOut";
- if ( !document.getElementById("lnkWorkerSignin") ) // if sign-in link not present
- {
- accountStatus = "loggedIn";
- }
- function getUrlVariable(url, variable)
- {
- var query = url.split('?');
- var vars = query[1].split("&");
- for ( var i=0; i<vars.length; i++ )
- {
- var pair = vars[i].split("=");
- if ( pair[0] == variable )
- { return pair[1]; }
- }
- return(false);
- }
- var caps = document.getElementsByClassName('capsulelink');
- for (var c = 0; c < caps.length/2; c++){
- var button = document.createElement('button');
- button.setAttribute("place",c);
- button.textContent = 'CORD';
- button.style.height = '14px';
- button.style.width = '30px';
- button.style.fontSize = '8px';
- button.style.border = '1px solid';
- button.style.padding = '0px';
- button.style.backgroundColor = 'transparent';
- button.title = 'Click to save HIT information to your clipboard. Please wait while shortened URLs are retrieved.';
- button.addEventListener("click", display, false);
- document.getElementById('capsule'+c+'-0').parentNode.appendChild(button);
- }
- function getTO(f){
- var toComp = [];
- var toUrl = 'https://mturk-api.istrack.in/multi-attrs.php?ids='+f;
- var toUrl2 = 'https://turkopticon.ucsd.edu/api/multi-attrs.php?ids='+f;
- var requestTO = new XMLHttpRequest();
- try{ // first try main TO server
- requestTO.onreadystatechange = function () {
- if ((requestTO.readyState ===4) && (requestTO.status ===200)) {
- if (requestTO.responseText.split(':').length > 2) {
- var toInfo = requestTO.responseText.split('{')[3].split('}')[0].split(',');
- for (var t = 0; t < 4; t++) {
- var arrTo = toInfo[t].split(':');
- toComp.push(arrTo[1].substring(1,4));
- }
- }
- else { toComp = ['-','-','-','-']; }
- }
- };
- requestTO.open('GET', toUrl2, false);
- requestTO.send(null);
- return toComp;
- }
- catch(err){ // if main TO server unavailable, try Miku's TO mirror server (istrack.in)
- try{
- requestTO.onreadystatechange = function () {
- if ((requestTO.readyState ===4) && (requestTO.status ===200)) {
- if (requestTO.responseText.split(':').length > 2) {
- var toInfo = requestTO.responseText.split('{')[3].split('}')[0].split(',');
- for (var t = 0; t < 4; t++) {
- var arrTo = toInfo[t].split(':');
- toComp.push(arrTo[1].substring(1,4));
- }
- }
- else { toComp = ['-','-','-','-']; }
- }
- };
- requestTO.open('GET', toUrl, false);
- requestTO.send(null);
- return toComp;
- }
- catch(err){ // if both unavailable, return 'na's
- toComp = ['na','na','na','na'];
- return toComp;
- }
- }
- }
- function sleep(ms){ // from http://www.digimantra.com/tutorials/sleep-or-wait-function-in-javascript/
- var dt = new Date();
- dt.setTime(dt.getTime() + ms);
- while (new Date().getTime() < dt.getTime());
- }
- function ns4tBulkShorten(urlArr){
- console.log("ns4tBulkShorten function");
- var shortUrl;
- var shortUrlsSplit = [];
- var urlT = "https://ns4t.net/yourls-api.php?action=bulkshortener&title=MTurk&signature=39f6cf4959";
- for (var i = 0; i < urlArr.length; i++)
- {
- urlT += "&urls[]="+encodeURIComponent(urlArr[i]);
- }
- console.log(urlT);
- var requestNs4tBulk = new XMLHttpRequest();
- try{
- requestNs4tBulk.onreadystatechange = function () {
- if (requestNs4tBulk.readyState == 4) {
- if (requestNs4tBulk.status == 200) {
- shortUrl = requestNs4tBulk.responseText;
- console.log("ns4t.net Bulk response: " + requestNs4tBulk.status + " " + requestNs4tBulk.statusText + " " + requestNs4tBulk.responseText);
- }
- else {
- console.log('ns4t.net Bulk unsuccessful: ' + requestNs4tBulk.status + " " + requestNs4tBulk.statusText);
- }
- }
- };
- requestNs4tBulk.open('GET', urlT, false);
- requestNs4tBulk.send(null);
- shortUrlsSplit = shortUrl.split(";");
- if ( urlArr.length == 4 ) // if preview/panda links were available
- {
- return {preview:shortUrlsSplit[0], panda:shortUrlsSplit[1], req:shortUrlsSplit[2], to:shortUrlsSplit[3]};
- }
- else if ( urlArr.length == 2 ) // if preview/panda links were unavailable due to being logged out
- {
- return {preview:"(url n/a)", panda:"(url n/a)", req:shortUrlsSplit[0], to:shortUrlsSplit[1]};
- }
- else // no reason to not have either 4 or 2 links, but just in case...
- {
- return null; // return null value to revert to one-by-one shortening
- }
- }
- catch(err){
- return shortUrl; // return null value to revert to one-by-one shortening
- }
- }
- function ns4tShorten(url){ // mturk-only URL shortener on Tjololo's server ns4t.net
- console.log("ns4tShorten function");
- var shortUrl;
- var urlT = "https://ns4t.net/yourls-api.php" + "?action=shorturl&url=" + encodeURIComponent(url) + "&format=simple&title=MTurk&signature=39f6cf4959";
- var requestNs4t = new XMLHttpRequest();
- try{
- requestNs4t.onreadystatechange = function () {
- if (requestNs4t.readyState == 4) {
- if (requestNs4t.status == 200) {
- shortUrl = requestNs4t.responseText;
- console.log("ns4t.net response: " + requestNs4t.status + " " + requestNs4t.statusText + " " + requestNs4t.responseText);
- }
- else {
- console.log('ns4t.net unsuccessful: ' + requestNs4t.status + " " + requestNs4t.statusText);
- }
- }
- };
- requestNs4t.open('GET', urlT, false);
- requestNs4t.send(null);
- return shortUrl;
- }
- catch(err){
- return shortUrl;
- }
- }
- function tnyimShorten(url){ // Tny.im URL Shortener - http://tny.im/aboutapi.php - this is only possible this way because their server has the "Access-Control-Allow-Origin = *" headers enabled (the above TO mirror server does too)
- console.log("tnyimShorten function");
- var shortUrl;
- var urlT = "https://tny.im/yourls-api.php" + "?action=shorturl&url=" + encodeURIComponent(url) + "&format=simple&title=MTurk";
- var requestTnyim = new XMLHttpRequest();
- try{
- requestTnyim.onreadystatechange = function () {
- if (requestTnyim.readyState == 4) {
- if (requestTnyim.status == 200) {
- shortUrl = requestTnyim.responseText;
- console.log("tny.im response: " + requestTnyim.status + " " + requestTnyim.statusText + " " + requestTnyim.responseText);
- }
- else {
- console.log('tny.im unsuccessful: ' + requestTnyim.status + " " + requestTnyim.statusText);
- }
- }
- };
- requestTnyim.open('GET', urlT, false);
- requestTnyim.send(null);
- return shortUrl;
- }
- catch(err){
- return shortUrl;
- }
- }
- function googlShorten(url){ // Goo.gl URL Shortener
- console.log("googlShorten function");
- var shortUrl;
- var urlG = "https://www.googleapis.com/urlshortener/v1/url";
- var requestGoogl = new XMLHttpRequest();
- try{
- requestGoogl.open("POST", urlG, false);
- requestGoogl.setRequestHeader("Content-Type", "application/json");
- requestGoogl.onreadystatechange = function() {
- if (requestGoogl.readyState == 4) {
- if (requestGoogl.status == 200) {
- shortUrl = JSON.parse(requestGoogl.response).id;
- console.log("goo.gl response: " + requestGoogl.status + " " + requestGoogl.statusText + " " + JSON.parse(requestGoogl.response).id );
- }
- else {
- console.log('goo.gl unsuccessful: ' + requestGoogl.status + " " + requestGoogl.statusText);
- }
- }
- };
- var data = new Object();
- data.longUrl = url;
- requestGoogl.send(JSON.stringify(data));
- return shortUrl;
- }
- catch(err){
- return shortUrl;
- }
- }
- function shortenUrl(url){
- sleep(500); // milliseconds delay - wait some milliseconds (currently half a second) between shortens to reduce chance of hitting usage limits
- var shortUrl;
- shortUrl = ns4tShorten(url);
- if ( shortUrl === undefined ) { // if you reached the ns4t.net URL shortener's temporary usage limits or the server is otherwise unavailable
- shortUrl = tnyimShorten(url);
- if ( shortUrl === undefined ) { // if you reached the tny.im URL shortener's temporary limits or the server is otherwise unavailable
- shortUrl = googlShorten(url);
- if ( shortUrl === undefined ) { // if you reached the Google URL shortener's temporary limits too or the server is otherwise unavailable
- shortUrl = "(x)";
- }
- }
- }
- return shortUrl;
- }
- // output display box
- var ircexportdiv = document.createElement('div');
- var ircexporttextarea = document.createElement('textarea');
- ircexportdiv.style.position = 'fixed';
- ircexportdiv.style.width = '500px';
- ircexportdiv.style.height = '155px';
- ircexportdiv.style.left = '50%';
- ircexportdiv.style.right = '50%';
- ircexportdiv.style.margin = '-250px 0px 0px -250px';
- ircexportdiv.style.top = '300px';
- ircexportdiv.style.padding = '5px';
- ircexportdiv.style.border = '2px';
- ircexportdiv.style.backgroundColor = 'black';
- ircexportdiv.style.color = 'white';
- ircexportdiv.style.zIndex = '100';
- ircexportdiv.setAttribute('id','ircexport_div');
- ircexportdiv.style.display = 'none';
- ircexporttextarea.style.padding = '2px';
- ircexporttextarea.style.width = '500px';
- ircexporttextarea.style.height = '130px';
- ircexporttextarea.title = 'Discord Export Output';
- ircexporttextarea.setAttribute('id','ircexport_text');
- ircexportdiv.textContent = 'Discord Export: Press Ctrl+C to (re-)copy to clipboard. Click textarea to close.';
- ircexportdiv.style.fontSize = '12px';
- ircexportdiv.appendChild(ircexporttextarea);
- document.body.insertBefore(ircexportdiv, document.body.firstChild);
- ircexporttextarea.addEventListener("click", function(){ ircexportdiv.style.display = 'none'; }, false);
- function display(e){
- var theButton = e.target;
- theButton.style.backgroundColor = "#CC0000";
- var capHand = document.getElementById('capsule' + theButton.getAttribute("place") + '-0');
- var tBodies = capHand.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
- var thisReq = tBodies.getElementsByClassName('requesterIdentity')[0];
- var thisReqName = thisReq.textContent;
- var thisReqId = "unavailable"; // handle logged-out export requests now that requester ID links are unavailable as of 2015-07-20
- if ( accountStatus == "loggedIn" )
- {
- thisReqId = getUrlVariable(thisReq.parentNode.href, "requesterId");
- }
- var thisTitle = capHand.textContent.trim();
- thisTitle = thisTitle.replace(/<(\w+)[^>]*>.*<\/\1>/gi, "").trim(); // addition to strip html tags and their contents, appearing inside the title link (re 10-20-2014 appearance of "<span class="tags"></span>")
- var thisHitGroup = "unavailable"; // handle logged-out export requests for HITs with no preview/notqualified links
- // if hit has a preview or notqualified link
- var thisHitLink = capHand.parentNode.parentNode.getElementsByClassName('capsulelink')[1].firstChild.nextSibling;
- if ( thisHitLink.href !== '' )
- {
- // if this is a preview link
- if ( thisHitLink.href.indexOf('preview') > -1 )
- {
- thisHitGroup = getUrlVariable(thisHitLink.href, "groupId");
- }
- // if this is a notqualified link
- else if ( thisHitLink.href.indexOf('notqualified') > -1 )
- {
- thisHitGroup = getUrlVariable(thisHitLink.href, "hitId");
- // Amazon messed up the notqualified links, now looking like https://www.mturk.com/mturk/notqualified?hitGroupId=3ID43DSF4IQ1X8LO308D15ZSD5J5GX&hitId=3ID43DSF4IQ1X8LO308D15ZSD5J5GX ; and then they flipped the order of these values on 6/2/15
- }
- // if this is a requestqualification link we shouldn't be on, but are anyway because of stuff Amazon screwed with on 6/2/15
- else if ( thisHitLink.href.indexOf('requestqualification') > -1 )
- {
- // go to the next link, the "(why?)" notqualified link instead
- thisHitGroup = getUrlVariable(thisHitLink.nextElementSibling.href, "hitId");
- // Amazon messed up the notqualified links, now looking like https://www.mturk.com/mturk/notqualified?hitGroupId=3ID43DSF4IQ1X8LO308D15ZSD5J5GX&hitId=3ID43DSF4IQ1X8LO308D15ZSD5J5GX ; and then they flipped the order of these values on 6/2/15
- }
- }
- var thisReward = tBodies.getElementsByClassName('reward')[0].textContent.trim();
- var thisTimeLimit = tBodies.getElementsByClassName('capsule_field_text')[2].textContent.trim();
- var thisHitsAvail = "??"; // handle Amazon removing HITs Available data from logged-out view 2015-07-20
- if ( accountStatus == "loggedIn" )
- {
- thisHitsAvail = tBodies.getElementsByClassName('capsule_field_text')[4].textContent.trim();
- }
- var thisQualTable = document.getElementById('capsule'+theButton.getAttribute("place")+'target').getElementsByTagName('tbody')[2];
- if ( document.location.href.indexOf('?last_hits_previewed') > -1 ) // for compatibility with mmmturkeybacon Last Hits Previewed
- {
- thisQualTable = document.getElementById('capsule'+theButton.getAttribute("place")+'target').getElementsByTagName('tbody')[1];
- }
- var thisQualRows = thisQualTable.getElementsByTagName('td');
- var qualStart = 3; // standard starting row
- if ( accountStatus == "loggedOut" ) // handle logged-out export requests - difference in qual table coding
- {
- qualStart = 1;
- }
- if ( document.location.href.indexOf('?last_hits_previewed') > -1 ) // for compatibility with mmmturkeybacon Last Hits Previewed
- {
- qualStart = 2;
- }
- var masterQual = '';
- for ( var m = qualStart; m < thisQualRows.length; m++ )
- {
- if ( thisQualRows[m].textContent.indexOf('Masters') > -1 )
- {
- masterQual = '@Masters :poop: ';
- }
- }
- var urlsToShorten = [];
- var thisPreviewUrl = "(url n/a)";
- var thisPandaUrl = "(url n/a)";
- if ( thisHitGroup != "unavailable" ) // handle logged-out export requests for HITs with no preview/notqualified links - fallback to default "(url n/a)" text
- {
- //thisPreviewUrl = shortenUrl('https://www.mturk.com/mturk/preview?groupId=' + thisHitGroup);
- urlsToShorten.push('https://www.mturk.com/mturk/preview?groupId=' + thisHitGroup);
- //thisPandaUrl = shortenUrl('https://www.mturk.com/mturk/previewandaccept?groupId=' + thisHitGroup);
- urlsToShorten.push('https://www.mturk.com/mturk/previewandaccept?groupId=' + thisHitGroup);
- }
- var thisReqUrl = "(url n/a)";
- if ( thisReqId != "unavailable" )
- {
- //thisReqUrl = shortenUrl('https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&requesterId=' + thisReqId);
- urlsToShorten.push('https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&requesterId=' + thisReqId);
- }
- else if ( thisReqId == "unavailable" ) // handle 2015-07-20 loss of logged-out requester ids - fallback to search by name
- {
- //thisReqUrl = shortenUrl('https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&searchWords=' + thisReqName.replace(/ /g, "+") ) + " (search)";
- urlsToShorten.push('https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&searchWords=' + thisReqName.replace(/ /g, "+") );
- }
- var thisTOUrl = "(url n/a)";
- var thisTOStats = "??";
- if ( thisReqId != "unavailable" )
- {
- //thisTOUrl = shortenUrl('http://turkopticon.ucsd.edu/' + thisReqId);
- urlsToShorten.push('http://turkopticon.ucsd.edu/' + thisReqId);
- thisTOStats = getTO(thisReqId);
- }
- else if ( thisReqId == "unavailable" ) // handle 2015-07-20 loss of logged-out requester ids - fallback to search by name
- {
- //thisTOUrl = shortenUrl('https://turkopticon.ucsd.edu/main/php_search?query=' + thisReqName.replace(/ /g, "+") ) + " (search)";
- urlsToShorten.push('https://turkopticon.ucsd.edu/main/php_search?query=' + thisReqName.replace(/ /g, "+"));
- }
- var shortUrlsBulkResults = ns4tBulkShorten(urlsToShorten);
- console.log(shortUrlsBulkResults);
- if (shortUrlsBulkResults) // if bulk shorten via ns4t.net is successful
- {
- thisPreviewUrl = shortUrlsBulkResults["preview"];
- thisPandaUrl = shortUrlsBulkResults["panda"];
- thisReqUrl = shortUrlsBulkResults["req"];
- thisTOUrl = shortUrlsBulkResults["to"];
- if ( thisReqId == "unavailable" )
- {
- thisTOUrl += " (search)";
- thisReqUrl += " (search)";
- }
- }
- else // if bulk shorten is unsuccessful, revert to original shortening functions
- {
- if ( thisHitGroup != "unavailable" ) // handle logged-out export requests for HITs with no preview/notqualified links - fallback to default "(url n/a)" text
- {
- thisPreviewUrl = shortenUrl('https://www.mturk.com/mturk/preview?groupId=' + thisHitGroup);
- thisPandaUrl = shortenUrl('https://www.mturk.com/mturk/previewandaccept?groupId=' + thisHitGroup);
- }
- if ( thisReqId != "unavailable" )
- {
- thisReqUrl = shortenUrl('https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&requesterId=' + thisReqId);
- thisTOUrl = shortenUrl('http://turkopticon.ucsd.edu/' + thisReqId);
- }
- else if ( thisReqId == "unavailable" ) // handle 2015-07-20 loss of logged-out requester ids - fallback to search by name
- {
- thisReqUrl = shortenUrl('https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&searchWords=' + thisReqName.replace(/ /g, "+") ) + " (search)";
- thisTOUrl = shortenUrl('https://turkopticon.ucsd.edu/main/php_search?query=' + thisReqName.replace(/ /g, "+") ) + " (search)";
- }
- }
- // when the URL shortener service is unavailable but the preview link is available, add the full-length preview link at the end
- var shortUrlUnav = '';
- if ( (thisPreviewUrl == "(x)") && (thisHitGroup != "unavailable") )
- {
- shortUrlUnav = " \r\n^ https://www.mturk.com/mturk/preview?groupId=" + thisHitGroup;
- }
- var exportOutput = "";
- var loggedOutApology = " (Info missing since logged out.)";
- if ( accountStatus == "loggedIn" )
- {
- exportOutput = '@HITs ' + masterQual + ' :moneybag: :moneybag: :moneybag: ' + '\n' + '**Requester:** ' + thisReqName + ' • ' + ' ' + thisReqUrl + '\n' + '**Title**: ' + thisTitle + ' ' + ' • ' + thisPreviewUrl + '\n' + '**Pay**: ' + thisReward + ' **Avail**: ' + thisHitsAvail + ' **Limit**: ' + thisTimeLimit + '\n' + '**TO**: ' + 'Pay='+thisTOStats[1] + ' Fair='+thisTOStats[2] + ' Comm='+thisTOStats[0] + ' ' + ' • ' + thisTOUrl + '\n' + '**PandA**: ' + thisPandaUrl + shortUrlUnav ;
- }
- else if ( accountStatus == "loggedOut" )
- {
- exportOutput = '@HITs ' + masterQual + ' :moneybag: :moneybag: :moneybag: ' + '\n' + '**Requester:** ' + thisReqName + ' • ' + ' ' + thisReqUrl + '\n' + '**Title**: ' + thisTitle + ' ' + ' • ' + thisPreviewUrl + '\n' + '**Pay**: ' + thisReward + ' **Avail**: ' + thisHitsAvail + ' **Limit**: ' + thisTimeLimit + '\n' + 'TO: ?? ' + thisTOUrl + ' • ' + 'PandA: ' + thisPandaUrl + loggedOutApology + shortUrlUnav ;
- }
- if (GM_setClipboard) { GM_setClipboard(exportOutput); }
- window.setTimeout(function(){ theButton.style.backgroundColor = 'transparent'; }, 500);
- ircexporttextarea.textContent = exportOutput;
- ircexportdiv.style.display = 'block';
- ircexporttextarea.select();
- }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址