如何使用Python为Twilio API提供代理信息

时间:2017-04-24 20:42:44

标签: python python-3.x proxy twilio twilio-api

看起来Twilio API已更新,他们无法再导入from twilio.rest.resources import Connection,这意味着向您展示如何使用Connection类设置代理的文档/答案不再有效。

即:

from twilio.rest.resources import Connection
from twilio.rest.resources.connection import PROXY_TYPE_HTTP

Connection.set_proxy_info(
    "proxy.server",
    3128,
    proxy_type=PROXY_TYPE_HTTP
)`

不起作用,因为没有要导入的资源类。

使用Python 3和Twilio的最新代码设置Twilio Python库的代理信息的正确方法是什么?

Github上有一个问题,但是它还没有具体的解决方案https://github.com/twilio/twilio-python/issues/327

2 个答案:

答案 0 :(得分:4)

@ philnash的答案现已过时,但好消息是你可以使用更简单的代码来使用代理http-client:

(CD|FT|F)

答案 1 :(得分:3)

Twilio开发者传道者在这里。

正如GitHub上的问题所说,我们已经从urllib2切换到了Requests,但在默认的TwilioHttpClient中并没有提供所有选项,比如代理。该问题还建议您将HttpClient子类化为自己添加代理。

据我所知,您可以复制现有TwilioHttpClient的大部分内容,将代理添加到会话对象中。像这样:

from requests import Request, Session

from twilio.http import HttpClient, get_cert_file
from twilio.http.response import Response


class ProxiedTwilioHttpClient(HttpClient):
    """
    General purpose HTTP Client for interacting with the Twilio API
    """
    def request(self, method, url, params=None, data=None, headers=None, auth=None, timeout=None,
                allow_redirects=False):

        session = Session()
        session.verify = get_cert_file()
        session.proxies = {
                              "https" : "https://x.x.x.x:yy"
                          }

        request = Request(method.upper(), url, params=params, data=data, headers=headers, auth=auth)

        prepped_request = session.prepare_request(request)
        response = session.send(
            prepped_request,
            allow_redirects=allow_redirects,
            timeout=timeout,
        )

        return Response(int(response.status_code), response.content.decode('utf-8'))

请注意session.proxies方法

中间对request的调用

然后,当您实例化Client时,请添加新的ProxiedTwilioHttpClient

from twilio.rest import Client
from proxied_twilio_http_client import ProxiedTwilioHttpClient

client = Client(account_sid, auth_token, http_client=ProxiedTwilioHttpClient())

让我知道这是否有帮助。