RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1044398
Accepted
Ole Lukøje
Ole Lukøje
Asked:2020-11-10 15:20:42 +0000 UTC2020-11-10 15:20:42 +0000 UTC 2020-11-10 15:20:42 +0000 UTC

如何将 cookie 从 selenium 会话传递给请求?

  • 772

问题出现在 auto.ru 上的个人帐户中的授权
最终任务是收集一段时间内的广告统计信息。
当只有一个账户时,一切都通过VBA解决,通过IE在auto.ru上授权

但是现在有几个帐户,我想自动化授权过程。整个授权过程由 ajax 脚本覆盖。为了通过这些脚本进行授权,我使用了 selenium-webdriver Firefox():

from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import Firefox
from selenium.webdriver.common.keys import Keys

if __name__ == '__main__':
    drv = Firefox()

    drv.get('https://auth.auto.ru/login/')
    try_count = 0

    """Авторизация через ajax скрипт"""

    while try_count < 10:   # Здесь ИНОГДА всплывает кнопка, которую нужно нажать что-бы продолжить 
        try:
            try_count += 1
            btn = drv.find_element('xpath', '//*[@id="confirm-button"]')
            btn.click()
            break
        except NoSuchElementException:
            try_count += 1
            continue

    while True:
        try:
            login = drv.find_element('xpath', '/html/body/div/div/div/div/form/div/div[2]/span/label/div/span/input')
            login.send_keys('**********', Keys.RETURN)
            break
        except NoSuchElementException:
            continue

    while True:
        try:
            password = drv.find_element('xpath', '/html/body/div/div/div/div/form/div/div[3]/span/label/div/span/input')
            password.send_keys('************', Keys.RETURN)
            break
        except NoSuchElementException:
            continue

它有效,我去我的个人帐户。
然后不知何故,您需要将会话转移到 requests.session 以进行进一步的工作。在这里,据我了解,您需要将 cookie 传递给请求会话。

selenim 输出.get_cookies()如下所示:

[{'name': '_csrf_token', 'value': '62c6c12693832b221e370*****5744936e01c444d73d59', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False}, {'name': 'suid', 'value': '0c5da5698d907ef61f6ce776c0e95008.9109b8aa****b74b49d9f245095e466', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1604906256}, {'name': 'autoru_sid', 'value': 'a%3Ag5dc7b990*********32k7nllupd2npo.*************%7C1573370256112.604800.7jv-tw07xW7EdH***********51chKUv11gqj-vE6nwlcLv*********fiY6VM_E', 'path': '/', 'domain': '.auto.ru', 'secure': True, 'httpOnly': True, 'expiry': 1574579856}, {'name': 'autoruuid', 'value': 'g5dc7b990205vek9m432k7nllupd2npo.*********************', 'path': '/', 'domain': '.auto.ru', 'secure': True, 'httpOnly': True, 'expiry': 1574579856}, {'name': '_ym_wasSynced', 'value': '%7B%22time%22%*******%2C%22params%22%3A%7B%22eu%22%3A0%7D%2C%22bkParams%22%3A%7B%7D%7D', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1573473937}, {'name': '_ym_uid', 'value': '1573370258208414976', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1604906257}, {'name': '_ym_d', 'value': '1573370258', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1604906257}, {'name': '_ym_isad', 'value': '2', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1573442258}, {'name': '_ym_visorc_22*******', 'value': 'b', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1573372058}, {'name': 'X-Vertis-DC', 'value': 'sas', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1573373858}]

我不知道如何正确处理它,以便我可以requests拿起它并继续会话。

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Mikhail Murugov
    2020-11-10T22:43:57Z2020-11-10T22:43:57Z

    我建议使用requests.


    import requests
    
    
    def login_with_password(login: str, password: str) -> requests.sessions.Session:
        """Авторизация для старых аккаунтов, где используется связка логин+пароль
        :param login: Логин (email или телефон) для авторизации
        :type login: str
        :param password: Пароль для авторизации
        :type password: str
    
        :return: Авторизованная сессия
        :rtype: requests.sessions.Session
        """
        session = requests.Session()
    
        # Получаем CSRF токен в cookies для дальнейшей работы
        response = session.get('https://auth.auto.ru/login/')
    
        # Дублируем CSRF токен из cookies в заголовок x-csrf-token,
        # чтобы не передавать его вручную при каждом запросе
        CSRF_token = response.cookies['_csrf_token']
        session.headers.update({"x-csrf-token": CSRF_token})
    
        json_for_login = {
            "items": [
                {
                    "path": "auth/login",
                    "params": {
                        "login": login,
                        "password": password
                    }
                }
            ]
        }
        # Авторизируемся
        session.post("https://auth.auto.ru/-/ajax/auth/", json=json_for_login)
    
        return session # Возвращаем авторизованную сессию
    
    
    def login_with_email(email: str) -> requests.sessions.Session:
        """Авторизация для новых аккаунтов, где используется связка почта+код с почты
        :param email: Email для авторизации
        :type login: str
    
        :return: Авторизованная сессия
        :rtype: requests.sessions.Session
        """
        session = requests.Session()
    
        # Получаем CSRF токен в cookies для дальнейшей работы
        response = session.get('https://auth.auto.ru/login/') 
    
        # Дублируем CSRF токен из cookies в заголовок x-csrf-token,
        # чтобы не передавать его вручную при каждом запросе
        CSRF_token = response.cookies['_csrf_token']
        session.headers.update({"x-csrf-token": CSRF_token})
    
        json_for_code = {
            "items": [
                {
                    "path": "auth/login-or-register",
                    "params": {
                        "email": email
                    }
                }
            ]
        }
        # Отправляем серверу запрос, чтобы он отправил
        # нам почту email 6-ти значный код
        session.post("https://auth.auto.ru/-/ajax/auth/", json=json_for_code)
    
        # Тут любым образом достаёте этот код с почты
        # ...
    
        json_for_login = {
            "items": [
                {
                    "path": "user/confirm",
                    "params": {
                        "email": email,
                        "code": "666666" # 6-ти значный код с почты
                    }
                }
            ]
        }
        # Авторизируемся
        session.post("https://auth.auto.ru/-/ajax/auth/", json=json_for_login)
    
        return session # Возвращаем авторизованную сессию
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5