快速登录 Requests.Session() Python 3
Flurry Login Requests.Session() Python 3
所以我在 之前回答了这个问题。但是,Flurry 网站上的某些内容发生了变化,答案不再有效。
from bs4 import BeautifulSoup
import requests
loginurl = "https://dev.flurry.com/secure/loginAction.do"
csvurl = "https://dev.flurry.com/eventdata/.../..." #URL to get CSV
data = {'loginEmail': 'user', 'loginPassword': 'pass'}
with requests.Session() as session:
session.headers.update({
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36"})
soup = BeautifulSoup(session.get(loginurl).content)
name = soup.select_one("input[name=struts.token.name]")["value"]
data["struts.token.name"] = name
data[name] = soup.select_one("input[name={}]".format(name))["value"]
login = session.post(loginurl, data=data)
getcsv = session.get(csvurl)
上面的代码在上个月运行良好,然后在上周停止运行。对于我的生活,我无法弄清楚网站上发生了什么变化。 ID 名称和令牌看起来都是正确的,用户名和通行证没有改变。我很茫然。
如果我手动登录,我可以使用 csvurl
.
下载 csv 文件
login.histroy
显示:
[<Response [302]>, <Response [302]>, <Response [302]>, <Response [302]>, <Response [303]>]
如果有人能看一看并找出我哪里出错了,我将不胜感激。
谢谢。
更新
所以从新的登录地址,我看到 post 需要采用这种格式:
{"data":{"type":"session","id":"bd7d8dc1-4a86-4aed-a618-0b2765b03fb7","attributes":{"scopes":"","email":"myemail","password":"mypass","remember":"false"}}}
但我不明白他们是如何生成 ID 的。谁能看一下?
他们现在有一个新的设计和一个 new login page 他们也将您重定向到 - 这就是为什么您会看到 302 和 303 状态代码。登录过程及其背后的逻辑、URL、指向 CSV 文件的链接 - 现在一切都不同了,您必须 "reimplement"/"remimic" 它。
您可以提供一个虚拟会话 ID,它会让您使用一个新的会话 ID 登录。 Postman 拦截器帮助重定向。
import requests
import json
def login(email, password, session, session_id=None):
""" Authenticate with flurry.com, start a fresh session
if no session id is provided. """
auth_url = 'https://auth.flurry.com/auth/v1/session'
login_url = 'https://login.flurry.com'
auth_method = 'application/vnd.api+json'
if session_id is None:
session_id = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
response = session.request('OPTIONS', auth_url, data='')
headers = response.headers
headers.update({'origin': login_url, 'referer': login_url,
'accept': auth_method, 'content-type': auth_method})
data = {'data': {'type': 'session', 'id': session_id, 'attributes': {
'scopes': '', 'email': email, 'password': password, 'remember': 'false'}}}
payload = json.dumps(data)
response = session.request('POST', auth_url, data=payload, headers=headers)
return response
email, password = 'your-email', 'your-password'
session = requests.Session()
response = login(email, password, session)
# session_id = response.json()['data']['id']
然后您可以在访问旧站点后获取您的 csv 数据:
response = session.request('GET', 'https://dev.flurry.com/home.do')
data = session.request('GET', your_csv_url).text
您可以使用 uuid 库为会话 ID 生成一个 uuid,为了使用旧界面,您需要向 https://dev.flurry.com/home.do?isFirstPostLogin=true 执行请求,现在您可以获得 csv。 (url_get变量)
id = uuid.uuid4()
payload = {"data":
{"type":"session",
"id": str(id),
"attributes":{
"scopes":"",
"email": username,
"password": password,
"remember":"false"}
}
}
with session() as api:
headers = {
'Origin': 'https://login.flurry.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
'Content-Type': 'application/vnd.api+json',
'Accept': 'application/vnd.api+json',
'Connection': 'keep-alive',
}
req = api.post('https://auth.flurry.com/auth/v1/session', data=json.dumps(payload), headers=headers)
if req.status_code == 201:
api.get('https://dev.flurry.com/home.do?isFirstPostLogin=true')
return api.get(url_get).content.encode('ascii', 'ignore')
else:
raise Exception('Login failed')
所以我在
from bs4 import BeautifulSoup
import requests
loginurl = "https://dev.flurry.com/secure/loginAction.do"
csvurl = "https://dev.flurry.com/eventdata/.../..." #URL to get CSV
data = {'loginEmail': 'user', 'loginPassword': 'pass'}
with requests.Session() as session:
session.headers.update({
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36"})
soup = BeautifulSoup(session.get(loginurl).content)
name = soup.select_one("input[name=struts.token.name]")["value"]
data["struts.token.name"] = name
data[name] = soup.select_one("input[name={}]".format(name))["value"]
login = session.post(loginurl, data=data)
getcsv = session.get(csvurl)
上面的代码在上个月运行良好,然后在上周停止运行。对于我的生活,我无法弄清楚网站上发生了什么变化。 ID 名称和令牌看起来都是正确的,用户名和通行证没有改变。我很茫然。
如果我手动登录,我可以使用 csvurl
.
login.histroy
显示:
[<Response [302]>, <Response [302]>, <Response [302]>, <Response [302]>, <Response [303]>]
如果有人能看一看并找出我哪里出错了,我将不胜感激。
谢谢。
更新
所以从新的登录地址,我看到 post 需要采用这种格式:
{"data":{"type":"session","id":"bd7d8dc1-4a86-4aed-a618-0b2765b03fb7","attributes":{"scopes":"","email":"myemail","password":"mypass","remember":"false"}}}
但我不明白他们是如何生成 ID 的。谁能看一下?
他们现在有一个新的设计和一个 new login page 他们也将您重定向到 - 这就是为什么您会看到 302 和 303 状态代码。登录过程及其背后的逻辑、URL、指向 CSV 文件的链接 - 现在一切都不同了,您必须 "reimplement"/"remimic" 它。
您可以提供一个虚拟会话 ID,它会让您使用一个新的会话 ID 登录。 Postman 拦截器帮助重定向。
import requests
import json
def login(email, password, session, session_id=None):
""" Authenticate with flurry.com, start a fresh session
if no session id is provided. """
auth_url = 'https://auth.flurry.com/auth/v1/session'
login_url = 'https://login.flurry.com'
auth_method = 'application/vnd.api+json'
if session_id is None:
session_id = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
response = session.request('OPTIONS', auth_url, data='')
headers = response.headers
headers.update({'origin': login_url, 'referer': login_url,
'accept': auth_method, 'content-type': auth_method})
data = {'data': {'type': 'session', 'id': session_id, 'attributes': {
'scopes': '', 'email': email, 'password': password, 'remember': 'false'}}}
payload = json.dumps(data)
response = session.request('POST', auth_url, data=payload, headers=headers)
return response
email, password = 'your-email', 'your-password'
session = requests.Session()
response = login(email, password, session)
# session_id = response.json()['data']['id']
然后您可以在访问旧站点后获取您的 csv 数据:
response = session.request('GET', 'https://dev.flurry.com/home.do')
data = session.request('GET', your_csv_url).text
您可以使用 uuid 库为会话 ID 生成一个 uuid,为了使用旧界面,您需要向 https://dev.flurry.com/home.do?isFirstPostLogin=true 执行请求,现在您可以获得 csv。 (url_get变量)
id = uuid.uuid4()
payload = {"data":
{"type":"session",
"id": str(id),
"attributes":{
"scopes":"",
"email": username,
"password": password,
"remember":"false"}
}
}
with session() as api:
headers = {
'Origin': 'https://login.flurry.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
'Content-Type': 'application/vnd.api+json',
'Accept': 'application/vnd.api+json',
'Connection': 'keep-alive',
}
req = api.post('https://auth.flurry.com/auth/v1/session', data=json.dumps(payload), headers=headers)
if req.status_code == 201:
api.get('https://dev.flurry.com/home.do?isFirstPostLogin=true')
return api.get(url_get).content.encode('ascii', 'ignore')
else:
raise Exception('Login failed')