Guia Prático sobre Cookies e Sessões em Python

O protocolo HTTP é baseado em sem estado, o que significa que após uma solicitação e resposta entre o navegador e o servidor, a conexão é encerrada, sem reter informações do usuário. Isso leva à necessidade de mceanismos como cookies e sessões para manter o estado, permitindo funcionalidades como login automático e rastreamento de preferências do usuário para recomendações personalizadas. Os cookies possuem um tempo de validade e podem ser renovados após expirarem.

Uso de Cookies com a Biblioteca requests

Para obter cookies de uma resposta, pode-se extrair o atributo cookies do objeto de resposta. Por exemplo:


resposta = requests.post(url, cabecalhos=cabecalhos, dados=dados)
cookies_obtidos = resposta.cookies

Para usar os cookies em uma nova solicitação, passe-os como parâmetro:


resposta = requests.post(url, cabecalhos=cabecalhos, dados=dados, cookies=cookies_obtidos)

Note que dados deve ser um dicionário com os pares chave-valor necessários.

Trabalhando com Sessões e o Papel dos Cookies

Uma sessão pode ser criada com requests.session(), que mantém automaticamente os cookies entre as solicitações. Inicialmente, os cookies da sessão estão vazios:


sessao = requests.session()
print(type(sessao.cookies))  # Saída: <class 'requests.cookies.RequestsCookieJar'>
print(sessao.cookies)         # Saída: <RequestsCookieJar[]>

Ao realizar uma solicitação de login usando a sessão, o servidor responde com cookies de autenticação, que são armazenados automaticamente:


login_resposta = sessao.post(url_login, dados=dados_login, cabecalhos=cabecalhos)
print(sessao.cookies)  # Exibe os cookies recebidos, incluindo tokens de sessão

Subsequentemente, ao fazer uma solicitação de comentário, os cookies armazenados são reutilizados, eliminando a necessidade de fornecer credenciais novamente:


comentario_resposta = sessao.post(url_comentario, dados=dados_comentario, cabecalhos=cabecalhos)
print(sessao.cookies)  # Os cookies permanecem os mesmos ou podem ser atualizados

Salvando e Recuperando Cookies

Os cookies podem ser convertidos de um RequestsCookieJar para um dicionário e, em seguida, serializados como uma string JSON para armazenamento em arquivo:


import json

sessao = requests.session()
sessao.post(url_login, dados=dados_login, cabecalhos=cabecalhos)

cookies_dict = requests.utils.dict_from_cookiejar(sessao.cookies)
cookies_str = json.dumps(cookies_dict)

with open('cookies.json', 'w', encoding='utf-8') as arquivo:
    arquivo.write(cookies_str)

Para recuperar os cookies de um arquivo, inverta o processo: leia a string JSON, converta-a em um dicionário e, em seguida, em um RequestsCookieJar para atribuir à sessão:


with open('cookies.json', 'r', encoding='utf-8') as arquivo:
    cookies_str_lido = arquivo.read()

cookies_dict_lido = json.loads(cookies_str_lido)
cookies_lidos = requests.utils.cookiejar_from_dict(cookies_dict_lido)
sessao.cookies = cookies_lidos

comentario_resposta = sessao.post(url_comentario, dados=dados_comentario, cabecalhos=cabecalhos)
print(comentario_resposta)

Exemplo Completo com Modularização

O código a seguir demonstra uma estrutura modular para login, armazenamento de cookies e publicação de comentários, com tratamento de erros:


import requests
import json

sessao = requests.session()
cabecalhos = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

def carregar_cookies():
    try:
        with open('cookies.json', 'r', encoding='utf-8') as f:
            dados = json.load(f)
        return requests.utils.cookiejar_from_dict(dados)
    except FileNotFoundError:
        return None

def realizar_login(usuario, senha):
    url_login = 'https://exemplo.com/login'
    dados_login = {'username': usuario, 'password': senha}
    sessao.post(url_login, headers=cabecalhos, data=dados_login)
    cookies_dict = requests.utils.dict_from_cookiejar(sessao.cookies)
    with open('cookies.json', 'w', encoding='utf-8') as f:
        json.dump(cookies_dict, f)

def publicar_comentario(texto):
    url_comentario = 'https://exemplo.com/comentar'
    dados_comentario = {'comment': texto, 'post_id': '1'}
    return sessao.post(url_comentario, headers=cabecalhos, data=dados_comentario)

# Uso principal
cookies = carregar_cookies()
if cookies:
    sessao.cookies = cookies
else:
    realizar_login('usuario', 'senha')
    sessao.cookies = carregar_cookies()

resposta = publicar_comentario('Comentário de teste!')
if resposta.status_code == 200:
    print('Comentário publicado com sucesso!')
else:
    realizar_login('usuario', 'senha')
    sessao.cookies = carregar_cookies()
    resposta = publicar_comentario('Comentário de teste!')
    print(resposta)

Tags: cookies session HTTP Python Requests

Publicado em 7-25 16:36