13
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

100万人に伝えたい!失敗を乗り超えた話を共有しよう

「輪廻転生!訳ありローコードツールをPythonで再実現」社内冷蔵冷凍庫監視システムの作成 第二回

Last updated at Posted at 2023-08-16

こんにちは!
東京圏のとある微生物検査室で、毎日食品安全を担保するために仕事を頑張っています。

私のQiita初投稿は検査室にある冷蔵冷凍庫のデータをAPIで抽出して、ローコードツールMakeを使って、LINE Botに自動送信する仕組みを作成することです。詳細は以下の記事を参考してください~

これ実は、使えなかったです。なぜかというか、セキュリティ問題があります。具体的に言うと、社内の設備情報を個人LINEに流すのは問題があります。
そうですよね、考え不足です!(社内でデジタルを始める人あるある問題w)
ではなにしたら、使えるようになりますかね?少しIT部門の方と相談したら、「デジタルはもう慣れているようから、ローコードではなく、Pythonで実現するようとしたらどうですか?」の意見を戴きました。
なるほど!その手もあります!なぜPythonがいいのか正直私も分からないですが、でもIT部門の方の意見なら信じます!もう一つ問題はプログラミング言語は難しい…短時間でできなさそうです。
そもそもPythonはなんですか?調べたら:

この時、去年の年末から、一気に流行り始めたChatGPTは、会話だけではなく、コードを書いてもらうこともできる情報をもらって、ChatGPTPython、初コーディングを挑戦します!

完成物

完成物のソースコード
完成物.py
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に聞いてみよう!
image.png
なるほど、ダウンロードしてみます!
Pythonは現時点3.11は最新バージョンで、とりあえずこれにします。コードエディタはどっちでも良さそう…Visual Studio Codeにしましょう!
d21825f10fcdb7e24f7f32c8f489066d.png

IDEを起動して…え?何したらいいですか?もう一回ChatGPTに聞きます!
image.png
うむ、拡張機能をダウンロードして…コードを書き込んで…実行!
image.png
おお!反応してます!
ChatGPTの方は「少しずつコードを書いてみると良いでしょう。」で言ってますけど、今回は勉強ではなく、ChatGPTを使って書くので、いきなり実戦に突入します!

1 初心者はいきなりどこまでできるのか?!

即実戦…少し不安ですね。とりあえず問題を入力しましょう。
セキュリティも考慮して、今回はAPIガイドの例を利用して問題します。
image.png

codeは折りたたみします!
test.py
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 ライブラリをダウンロードすることが必要ですが、これは何でしょう?少し調べます!
image.png
ホントかどうか少し心配で…ネット記事も調べました!

なるほど、便利ツールの感じですね。ではインストールして、コードを貼り付け作業をやります。

作業を完了して、ドキドキ初めて実行したら
image.png
見にくいですが…これはJSONデータの返事が来てます。 いきなり成功?!

2 謎のデータの海から特定のデータを引き出す!

この謎のデータの海から必要の情報を探すのは…人は無理です!
問答無用!もうどんどんChatGPTに問題を投げます!
特定のデータを出すために、どんなコードがいいのかを聞いたら:

test.py
# 特定の'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}")

これと前のコードを結合して、実行したら:
image.png
うまく行けましたね!

3 ビジネスはやっぱりメール?

前回の記事は最後LINE Botにデータを送りますが、個人LINEにはセキュリティ問題がありますので、ビジネスでやっぱりメールは王道ですね。
ChatGPTに聞いてみましょう!
image.png

コードは折りたたみします
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...なんかエラーが発生しました!
image.png
ChatGPTで調べたら、smtplibは標準ライブラリのため、インストールことは要らないです。だからChatGPTには書いていないですね…
image.png

