如何将php api请求重写为python?

问题描述

我有用于调用API的PHP代码,我正在尝试将其重写为python,但我似乎无法正确获得accesskey配置。

PHP代码

$privateKey = 'privateKey';
$publicKey = 'publicKey';

$parameters = array('status' => 'upcoming');
$postData = json_encode($parameters);
$accessKey = base64_encode(hash_hmac('sha256',$postData,$privateKey,true));

$ch = curl_init('https://foundico.com/api/v1/icos/');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_CUSTomrEQUEST,'POST');
curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_HTTPHEADER,[
      'Content-Type: application/json','X-Foundico-Public-Key: '.$publicKey,'X-Foundico-Access-Key: '.$accessKey
]);

$response = curl_exec($ch);
curl_close($ch);
echo $response;enter code here

Python代码

import requests.auth
import json
import urllib
import hashlib
import base64
import hmac

public_key = 'mypublickey'
private_key = 'myprivatekey'

parameters = {'status':'upcoming'}
postData=json.dumps(parameters)


accessKey1= hmac.new(private_key.encode("utf8"),postData.encode("utf8"),hashlib.sha256)
accessKey = base64.b64encode(accessKey1.hexdigest().encode('utf8')).decode('utf8')


print(accessKey)
url = 'https://foundico.com/api/v1/icos/'
headers = {'Content-Type': 'application/json','X-Foundico-Public-Key': public_key,'X-Foundico-Access-Key': accessKey}
r=requests.post(url,#headers=headers,#data=postData)
print(r.json()))

错误 {“错误”:480,“消息”:“私人或公用密钥无效”}

解决方法

在PHP中,您似乎base64_encode()hash_hmac()返回的二进制字符串作为hash_hmac()的第四个参数是true

但是在Python中,您似乎base64.b64encode()是一个accessKey1.hexdigest(),即一个十六进制化的二进制字符串。

您应该看看accessKey1提供了哪些方法来获取非十六进制摘要。

,

此方法是在python中使用http.client库 确保已安装Certificates.command

import requests.auth
import json
import http.client
import urllib
import hashlib
import base64
import hmac

public_key = 'mypublickey'
private_key = 'myprivatekey'

parameters = {'status':'upcoming'}
postData=json.dumps(parameters)


accessKey1= hmac.new(private_key.encode("utf8"),postData.encode("utf8"),hashlib.sha256)
accessKey = base64.b64encode(accessKey1.hexdigest().encode('utf8')).decode('utf8')


print(accessKey)
url = 'https://foundico.com'
headers = {'Content-Type': 'application/json','X-Foundico-Public-Key': public_key,'X-Foundico-Access-Key': accessKey}
conn = http.client.HTTPSConnection(url)
conn.request('POST','/api/v1/icos',json_data,headers)

response = conn.getresponse()
print(response.read().decode())