如何使用 Python 向 Twilio API 提供代理信息
How to provide proxy information to Twilio API with Python
看起来 Twilio API 已更新,他们不再能够导入 from twilio.rest.resources import Connection
这意味着 docs/answers 向您展示了如何使用连接 class 不再有效。
即:
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
)`
不起作用,因为没有可从中导入的资源 class。
使用 Python 3 和 Twilio 的最新代码为 Twilio Python 库设置代理信息的正确方法是什么?
Github 上记录了一个与此相关的问题,但还没有具体的解决方案 https://github.com/twilio/twilio-python/issues/327
这里是 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'))
注意 request
方法中间对 session.proxies
的调用
然后,当您实例化 Client
时,包含新的 ProxiedTwilioHttpClient
。
from twilio.rest import Client
from proxied_twilio_http_client import ProxiedTwilioHttpClient
client = Client(account_sid, auth_token, http_client=ProxiedTwilioHttpClient())
如果有帮助请告诉我。
@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='...')
看起来 Twilio API 已更新,他们不再能够导入 from twilio.rest.resources import Connection
这意味着 docs/answers 向您展示了如何使用连接 class 不再有效。
即:
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
)`
不起作用,因为没有可从中导入的资源 class。
使用 Python 3 和 Twilio 的最新代码为 Twilio Python 库设置代理信息的正确方法是什么?
Github 上记录了一个与此相关的问题,但还没有具体的解决方案 https://github.com/twilio/twilio-python/issues/327
这里是 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'))
注意 request
方法中间对 session.proxies
的调用
然后,当您实例化 Client
时,包含新的 ProxiedTwilioHttpClient
。
from twilio.rest import Client
from proxied_twilio_http_client import ProxiedTwilioHttpClient
client = Client(account_sid, auth_token, http_client=ProxiedTwilioHttpClient())
如果有帮助请告诉我。
@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='...')