ラベル Twitter の投稿を表示しています。 すべての投稿を表示
ラベル Twitter の投稿を表示しています。 すべての投稿を表示

2023年6月7日水曜日

自分のツイートを分析してみた3

自分のツイートを分析してみた3

概要

前回の続きで 30,000 ツイートに達したのでデータ分析してみました

環境

  • Ruby 3.2.1

全ツイート数

  • 30220

全ツイートをどれくらいの期間で行ったか

  • 2016/03/24 - 2023/05/31

2625 日分のツイートになります

月単位でどれくらいツイートを行ったか

月間最高ツイートは 2019/06 で 846 ツイートでした (前回と変わらず)

日単位でどれくらいツイートを行ったか

日で最高ツイートは 2018/06/06 で 156 ツイートでした (前回と変わらず)

月単位でどれくらいリツイートをされたか

最高でも月で 4 リツイートが一番多かったです (前回から減っているので取り消しされてるっぽい)

月単位でどれくらいファボをされたか

月間最高ファボは 2021/10 で 41 ファボでした (前回から減っているので取り消しされてるっぽい)

ツイートしているデバイスの割合

ほぼブラウザからツイートでした (前回とほぼ同じ)

よくツイートされている単語 Top100

  • t -> 1990
  • co -> 1952
  • https -> 1780
  • ー -> 1223
  • 感じ -> 1146
  • アプリ -> 1002
  • 方法 -> 920
  • 人 -> 779
  • 自分 -> 744
  • ファイル -> 466
  • インストール -> 434
  • あと -> 402
  • docker -> 395
  • ゲーム -> 357
  • コード -> 346
  • 情報 -> 343
  • 久しぶり -> 326
  • gt -> 321
  • コンテナ -> 318
  • データ -> 309
  • サーバ -> 305
  • アカウント -> 286
  • API -> 277
  • 記事 -> 272
  • 自動 -> 260
  • ruby -> 258
  • コマンド -> 258
  • s -> 254
  • mac -> 253
  • 気 -> 234
  • ポイント -> 206
  • 別 -> 206
  • 環境 -> 205
  • D -> 197
  • 動画 -> 195
  • デフォルト -> 189
  • k -> 185
  • 画面 -> 180
  • ログイン -> 179
  • 雨 -> 175
  • ビルド -> 173
  • S -> 172
  • 複数 -> 171
  • ユーザ -> 164
  • ケース -> 161
  • バージョン -> 160
  • ドメイン -> 159
  • 名前 -> 158
  • ツール -> 157
  • ネットワーク -> 155
  • カード -> 153
  • web -> 152
  • 個人 -> 152
  • 他 -> 151
  • アップデート -> 151
  • レベル -> 148
  • サイト -> 147
  • ページ -> 147
  • イベント -> 142
  • 最後 -> 142
  • デプロイ -> 141
  • google -> 139
  • ホスト -> 139
  • 野球 -> 138
  • ブログ -> 137
  • クライアント -> 137
  • 子供 -> 137
  • ウォーク -> 137
  • 月 -> 136
  • iPhone -> 134
  • モード -> 133
  • ライブラリ -> 132
  • d -> 132
  • p -> 132
  • クラス -> 132
  • 状態 -> 131
  • 次 -> 127
  • 無料 -> 126
  • バグ -> 126
  • python -> 126
  • バッテリー -> 125
  • Ruby -> 125
  • パスワード -> 122
  • 文字 -> 122
  • Mac -> 121
  • プロ -> 120
  • ネタ -> 120
  • 娘 -> 118
  • マシン -> 116
  • 変数 -> 116
  • 時代 -> 116
  • どん -> 114
  • ドキュメント -> 113
  • 仕組み -> 113
  • iOS -> 112
  • wifi -> 111
  • 回線 -> 110
  • Google -> 109
  • メソッド -> 108
  • ローカル -> 108

最後に

