Как отправить POST с помощью 2-legged oauth2 в python?

У меня есть рабочий GET с использованием 2-legged oauth2 в python. Вот код WORKING GET:

импорт:

import oauth2 import urllib #for url-encode import urllib2 #for getting and receiving data from server import time #Unix timestamp import oauth2 

вызов:

 resourceUrl = "https://test.mysite:8443/ess/scheduleapi/v1/people" request = build_request(resourceUrl,'GET') u = urllib2.urlopen(request.to_url()) people_data = u.read() 

функция построения запроса:

 def build_request(url, method): params = { 'oauth_version': "1.0", 'oauth_nonce': oauth2.generate_nonce(), 'oauth_timestamp': int(time.time()) } consumer = oauth2.Consumer(key='mykey',secret='mysecret') params['oauth_consumer_key'] = consumer.key req = oauth2.Request(method=method, url=url, parameters=params) signature_method = oauth2.SignatureMethod_HMAC_SHA1() req.sign_request(signature_method, consumer, None) return req #end build_request 

Итак, я думал, что смогу скопировать часть GET, которая, как мне показалось, мне нужна, плюс объединить ее с синтаксисом, который я получил от некоторой документации по urllib2, и приготовить рабочий POST. Не так. Имейте в виду, что у меня одинаковые импорт и одна и та же функция build_request. Вот код BROKEN POST. Пожалуйста, порекомендуйте!

вызов:

 myurl = "https://test.mysite:8443/ess/scheduleapi/v1/people" myaction = 'POST' myxml = somexmlIalreadygenerated person_added, err = post_or_put_me(myaction,myxml,myurl) 

функция POST:

 def post_or_put_me(action,xml,url) request = build_request(url,action) # use same header-generating code as GET did? post_data = urllib.urlencode(xml) req = urllib2.Request(request,post_data) try: u = urllib2.urlopen(req) post_or_put_returned_data = u.read() print 'LENGTH :', len(post_or_put_returned_data) print 'DATA :', post_or_put_returned_data except urllib2.HTTPError, e: server_error = 'HTTPError = ' + str(e.code) except urllib2.URLError, e: server_error = 'URLError = ' + str(e.reason) except httplib.HTTPException, e: server_error = 'HTTPException' except Exception: import traceback server_error = 'generic exception: ' + traceback.format_exc() #endtry if server_error: err_msg = server_error else: succ_msg = 'you had a successful post or put' #endif return succ_msg, err_msg #end post_or_put_me 

Вот моя вторая попытка:

 def post_or_put_me(action,xml,url): myrequest = build_request(url,'POST') CONSUMER_KEY = 'admin_access' CONSUMER_SECRET = 'xxxxxxxxxx' consumer = oauth2.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET) token = oauth2.Token(key=CONSUMER_KEY, secret=CONSUMER_SECRET) client = oauth2.Client(consumer, token) resp, content = client.request( url, method=action, body=urllib.urlencode(str(xml)), headers= myrequest.headers, force_auth_header=True, ) print 'resp, content are', resp, content 

  • Загрузка файла в Python
  • Как вы получаете заголовки по умолчанию в запросе urllib2?
  • Использование urllib2 в Python. Как получить имя файла, который я загружаю?
  • Принятие аргумента файла в Python (из контекстного меню «Отправить в»)
  • ValueError: неизвестный тип url в urllib2, хотя URL-адрес прекрасен, если он открыт в браузере
  • открыть url из pythonanywhere
  • Python URLLib / URLLib2 POST
  • Как загрузить любую (!) Веб-страницу с правильной кодировкой в ​​python?
  • 2 Solutions collect form web for “Как отправить POST с помощью 2-legged oauth2 в python?”

    Вот ACTUAL, WORKING код, как я получил свой POST или PUT для работы, любезно предоставленный Wes Barnes из Echo360 Lecture Capture. Я не хочу, чтобы кто-то еще выполнял двухногий oauth POST / PUT, чтобы изобретать велосипед.

     import oauth2 as oauth import time import urllib2 as urllib echo_base_url = 'http://pilot.echo360.com/ess/scheduleapi/v1' consumer = oauth.Consumer(key ='xxxxx', secret='xxxx') client = oauth.Client(consumer) params = "<person><first-name>Jon</first-name><last-name>Doe</last-name><title>Super Hero</title><email-address>jdoe17@echo360.com</email-address><block-alerts>false</block-alerts><time-zone>US/Eastern</time-zone><locale>en_US</locale><credentials><user-name>jdoe17@echo360.com</user-name><password>password</password></credentials><organization-roles><organization-role><organization-id>b1973c39-dc76-4cab-a4aa-3f9efd628df2</organization-id><role>role-name-admin</role></organization-role></organization-roles></person>" resp, content = client.request( echo_base_url + "/people/", method = "PUT", body=params, headers={'Content-type': 'application/xml'} #force_auth_header=True ) print resp, content 

    Это код, который я использовал, чтобы сделать запрос POST в Twitter с помощью oauth2. Надеюсь, это поможет вам разобраться в синтаксисе.

     import oauth2 as oauth, urllib def oauth_req(url, key, secret, http_method="POST", post_body=None, http_headers=None): CONSUMER_KEY = YOUR_KEY CONSUMER_SECRET = YOUR_SECRET consumer = oauth.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET) token = oauth.Token(key=key, secret=secret) client = oauth.Client(consumer, token) resp, content = client.request( url, method=http_method, body=urllib.urlencode({'status': post_body}), headers=http_headers, force_auth_header=True, ) return content oauth_req('http://api.twitter.com/1/statuses/update.json', KEY, SECRET, post_body=MESSAGE) 
    Python - лучший язык программирования в мире.