4 votes

problème de transmission des cookies à l'en-tête dans python

Ce dont j'ai besoin, c'est d'extraire le cookie uid du premier site web et d'ouvrir le second avec (c'est une sorte d'autorisation).

cela ne fonctionne pas non plus avec ce code :

#!/usr/bin/env python
import urllib, urllib2, cookielib
import socket, Cookie
def extract(url):
 jar = cookielib.FileCookieJar("cookies")
 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar))
 opener.addheaders = [('User-agent',
      'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20110201 Firefox/2.0.0.14')]

 response = opener.open(url)
 for cookie in jar:
    precious_value = cookie.value
 return precious_value

site1 = "mysite1.com"
site2 = "mysite2.com"

cp = urllib2.HTTPCookieProcessor()
cj = cp.cookiejar
cj.set_cookie(cookielib.Cookie(0, cookie_name, 
                               extract(site1), 
                               '80', False, 'domain', True, False, '/path',
                               True, False, None, False, None, None, None))
opener = urllib2.build_opener(urllib2.HTTPHandler(),cp)
opener.addheaders.append(('User-agent', 'Mozilla/5.0 (compatible)'))
print opener.open(site2).read()

ni de cette façon :

#!/usr/bin/env python
import urllib, urllib2, cookielib
def extract(url):
 jar = cookielib.FileCookieJar("cookies")
 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar))
 opener.addheaders = [('User-agent',
   'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20110201 Firefox/2.0.0.14')]

 response = opener.open(url)
 for cookie in jar:
    precious_value = cookie
 return precious_value 

site1 = "mysite1.com"
site1 = "mysite2.com"

jar = cookielib.FileCookieJar("cookies")
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar))
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; 
en-GB; rv:1.8.1.14) Gecko/20110201 Firefox/2.0.0.14')]

opener.addheaders = [('Cookies', extract(site1))]
response = opener.open(site2)
print response.read()

cependant, j'ai réussi ici avec la bibliothèque des "demandes". le code est beau :

cookies= dict(mycid='9ti6cACUi6AqxXBG2H9AMPkrfRbBJPalKTAh_bLcuQ8c8C')
r = requests.get(url, cookies = cookies)
print r.text

Cela me convient et je n'ai rien contre les demandes... mais quand même, qu'est-ce que j'ai fait de mal lors des deux premières tentatives ? Dans les deux cas, les procédures d'extraction fonctionnent bien et je vois que l'uid a été correctement extrait. Je suppose que le problème vient de la zone add_headers. La réponse est évidente mais je n'y arrive toujours pas. Quelqu'un peut-il m'aider ?

1) Quelle est la bonne façon de passer un cookie dans les en-têtes uniquement avec urllib ou urllib2 ?

2) Comment puis-je le passer comme un paramètre qui peut être modifié, et pas seulement comme une référence à un objet extrait ?

3) Comment dois-je le passer correctement comme un nom d'objet/valeur ?

Merci d'avance

0voto

Alex Points 138

Votre boucle def extract(url): a deux problèmes :

  1. Il renvoie toujours la dernière valeur, qui n'est pas nécessairement celle où se trouve votre cookie.
  2. Il fait des suppositions sur l'ordre dans lequel les cookies sont stockés, ce que vous ne pouvez pas savoir.

(je suppose que precious_value est définie ailleurs, sinon ce code ne fonctionne pas)

Pour savoir quelle clé vous devez utiliser pour récupérer le cookie particulier qui vous intéresse, vous pouvez utiliser les outils de développement de chrome pour voir quel est le nom du cookie défini par le site que vous voulez.

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X