1

Ich baue gerade ein Reporting-Tool mit Selenium auf Adwords. (Und nein, ich kann die API von Google nicht verwenden, da sie nicht die von mir gewünschte Funktionalität bietet).Selenium und Google - Wie verwenden Sie Cookies?

Ich versuche, Anmeldungen zu vermeiden und mich abzumelden, weil ich verstehe, dass häufige An- und Abmeldungen nicht so bequem sind wie die Cookie-basierte Authentifizierung.

Ich habe den folgenden Code: save.py

try: 
    driver = webdriver.Chrome() 
    driver.get('https://adwords.google.com') 
    time.sleep(90) 
    # Manually login to adwords page and wait 
    pickle.dump(driver.get_cookies() , open("cookies.pkl","wb")) 

finally: 
    driver.close() 

Und diese: load.py

try: 
    driver = webdriver.Chrome() 
    cookies = pickle.load(open("cookies.pkl", "rb")) 
    for cookie in cookies: 
    driver.add_cookie(cookie) 

    driver.get('https://adwords.google.com/') 
    time.sleep(60) 

finally: 
    driver.close() 

Als ich die erste load.py laufen, ich bin tatsächlich in der Lage die Spinner zu sehen, dass zeigt sich, wenn man sich bei Adwords anmeldet. Kurz danach werde ich ausgeloggt!

Ich weiß nicht, was das Authentifizierungssystem von Google veranlasst, mich abzumelden. Was denkst du ist der Grund dafür?

-Code Repo: https://gist.github.com/anonymous/63d32e49f59a09ab82fac1f9f972d555

+0

Wie viel Zeit vergeht zwischen "Speichern" und "Laden" -Anrufen? Wäre es genug Zeit, dass die Cookies ablaufen? –

+0

Vielleicht vermisse ich etwas, aber ich sehe nicht, dass eine Datei die andere anruft. Ich sehe auch, dass Sie den Treiber in jeder Datei nach einem Sleep-Timer schließen. Wird es abgemeldet, bevor die Schlafzeit endet? – IamBatman

+0

@ John Gordon 1 Minute. Ich rufe die Last direkt an, nachdem ich gespeichert habe. – Sparrowcide

Antwort

1

Verfahren driver.add_cookie nur für die aktuelle Domäne arbeitet. So werden Sie zuerst die Domain mit driver.get(...) vor dem Aufruf driver.add_cookie einstellen:

import json, re 

def save_cookies(driver, file_path): 
    with open(file_path, 'w') as file: 
    cfg = { 
     'url': driver.current_url, 
     'cookies': driver.get_cookies() 
    } 
    json.dump(cfg, file, indent=2) 

def load_cookies(driver, file_path): 
    with open(file_path, 'r') as file : 
    cfg = json.load(file) 
    driver.get(re.match(".+?//[^/]+", cfg['url'])[0] + '/favicon.ico') 

    for cookie in cfg['cookies']: 
     cookie['expiry'] = cookie.get('expiry', -1) 
     driver.add_cookie(cookie); 

# save the cookies 
save_cookies(driver, r"cookies.json"); 

# restore cookies 
load_cookies(driver, r"cookies.json") 

oder durch Aufrufen der DevTool API zum Speichern/Wiederherstellen der Cookies für alle Domänen (Chrome only):

from selenium import webdriver 
import json, base64 

def send_devtools(driver, cmd, params={}): 
    resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id 
    url = driver.command_executor._url + resource 
    body = json.dumps({'cmd': cmd, 'params': params}) 
    response = driver.command_executor._request('POST', url, body) 
    if response['status']: 
    raise Exception(response.get('value')) 
    return response.get('value') 

def save_cookies(driver, file_path): 
    cookies = send_devtools(driver, "Network.getAllCookies", {}) 
    with open(file_path, 'w') as file: 
    json.dump(cookies, file, indent=2) 

def load_cookies(driver, file_path): 
    with open(file_path, 'r') as file : 
    cookies = json.load(file) 
    send_devtools(driver, "Network.setCookies", cookies) 

# save cookies 
save_cookies(driver, r"c:\temp\cookies.json"); 

# restore cookies 
load_cookies(driver, r"c:\temp\cookies.json") 
+0

Können Sie erklären, warum Sie sich für das Favicon entschieden haben? Liegt es daran, dass Sie die Website nicht wirklich laden möchten? – Sparrowcide

+0

/favicon.ico ist der günstigste Weg, um die Domain zu setzen. Das Laden der Seite direkt setzt die Standard-Cookies und Sie müssen immer noch die Seite neu laden, um die Seite als eingeloggt zu bekommen. –

+0

Ich habe versucht mit Ihrem Code, aber es scheint wie adwords mich immer noch nicht: https: // gist. github.com/anonymous/e9250e49c847b6a2e1eaad45143044d8 – Sparrowcide

Verwandte Themen