40,000 ツイートしたら再度解析してみたいと思います フォロワー数は若干増えています

参考サイト

2023年6月5日月曜日

自分のツイートからマルコフ連鎖で文章を自動生成してみる

自分のツイートからマルコフ連鎖で文章を自動生成してみる

概要

3万件ほどある自分の Twitter のアーカイブデータからマルコフ連鎖を使って文章を自動生成してみました

環境

  • Ubuntu 18.04
    • mecab 0.996
  • Python 3.10.2
    • mecab-python3 1.0.6
    • markovify

Twitter アーカイブデータの取得

Twitter の Web 画面から行います
データ量によっては 1日以上かかる場合もあります
ダウンロードできたら解凍しその中にある tweets.js を保存しておきます

ちなみに自分のツイートは執筆時点で 30220 ツイートありました

ツールインストール

  • sudo apt -y install mecab mecab-ipadic-utf8
  • sudo cp /etc/mecabrc /usr/local/etc/mecabrc
  • mecab -D
filename:       /var/lib/mecab/dic/debian/sys.dic
version:        102
charset:        UTF-8
type:   0
size:   392126
left size:      1316
right size:     1316

ライブラリインストール

  • pipenv install mecab-python3 markovify

サンプルコード

とりあえず動かすのが目的なのでクラス化などのリファクタリングはしていません

  • vim app.py
import markovify
import MeCab
import json

# tweets.js を読み込んでツイート情報を配列に格納
tweets = []
with open("./tweets.js", mode="r") as f:
    for tweet in json.loads(f.read().replace('window.YTD.tweets.part0 = ', '')):
        tweets.append(tweet['tweet']['full_text'])

# ツイートの配列情報を1行ごとにしてテキストファイルに保存
print(len(tweets))
with open('./input.txt', mode='w') as f:
    for tweet in tweets:
        f.write(f"{tweet}\n")

# 1行ごとに保存したツイート情報をmecabを使って分かち書きに変換、分かち書きも1ツイート1行にして保存
parsed_text = ""
with open("./input.txt", mode="r") as f:
    for line in f.read().split():
        tagger = MeCab.Tagger("-Owakati")
        parsed_text += f"{tagger.parse(line).strip()}\n"

# 分かち書きを1行ごとに保存したのでNewlineText を使って学習
text_model = markovify.NewlineText(parsed_text, state_size=1)

# 文章を10個生成してみる
for _ in range(10):
    sentence = text_model.make_short_sentence(100, tries=100)
    if sentence is None:
        continue
    print(sentence)

動作確認

  • pipenv run python app.py
プラットフォーム なんて やっ て みる か ー 、 あきらめる か 、 、 、 やっぱり 筋 トレ 始め たら 逆 に
の 調子 が 読み込ま れ て いる みたい に 含ま れ ちゃう だろ う か 、 、
を 要求 さ
もう 忘れ て ほしかっ た ほう が 少ない から コロナ は ステート フル カラー ボックス ない や で ない の か な 。 もはや 顔出し し たい 場合 は
うーん 明日 から 届か ない 気 が 多い の 見る の 圧力 センサー 系 も 夢 は
300 H 1 . co / LRgfICHpN 0 ZVHy
で 使っ て から 完全 に 見 た ほう が 自分 だけ で も 試し た 事 象っ て も 会わ ず 、 、
background - server
とか なる 可能 性 が ある か 、
を 送り 続け ない ん ? これ は タッチバーモデル しか 見 てる の ほう が 、

正直意味不明ですがツイートと言えばツイートっぽい気もします
URL なども学習させているのでこのあたりをクリーニングすればもっと良くなるかもです

トラブルシューティング: UnicodeEncodeError: ‘utf-8’ codec can’t encode characters in position 0-1: surrogates not allowed

mecab はデフォルトだと euc_jp なので python の文字コードと違うがあるため print などでエラーになっています
mecab-ipadic-utf8 をインストールし直しましょう

最後に

