半自動イベントポータルブログ「コレイコーひろしま」ができるまで。今回はChatGPTにPythonコードを書いてもらった話。
ノーコードツールは、kintoneとかにしてもある程度複雑なことをさせようとするとプログラミングした方が早いという、本末転倒なことが割とよくある。今回はGoogleフォームから受け取った開催日時に関する情報を条件に応じて整形してもらおうとしたら、条件分岐と整形ルールをいくつも設定する必要があり、非常に煩雑なので、思い切ってChatGPTにPythonコードを書いてもらった。
Googleフォームで受け取った開催日時データを整形するPython
Googleフォームで受け取った開催日時のデータをもとに、下記の条件に合わせて整形した日にちデータを返すPythonコードを書いてほしい
<Inputで渡されるデータ>
・開催開始日
・開催終了日
・開催時刻
・終了時刻
<条件による整形の仕方>
1.開催日が1日だけの場合 ●月●日(●) ●:●~●:●
2.開催日が複数日の場合 ●月●日(●)~●日(●)
3.開催日が複数日で、かつ月をまたぐ場合 ●月●日(●)~●月●日(●)
<出力するデータ>
・event_day カスタムフィールド用 上記の整形データ
・event_time ブログ本文用 上記の整形データのうち2,3には時間を追加したもの
・post_date ブログ投稿日用 開催開始日を投稿日にするのでそのフォーマットで
その後、曜日が英語ででてくるので日本語にしてほしいとか、開催時間のデータがない場合は省略してほしいとか、何度かやりとりをして最終的に吐き出してくれたのがこのコード。コメント付きなのでなんとなく何やってるのかもわかる。これによって色んなイベント期間に合わせた日付表記でブログの本文が書けるようになった。
import datetime
# Zapierから渡されるデータ(例)
start_date = input_data['start_date'] # 開催開始日 (例: '2024-10-13')
end_date = input_data['end_date'] # 開催終了日 (例: '2024-10-14')
start_time = input_data.get('start_time', '') # 開催時刻 (空の場合は空文字列)
end_time = input_data.get('end_time', '') # 終了時刻 (空の場合は空文字列)
# 日付を適切なフォーマットに変換
start_date_obj = datetime.datetime.strptime(start_date, '%Y-%m-%d')
end_date_obj = datetime.datetime.strptime(end_date, '%Y-%m-%d')
# 曜日を日本語に変換する辞書
day_of_week_jp = {
0: '月',
1: '火',
2: '水',
3: '木',
4: '金',
5: '土',
6: '日'
}
# 開催期間の整形
if start_date == end_date:
# ①開催日が1日だけの場合
event_day = f"{start_date_obj.month}月{start_date_obj.day}日({day_of_week_jp[start_date_obj.weekday()]})"
elif start_date_obj.month == end_date_obj.month:
# ②開催日が複数日の場合
event_day = f"{start_date_obj.month}月{start_date_obj.day}日({day_of_week_jp[start_date_obj.weekday()]})~{end_date_obj.day}日({day_of_week_jp[end_date_obj.weekday()]})"
else:
# ③開催日が複数日で月をまたぐ場合
event_day = f"{start_date_obj.month}月{start_date_obj.day}日({day_of_week_jp[start_date_obj.weekday()]})~{end_date_obj.month}月{end_date_obj.day}日({day_of_week_jp[end_date_obj.weekday()]})"
# 開催時間の整形
if start_time and end_time:
if start_date == end_date:
# ①開催日が1日だけの場合
event_time = f"{start_date_obj.month}月{start_date_obj.day}日({day_of_week_jp[start_date_obj.weekday()]}) {start_time}~{end_time}"
elif start_date_obj.month == end_date_obj.month:
# ②開催日が複数日の場合
event_time = f"{start_date_obj.month}月{start_date_obj.day}日({day_of_week_jp[start_date_obj.weekday()]})~{end_date_obj.day}日({day_of_week_jp[end_date_obj.weekday()]}) {start_time}~{end_time}"
else:
# ③開催日が複数日で月をまたぐ場合
event_time = f"{start_date_obj.month}月{start_date_obj.day}日({day_of_week_jp[start_date_obj.weekday()]})~{end_date_obj.month}月{end_date_obj.day}日({day_of_week_jp[end_date_obj.weekday()]}) {start_time}~{end_time}"
else:
# 時間がない場合は日付だけを表示
if start_date == end_date:
event_time = f"{start_date_obj.month}月{start_date_obj.day}日({day_of_week_jp[start_date_obj.weekday()]})"
elif start_date_obj.month == end_date_obj.month:
event_time = f"{start_date_obj.month}月{start_date_obj.day}日({day_of_week_jp[start_date_obj.weekday()]})~{end_date_obj.day}日({day_of_week_jp[end_date_obj.weekday()]})"
else:
event_time = f"{start_date_obj.month}月{start_date_obj.day}日({day_of_week_jp[start_date_obj.weekday()]})~{end_date_obj.month}月{end_date_obj.day}日({day_of_week_jp[end_date_obj.weekday()]})"
# ブログ投稿用の日時をISO 8601形式で整形
if start_time:
post_date = f"{start_date}T{start_time}:00" # 開始日+開始時刻で投稿日時を作成
else:
post_date = f"{start_date}T00:00:00" # 時間がない場合はデフォルトで00:00に設定
# 結果をZapierに返す
return {
'event_day': event_day,
'event_time': event_time,
'post_date': post_date # WordPress投稿用の日時
}
WEB上の画像をメディアライブラリにサイドロードするPython(没)
Web上にある画像のダイレクトURLを指定すれば、Wordpressのメディアライブラリにアップロードすることができる。これをアップロードじゃなくてサイドロードというらしい。結局Web上の画像を勝手に使うのは著作権的にマズいし横着するのは止めようと思い没にしたが、これもPythonで書いてもらった。そしてここでjsonというまた聞いたことはあるけど得体の知れない何か(データのフォーマット形式のことらしい、プログラミング言語ではなかったのか…)も使い始めるのであった。
Googleフォームで受け取った画像URLから画像をメディアライブラリにサイドロードし、アイキャッチ画像として指定するにはサイドロードした画像のメディアIDが必要なので、メディアIDを出力するPythonコードを書いてほしい
<Inputで渡されるデータ>
・wordpress_apiのURL
・メディアライブラリにアクセスするためのJWTトークン
・サイドロードしたい画像のURL
<出力するデータ>
・サイドロードした画像のメディアID
・サイドロードした画像のURL
お願いをしてから返ってくるまでのスピードが早い。迷いはないのか。もし画像のURLがない場合はイベントのカテゴリにあわせて違うアイキャッチ画像を指定するために、画像のURLがあればTrueを、なければFalseを返すようにもした。
import requests
# Zapierから入力されたデータを使用
wordpress_api_url = input_data['wordpress_api_url'] # Zapierのインプットデータを利用
image_url = input_data.get('image_url') # image_urlが存在しない場合はNoneを返す
jwt_token = input_data['jwt_token']
# 画像がある場合のみ処理を実行
if image_url:
headers = {
"Authorization": f"Bearer {jwt_token}"
}
# 画像をURLから取得
response = requests.get(image_url)
if response.status_code == 200:
image_data = response.content
else:
print("Failed to download image")
output = {
"featured_media": False # 画像ダウンロードが失敗した場合もfalseを返す
}
print(output)
exit()
# 画像の拡張子に応じて適切なMIMEタイプを設定
image_name = image_url.split("/")[-1] # 画像ファイル名
file_type = image_url.split(".")[-1] # 拡張子(例: jpg, png)
mime_type = f"image/{file_type}"
# WordPressのメディアライブラリに画像をアップロード
files = {
'file': (image_name, image_data, mime_type)
}
response = requests.post(wordpress_api_url, headers=headers, files=files)
# アップロード結果の確認と画像IDの取得
if response.status_code == 201:
media_info = response.json()
media_id = media_info["id"] # 画像のMedia IDを取得
media_url = media_info["source_url"] # アップロードされた画像のURL
# Zapierに返すデータ
output = {
"media_id": media_id,
"media_url": media_url,
"featured_media": True # アップロード成功時にtrueを返す
}
print(output) # Zapierに返す
else:
print("Failed to upload media", response.status_code, response.content)
output = {
"featured_media": False # アップロードが失敗した場合はfalseを返す
}
print(output)
else:
# 画像がない場合はfalseを返す
output = {
"featured_media": False
}
print(output)
イベントのカテゴリにあわせてアイキャッチ画像を返るPython
本当は各イベントのチラシ画像とかをアイキャッチにした方がどんなイベントかひと目でわかっていいのだけど、そのためにいちいち画像使用許可のお願いの連絡を取りにいくのは、今は面倒くさい。だけど何らかのアイキャッチ画像はやっぱりあった方がいいので、イベントのカテゴリにあわせて異なるアイキャッチ画像を選ぶようPythonを書いてもらった。
これはプログラムの流れがわからないので、そこからChatGPTとやりとりをして、どういう動作をしたらいいのかを順に解決していった結果、あらかじめこれだけの準備をしておいた。
- Googleフォームで受け取ったイベントのカテゴリにあわせて、メディアライブラリ内にある画像のメディアIDを出力したい
- (没にしたけど)サイドロードした画像がある場合は、その画像のメディアIDを出力
- サイドロードした画像がない場合は、カテゴリに対応したメディアライブラリ内の画像のメディアIDを出力
- カテゴリごとのアイキャッチ画像を用意して(これもChatGPTに生成してもらった)、メディアライブラリにアップして、それぞれメディアIDを調べておく
- このカテゴリだったらこの画像という対応関係を用意しておく
- Inputで渡されるデータはカテゴリ名、サイドロード画像があるかどうか(True/False)、サイドロード画像があった場合のメディアID
# カテゴリに対応するメディアIDの辞書を定義
category_to_media_id = {
"セミナー・トークイベント": 106,
"展示発表会": 105,
"マーケット": 108,
"体験ワークショップ": 104,
"お祭り・総合イベント": 107,
"ライブパフォーマンス": 152
}
# Zapierからの入力データを取得
featured_media = input_data.get('featured_media') # true or false
category = input_data.get('category') # カテゴリ名
media_id = input_data.get('media_id') # アップロードされたメディアID
# featured_mediaがtrueの場合、アップロードされたmedia_idを使用
if featured_media and media_id:
featured_media_id = media_id
else:
# falseの場合、カテゴリに応じたメディアIDを設定
featured_media_id = category_to_media_id.get(category, None)
# 結果を出力
output = {
"featured_media_id": featured_media_id
}
print(output)
こんな感じでコードを書いてもらうための指示をまず自分ができるように、動作の流れをざっくり教えてもらって、細かいところを順に整理していって、最後に長い指示書を書いてこれでコード書いてとお願いしていった。すごいぜChatGPT。続く。
<自動化ツールでブログを作成シリーズ>
- 自動化ツールを使うためにはサーバー設定の見直しが必要
- 没になったアイデアたち
- ChatGPTがプラグインの提案とPHPコードを書いてくれた
- 全くわからないPythonコードを書いてもらう
- jsonを使ってZapierからブログ投稿
- Cocoonのphp構造を理解してカスタムテンプレートをつくる
- Googleフォームに入力したらWordPressに自動投稿してくれるZapierフローのまとめ
- ZapierでSNSへ定期的に自動投稿
- 週末に土日から来週のイベントをまとめてSNSに投稿するZapierフローのまとめ
- ZapierからACFフィールドへの投稿
- ChatGPTと一緒にブログを作って感じたこと
コメント