20211016のRubyに関する記事は6件です。

テストコードについて!

①.結論! テストコードとは、アプリケーション内に記述する、そのアプリケーションの挙動を確認するためのコードのことです! Ruby on Rails内にも、アプリケーションのテストコードを記述する機能を設けることが出来ます! その機能は「RSpec」というGemを使うことで便利に実装できます! ②.なぜテストコードを書くのか? テストコードを書く意義は大きく分けて2つあります! 1・クオリティの担保ができる! ブラウザデアピリケーションの挙動を確認するのは、デメリットの方が多いです! 主な理由は3つです! ・人為的なミスが生じるかもしれない! ・仕様が変更した際に、もう1度全部やらないといけない! ・どのように確認したか、記録が残らない! このようなことがあります! 2・仕様を見極めることが出来る! テストコード書くことが出来れば、アプリケーションの仕様を理解していることになる! 主な理由は2つです! ・テストすべき項目を洗い出すときに使用を見極めることが出来る! ・テストコードを書ける人は、仕様を理解している人! 以上が、テストコードを書くための理由になります! ③.テストコードのパターン(正常系と異常系) アプリケーションの挙動を確認するときは、「うまくいくとき」「うまくいかないとき」をそれぞれ確認する必要があります! 例えば、「うまくいくとき」は、「画像URLとテキストの両方を入力して送信すると、テーブルに保存できる」というケースです! 一方で、「うまくいかないとき」は、「画像URLもテキストも入力せずに送信ボタンを押すと、テーブルに保存されない」というケースです! テストコード書く際は、前者を正常系、後者を異常系と呼びます! ・正常系 「ユーザーが開発者の意図する操作を行った時の挙動」を確認するテストコードが、正常系に分類されます! ・異常系 「ユーザーが開発者の意図しない操作を行った時の挙動」を確認するテストコードが、異常系に分類されます! 例えば、必須項目を入力せずに送信した際は、「必須項目を入力してください」とアラート画面などがでることがあります! この挙動を確認することは異常系に分類されます! ④.テストコードの種類(単体と結合) テストコードの種類は、大きく2つあります! 1つ目が、実装した機能を部分的に意図通りに動作するか確認する単体テストです! 2つ目が、ユーザーがその機能を使う際、一連の動作が問題なく行われるかを確認する結合テストです! ・単体テストコード モデルやコントローラーなどの機能ごとに問題がないか確かめます! 例えば、モデルのテストコードでは「画像URLとテキストがない投稿は、テーブルに保存させない」というバリデーションの挙動を確認します! ・結合テストコード ユーザーがブラウザで操作する一連の流れを再現して、問題がないか確かめます! 例えば、投稿のテストコードでは「画像URLとテキストを投稿して送信ボタンを押すと、投稿完了ページに移動し、TOPページに戻ると、投稿した内容が表示されている」という流れを一気に確かめます! 簡単に言うと、単体は各機能ごとに行い、結合はユーザーの操作を再現して一連の流れを行うと言う事です! .⑤まとめ Ruby on Railsでテストコードを書く際は、RSpecを使用することが多いみたいですね! このテストコードがきちんと書けるようになれば、仕様を理解している事になるので、きちんと覚えて行こうと思います! 簡単にまとめて言うとこんな感じです! アプリケーションの挙動はテストコードを実行することで確認できる! テストコードを書くことで、アプリケーションの品質が担保されるだけではなく、設計を読み解くこともできる! テストコードは正常系と異常系に大きく分類される! テストコードは、単体テストコードと、結合テストコードの2種類がある! しっかり覚えて行こうと思います! 何か説明で間違っていたらご指導お願い致します(_ _)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails]パーシャル内パーシャルのrender繰り返しを防ぐには

