Вопрос скорее по Curl чем по Python, поэтому создаю новую тему. Пишу я бота, с привязкой к капчаботу, но суть в том, что после скачивания, например картинки рекапчи, она заносится в cStringIO, а вот как заставить curl отправить картинку из cStringIO пост запросом (Пока находил только методы с сохранением файла на диск, но не хочется так делать). Для тех кто не в курсе, cStringIO - по сути обычная строка.
Вы имеете ввиду составить весь запрос вручную? да, так и делал с 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) Не знаю
вот функции для генерации 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")) ])
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
Нет, не помогает, и не поможет, в документациии о чтении из строки вообще ничего не сказано, так что требую костыль
тут не проблема в чтении, файл оно читает из хендла нормально в этом коде. питон не хавает контент тайп почемуто
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) Ну может хоть кто-то знает выход?
А отправить что-то типа: 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) Тоже через курл нельзя?
Можно, этот тип данных называется multipart , опция курла CUSTOMREQUEST позволяет запихнуть любой параметр в заголовок через setopt. выставьте через setopt 'Content-type: multipart/form-data' в CUSTOMREQUEST и сгенерируйте данные модулем который я кидал в предыдущем посте.
Всё, сделал так, вроде работает. 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()
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)