Вывод ответа #1865041235

-

Ноу хау - от мастеров на заметку

Небольшие рецепты полезных решений

{autor_name}


{text_rank}
репутация: {repa}
{registration_date}
сообщений: {posts}
{tel_link}
#{postnumber_id}

дабы оживить тему. Часа три бился над тем, как прикрепить файлы на этом сайте, вот что из этого получилось. Пример отправки сообщения в лс юзеру

# -*- coding: utf-8 -*-
import time
import os
import socket
import random
import urllib
import urllib2
import mimetypes
"""здесь небольшое дополнение. У меня import mimetypes
выдавал ошибку, нет модуля posixpath, поэтому строку import posixpath
я заменил на
try:
import posixpath
except ImportError:
class posixpath(object):
def splitext(url):
index_sep = url.rfind('.')
if index_sep == -1: return (url, '')
return (url[:index_sep], url[index_sep:])
splitext = staticmethod(splitext)

"""

_prefix = None
def choose_boundary():
""" разделитель секций для хтмл запроса"""
global _prefix
if _prefix is None:
hostid = socket.gethostbyname(socket.gethostname())
try: uid = `os.getuid()`
except: uid = '1'
try: pid = `os.getpid()`
except: pid = '1'
_prefix = hostid + '.' + uid + '.' + pid
timestamp = '%.3f' % time.time()
seed = `random.randint(0, 32767)`
return _prefix + '.' + timestamp + '.' + seed


class MultiPartForm(object):
"""Форма хтмл запроса"""

def __init__(self):
self.form_fields = []
self.files = []
self.boundary = choose_boundary()

def get_content_type(self):
return 'multipart/form-data; boundary=%s' % self.boundary

def add_field(self, name, value):
self.form_fields.append((name, value))

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")

# result:
>>>
Сообщение отправлено.
>>>


ответ опубликован:
Рейтинг: 5
голосов: 2



Яндекс.Метрика