在会话中保存凭证

Save Credentials in a Session

我正在尝试使用 pdfkit 对我们公司的 wiki 进行可视化备份。我 运行 遇到麻烦了,因为该网站要求用户登录才能使用。我使用 splinter 开发了一个登录公司 wiki 的脚本,但是当 pdfkit 执行时,它 returns 登录页面。在这种情况下,PDFkit 必须打开一个不同的会话。我如何才能查明何时需要凭据 (cookie) 才能访问我网站上的页面,并将它们保存为变量以便我可以获取这些屏幕截图?

我正在使用 python 2.7.8 splinter、requests 和 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")

我还找到了以下脚本,可以让我登录并保存凭据,但我不确定如何将它与我正在尝试做的事情联系起来。

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

如有任何关于如何完成此任务的想法,我们将不胜感激

您必须处理 cookie:

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)

你还需要一个开场白

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)     

然后你会做类似的事情

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

当您使用 Splinter browser 登录时,网站会向您发送 HTTP cookies 标识您的授权会话,并且 browser 会记住它们以供进一步请求。

但是 PDFKit 对您的 browser 一无所知。它只是将您提供的 URL 传递给底层 wkhtmltopdf 工具,然后该工具会使用自己的默认设置获取页面。

您需要做的是将 cookie 从 browser 传输到 wkhtmltopdf。值得庆幸的是,以这种方式连接 Splinter 和 PDFKit 很容易:

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