1

현재 Adwords에서 Selenium과 함께보고 도구를 만들고 있습니다. (그리고 원하는 기능을 제공하지 않기 때문에 Google의 API를 사용할 수 없습니다.)셀렌 및 Google - 쿠키는 어떻게 사용합니까?

자주 로그인하고 로그 아웃하는 것이 쿠키 기반 인증만큼 편리하지 않기 때문에 로그인 및 로그 아웃을 피하려고합니다.

나는 다음과 같은 코드가 있습니다

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() 

save.py 그리고이 : 내가 처음 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() 

load.py을 그 애드워즈에 로그인 할 때 표시됩니다. 잠시 후 그러나, 나는 로그 아웃!

Google의 인증 시스템으로 인해 로그 아웃되는 원인을 알 수 없습니다. 이것의 원인은 무엇이라고 생각하십니까?

코드 리포 : https://gist.github.com/anonymous/63d32e49f59a09ab82fac1f9f972d555

+0

을 'save'와'load' 호출 사이의 시간은 얼마나 걸립니까? 쿠키가 만료되기에 충분한 시간일까요? –

+0

어쩌면 나는 뭔가를 놓치고 있지만 다른 하나를 호출하는 파일이 보이지 않을 것입니다. 또한 잠자기 타이머 후에 각 파일에서 드라이버를 닫는 것을 볼 수 있습니다. 잠자기 시간이 끝나기 전에 로그 아웃합니까? – IamBatman

+0

@ 존 고든 1 분. 나는 save를 실행 한 직후에 문자 그대로 load를 호출한다. – Sparrowcide

답변

1

는 현재 도메인에 대한 작동 driver.add_cookie 방법. 그래서 먼저 driver.add_cookie를 호출하기 전에 driver.get(...)와 도메인을 설정해야합니다 :

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") 

또는 모든 도메인에 대한 쿠키를 저장/복원 할 수있는 devtool API를 호출하여 (크롬 전용) :

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

왜 favicon을 선택했는지 설명 할 수 있습니까? 실제로 사이트를로드하고 싶지 않기 때문입니까? – Sparrowcide

+0

/favicon.ico는 도메인을 설정하는 가장 저렴한 방법입니다. 사이트를 직접로드하면 기본 쿠키가 설정되고 로그인 한 상태에서 페이지를 다시로드해야합니다. –

+0

코드를 사용해 보았지만 애드워즈가 여전히 나를 보내지 않는 것 같습니다 : https : // gist. github.com/anonymous/e9250e49c847b6a2e1eaad45143044d8 – Sparrowcide