2016-11-17 3 views
0

Я пытаюсь создать PDF-файл веб-страницы с веб-сайта https (Salesforce). Я до сих пор пытался использовать simple_salesforce, который возвращает sessionID (cookie) безрезультатно.Создайте PDF-страницу https, требующую входа в систему, используя pdfkit

from simple_salesforce import Salesforce 
import pdfkit 

sf = Salesforce(username='my username' 
      ,password='my password' 
      ,security_token= 'my API security token') 

path_wkthmltopdf = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' 
config = pdfkit.configuration(wkhtmltopdf=bytes(path_wkthmltopdf, 'utf8')) 
options1 = { 
    'page-size': None, 
    'margin-top': None, 
    'margin-right': None, 
    'margin-bottom': None, 
    'margin-left': None, 
    'encoding': None, 
    'custom-header' : None, 
    'cookie': sf.session_id, 
    'no-outline': None 
} 
pdfkit.from_url('https://thiess.my.salesforce.com/0069000000IZH71','out.pdf', 
       configuration=config, options=options1) 

Кто-нибудь знает, что является лучшим способом передать аргумент cookie в pdfkit?

ответ

1

Проверьте это :) Вероятно, вам нужны запросы, если у вас их нет. Я мало знаю о библиотеке Salesforce.

import requests 
import pdfkit 

session = requests.session() 


def download(session,username,password): 
    session.get('https://bneadf.thiess.com.au/adfs/ls/') 

    ua = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' 
    session.headers = {'User-Agent': self.ua} 
    payload = {'UserName':username, 
     'Password':password, 
     'AuthMethod':'FormsAuthentication'} 

    session.post('https://bneadf.thiess.com.au/adfs/ls/', data = payload, headers = session.headers) 
    my_html = session.get('https://thiess.my.salesforce.com/0069000000IZH71') 
    my_pdf = open('myfile.html','wb+') 
    my_pdf.write(my_html.content) 
    my_pdf.close() 

    path_wkthmltopdf = 'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' 
    config = pdfkit.configuration(wkhtmltopdf=bytes(path_wkthmltopdf, 'utf8')) 


    pdfkit.from_file('myfile.html', 'out.pdf') 

download(session,"yourusername","yourpass") 
+0

В сценарии есть несколько опечаток, но после того, как они исправили их, работа сработала, но только любопытная. По-видимому, html-формат, созданный при вызове request.get, исказил макет веб-страницы, поэтому, хотя содержимое было там, внешний вид совершенно другой. Знаете ли вы какой-либо другой формат, который лучше сохранит внешний вид страницы? –

+0

Тогда вы должны использовать тот же метод, но с BeautifulSoup. –

+0

Красивый суп возвращает ссылки на изображения, которые при передаче в pdfkit сталкиваются с одной и той же проблемой pdfkit, которая сама не должна обрабатывать процесс аутентификации. –

1

У меня есть аналогичная проблема. Я заметил, что в github/documetation есть расширенные настройки параметров, где вы можете передавать файлы cookie и cookiejar вместе с именем пользователя и паролем. Я знаю, что это похоже на то, что вы пытались, но похоже, что вы не задали имя файла cookie правильно. Вот это документы из https://github.com/JazzCore/python-pdfkit

options = { 
    'page-size': 'Letter', 
    'margin-top': '0.75in', 
    'margin-right': '0.75in', 
    'margin-bottom': '0.75in', 
    'margin-left': '0.75in', 
    'encoding': "UTF-8", 
    'custom-header' : [ 
     ('Accept-Encoding', 'gzip') 
    ] 
    'cookie': [ 
     ('cookie-name1', 'cookie-value1'), 
     ('cookie-name2', 'cookie-value2'), 
    ], 
    'no-outline': None 
} 

pdfkit.from_url('http://google.com', 'out.pdf', options=options) 

Это кажется, что для «куки» объекта необходимо передать в списке с именем печенья и значением как кортежи. Мне не удалось заставить его работать на моем примере, я думаю, потому что моя веб-страница использует много javascript/css. Однако, используя метод запросов, который сказал Аттила, вы можете что-то сделать с помощью входа в salesforce?

cookie_list = session.cookies.items() 

то, может быть, попробуйте ваш пример еще раз?

options1 = { 
    'page-size': None, 
    'margin-top': None, 
    'margin-right': None, 
    'margin-bottom': None, 
    'margin-left': None, 
    'encoding': None, 
    'custom-header' : None, 
    'cookie': cookie_list, 
    'no-outline': None 
}