Issue
我正在尝试联系Foursquare API,特别是签入/解析端点。在过去,这已经奏效了,但最近我被一条错误消息阻止,说我是一个机器人,并且无法读取 cookie 和 javascript。
法典
response = "Swarmapp URL" # from previous functions, this isn't the problem
checkin_id = response.split("c/")[1] # To get shortID
url = "https://api.foursquare.com/v2/checkins/resolve"
params = dict(
client_id = "client_id",
client_secret = "client_secret",
shortId = checkin_id,
v = "20180323")
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
time.sleep(8.5) # Limit of 500 requests an hour
resp = requests.get(url = url, params=params, headers = headers)
data = json.loads(resp.text)
此代码将适用于大约 30-40 个请求,然后错误并返回一个 HTML 文件,包括:"请验证您是人类"、"访问此页面被拒绝,因为我们认为您正在使用自动化工具浏览网站"、"您的浏览器不支持 cookie"等。
我尝试过谷歌搜索并搜索这个网站以查找类似的错误,但我找不到任何有帮助的东西。Foursquare API也没有对此进行任何说明。
有什么建议吗?
答案根据 Foursquare API 文档,这段代码应该可以工作:
import json, requests
url = 'https://api.foursquare.com/v2/checkins/resolve'
params = dict(
client_id='CLIENT_ID',
client_secret='CLIENT_SECRET',
v='20180323',
shortId = 'swarmPostID'
)
resp = requests.get(url=url, params=params)
data = json.loads(resp.text)
然而,Foursquare使用的机器人检测显然与API的功能相矛盾。我发现使用等待计时器实现try except
捕获解决了这个问题。
import json, requests
url = 'https://api.foursquare.com/v2/checkins/resolve'
params = dict(
client_id='CLIENT_ID',
client_secret='CLIENT_SECRET',
v='20180323',
shortId = 'swarmPostID'
)
try:
resp = requests.get(url=url, params=params)
except:
time.sleep(60) # Avoids bot detection
resp = requests.get(url=url, params=params)
try:
resp = requests.get(url=url, params=params)
except:
print("Post is private or deleted.")
continue
data = json.loads(resp.text)
这似乎是一个非常奇怪的修复。要么Foursquare已经实施了与其自身功能相矛盾的DDoS防御系统,要么他们的checkin/resolve
端点被破坏了。无论哪种方式,代码都有效。