Yandex.Direct - Python 中的 API
Posted
技术标签:
【中文标题】Yandex.Direct - Python 中的 API【英文标题】:Yandex.Direct - API in Python 【发布时间】:2013-04-15 00:13:09 【问题描述】:我对 Python 比较陌生,但我正在努力理解一些中高级代码,也许有人可以帮助解释一下。
基本上,我正在建立与 Yandex.Direct(相当于俄罗斯的 Google Adwords)的 API 连接。在这里您可以找到一个 API 代码示例:http://api.yandex.com/direct/doc/examples/python-json.xml
与服务器建立连接的实际代码如下(在 Python 2.7 中):
import json, urllib2, httplib
#name and path to files with the secret key and certificate
KEYFILE = '/path/to/private.key'
CERTFILE = '/path/to/cert.crt'
class YandexCertConnection(httplib.HTTPSConnection):
def __init__(self, host, port=None, key_file=KEYFILE, cert_file=CERTFILE, timeout=30):
httplib.HTTPSConnection.__init__(self, host, port, key_file, cert_file)
class YandexCertHandler(urllib2.HTTPSHandler):
def https_open(self, req):
return self.do_open(YandexCertConnection, req)
https_request = urllib2.AbstractHTTPHandler.do_request_
urlopener = urllib2.build_opener(*[YandexCertHandler()])
#address for sending JSON requests
url = 'https://api.direct.yandex.ru/json-api/v4/'
#input data structure (dictionary)
data =
'method': 'GetClientInfo',
'param': ['agrom'],
'locale': 'en'
#convert the dictionary to JSON format and change encoding to UTF-8
jdata = json.dumps(data, ensure_ascii=False).encode('utf8')
#implement the request
response = urlopener.open(url, jdata)
#output results
print response.read().decode('utf8')
我不完全理解这段代码的以下部分:
class YandexCertConnection(httplib.HTTPSConnection):
def __init__(self, host, port=None, key_file=KEYFILE, cert_file=CERTFILE, timeout=30):
httplib.HTTPSConnection.__init__(self, host, port, key_file, cert_file)
class YandexCertHandler(urllib2.HTTPSHandler):
def https_open(self, req):
return self.do_open(YandexCertConnection, req)
https_request = urllib2.AbstractHTTPHandler.do_request_
urlopener = urllib2.build_opener(*[YandexCertHandler()])
如果有人能回答以下问题,将不胜感激:
1. 上面的代码是如何一步一步工作的?例如,不同的对象如何相互作用?详细的解释会很棒! :)
2. * 在这里表示什么:urllib2.build_opener(*[YandexCertHandler()])
3. 如果不使用类,如何在 Python 3.3 中编写上述代码?
非常感谢!
食肉
【问题讨论】:
【参考方案1】:2。 func(*args)
表示func(arg1, arg2, arg3, ...)
,如果args
是[x]
那么它只是func(x)
。
在示例中应该是build_opener(YandexCertHandler())
,我认为没有理由用argument list unpacking 使代码复杂化。
3。在不使用类的 Python 3.3 中,我将使用 requests 模块:
import json
import requests
# name and path to files with the secret key and certificate
KEYFILE = '/path/to/private.key'
CERTFILE = '/path/to/cert.crt'
# address for sending JSON requests
url = 'https://api.direct.yandex.ru/json-api/v4/'
# input data structure (dictionary)
data =
'method': 'GetClientInfo',
'param': ['agrom'],
'locale': 'en'
# convert the dictionary to JSON format and change encoding to UTF-8
jdata = json.dumps(data, ensure_ascii=False).encode('utf-8')
response = requests.post(url, data=jdata, cert=(CERTFILE, KEYFILE))
print(response.content)
如果它有效(未测试),它也适用于 Python 2。
【讨论】:
您好,感谢您的快速回复!第2部分很清楚,所以谢谢!对于第 3 部分,您的意思是使用 urllib.request 库吗?我经历了所有可用的方法,但找不到一个可以传递证书+密钥文件的方法。这正是令人困惑的地方,因为我相信人们需要以某种方式与 httplib.HTTPSConnection 类进行交互,以便使用证书和密钥建立与远程服务器的安全连接......对此有什么想法吗? :) 提前致谢! 不,我的意思是requests
模块,添加了答案的链接。
Python 3 中也没有httplib
,请参阅http.client 和load_cert_chain 上的文档。
感谢 Gatto - 我的错误,以前从未使用过那个库!现在去看看 :) 谢谢!以上是关于Yandex.Direct - Python 中的 API的主要内容,如果未能解决你的问题,请参考以下文章