X 用自動投稿ツールの自作

Hitoshi Arakawa | 2025/01/01 Wed 05:01

かつて X が Twitter だったころは、申請さえすれば API が使えていた。API が使えたので自動投稿投稿のツール、いわゆる bot が無料で利用できていた。それが現在は X の有料プランに加入していなければ API を利用できない。自動投稿ツールも利用できなくなった。

そこでそれ以降は API を使わない方法で X の自動投稿ツールを自作している。その方法を簡単にメモしておく。

僕はブログの記事一覧(タイトルおよび URL )を FileMaker Server 上のデータベースで管理している。その URL を短縮 URL ツールの Yourls で短縮したうえで、X に投稿したい。

投稿のプラットフォームとしては、Proxmox に立てた Lubuntu で行う。Lubuntu から python-fmrest で FileMaker Server の投稿文を取得し、Lubuntu のブラウザで X のウェブページから投稿する。これが大まかな流れだ。

(1)ブログの記事一覧を管理している FileMaker Server のデータベースで、X での投稿文用のフィールドを作成しておく。僕は以下のようなフォーマットで投稿文を作成した。

{記事タイトル} {短縮 URL }

短縮 URL は Yourls であらかじめ全記事に対して作成している。

YOURLS | YOURLS
https://yourls.org/

(2)さらに FileMaker Server で、ランダムなレコードの投稿文フィールドを抽出するスクリプトを作成する。

スクリプトの作成方法の詳細は省略するが、スクリプトを実行すると抽出された投稿文フィールドをグローバルフィールドに格納するようにした。

(3)Proxmox に Lubuntu をインストールしておく(インストール方法の詳細は省略)。

Lubuntu を選んだのは、軽量な GUI の Ubuntu を用意したかったからだ。

仮想化プラットフォームの Proxmox をインストールした | 荒川仁志 公式サイト
https://www.hitoshiarakawa.com/blogs/2024/2024-12-24_installing-proxmox/

Proxmox で仮想マシンを追加する | 荒川仁志 公式サイト
https://www.hitoshiarakawa.com/blogs/2024/2024-12-25_installing-virtual-machines-in-proxmox/

Downloads – Lubuntu
https://lubuntu.me/downloads/

いろいろ試したところ、Lubuntu での X の自動投稿ツールは、12GB 以上のディスクスペース、CPU は 1 Core、メモリーは 1536MB でギリギリ動かせるようだ。

(4)Lubuntu に pip3 をインストールする。

$ sudo apt update
$ sudo apt install python3-pip

(5)Lubuntu に python-fmrest をインストールする。

$ pip3 install python-fmrest –break-system-packages

参考:
俺流!PEP668とうまくやっていく方法 | スクエニ ITエンジニア ブログ
https://blog.jp.square-enix.com/iteng-blog/posts/00043-play-with-the-pep668/

(6)XBot.py という名前で以下のような Python スクリプトを作成する。

import fmrest
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# FileMaker Server 情報
fms = fmrest.Server(
  'https://{ FileMaker Server の IP アドレス}',
  user='{ FileMaker Server データベースのユーザー名}',
  password='{ FileMaker Server データベースのパスワード}',
  database='{ FileMaker Server データベースのデータベース名}',
  layout='{データベースのレイアウト名}',
  verify_ssl=False,
  api_version='v1'
)

fms.login()

# 抽出された投稿文を特定する(検索する)。この検索コマンドの中で、投稿文選出用の FileMaker スクリプトを実行するよう指示している。
foundset = fms.find(
  query=[{'{フィールド名}': '*'}],
  scripts={
    'prerequest': ['{スクリプト名}', '{スクリプト引数}'],
  }
)

# 投稿文を出力する。
for record in foundset:
  print(record.{フィールド名})

fms.logout()

以下のコマンドを実行すれば抽出された投稿文を標準出力(ターミナル上に表示)できる。

$ python3 Xbot.py
{記事タイトル} {短縮 URL }

(7)Lubuntu に Vivaldi ブラウザをインストールする。Vivaldi を使うのは、軽量なブラウザを使いたかったからだ。

Lubuntu に Vivaldi ブラウザをインストールする|荒川仁志
https://note.com/hitoshiarakawa/n/n3fae58f94d6c

(8)Vivaldi で X にログインする。

