とあるサークルのWEB大臣としてTweetを自動でブログに投稿するプログラムを作った話。

この記事はCAMPHOR- Advent Calender 2018 8日目の記事です。

偉大なる先輩シバニャンさんからバトンを受け継ぎました。
はじめまして、京大工学部地球工学科3回のトリと申します。

今年の10月の始めからCAMPHOR-にちょくちょくお邪魔し始めた新参者なので、自己紹介を兼ねて今までにやったことの一つを紹介しようと思います。タイトルにあるようにTweetを自動でブログに投稿するプログラムのお話です。

プログラムを作ろうと思った経緯

一回生の12月から2回生の12月までとあるアウトドアサークルのWEB大臣をしていました(というとアウトドアな人かと思われそうですが実際はインドアです。おうちだいしゅき人間。たまにアウトドアするのは楽しい。)。WEB大臣はホームページの管理を任されているのですが実際やることといえば新歓期に情報をUPするくらいでそんなに高度なことが要求されるわけではありません。
そんなWEB大臣としてとある問題に直面します。

それはブログの投稿頻度低すぎイ問題です。弊サークルはアウトドアサークルといっても実際のところチャリやバンで日本中を飛び回ることが活動の中心で、その旅行中の出来事をブログ(livedoor)に投稿して発信していくことに代々なっています。しかし当時、ブログ投稿よりも、自分のアカウントでのTwitter投稿を選ぶ人が大半でTwitterとブログの両方に投稿するのは面倒くさい…という状況になっていました。これは主に原因が2つあったと思われます。一つ目として、Twitterは投稿に対して友達・知り合いとファボ(当時)やリプライのフィードバックがあって楽しいが、ブログはフィードバックがなく投稿が見られている感じがあまりないこと。二つ目として、ブログへはメールで投稿できたが送信データ量の関係で画像サイズが小さくなってしまいブログの見栄えがかなり悪かったこと(拡大しないと何の画像かわかりにくいようなレベル)。

ブログについてWEB大臣は代々あまり関わっておらず、サークルの会長が一部やってくれていました。実際この問題もブログ投稿を喚起させる程度で見過ごす方法もありました。しかし当時は、アルバイトで1からプログラミングの勉強をしていて(というよりする必要があり)、なにか自分でホームページやブログをいじったりプログラムを書いたりしたいと思っていました。そのためこの問題をなんとか解決したいと考えました。

しかしこの問題はかなり根深く、ブログをlivedoorから引っ越してモダンで魅力的な見た目のブログにするなどしたところでTwitterの魅力には打ち勝てそうにもありませんでした。Twitterの力は強大です。そこでTwitterを打ち負かすのではなく、Twitterとの共存の道を模索しました。Google先生と相談し、なにかよさそうなすぐに使える既成物がないか確認しましたがよさそうなものが見つかりませんでした。しかしGoogleの広大な海を渡り歩いているうちにTwitterAPIとWordPressのXML-RPCいうものを発見しました。ブログをWordPressに引っ越してプログラムを載せればTwitterからブログに投稿できるようになり問題はすべて解決するのではないか!

おそらくこの考えを思いつくことが出来たのはバイトで楽天のAPIを叩くことを勉強したからだと思います。外部からAPIで操作できるという知識がなければ、またもしプログラミングに対する知識がなければこのような考えは思いつかなかったでしょう。

実装

当時C#がメインでPHPは入門書をかじった程度だったのですが、レンタルサーバー(ロリポップ)で動作させる関係上、C#が使えないのでPHP(7.1)でつくることにしました。

まずどのTwitterAPIを使うか考えました。リファレンスが英語しかないのと、かなり多くのAPIがあるため混乱しましたがstatuses/user_timelineというユーザーごとのツイートを取得できるREST APIを発見しました。数分おきにcronで回せばほぼリアルタイム投稿が実現できそうですね。また。このAPIはTwitterトークンを発行したアカウントのみしかツイートが取得できないためOAUTH認証フローを踏ませる必要があるものの、認証さえすれば鍵アカのツイートも読み込めるためこれがベストだと判断しました。OAUTH認証とTwitterのAPIを叩くのに便利なライブラリがあったと思うのですが、PHPでのライブラリ利用がよくわかっていなかったのと、TwitterAPIの分かりやすい使い方解説があったのでライブラリを使わず実装しました。さらに手続き型でとりあえず動くことを最優先で書いたので、かなり迫力のあるソースコードに仕上がっていると思います。正直ライブラリを使っておけばもう少し簡単に、美しく実装できたかなと反省しております。