パラメータなどを調整したりデータのクリーニングをしたりすればもっと良くなると思います 内部的な使用は不明ですがデフォルトだと分かち書きをしたデータをただランダムに組み合わせているレベルにしかならないのかもしれません

参考サイト

2023年5月28日日曜日

(解決) This App has violated Twitter Rules and policies. As a result, it can no longer be accessed. For assistance, submit a support ticket.

(解決) This App has violated Twitter Rules and policies. As a result, it can no longer be accessed. For assistance, submit a support ticket.

概要

Twitter のアプリが突然 suspend されたので対応しました
おそらく昔から存在するアプリは使用に関係なくこうなる気がします

環境

  • Twitter API (2023/05/24時点)

古いアプリを削除する

どうやらすでに異議申し立てもできなくなっているので素直に削除しましょう

ちゃんと v2 エンドポイントを使う

これが結構重要かなと思います
古いアプリは v1.1 エンドポイントでもツイートできちゃったりします
無料プランの場合は v1.1 エンドポイントは一部の機能しか使えなくツイートできません

で古いアプリを使っていると v1.1 でツイートできてしまうため規約違反となり suspend になったと推測されます

なので新しく作ったアプリではちゃんと v2 エンドポイントを使うようにしましょう

というかおそらく新しく作ったアプリでこれまで動作していたアプリを使うと

You currently have access to Twitter API v2 endpoints and limited v1.1 endpoints only. If you need access to this endpoint, you may need a different access level. You can learn more here: https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-level

になるんじゃないかなと思います

多くのライブラリは v2 API に対応していない

例えば Ruby の twitter gem は v2 サポートしていません (執筆時点で)

なのでアプリを使ってツイートしようとすると上記のエラーで怒られます

なので頑張って自分で API リファレンスを見て自作のツール対処するか v2 サポートしているライブラリを探す感じになります

2023年5月26日金曜日

RubyでTwitterV2 API を使ってツイートする方法

RubyでTwitterV2 API を使ってツイートする方法

概要

twitter gem が v2 に対応していないので自作する必要があります

You currently have access to Twitter API v2 endpoints and limited v1.1 endpoints only. If you need access to this endpoint, you may need a different access level. You can learn more here: https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-level

こんなエラーが出る場合にはライブラリが v1.1 にしか対応しておらず v2 のエンドポイントをサポートしていません

環境

  • macOS 11.7.6
  • ruby 3.2.1

Gemfile

gem 'oauth'
gem 'typhoeus'

サンプルコード

# frozen_string_literal: true

require 'json'
require 'typhoeus'
require 'oauth'
require 'oauth/request_proxy/typhoeus_request'

# TwitterV2を使ってツイートするクラス
class TwitterV2
  def initialize
    @consumer_key        = 'xxx'
    @consumer_secret     = 'xxx'
    @access_token        = 'xxx'
    @access_token_secret = 'xxx'
    @endpoint            = 'https://api.twitter.com/2/tweets'
  end

  def options(payload)
    {
      method: :post,
      headers: {
        'User-Agent': 'v2CreateTweetRuby',
        'content-type': 'application/json'
      },
      body: JSON.dump(payload)
    }
  end

  def consumer
    OAuth::Consumer.new(@consumer_key, @consumer_secret, { site: 'https://api.twitter.com', debug_output: false })
  end

  def access_token
    OAuth::AccessToken.new(@consumer, @access_token, @access_token_secret)
  end

  def post_tweet(url, oauth_params, payload)
    request = Typhoeus::Request.new(url, options(payload))
    oauth_helper = OAuth::Client::Helper.new(request, oauth_params.merge(request_uri: url))
    request.options[:headers].merge!({ Authorization: oauth_helper.header })
    request.run
  end

  def tweet(text)
    payload = { text: text }
    oauth_params = {
      consumer: consumer,
      token: access_token
    }
    post_tweet(@endpoint, oauth_params, payload)
  end
end

