summaryrefslogtreecommitdiff
path: root/util.coffee
blob: 8b1181488097114b4ec355bbd6ec496e03a13657 (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
72
73
74
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"]'
      if username_box
        username_box.value = username
      if password_box
        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')
      if form
        form.submit()
  else
    log 'Logged in...'
    action()