2020-01-15に更新

Twitter Gemの現状と、メンテされていないGemを使い続ける方法

まとめ

Twitter Gemがメンテされなくなっているので、自分が気になる不具合の修正を取り込んだ mogya/twitter-gem を作ったよ。

Twitter Gemの現状

RubyでTwitterAPIを使うには、sferik/twitter が定番になっています。gem install twitterして入るのもこのGemだし、Twitter開発者サイトでも紹介されている著名なGemです。

が、このライブラリは2018/6のコミットを最後にアップデートが行われていなくて、たくさんのPRが残ったままになっています。
もはやコードが完璧でいかなる修正も必要ないのであればそれでもいいのですけど、ぼくがさわった範囲でも結構困るような不具合があって、それに対する修正PRが出されているのだけれど、マージされないまま放置されているのが現状です。

OSSというのはそういうものなので、sferikさんを責める気は全然ありません。長い間メンテしてくださってありがとうございます。とはいえ、現に今TwitterAPIを使いたいのに不具合で動かないのは困る。

extended mode問題

例えば、tweet_mode=extendedにした時、textが取れなくなる。
Cannot retrieve text · Issue #813

client = ...
status = client.status(1216628579099766784, tweet_mode: "extended")
status.text
=> <null>
status.full_text
=> <null>

tweet_modeは2017年ごろに導入された後方互換性のためのフラグで、最近のTwitterクライアントは、基本tweet_mode: "extended"で利用することが想定されています。それを付けて呼び出すとツイート本文が取れないという、かなり基本的な部分で困る不具合です。

当然複数の修正が提案されているのですが、どれもマージされないまま放置されてしまっています。

ぶっちゃけこの問題だけなら、PRのコードをコピペしてinitialize/twitter_patch.rbみたいなファイルに書いておけばごまかせるわけですが、今後もこのライブラリが更新されないということは、こいつのせいでRailsがアップデートできないとか、新しいRubyを利用できないといった問題が予想されます。

後継Gemを探せ

Twitterで相談したところ、こういうときの後継Gemを探す方法を教えてもらいました

実際に見たのがこちら。
image.png
https://github.com/sferik/twitter/network

右に行くほど新しいブランチで、sferikさんのオリジナルからforkしている人をたくさん見つけることができます。PR名が出ているので、その人が何をしたのかだいたい分かります。

●をクリックすると該当レポジトリを見ることができるのですが、たいていの人は、sferikさんのコードになんか修正を加えてそのまま終わっています。ぼくみたいに特定の問題について困ったから、そこだけ修正して使っておこうという感じですね。

ただそれだと、RubyとかRailsの更新についていけなくなるのが困る。そう思ってリポジトリを次々みていくと、ピンとくる名前を見つけました。

https://github.com/zendesk/twitter

ZenDeskはユーザーサポートを一元化するための有名サービスで、Twitterからの問い合わせも対応できるようになっています。ここで使われているのなら継続的にメンテしてくれることを期待できそうです。

そうおもって更新履歴を見ると
image.png
あたらしいRubyへの対応とか、動かない箇所の修正とか、去年の夏まで継続的に修正が加えられています。これなら期待できそう。

ただひとつ問題なのは、最初に述べたextended textへの対応は入ってないようです。Zendeskの人は困ってないのかなあ。

俺Gemを作る

しょうがないので、zendesk/twitterからさらにForkしてmogya/twitter_gem を作ることにしました(mogya/twitterは他の名前で使ってしまっているので、別の名前にしてあります)

zendesk/twitterをForkしたあと、自分が取り込みたいPRを持ってきてマージします。この記事が参考になりました。
GitHub 特定のPRをForkしたローカルリポジトリに取ってきたい - かもメモ

[ ~/develop/twitter-gem]$ git remote add sferik [email protected]:sferik/twitter.git
[ ~/develop/twitter-gem]$ git remote -v
origin  [email protected]:mogya/twitter-gem.git (fetch)
origin  [email protected]:mogya/twitter-gem.git (push)
sferik  [email protected]:sferik/twitter.git (fetch)
sferik  [email protected]:sferik/twitter.git (push)
[ ~/develop/twitter-gem]$ git fetch sferik pull/913/head:fulltext
agent key RSA SHA256:+UeiGLqOys7Ur3KBSq4c10jM4fWlFnacby3izYyfMZg returned incorrect signature type
From github.com:sferik/twitter
 * [new ref]           refs/pull/913/head -> fulltext
10:37:03[[email protected] ~/develop/twitter-gem]$ git push origin fulltext
:
remote: Create a pull request for 'fulltext' on GitHub by visiting:
remote:      https://github.com/mogya/twitter-gem/pull/new/fulltext
remote: 
To github.com:mogya/twitter-gem.git
 * [new branch]        fulltext -> fulltext

このままgitでマージしても良さそうなのだけれど、なんとなくgithub上でPR作ってマージしておきました。
https://github.com/mogya/twitter-gem/pull/1

ついでにtravis-ciもぼくのものに置き換えたところ、無事テストがPassしたようです。
image.png
https://travis-ci.org/mogya/twitter-gem

出来上がったのがこちら。mogya/twitter-gem

Gemfileに gem "twitter"と書くところでぼくのリポジトリを指定します

gem 'twitter', github: 'mogya/twitter-gem'

使ってみる

[2] pry(main)> client = ...
[3] pry(main)> status = client.status(1216628579099766784, tweet_mode: "extended")
[4] pry(main)> status.text
=> "「実際にアプリ☆メーカーも、それまでに作ったサービスで宣伝して初期ユーザーを集めました。そしてマシュマロも、アプリ☆メーカーから初期ユーザーを集めました。雪だるま式戦術がうまくいった例です。」

「持たざる者」の集客方法|だーすー @Neko_Inu_ #note  https://t.co/hKs4NfSQTj"
[5] pry(main)> status.uris
=> [#<Twitter::Entity::URI:0x00005582b377a638 @attrs={:url=>"https://t.co/hKs4NfSQTj", :expanded_url=>"https://note.com/neko_inu/n/nfae33c222614", :display_url=>"note.com/neko_inu/n/nfa\u2026", :indices=>[134, 157]}>]

よし完璧。Network graphにも、mogyaの名前が表示されるようになりました。

image.png

当面はこの状態で、zendeskの人がなにかアップデートしたら取り込むし、ぼくが使っていて困る不具合を他に見つけたらPRを取り込む感じで運用しようと思っています。

ここからさらに、みんなに呼びかけて支持者を集めて、sferikさんからTwitter Gemの管理権を禅譲してもらえば、ぼくがTwitter Gemのメンテナになることができる可能性があります。OSS contributorの名前は憧れるし、語学力的にできないこともなかろうと思うのですが、普通に考えるとZendeskのみなさまのほうがふさわしいと思うし、なにより、TwitterのすべてのAPIについて使い方を把握して、いま出ているissueを全部さばくとなると、それはちょっと片手間ではできなさそう。
どっか困っている会社さんが毎月5万円くらい払ってくれるということであれば検討するので、興味のある方はご連絡ください:-)

ツイッターでシェア
みんなに共有、忘れないようにメモ

daisuke furukawa

おひるねのできるフリーランサー。「モバイラーズオアシス」の中の人でもあります。

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

コメント