Assist with User Request
ChatGPT:もちろん、そのように回答いたします。何でお助けできるでしょうか?
Pythonのtweepyを利用して、
WordPressのサイトの更新状況をツイートするサンプルプログラムを作っていただけますか。
処理内容とその他の制限事項については以下を参照してください。
■処理
1.WordPressで作られた「test.com」から、記事の更新情報をrequestsで取得
2.前回ツイート時刻から判断して、未ツイートの記事の有無を判定する。
3.未ツイートの記事を古い順に一つだけ取得してツイートする。
■その他制限事項
1.ロギング処理
・loggingライブラリを使ってください。
・./log/配下にスクリプトファイル名で出力するようにしてください。ディレクトリがなければ作成してください。
・ログファイルへの出力は以下のように定義してください。
”’ ログをファイルに出力するための設定 ”’
rfh = logging.handlers.RotatingFileHandler(
filename=’./log/’ + os.path.basename(__file__) + ‘.log’,
maxBytes=1024*1024,
backupCount=5
)
・追加でコンソソールへもログメッセージを出力させるようにしてください。
2.エラー処理
・ロギング処理と同様の箇所でtry文を利用してエラー
・エラー時、「errlinesend」というメソッドを実行するようにしてください。
ChatGPT:以下に指定の条件に従ったPythonサンプルプログラムを示します。このプログラムはWordPressサイトから記事の更新情報を取得し、未ツイートの記事をツイートするものです。また、ロギングとエラー処理も含まれています。
pythonimport os
import logging
import logging.handlers
import requests
from datetime import datetime
import tweepy
import json
# ログ設定
log_dir = './log/'
if not os.path.exists(log_dir):
os.mkdir(log_dir)
logging.basicConfig(level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s')
rfh = logging.handlers.RotatingFileHandler(
filename=os.path.join(log_dir, os.path.basename(__file__) + '.log'),
maxBytes=1024*1024,
backupCount=5
)
logging.getLogger().addHandler(rfh)
console = logging.StreamHandler()
logging.getLogger().addHandler(console)
def errlinesend(err_msg):
logging.error(f"Error occurred: {err_msg}")
# Tweepy設定(環境変数から取得する例)
consumer_key = os.environ.get('TWITTER_CONSUMER_KEY')
consumer_secret = os.environ.get('TWITTER_CONSUMER_SECRET')
access_token = os.environ.get('TWITTER_ACCESS_TOKEN')
access_secret = os.environ.get('TWITTER_ACCESS_SECRET')
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
try:
# WordPress記事取得
response = requests.get("https://test.com/wp-json/wp/v2/posts")
response.raise_for_status()
articles = response.json()
# 前回のツイート時刻取得(ファイルから読み込むなど)
# ここでは仮に最後にツイートした日時を格納
last_tweet_time = datetime.strptime('2023-08-01T12:34:56', '%Y-%m-%dT%H:%M:%S')
# 未ツイートの記事を探す
for article in sorted(articles, key=lambda x: x['date']):
article_time = datetime.strptime(article['date'], '%Y-%m-%dT%H:%M:%S')
if article_time > last_tweet_time:
tweet_text = f"New article published: {article['title']['rendered']} {article['link']}"
# ツイートする
api.update_status(status=tweet_text)
logging.info(f"Tweeted: {tweet_text}")
# ツイート時刻更新
last_tweet_time = article_time
break
except Exception as e:
errlinesend(str(e))
このコードは例ですので、WordPressのAPIエンドポイントやTwitterのAPIキーなどは適切に設定してください。また、前回のツイート時刻はどのように保存・読み込むかについても具体的な実装が必要です。この例では、簡単のためにハードコードしています。
最後に、errlinesend
関数はエラーメッセージをログに出力するだけの簡単なものですが、より詳細な通知機能を実装することも可能です。
・WordPressのRSSから取得するようにできますか。
・1日一回実行するとして、過去1日に投稿された記事を未ツイートの記事として判定していただけますか。
ChatGPT:WordPressのRSSから記事を取得し、過去1日以内に投稿された未ツイートの記事をツイートするように修正したサンプルプログラムを以下に示します。
pythonimport os
import logging
import logging.handlers
import requests
from datetime import datetime, timedelta
import tweepy
import feedparser
# ログ設定
log_dir = './log/'
if not os.path.exists(log_dir):
os.mkdir(log_dir)
logging.basicConfig(level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s')
rfh = logging.handlers.RotatingFileHandler(
filename=os.path.join(log_dir, os.path.basename(__file__) + '.log'),
maxBytes=1024*1024,
backupCount=5
)
logging.getLogger().addHandler(rfh)
console = logging.StreamHandler()
logging.getLogger().addHandler(console)
def errlinesend(err_msg):
logging.error(f"Error occurred: {err_msg}")
# Tweepy設定
consumer_key = "YourConsumerKey"
consumer_secret = "YourConsumerSecret"
access_token = "YourAccessToken"
access_secret = "YourAccessSecret"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
try:
# RSSから記事取得
feed = feedparser.parse('https://test.com/feed/')
# 前日の日付を取得
one_day_ago = datetime.now() - timedelta(days=1)
# 未ツイートの記事を探す
for entry in sorted(feed.entries, key=lambda x: x.published_parsed):
article_time = datetime(*entry.published_parsed[:6])
if article_time > one_day_ago:
tweet_text = f"New article published: {entry.title} {entry.link}"
# ツイートする
api.update_status(status=tweet_text)
logging.info(f"Tweeted: {tweet_text}")
# 1つツイートしたらループを抜ける
break
except Exception as e:
errlinesend(str(e))
このプログラムでは、feedparser
ライブラリを使用してRSSフィードを解析しています。feedparser
はインストールが必要ですので、pip install feedparser
を実行してください。
1日1回の実行を考慮して、過去1日以内に投稿された記事があるかどうかをチェックしています。それを判定するために、現在の日時から1日前の日時を計算し、その間に投稿された記事があるか確認しています。
ご確認いただき、フィードバックがあればお知らせください。
コメント