首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flurry Requests.Session() Python3

Flurry Requests.Session() Python3
EN

Stack Overflow用户
提问于 2016-08-29 16:00:18
回答 3查看 3.1K关注 0票数 5

所以我在这里之前回答了这个问题。然而,“狂暴”网站上的一些东西已经改变了,答案也不再起作用。

代码语言:javascript
复制
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显示:

代码语言:javascript
复制
[<Response [302]>, <Response [302]>, <Response [302]>, <Response [302]>, <Response [303]>]

如果有人能看一看,找出我哪里出错了,我会非常感激的。

谢谢。

更新

因此,从新的登录地址中,我看到帖子需要采用以下格式:

代码语言:javascript
复制
{"data":{"type":"session","id":"bd7d8dc1-4a86-4aed-a618-0b2765b03fb7","attributes":{"scopes":"","email":"myemail","password":"mypass","remember":"false"}}}

但我不知道的是他们是如何生成id的。有人能看看吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-02 23:02:33

您可以提供一个虚拟会话id,它将用一个新的id登录。邮递员拦截器帮助重定向。

代码语言:javascript
复制
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数据:

代码语言:javascript
复制
response = session.request('GET', 'https://dev.flurry.com/home.do')
data = session.request('GET', your_csv_url).text
票数 1
EN

Stack Overflow用户

发布于 2016-08-30 00:50:36

他们现在有一个新的设计和一个新登录页,他们也重定向你-这就是为什么你看到302和303的状态代码。它背后的登录过程和逻辑、URL、指向CSV文件的链接--现在一切都不同了,您必须“重新实现”/“remimic”它。

票数 1
EN

Stack Overflow用户

发布于 2016-09-05 21:02:46

您可以使用uuid为会话id生成一个uuid,为了使用旧的接口,您需要执行对https://dev.flurry.com/home.do?isFirstPostLogin=true的请求,现在可以获得csv。(url_get变量)

代码语言:javascript
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39210484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档