Python TwikitでWordPress新着記事情報をツイートする

公開 | 更新 

公式APIに頼らずX(Twitter)へポストできるPython Twikitライブラリを使って、WordPressサイトのRSSフィードから得た新着記事情報を自動ポストする仕組みを構築します。

Python Twikitライブラリ

PythonでX(Twitter)へポストする手段はまず、公式のX APIを叩く方法が挙げられますが、利用に必要な開発者登録が煩雑なのが難点。そんな中、見つけたのがAPIを介さずに手軽に利用できて話題の、Twikitライブラリです。

どうも内部ではスクレイピングのようなことをして実現しているようなので、あまり利用者が増えるとサーバ側で対策されてしまう懸念も。

まぁ、いずれは公式APIを利用するとして、今回はそれまでの時間稼ぎに、このTwikitライブラリを使ってポストする仕組みを作ってみることにします。

 

Python 3.8→3.10へ

前回記事同様、Oracle Cloud上のUbuntu 20.04ベースの仮想マシンで作業を始めるも、Python3.8ではこのTwikitは動きません。

これは、当該部の型ヒントの表記方法に、Python3.10以降のモダンな記述が採用されているためで、必然的にTwikitはPython 3.10以降でないと動作しないことを意味します。

 

ところが、Ubuntu 20.04のシステムリポジトリにPython 3.10が収録されていないので、古いUbuntuへ新しいPythonを載せるのに重宝するこちらのサードパーティリポジトリを追加してからインストールします。

 

Python 3.10のpip導入と棲み分け

Python 3.10は入りましたが、 pip は元々入っているPython 3.8用のまま。

python3.10-distutils パッケージを入れるとバージョン番号ぐらいはまともに返せるようにはなりましたが、 list でまたコケるのでこれは解決とは言えず。

結局、 pip のインストールスクリプトを使ってバージョン指定でインストール。

しかしこれでは、デフォルトのpipがPython 3.10の pip になってしまって不都合。このシステムのデフォルトのPythonはPython 3.8なので、デフォルトの pip も3.8のものであって欲しいのです(Python 3.10環境はバージョン名指しで使うことに限定)。

そこで、上述のインストールスクリプトでPython 3.8を指定して再実行。これで思っていた仕様になりました。

 

Twikitの導入

ようやく準備が整ったので、 pip でtwikitをインストールします。

そして、前回使ったfeedparserライブラリも、Python 3.10環境へ忘れずにインストール。

 

Twitterへ初回ログインしてツイート

Twikitはv2系になって asyncio による非同期処理を使って実行するようになったようで、使ったことのない処理方法に四苦八苦。

さらに、潜在的なバグも完全に解決しきれていないようですがいろいろ調べ、ひとまず以下のスクリプトでTwitterへログインしてツイートするところまで、こぎつけました(キモは、 user_agent を偽装するところ)。

未知のデバイスからの初回ログインは、Twitterの通知に挙がります。

図1.Twitterログイン通知

図1.Twitterログイン通知

なので、実行の度にログインし直していると、おそらくTwitter側にあまり良くない印象を与えることになりそう。

 

次回以降はクッキーで認証してツイート

そこで、上述のスクリプトで保存したクッキーファイルで次回以降は認証の上、ツイートを投げつけます。

スクリプト内にパスワード平文で記述しないで済むのは、精神的にも平穏。

図2.Twikitによるテストツイート

図2.Twikitによるテストツイート

RSSフィードから新着記事抽出してツイート

これを前回製作したfeedparserによる、RSSフィード新着記事抽出スクリプトへ実装するにあたり、ハマったのは asyncio.run() は一度しか使えないということ。

そこで、新着記事が複数あることに備えたループ処理を非同期関数で包み、それを最後に asyncio.run() で実行させるようにしています(かなり力技)。

 

こうしてようやく組み上がった以下のスクリプトを、cronで日毎に自動実行するようにしています。

このスクリプトが動いているうちに、公式API利用のための開発者登録を進めたいと思います。

 

create_tweet問題

しばらく上記のスクリプトで動いていたものの、ある時よりツイートに失敗するようになりました。スクリプトをPythonコンソールから一つ一つ実行してみると、最後にエラー。

調べてみてたどり着いたのは、こちらのスレッド。

類似内容の連投や文字数超過が疑わしいようなので、いろいろ試してみた結果、記事のURLのみを渡してようやくツイートが発せられました。

毎回どきまぎさせられるのはさすがに疲れるので、X開発者登録を早急に進めようと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA