Azure Functions调用cPanel托管Flask API遇人机验证问题求助
问题分析与解决方案
问题本质
这个问题不是Azure Functions特有,核心原因是cPanel托管的服务器把Azure Functions的出站IP识别为机器人/自动化请求,触发了反爬/人机验证机制,导致请求被拦截在Flask API之前——返回的200状态码只是验证页面的正常响应,而非你的API端点返回的结果。本地请求正常是因为你的本地IP不在拦截列表中,且请求头更贴近正常浏览器的特征。
解决方法
1. 将Azure Functions出站IP加入cPanel白名单
- 先获取Azure Functions的出站IP:登录Azure门户,进入你的函数应用,在左侧菜单网络->出站IP地址中查看所有固定出站IP(如果是消费计划,出站IP是动态的,建议升级到高级/专用计划使用固定IP,否则白名单需要定期更新)。
- 登录cPanel后台,找到安全相关设置(比如
IP Blocker的允许列表、ModSecurity的规则例外),将这些IP全部添加进去,允许其访问服务器。 - 如果你的cPanel站点搭配了Cloudflare等CDN,还要在CDN的安全规则中把Azure的出站IP加入白名单,或者创建专属规则允许来自这些IP的请求。
2. 修改请求头,模拟正常浏览器请求
默认requests库的User-Agent是python-requests/x.x.x,极易被识别为自动化工具。修改请求头,添加符合浏览器格式的标识:
import requests import logging headers = { "THIS":"XXXXXXX", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Accept": "application/json, text/plain, */*" } job_data = { "number": 151, "records":[ {"row_id":15, "content":"my-1-content-is-here"}, {"row_id":16, "content":"my-2-content-is-here"} ] } job_request = requests.post("https://cPanel-flask-hosted-api.net/my-jobs/", headers=headers , json =job_data) if job_request.status_code == 200: logging.info('Job submitted successfully!') logging.info(f'{job_request.text}')
3. 关闭cPanel针对API端点的人机验证
如果你的Flask API仅用于服务间调用,无需面向普通用户,可以在cPanel后台关闭相关的人机验证服务(比如reCAPTCHA集成),或者配置规则让/my-jobs/这个端点直接跳过验证流程。
4. 使用Azure Functions专用出站IP(可选)
若当前使用的是消费计划,动态出站IP会增加白名单维护成本。可以升级到高级计划(Premium Plan)或专用计划(Dedicated Plan),配置固定出站IP,只需一次性将固定IP加入白名单即可。
内容的提问来源于stack exchange,提问作者Hakuna N
相关产品推荐
相关产品推荐

