Постер Python Content-Length error - PullRequest
       30

Постер Python Content-Length error

1 голос
/ 13 октября 2011

Я пытался отправить изображение с помощью модуля poster .Я последовал примеру, но он не работает для меня

Мой код:

from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib, urllib2

def decaptcha(hash):
register_openers()

    params = {
        "file": open("captcha.jpg", "rb"),
        "function" : "picture2",
        "username" : "uname",
        "password" : "pwd",
        "pict_to" : 0,
        "pict_type" : 0
        }


    datagen, headers = multipart_encode(params)

    req = urllib2.Request("http://poster.decaptcher.com/")

    solve = urllib2.urlopen(req, datagen, headers)
    print solve.read()

decaptcha(None)

И traceback:

`File "decaptcha.py", line 27, in <module>
    decaptcha(None)
  File "decaptcha.py", line 24, in decaptcha
    solve = urllib2.urlopen(req, datagen, headers)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 390, in open
    req = meth(req)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/poster-0.8.1-py2.7.egg/poster/streaminghttp.py", line 154, in http_request
    "No Content-Length specified for iterable body")
ValueError: No Content-Length specified for iterable body`

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

Вы должны передавать запрос данных и заголовки, а не urlopen:

req = urllib2.Request("http://poster.decaptcher.com/", datagen, headers)
solve = urllib2.urlopen(req)
0 голосов
/ 13 октября 2011

(Отказ от ответственности: я не использовал библиотеку плакатов. Предлагаемое решение - мое лучшее предположение.)

Из постеров, похоже, это должно работать.

Я бы попробовал следующее (передает содержимое файла вместо итератора открытого файла, должно исправить проблему с итеративным телом):

params = {
    "file": open("captcha.jpg", "rb").read(),
    "function" : "picture2",
    "username" : "uname",
    "password" : "pwd",
    "pict_to" : 0,
    "pict_type" : 0
    }

Предложение 2:

Или попробуйте: из multipart.encode импорта MultiPartParam

params = [
    MultiPartParam("file", fileobj=open("captcha.jpg", "rb")),
    ("function", picture2"),
    ("username", "uname"),
    ("password", "pwd"),
    ("pict_to", 0),
    ("pict_type", 0),
]

Если это не удается с той же ошибкой, попробуйте указать для параметра filesize значение MultiPartParam.

...