teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

追記

2020/05/11 09:14

投稿

zzzTKG
zzzTKG

スコア7

title CHANGED
File without changes
body CHANGED
@@ -118,4 +118,82 @@
118
118
  ### 試したこと
119
119
  エラーを吐く前はメールを送るとBotが起動し,正常な処理を行います.エラーを吐いてからメールを送ると起動せず,既読もつかなかったため,MailCheck()自体が動いてないようです.
120
120
  ### 環境
121
- MacBook AirにBootCampで導入したWindows10 HomeにおいてPython 3.8.2をコマンドプロンプトからstart /b cmd /c ImapMail.pyにより実行しています.
121
+ MacBook AirにBootCampで導入したWindows10 HomeにおいてPython 3.8.2をコマンドプロンプトからstart /b cmd /c ImapMail.pyにより実行しています.
122
+
123
+ ### 追記
124
+ 御意見を受けまして,コードに修正を加えてみました.エラーが出てこないかどうかを確認するため現在試験的に実行し,放置しています.
125
+ 1.再帰的に呼び出されないよう,TakagisanBot.py側にチェック処理を入れ,チェックの結果を基にTakagisanBot.pyがTakagisan()を実行するという形にしました.
126
+ 2.ログインが重複しないよう,TakagisanBot.pyからimportさせることでログイン処理を一回のみの実行にしています.
127
+ 3.5秒のループが短いのではということですが,このプログラムの目的がメールでサクッとbotを起動させることなのでなるべく短い間隔でチェックを行いたいため,現段階では5秒で保持しています.
128
+ これはマズイなど,修正したことで問題が発生していましたらご指摘いただければと思います.
129
+ ```python
130
+ #TakagisanBot.py
131
+ import discord
132
+ import random
133
+ import Dice #自作
134
+ import ResDice #自作
135
+ import re
136
+ import jaconv
137
+ import sys
138
+ import ImapMail #自作
139
+ import time
140
+ from datetime import datetime
141
+
142
+ client = discord.Client()
143
+
144
+ def NOW():
145
+ print(datetime.now())
146
+
147
+ def Takagisan():#bot起動&それ以降の処理
148
+ @client.event
149
+ async def on_ready():
150
+ NOW()
151
+ print("準備おっけー!")
152
+ print(client.user.name)
153
+ print(client.user.id)
154
+ print("で入るよ~.")
155
+
156
+ sidlist=[]
157
+
158
+ @client.event
159
+ async def on_message(message):
160
+ #bot処理
161
+ client.run('')#bot起動
162
+ while True:#チェック処理ループです
163
+ if ImapMail.Check():
164
+ Takagisan()
165
+ elif ImapMail.Check() is None:
166
+ pass
167
+ else:
168
+ ImapMail.Check()
169
+ time.sleep(5)
170
+ ```
171
+
172
+ ```python
173
+ #ImapMail.py
174
+ import imaplib,psutil
175
+
176
+ user = ''
177
+ password = ''
178
+ gmail = imaplib.IMAP4_SSL('imap.gmail.com')
179
+ gmail.login(user, password)
180
+ print('Run')
181
+
182
+ def MailCheck():
183
+ gmail.select('inbox')
184
+ action, [data] = gmail.search(None, 'UNSEEN')
185
+ for num in data.split():
186
+ gmail.store(num, '+FLAGS', r'\SEEN')
187
+ return True
188
+
189
+ def ProcessCheck(Program):
190
+ return Program in (p.name() for p in psutil.process_iter())
191
+
192
+ def Check():
193
+ if ProcessCheck('TakagisanBot.py'):
194
+ return None
195
+ elif MailCheck():
196
+ return True
197
+ else:
198
+ return False
199
+ ```