Search code examples
pythonapiodesk

odesk API POST job with Python


I'm trying to post a job to an odesk account using their API. Unfortunately, I'm having trouble doing so.

I was able to get authenticated and GET my jobs, but when I tried POSTing a job, it returns a 400 error.

Here is response body.

HTTP Error 400: Bad Request
Exception at POST https://www.odesk.com/api/hr/v2/jobs.json
Server: nginx
Date: Thu, 11 Oct 2012 21:38:08 GMT
Content-Type: application/json
X-Odesk-Error-Code: 4
X-Odesk-Error-Message: Parameter job_data is missing or invalid
Last-Modified: Thu, 11 Oct 2012 21:38:08 GMT
Accept-Ranges: bytes
Cache-Control: no-store
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Transfer-Encoding: chunked
Connection: close

I'm also using python-odesk. I followed this to the T, and I got the above error. https://github.com/odesk/python-odesk/blob/master/examples/get_create_update_jobs.py

There was a discussion on this: https://www.odesk.com/community/node/19676 But I don't think it's solved.

I'm even trying to send through Postman and I get a: "Not all required params were filled"

I've tried the following packets to send to odesk. Assume XXXXXX is a valid buyer_team__reference.

    data = {
            'buyer_team__reference': XXXXXX,
            'title': 'Test job from API',
            'job_type': 'hourly',
            'description': 'this is test job, please do not apply to it',
            'visibility': 'invite-only',
            'category': 'Web Development',
            'subcategory': 'Web Programming',
            'budget': 10,
            'duration': 7,
    }

or

    data = {
            'job_data': {
                    'buyer_team__reference': XXXXXX,
                    'title': 'Test job from API',
                    'job_type': 'hourly',
                    'description': 'this is test job, please do not apply to it',
                    'visibility': 'invite-only',
                    'category': 'Web Development',
                    'subcategory': 'Web Programming',
                    'budget': 10,
                    'duration': 7,
            }
    }

Note: I've tried many variations of this similar packet, but with no success.

If someone has experience in odesk API in any language, any help would be great.

Thanks.


Solution

  • After trying python-odesk, i gave up and used mechanize instead to automate the job posting into oDesk

    Do a pip install mechanize

    import mechanize,cookielib
    # Browser
    br = mechanize.Browser()
    
    # Cookie Jar
    cj = cookielib.LWPCookieJar()
    br.set_cookiejar(cj)
    
    # Browser options
    br.set_handle_equiv(True)
    br.set_handle_gzip(True)
    br.set_handle_redirect(True)
    br.set_handle_referer(True)
    br.set_handle_robots(False)
    
    # Follows refresh 0 but not hangs on refresh > 0
    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
    
    # Want debugging messages?
    #br.set_debug_http(True)
    #br.set_debug_redirects(True)
    #br.set_debug_responses(True)
    
    # User-Agent (this is cheating, ok?)
    br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
    
    # Open odesk site
    r = br.open('https://www.odesk.com/login.php')
    form = br.forms().next()  # the login form is unnamed...
    print form.action
    form['login'] = 'yourlogin'
    form['password'] = 'yourpassword'
    br.form = form
    br.submit()
    
    print br.geturl()
    #your form data goes here
    r = br.open(br.geturl() + 'new/')
    print br.geturl()
    br.select_form(name="jobsPost")  # the form is unnamed...
    br.find_control(name="category").value = ['Writing & Translation']
    br.find_control(name="subcategory").value = ['35']
    br.form['title'] = 'Filling up a profile'
    br.form['description'] = 'Require assistance in filing up our profile'
    br.find_control(name="job_type").value = ['Fixed']
    br.form['job_budget'] = '10'
    br.form['job_finish_date'] = '10-14-2012'
    br.find_control(name="visibility").value = ['private']
    br.submit()
    
    print br.geturl()