株式会社はてなに入社しました
黒服つながりです
注)タイトルは半分釣りです
LINE TIMELINE をスクレイピングするためのgemを作りました。
cure_line (0.1.1): LINE TIMELINE scraping tool https://t.co/Xoeo4XXjVd
— RubyGems (@rubygems) 2018年3月20日
READMEからの抜粋ですがこんな感じ
# read https://timeline.line.me/user/_dYbbV3vmaJrvqBoV5ZlpCbPN2CWUZdDQayBvjBE user = CureLine.user("_dYbbV3vmaJrvqBoV5ZlpCbPN2CWUZdDQayBvjBE") user.info #=> {"mid"=>"_dYbbV3vmaJrvqBoV5ZlpCbPN2CWUZdDQayBvjBE", # "nickname"=>"プリキュア", # "pictureUrl"=>"https://profile.line-scdn.net/0hU_sA3K0gCnBOOCZuQUx1J3J9BB05Fgw4Nl9BQmxsUEZjCU0jewlCFWo-UEk3CRhxdQtCQ20_VRBk", # "userValid"=>true, # "writerMid"=>"_dYbbV3vmaJrvqBoV5ZlpCbPN2CWUZdDQayBvjBE"} user.header_url #=> "https://obs.line-scdn.net/htzWKFLgwN1RRXiRaCAgwLR0sfTZOB28EU1VjYxs0IWYTAjkDUFViZhhgJjJHUmRR" post = user.posts.first post.nickname #=> "プリキュア" post.picture_url #=> "https://profile.line-scdn.net/0hU_sA3K0gCnBOOCZuQUx1J3J9BB05Fgw4Nl9BQmxsUEZjCU0jewlCFWo-UEk3CRhxdQtCQ20_VRBk" post.post_url #=> "https://timeline.line.me/post/_dYbbV3vmaJrvqBoV5ZlpCbPN2CWUZdDQayBvjBE/1152127900305060448" post.text #=> "プリキュアになってから、さあやとほまれとますます仲良くなれて、\n超うれしー!!\(^o^)/\n今日はビューティーハリーで、お互いに洋服をコーディネイトし合ったんだ~。\n\nさあやは、大人っぽいデザインのスカートがめっちゃ似合ってた!\nう~ん、絵のモデルさんになれそうなくらい素敵!( *´艸`)\n\nほまれはオシャレ上級者しか着こなせないような、最先端のオールインワンがぴったり!\n背が高くて、足が長い人はいいな~、うぅ……(T_T)\n\nはぐたんはくまさんの耳がついたフードをかぶって……。\nきゃ、きゃ、きゃわたん~~~~(・´з`・)\n拝みたくなる可愛さでした♡\n\nで……私は!?私は何が似合うかな!?\nえっ……ハリーおすすめのどデカイ虎の絵が描いてあるトレーナー!!?\nみんな、似合ってるって言ってくれるけど……お腹抱えて笑ってるじゃん!!ヽ(`Д´)ノプンプン\n\nう~ん、でも言われてみれば、たしかに似合ってるような……。\nこれを着こなせるって、逆にすごいかも☆(^ε^)\nはぁ~、今日もいい一日でした!" post.created_time #=> 2018-03-17 18:30:03 +0900 post.updated_time #=> 2018-03-17 18:30:03 +0900 post.photo_urls #=> ["https://obs.line-scdn.net/h5XG4_2KndnZXIWV4GHdxDwZTY0ZUe34iR3snQghNNkNUfSx0Qy4lRF9PPERUeS8iQy9gFwtOYENTfg"]
個人Slackでプリキュアのタイムラインを通知するのに使ってます
元々はcure_line自体も個人Slackのボットの一機能だったのですが、今回gem化してロジックを外部に切り出しています
「リンク集」って響きに懐かしさを感じるオッサンです(挨拶)
自分の勉強会のスライドの公開先はSlideshareやSpeakerDeckやGitHub Pagesなどその時の気分で変わるんですが*1、後から探す時に不便だったのでまとめました。ご査収ください
これ系のリンク集があると人に見せやすいのでおすすめ。特に前者の1人AdventCalendarは自分のプロダクト紹介でよく使ってます
Meguro.rb#12 で趣味アプリについてのLTしたので資料を上げておきます
@
的なやつが欲しくて作った
ChatWorkのAPIのリフレッシュトークンの有効期限は2週間なので、リフレッシュトークンが切れる3日前にリマインド用にタスクを作るようにした
webhookの params[:body]
にチャット本文が入っていて、それがログに出るのが嫌だったのでパスワード同様フィルタリングするようにした。
https://github.com/sue445/chatwork_mention_task/commit/ec3e2583044e2c132ef1de9ef0c656f1e74dcac1
https://github.com/sue445/omniauth-chatwork
Railsだとこんな風に書いておくだけでいい感じにChatWorkのOAuth認証が使えるようになる
# config/initializers/omniauth.rb Rails.application.config.middleware.use OmniAuth::Builder do provider :chatwork, ENV["CHATWORK_CLIENT_ID"], ENV["CHATWORK_CLIENT_SECRET"], scope: ["users.profile.me:read", "rooms.tasks:write", "rooms.info:read"] end
https://github.com/asonas/chatwork-ruby
stub_chatwork_request
と it_behaves_like :a_chatwork_api
でramlを利用describe ".create", type: :api do subject { ChatWork::Message.create(room_id: room_id, body: body, &block) } let(:room_id) { 123 } let(:body) { "Hello ChatWork!" } before do stub_chatwork_request(:post, "/rooms/#{room_id}/messages", "/rooms/{room_id}/messages") end it_behaves_like :a_chatwork_api, :post, "/rooms/{room_id}/messages" end
https://github.com/asonas/chatwork-ruby/blob/v0.8.0/spec/lib/chatwork/message_spec.rb#L24-L35
before_action
から呼んでやるだけでOK 🙆# app/controllers/webhook_controller.rb class WebhookController < ApplicationController before_action :verify_chatwork_webhook_signature! end
リクエストごとにtokenを変えて検証する必要がある場合はこんな感じ
class WebhookController < ApplicationController before_action :set_user before_action :verify_signature! private def verify_signature! return unless Global.app.verify_signature? verify_chatwork_webhook_signature!(@user.webhook_token) end end
sue445/heroku-cli
が最軽量常に最新のheroku/cliをDockerイメージで使いたかったので、heroku/cliの更新を自動検知してDockerイメージを自動ビルドする仕組を作った
Deploy to Herokuボタンに対応してるので、Herokuのアカウントさえあればワンクリックでデプロイできる
ChatWorkのAPIのリフレッシュトークンの有効期限は2週間なので、リフレッシュトークンが切れる3日前にリマインド用にタスクを作るようにした
リフレッシュトークンの期限を無期限に設定できるようになったので上記処理は不要になりました
Rails Developers Meetup 2017 というイベントで「OSS雑メンテ」という発表をしたのでスライドをシェアさせていただきます
— シロ (@shiroemons) 2017年12月9日
— kaiba (@kaiba) 2017年12月9日
栗のアイコン見たことある! #railsdm
— 🌈 (@ppworks) 2017年12月9日
毎年プリキュアのAdvent Calendar立ててる人だ! #railsdm
— 黄色 (@iyanayatudaze) 2017年12月9日
一瞬カラフルな背景が見えた #railsdm
— ゆっき:Lv6 (@yucky_sun) 2017年12月9日
栗の人だ #railsdm
— はのにゃーん (@broken_peter) 2017年12月9日
— onkさんに2k円借りてるジョーカー (@joker1007) 2017年12月9日
がんばえ、ぷいきゅあー!
— るっか和尚 (@lucca0show) 2017年12月9日
#railsdm
ルビキュアの人 #railsdm
— シロ (@shiroemons) 2017年12月9日
安定の黄色キュア #railsdm
— 黄色 (@iyanayatudaze) 2017年12月9日
— はたっぴ (@hatappi) 2017年12月9日
sueさんの発表聞くと、今季のプリキュアの名前が一人は分かるから便利。 #railsdm
— onkさんに2k円借りてるジョーカー (@joker1007) 2017年12月9日
現状、自分の中のドリコムのイメージがすごい #railsdm
— スコーン@エンジニア1年生 (@ayacai115) 2017年12月9日
— dyoshimitsu (@dyoshimitsu) 2017年12月9日
そういえばCI設定しないと#railsdm
— はたっぴ (@hatappi) 2017年12月9日
gemならTravis、アプリならCircleCI #railsdm
— 黄色 (@iyanayatudaze) 2017年12月9日
定期ビルド結構大事ですよね。 #railsdm
— onkさんに2k円借りてるジョーカー (@joker1007) 2017年12月9日
依存先の変更でgemが壊れるから定期ビルドはデイリービルドの考え方だ #railsdm
— 黄色 (@iyanayatudaze) 2017年12月9日
定期的なアップデート大事 #railsdm
— ゆっき:Lv6 (@yucky_sun) 2017年12月9日
定期的にCI回すの良いですね #railsdm
— willnet (@netwillnet) 2017年12月9日
gemの定期CIよさそう #railsdm
— kymmt (@kymmt90) 2017年12月9日
定期ビルド大事
— はたっぴ (@hatappi) 2017年12月9日
たまにしかメンテしないやつとかビルド方法すら忘れる#railsdm
CIを設定しましょう。bundle updateしましょう。 #railsdm
— kaiba (@kaiba) 2017年12月9日
一度に大量アップデートは辛い #railsdm
— 黄色 (@iyanayatudaze) 2017年12月9日
「細かい粒度でアップデートしたほうが良い」 今まさにtachikoma導入しててすごく実感している
— わかば (@wakaba260yen) 2017年12月9日
#railsdm
定期的なbundle update必要だよなー。検討せねば #railsdm
— freedomな人 (@tzm_freedom) 2017年12月9日
"自分が Pull Request を出すときに master が壊れていると凄く嫌だ" わかる #railsdm
— Koichi ITO (@koic) 2017年12月9日
gem40個ってすごいなあ #railsdm
— スコーン@エンジニア1年生 (@ayacai115) 2017年12月9日
おfork #railsdm
— ワープレコード (@mactkg) 2017年12月9日
おforkください #railsdm
— willnet (@netwillnet) 2017年12月9日
おforkください #railsdm
— うし (@yono) 2017年12月9日
メンテコスト下げるのかなり大事だと思うから参考になった #railsdm
— 黄色 (@iyanayatudaze) 2017年12月9日
Deppbot などで自動定期bundle updateとか走らせているとCIが壊れていないか定期的に監視できて便利 #railsdm
— toshimaru (@toshimaru_e) 2017年12月9日
tachikoma試してみようかな #railsdm
— katzchum (@katzchum) 2017年12月9日
他の人のスライドは下記をご覧ください
注意:アドベントカレンダーとは全く関係ないエントリです
https://rubygems.org/gems/chatwork
chatwork-rubyにPRを送りまくってたら気づいたらメンテナになっていました
asonas/chatwork-ruby のコラボレーター権とrubygemsにpushできる権限を追加しようと思うんですが、いかがでしょうか?
— あそなす (@asonas) 2017年11月29日
他にも Jenkins ChatWork Plugin のメンテナにもなったし*1、omniauth-chatwork も作ってるので、日本におけるChatWork APIのヘビーユーザと言っても過言ではなさそう(過言)
chatwork-rubyの方は権限周りの動作確認も兼ねてOAuth対応版をリリースしておきました
chatwork (0.5.0): ChatWork is cloud-based business chat tool https://t.co/j04N4Ee7hk
— RubyGems (@rubygems) 2017年11月29日
OAuth対応版リリースしました!(メンテナ初仕事) https://t.co/yriFmvDfn1
— sue445 (@sue445) 2017年11月29日
プライベートが色々ごたついているので、落ち着いたらテスト周りの整備をしつつ対応してないエンドポイントの対応をしておこうと思ってます。
先日のブログの続編です
うちの会社ではChatWorkをSAML連携させて利用しています。
SAML連携したChatWorkアカウントだと普通のやり方ではOAuth認証できません。一応できるんですがやり方が難しすぎて初見だとエラーが出てハマるので現時点でのやり方を書いておきます。*1
このログイン画面だと普通赤いログインボタンを押すやろ・・・
omniauth-chatwork実装時にリファレンス通りにやってもOAuthログインできなくて、ChatWorkのサポートに問い合わせてメールで何往復かしてようやく上記の手順が分かりました。
一応断片的にはドキュメントには書いてあるんですが、非常に分かりづらいのでサポートに改善要望を投げています。
*1:最後に書いてるけど改善要望は投げているので今後仕様が変わる可能性はある
*2: http://developer.chatwork.com/ja/oauth.html の「OAuth2専用ログイン画面ではSAML認証には対応しておりません。通常のログイン画面を経由してSAML認証でログインした後、再度コンセント画面にアクセスしてください。」参照