ハマった点 投稿一覧ページに「いいねボタン」を設置する際、各投稿のパーシャルをrenderする際の繰り返しは、collectionオプションにて解決できた。 しかし、各投稿のパーシャルの中でrenderしているパーシャルにおいては、投稿の分だけrenderの繰り返しが発生してしまう。  ↓実際のログ このrenderのせいで、たった25件の投稿表示に1800ms以上の時間がかかってしまう。しかも、Ajaxによる非同期処理でいいねボタンの切り替えを実装しているため(DRYの観点でも)、いいねボタンをパーシャル化しなければならない。(他に方法があれば知りたいです!) 同じ状況の方も多いのでは? 解決策 renderのlayoutオプションとyieldメソッドを使うことで解決した。 ER図 [NGパターン] renderの繰り返しが発生するrenderの使い方 コントローラー posts_controller.rb def index @posts = Post.All # 今回はN+1問題などは考慮しません end View views/posts/index.html %div = render partial: 'posts/shared/post', collection: @posts, as: :post views/posts/shared/_post.html %div = post.id = post.content .post-likes{ id: "post-#{post.id}-likes" } = render 'likes/like', post: post views/likes/_like.html - if post.already_liked?(current_user) # 「いいね」済みならtrueを返すメ = link_to post_like_path(post, post.likes), mehod: :delete, remote: true do %font .fas.fa-heart.likes-heart-already - else = link_to post_likes_path(post), method: :post, remote: true do %font .far.fa-heart %span{ id: "post-#{post.id}-likes-count" } = post.likes.count ログ terminal web_1 | ↳ app/controllers/application_controller.rb:36 web_1 | Rendering posts/index.html.haml within layouts/application web_1 | Rendered likes/_like.html.haml (7.7ms) web_1 | Rendered likes/_like.html.haml (0.6ms) web_1 | Rendered likes/_like.html.haml (0.6ms) web_1 | Rendered likes/_like.html.haml (0.5ms)                                                  〜省略〜 web_1 | Rendered likes/_like.html.haml (0.6ms) web_1 | Rendered likes/_like.html.haml (0.4ms) web_1 | Rendered likes/_like.html.haml (0.4ms) web_1 | Rendered collection of posts/shared/_post.html.haml [25 times] (663.9ms) web_1 | Rendered posts/index.html.haml within layouts/application (690.5ms) web_1 | Completed 200 OK in 1847ms (Views: 1791.0ms | ActiveRecord: 3.4ms) [OKパターン] renderの繰り返しが発生しないrenderの使い方 コントローラー posts_controller.rb # コントローラは改善前と同じです。 def index @posts = Post.All # 今回はN+1問題などは考慮しません end View ↓ renderメソッドのlayoutオプションを使い、パーシャルに_like.htmlを指定。さらに、collectionにはpostsを指定する。 views/posts/index.html .posts-wrap %div{ id: 'post-items' } = render partial: 'likes/like', layout: 'posts/post_layout', collection: @posts, as: :post / _post_layoutパーシャルは新たに作成します。 ↓ yieldメソッドにて_like.htmlパーシャルを表示する。 views/posts/post_layout.html %div{ id: "post-#{post.id}" } %div = post.id = post.content .post-likes{ id: "post-#{post.id}-likes" } = yield / このファイルはは新たに作成しています。 ログ terminal web_1 | ↳ app/controllers/application_controller.rb:36 web_1 | Rendering posts/index.html.haml within layouts/application web_1 | Rendered collection of likes/_like.html.haml [25 times] (33.6ms) web_1 | Rendered posts/index.html.haml within layouts/application (61.2ms) web_1 | Completed 200 OK in 343ms (Views: 295.7ms | ActiveRecord: 2.9ms) 1847msも要していたアクセス時間を343msまで短縮することができました!(正確には短縮ではないですが) おわり なんとなく理解した気でいたrenderメソッドとyieldメソッドについて理解を深めることができました。 解決までに時間がかかってしまったので、解決できた時は本当に感動しました。 初めての投稿で、わかりづらい点があるかもしれません。 意見、アドバイス等よろしくお願いします! 今後も学びのアウトプットをしていきたいと思います。 参考にした記事 忘れがちなrenderメソッドの使い方まとめ [Rails] Railsのpartialでcollectionを渡すときにはindexの変数が自動的に作られる Railsドキュメント - render
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】Qiita デイリー LGTM 数ランキング【自動更新】

他のタグ AWS Android Docker Git Go iOS Java JavaScript Linux Node.js PHP Python Rails React Ruby Swift TypeScript Vim Vue.js 初心者 集計について 期間: 2021-10-18 ~ 2021-10-19 GitHub スターをもらえるととっても励みになります LGTM 数ランキング ランキングに入る記事が見つかりませんでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

webサイトにLINEやTwitterの共有ボタンを作る

