こんにちは!
東京圏のとある微生物検査室で、毎日食品安全を担保するために仕事を頑張っています。
私のQiita初投稿
は検査室にある冷蔵冷凍庫のデータをAPI
で抽出して、ローコードツールMake
を使って、LINE Bot
に自動送信する仕組みを作成することです。詳細は以下の記事を参考してください~
これ実は、使えなかったです。なぜかというか、セキュリティ問題があります。具体的に言うと、社内の設備情報を個人LINEに流すのは問題があります。
そうですよね、考え不足です!(社内でデジタルを始める人あるある問題w)
ではなにしたら、使えるようになりますかね?少しIT部門の方と相談したら、「デジタルはもう慣れているようから、ローコードではなく、Python
で実現するようとしたらどうですか?」の意見を戴きました。
なるほど!その手もあります!なぜPython
がいいのか正直私も分からないですが、でもIT部門の方の意見なら信じます!もう一つ問題はプログラミング言語は難しい…短時間でできなさそうです。
そもそもPython
はなんですか?調べたら:
この時、去年の年末から、一気に流行り始めたChatGPT
は、会話だけではなく、コードを書いてもらうこともできる情報をもらって、ChatGPT
xPython
、初コーディングを挑戦します!
完成物
完成物のソースコード
import requests
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# リクエストヘッダとリクエストボディの設定
headers = {
'Content-Type': 'application/json',
'X-HTTP-Method-Override': 'GET'
}
data = {
"api-key": "73pfobnche8d1p6laqnemsbnpkght3bjv047oid6p2sg3",
"login-id": "tbzz9999",
"login-pass": "ppaasswwoorrdd"
}
# APIエンドポイントのURL
url = "https://api.webstorage.jp/v1/devices/current"
# POSTリクエストの送信
response = requests.post(url, json=data, headers=headers)
data = response.json()
# 特定の'name'のチャンネルの'value'を取得する関数
def get_channel_value(data, device_name, channel_num):
for device in data['devices']:
if device['name'] == device_name:
for channel in device['channel']:
if channel['num'] == channel_num:
return channel['value']
return None
# 例: 名前が 'AAAA' のデバイスのチャンネル番号 '1' の値を取得
name_to_search = 'AAAA'
channel_num_to_search = '1'
value = get_channel_value(data, name_to_search, channel_num_to_search)
value = float(value)
if value < 24 or value > 26:
# 送信元と宛先のメールアドレス
sender_email = "A@A.com"
receiver_email = "B@B.com"
smtp_server = "smtp-mail.outlook.com"
smtp_port = 587
# 送信元のメールアドレスとパスワード
username = "A@A.com"
password = "password"
# メールの内容を設定
subject = "温度警報"
body = f"ALARM WARMING The value for device {name_to_search} is out of range: {value:.1f}°C"
msg = MIMEMultipart()
msg["From"] = sender_email
msg["To"] = receiver_email
msg["Subject"] = subject
msg.attach(MIMEText(body, "plain"))
# SMTPサーバーへの接続とメールの送信
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(username, password)
server.sendmail(sender_email, receiver_email, msg.as_string())
print("メールが送信されました。")
except Exception as e:
print("エラーが発生しました:", e)
finally:
if 'server' in locals():
server.quit()
else:
print(f"Channel {channel_num_to_search} value not found for device {name_to_search}")
使用ツール
手順
0.5 コーディング初心者はまず環境を整う!
コーディングするため、何かしらソフトをダウンロード必要ですね…でも具体的に何がいいのか分からなくって、とりあえず気軽くChatGPT
に聞いてみよう!
なるほど、ダウンロードしてみます!
Python
は現時点3.11は最新バージョンで、とりあえずこれにします。コードエディタはどっちでも良さそう…Visual Studio Code
にしましょう!
IDE
を起動して…え?何したらいいですか?もう一回ChatGPT
に聞きます!
うむ、拡張機能をダウンロードして…コードを書き込んで…実行!
おお!反応してます!
ChatGPT
の方は「少しずつコードを書いてみると良いでしょう。」で言ってますけど、今回は勉強ではなく、ChatGPT
を使って書くので、いきなり実戦に突入します!
1 初心者はいきなりどこまでできるのか?!
即実戦…少し不安ですね。とりあえず問題を入力しましょう。
セキュリティも考慮して、今回はAPI
ガイドの例を利用して問題します。
codeは折りたたみします!
import requests
# リクエストヘッダとリクエストボディの設定
headers = {
'Content-Type': 'application/json',
'X-HTTP-Method-Override': 'GET'
}
data = {
"api-key": "73pfobnche8d1p6laqnemsbnpkght3bjv047oid6p2sg3",
"login-id": "tbzz9999",
"login-pass": "ppaasswwoorrdd"
}
# APIエンドポイントのURL
url = "https://api.webstorage.jp/v1/devices/current"
# POSTリクエストの送信
response = requests.post(url, json=data, headers=headers)
# レスポンスの表示
if response.status_code == 200:
# レスポンスが成功の場合、データを表示
print(response.json())
else:
print(f"Request failed with status code: {response.status_code}")
print(response.text)
分からないですが…いきなり行けそうの感じですね。
まずはrequests
ライブラリをダウンロードすることが必要ですが、これは何でしょう?少し調べます!
ホントかどうか少し心配で…ネット記事も調べました!
なるほど、便利ツールの感じですね。ではインストールして、コードを貼り付け作業をやります。
作業を完了して、ドキドキ初めて実行したら:
見にくいですが…これはJSON
データの返事が来てます。 いきなり成功?!
2 謎のデータの海から特定のデータを引き出す!
この謎のデータの海から必要の情報を探すのは…人は無理です!
問答無用!もうどんどんChatGPT
に問題を投げます!
特定のデータを出すために、どんなコードがいいのかを聞いたら:
# 特定の'name'のチャンネルの'value'を取得する関数
def get_channel_value(data, device_name, channel_num):
for device in data['devices']:
if device['name'] == device_name:
for channel in device['channel']:
if channel['num'] == channel_num:
return channel['value']
return None
# 例: 名前が 'AAA' のデバイスのチャンネル番号 '1' の値を取得
name_to_search = 'AAA'
channel_num_to_search = '1'
value = get_channel_value(data, name_to_search, channel_num_to_search)
if value is not None:
print(f"The value for channel {channel_num_to_search} of device {name_to_search} is {value}")
else:
print(f"Channel {channel_num_to_search} value not found for device {name_to_search}")
これと前のコードを結合して、実行したら:
うまく行けましたね!
3 ビジネスはやっぱりメール?
前回の記事は最後LINE Bot
にデータを送りますが、個人LINEにはセキュリティ問題がありますので、ビジネスでやっぱりメールは王道ですね。
ChatGPT
に聞いてみましょう!
コードは折りたたみします
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 送信元と宛先のメールアドレス
sender_email = "your_email@gmail.com"
receiver_email = "recipient_email@example.com"
# GmailのSMTPサーバーとポート
smtp_server = "smtp.gmail.com"
smtp_port = 587
# 送信元のメールアドレスとパスワード
username = "your_email@gmail.com"
password = "your_password"
# メールの内容を設定
subject = "テストメール"
body = "これはPythonから送信されたテストメールです。"
msg = MIMEMultipart()
msg["From"] = sender_email
msg["To"] = receiver_email
msg["Subject"] = subject
msg.attach(MIMEText(body, "plain"))
# SMTPサーバーへの接続とメールの送信
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(username, password)
server.sendmail(sender_email, receiver_email, msg.as_string())
print("メールが送信されました。")
except Exception as e:
print("エラーが発生しました:", e)
finally:
server.quit()
まずはimport smtplib
が必要ですね。
pip install smtplib
...なんかエラーが発生しました!
ChatGPT
で調べたら、smtplib
は標準ライブラリのため、インストールことは要らないです。だからChatGPT
には書いていないですね…
次に気になるのは、Gmail
のセキュリティ設定で「安全性の低いアプリのアクセスを有効にしておく必要があります。これにより、Python
スクリプトからGmail
アカウントへのアクセスが可能になりますが、セキュリティ上の理由から注意が必要です。」
セキュリティですね…でもここまで来たから、やってみようか…と思いまして、Google
の設定を探したら、そんな設定ないです!Google
のドキュメントに確認したら:
ですが、ChatGPT
は2021年9月までのデータで学習しているため、この件について知らないです!!
こんな盲点もあります…
強引で試してみたら:
普通にダメですね(笑)
社内メールを利用するの手もあるんですが、SMTPサーバー
が必要です。 会社のIT部門に確認が必要ですが、今はまさにお盆です 。これは、休暇が終わるまで諦めるしかないですね
お盆でたまたまIT部門の方出社しました!SMTPサーバー
のhost
とport
をもらって、これが行けると思いましたが、結局エラーが発生しました。
もう何が言っているのが分からないから、とりあえずエラーコードまるごとChatGPT
に投げました。
コードは折りたたみします
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 他のコード部分...
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(username, password)
server.sendmail(sender_email, receiver_email, msg.as_string())
print("メールが送信されました。")
except Exception as e:
print("エラーが発生しました:", e)
finally:
if 'server' in locals():
server.quit()
まさか修正案を提案してくれました!ChatGPT
!偉い!
でもこのコードを入れ替えても、結局エラーが発生しました。
今回のエラーは:
ChatGPT
先生に聞いたら:
会社のSMTPサーバー
もセキュリティの関係でダメのことですかね…
おそらく何かの設定したら、行けるはずが、これはまたIT部門の方に確認必要ですね。
でもIT部門の方は二十日まで長休になりました…あとで確認します。
もうここまで来てるから!メールぐらいみたいです!メールは送信さえ成功したら、あとはサーバに合わせて、設定を変えるだけです。
昔使ったメールアドレスを探したら、まだ学生の時で使ってたMSN message
のliveメール
を見つかりました。
マイクロソフト経由で、セキュリティは厳しいはずですね…でも試しましょう!
その結果:
え?成功しました?!マイクロソフト大丈夫ですかねwww
メールの方に確認したら:
完全に成功です!
メール送信テストがうまくいきましたから、これと前の特定温度データの抽出と結合して、エラーを発生する時のみメールを送信する仕組みにします!
二つの修正をしました。一つは、送信の条件はvalue
があることだけから、value
はある一定の範囲から外すことに修正しました。例えば0℃の冷蔵庫は1℃から-1℃の範囲内外れたら、エラーメールが送信します。
もうひとつは送信body
にエラーメッセージを書きました。それそれは下のコードのようです。
# if value is not None:
if value < 24 or value > 26:
# body = "これはPythonから送信されたテストメールです。"
body = f"ALARM WARMING The value for device {name_to_search} is out of range: {value:.1f}°C"
修正下コードを実行、エラーですねwww
エラーコードは:
ChatGPT
先生ー、答えでー
なるほど、先生のコードも少し修正案を提案されました。
これ以上エラーないですよね…実行してみます!
やっと成功しました!
4 自動実現の件
私は以前Power Automate
の自動実行のため、Task Scheduler
を使ったことがあります。
Python
をWindows
の環境で実行するなら、少し修正だけで、記事と同じ方法で行けます!
宿題ではないですけど、この部分は残します~
当然、もしうまく行けなかったら、ChatGPT
先生は いつでも 、質問を待っています!
これからは何をする?
Python
x ChatGPT
大成功ですね!
ですが、社内の意見を伺ったら、いくつがあります。
①警報より、温度計関係の点検を自動化したいです(点検を簡単に言うと、今は毎日2回紙ベースで数字を記録します。具体的な話は今後の記事にします。)
②Pythonなら、社内のLinuxサーバーにしない?(IT部門の先輩より、新しい挑戦ですね!)
どっちでも今作ったものより難しいですね!でも、今なら私は楽しく受けます!なぜなら、分からなかったら、ChatGPT
先生がいます!
今回はさっさとコードを書いて、うまく実行しました。もし自分で勉強するなら、 一ヶ月でもこんなもの書けないと思います。ですが、それは全部ChatGPT
に任せる意味ではないです。逆に言うと、分からないところがあったら、全部ChatGPT
先生に聞いて、最後自分でも自立で書けるようになるのは、理想と思います。これはきっと、今までない新しい勉強法になります。
また、一部の知識は、ChatGPT
に聞くより、ネットの記事を探したり、ある程度理解度があったら、直接ドキュメントに確認する方が早いこともあります。ChatGPT
は万能ではないし、少なくとも2021年以後のことは知らないですwww
以上、コードたくさんですけど、ノーコード記事です!(笑)