Kuna Code activation error by API, how to solve? - python

Good day!
I am trying to use the API of the Kuna.io exchange
There is a method in the documentation: /v3/auth/kuna_codes/redeem
I get the error:
{"messages": ["signature_is_incorrect"]}
Works correctly with other methods
import requests
import time
import hmac
import hashlib
url = "https://api.kuna.io/v3/auth/kuna_codes/redeem"
api_path = "/v3/auth/kuna_codes/redeem"
secret_key = 'key'
public_key = 'key'
nonce = str(int(time.time()*1000.0))
body = str('')
msg = api_path+nonce+body
kun_signature = hmac.new(secret_key.encode('ascii'), msg.encode('ascii'), hashlib.sha384).hexdigest()
payload = {"code": "ZC7Xr-TBcfa-DW3hg-xNUr8-cxnp2-CHada-QT9Yr-L14DZ-5pyjA-UAH-KCode"}
headers = {
"Accept": "application/json",
"Content-Type": "application/json",
'kun-nonce': nonce,
'kun-apikey': public_key,
'kun-signature': kun_signature,
}
response = requests.request("PUT", url, json=payload, headers=headers)
print(response.text)
My suspicions are that the method is wrong since the signature works correctly with other methods.

The signature should contain a body. Try with this one
payload = {"code": "ZC7Xr-TBcfa-DW3hg-xNUr8-cxnp2-CHada-QT9Yr-L14DZ-5pyjA-UAH-KCode"}
body = json.dumps(payload)
msg = api_path+nonce+body

Related

How to make a Patch request with urllib3?

I created a lambda function to update an incident status on atlassian status page. I think i didnt properly used Patch request. Please guide me, what i am missing.
import json
import urllib3
def lambda_handler(event, context):
# TODO implement
print(event)
message = event['Records'][0]['Sns']['Subject']
print('Subject: ' + message)
if "UP" in message:
print('YO YO')
if "Austria" in message:
API_ENDPOINT = "https://api.statuspage.io/v1/pages/xxxxxx/incidents/xxxxx"
API_KEY = "xxxxxxxxx"
http = urllib3.PoolManager()
PARAMS = {
"incident": {
"name": "Test Incident",
"incident_id": ["xxxxx"],
"status": "resolved",
"body": "issue is Resolved now"
}
}
encoded_payload = json.dumps(PARAMS).encode('utf-8')
HEADERS = {'Authorization': API_KEY}
response = http.request('PATCH', url = API_ENDPOINT, body=encoded_payload, headers=HEADERS)
print(response)
print('Austria update incident')

Trying to retrieve data from the Anbima API