TwitterV2.new.tweet("test")

参考サイト

2023年5月25日木曜日

HuginnでWebhookを試してみる

HuginnでWebhookを試してみる

概要

Huginn は IFTTT や Zapier のようなオートメーションツールです
IFTTT や Zapier の無料プランではいろいろと制限があるので自分で構築してみました
今回は Webhook を使ってみます

環境

  • macOS 11.7.6
  • docker 23.0.5
  • Huginn 2022.08.18

起動

公式の推奨は docker なので docker を使います
とりあえず起動してアクセスできることを確認しましょう (あとで停止していろいろ設定を入れ込み再起動します)

  • docker run -it -p 3000:3000 ghcr.io/huginn/huginn
Rails 6.1.7.2 application starting in production http://0.0.0.0:3000

というログが出るまでしばらく時間がかかるので待ちます
起動後は http://localhost:3000 で管理 UI にアクセスできます
admin/password でログインできます

Twitter アプリの作成

アプリを作成して OAuth 用の権限設定と API キー/シークレットキーの取得をします

アプリの権限などを設定します
コールバック URL に localhost は設定できますがサイト URL に localhost は設定できないのでまだサイトがない場合は適当な URL を入力しましょう

  • App permissions・・・Read and write
  • Type of App・・・Web App, Automated App or Bot
  • App info (Callback URI)・・・http://your.huginn.site.com:3000/auth/twitter/callback
  • App info (Website URL)・・・http://your.huginn.site.com:3000

設定が完了するとクライアントIDとクライアントシークレットキーが払い出されます
が huginn では使用しないので無視します

権限設定ができたら Consummer Keys を再作成してメモしておきます
huginn ではこちらの API キーとシークレットキーを使います

キーを huginn に登録して起動

取得した Twitter の クライアントIDとクライアントシークレットキー情報を huginn に渡します
基本的には環境変数として渡します

docker run -it -p 3000:3000 \
-e HUGINN_TWITTER_OAUTH_KEY=xxx -e HUGINN_TWITTER_OAUTH_SECRET=xxx \
ghcr.io/huginn/huginn

huginn と Twitter を連携する (サービスの登録)

http://localhost:3000/services にアクセスすると Twitter の OAuth が使えるようになっています
huginn 経由でツイートするユーザでログインしましょう

We're sorry, but something went wrong (500) となる場合は HUGINN_TWITTER_OAUTH_KEY と HUGINN_TWITTER_OAUTH_SECRET に正しい API キー/シークレットキーが設定されているか確認してください (クライアントIDとクライアントシークレットキーではないので注意してください)

Webhook エージェントの作成

次に Webhook エージェントを作成します http://localhost:3000/agents/new から作成します

Type・・・Webhook Agent Name・・・test_webhook Schedule・・・そのまま Controllers・・・そのまま Keep events・・・そのまま Sources・・・そのまま Receivers・・・そのまま Scenarios・・・そのまま

これで OK です
作成した Webhook エージェントを確認するとコールする URL が発行されるのでメモしておきます
この URL に POST リクエストでアクセスすると Webhook を実行できます

Twitter Publish Agent の作成

あとは Webhook した際に実行されるエージェントを作成します

http://localhost:3000/agents/new から Twitter Publish Agent を作成します

Type・・・Twitter Publish Agent Name・・・test Service・・・Twitter アカウントで連携したサービスを選択 Schedule・・・そのまま Controllers・・・そのまま Keep events・・・そのまま Sources・・・test_webhook Propagate immediately・・・チェックしない Receivers・・・そのまま Scenarios・・・そのまま

Sources に先程作成した Webhook エージェントを指定します
これでツイートする用のエージェントの作成は完了です

動作確認

Webhook をリクエストしてみましょう
そして問題なくツイートされているか確認してください

内部的に順番にジョブが処理されるので少しラグがあるかもしれません

最後に