WordPressのXML-RPCについては情報が少なめだったのですがWordPressにXML-RPCとPHPをつかって記事を自動投稿する方法を参考に頑張りました。どこからか忘れましたがXML-RPCのクライアントをダウンロードして使いました。

美術1の手書き図で恐縮ですが仕様概要は最終的に以下の通りになりました。

地獄のソースコードはこちらにおいておきます。https://github.com/hattorikoji/twi2wp

ここからは簡単にですがプログラムの解説をします。まず準備としてアカウントを認証してもらいトークンをtwittertoken.jsonに追加し、ブログやハッシュタグに使う”カテゴリー”は図にあるように#”カテゴリー” #追加 という二つのハッシュタグを含んだツイートによりcategory.jsonに追加しておきます。次からがメインフローです。以下はcronで5分おきに実行します。
認証したユーザーのタイムラインをみていって5分以内に投稿されたもので#”タイトル”,#”カテゴリー”の二つのハッシュタグを含むもののみを抽出します。”カテゴリー”がcategory.jsonに含まれている場合、画像と文章を適当に成形してWordPressの”カテゴリー”を付けてXML-RPCで投稿するというものです。

完成後の反響など

とりあえず動くものをテストサーバーにのせてサークル員にテスト投稿をお願いしてもらったら意外にも多くの人がテストしてくれて、感動したのを覚えています。自分の作ったものが使われるのはたまらなくうれしいですね。その後ある程度安定してきたのを見て実際にレンタルサーバーを借りて本番運用を始めました。サービスの運用が初めてだったのでテストやテスト環境というものを知らず、デバッグなどもかなりいい加減になってしまって最初は色々と不具合を出しまくっていました。ですが、なんだかんだ多くの人が使ってくれてブログ投稿がかなり増えました。かなり概算ですが以前と比べブログのPVは10倍ほどになりうれしい限りです。

つまずいたところや問題点

・TwitterAPIの暗黙パラメータ
文字数の多いツイートの場合、APIで取得した時デフォルトだと後ろの方の文章が読み込めません。この仕様はTwitter公式リファレンスのAPIの使い方欄に書かれておらず初見殺しです。ググったらなんとか出てきて、APIでたたくときにパラメータとしてtweet_mode=extendedを与えないと全文取得できないんですの。書いときなさいよ
・XML-RPCよりWordPress REST APIの方がモダン?
最近知ったのですがWordPressでもREST APIが提供されているのでそちらの方がいいのかもしれません。
・高度なことやりすぎてWEB大臣の仕事として引き継げるものではない
ずっと平穏に動いてくれるのならいいのですが、TwitterAPIの仕様変更やPHPのバージョンアップ、WordPressの仕様変更などがやってきたときに対処できる人がいるはずもなく…。ちょっと負の遺産感があります。今のところ僕が終身サポートするつもりです。

正直もっと躓いたところは色々ありますが細かい話になるので省略。

今後の展望

今のプログラムをWEBサービスとして提供したらどうなるだろう?とこのアドベントカレンダーを書いてて思いつきました。個人での需要はあまりないかもしれませんが団体での需要はワンチャン?ただ行く手を阻むのはTwitterAPIの利用申請ですね・・・笑 これのプログラムを作り始めたときはお遊び感覚でTwitterAPIを叩けていい時代でした。

質問等あればコメントお待ちしています。

CAMPHOR-AdventCalender2018の明日の担当はKojiAomatsuさんです。またまた偉大な先輩です。楽しみですね!

このエントリーをはてなブックマークに追加

↓拡散・いいねしてしていただけるとハットリのやる気がモリモリ湧いてきます。↓

  • このエントリーをはてなブックマークに追加

↓ハットリブンコをフォローする↓