メインコンテンツへスキップ

OAuthでアクセストークンを取得するスクリプト

OAuthでアクセストークン、アクセストークンシークレットを取得するサンプル。毎回、同じようなスクリプトを書いて使い捨てにするのはムダなのでメモしておく。

  1. ブラウザで表示されるURLへアクセスする
  2. リダイレクトされたURLのoauth_verifierの値を入力
  3. access_token.tokenaccess_token.secretが表示される
require 'oauth'

URL = "https://www.tumblr.com"
consumer_key = 'Cls**********yaqV4'
consumer_secret = 'RG****3KwFy'

oauth = OAuth::Consumer.new(consumer_key, consumer_secret, site: URL)
request = oauth.get_request_token(exclude_callback: true)

puts  "Access this URL: #{request.authorize_url}"
print "oauth_verifier: "
verifier = gets.chomp

access_token = request.get_access_token(oauth_verifier: verifier)
pp access_token

関連記事

Webページから本文らしき部分を抽出する

さまざまなパターンの日本語文章をデータとして欲しいケースがあったので、指定したURLから本文らしき内容を抽出するスクリプトを書いた。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 require 'playwright' require 'readability' require 'html2text' # 指定したURLから本文らしき内容を抽出して返却する def html2text(url) Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright| playwright.chromium.launch(headless: true) do |browser| begin page = browser.new_page page.goto(url, waitUntil: 'load') doc = Readability::Document.new(page.content) sleep 1 return {:title => page.title, :content => Html2Text.convert(doc.content) } rescue return {:title => nil, :content => nil } end end end end url = ARGV.shift doc = html2text(url) puts "#{doc[:title]}\n#{doc[:content]}" Javascriptでコンテンツを生成するページに対応するためPlaywrightを使用。 使用したライブラリ # cantino/ruby-readability: Port of arc90’s readability project to Ruby YusukeIwaki/playwright-ruby-client: Playwright client for Ruby soundasleep/html2text_ruby: A Ruby component to convert HTML into a plain text format.

2ホップリンク

ホップ数 # flowchart LR B1 & B2 --> A G --> O1 H --> O1 A --> O1 & O2 O2 --> E F --> O2 B1:::hop1 B2:::hop1 O1:::hop1 O2:::hop1 F:::hop2 G:::hop2 H:::hop2 style A fill:#f9f,stroke:#333,stroke-width:4px classDef hop1 fill:#a9a classDef hop2 fill:#f96 ホップ数とは自身から任意のページまでたどり着くまでのリンクの数である。 このようなリンク関係がある場合、ページAから見て、B1 B2 O1 O2は1ホップリンクと呼ばれる。 2ホップリンクの意味 # このため、上記のリンク関係で言えば、ページAから見たG H E Fは2ホップリンクとなる。 Scrapboxでは2ホップリンクの内、アウトゴーイングリンクのページへリンクしているページ、つまり、 AからリンクしているO1へリンクしている Gと H AからリンクしているO2へリンクしている F を関連リンクとして表示している。これは、 A→C, B→Cというリンクが存在するとき、AとBの間にはなんらかの関連があると考えてよい。 「和歌山」→「みかん」、「愛媛県」→「みかん」 ならば「和歌山県」と「愛媛県」はみかんつながりになっているわけだし、 「増井」→「Rubyプログラミング」、「高林」→「Rubyプログラミング」 ならば「増井」⇔「高林」は意味がある。 出典: 2ホップリンクの考察 - 増井俊之 上記の考え方に基づく仕様であり、本サイトでもQuartzを拡張し同様の2ホップリンクを表示している(各ページ配下の「関連リンク」) QuartzにScrapbox的な2ホップリンクを追加する Obsidiaのリンク表示 参考情報 # 2ホップリンクの考察 - 増井俊之

指定したWebページをMarkdownへ変換するRubyスクリプト

指定したWebページをMarkdownへ変換するRubyスクリプト require 'reverse_markdown' require 'open-uri' ReverseMarkdown.config do |config| config.unknown_tags = :bypass config.github_flavored = true config.tag_border = '' end def usage puts "usage: #{$0} uri" exit 1 end usage if ARGV.size != 1 html = OpenURI.open_uri(ARGV.shift).read print ReverseMarkdown.convert html

画像ファイルをまとめてリサイズする

RubyからImageMagickを使うためにRMagickで画像を一括してリサイズするスクリプト。Obsidianへ移行したメモに添付されていた画像サイズを圧縮するためにやっつけで作成 require 'RMagick' include Magick MAX_PIXEL = 800 MAX_FILE_SIZE = 300000 ARGV.each do |f| next unless %w(.jpeg .jpg .png .heic .webp).index File.extname(f).downcase size = File.size(f) next if size < MAX_FILE_SIZE img = Magick::Image.read(f).first next if img.columns <= MAX_PIXEL && img.rows <= MAX_PIXEL img.resize_to_fit(MAX_PIXEL, MAX_PIXEL).write(f) puts "#{f}: #{size} -> #{File.size(f)}" end

TemplaterプラグインのテンプレートからMoment.jsを使用する

ObsidianのTemplaterプラグインでデイリーノートを生成しているが、テンプレートではIntroduction - Templaterを参考に前後のデイリーノートへ移動するためのリンクを追加するようにしていた。 << [[2025-02-04]] | [[2025-02-06]] >> 上記のテンプレートでは、当日のデイリーノート作成ではうまくいくが、未来や過去日付のデイリーノートを作成した場合、その日付の前後のリンクではなく実行した当日を基準にリンクが追加されるため、本来の目的を果たせない。 Templaterプラグインのドキュメントを読んだところテンプレートの中からMoment.jsの オブジェクトにアクセスできるようなので、以下のように修正した。 << [Invalid date](/journal/Invalid date) | [Invalid date](/journal/Invalid date) >> これにより、Calendarプラグインで任意の日をクリックすると、その日の前後のリンクが設定されたデイリーノートのひな形を生成することができる。

Pocketに保存したページを読み上げてPodcastとして配信

PocketへWebページを保存するとページの本文らしき部分を抽出し、Text-to-Speechでそれを読み上げた音声ファイルを作り、プライベートなPodcastとして配信するしかけを作った。 音声合成エンジンとしてVOICEVOXも試したが、手元の環境で安定して動作させるところまでいけず断念。 システムの概要 # flowchart TD Podcastアプリ[/Podcastアプリ\] --> |参照|nginx Pocket[/Pocket\] --> |新規保存|IFTTT IFTTT --> |Webhooks|nginx subgraph システムの概要 nginx nginx --> |PodcastのRSSフィード参照|index.rss nginx --> |PocketしたURLを通知|sinatra subgraph PodcastのRSSフィード生成 mp3 --> |参照|index.rss mp3 --> |参照|dropcaster cron --> |5分毎|dropcaster --> |存在するmp3からRSSフィード生成|index.rss end subgraph 音声ファイル生成 sinatra sinatra --> readability readability --> |ページの本文|texttospeech texttospeech --> |本文からmp3生成|mp3[(mp3)] end end 使用したライブラリやサービス # Webhooks Integrations - Connect Your Apps with IFTTT Webページから本文らしき部分を抽出する nerab/dropcaster: Simple Podcast Publishing Text-to-Speech: 自然な音声合成 | Google Cloud