huginn で Twitter と連携する方法を紹介しました
Twitter と連携する部分がやや面倒ですがそれができれば簡単に Webhook 経由でツイートできました

これで IFTTT や zapier を使わなくて済むかもしれません

参考サイト

2021年1月15日金曜日

自分のツイートを分析してみた2

概要

前回の続きで 20,000 ツイートに達したのでデータ分析してみました

環境

  • Ruby 3.0.0p0

全ツイート数

  • 21858

全ツイートをどれくらいの期間で行ったか

  • 2016/03/24 - 2021/01/12

1755 日分のツイートになります

月単位でどれくらいツイートを行ったか

月間最高ツイートは 2019/06 で 846 ツイートでした

日単位でどれくらいツイートを行ったか

日で最高ツイートは 2018/06/06 で 156 ツイートでした

月単位でどれくらいリツイートをされたか

最高でも月で 5 リツイートが一番多かったです

月単位でどれくらいファボをされたか

月間最高ファボは 2020/04 で 43 ファボでした

ツイートしているデバイスの割合

ほぼブラウザからツイートでした

よくツイートされている単語 Top100

  • t -> 1418
  • co -> 1394
  • https -> 1263
  • 感じ -> 865
  • ー -> 803
  • アプリ -> 793
  • 人 -> 616
  • 方法 -> 580
  • 自分 -> 563
  • ファイル -> 383
  • インストール -> 327
  • docker -> 322
  • あと -> 301
  • gt -> 292
  • 情報 -> 287
  • コンテナ -> 282
  • ゲーム -> 280
  • API -> 255
  • サーバ -> 249
  • アカウント -> 244
  • データ -> 243
  • コード -> 242
  • コマンド -> 224
  • 久しぶり -> 224
  • 記事 -> 223
  • 自動 -> 211
  • ruby -> 206
  • 気 -> 195
  • mac -> 187
  • s -> 181
  • 環境 -> 173
  • 別 -> 172
  • 動画 -> 170
  • 画面 -> 155
  • デフォルト -> 151
  • ポイント -> 150
  • ログイン -> 146
  • ドメイン -> 141
  • 複数 -> 139
  • ビルド -> 138
  • 名前 -> 133
  • ネットワーク -> 133
  • D -> 131
  • ユーザ -> 130
  • 個人 -> 129
  • k -> 128
  • ブログ -> 126
  • ツール -> 125
  • ページ -> 124
  • バージョン -> 123
  • アップデート -> 123
  • ケース -> 122
  • web -> 121
  • p -> 121
  • サイト -> 121
  • d -> 120
  • レベル -> 120
  • ホスト -> 119
  • google -> 116
  • ライブラリ -> 115
  • 他 -> 113
  • iPhone -> 108
  • モード -> 108
  • イベント -> 107
  • どん -> 106
  • 状態 -> 106
  • Mac -> 104
  • カード -> 104
  • 月 -> 104
  • デプロイ -> 103
  • wifi -> 102
  • クライアント -> 102
  • 文字 -> 101
  • UI -> 101
  • 変数 -> 98
  • 回線 -> 97
  • iOS -> 97
  • 次 -> 96
  • バグ -> 95
  • 仕組み -> 95
  • Ruby -> 93
  • 時代 -> 93
  • S -> 93
  • Google -> 93
  • 無料 -> 92
  • 最後 -> 92
  • タグ -> 92
  • or -> 90
  • ドキュメント -> 90
  • swift -> 89
  • コール -> 88
  • マイクラ -> 87
  • ローカル -> 87
  • クラス -> 87
  • 野球 -> 86
  • メソッド -> 86
  • golang -> 86
  • スタンプ -> 85
  • パスワード -> 84
  • 部分 -> 82

["ポイント", "d", "モード", "どん", "カード", "wifi", "回線", "バグ", "仕組み", "Ruby", "S", "最後", "コール", "野球", "パスワード"] が新規で登場していました

