2017-04-11 10 views
5

私が作成しているプログラムにGmail APIを組み込みました。私はオンラインでの回答を見つけることができなかったことを解決することができました。関連するコードは、エラー並びに、以下である:コードサンプルからのGmail APIエラー - 'str'ではなくバイトのようなオブジェクトが必要です

from apiclient import discovery 
from httplib2 import Http 
from oauth2client import file, client, tools 
import base64 
from email.mime.audio import MIMEAudio 
from email.mime.base import MIMEBase 
from email.mime.image import MIMEImage 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
import mimetypes 
import os 

def create_message(sender, to, subject, message_text): 

    message = MIMEText(message_text) 
    message['to'] = to 
    message['from'] = sender 
    message['subject'] = subject 

    return {'raw': base64.urlsafe_b64encode(message.as_string())} 

def send_message(service, user_id, message): 

    message = (service.users().messages().send(userId=user_id, body=message).execute()) 
    print('Message Id: %s' % message['id']) 
    return message 

def send_email(orders): 
    SCOPES = 'https://mail.google.com/' 
    store = file.Storage('gmail.json') 
    creds = store.get() 
    if not creds or creds.invalid: 
     flow = client.flow_from_clientsecrets('client_secret.json', SCOPES) 
     creds = tools.run_flow(flow, store) 
    service = discovery.build('gmail','v1',http=creds.authorize(Http())) 

    message_text = orders[0] 

    created_message = create_message('from','to','subject', message_text) 
    send_message(service, 'from', created_message) 
send_email(['TEST']) 


Traceback (most recent call last): 
    File "test_email.py", line 50, in <module> 
    schoolPing(['TEST']) 
    File "test_email.py", line 47, in schoolPing 
    created_message = create_message('from','to','subject', message_text) 
    File "test_email.py", line 27, in create_message 
    return {'raw': base64.urlsafe_b64encode(message.as_string())} 
    File "/Users/Andre/anaconda/lib/python3.5/base64.py", line 119, in urlsafe_b64encode 
    return b64encode(s).translate(_urlsafe_encode_translation) 
    File "/Users/Andre/anaconda/lib/python3.5/base64.py", line 59, in b64encode 
    encoded = binascii.b2a_base64(s)[:-1] 
TypeError: a bytes-like object is required, not 'str' 
+0

同じエラーが発生しています。 Python 3の問題と思われます。 – fatman13

答えて

4

は解決策を見つけ、この行交換:で

return {'raw': base64.urlsafe_b64encode(message.as_string())} 

を:

return {'raw': base64.urlsafe_b64encode(message.as_string().encode()).decode()} 

注意が(.encodeを添加しました)および.decode()メソッド呼び出し。

まず、STRオブジェクトがバイトオブジェクトに符号化される -は、Python 3でそれを必要とbase64.urlsafe_b64encode(STRパイソン2オブジェクトと比較して)。

そして、Base64エンコードバイト目的は、STRに戻す復号化されなければなりません。これは、googleapiclientライブラリが試みますjsonは後でコードでをシリアル化しようとし、それはバイトオブジェクトでは不可能です。

関連する問題