Похоже, что 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 Twilio, используя Python 3 и последний код из Twilio?

В Github существует проблема, связанная с этим, но у нее пока нет конкретного решения https : //github.com/twilio/twilio-python/issues/327

3
RyanS 24 Апр 2017 в 23:42

2 ответа

Лучший ответ

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())

Дайте мне знать, если это поможет.

5
philnash 25 Апр 2017 в 13:23

Ответ @ philnash теперь устарел, но хорошая новость в том, что вы можете получить прокси-http-клиент, работающий с более простым кодом:

import os
from twilio.rest import Client
from twilio.http.http_client import TwilioHttpClient

proxy_client = TwilioHttpClient()

# assuming your proxy is available via the standard env var https_proxy:
## (this is the case on pythonanywhere)
proxy_client.session.proxies = {'https': os.environ['https_proxy']}

# assumes you've set up your twilio creds as env vars as well
# you can pass these in here alternatively
client = Client(http_client=proxy_client)

# twilio api calls will now work from behind the proxy:
message = client.messages.create(to="...", from_='...', body='...')
4
hwjp 5 Фев 2018 в 17:49