1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
system = require('system')
# prints a log message if the LOG environment variable is set
if system.env.LOG?
exports.log = log = (message) ->
system.stderr.writeLine "#{new Date().toString()} #{message}"
else
exports.log = log = ->
# prints a message to stderr, reads a line of input, and returns the input
exports.ask = ask = (message) ->
system.stderr.write message
system.stdin.readLine()
# a page that directs its console messages to exportss.log
exports.page = page = require('webpage').create()
page.onConsoleMessage = log
child_process = require('child_process')
# displays a screenshot of the page, and returns the 'display' process object
exports.display_screenshot = display_screenshot = ->
# FIXME use mktemp, or write to display process directly
screenshot = '/tmp/hib-dlagent-phantomjs.png'
page.render screenshot
child_process.spawn 'display', [screenshot]
# checks if there is a login form, and if so, completes it and returns true
exports.handle_login = handle_login = (username, password) ->
if page.evaluate(-> document.querySelector 'input[name="username"]')
log 'Entering login information...'
page.evaluate (username, password) ->
username_box = document.querySelector 'input[name="username"]'
password_box = document.querySelector 'input[name="password"]'
username_box?.value = username
password_box?.value = password
(username_box or password_box)?
, username, password
# checks if there is captcha, and if so, handles it and returns true
exports.handle_captcha = handle_captcha = ->
if page.evaluate(-> document.querySelector '#recaptcha_response_field')
log 'Humble Bundle wants you to solve a captcha. Displaying screenshot...'
display_process = display_screenshot()
input = ask 'Enter the captcha solution, or press Enter to get a new challenge: '
display_process.kill()
page.evaluate (input)->
if input is ''
Recaptcha.reload()
else
captcha_box = document.querySelector '#recaptcha_response_field'
captcha_box?.value = input
, input
# handles login/captcha, repeating if necessary, and performs the action
exports.handle_login_captcha = handle_login_captcha = (action, username, password) ->
entered_login = handle_login(username, password)
entered_captcha = handle_captcha()
if entered_login or entered_captcha
# Entered information, submit and check for captcha/login again after load finishes
log 'Submitting login information and/or captcha response...'
page.onLoadFinished = -> handle_login_captcha action, username, password
page.evaluate ->
# FIXME make sure we're submitting the right form
form = document.querySelector('form')
form?.submit()
else
log 'Logged in...'
action()
|