I'm trying to automate a process in which i have to download some brazilian fund quotes from Anbima (Brazil regulator). I have been able to work around the first steps to retrieve the access token but i don't know how to use the token in order to make requests. Here is the tutorial website https://developers.anbima.com.br/en/como-acessar-nossas-apis/.
I have tried a lot of thing but all i get from the request is 'Could not find a required APP in the request, identified by HEADER client_id.'
If someone could share some light. Thank you in advance.
import requests
import base64
import json
requests.get("https://api.anbima.com.br/feed/fundos/v1/fundos")
ClientID = '2Xy1ey11****'
ClientSecret = 'faStF1Hc****'
codeString = ClientID + ":" + ClientSecret
codeStringBytes = codeString.encode('ascii')
base64CodeBytes = base64.b64encode(codeStringBytes)
base64CodeString = base64CodeBytes.decode('ascii')
url = "https://api.anbima.com.br/oauth/access-token"
headers = {
'content-type': 'application/json'
,'authorization': f'Basic {base64CodeString}'
}
body = {
"grant_type": "client_credentials"
}
r = requests.post(url=url, data=json.dumps(body), headers=headers, allow_redirects=True)
jsonDict = r.json()
##################
urlFundos = "https://api-sandbox.anbima.com.br/feed/precos-indices/v1/titulos-publicos/mercado-secundario-TPF"
token = jsonDict['access_token']
headers2 = {
'content-type': 'application/json'
,'authorization': f'Bearer {token}'
}
r2 = requests.get(url=urlFundos, headers=headers2)
r2.status_code
r2.text
I was having the same problem, but today I could advance. I believe you need to adjust some parameters in the header.
Follows the piece of code I developed.
from bs4 import BeautifulSoup
import requests
PRODUCTION_URL = 'https://api.anbima.com.br'
SANDBOX_URL = 'https://api-sandbox.anbima.com.br'
API_URL = '/feed/fundos/v1/fundos/'
CODIGO_FUNDO = '594733'
PRODUCTION = False
if PRODUCTION:
URL = PRODUCTION_URL
else:
URL = SANDBOX_URL
URL = URL + API_URL + CODIGO_FUNDO
HEADER = {'access_token': 'your token',
'client_id' : 'your client ID'}
html = requests.get(URL, headers=HEADER).content
soup = BeautifulSoup(html, 'html.parser')
print(soup.prettify())
The sandbox API will return a dummy JSON. To access the production API you will need to request access (I'm trying to do this just now).
url = 'https://api.anbima.com.br/oauth/access-token'
http = 'https://api-sandbox.anbima.com.br/feed/precos-indices/v1/titulos-publicos/pu-intradiario'
client_id = "oLRa*******"
client_secret = "6U2nefG*****"
client_credentials = "oLRa*******:6U2nefG*****"
client_credentials = client_credentials.encode('ascii')
senhabytes = base64.b64encode(client_credentials)
senha = base64.b64decode(senhabytes)
print(senhabytes, senha)
body = {
"grant_type": "client_credentials"
}
headers = {
'content-type': 'application/json',
'Authorization': 'Basic b0xSYTJFSUlOMWR*********************'
}
request = requests.post(url, headers=headers, json=body, allow_redirects=True)
informacoes = request.json()
token = informacoes['access_token']
headers2 = {
"content-type": "application/json",
"client_id": f"{client_id}",
"access_token": f"{token}"
}
titulos = requests.get(http, headers=headers2)
titulos = fundos.json()
I used your code as a model, then I've made some changes. I've printed the encode client_id:client_secret and then I've copied and pasted in the headers.
I've changed the data for json.

Twitter OAuth authentication giving a 401 error

import requests
import secrets
import time
import hmac
import base64
from hashlib import sha1
from urllib.parse import quote_plus
from src.config import API_KEY, ACCESS_TOKEN, API_KEY_SECRET, ACCESS_TOKEN_SECRET
def get_oauth_params():
oauth_nonce = secrets.token_hex(16)
oauth_consumer_key = API_KEY
oauth_signature_method = "HMAC-SHA1"
oauth_timestamp = str(int(time.time()))
oauth_version = "1.0"
oauth_token = ACCESS_TOKEN
oauth_params = {
"oauth_nonce": oauth_nonce,
"oauth_consumer_key": oauth_consumer_key,
"oauth_signature_method": oauth_signature_method,
"oauth_timestamp": oauth_timestamp,
"oauth_version": oauth_version,
"oauth_token": oauth_token
}
return oauth_params
def get_signature(signature_base_string, signing_key):
signature_base_string_bytes = bytes(signature_base_string,'ascii')
signing_key_bytes = bytes(signing_key,'ascii')
hashed = hmac.new(signing_key_bytes, signature_base_string_bytes, sha1)
hashed_bytes = hashed.digest()
b64_bytes = base64.b64encode(hashed_bytes)
b64_signature = quote_plus(b64_bytes.decode('ascii')).rstrip("\n");
return b64_signature
def make_auth_request(url, callback_url):
oauth_params = get_oauth_params()
parameter_string = f"oauth_callback={callback_url}&oauth_consumer_key={oauth_params['oauth_consumer_key']}&oauth_nonce={oauth_params['oauth_nonce']}&oauth_signature_method={oauth_params['oauth_signature_method']}&oauth_timestamp={oauth_params['oauth_timestamp']}&oauth_token={oauth_params['oauth_token']}&oauth_version={oauth_params['oauth_version']}"
percent_encoded_parameter_string = quote_plus(parameter_string)
percent_encoded_url = quote_plus(url)
signature_base_string = f"POST&{percent_encoded_url}&{percent_encoded_parameter_string}"
signing_key = quote_plus(API_KEY_SECRET) + "&" + quote_plus(ACCESS_TOKEN_SECRET)
oauth_signature = get_signature(signature_base_string, signing_key)
percent_encoded_callback_url = quote_plus(callback_url)
headers = {
"Accept": "*/*",
"Connection": "close",
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": f"OAuth oauth_callback=\"{percent_encoded_callback_url}\",oauth_consumer_key=\"{oauth_params['oauth_consumer_key']}\",oauth_nonce=\"{oauth_params['oauth_nonce']}\",oauth_signature=\"{oauth_signature}\",oauth_signature_method=\"{oauth_params['oauth_signature_method']}\",oauth_timestamp=\"{oauth_params['oauth_timestamp']}\",oauth_token=\"{oauth_params['oauth_token']}\",oauth_version=\"{oauth_params['oauth_version']}\"",
}
print(headers["Authorization"])
r = requests.post(url, headers=headers)
print(r.status_code)
r_json = r.json()
return r_json
if __name__ == '__main__':
r_json = make_auth_request("https://api.twitter.com/oauth/request_token", "https://crunchftw.github.io")
print(r_json)
I want to implement login with twitter, for that i first have to get the oauth token by a POST request to https://api.twitter.com/oauth/request_token with the oauth signature. I think I've implemented everything correctly. The paramenter string and oauth Authorization strings are in order. But Twitter is sending back an error
401 {'errors': [{'code': 32, 'message': 'Could not authenticate you.'}]}
Could someone please help?
I used this Twitter Website for creating the signature https://developer.twitter.com/en/docs/authentication/oauth-1-0a/creating-a-signature

How to pass return as a value for argument with adding a string?

I prepared this method
def make_bearer_token(token_url):
body = {
"scope": "ingo_dev",
"client_id": "machine__dev",
"client_secret": "0c3b99",
"username": "test.user",
"password": "xxx",
"grant_type": "pass",
}
response = requests.post(token_url, data=body).json()
bearer_token = response["access_token"]
print({'authorization: ' + 'Bearer ' + str(response)})
return bearer_token
I want to pass that bearer_token to another method with string 'authorization':bearer_token
as a header parameter. The method is looking something like that.
#staticmethod
def post_request(endpoint, file, timeout=30):
response = requests.post(endpoint, files=file_dict, timeout=timeout)
return response
A simple solution would be to run your make_bearer_token() from within your post_request method.
Bearer is a header so make a new headers dict with your Authorization header in it, and pass it as a parameter to requests.post()
def post_request(endpoint, file, timeout=30):
headers = {
"Authorization": "Bearer {}".format(make_bearer_token(endpoint))
}
response = requests.post(endpoint, files=file_dict, headers=headers, timeout=timeout)
return response
Edit: Based on your comment below, you might want to make use of class variables
class Uploader:
def __init__(self, url):
self.headers = {
"Authorization": "Bearer {}".format(self.make_bearer_token(url))
}
def post_request(self, endpoint, file, timeout=30):
response = requests.post(endpoint, files=file_dict, headers=self.headers, timeout=timeout)
return response
Usually response access_token don't have prefix bearer. So you try this way.
import requests
bearer_token = response["access_token"]
hed = {'Authorization': 'Bearer ' + bearer_token}
data = {'key' : 'value'}
url = 'https://next.url.com'
response = requests.post(url, json=data, headers=hed)
print(response)
print(response.json())
Please try this. Let me know you feedback on the same.

Python Requests: Success/Error Not Called

Trying to use python requests. I'm getting a {"code":141,"error":"success/error was not called"} error when I try to save the response I receive from the url into a variable and then post it back to a different url. Any ideas how I can fix this?
payload = { "email" : "jade#gmail.com", "github" : "https://github.com/"}
headers = {'content-type': 'application/json', "Accept": 'application/json'}
r = requests.post("http://challenge.code2040.org/r", json = payload, headers = headers)
#Store the token into a variable
token = r.text
payload = { "token" : token}
headers = {'content-type': 'application/json', "Accept": 'application/json'}
r = requests.post("http://challenge.code2040.org/api/getstring", json = payload, headers = headers)
print r.text
You have to use the actual tokens you get back:
Based on the instructions from the main page:
================================
Stage I: Reverse a string
================================
Once you’re registered, it’s time to get started on the challenges.
The first one is straightforward. You’re going to reverse a string.
That is, if the API says “cupcake,” you’re going to send back “ekacpuc.”
POST a JSON dictionary with the key token and your previous token value to this endpoint:
http://challenge.code2040.org/api/getstring
The getstring endpoint will return a string that your code should then reverse, as in the example above.
Once that string is reversed, send it back to us. POST some JSON to:
http://challenge.code2040.org/api/validatestring
Use the key token for your token.
Use the key string for your reversed string.
Part 1 get out token:
payload = { "email" : "jade#gmail.com", "github" : "https://github.com/"}
headers = {'content-type': 'application/json', "Accept": 'application/json'}
r = requests.post("http://challenge.code2040.org/api/register", json = payload, headers = headers)
#Store the token into a variable
token = r.json() # {u'result': u'ZO8FFqVjWp'}
part 2 get the string:
payload = { "token" :token["result"]}
headers = {'content-type': 'application/json', "Accept": 'application/json'}
r = requests.post("http://challenge.code2040.org/api/getstring", json = payload, headers = headers)
jsn = r.json() # {"result":"Wv55g"} # we need to reverse that string
The final part is actually reversing the string you get from our last post:
payload = {"token" :token["result"], "string" :jsn["result"][::-1]} # jsn["result"][::-1]} reverse the string
r = requests.post("http://challenge.code2040.org/api/validatestring", json = payload, headers = headers)
print(r.json())
{u'result': u'PASS: stage1. Enrollment record updated!'} # all good!
You also had an extra r in your address "http://challenge.code2040.org/r" <- should not be there

Categories

Resources