逆に ["Arduino", "xcode", "mini", "swagger", "画像", "端末", "プロジェクト", "Swift", "js", "使い方", "python", "ポート", "r", "デバイス", "ボタン"] が前回の Top100 からなくなっていました

最後に

30,000 ツイートしたら再度解析してみたいと思います
ちなみにフォロワー数はずっと横ばいです

参考サイト

2019年2月9日土曜日

自分のツイートを分析してみた

概要

@hawksnowlog のツイートが 10,000 ツイートを達成したのでこれまでにどんなツイートをどれくらいしているのかなど分析してみました

環境

  • Ruby 2.5.1p57

事前準備: データをエクスポートする

「設定とプライバシー 」->「Twitter データ」からエクスポートできます

まずはリクエストします
データがダウンロード可能になると Twitter に登録しているメールアドレスに連絡が来るのでダウンロードします
データは JavaScript ファイルで提供されています
なので JavaScript を使えばすぐに import して使うことができます
が自分は Ruby を使いたかったので一旦 JSON ファイルに整形してから解析しました
また解析するデータは tweets.js のデータのみです

何を解析するか

いろいろ考えたのですがとりあえず以下を出してみたいと思います

  • 全ツイート数
  • 全ツイートをどれくらいの期間で行ったか
  • 月単位でどれくらいツイートを行ったか
  • 日単位でどれくらいツイートを行ったか
  • 月単位でどれくらいリツイートをされたか
  • 月単位でどれくらいファボをされたか
  • ツイートしているデバイスの割合
  • よくツイートされている単語 Top100

解析にあたって Ruby + natto + gruff を使っています
natto は形態素解析用として gruff はグラフの描画に使っています
以下では tweets.js の解析結果を紹介します

全ツイート数

解析対象となるツイート数です

  • 10016 ツイート

全ツイートをどれくらいの期間で行ったか

  • 2016/03/24 - 2019/02/07

で日数だと 1051 日になります
一日の平均ツイート数は 10016 ツイート / 1051 日 = 9.5 ツイート でした

月単位でどれくらいツイートを行ったか

結果のグラフです

月間最高ツイートは 2018/09 で 650 ツイートでした
月間最低ツイートは 2016/03 で 48 ツイートでした
また月平均だと 10016 ツイート/ 36 月= 278.2 ツイート でした

日単位でどれくらいツイートを行ったか

結果のグラフです

日で最高ツイートは 2018/06/05 で 88 ツイートでした
一日の平均は先程も記載しましたが 9.5 ツイートでした

月単位でどれくらいリツイートをされたか

結果のグラフです

最高でも月で 4 リツイートが一番多かったです
リツイートは 0 の月もざらにありました

月単位でどれくらいファボをされたか

結果のグラフです

リツイートよりもファボのほうがされやすいようです
月間最高で 15 最低は 1 でした
ただファボされなかった月はなかったようです

ツイートしているデバイスの割合

結果のグラフです

ほぼブラウザからツイートでした
あとはスマホ (Echofon) が少しだけあるようです

よくツイートされている単語 Top100

