summaryrefslogtreecommitdiff
path: root/util.coffee
blob: 169cc3509deab8178609d79ba88f130cdc639ac2 (plain)
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 = system.stderr.writeLine
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]

# handles login/captcha boxes, and calls the passed action() when logged in
exports.handle_login_captcha = handle_login_captcha = (action, username, password) ->
  need_to_submit = false

  # complete a login form if there is one
  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"]'
      if username_box
        username_box.value = username
      if password_box
        password_box.value = password
    , username, password
    need_to_submit = true

  # handle a captcha box if there is one
  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
    need_to_submit = true

  if need_to_submit
    # 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 ->
      form = document.querySelector('form')
      if form
        form.submit()
  else
    log 'Logged in...'
    action()