如何通过Splash发送代理请求?配置后仍显示真实IP的错误排查
问题原因
代理配置未生效是API用法错误导致的,核心问题有两个:
- 你调用的
request:set_proxy是单请求维度的代理设置方法,入参要求按顺序传入代理host、代理端口(数字类型)、认证用户名、认证密码、代理类型(可选,默认HTTP),不支持传入拼接了认证信息的完整代理URL,也不接受table类型参数。你传入的{'http://login:password@host_proxy_ip:port'}是单元素Lua表,属于无效参数,Splash不会抛出报错,会直接忽略该配置,请求默认走本地直连,最终返回真实IP。 - 全页面统一挂代理不需要在
on_request回调里逐请求设置,直接调用splash全局对象的set_proxy方法即可,该方法原生支持带认证信息的代理URL字符串,写法更简洁,不易出错。
修正方案
方案1:全局设置代理(推荐)
无需编写on_request回调,直接在main函数开头配置全局代理:
function main(splash, args) splash:set_proxy("http://login:password@host_proxy_ip:port") assert(splash:go(args.url)) assert(splash:wait(0.5)) assert(splash:set_viewport_full()) return { html = splash:html(), url = splash:url(), } end
方案2:逐请求设置代理(适合多代理切换场景)
如果需要针对不同请求匹配不同代理,在on_request回调中按参数顺序传入拆分后的代理信息即可,注意端口必须传数字类型,不能传字符串:
function main(splash, args) splash:on_request(function(request) -- 参数顺序:代理地址、端口(数字)、认证账号、认证密码 request:set_proxy("host_proxy_ip", 替换为数字类型的代理端口, "login", "password") end) assert(splash:go(args.url)) assert(splash:wait(0.5)) assert(splash:set_viewport_full()) return { html = splash:html(), url = splash:url(), } end
排查提示
如果修正脚本后仍返回真实IP,先在本地验证代理本身可用性,排除代理失效、认证信息错误、端口不通的问题,确认代理服务可以正常转发请求后再测试Splash脚本。
内容的提问来源于stack exchange,提问作者m_sasha
相关产品推荐
相关产品推荐

