こんにちは。TATです。
今日のテーマは「【Pythonで業務効率化】「note記事更新→Twitterに投稿する」のマニュアル作業を自動化する」です。
Pythonはさまざまな用途に活用することができます。
その1つが業務効率化です。
日々のデータ集計、データ管理、書類の作成など、あらゆる業務を効率化できる可能性を秘めています。
そんな業務の中でも、ここではnote記事をTwitterで投稿する工程を自動化してみます。
僕が最近「めんどくせーな」と思ったのでPythonで自動化しました。
なんでもっと早くやらなかったんだろうと今になってとても後悔していますw
noteの投稿データはRSSを使えば簡単に取得することができます。
TwitterのAPIを使えば自動投稿も実装できます。
これでめんどくさい作業がまた一つ減りましたw
【Pythonで業務効率化】「note記事更新→Twitterに投稿する」のマニュアル作業を自動化する
まずは全体の流れを確認する
まずは全体の流れを確認します。
note記事をツイートする工程は今までマニュアルで行っていました(実際はほぼ忘れてツイートしていないに等しいですw)
僕はこういった簡単なタスクはすぐに忘れてしまうので自動化して解決を試みます。
ここを自動化するためには、次のような流れをプログラムで実装する必要があります。
作業の流れ
- noteの記事を取得する
- 新しい記事があるかどうかを確認する
- もしあればTwitterに投稿する
上記の流れです。シンプルですね。
これをプログラムで実行するには、以下のポイントが重要になります。
実装のポイント
- noteの記事を取得する → noteのRSSを利用する
- 新しい記事があるかどうかを確認する → Pythonで記事をフィルタリングする
- もしあればTwitterに投稿する → TwitterのAPIを利用する
noteの記事を取得するには、RSSを使えば簡単に実現できます。
投稿記事が取得できたら、Pythonでデータを整形して、新しい記事が含まれているのかを確認します。
もし含まれていたらTwitterのAPIを利用して自動投稿すれば完了です。
順番に解説していきます。
noteのRSSから投稿データを取得する
まずはnoteの記事の取得です。
前述の通り、これにはnoteのRSSを利用します。
RSSとは?
さらっとRSSという単語を使ってしまいましたが、ここで簡単に解説しておきます。
Wikipediaから抜粋します。
RSS(バージョンによってRich Site Summary, RDF Site Summary Really Simple Syndication)は、ニュースやブログなど各種のウェブサイトの更新情報を配信するための文書フォーマットの総称である。
Wikipedia「RSS」より
上記の通り、RSSとは各種ウェブサイトの更新情報を配信するための文書フォーマットの総称です。
簡単に言えば、サイトの更新情報をプログラムが読みやすい形式で配信されたものです。
プログラムはこれを読めば簡単に更新情報にアクセスすることができます。
記事タイトルや更新日時、記事のURL、本文の冒頭一部などの情報が含まれていることが多いです。
RSSを利用すれば、スクレイピングで取得するよりもはるかに簡単です。
noteのRSSにアクセスする
RSSについてわかったところで、早速noteのRSSにアクセスしてみましょう。
これは簡単です。
クリエイターページのURLの最後に/rssをつけるだけです。
僕が運営しているnoteのクリエイターページのURLはhttps://note.com/investortatです。
よって、RSSのリンクは、https://note.com/investortat/rssになります。
こちらのリンクにアクセスすると、中身を確認することができます。
人間的にはすこぶる読みにくい感じがしますが、プログラム的にはこの形式が読みやすいです。
xml形式になっているで、データが構造的で解析しやすくなっています。
ちなみにRSSにアクセスできない場合は設定が必要です。
公式サイトにヘルプページがあります。
PythonでnoteのRSSデータを取得する
RSSのURLが確認できたところで、Pythonでこのデータを取得してみます。
これにはrequestsとBeautifulsoupというパッケージを使います。
スクレイピングでよく使われるパッケージです。
とりあえずコードをどうぞ。
import requests from bs4 import BeautifulSoup # htmlを取得 url = "https://note.com/investortat/rss" r = requests.get(url) xml = BeautifulSoup(r.content, "lxml")
requestsでデータを取得して、Beautifulsoupでデータにアクセスしやすいようにデータを変換しています。
xmlを表示するとこんな感じです。
きちんとデータが取得できていることが確認できます。
これでRSSデータの取得は完了です。
取得データを整形して、新しい記事があるかを確認する
RSSデータが取得できたので、ここから少しデータ整形していきます。
このままだとすこぶる見にくいので、人間がわかりやすい形式に変換します。
このやり方はいろいろありますが、僕の場合はとりあえずDataFrameに変換します。
RSSの中身を確認する
もう一度RSSデータの中身を確認します。
上の方から眺めていくと、titleがあってdescriptionなどが続いています。
内容から、ここはユーザーの紹介であることがわかりますね。
icon画像とかユーザーページへのリンクなんかもあります。
そして、真ん中少し上くらいのところにitemという名のデータがあります。
これが投稿記事です。
以降、itemが繰り返し登場していることがわかります。
つまり、このitemの中身を全て収集することができればOKなわけです。
投稿記事を収集する
収集すべきデータがわかったので、早速Pythonで実装していきます。
これにはfindAllという機能を使います。
これで該当するデータ全てをリスト形式でまとめて取得できます。
itemの中身を見ると、title, thumnail, description, pubDate(更新日時), guid(リンク)などがありますね。
ここでは必要最低限として、title, pubDate(更新日時), guidのみを収集します。
それではコードをどうぞ。
data = [] # itemの中身を1つずつ確認 for item in xml.findAll("item"): d = { "title": item.find("title").getText(),# 記事タイトル "link": item.find("guid").getText(),# 記事リンク "pubdate": item.find("pubdate").getText(), # 更新日時 } data.append(d) # DataFrameに変換 df = pd.DataFrame(data)
シンプルですね。
item一覧を取得して、中身を1つずつ確認して必要なデータを抽出しています。
集めたデータをDataFrameに変換すれば完了です。
中身はこんな感じになります。
きちんと取得できていますね。
データ数は全てで25個です。
これはnote側の仕様で、RSSでは最新記事25個までしか取得できないようになっています。
よって古い記事にアクセスすることはできません。あくまで最新の記事の確認のために利用します。
日時データを変換する
次の作業が日時データの変換です。pubDateのカラムですね。
これはただの文字列データなので、このままだと日時によるフィルタリングはできません
これをするには、datetimeフォーマットに変換してあげる必要があります。
この作業は1行で完了します。
df["datetime"] = df["pubdate"].apply(lambda x: datetime.datetime.strptime(x, "%a, %d %b %Y %H:%M:%S +0900"))
datetimeのstrptimeを使って、文字列をdatetimeフォーマットに変換しました。
きちんと変換されていることが確認できます。
これでデータ整形は完了です。
新しい記事を抽出する
データの準備が整ったところで、最後の仕上げです。
新しい記事を抽出します。
ただ、ここで疑問が湧いてきます。
「どうやって新しい記事を判定するか」です。
これにはいろいろな方法が考えられます。
新しい記事を判定するには?
- データベースに突っ込んで重複あればスキップ、新規追加できたら新記事と判定
- 定期的に記事をチェックして、前回実施時間以降に更新された記事があれば新記事と判定
- 取得データをExcelやPickle形式で保存して、過去データと一致しなかったら新記事と判定 などなど
やり方は人によって変わってくると思います。
データベースなどにデータを収集しながら管理するのもいいですね。
データベースをExcelやPickleに置き換えても良いです。
要はきちんと動けばなんでもいいんですw
僕の場合は2つ目の方法を採用しました。
定期的に記事をチェックして、前回実施時間以降に更新された記事があれば新記事と判定します。
例えば、20分おきに記事をチェックしたら、チェック時に過去20分以内に新しい記事が更新されていたら、「それは新記事ですね」と判断できます。
これを実行するには、先ほど変換したdatetimeカラムが必須です。
これで過去20分以降の記事を抽出して、該当データがあれば新記事、なければスキップすればOKです。
import datetime import dateutil now = datetime.datetime.now() ref_dt = now - dateutil.relativedelta.relativedelta(minute=20) df_target = df[df["datetime"]>=ref_dt]
上記の通り。
dateutilを使って20分前の日時を計算して、これでフィルタリングすればOKです。
このdf_targetの中身があれば、それは新記事になります。
空っぽなら新記事はないと判断できます。
TwitterのAPIで自動投稿する
最後の工程が、Twitterへの投稿です。
これにはAPIを活用します。
TwitterのAPIを利用するには申請が必要です
TwitterのAPIを利用するには申請が必要です。
こちらからできます。(残念ながら全て英語です)
申請のプロセスとかはググったらいろいろ出てきます。
申請が完了したらAccess Tokenなどが発行できます。
これらを使ってAPIで自動投稿が可能になります。
Twitterの自動投稿コードの例を紹介します
最後に、Twitterの自動投稿コードの一例をご紹介します。
from requests_oauthlib import OAuth1Session # APIキー各種を設定 twitter = OAuth1Session( "consumer_key", "consumer_secret", "access_token", "access_token_secret" ) # パラメーター設定 params = {"status": "ここに投稿したい内容を入れる"} # 投稿 req = twitter.post( url="https://api.twitter.com/1.1/statuses/update.json", params=params )
consumer_keyなどは、ご自身で取得したものに書き換えてください。
APIキーなどの重要な情報は本来は、コードにベタ打ちしないほうがいいです。
僕の場合はConfigファイルを作ってそこで管理しています。
必要な場合はそこから読み込む形です。
プログラムを実行すると、こんな感じで自動投稿できます。
note記事を更新しました。
日次レポート(2022-04-25)
#投資でニート生活 #株式投資 #日本株 #オニール #ミネルヴィニ #成長株投資
— TAT@ブログと株で資産形成中 (@investortat) April 25, 2022
ここまで紹介した一連の流れを定期的に実行すれば、新記事があるかどうかを確認して、もしあればTwitterに自動投稿ができるようになります。
僕の場合、サーバーにこのプログラムをデプロイして定期実行するようにしています。
もし新しい記事が見つかれば勝手にTwitterに投稿されます。
これで、面倒なマニュアル作業を1つ自動化することができました。
人生が少しだけイージーになりました。
まとめ
いかがでしたでしょうか。
ここでは、「【Pythonで業務効率化】「note記事更新→Twitterに投稿する」のマニュアル作業を自動化する」といううテーマで、Pythonを使ってnoteの記事を取得して新記事があればTwitterで自動投稿するまでの流れについて解説してきました。
Pythonを活用すれば、いろいろな業務を効率化・自動化することができます。
だるい作業はどんどん自動化していけば、それだけ人生はイージーモードに近づきます。
Twitterに投稿するという簡単な作業でも、1日に何回も、それを毎日繰り返すとなるとなかなか大変です。
サボりたい日も出てくれて忘れてしまう日も出てきます。
何より、「あーTwitter投稿しないとなー」という意識を持ち続けなければいけません。
ここではPythonを活用しましたが、どんな方法でも作業を効率化・自動化することができればかなり楽になります。
ここでご紹介したものは、ほんのわずかな作業量を自動化したに過ぎませんが、それでも効果は大きいです。
とりあえず、noteのTwitter投稿については、今後一生気にしなくてよくなるので僕の自由な時間がわずかに増えます。
1日単位で見ると大したことありませんが、これが積もり積もると大きな差になります。
是非とも、皆さんもPythonなどを使って日々の面倒な業務を効率化・自動化してみてください。
人生がイージーになります。
ここまで読んでくださり、ありがとうございました。