2022-01-09

Twitter のリストを Fritter に移行する

Python でスクリプトを書いてどうにかした.

undefined

背景

Fritter は OSS の Twitter クライアントである.

Twitter アカウントを使わないのでツイートしたり DM を送ったりはできないが,ユーザをフォロー(購読)してタイムラインを作ったり,リスト(グループ)を作って特定のユーザ群のツイートだけを見たりできる.個人的には,誤タップをしてしまう心配をしなくて良いのが嬉しい.

Fritter には指定した Twitter アカウントがフォローしている全ユーザを購読する機能がある.ただし,全ユーザーが確実に購読されるかはわからない(API の制限の都合).また,リストに入れているユーザを購読する機能はない.

Twitter でリストに入れているユーザを Fritter で購読したいが簡単な方法は見つからなかった.手作業ではやりたくないのでスクリプトを書こう!

やったこと

Fritter には Fritter の設定を JSON で出力する機能がある.中身を見てみると,購読しているユーザーは以下の形式で表されることがわかった.

{
	name: 名前,
	screen_name: @から始まる名前,
	id: ユーザ固有の id
}

本来は Fritter 間で設定を共有するためのファイルだが,購読したいユーザの一覧からこの形式のファイルを生成して import すれば,たくさんのユーザを一度に購読できる.次に,この 3 つの値を取得する方法を考えた.

リストに含まれるユーザの screen_name の一覧は TweetDeck の "Edit List" で開くモーダルから得られた.id は TweeterID - Twitter ID and username converter を使って取得することにした.

残りの名前だが,これを取得できるサービスは見つからなかった.Tweetdeck のリスト編集画面で名前と screen_name が表示されているので HTML をパースしてその 2 つを取得することにした.

実装

Beautiful Soup は使わなくてよさそう

HTML のパースといえば Beautiful Soup だが,やりたいことは単に文字列を抽出することなので正規表現で実現することにした.

<span class="username">.*?</span>

これで名前を含む span タグを抜き出せる.?は最短マッチを表している.

抜き出した後は以下の正規表現で余分な部分を除去した.

(?<=\>).+?(?=\<)

タグの InnerText は><で囲われているので,先読みアサーションと後読みアサーションで囲われた部分のみを取得した.

……あれ,これわざわざ分ける必要ないよね?

Reqeusts も使わなくて良さそう

小さなコードなのでライブラリを使う必要もないかなと思ったので httplib を使った.書き方をいつも忘れる.

request = urllib.request.Request(
    <URL>,
    data=<byte文字列>,
    method="POST",
)
with urllib.request.urlopen(request) as response:
    text = response.read().decode()

Request で組み立てて urlopen で実行する.

urllib.request --- URL を開くための拡張可能なライブラリ — Python 3.10.4 ドキュメントurllib パッケージを使ってインターネット上のリソースを取得するには — Python 3.10.4 ドキュメント を見て解決.

書いたコード

twitter_list_to_fritter.py · GitHub

正規表現をシュッと書けるようになりたい.「いつか勉強するリスト」には正規表現が入っているが,いつになったらやれるのか.DMM で買った 100 冊もたくさん積んであるのに.