今自分が作っているサイトにlineとかの共有つけたいなーって思って調べてみたらめっちゃ簡単だったのでカキコ 今回追加するボタン これはFont Awesomeで持ってきたやつですがLINEの方は下のリンクからいろいろ選べます。 では実装!(Twitter) <%= link_to "Twitterに共有", "https://twitter.com/intent/tweet?url=#{request.url} %> これを追加するだけです。 はい。終了! と行きたいのですが、いろいろ共有する時に追加できるのでそれを書きます。 長いので折り畳んでます さっきのコードは、urlを送るようにしています こんな感じで追加されます。 urlは"#{request.url}"としてリクエストがされたurlを送信できます。 共有ボタンを追加しているページは、http://localhost:3000/posts/2 , なので"#{request.url}"に入る値はhttp://localhost:3000/posts/2 となります。 では次はテキストを追加したい時は <%= link_to "https://twitter.com/intent/tweet?text=サンプルです。 %> こう書きます。テキストの合計が140文字だったかな?それ超えたらuserに処理してもらう必要があったと思います 次はハッシュタグを追加します。 タグには#をつける必要がなく、カンマ区切りで複数追加することができます <%= link_to "https://twitter.com/intent/hashtags=ruby,rails" %> これを全て追加すると、、、、、、 <%= link_to "https://twitter.com/intent/tweet?text=#{@post.title}&url=#{request.url}&hashtags=ruby,rails" %> こうなります! 一つ気になることがあるとしては、改行が行われていないことですかね! 投稿する時に改行してもらえれば問題ないのですがデフォルトで改行してあげることにしましょう! 改行を入れるには"\n"ではなく"%0a"を入れることで任意の場所で改行できます <%= link_to "https://twitter.com/intent/tweet?text=#{@post.title}%0a&url=#{request.url}%0a&hashtags=ruby%0a,rails" %> LINE編 LINEは冒頭で貼ったリンクから簡単にできるのでそれ以外の方法で さっきのTwitterとほとんど同じ書き方になります <%= link_to "http://line.me/R/msg/text/?=#{@user.name}さんの投稿がシェアされました%0a#{request.url}%0ali" %> ここでつかっている#{@user.name}などの展開はあらかじめcontrollerで設定してある変数やインスタンスを用いることができます @userの部分で共有したい投稿のup主を識別してup主に応じて共有文のusernameが変化するというものです。 textの中にいれていればなんでも追加できるので試してみてください! LINEの共有ボタンをクリックした時は こんな感じの画面に遷移するのでここで誰に共有するか選ぶことができます。 以上! めちゃくちゃ簡単だった~~
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【個人用】rails tutorial -2

