GNU Social のボットを C++ で作る

プログラミング界隈の姫になるためにはツイッターのボットをPHPで作ることが有効であることが知られています。しかし、ツイッターは2018年を迎えられないかもしれないので、かわりにGNU Socialのボットを作ります。あと、2017年にもなってPHPを学ぶのもダサいので、C++でやります。

GNU Socialは自由なソフトウェアとして実装されたツイッタークローンです。外見はツイッターを丸パクリしている (補足: Qvitterというプラグインを入れるとツイッターそっくりな外見になります。オリジナルのUIはダサいです。) ので、簡単に移行できます。ツイッターにはない特徴として、複数のサーバーの連合であることが挙げられます。すなわち、有志がそれぞれサーバーを建てて、それらが互いに情報を共有することでGNU Socialの全体が成り立っています。ユーザーは所属したいサーバーを選んでユーザー登録します。他のサーバーのユーザーをフォローすることもできる (ただし操作のクリック数がちょっと多い) し、検索とハッシュタグはすべてのサーバーで共有されます。地味に不便なところとしては、他のサーバーから流れてくる画像は、埋め込みではなくリンクになります。これは不便ですが必要な仕様で、悪意のあるサーバーがユーザーの閲覧履歴を勝手に取るのを防ぐためだと思います。

FAQとしては、スマートフォンアプリなどという軟弱なものはありません。がんばってウェブUIを使ってください。

あと、用語の説明ですが、ツイッターの「ツイート」に相当するものはGNU Socialでは「クイップ」と呼びます。

GNU Socialは複数のサーバーの連合なので、好きなサーバーを選べばいいのですが、日本では FreezePeach を選ぶ人が多いです。これは Kawana Kiyoshi が誘致したのがきっかけのようです。特にこだわりがなければFreezePeachを選べばよいのですが、注意が必要なのは、女児の水着姿をクイップするとWe have 1 simple ruleされるということです。

GNU SocialのAPIは AtomPub 形式と Twitter互換 形式があります。AtomPubのほうが仕様がきれいなのですが、誰も使ってないみたいなので、Twitter互換のやつにします。

例として、サーバーは freezepeach.xyz、ユーザー名は vaginaplant、パスワードは XXXXX で、LGBTPZN という文字列をクイップしたいとします。とりあえず wget コマンドで試します。

wget -O - \
    --http-user=vaginaplant \
    --http-passwd=XXXXXX \
    --post-data='status=LGBTPZN' \
    https://freezepeach.xyz/api/statuses/update.json

あとはこれをC++でやります。定番のcURLです。パスワードは /etc/fubai-gnusocial-password というファイルに書いてあると思ってください。なお、このファイルを他人に読まれるとセキュリティが終了します。

#include <curl/curl.h>
#include <string>
#include <fstream>

using namespace std;


static int writer
    (char * data, size_t size, size_t nmemb,
    std::string * writerData)
{
	if (writerData == nullptr) {
		return 0;
	}
	writerData->append (data, size * nmemb);
	return size * nmemb;
}


void quip (string message)
{
    CURL *curl;
    CURLcode res;
    curl_global_init (CURL_GLOBAL_ALL);
    curl = curl_easy_init ();
    if (! curl) {
        return;
    }

    curl_easy_setopt (curl, CURLOPT_URL,
        "https://freezepeach.xyz/api/statuses/update.json");

    string user_name {"vaginaplant"};
    string password;
    ifstream secret_file {"/etc/fubai-gnusocial-password"};
    secret_file >> password;
    string userpwd = user_name + string {":"} + password;
    curl_easy_setopt (curl, CURLOPT_USERPWD, userpwd.c_str ());

    curl_easy_setopt (curl, CURLOPT_POST, 1);

    string arguments = string {"status="} + message;
    curl_easy_setopt (curl, CURLOPT_POSTFIELDS, arguments.c_str ());

    string reply;
    curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt (curl, CURLOPT_WRITEDATA, & reply);

    res = curl_easy_perform (curl);

    if (res != CURLE_OK) {
        return;
    }
    curl_easy_cleanup (curl);
    curl_global_cleanup ();
}

quip 関数の message 引数に適当な文字列を入れてください。リンクとハッシュタグは自動的に解釈されます。

読者の知識をどのくらいに想定すればいいのかわからないのですが、リンクするとき -lcurl を指定すべきであることを申し添えます。

フリップフラッパーズ イロドリ先輩メインSS (改訂)

(13話を視聴したので設定を合わせました。改訂前。)

美術準備室には先輩がいた。先輩の指先にマニキュアが光る。

「先輩、私、先輩の絵が好きです! だから、もう、絵が邪魔だなんて、言わないでください。」

「ああ、あれね。ごめんね、ちゃんと説明してなくて。でも安心して。絵が嫌いになったわけじゃない。ここは狭いし、それに、いまは新しい絵をたくさん描きたいんだ。」

テーブルには、このまえ見たのとは違う、花柄のティーカップが3個。でも、紅茶が注がれるのは、私たち二人分だけ。

先輩が絵を捨てたのは、たぶん、三人でこの部屋にいても狭くないようにするためだったと思う。

アモルファスの力が失われて、ヤヤカたちもピュアイリュージョンには行けなくなった。お母さんとパピカは、ピュアイリュージョンに閉じ込められている。

でも、先輩となら、もう一度、ピュアイリュージョンに行ける気がする。先輩の変身アイテムは、マニキュアのびん。

二人で手をつないで考える。イロちゃんのこと、おばちゃんのこと、お母さんのこと。

そして、パピカのこと。

先輩も、きっと、パピカのことを思ってる。

待ってて、パピカ! いま迎えに行くから!

素早くドメインを取得し、ウェブサイトを構築する

LGBTPZN Advent Calendar 2016 参加記事。

2016年9月26日の柚子革命の当日、私は lgbtpzn.org ドメインを購入した。翌日にはLGBTPZN.orgのウェブサイトが一通り完成した。ウェブサイトのトップページの内容は、そのときから現在までほとんど変わらない。

私はこのときすでに fubaiundo.org ドメインを購入していたので、素早く行動することができた。どちらのドメインも No-IP から購入した。このくらい長い名前の org ドメインは30ドル/年くらいで購入できる。クレジットカードを持っていれば手続きはすぐだ。

注意点として、ドメイン名を購入するときに、氏名、住所、電話番号などの個人情報の入力を求められることだ。これらの情報は whois データベースで公開される。詳しくは whois でググってくれ。いずれにせよ、No-IPではドメイン名をプライベートモードで取得することができる。すると、whoisに登録される個人情報はNo-IPのものになる。これで、匿名で奇妙なウェブサイトを運営しても安心だ。

ドメイン名を購入したら、次はウェブサイトを作ろう。GitHub Pages で作るのが簡単だ。GitHub Pagesでウェブサイトを作る方法は適当にググってもらうとして、ここでは独自ドメイン名を使う方法だけ説明する。まず、所有しているドメイン名を、GutHubのしかるべき設定項目に書く。GitHubの設定画面にはIPアドレスが書いてあるので、No-IPの設定画面のそれっぽい場所にIPアドレスを書く。これで終わりだ。具体的な方法を何一つ説明していないが、ここで細かいことを書いてもどうせすぐに変わってしまうので、概念的なことだけ説明すればよいだろう。

一度やり方を覚えれば、ツイッターで何かが流行するたびに、適当なドメイン名を購入して、その日のうちにウェブサイトを開設することができる。ツイッターでは社会運動を30分で始めることができる、ただし30時間で忘れ去られる。一連の動作をいかに素早く完遂するかが、ツイッターのスピードについていくための鍵だ。