【问题标题】:WorkEtc API Python ScriptWorkEtc API Python 脚本
【发布时间】:2014-06-24 10:02:44
【问题描述】:

我正在尝试用 Python 制作一个通用脚本,任何人都可以使用该脚本将各种信息从 Work Etc CRM 平台导入/导出到 Work Etc CRM 平台。这里有所有文档:http://admin.worketc.com/xml

但是,我现在有点卡住了。身份验证有效,我可以调用不同的 API 方法,但只能调用没有参数的方法。我是 Python 新手,这就是为什么我不知道如何将参数传递给 API 中的特定方法。具体来说,我需要导出所有时间表。我正在尝试专门调用此方法:http://admin.worketc.com/xml?op=GetDraftTimesheets。由于显而易见的原因,我无法透露登录信息,因此可能有点难以为您测试。

代码本身:

import xml.etree.ElementTree as ET
import urllib2
import sys

email = 'email@domain.co.uk'
password = 'pass'
#service = 'GetEmployee?EntityID=1658'
#service = 'GetEntryID?EntryID=23354'
#service = ['GetAllCurrenciesWebSafe']
#service = ['GetEntryID', 'EntryID=23354']
service = ['GetDraftTimesheets','2005-08-15T15:52:01+00:00','2014-08-15T15:52:01+00:00' ]

class workEtcUniversal():
    sessionkey = None

    def __init__(self,url):
        if not "http://" in url and not "https://" in url:
            url = "http://%s" % url
            self.base_url = url

        else:
            self.base_url = url

    def authenticate(self, user, password):
        try:
            loginurl = self.base_url + email + '&pass=' + password
            req = urllib2.Request(loginurl)
            response = urllib2.urlopen(req)

            the_page = response.read()
            root = ET.fromstring(the_page)
            sessionkey = root[1].text
            print 'Authentication successful!'

            try:
                f = self.service(sessionkey, service)
            except RuntimeError:
                print 'Did not perform function!'

        except RuntimeError:
            print 'Error logging in or calling the service method!'

    def service(self, sessionkey, service):

            try:
                if len(service)<2:         
                    retrieveurl = 'https://domain.worketc.com/xml/' + service[0] + '?VeetroSession=' + sessionkey
                else: 
                    retrieveurl = 'https://domain.worketc.com/xml/' + service[0,1,2] + '?VeetroSession=' + sessionkey
            except TypeError as err:
                print 'Type Error, which means arguments are wrong (or wrong implementation)'
                print 'Quitting..'
                sys.exit()

            try:
                responsefile = urllib2.urlopen(retrieveurl)
            except urllib2.HTTPError as err:
                if err.code == 500:
                    print 'Internal Server Error: Permission Denied or Object (Service) Does Not Exist'
                    print 'Quitting..'
                    sys.exit()
                elif err.code == 404:
                    print 'Wrong URL!'
                    print 'Quitting..'
                    sys.exit()
                else:
                    raise

            try:
                f = open("ExportFolder/worketcdata.xml",'wb')
                for line in responsefile:
                    f.write(line)
                f.close()
                print 'File has been saved into: ExportFolder'
            except (RuntimeError,UnboundLocalError):
                print 'Could not write into the file'


client = workEtcUniversal('https://domain.worketc.com/xml/AuthenticateWebSafe?email=')
client.authenticate(email, password)

【问题讨论】:

    标签: python xml json api


    【解决方案1】:

    编写代码使用 API 需要解决几个问题:

    • API 上有哪些方法可用(获取它们的名称列表)
    • 对此类方法的请求是什么样的(找出 url、要使用的 HTTP 方法、对正文的要求(如果使用)、预期的标头)
    • 如何构建所有部分以提出请求

    有哪些方法可以使用

    http://admin.worketc.com/xml 列出了其中的许多

    请求是什么样子的

    这里描述了GetDraftTimesheet http://admin.worketc.com/xml?op=GetDraftTimesheets

    它希望您创建以下 HTTP 请求:

    POST /xml HTTP/1.1
    Host: admin.worketc.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://schema.veetro.com/GetDraftTimesheets"
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <GetDraftTimesheets xmlns="http://schema.veetro.com">
          <arg>
            <FromUtc>dateTime</FromUtc>
            <ToUtc>dateTime</ToUtc>
          </arg>
        </GetDraftTimesheets>
      </soap:Body>
    </soap:Envelope>
    

    构建请求

    最大的任务是构建如上所示形状正确的 XML 文档,并让元素 FromUtcToUtc 填充正确的值。我猜,值应该是 ISO 日期时间格式,这个你自己找吧。

    你应该可以通过一些 Python 库构建这样的 XML,我会使用 lxml

    注意,XML 文档正在使用命名空间,您必须正确处理它们。

    使用所有标头发出 POST 请求应该很容易。用于发出 HTTP 请求的库应正确填写 Content-Length 值,但这主要是自动完成的。

    Veerto 提供多种替代方法

    例如对于“http://admin.worketc.com/xml?op=FindArticlesWebSafe”,同一服务有一组不同的方法:

    • SOAP 1.1
    • SOAP 1.2
    • HTTP GET
    • HTTP POST

    根据您的喜好,选择适合您的需求。

    最简单的主要是HTTP GET。

    对于HTTP请求,我推荐使用requests,它真的很容易使用,如果你通过教程,你就会明白我的意思了。

    【讨论】:

    • 感谢您的及时回复!我只是想知道。我可以不只是在文本编辑器中创建一个看起来完全像这样的 XML 文件然后使用它吗?
    • @serg553 是的,您可以使用在编辑器中创建的 XML。但是如果你想传入一些参数,你必须为每个请求更改xml。请注意,上面的 XML 应将“dateTime”的值更新为类似于“2014-06-24T12:01:22”的值(检查 API 文档,但它可能允许 XSD 类型 xsd:dateTime
    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多