Запись в NamedTemporaryFile автоматически завершается ошибкой; преобразование Curl cook ie jar в файлы cookie запросов - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь взять файл Netscape HTTP Cook ie, который выдает Curl, и преобразовать его в Cookiejar, с которым может работать библиотека запросов. У меня есть netscapeCookieString в моем Python скрипте в качестве переменной, которая выглядит так:

# Netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.miami.edu  TRUE    /   TRUE    0   PS_LASTSITE https://canelink.miami.edu/psc/PUMI2J/

Поскольку я не хочу сам разбирать файл cook ie, я хотел бы использовать cookielib. К сожалению, это означает, что мне нужно писать на диск, поскольку cookielib.MozillaCookieJar() не будет принимать строку в качестве ввода: он должен принимать файл.

Итак, я использую NamedTemporaryFile (не удалось получить SpooledTemporaryFile для работы; снова хотел бы сделать все это в памяти, если возможно).

tempCookieFile = tempfile.NamedTemporaryFile()

# now take the contents of the cookie string and put it into this in memory file
# that cookielib will read from. There are a couple quirks though. 
for line in netscapeCookieString.splitlines():

    # cookielib doesn't know how to handle httpOnly cookies correctly
    # so we have to do some pre-processing to make sure they make it into
    # the cookielib. Basically just removing the httpOnly prefix which is honestly
    # an abuse of the RFC in the first place. note: httpOnly actually refers to
    # cookies that javascript can't access, as in only http protocol can
    # access them, it has nothing to do with http vs https. it's purely 
    # to protect against XSS a bit better. These cookies may actually end up
    # being the most critical of all cookies in a given set.
    # https://stackoverflow.com/a/53384267/2611730
    if line.startswith("#HttpOnly_"):
        # this is actually how the curl library removes the httpOnly, by doing length
        line = line[len("#HttpOnly_"):]

    tempCookieFile.write(line)

tempCookieFile.flush()

# another thing that cookielib doesn't handle very well is 
# session cookies, which have 0 in the expires param
# so we have to make sure they don't get expired when they're
# read in by cookielib
# https://stackoverflow.com/a/14759698/2611730
print tempCookieFile.read()
cookieJar = cookielib.MozillaCookieJar(tempCookieFile.name)
cookieJar.load(ignore_expires=True)
pprint.pprint(cookieJar)

Но вот кикер, это не работает!

print tempCookieFile.read() печатает пустая строка.

Таким образом, pprint.pprint(cookieJar) печатает пустую кухню ie jar.

Мне легко удалось воспроизвести это на моем Ma c:

>>> import tempfile
>>> tempCookieFile = tempfile.NamedTemporaryFile()
>>> tempCookieFile.write("hey")
>>> tempCookieFile.flush()
>>> print tempCookieFile.read()

>>>

Как я могу писать на NamedTemporaryFile?

1 Ответ

1 голос
/ 01 августа 2020

После записи в файл указатель на этот файл находится в месте после этих записанных данных (в вашем случае - конец файла), поэтому при чтении он возвращает пустую строку (больше данных после конца файла) просто искать до 0 перед чтением

>>> import tempfile
>>> tempCookieFile = tempfile.NamedTemporaryFile()
>>> tempCookieFile.write("hey")
>>> tempCookieFile.seek(0)
>>> print(tempCookieFile.read())
...