如何解决如何使用带有 discord.py 的 gmail API 每分钟在聊天中将 10 封最近未读的电子邮件作为单独的消息发送?
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import base64
import time
# If modifying these scopes,delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.modify']
def main():
"""Shows basic usage of the Gmail API.
Lists the user's Gmail labels.
"""
creds = None
# The file token.pickle stores the user's access and refresh tokens,and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle','rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available,let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json',SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle','wb') as token:
pickle.dump(creds,token)
service = build('gmail','v1',credentials=creds)
# Call the Gmail API
repeat = 0
while repeat <= 10:
labelName = "READ-BY-SCRIPT"
LABEL_ID = 'Label_8507504117657095973'
results = service.users().messages().list(
userId='me',q="-label:"+labelName,maxResults=1).execute()
messages = results.get('messages',[])
body = []
if not messages:
repeat += 10
time.sleep(60)
else:
for message in messages:
msg = service.users().messages().get(
userId='me',id=message['id']).execute()
labels = msg['labelIds']
if "INBOX" in labels:
body.append(msg['payload']['parts'])
body = base64.urlsafe_b64decode(
body[0][0]['body']['data'])
body = str(body)
if 'b"\\r\\nHi MOHAMMAD,\\r\\n' or "b'\\r\\nHi MOHAMMAD,\\r\\n" in body:
if 'posted a new assignment in IX K \\r\\n<https://classroom.google.com/c/MTEyNDMxODgyMTE0>.' in body:
body = body.replace(
"\\r\\nIf you don\\'t want to receive emails from Classroom,you can unsubscribe \\r\\n<https://classroom.google.com/s>.\\r\\n\\r\\nGoogle LLC\\r\\n1600 Amphitheatre Pkwy\\r\\nMountain View,CA 94043 USA\\r\\n'","")
body = body.replace("b\"","").replace("b'","").replace('"','').replace(" ",' ').replace(
" ",' ').replace(" \\n<https://classroom.google.com/c/MTEyNDMxODgyMTE0>","").replace("\\n","\\n\\n")
body = body.replace("\\r\\n\\nHi MOHAMMAD,\\r\\n\\n","").replace(" \\r\\n\\n<https://classroom.google.com/c/MTEyNDMxODgyMTE0>.\\r\\n","").replace(
"\\r\\n\\nIf you don't want to receive emails from Classroom,you can unsubscribe \\r\\n\\n<https://classroom.google.com/s>.\\r\\n\\n\\r\\n\\nGoogle LLC\\r\\n\\n1600 Amphitheatre Pkwy\\r\\n\\nMountain View,CA 94043 USA\\r\\n\\n","")
body = body.replace("\\r","\r").replace(
"\\n","\n").replace("\n\n","\n").replace("\\\\","\\")
body = body.replace("\\xe2","").replace(
"\\x80","").replace("\\x99","").replace("\\x98","")
body = body.replace(
"\\r\\nIf you don\\'t want to receive emails from Classroom,"")
body = body.replace("\\'",you can unsubscribe","")
body = body.replace(
"If you dont want to receive emails from Classroom,you can unsubscribe\n <https://classroom.google.com/s>.\nGoogle LLC\n1600 Amphitheatre Pkwy\nMountain View,CA 94043 USA\n","")
TEACHER_NAME = body.split("posted",1)[0]
body = body.replace(TEACHER_NAME,"")
LINK = str(body.split("\r\nOPEN \r\n<",1)[1])
LINK = LINK[:-1]
body = body.replace(LINK,"").replace("<","").replace(">","").replace(
'posted a new assignment in IX K\n\r\n',"").replace("\r\nOPEN \r\n","")
if 'Due: ' in body:
body = body.replace("\n"," ",1)
DATE = body.split(' ')[0]
body = body.split(' ')[1]
else:
body = body
DATE = 'No Due Date Provided'
print(TEACHER_NAME)
print("")
print(LINK)
print("")
print(DATE)
print("")
print(body)
service.users().messages().modify(userId='me',id=message['id'],body={
'addLabelIds': ['Label_8507504117657095973']}).execute()
repeat += 1
else:
service.users().messages().modify(userId='me',body={
'addLabelIds': [LABEL_ID]}).execute()
pass
else:
service.users().messages().modify(userId='me',body={
'addLabelIds': [LABEL_ID]}).execute()
pass
else:
service.users().messages().modify(userId='me',body={
'addLabelIds': ['Label_8507504117657095973']}).execute()
pass
if __name__ == '__main__':
main()
这是我的代码。它获取没有标签“按脚本阅读”的最新电子邮件,并检查它是否遵循谷歌教室的模板,然后获取数据(教师姓名 [TEACHER_NAME];作业链接 [LINK];截止日期)分配 [DATE]; 和分配的详细信息 [body]) 来自它并打印所述数据,然后再重复 9 次。如何使用 discord.py 获取此代码,在不和谐聊天中将所有这些作为消息打印出来。
解决方法
首先,您应该重写您的函数,以便它实际返回您的 gmail 中的内容,最好是不超过 2000 个字符的文本块(不和谐描述/消息的限制)。
然后您可以使用 tasks
定期执行某些操作,例如调用您的 main
函数
from discord.ext import commands,tasks
...
def main():
...
class Gmail(commands.Cog):
def __init__(self,bot):
self.bot = bot
self.logger.start()
def cog_unload(self):
self.logger.cancel()
@tasks.loop(minutes=10)
async def logger(self):
emails = main()
channel = self.bot.get_channel(your log channel ID (int))
for email in emails:
await channel.send(embed=discord.Embed(description=email))
def setup(bot):
bot.add_cog(Gmail(bot))
...
首先,您需要创建一个新文件,将其命名为 gmail.py
,您可以在其中使用上面的示例代码。
然后将其放入名为 cogs
的文件夹中。转到您的主文件,我假设为 bot.py
,然后调用 bot.load_extension('cogs.gmail')
加载齿轮。
由于我们在 Gmail.__init__
中开始任务,除了将主函数导入 gmail.py
或将其复制过来之外,您无需执行任何其他操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。