Форум сайта python.su
В прошлый раз писал тему по пост-запросам, её проигнорировали.. Благо, очень долго разбирав код написал все-таки скрипт (не с нуля, сырцы чужие в нём присутствуют :))
import os
import urllib.request
import urllib.parse
import re
import codecs,http.client,random
import hashlib
import json
from xml.dom.minidom import parse, parseString
def login (mail, pas):
global vk
global cookie
res = urllib.request.urlopen('http://login.vk.com/?act=login&email='+mail+'&pass='+pas+'&expire=&vk=')
res= res.read().decode()
#print(res)
if re.search(' value=\'',res)!=None:
print(res)
s = re.search(r"name='s' value='(.*?)' \/>",res)
sid = s.group(1)
print(sid)
cookie = 'remixap=1; remixlang=0; remixchk=5; remixsid='+sid
vk = urllib.request.build_opener()
vk.addheaders = [('cookie', cookie)]
else:
cookie=0
return cookie
s=login('Тут было мыло','А тут пароль')#Авторизация
for i in os.listdir('E:\\Фильмы\\Dr.House Season I'):
print('E:\\Фильмы\\Dr.House Season I\\'+i)
data=open('E:\\Фильмы\\Dr.House Season I\\'+i,'rb').read().decode('latin-1')
print('0')
data='''
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="Filename"
trololo.avi
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="video_file"; filename="trololo.avi"
Content-Type: application/octet-stream
%s
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="video_file"
Submit Query
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6--
''' % (data)
api='1895617' #id приложения
secret = 'bszTIcIkzk' #secret key
#api='1967034'#id приложения
#secret = '0D4ajwn4STyFbCMZDSpA' #secret key
res = vk.open('http://vkontakte.ru/feed.php').read().decode('cp1251')
res = re.split('[\=,\,]+',res)
vid = res[1]#парсим id
print(vid)
sig=vid+'api_id='+api+'method=video.savev=2.0'+secret
sig=hashlib.md5(sig.encode()).hexdigest()
print('Get url to upload')
link='http://api.vkontakte.ru/api.php?api_id='+api+'&method=video.save&v=2.0&sig='+sig
res=vk.open(link).read().decode()#Получаем url для загрузки
#print(res)
dom1 = parseString(res)
print(res)
dom1=dom1.getElementsByTagName("upload_url")[0]
link=dom1.childNodes[0].data
print(link)
headers = {"Content-type": "multipart/form-data; boundary=----------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6","Accept": "text/*",'Cookie':s,"User-Agent": "Shockwave Flash"}
link=re.split('[\/]+',link)
print(link)
conn = http.client.HTTPConnection(link[1])
conn.request("POST", "/"+link[2], data, headers)
response = conn.getresponse()
c = response.msg
res=response.read().decode()#загружаем
print(res)
data.close()
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 54, in <module>
''' % (data)
MemoryError
Отредактировано (Сен. 29, 2010 11:19:02)
Офлайн
А вы по кусочкам. Целиком киношку зачитать - памяти не хватает.
Вместо conn.request('POST', …)
делайте
data = open(path_to_file, 'rb')
prefix = '''
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="Filename"
trololo.avii
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="video_file"; filename="trololo.avi"
Content-Type: application/octet-stream
'''
suffix = '''
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6
Content-Disposition: form-data; name="video_file"
Submit Query
------------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6--
'''
conn.putrequest('POST', url)
conn.putheader("Content-Type": "multipart/form-data")
conn.putheader(...) # по порядку проталкиваете все HTTP заголовки
# не забудьте Content-Length - его прийдется посчитать самому prefix + длина файла + suffix
conn.endheaders()
conn.sendall(prefix)
while True:
part = data.read(8192)
if part is None:
break
conn.sendall(part)
conn.sendall(suffix)
conn.getresponse()
Офлайн
С горем пополам дошел до момента conn.sendall(prefix)…
Выдало:
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 87, in <module>
conn.sendall(prefix)
AttributeError: 'HTTPConnection' object has no attribute 'sendall'
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 87, in <module>
conn.send(prefix)
File "C:\Python31\lib\http\client.py", line 758, in send
self.sock.sendall(str)
TypeError: must be bytes or buffer, not str
Отредактировано (Сен. 29, 2010 13:18:31)
Офлайн
Послушайте, boltayka, думайте все же иногда - это может оказаться приятным.
sendall действительно нет, я ошибся. .send отлично подойдет.
Если видите must be bytes or buffer, not str - возможно так оно и есть?
пишите s.encode('latin-1') чтобы превратить строку в последовательность байт. latin-1 - кодировка для вашего случая.
Офлайн
Ну, что поделать.. Я только учусь. Все вначале тупят)
Спасибо за помощь…
Хотя, видать, по кускам оно так или иначе не будет отправлять.
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 94, in <module>
conn.send(part)
File "C:\Python31\lib\http\client.py", line 758, in send
self.sock.sendall(str)
socket.error: [Errno 10053] Программа на вашем хост-компьютере разорвала установленное подключение
b''
b''
b''
b''
b''
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 94, in <module>
conn.send(part)
File "C:\Python31\lib\http\client.py", line 758, in send
self.sock.sendall(str)
socket.error: [Errno 10053] Программа на вашем хост-компьютере разорвала установленное подключение
vContent = io.BytesIO()
data = io.open('E:\\videos\\4ac509fbe9.flv','r+b',0)
#data = open('E:\\videos\\4ac509fbe9.flv', 'rb')
vContent = data.read()
vSplitContent = vContent.split()
print(vSplitContent[-1])
#Много неинтересного кода, который есть выше...
conn = http.client.HTTPConnection(link[1])
conn.putrequest('POST', link[2])
conn.putheader('Content-Type', 'multipart/form-data; boundary=----------ei4gL6ae0GI3ae0KM7ae0ae0ae0gL6')
conn.putheader('Accept', 'text/*')
conn.putheader('Cookie', s)
conn.putheader('User-Agent', "Shockwave Flash")
q = len(prefix)+len(data.read())+len(suffix)
conn.putheader('Content-Length', str(q).encode('latin-1'))
# не забудьте Content-Length - его прийдется посчитать самому prefix + длина файла + suffix
conn.endheaders()
conn.send(prefix.encode('latin-1'))
for part in vSplitContent:
conn.send(part)
print(part)
conn.send(suffix.encode('latin-1'))
conn.getresponse()
conn.close()
#...............
b'FLV\x01\x05\x00\x00\x00'
b'\x00\x00\x00\x00\x12\x00\x02\xfd\x00\x00\x00\x00\x00\x00\x00\x02\x00'
b'onMetaData\x08\x00\x00\x00\x1a\x00\x07creator\x02\x00\x06Vk.com\x00\x0fmetadatacreator\x02\x003Yet'
b'Another'
b'Metadata'
b'Injector'
b'for'
b'FLV'
b'-'
b'Version'
b'1.4\x00'
b'hasKeyframes\x01\x01\x00\x08hasVideo\x01\x01\x00\x08hasAudio\x01\x01\x00'
b'hasMetadata\x01\x01\x00'
b'canSeekToEnd\x01\x00\x00\x08duration\x00@\x1f\\(\xf5\xc2\x8f\\\x00\x08datasize\x00A\x1a\xac'
Traceback (most recent call last):
File "C:\Python31\vkontakte\work.py", line 94, in <module>
conn.send(part)
File "C:\Python31\lib\http\client.py", line 758, in send
self.sock.sendall(str)
socket.error: [Errno 10053] Программа на вашем хост-компьютере разорвала установленное подключение
Офлайн
io.BytesIO - штука хорошая, но избыточная. Давайте без нее как-нибудь.
Первое. Длина передаваемого файла определяется как
os.fstat(data.fileno()).st_size
А вы пытались вычитать содержимое файла. Потом, конечно, цикл с send у вас не заработал - если файл прочитан до конца, то с него уже ничего не выжать.
Второе. Еще раз смотрим на передачу контента файла
while True:
part = data.read(8192) # читать 8Кб
if not part: # пустой объект означает, что достигнут конец файла
break
conn.send(part) # пока есть что переслать - посылаем
Офлайн
Дык в этом во всем я разобрался и так (ну, кроме длины файла.. Тут не знал)
проблема то в первую очередь из-за:
socket.error: [Errno 10053] Программа на вашем хост-компьютере разорвала установленное подключение
Офлайн
А, мне подскажет кто-нибудь?
Проблема аналогичная с разницей в том, что нужно создать картинку весом в 1.5 кило , используя cairo, вызывая функцию из блендера.
Отдельно функция запускается без проблем:
import cairo surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, 640, 640) cr = cairo.Context(surface) pathSave="/home/leonid/test.png" surface.write_to_png("%s"%pathSave)
class TextureCairoCreate(Operator): bl_idname = "tex.cairo_create" bl_label = "Create image" def execute(self, context): tex=context.texture surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, tex.pov.cr_image_width, tex.pov.cr_image_height) cr = cairo.Context(surface) pathSave=tex.pov.cr_path_save surface.write_to_png("%s"%pathSave) return {'FINISHED'}
Офлайн