An Example Groovy Script which uses the E*Trade API

Download | Code Review | Instructions

Download

Code Review

Let’s take a look at some code (keep in mind this is not the entire script and it will not run as-is in the Groovy Console — you can, however, review the full script here or download the script along with supporting files here:

The following Grape annotations describe the Maven dependencies required to run the script — note that only those in bold need to be manually registerd.

    @Grab(group='log4j', module='log4j', version='1.2.16')
    @Grab(group='commons-codec', module='commons-codec', version='1.3')
    @Grab(group='commons-lang', module='commons-lang', version='2.6')
    @Grab(group='commons-logging', module='commons-logging', version='1.0.4')
    @Grab(group='commons-httpclient', module='commons-httpclient', version='3.1')
    // Alternative to the the commons-ssl jar which works.
    @Grab(group='ca.juliusdavies', module='not-yet-commons-ssl', version='0.3.11')
    @Grab(group='com.thoughtworks.xstream', module='xstream', version='1.4.5')

    @Grab(group='com.etrade.etws', module='oauth-sdk', version='1.0')
    @Grab(group='com.etrade.etws', module='common-connections', version='1.0')
    @Grab(group='com.etrade.etws', module='accounts-sdk', version='1.0')

The following code sets up the request that will be sent to E*Trade. What’s important here is that the request will produce a different authorization URL if we restart the application, so we need to be able to get the authorization URL, paste it into a browser, and then take the resultant five letter code and use this in the same application. In this example we achieve this by allowing the user to paste this code into a Java Swing-based user interface.

The oauth_consumer_key and consumer_secret are provided by E*Trade and should not be shared publicly (and hence we do not share these here).

    def env = System.getenv()

    /* NOTE THAT YOU NEED TO SUPPLY YOUR OWN CONSUMER KEY AND SECRET!
     */
    def key = env['etrade_oauth_consumer_key']
    def keySecret = env['etrade_consumer_secret']

    def client =  OAuthClientImpl.getInstance()

    def request = new ClientRequest()

    request.env = Environment.SANDBOX
    request.consumerKey = key
    request.consumerSecret = keySecret

    def token = client.getRequestToken(request)

    request.token = token.token
    request.tokenSecret = token.secret

The next section prints the authorization URL, which we copy and paste into a browser.

    println "authorizeUrl: ${client.getAuthorizeUrl (request)}"

Finally, the doneButton’s action listener appears below, and this is where we assign the request’s verifierCode — this is the resultant five letter code that was returned when we agreed to the terms that appeared on the page that the authorization URL pointed to.

    doneButton.addActionListener (
        new ActionListener () {
            public void actionPerformed(ActionEvent actionEvent) {

                /* Once the request has been verified, we set the verifier code on
                 * the original request -- we can now use this request to get an
                 * access token, which is used below when creating the
                 * accountClient.
                 */

                request.verifierCode = verifierCodeView.text

At this point we can create and execute a request for account information, then the script will print this information to the console.

    def accessToken = client.getAccessToken(request)

    try {
        def accountRequest = new ClientRequest()

        accountRequest.env = Environment.SANDBOX
        accountRequest.consumerKey = key
        accountRequest.consumerSecret = keySecret
        accountRequest.token = accessToken.token
        accountRequest.tokenSecret = accessToken.secret

        def accountClient = new AccountsClient(accountRequest)

        def response = accountClient.getAccountList()
        def accountList = response.getResponse()

        def accountIterator = accountList.iterator()

        while (accountIterator.hasNext()) {
            def account = accountIterator.next()

            println("===================")
            println("Account: " + account.getAccountId())
            println("===================")
        }
    } catch (Exception exception) {
        exception.printStackTrace (System.err)
    }
}

Instructions

The associated script is written in Groovy and the example below is executed in the Groovy Console and calls the E*Trade web services. Follow the pictures below in the order that they appear and the script should run without issue.

You’ll need to install the E*Trade API jar files as Maven dependencies using the mvn-install-all.bat batch script, which is included with the download. If you’re using one of the Unix/Linux variants it should be easy enough to take what you need from this batch file.

See also: Tutorial: Start Developing in Java

Leave a Reply