本章の学習内容 大量の機能を自動生成するscaffoldジェネレータというスクリプトを使ってアプリケーションを生成し、高度なRailsプログラミングとWebプログラミングの概要を学ぶこと ユーザーモデルの設計 各ユーザーには、重複のない一意のキーとなるinteger型のID番号(idと呼びます)を割り当て、このIDに加えて一般公開されるstring型の名前(name)、そして同じくstring型のメールアドレス(email)を持たせます。emailはユーザー名としても使われる マイクロポストのモデル設計 テキスト内容を格納するtext型のcontentだけで構成されています 。しかし実際には、マイクロポストをユーザーと関連付ける必要があります。そのため、マイクロポストの投稿者を記録するためのuser_idも追加します。 Usersリソース ユーザー用のデータモデルを、そのモデルを表示するためのWebインターフェイスに従って実装。このデータモデルとWebインターフェイスは、組み合わさることで Usersリソースとなり、ユーザーというものを、HTTPプロトコル経由で自由に作成/取得/更新/削除できるオブジェクトとみなすことができるようになる。今回はUsersリソースはすべてのRailsプロジェクトに標準装備されているscaffoldジェネレータで生成する scaffoldについて rails generateスクリプトにscaffoldコマンドを渡すことで生成されるものでscaffoldコマンドの引数には、リソース名を単数形にしたもの(この場合はUser)を使い、必要に応じてデータモデルの属性をオプションとしてパラメータに追加 $ rails generate scaffold User name:string email:string name:stringとemail:stringオプションを追加することで、Userモデルの内容が`次のようになる なお、idパラメータはRailsによって自動的に主キーとしてデータベースに追加されるため、追加不要 続いてToyアプリケーションの開発を進めるには、次のようにrails db:migrateを実行してデータベースをマイグレート(migrate)する必要がある $ rails db:migrate マイグレーションを実行したことで、ローカルWebサーバーを別タブで実行できるようになる scaffoldでusersリソースを生成したことでユーザー管理用ページに次の幾つかのページが追加される URL アクション 用途 /users index 全ユーザーを一覧するページ /users/1 show id=1のユーザーを表示するページ /users/new new 新規ユーザーを作成するページ /users/1/edit edit id=1のユーザーを編集するページ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

公式APIを使わずにTwitter Analytics(アナリティクス)の情報を取得する方法

概要 先日、とある業務の一環において「Twitter Analyticsの情報(上記画像のような部分)を毎日記録しておいてくれ」といった感じの指令を受けました。 一応、Twitter Analyticsのページ(https://analytics.twitter.com)では過去にさかのぼって各種データをCSV形式でエクスポートしたりといった機能が用意されていたりするものの、さすがに毎日ここを開いて逐一確認するのはナンセンスというか、曲がりなりにもプログラマーである自分がわざわざやるべき仕事ではないなと感じたため、何とか自動化できる手段は無いかと模索していたわけです。 そうなると真っ先に候補として挙がってくるのは「API経由での取得」ですが、ぱっと見、Twitter AnalyticsのデータをAPI経由で取得するための方法というのが簡単には出できませんでした。 仮に出てきたとしても、 可能ではあるが、広告を出稿したりするためのエンタープライズ用のアカウントでないと無理 Twitter API v2 なら取得できるが、過去30日のみのデータに限られる そもそもそれらを使用するための審査が厳しい といった感じでやや一癖ありそうな雰囲気...。 とりあえず、通常のTwitter APIのようにサードパーティ製のライブラリが充実していて「APIキーさえ取得できれば後はサンプル通りのコードを書けばOK!」みたいな軽いノリでは上手くいかないんだろうなぁと悟ってしまったわけですね。(もしかすると自分のリサーチが甘いだけかもしれませんが...) 中には「Seleniumで自動ログインしてスクレイピングすれば良いやん」といった声もあり、実際にそれっぽいコードを見かけたりもしたものの、Twitter社のスクレイピング嫌いは非常に有名で対策も頻繁に行われているそうなので安定感という点では欠けます。(変にいじくり回すとペナルティ食う可能性などもありますし) で、他に何か手軽な手段は無いか試行錯誤してみたところ、意外と簡単な方法でイケたのでメモ書きしておきます。 cURLコマンドを使う 先に結論から言ってしまうと、cURLコマンドを使います。 そもそもこの画面上の数字がどこから送られてきているのか、デベロッパーツールの「ネットワーク」から確認してみましょう。 すると、 summary.json top_tweet.json page_summary.json panels.json などそれっぽいものがいくつか見つかるはず。したがって、これらにリクエストを送れば何となく取得できそうな気配がしますよね。 試しに「summary.json」にリクエストを送ってみたいと思います。 Google Chromeのデベロッパーツールなら「右クリック → コピー → cURLとしてコピー」でそのままコマンドをコピーできるので便利です。 curl 'https://analytics.twitter.com/user/******(ユーザー名)/home/summary.json?start_time=1631836800000&end_time=1634256000000' \ -H 'authority: analytics.twitter.com' \ -H 'pragma: no-cache' \ -H 'cache-control: no-cache' \ -H 'sec-ch-ua: "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"' \ -H 'accept: application/json, text/javascript, */*; q=0.01' \ -H 'x-requested-with: XMLHttpRequest' \ -H 'sec-ch-ua-mobile: ?0' \ -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36' \ -H 'sec-ch-ua-platform: "macOS"' \ -H 'sec-fetch-site: same-origin' \ -H 'sec-fetch-mode: cors' \ -H 'sec-fetch-dest: empty' \ -H 'referer: https://analytics.twitter.com/user/******(ユーザー名)/home' \ -H 'accept-language: ja,en-US;q=0.9,en;q=0.8' \ -H 'cookie: kdt=********************; remember_checked_on=1; des_opt_in=Y; cd_user_id=**********************; dnt=1; lang=ja; _gid=***************; personalization_id="************"; guest_id=**************; gt=***************; _twitter_sess=********************; auth_token=******************; twid=****************; ct0=****************; att=********************; csrf_id=*******************; at_check=true; _gcl_au=*********************; mbox=PC#******************#***********|session#*****************#*************; _ga=***************; _ga_*************=******************' \ --compressed クリップボードに↑のようなコマンドがコピーされていればOK。 これを実行してみると、次のような形式のレスポンスが返ってくるはずです。 { "html": "<div class=\"row\">\n <div class=\"col-md-10\">\n <div class=\"home-summary-panel\">\n\n <div class=\"home-summary-metric DataPoint\" data-metric=\"tweets\" title=\"30\">\n <div class=\"DataPoint-label\">ツイート</div>\n <div class=\"DataPoint-info\">30\n <span class=\"DataPoint-trend DataPoint-trend--positive\">15.4%</span>\n\n </div>\n <div class=\"home-summary-chart\"></div>\n </div>\n\n <div class=\"home-summary-metric DataPoint\" data-metric=\"tweetviews\" title=\"3,118\">\n <div class=\"DataPoint-label\">ツイートインプレッション</div>\n <div class=\"DataPoint-info\">3,118\n <span class=\"DataPoint-trend DataPoint-trend--positive\">13.5%</span>\n\n </div>\n <div class=\"home-summary-chart\"></div>\n </div>\n\n <div class=\"home-summary-metric DataPoint\" data-metric=\"profileviews\" title=\"988\">\n <div class=\"DataPoint-label\">プロフィールへのアクセス</div>\n <div class=\"DataPoint-info\">988\n <span class=\"DataPoint-trend DataPoint-trend--negative\">26.8%</span>\n\n </div>\n <div class=\"home-summary-chart\"></div>\n </div>\n\n <div class=\"home-summary-metric DataPoint\" data-metric=\"mentions\" title=\"19\">\n <div class=\"DataPoint-label\">@ツイート</div>\n <div class=\"DataPoint-info\">19\n <span class=\"DataPoint-trend DataPoint-trend--positive\">46.2%</span>\n\n </div>\n <div class=\"home-summary-chart\"></div>\n </div>\n\n <div class=\"home-summary-metric DataPoint\" data-metric=\"followers\" title=\"547\">\n <div class=\"DataPoint-label\">フォロワー数</div>\n <div class=\"DataPoint-info\">547\n <span class=\"DataPoint-trend DataPoint-trend--negative\">-3</span>\n\n </div>\n <div class=\"home-summary-chart\"></div>\n </div>\n\n </div>\n </div>\n</div>\n", "domain": [ *************, ************* ], "step": **********, "timeseries": { "followers": [ [ ***************, 550 ], ... ], "mentions": [ [ ***************, 0 ], ... ], "tweetviews": [ [ ***************, 118 ], ... ], "profileviews": [ [ ***************, 14 ], ... ], "tweets": [ [ ***************, 0 ], ... ] } } どうやらそれっぽいデータが取得できてますね。 あとはこのJSONをパースして煮るなり焼くなり好きにすればOK。 他のデータ(top_tweet、page_summary、panelsなど)も同様のやり方で取得できるので試してみてください。 ※ 返ってきたデータが文字化けなどしている場合、末尾に | perl -Xpne 's/\\u([0-9a-fA-F]{4})/chr(hex($1))/eg' を追記して実行すると解決できるかもしれません。 RubyやPythonで処理したい場合 ここからは番外編なので、必要無ければ読み飛ばしていただいて結構です。 ただデータを取得するだけならcURLコマンドで足りるかもしれませんが、色々とデータをこねくり回そうと思ったら何らかのプログラミング言語が必要になると思うので、参考にしていただければと思います。 Ruby まずRubyから。 gemをインストール ./Gemfile # frozen_string_literal: true source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } gem "dotenv" gem "faraday" gem "nokogiri" $ bundle install --path vendor/bundle 秘匿情報を扱うための「dotenv」 HTTPリクエストを送信するための「faraday」 HTML解析を行うための「nokogiri」 などをインストールしておきます。 環境変数をセット ./.env TWITTER_USERNAME=<Twitterのユーザー名> TWITTER_AUTH_TOKEN=<認証トークン> 先ほど生成したcURLコマンド内のヘッダーには色々ごちゃごちゃした情報が付与されていましたが、実は認証トークンだけで十分だったりします。 「-H 'cookie: 」から「auth_token」だけ抜き出して「TWITTER_AUTH_TOKEN」にセットしてください。 コード ./main.rb require "bundler/setup" require "faraday" require "nokogiri" require "json" require "dotenv" Dotenv.load # Twitter Analyticsの情報を取得するためのクラス class TwitterAnalytics def initialize(username, auth_token) @client = Faraday.new(url: "https://analytics.twitter.com/user/#{username}/home") do |req| req.headers["Cookie"] = "auth_token=#{auth_token}; lang=ja;" end end # データを取得 def fetch_data(category, start_time, end_time) @client.get "#{category}.json?start_time=#{start_time}&end_time=#{end_time}" end end # 取得したいデータのカテゴリを指定 category = "summary" # 取得開始日時と取得終了日時をUnixtimeで指定 start_time = 1631836800000 end_time = 1634256000000 # リクエストを送信 ta = TwitterAnalytics.new(ENV["TWITTER_USERNAME"], ENV["TWITTER_AUTH_TOKEN"]) res = ta.fetch_data(category, start_time, end_time) # NokogiriでHTML解析 html = JSON.parse(res.body)["html"] doc = Nokogiri::HTML(html) # 各種データを取り出し metrics = doc.css(".home-summary-metric") tweets = metrics[0].attr("title") tweet_views = metrics[1].attr("title") profile_views = metrics[2].attr("title") mentions = metrics[3].attr("title") followers = metrics[4].attr("title") heredoc = <<~EOS ツイート: #{tweets} ツイートインプレッション: #{tweet_views} プロフィールへのアクセス: #{profile_views} @ツイート: #{mentions} フォロワー数: #{followers} EOS puts heredoc 大体こんな感じで良いでしょう。 $ bundle exec ruby main.rb ツイート: 30 ツイートインプレッション: 3,127 プロフィールへのアクセス: 988 @ツイート: 19 フォロワー数: 547 実際のTwitter Analytics画面とも数字が一致しているので大丈夫そうですね!(個人アカウントを試しているので全体的な数字がショボいのは勘弁してください...) Python こういう作業はPythonでやりたいという方もいると思うので、一応Python版も掲載しておきます。 ライブラリをインストール ./requirements.txt python-dotenv requests beautifulsoup4 $ pip install -r requirements.txt 秘匿情報を扱うための「python-dotenv」 HTTPリクエストを送信するための「requests」 HTML解析を行うための「beautifulsoup4」 などをインストールしておきます。 環境変数をセット ./.env TWITTER_USERNAME=<Twitterのユーザー名> TWITTER_AUTH_TOKEN=<認証トークン> 先ほど(Ruby版)と同じなので説明は割愛。 コード ./main.py import os import json import requests import textwrap from bs4 import BeautifulSoup from dotenv import load_dotenv load_dotenv() # Twitter Analyticsの情報を取得するためのクラス class TwitterAnalytics: def __init__(self, username, auth_token): self.username = username self.auth_token = auth_token # データを取得 def fetch_data(self, category, start_time, end_time): url = f"https://analytics.twitter.com/user/{self.username}/home/{category}.json?start_time={start_time}&end_time={end_time}" headers = { "Cookie": f"auth_token={self.auth_token}; lang=ja" } return requests.get(url, headers=headers) # 取得したいデータのカテゴリを指定 category = "summary" # 取得開始日時と取得終了日時をUnixtimeで指定 start_time = 1631836800000 end_time = 1634256000000 # リクエストを送信 ta = TwitterAnalytics(os.getenv("TWITTER_USERNAME"), os.getenv("TWITTER_AUTH_TOKEN")) res = ta.fetch_data(category, start_time, end_time) # BeautifulSoupでHTML解析 html = res.json()["html"] soup = BeautifulSoup(html, "html.parser") # 各種データを取り出し metrics = soup.find_all("div", class_ = "home-summary-metric") tweets = metrics[0]["title"] tweet_views = metrics[1]["title"] profile_views = metrics[2]["title"] mentions = metrics[3]["title"] followers = metrics[4]["title"] heredoc = textwrap.dedent(""" ツイート: {tweets} ツイートインプレッション: {tweet_views} プロフィールへのアクセス: {profile_views} @ツイート: {mentions} フォロワー数: {followers} """).format( tweets = tweets, tweet_views = tweet_views, profile_views = profile_views, mentions = mentions, followers = followers ) print(heredoc) あとはコイツを実行すればOK。 $ python main.py ツイート: 30 ツイートインプレッション: 3,127 プロフィールへのアクセス: 988 @ツイート: 19 フォロワー数: 547 と返ってくるはずです。 あとがき 以上、APIなどを使用せずにTwitter Analytics(アナリティクス)の情報を取得してみました。もし同じような事を再現したい方は参考にしてみてください。 なお、この方法が果たしてTwitter側からして良いものであると見なされるとは限らないのでご注意を。もしかしたらある日急に使えなくなる可能性も十分にあります。 あと、auth_tokenの有効期限がどれくらいかわからないため、完全自動化を図ろうとする場合はその辺の回転も意識して工夫が必要になるかも...。 とにもかくにも、常識の範囲内で試していただけると幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む