def add_file(self, fieldname, filename, fileHandle, mimetype=None): body = fileHandle.read() if mimetype is None: mimetype = mimetypes.guess_type(filename)[0] or 'application/ octet-stream' self.files.append((fieldname, filename, mimetype, body))
def __str__(self): parts = [] part_boundary = '--' + self.boundary # Add the form fields parts.extend( [ [part_boundary, 'Content-Disposition: form-data; name="%s"' % name, '', value] for name, value in self.form_fields ] ) # Add the files to upload parts.extend( [ [ part_boundary, 'Content-Disposition: form-data; name="%s"; filename="%s"' % (field_name, filename), 'Content-Type: %s' % content_type, '', body ] for field_name, filename, content_type, body in self.files ] ) flattened = reduce(lambda a, b: a.extend(b) or a, parts, []) flattened.append('--' + self.boundary + '--') flattened.append('') return '\r\n'.join(flattened)
"""Пример отправки сообщения в лс на сайте dimonvideo.ru с прикрепленными файлами"""
site = 'https://dimonvideo.ru/' login, password = 'dimy44', '***' # объявить свои). cookie = None # либо свои куки.
def set_cookie(): """авторизация и получение cookie, если их нет""" global cookie post = urllib.urlencode( { 'login_name': login, 'login_password': password, 'login': 'submit', 'auth': '1' } ) try: coo = urllib.urlopen(site, post).info()['Set-Cookie'].split() except: # при неудачном соединении. return # парсим куки, извлекая нужное lst = [i for i in coo if i.startswith('dv_password') or i.startswith('dv_user_id')] if len(lst) < 2: return 0 # если авторизация не прошла. cookie = ' '.join(lst) return 1
def sendpage(link, params, files=None): if not cookie: # если cookie не определены. coo = set_cookie() # то авторизуемся. if not coo: return coo form = MultiPartForm() for name, value in params: form.add_field(name, value) if files: n = 1 for f in files: form.add_file('file%s' % n, os.path.split(f)[1], fileHandle=open(f, 'rb')) n += 1 request = urllib2.Request(link) request.add_header('Cookie', cookie) body = str(form) request.add_header('Content-type', form.get_content_type()) request.add_header('Content- length', str(len(body))) request.add_data(body) try: return urllib2.urlopen(request).read() except Exception, e: # сохр. текст ошибки open('D:\\error_log_func_sendpage.txt', 'wb').write(str(e))
# отправка:
params = [ ('to', 'dimy44'), # кому ('subj', 'test'), # тема сообщения, необязат. ('a', '8'), ('comments', 'текст сообщения блаблабла'.decode("utf-8").encode("windows-1251")), ('otchet', '0'), # придет ли отчет о прочтении ('outboxcopy', '0'), # сохранять ли в отправленных # ('id', '1559551412'), # на какое сообщение ответ, необязательно ('com', '2'), # приоритет обычный ('quot', '0'), # не цитировать ('submit', 'ok') ] # файлы: files = [ 'e://2.jpg', 'e://default.zip' ] page = sendpage(site+'pm/8/0', params, files) if page is None: print 'Ошибка соединения' elif page == 0: print 'Ошибка авторизации' else: page = page.split('<h4') if len(page) < 2: print '???' else: print page[1].split('>')[1].split('</h')[0].decode("utf8")