2013-07-08 3 views
4

Я пытаюсь добавить вложение к моей временной шкале с помощью многострочной кодировки. Я делал что-то вроде следующего:Многостраничный запрос POST Google Glass

req = urllib2.Request(url,data={body}, header={header}) 
resp = urllib2.urlopen(req).read() 

И он отлично работает для применения/json. Тем не менее, я не уверен, как отформатировать тело для multipart. Я также использовал некоторые библиотеки: запросы и плакат, и они оба возвращают 401 по какой-то причине.

Как сделать многостраничный запрос либо с libary (желательно подключаемый модуль к urllib2), либо с самим urllib2 (например, блок кода выше)?

EDIT: Я также хотел бы, чтобы быть в состоянии поддерживать зеркальную API «видео/vnd.google-glass.stream-URL» от https://developers.google.com/glass/timeline

Для запроса с использованием библиотеки плакат здесь код:

register_openers() 
datagen, headers = multipart_encode({'image1':open('555.jpg', 'rb')}) 

Здесь используется requets:

headers = {'Authorization' : 'Bearer %s' % access_token} 
files = {'file': open('555.jpg', 'rb')} 
r = requests.post(timeline_url,files=files, headers=headers) 

возврат 401 -> заголовка

Спасибо

+1

401 - это ошибка авторизации. Можете ли вы опубликовать код, который вы использовали для запросов и/или плакатов, которые дали 401? Мне интересно, если вы подключили токен аутентификации. –

+0

Очень верно, я об этом не думал. Как я могу привязать access_token к одному? – Clocker

+0

Есть ли причина не использовать клиентскую библиотеку Python? У нас есть несколько [пример кода] (https://developers.google.com/glass/v1/reference/timeline/insert), показывающий, как вставить элемент временной шкалы с вложением. – Alain

ответ

0

Вот как я это сделал и как это делает клиентская библиотека python.

from email.mime.multipart import MIMEMultipart 
from email.mime.nonmultipart import MIMENonMultipart 
from email.mime.image import MIMEImage 

mime_root = MIMEMultipart('related', '===============xxxxxxxxxxxxx==') 
headers= {'Content-Type': 'multipart/related; ' 
      'boundary="%s"' % mime_root.get_boundary(), 
      'Authorization':'Bearer %s' % access_token} 
setattr(mime_root, '_write_headers', lambda self: None) 
#Create the metadata part of the MIME 
mime_text = MIMENonMultipart(*['application','json']) 
mime_text.set_payload("{'text':'waddup doe!'}") 
print "Attaching the json" 
mime_root.attach(mime_text) 

if method == 'Image': 
    #DO Image 
    file_upload = open('555.jpg', 'rb') 
    mime_image = MIMENonMultipart(*['image', 'jpeg']) 
    #add the required header 
    mime_image['Content-Transfer-Encoding'] = 'binary' 
    #read the file as binary 
    mime_image.set_payload(file_upload.read()) 
    print "attaching the jpeg" 
    mime_root.attach(mime_image) 

elif method == 'Video': 
    mime_video = MIMENonMultipart(*['video', 'vnd.google-glass.stream-url']) 
    #add the payload 
    mime_video.set_payload('https://dl.dropboxusercontent.com/u/6562706/sweetie-wobbly-cat-720p.mp4') 
    mime_root.attach(mime_video) 

Mark Scheel Я использовал ваше видео для тестирования :) Спасибо.

1

Существует рабочая Curl пример составного запроса, который использует потоковое функцию URL видео здесь:

Previous Streaming Video Answer with Curl example

Он делает именно то, что вы пытаетесь сделать, но с Curl. Вам просто нужно адаптировать это к вашему стеку технологий.

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

Последнее примечание, вам не нужно urllib2, команда API зеркала отбросила жемчужину функции на нашем круге, и нам не нужно беспокоиться о получении двоичного файла видео, проверьте этот пример, связанный выше I только предоставил URL-адрес в многостраничной полезной нагрузке, не нужно передавать двоичные данные! Google делает все волшебство в XE6 и выше для нас.

Спасибо Team Glass!

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

Удачи вам!

+0

, что команда curl из этой ссылки не работает. – Clocker

+0

Он делает для меня весь путь к просмотру потокового видео на Glass. Мое единственное предположение - вы получили ошибку 401, что означает, что ваш токен-носитель плох. Убедитесь, что вы ввели действительный токен авторизации. –

+0

команда возвращает HTTP 400 – Clocker

1

Как добавить вложение в сроки с многочастным кодированием:

Самым простым способом добавить вложения с многочастным кодированием на таймлайн использовать Google APIs Client Library for Python.С помощью этой библиотеки вы можете просто использовать следующий пример кода, представленный в Mirror API timeline insert documentation (щелкните вкладку Python в разделе Примеры).

from apiclient.discovery import build 
service = build('mirror', 'v1') 

def insert_timeline_item(service, text, content_type=None, attachment=None, 
         notification_level=None): 
    timeline_item = {'text': text} 
    media_body = None 
    if notification_level: 
    timeline_item['notification'] = {'level': notification_level} 
    if content_type and attachment: 
    media_body = MediaIoBaseUpload(
     io.BytesIO(attachment), mimetype=content_type, resumable=True) 
    try: 
    return service.timeline().insert(
     body=timeline_item, media_body=media_body).execute() 
    except errors.HttpError, error: 
    print 'An error occurred: %s' % error 

Вы не можете использовать requests или poster для автоматического кодирования данных, поскольку эти библиотеки кодируют вещи в multipart/form-data в то время как зеркало API хочет вещи в multipart/related.


Как отлаживать текущий код ошибки:

Ваш код дает 401, который является ошибка авторизации. Это означает, что вы, вероятно, не включаете свой токен доступа с вашими запросами. Чтобы включить токен доступа, введите Authorization в поле Bearer: YOUR_ACCESS_TOKEN в ваш запрос (документация here).

Если вы не знаете, как получить токен доступа, в документах разработчика Glass есть page here, объясняющих, как получить токен доступа. Убедитесь, что ваш процесс авторизации запросил следующую возможность для multipart-upload, иначе вы получите ошибку 403. https://www.googleapis.com/auth/glass.timeline

+0

То же самое можно сделать с помощью библиотеки MIMEMultipart, включенной в python. Как и в исходном коде https://code.google.com/p/google-api-python-client/source/browse/apiclient/discovery.py#685 – Clocker

Смежные вопросы