条件として MeCab の解析結果で「名詞」かつ「一般」の単語のみをカウントしています
なので実はもっとそれっぽい単語をツイートしている可能性もあります
この辺りの「有用な単語の探し方」は言語処理のプロではないので適当にやっています

  • t -> 926
  • co -> 914
  • https -> 844
  • アプリ -> 479
  • 感じ -> 395
  • 方法 -> 365
  • ー -> 342
  • 自分 -> 294
  • 人 -> 269
  • ファイル -> 214
  • インストール -> 210
  • docker -> 194
  • API -> 191
  • 情報 -> 167
  • 記事 -> 166
  • コンテナ -> 158
  • コマンド -> 157
  • gt -> 154
  • データ -> 154
  • コード -> 152
  • サーバ -> 152
  • ゲーム -> 143
  • アカウント -> 137
  • 久しぶり -> 134
  • あと -> 134
  • 自動 -> 125
  • 環境 -> 110
  • ruby -> 109
  • 画面 -> 102
  • ドメイン -> 100
  • 気 -> 98
  • ブログ -> 97
  • デフォルト -> 97
  • ビルド -> 97
  • Mac -> 94
  • ログイン -> 94
  • s -> 91
  • ページ -> 87
  • 別 -> 85
  • スタンプ -> 85
  • ユーザ -> 84
  • 個人 -> 83
  • mac -> 83
  • 複数 -> 80
  • ライブラリ -> 80
  • Google -> 79
  • サイト -> 78
  • ツール -> 77
  • UI -> 77
  • バージョン -> 77
  • iPhone -> 76
  • swift -> 75
  • p -> 73
  • web -> 73
  • iOS -> 73
  • ネットワーク -> 72
  • 動画 -> 72
  • 他 -> 71
  • or -> 69
  • 文字 -> 66
  • Arduino -> 65
  • 無料 -> 65
  • D -> 65
  • イベント -> 64
  • xcode -> 63
  • デプロイ -> 62
  • ローカル -> 61
  • mini -> 61
  • swagger -> 61
  • 画像 -> 60
  • 名前 -> 60
  • 時代 -> 59
  • 状態 -> 58
  • 変数 -> 58
  • google -> 58
  • 端末 -> 57
  • クラス -> 57
  • ケース -> 57
  • レベル -> 56
  • ドキュメント -> 55
  • 部分 -> 54
  • k -> 54
  • 月 -> 53
  • プロジェクト -> 53
  • golang -> 52
  • ホスト -> 51
  • タグ -> 51
  • クライアント -> 50
  • 次 -> 50
  • Swift -> 50
  • アップデート -> 50
  • メソッド -> 49
  • マイクラ -> 48
  • js -> 48
  • 使い方 -> 48
  • python -> 48
  • ポート -> 47
  • r -> 47
  • デバイス -> 47
  • ボタン -> 46

ちょっと考察してみます
まずトップ3 の t, co, https ですがこれは Twitter にリンクを張った場合、自動的に Twitter は短縮 URL に変換します
つまりツイートにリンクが含まれている内容が多いことを示しています
自分の場合ブログを書いたらそれをツイートしているのでそのせいかなと思います

342 回出現した「ー (伸ばし棒)」ですが確かにこれも納得かなと思います
ツイートの語尾に「かなー」とか確かに記載しているのでそのせいだと思います

「docker」「API」「アプリ」などエンジニアリングっぽい単語も結構出てきているようで、これは少し安心しました

154 回出ている「gt」ですがこれは自分が右矢印を記載する際に「->」と記載しています
そのせいで「>」が「gt」として解釈されているためです
ようするに右矢印を多用していることがわかります

意外だったのは「Mac」「iPhone」「Swift」などの Apple 関連の単語がそこまで多くなったことです
WWDC や Apple Special Event は毎回見ているし、デバイス情報も逐一追っているので結構出ているかなと思ったらそうでもありませんでした
もしかすると小文字は別の単語としてカウントしているので、それも合算するともっと上位に食い込むかもしれません

あとはところどころなぞの英小文字「s」「k」「r」などが入っています
これはよくわからなかったのですが、これらを含む英単語を多くツイートしているのかもしれません
具体的にどんな英単語かは少し思いつきませんでした
「w」だったら納得だったのですが、、

全体的に見るとまぁ納得という結果かなと思います

最後に

自分の Twitter データをエクスポートして分析してみました
やってみるとわかりますが自分だけではなくいろんなユーザの分析も同様にしてみるともっと面白いだろうなと感じました
ユーザの同士の動向からまたおもしろいデータがわかりそうな気がします

たぶんですがこういった研究をしている人はたくさんいると思うので論文を読めばわかりそうな気もしますが、やはり自分でやってみると楽しいものです

2018年10月30日火曜日

