2017-08-03 4 views
2

J'essaie d'utiliser pdfkit pour faire une sauvegarde visuelle de notre wiki d'entreprise. Je rencontre des problèmes car le site nécessite que l'utilisateur soit connecté pour pouvoir l'utiliser. J'ai développé un script en utilisant splinter qui se connecte au wiki de la compagnie, mais quand pdfkit s'exécute, il renvoie la page de connexion. PDFkit doit ouvrir une session différente dans ce cas. Comment serais-je en mesure de savoir quand les informations d'identification (cookies) sont nécessaires pour accéder aux pages de mon site, et de les enregistrer en tant que variables afin que je puisse saisir ces captures d'écran?Enregistrer les informations d'identification dans une session

J'utilise écharde python 2.7.8, les demandes et PDFKit

from splinter import Browser 
browser = Browser() 
browser.visit('https://companywiki.com') 
browser.find_by_id('login-link').click() 
browser.fill('os_username', 'username') 
browser.fill('os_password', 'password') 
browser.find_by_name('login').click() 
import pdfkit 
pdfkit.from_url("https://pagefromcompanywiki.com", "c:/out.pdf") 

Je trouve aussi le script suivant qui me connecter et enregistrer des informations d'identification, mais je ne suis pas sûr de savoir comment l'attacher pour ce que j'essaie de faire.

import requests 
import sys 
EMAIL = '' 
PASSWORD = '' 
URL = 'https://company.wiki.com' 
def main(): 
    session = requests.session(config={'verbose': sys.stderr}) 
    login_data = { 
     'loginemail': EMAIL, 
     'loginpswd': PASSWORD, 
     'submit': 'login', 
    } 
    r = session.post(URL, data=login_data) 
    r = session.get('https://pageoncompanywiki.com'). 

if __name__ == '__main__': 
    main() 

Toutes les idées sur la façon d'accomplir cette tâche sont appréciés

Répondre

2

Lorsque vous vous connectez avec votre Splinter browser, le site vous envoie HTTP cookies qui identifie votre session autorisée, et les browser pour d'autres demandes se souvient.

Mais PDFKit ne sait rien de votre browser. Il transmet simplement l'URL que vous avez indiquée à l'outil wkhtmltopdf sous-jacent, qui récupère ensuite la page avec ses propres paramètres par défaut.

Ce que vous devez faire est de transférer les cookies de browser à wkhtmltopdf. Heureusement, il est facile de se connecter et Splinter PDFKit ainsi:

options = {"cookie": browser.cookies.all().items()} 
pdfkit.from_url("https://pagefromcompanywiki.com", "c:/out.pdf", options=options) 
+0

Cela a fini par fonctionner. Merci pour l'aide. Cependant, seul l'écran plafonne le haut de la page. Toute idée s'il y a un moyen de définir des paramètres, ou assurez-vous que l'écran capture l'intégralité de la page? –

+0

@ChaseRaab Pas sûr, désolé. Consultez la [liste des options wkhtmltopdf] (https://wkhtmltopdf.org/usage/wkhtmltopdf.txt) - tous peuvent être passés via le dictionnaire 'options' de pdfkit, comme expliqué dans [pdfkit docs] (https: // pypi .python.org/pypi/pdfkit). Si cela ne vous aide pas, essayez de poser une question distincte à ce sujet. –

0

Vous devez gérer les cookies:

class CookieJar(cookielib.CookieJar): 
    def _cookie_from_cookie_tuple(self, tup, request): 
     name, value, standard, rest = tup 
     version = standard.get('version', None) 
     if version is not None: 
      version = version.replace('"', '') 
      standard["version"] = version 
     return cookielib.CookieJar._cookie_from_cookie_tuple(self, tup, request) 

et vous avez besoin d'un ouvre ainsi

def getOpener(self): 
    handlers = [] 
    cj = CookieJar(); 
    cj.set_policy(cookielib.DefaultCookiePolicy(rfc2965=True)) 
    cjhdr = urllib2.HTTPCookieProcessor(cj) 
    handlers.append(cjhdr)            
    return urllib2.build_opener(*handlers)  

et la vous feriez quelque chose comme

urlHandle = self.getOpener().open(request) 
+0

Y at-il des documents que vous pouvez me proposer qui me aider à comprendre la fonction de cette situation? –