Curl отправка файла содержащегося в строке

Discussion in 'PHP' started by molologin, 3 Nov 2011.

  1. molologin

    molologin New Member

    Joined:
    2 Nov 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Вопрос скорее по Curl чем по Python, поэтому создаю новую тему. Пишу я бота, с привязкой к капчаботу, но суть в том, что после скачивания, например картинки рекапчи, она заносится в cStringIO, а вот как заставить curl отправить картинку из cStringIO пост запросом (Пока находил только методы с сохранением файла на диск, но не хочется так делать).

    Для тех кто не в курсе, cStringIO - по сути обычная строка.
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    molologin прочитайте из StringIO в переменную и отправьте как обычный текст.
     
    _________________________
  3. molologin

    molologin New Member

    Joined:
    2 Nov 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Вы имеете ввиду составить весь запрос вручную? да, так и делал с urllib2, а вот как с curl'ом отправить что-то типа:
    Code:
    '''--%s
    Content-Disposition: form-data; name="method"
    
    post
    --%s
    Content-Disposition: form-data; name="phrase"
    
    1
    --%s
    Content-Disposition: form-data; name="key"
    
    %s
    --%s
    Content-Disposition: form-data; name="file"; filename="capcha.jpg"
    Content-Type: image/pjpeg
    
    %s
    --%s--
    
    ''' % (boundary, boundary, boundary, key, boundary, tmp[0], boundary)
    Не знаю
     
    #3 molologin, 3 Nov 2011
    Last edited: 3 Nov 2011
  4. roflzi

    roflzi New Member

    Joined:
    16 Apr 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    вот функции для генерации multipart/form-data запроса.

    но вообще вот такой код должен работать:
    Code:
    c = pycurl.Curl()
    c.setopt(c.URL, "http://url/a.cgi")
    c.setopt(c.HTTPPOST,[ 
                          ("method", "post"), 
                          ("phrase", var_value), 
                          ("key", var_value2), 
                          ("file", 
                                     (c.FORM_FILE, хендл_цстрингио, 
                                      c.FORM_CONTENTTYPE, "image/pjpeg"))
                        ])
    
     
    #4 roflzi, 3 Nov 2011
    Last edited: 3 Nov 2011
  5. molologin

    molologin New Member

    Joined:
    2 Nov 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Code:
    import pycurl
    import cStringIO
    cs=cStringIO.StringIO()
    cs.write(open('d:\\temp.jpg','rb'))
    c = pycurl.Curl()
    c.setopt(c.URL, "http://url/a.cgi")
    
    c.setopt(c.HTTPPOST,[("method", "post"), 
                          ("phrase", 1), 
                          ("key", 'somekey'), 
                          ("file",(c.FORM_FILE, cs, c.FORM_CONTENTTYPE, "image/pjpeg"))])
    
    File "<pyshell#20>", line 5, in <module>
        ("file",(c.FORM_FILE, cs.getvalue(), c.FORM_CONTENTTYPE, "image/pjpeg"))])
    TypeError: unsupported second type in tuple
    
     
  6. roflzi

    roflzi New Member

    Joined:
    16 Apr 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    попробуйте вместо "image/pjpeg", "Content-type: image/pjpeg" или другой любой тип
     
  7. molologin

    molologin New Member

    Joined:
    2 Nov 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Нет, не помогает, и не поможет, в документациии о чтении из строки вообще ничего не сказано, так что требую костыль :)
     
  8. roflzi

    roflzi New Member

    Joined:
    16 Apr 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    тут не проблема в чтении, файл оно читает из хендла нормально в этом коде. питон не хавает контент тайп почемуто
     
  9. molologin

    molologin New Member

    Joined:
    2 Nov 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Code:
    cs=cStringIO.StringIO()
    cs.write(open('d:\\temp.jpg','rb').read())
    c = pycurl.Curl()
    c.setopt(c.URL, "http://url/a.cgi")
    d=[("file",(c.FORM_FILE, cs.getvalue(), c.FORM_CONTENTTYPE, "image/jpeg", c.FORM_FILENAME, 'image.jpg'))]
    c.setopt(c.HTTPPOST,d)
    
    pycurl.error: (26, 'failed creating formpost data')
    
    d=[("file",(c.FORM_FILE, cs, c.FORM_CONTENTTYPE, "image/jpeg", c.FORM_FILENAME, 'image.jpg'))]
    c.setopt(c.HTTPPOST,d)
    
    c.setopt(c.HTTPPOST,d)
    
    Ну может хоть кто-то знает выход?
     
  10. roflzi

    roflzi New Member

    Joined:
    16 Apr 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    без сохранения файла на диск через pycurl это не возможно
     
  11. molologin

    molologin New Member

    Joined:
    2 Nov 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    А отправить что-то типа:
    Code:
    '''--%s
    Content-Disposition: form-data; name="method"
    
    post
    --%s
    Content-Disposition: form-data; name="file"; filename="captcha.jpg"
    Content-Type: image/pjpeg
    
    %s
    --%s--''' % (boundary, boundary, (StringIO object).getvalue(), boundary)
    
    Тоже через курл нельзя?
     
  12. roflzi

    roflzi New Member

    Joined:
    16 Apr 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    Можно, этот тип данных называется multipart , опция курла CUSTOMREQUEST позволяет запихнуть любой параметр в заголовок через setopt.

    выставьте через setopt 'Content-type: multipart/form-data' в CUSTOMREQUEST и сгенерируйте данные модулем который я кидал в предыдущем посте.
     
  13. molologin

    molologin New Member

    Joined:
    2 Nov 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Всё, сделал так, вроде работает.
    Code:
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import pycurl
    import base64
    import urllib
    key='xxxxxxxxxxxxxxxxxxxxxx'
    tmp = open('r:\Projects\EclipseProjects\Python1\image.jpg','rb').read()
    poststring=urllib.urlencode({'method':'base64','key':key,'body':base64.encodestring(tmp),'ext':'jpg'})
    
    c=pycurl.Curl()
    c.setopt(c.URL,'http://captchabot.com/in.php')
    c.setopt(pycurl.POSTFIELDS,poststring)
    c.perform()
    
     
  14. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Code:
    self.filename = 'c.jpg'
    self.mimetype = 'image/jpeg
    
    data = [
        ('method', 'post'),
        ('key', self.agatekey),
        ('file"; filename="%s' % self.filename,
        (pycurl.FORM_CONTENTS, buff, pycurl.FORM_CONTENTTYPE, self.mimetype))
    ]
    
    self.curl.setopt(pycurl.URL, '%sin.php' % self.servaddr)
    self.curl.setopt(pycurl.POST, True)
    self.curl.setopt(pycurl.HTTPPOST, data)
    
     
  15. molologin

    molologin New Member

    Joined:
    2 Nov 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    И где ж ты был всё это время?
     
  16. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    в бане.