次に気になるのは、Gmailのセキュリティ設定で「安全性の低いアプリのアクセスを有効にしておく必要があります。これにより、PythonスクリプトからGmailアカウントへのアクセスが可能になりますが、セキュリティ上の理由から注意が必要です。」
セキュリティですね…でもここまで来たから、やってみようか…と思いまして、Googleの設定を探したら、そんな設定ないです!Googleのドキュメントに確認したら:
image.png
ですが、ChatGPTは2021年9月までのデータで学習しているため、この件について知らないです!!
こんな盲点もあります…
強引で試してみたら:
image.png
普通にダメですね(笑)
社内メールを利用するの手もあるんですが、SMTPサーバーが必要です。 会社のIT部門に確認が必要ですが、今はまさにお盆です 。これは、休暇が終わるまで諦めるしかないですね
お盆でたまたまIT部門の方出社しました!SMTPサーバーhostportをもらって、これが行けると思いましたが、結局エラーが発生しました。
image.png
もう何が言っているのが分からないから、とりあえずエラーコードまるごとChatGPTに投げました。
image.png

コードは折りたたみします
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!偉い!
でもこのコードを入れ替えても、結局エラーが発生しました。
今回のエラーは:
image.png

ChatGPT先生に聞いたら:
image.png
会社のSMTPサーバーもセキュリティの関係でダメのことですかね…
おそらく何かの設定したら、行けるはずが、これはまたIT部門の方に確認必要ですね。
でもIT部門の方は二十日まで長休になりました…あとで確認します。

もうここまで来てるから!メールぐらいみたいです!メールは送信さえ成功したら、あとはサーバに合わせて、設定を変えるだけです。
昔使ったメールアドレスを探したら、まだ学生の時で使ってたMSN messageliveメールを見つかりました。
マイクロソフト経由で、セキュリティは厳しいはずですね…でも試しましょう!
その結果:
image.png
え?成功しました?!マイクロソフト大丈夫ですかねwww
メールの方に確認したら:
image.png
完全に成功です!

メール送信テストがうまくいきましたから、これと前の特定温度データの抽出と結合して、エラーを発生する時のみメールを送信する仕組みにします!
二つの修正をしました。一つは、送信の条件はvalueがあることだけから、valueはある一定の範囲から外すことに修正しました。例えば0℃の冷蔵庫は1℃から-1℃の範囲内外れたら、エラーメールが送信します。

もうひとつは送信bodyにエラーメッセージを書きました。それそれは下のコードのようです。

test.py
# 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
エラーコードは:
image.png
ChatGPT先生ー、答えでー
image.png
なるほど、先生のコードも少し修正案を提案されました。
image.png
これ以上エラーないですよね…実行してみます!
image.png
image.png

やっと成功しました!

4 自動実現の件

私は以前Power Automateの自動実行のため、Task Schedulerを使ったことがあります。
PythonWindowsの環境で実行するなら、少し修正だけで、記事と同じ方法で行けます!
宿題ではないですけど、この部分は残します~
当然、もしうまく行けなかったら、ChatGPT先生は いつでも質問を待っています!

これからは何をする?

Python x ChatGPT大成功ですね!
ですが、社内の意見を伺ったら、いくつがあります。

①警報より、温度計関係の点検を自動化したいです(点検を簡単に言うと、今は毎日2回紙ベースで数字を記録します。具体的な話は今後の記事にします。)
②Pythonなら、社内のLinuxサーバーにしない?(IT部門の先輩より、新しい挑戦ですね!)

どっちでも今作ったものより難しいですね!でも、今なら私は楽しく受けます!なぜなら、分からなかったら、ChatGPT先生がいます!
今回はさっさとコードを書いて、うまく実行しました。もし自分で勉強するなら、 一ヶ月でもこんなもの書けないと思います。ですが、それは全部ChatGPTに任せる意味ではないです。逆に言うと、分からないところがあったら、全部ChatGPT先生に聞いて、最後自分でも自立で書けるようになるのは、理想と思います。これはきっと、今までない新しい勉強法になります。
また、一部の知識は、ChatGPTに聞くより、ネットの記事を探したり、ある程度理解度があったら、直接ドキュメントに確認する方が早いこともあります。ChatGPTは万能ではないし、少なくとも2021年以後のことは知らないですwww

以上、コードたくさんですけど、ノーコード記事です!(笑)

13
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?