Assist with User Request

スポンサーリンク

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サイトから記事の更新情報を取得し、未ツイートの記事をツイートするものです。また、ロギングとエラー処理も含まれています。

python
import 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日以内に投稿された未ツイートの記事をツイートするように修正したサンプルプログラムを以下に示します。

python
import 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日前の日時を計算し、その間に投稿された記事があるか確認しています。

ご確認いただき、フィードバックがあればお知らせください。

スポンサーリンク
Heywaをフォローする

コメント

タイトルとURLをコピーしました