web-dev-qa-db-ja.com

コードサンプルのGmail APIエラー-「str」ではなく、バイトのようなオブジェクトが必要です

私が作成しているプログラムにGmail APIを組み込んでいますが、解決できない、またはオンラインで回答を見つけることができないというエラーが発生します。関連するコードとエラーを以下に示します。

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'
23
A. Monteiro

解決策を見つけ、この行を置き換えます:

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

と:

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

。encode()および。decode()メソッド呼び出しが追加されていることに注意してください。

まず、strオブジェクトはbytesオブジェクトにエンコードされます-base64.urlsafe_b64encode必要ですPython 3(Python 2)のstrオブジェクトと比較して)。

次に、base64エンコードされたbytesオブジェクトをデコードしてstrに戻す必要があります。 googleapiclientライブラリはコードの後半でjson serializeを試行するため、これは必要であり、bytesオブジェクトでは不可能です。

46
James Cooper