Fetch Total Number of Viewable Hits

Fetches the current number of viewable hits on mturk.

目前為 2016-06-05 提交的版本,檢視 最新版本

// ==UserScript==
// @name        Fetch Total Number of Viewable Hits
// @author      StubbornlyDesigned
// @description Fetches the current number of viewable hits on mturk.
// @namespace   https://greasyfork.org/en/users/35961-stubbornlydesigned
// @version		1.0
// @match       https://www.mturk.com/mturk/findhits?match=false
// @grant       none
// ==/UserScript==

(() => {
	let	total = 0,
		totalPages = 0,
		hitsUrl = 'https://www.mturk.com/mturk/findhits?match=false&pageSize=100',
		currentUrl = ''

	function parse(data) {
		if(!data.querySelector('td[class="error_title"]')) {
			totalPages = data.forms.hitGroupsForm.querySelector('td:nth-of-type(3) span:first-of-type a:last-of-type').search.match(/pageNumber=(\d+)/)[1]

			let available = data.querySelectorAll('a[id^="number_of_hits"]')
			if(available.length) {
				[].slice.call(available).forEach((el) => {
					total = (total + Number(el.parentElement.parentElement.lastElementChild.innerText.trim()))
				})

				let next = ''

				if(data.forms.hitGroupsForm.querySelector('td:nth-of-type(3) span:first-of-type').outerHTML.includes('Next')) {
					[].slice.call(data.forms.hitGroupsForm.querySelectorAll('td:nth-of-type(3) span:first-of-type a')).forEach((el) => { 
						if(el.innerText.includes('Next')) {
							next = el.href + '&pageSize=100'
						}
					})
				}

				if(next) {
					return next
				} else {
					return 'completed'
				}
			}
		}

		throw new Error('You have exceeded the maximum number of page requests.')
	}

	function get(url) {
		return new Promise((resolve, reject) => {
			let req = new XMLHttpRequest()
			req.open('GET', url)
			req.onload = function() {
				if (req.status == 200) {
					resolve(req.response)
				} else {
					reject(Error(req.statusText))
				}
			}
			req.responseType = 'document'
			req.onerror = function() {
				reject(Error("error"))
			}
			req.send()
		})
	}

	function run() {
		let url = !currentUrl ? hitsUrl : currentUrl
		get(url)
			.then((res) => {
				let nextMove = parse(res)
				let currentPage = url.match(/pageNumber=(\d+)/) ? url.match(/pageNumber=(\d+)/)[1] : 1
				document.getElementById('totalAvailableHits').innerText = currentPage + ' / ' + totalPages
				if(nextMove) {
					if(nextMove.includes('mturk')) {
						currentUrl = nextMove
						setTimeout(() => {run()}, 200)
					} else if(nextMove == 'completed') {
						document.getElementById('totalAvailableHits').innerText = total
						total = 0
						totalPages = ''
						currentUrl = ''
					}
				}
			})
			.catch((err) => {
				console.log(err)
				setTimeout(() => {run()}, 1000)
			})
	}

	function init() {
		let el = document.getElementById('user_name_field')
		el.setAttribute('id', 'totalAvailableHits')
		el.innerText = 'Fetch Total Available Hits'
		el.style.cursor = 'pointer'

		el.addEventListener('click', () => {run()})
	}

	init()
})()