带有cURL错误404的Python 3许可证检查器

2024-06-24 13:47:10 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个小的python应用程序,它向gumroad发出API验证请求,我正试图使用urllib来完成这项工作,但是它给了我一个404错误。 有趣的是,当使用请求包(导入请求等)而不是urllib时,url可以完美地工作

我需要实现的cURL请求如下:

curl https://api.gumroad.com/v2/licenses/verify \
  -d "product_permalink=PRODUCT_PERMALINK" \
  -d "license_key=INSERT_LICENSE_KEY" \
  -X POST

它返回“success”:如果密钥有效,则返回true,并返回一些其他统计信息

这是我的密码:

import json
import urllib.request

license_key = "yyyyyyyy-yyyyyyyy-yyyyyyyy-yyyyyyyy"
user_email = "xxxxx@xxxxx.com"

def licenseCheck(license_key, user_email, productID="xyzxy"):
    
    url_ = "https://api.gumroad.com/v2/licenses/verify"
    pf_permalink = productID
    params = json.dumps({'product_permalink=': pf_permalink, 'license_key=': license_key})
    data=params.encode()

    req = urllib.request.Request(url_, headers={'Content-Type':'application/json'})
    response = urllib.request.urlopen(req, data, timeout=10)
    get_response = json.loads(response.read())

    if get_response['success'] and get_response['email'].lower() == user_email.lower():
        status = True
    else:
        get_response = "Failed to verify the license."

    return status, get_response , license_key

print(licenseCheck(license_key, user_email))

程序给出404错误的行是:

response = urllib.request.urlopen(req, data, timeout = 10)

Tags: keycomjsonurlgetlicenseemailresponse
1条回答
网友
1楼 · 发布于 2024-06-24 13:47:10

这是因为在curl示例中,数据作为两个POST参数传递,而在python脚本中,数据作为JSON主体传递。此外,您还需要考虑错误处理

import json
from urllib import request, parse, error

license_key = "yyyyyyyy-yyyyyyyy-yyyyyyyy-yyyyyyyy"
user_email = "xxxxx@xxxxx.com"

def licenseCheck(license_key, user_email, productID="xyzxy"):
    
    url_ = "https://api.gumroad.com/v2/licenses/verify"
    pf_permalink = productID
    params = {'product_permalink': pf_permalink, 'license_key': license_key}
    data=parse.urlencode(params).encode('ascii')

    req = request.Request(url_, data=data)
    try:
      response = request.urlopen(req)
      get_response = json.loads(response.read())
    except error.HTTPError as e: get_response = json.loads(e.read())
    
    status = False
    if get_response['success'] and get_response['email'].lower() == user_email.lower():
      status = True
    else:
      get_response = "Failed to verify the license."

    return status, get_response , license_key

print(licenseCheck(license_key, user_email))

相关问题 更多 >