Twitter Gemがメンテされなくなっているので、自分が気になる不具合の修正を取り込んだ mogya/twitter-gem を作ったよ。
RubyでTwitterAPIを使うには、sferik/twitter が定番になっています。gem install twitterして入るのもこのGemだし、Twitter開発者サイトでも紹介されている著名なGemです。
が、このライブラリは2018/6のコミットを最後にアップデートが行われていなくて、たくさんのPRが残ったままになっています。
もはやコードが完璧でいかなる修正も必要ないのであればそれでもいいのですけど、ぼくがさわった範囲でも結構困るような不具合があって、それに対する修正PRが出されているのだけれど、マージされないまま放置されているのが現状です。
OSSというのはそういうものなので、sferikさんを責める気は全然ありません。長い間メンテしてくださってありがとうございます。とはいえ、現に今TwitterAPIを使いたいのに不具合で動かないのは困る。
例えば、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を利用できないといった問題が予想されます。
Twitterで相談したところ、こういうときの後継Gemを探す方法を教えてもらいました
有名なgemがメンテ放置されて、有用そうなPRがいっぱい放置された状態になってるのね。forkしてそういうパッチを取り込んだものを公開している人がたぶんいると思うんだけど、そういうリポジトリを探す方法ってないもんでしょうか?
— もぎゃ(daisuke furukawa) (@mogya) January 14, 2020
Insights タブの中の Network graph を見ると、最近も開発・メンテされている Fork 先のリポジトリを見つけることができると思います。https://t.co/pZy6jEvSFu
— peaceiris (@piris314) January 14, 2020
実際に見たのがこちら。
https://github.com/sferik/twitter/network
右に行くほど新しいブランチで、sferikさんのオリジナルからforkしている人をたくさん見つけることができます。PR名が出ているので、その人が何をしたのかだいたい分かります。
●をクリックすると該当レポジトリを見ることができるのですが、たいていの人は、sferikさんのコードになんか修正を加えてそのまま終わっています。ぼくみたいに特定の問題について困ったから、そこだけ修正して使っておこうという感じですね。
ただそれだと、RubyとかRailsの更新についていけなくなるのが困る。そう思ってリポジトリを次々みていくと、ピンとくる名前を見つけました。
https://github.com/zendesk/twitter
ZenDeskはユーザーサポートを一元化するための有名サービスで、Twitterからの問い合わせも対応できるようになっています。ここで使われているのなら継続的にメンテしてくれることを期待できそうです。
そうおもって更新履歴を見ると
あたらしいRubyへの対応とか、動かない箇所の修正とか、去年の夏まで継続的に修正が加えられています。これなら期待できそう。
ただひとつ問題なのは、最初に述べたextended textへの対応は入ってないようです。Zendeskの人は困ってないのかなあ。
しょうがないので、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[daisuke@linode17 ~/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したようです。
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の名前が表示されるようになりました。
当面はこの状態で、zendeskの人がなにかアップデートしたら取り込むし、ぼくが使っていて困る不具合を他に見つけたらPRを取り込む感じで運用しようと思っています。
ここからさらに、みんなに呼びかけて支持者を集めて、sferikさんからTwitter Gemの管理権を禅譲してもらえば、ぼくがTwitter Gemのメンテナになることができる可能性があります。OSS contributorの名前は憧れるし、語学力的にできないこともなかろうと思うのですが、普通に考えるとZendeskのみなさまのほうがふさわしいと思うし、なにより、TwitterのすべてのAPIについて使い方を把握して、いま出ているissueを全部さばくとなると、それはちょっと片手間ではできなさそう。
どっか困っている会社さんが毎月5万円くらい払ってくれるということであれば検討するので、興味のある方はご連絡ください:-)
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント