Grab Packt With Groovy
Automatically claim Packt's free e-books with a Groovy program. 
Following Grab Packt with Racket, here is the Groovy version, to automatically add the e-book to your Packt account for later downloads.
For this to work you need to replace
The script is completely self-contained as
GVMsdkman), get the code by copy-pasting or directly from is.gd/isbviw and simply run (remember to save the file as 
Introduction
Packt Publishing has launched a new programme called "free learning offer"; each day they put an e-book for free on their website to download: one only needs to login to Packt's website and click on the "claim your free book" link.Following Grab Packt with Racket, here is the Groovy version, to automatically add the e-book to your Packt account for later downloads.
The Code
The code is in public domain. You can get it directly from is.gd/isbviw or from my github gist.For this to work you need to replace
YOUR-EMAIL-ADDRESS (line 26) and YOUR-PASSWORD (line 27) with reasonable values. If you wish to run this from shell/cron remember to add #! /usr/bin/env groovy to the top of the file.The script is completely self-contained as
@Grab annotation on line 4 fetches the dependencies it requires. /**
 * @author Bahman Movaqar 
 */
@Grab('org.jsoup:jsoup:1.8.2')
import static org.jsoup.Jsoup.parse
def cookieManager = new CookieManager(null, CookiePolicy.ACCEPT_ALL)
CookieHandler.setDefault(cookieManager)
def doc = parse(
  new URL('https://www.packtpub.com/packt/offers/free-learning').text
)
2.times { // a weird hack! to make this work on slow connections
  doLogin(
    loginParams(doc.select('input[type=hidden][id^=form][value^=form]')?.val())
  )
}
claimBook(
  doc.select('a.twelve-days-claim').attr('href'),
  CookieHandler.getDefault().cookieStore.cookies
)
println('Claimed! Login to Packt website to download the book.')
///////////////////////////////////////////////////////////////////////////////
def loginParams(formBuildId) {
  [
    email: 'YOUR_EMAIL_ADDRESS',
    password: 'YOUR_PASSWORD',
    op: 'Login', 
    form_id: 'packt_user_login_form',
    form_build_id: formBuildId ?: ''
  ].findAll { k, v -> v }.collect { k, v -> 
    "$k=${URLEncoder.encode(v, 'UTF8')}"
  }.join('&')
}
///////////////////////////////////////////////////////////////////////////////
def doLogin(loginParams) {
  new URL(
    'https://www.packtpub.com/packt/offers/free-learning'
  ).openConnection().with {
    requestMethod = 'POST'
    setRequestProperty('Content-Type', 'application/x-www-form-urlencoded')
    doOutput = true
    doInput = true
    allowUserInteraction = true
    outputStream.withWriter { w -> w << loginParams }
    connect()
    if (parse(inputStream.text).select('div.error'))
      throw new Exception("Failed to login.")
  }
}
///////////////////////////////////////////////////////////////////////////////
def claimBook(bookUrl, cookies) {
  new URL(
    "https://www.packtpub.com${bookUrl}"
  ).openConnection().with {
    requestMethod = 'GET'
    cookies.each { setRequestProperty('Cookie', it.toString()) }
    connect()
    content
  }
} How To Run
Provided that you have installed Groovy (if you're on Linux/Mac, I'd very strongly suggest doing that withGrabPackt.groovy): $ groovy GrabPackt.groovy
Comments
Post a Comment