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】:

2func(*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的主要内容,如果未能解决你的问题,请参考以下文章

R语言list与Python中的dict

python [解析python中的nginx访问日志]解析python #log中的nginx访问日志

python中的self

Python学习篇 Python中的变量和数据类型

如何python3中调用python2中的方法

Python学习篇 Python中的集合