Twitter の OAuth を使ってログイン機能を作ってみた

概要

Twitter の OAuth 機能を使って Web アプリにログイン機能を付けてみました
アプリは Sinatra で作成します

環境

  • macOS 10.14
  • Ruby 2.5.1p57
    • oauth 0.5.4
    • twitter 6.2.0

Twitter アプリの作成

https://developer.twitter.com/en/apps から作成します
アプリを作成するのにいろいろと情報を登録しなければいけなくなったので頑張って登録します
App Details はこんな感じです
ポイントはコールバック用の URL で http://localhost:9292/redirect に設定しあとでアプリ側で実装します

twitter_oauth01.png

Permissions は Read and Write にしました
ログインだけであれば Read だけで OK です
twitter_oauth02.png

アプリを作成したら Keys and tokens から Consumer API Keys の API key と API secret key をメモしておきます

ライブラリインストール

  • bundle init
  • vim Gemfile
gem "oauth"
gem "sinatra"
gem "twitter"
  • bundle install --path vendor

oauth でログインしたあとに Twitter API をコールするためのアクセストークンを使って API をコールします

サンプルアプリ

  • vim config.ru
require './app'
run TwitterOAuth
  • vim app.rb
require 'sinatra'
require 'oauth'
require 'twitter'

class TwitterOAuth < Sinatra::Base
  TWITTER_API_KEY = 'api-key'
  TWITTER_API_SECRET = 'api-secret'
  TWITTER_CALLBACK = 'http://localhost:9292/redirect'

  enable :sessions

  helpers do
    def oauth
      OAuth::Consumer.new(
        TWITTER_API_KEY,
        TWITTER_API_SECRET,
        :site => 'https://api.twitter.com',
        :schema => :header,
        :method => :post,
        :request_token_path => '/oauth/request_token',
        :access_token_path => '/oauth/access_token',
        :authorize_path => '/oauth/authorize'
      )
    end
  end

  get '/' do
    request_token = oauth.get_request_token(:oauth_callback => TWITTER_CALLBACK)
    session[:token] = request_token.token
    session[:secret] = request_token.secret
    redirect request_token.authorize_url
  end

  get '/redirect' do
    oauth_client = oauth
    request_token = OAuth::RequestToken.new(oauth_client, session[:token], session[:secret])
    access_token = oauth_client.get_access_token(request_token, :oauth_verifier => params[:oauth_verifier])
    # access_token.params['screen_name']
    twitter_client = Twitter::REST::Client.new do |config|
      config.consumer_key = TWITTER_API_KEY
      config.consumer_secret = TWITTER_API_SECRET
      config.access_token = access_token.token
      config.access_token_secret = access_token.secret
    end
    "Logged in #{twitter_client.user.name}"
  end
end

説明

まず / にアクセスすると oauth.get_request_token を使ってログイン認証用の URL を取得し認証画面にリダイレクトされます

そこで Twitter 認証すると /redirect に飛ばされ認証時に渡される :oauth_verifier を使って oauth_client.get_access_token でトークンを取得します
あとは Twitter API のクライアントを使ってユーザ情報を取得しています

動作確認

ログインしていないと初めは認証画面が表示されます
認証に成功するとアプリからのアクセスを許可するか確認する画面になるので許可します
twitter_oauth3.png

あとは localhost に戻ってきて Twitter API がコールされユーザ名がブラウザに表示されると思います

最後に

Twitter の OAuth を使って Web アプリのログイン機能を実装してみました
今回は oauth というライブラリを使いましたが Twitter の場合、使えるライブラリは他にもいろいろあるようです (omniauth-twitter, Twitter ライブラリを使ってもできるようです)
この辺りは環境に合わせて好きなものを選択すれば良いと思います

Twitter の場合アクセストークンにシークレットもあるのが他の OAuth と少し違うところかなと思います
また権限も API 単位というわけではなく大雑把に Read or Write という感じで設定するのも他と異なる点かなと思います