spencermathews
3/10/2012 - 7:32 PM

Web of Science API access with ruby, python and php libs

Web of Science API access with ruby, python and php libs

require 'savon'
require 'handsoap'
require 'pp'

class Soapy
  def initialize(opts)
    @client = Savon::Client
    @auth_url   = opts[:auth_url] || 
                "http://search.isiknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl"
    @search_url = opts[:search_url] ||
                "http://search.isiknowledge.com/esti/wokmws/ws/WokSearchLite?wsdl"
    @search_xml = opts[:search_xml] ||     
                <<-EOF
                <queryParameters>
                  <databaseID>WOS</databaseID>
                  <userQuery>AU=Douglas T*</userQuery>
                  <editions>
                    <collection>WOS</collection>
                    <edition>SSCI</edition> 
                  </editions> 
                  <editions>
                    <collection>WOS</collection>
                    <edition>SCI</edition> 
                  </editions>
                  <queryLanguage>en</queryLanguage>
                </queryParameters>
                <retrieveParameters>
                  <count>5</count>
                  <fields>
                    <name>Date</name>
                    <sort>D</sort>
                  </fields>
                  <firstRecord>1</firstRecord>
                </retrieveParameters>
                EOF
  end

  def authenticate(auth_url=@auth_url)
    @auth_client ||= @client.new(@auth_url)
    @auth_client.request :authenticate
    @session_cookie = @auth_client.http.headers["Cookie"]
    @search_client.http.headers["Cookie"] = @session_cookie if @search_client
  end
  
  def search(query=@search_xml)
    @search_client ||= @client.new(@search_url)
    authenticate if @session_cookie.nil?
    @last_search = @search_client.request(:search) { soap.body = query}
  end
  
  def destroy
    @auth_client.request :close_session
  end
  
end

# Savon
soap = Soapy.new
pp soap.search

# Handsoap
# So... the Handsoap API turned out to be a pain, so let's just use Savon.  
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from suds.client import Client
from suds.transport.http import HttpTransport
import urllib2

class HTTPSudsPreprocessor(urllib2.BaseHandler):
    def __init__(self, SID):
        self.SID = SID

    def http_request(self, req):
        req.add_header('cookie', 'SID="'+self.SID+'"')
        return req

    https_request = http_request


class WokmwsSoapClient():
    """
    main steps you have to do:
        soap = WokmwsSoapClient()
        results = soap.search(...)
    """
    def __init__(self):
        self.url = self.client = {}
        self.SID = ''

        self.url['auth'] = 'http://search.isiknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl'
        self.url['search'] = 'http://search.isiknowledge.com/esti/wokmws/ws/WokSearchLite?wsdl'

        self.prepare()

    def __del__(self):
        self.close()

    def prepare(self):
        """does all the initialization we need for a request"""
        self.initAuthClient()
        self.authenticate()
        self.initSearchClient()

    def initAuthClient(self):
        self.client['auth'] = Client(self.url['auth'])

    def initSearchClient(self):
        http = HttpTransport()
        opener = urllib2.build_opener(HTTPSudsPreprocessor(self.SID))
        http.urlopener = opener
        self.client['search'] = Client(self.url['search'], transport = http)

    def authenticate(self):
        self.SID = self.client['auth'].service.authenticate()

    def close(self):
        self.client['auth'].service.closeSession()

    def search(self, query):
        qparams = {
            'databaseID' : 'WOS',
            'userQuery' : query,
            'queryLanguage' : 'en',
            'editions' : [{
                'collection' : 'WOS',
                'edition' : 'SCI',
            },{
                'collection' : 'WOS',
                'edition' : 'SSCI',
            }]
        }

        rparams = {
            'count' : 5, # 1-100
            'firstRecord' : 1,
            'fields' : [{
                'name' : 'Relevance',
                'sort' : 'D',
            }],
        }

        return self.client['search'].service.search(qparams, rparams)
<?php
$auth_url  = "http://search.isiknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl";
$auth_client = @new SoapClient($auth_url);
$auth_response = $auth_client->authenticate();

$search_url = "http://search.isiknowledge.com/esti/wokmws/ws/WokSearchLite?wsdl";
$search_client = @new SoapClient($search_url);
$search_client->__setCookie('SID',$auth_response->return);

$search_array = array(
  'queryParameters' => array(
    'databaseID' => 'WOS',
    'userQuery' => 'AU=Douglas T*',
    'editions' => array(
      array('collection' => 'WOS', 'edition' => 'SSCI'),
      array('collection' => 'WOS', 'edition' => 'SCI')
    ),
    'queryLanguage' => 'en'
  ),
  'retrieveParameters' => array(
    'count' => '5',
    'fields' => array(
      array('name' => 'Date', 'sort' => 'D')
    ),
    'firstRecord' => '1'
  )
);

try{
  $search_response = $search_client->search($search_array);
} catch (Exception $e) {  
    echo $e->getMessage(); 
}

print_r($search_response);
?>