(9)6で標準出力された投稿文をクリップボードにコピーしたい。

そのために xsel というツールをインストールする。

$ sudo apt update
$ sudo apt install xsel

6の python スクリプトを実行して投稿文を標準出力し、それをクリップボードにコピーをするなら以下のようになる。

$ python3 Xbot.py | xsel --clipboard --input

SSH 経由で実行している場合は、DISPLAY=:0 を付ける必要がある。

$ python3 Xbot.py | DISPLAY=:0 xsel --clipboard --input

これで Lubuntu のクリップボードに投稿文がコピーされた。

(10)X はブラウザでは N キーを押すことで投稿文の入力フォームをポップアップできる。

コマンドでキーボード操作を実行するには xdotool というツールをインストールする。

$ sudo apt update
$ sudo apt install xdotool

N を入力するには以下のコマンドを実行する( SSH 経由で実行しているので DISPLAY=:0 を付けている)。

$ DISPLAY=:0 xdotool key n

クリップボードの中身をペースト( control + V )するには以下。

$ DISPLAY=:0 xdotool key ctrl+v

X のブラウザで投稿を実行するには control + return を押す必要がある。そのコマンドは以下。

$ DISPLAY=:0 xdotool key ctrl+Return

(11)6〜 10 の、FileMaker Server での投稿文のランダム抽出、クリップボードへのコピー、X で投稿フォームのポップアップ、クリップボードのペースト、投稿実行までをすべて実行するには以下のようになる。

$ python3 Xbot.py | DISPLAY=:0 xsel --clipboard --input && DISPLAY=:0 xdotool key n && sleep 5 && DISPLAY=:0 xdotool key ctrl+v && sleep 5 && DISPLAY=:0 xdotool key ctrl+Return

N や control + return の入力前に5秒待機させているのは、ブラウザでの入力には少しタイムラグがないと反応しないからだ。

このコマンドを cron に登録しておけば指定時刻に自動投稿できる。cron に登録する際も DISPLAY=:0 は必要だ。朝7時に実行するには以下を cron に登録する。

0 7 * * * python3 Xbot.py | DISPLAY=:0 xsel --clipboard --input && DISPLAY=:0 xdotool key n && sleep 5 && DISPLAY=:0 xdotool key ctrl+v && sleep 5 && DISPLAY=:0 xdotool key ctrl+Return

問題はときどき X のブラウザで「メールアドレスは正しいですか?」といったポップアップ通知が表示されることだ。このポップアップが表示されている間は N キーを押した投稿ポップアップの表示などができない。だから、ときどき Lubuntu を確認して通知のポップアップが出ていたら手動で閉じる必要がある。

参考:
Yourls API を使って URL を短縮する|荒川仁志
https://note.com/hitoshiarakawa/n/n73a97841d16e

python - Suppress InsecureRequestWarning: Unverified HTTPS request is being made in Python2.6 - Stack Overflow
https://stackoverflow.com/questions/27981545/suppress-insecurerequestwarning-unverified-https-request-is-being-made-in-pytho

python-fmrest/examples at master · davidhamann/python-fmrest · GitHub
https://github.com/davidhamann/python-fmrest/tree/master/examples

[Raspberry Pi] python-fmrest で FileMaker Data API を使う|荒川仁志
https://note.com/hitoshiarakawa/n/n428d4c496f5d

[Raspberry Pi] python-fmrest で FileMaker Data API を使う2|荒川仁志
https://note.com/hitoshiarakawa/n/n4be69919aab0

[Raspberry Pi] python-fmrest で FileMaker Data API を使う3|荒川仁志
https://note.com/hitoshiarakawa/n/n83be5cc568e5

[Linux] コマンドラインでの標準出力をクリップボードにコピーする #shell - Qiita
https://qiita.com/koara-local/items/e9ba9a15406aa5fe8299

xdotool コマンド全26実例 – console dot log
https://blog.capilano-fw.com/?p=3477

【 sleep 】コマンド――指定した時間だけ次のアクションを待機する:Linux基本コマンドTips(66) - @IT
https://atmarkit.itmedia.co.jp/ait/articles/1611/21/news021.html

Amazon.co.jp: Claris FileMaker Claris FileMaker Pro 2024 : PCソフト
https://amzn.to/4iZss1z