某客户的部署环境只有内网,但需要访问外网的第三方API,有台可以访问公网的机器搭了apache代理,代理添加了域名白名单,之前写的用requests直接访问失败,应该是requests用的是http1.0协议,而apache白名单过滤用的是http1.1协议。
浏览器默认是http1.1协议,可以通过模拟浏览器发起请求
方法一:使用seleniumrequests实现
from seleniumrequests import Chrome
def test_post(url):
headers = {"Content-Type": "application/json"}
data = {"registered_name": "9183934"}
webdriver = Chrome()
result = webdriver.request("POST", url, data=json.dumps(data), headers=headers).json()
print(result)
webdriver.quit()
方法二:通过js的ajax发起
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument("enable-automation")
options.add_argument("--no-sandbox")
options.add_argument("--disable-infobars")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-browser-side-navigation")
options.add_argument("--disable-gpu")
options.add_argument("--disable-web-security")
options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=options)
jquery = open("js/jquery.min.js", "r").read()
driver.execute_script(jquery)
ajax_query = """
$.ajax({
url: '%s',
headers: {
'Content-Type':'application/json',
'Access-Control-Allow-Origin': '*'
},
method: 'POST',
dataType: 'json',
data: '{"registered_name": "%s"}',
success: function(data){
$("body").html(data.transaction_id);
}
});
""" % (url, registered_name)
ajax_query = ajax_query.replace(" ", "").replace("\n", "")
driver.execute_script(ajax_query)
wait = WebDriverWait(driver, 15)
try:
wait.until(lambda driver: driver.execute_script('return jQuery.active') == 0)
wait.until(lambda driver: driver.execute_script('return document.readyState') == 'complete')
except Exception as e:
log.error("request for purple failed")
log.error(e)
transaction_id = driver.find_element_by_tag_name("body").text
app.logger.info("transaction_id is: {}".format(transaction_id))
driver.quit()