【发布时间】:2015-08-24 21:56:57
【问题描述】:
我一直在尝试配置我的 conky 以显示我的 Gmail 帐户中未读邮件的详细信息。我终于想出了一个 python 脚本来完成这个任务。它使用我从谷歌开发者控制台下载的client_secret.json 文件。这是代码
from datetime import datetime
import os
from apiclient import errors
from apiclient.discovery import build
from httplib2 import Http
import oauth2client
from oauth2client import client
from oauth2client import tools
"""Get a list of Messages from the user's mailbox.
"""
try:
import argparse
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
flags = None
SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Gmail Notifier'
def get_credentials():
"""Gets valid user credentials from storage.
If nothing has been stored, or if the stored credentials are invalid,
the OAuth2 flow is completed to obtain the new credentials.
Returns:
Credentials, the obtained credential.
"""
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir, 'gmail-notifier.json')
store = oauth2client.file.Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatability with Python 2.6
credentials = tools.run(flow, store)
print 'Storing credentials to ' + credential_path
return credentials
def ListMessagesMatchingQuery(service, user_id, query=''):
"""List all Messages of the user's mailbox matching the query.
Args:
service: Authorized Gmail API service instance.
user_id: User's email address. The special value "me"
can be used to indicate the authenticated user.
query: String used to filter messages returned.
Eg.- 'from:user@some_domain.com' for Messages from a particular sender.
Returns:
List of Messages that match the criteria of the query. Note that the
returned list contains Message IDs, you must use get with the
appropriate ID to get the details of a Message.
"""
try:
response = service.users().messages().list(userId=user_id, q=query).execute()
messages = []
if 'messages' in response:
messages.extend(response['messages'])
while 'nextPageToken' in response:
page_token = response['nextPageToken']
response = service.users().messages().list(userId=user_id, q=query, pageToken=page_token).execute()
messages.extend(response['messages'])
return messages
except errors.HttpError, error:
print 'An error occurred: %s' % error
def ListMessagesWithLabels(service, user_id, label_ids=[]):
"""List all Messages of the user's mailbox with label_ids applied.
Args:
service: Authorized Gmail API service instance.
user_id: User's email address. The special value "me"
can be used to indicate the authenticated user.
label_ids: Only return Messages with these labelIds applied.
Returns:
List of Messages that have all required Labels applied. Note that the
returned list contains Message IDs, you must use get with the
appropriate id to get the details of a Message.
"""
try:
response = service.users().messages().list(userId=user_id, labelIds=label_ids).execute()
messages = []
if 'messages' in response:
messages.extend(response['messages'])
while 'nextPageToken' in response:
page_token = response['nextPageToken']
response = service.users().messages().list(userId=user_id, labelIds=label_ids, pageToken=page_token).execute()
messages.extend(response['messages'])
return messages
except errors.HttpError, error:
print 'An error occurred: %s' % error
def main():
credentials = get_credentials()
service = build('gmail', 'v1', http=credentials.authorize(Http()))
msgids = ListMessagesMatchingQuery(service, 'me', query='is:unread')
if (len(msgids)>0):
# Play notification sound
os.system('paplay /usr/share/sounds/freedesktop/stereo/complete.oga')
print "%s new message(s) in Inbox\n" % len(msgids)
for id in msgids:
message = service.users().messages().get(userId='me', id=id['id']).execute()
# Print Sender
headers = message['payload']['headers']
for i in range(len(headers)):
if headers[i]['name'] == "From":
sender = headers[i]['value'].replace('"', '')
sender = sender.split("<")
# get sender name, if no name then print email
if (sender[0].replace(" ", "") != ""):
print ">", sender[0]
else:
print ">", sender[1][:-1]
# Print Subject
for i in range(len(headers)):
if headers[i]['name'] == "Subject":
print "Sub: ", headers[i]['value']
print message['snippet']
print " "
else:
print "Yipeeee! No unread messages\n"
if __name__ == "__main__":
try:
main()
except:
print "Network unavailable :("
现在我想把它做成一个合适的应用程序,这样它就可以被共享,并且用户不需要去谷歌开发者控制台来获取.json文件。
- 我可以通过应用分发我的
.json吗?
如果是这样,那么我就完成了,如果不是那么
- 将此脚本制作成桌面应用程序的正确方法是什么?
我查看了开发者控制台中的各种选项,但不知道如何制作桌面应用程序。我对谷歌开发人员和 API 完全陌生,因此我们将不胜感激。
【问题讨论】: