PoE2 Merchant History: 購入履歴に対応

bagpack/poe2-merchant-history: PoE2 Chrome extension that stores league-based merchant history locally and visualizes sales trends with charts and tables. 購入履歴の表示に対応しました。 購入履歴を取得するAPIが見つからなかったので、トレードサイトのトレードボタンを押した商品を記録する方式です。

購入履歴

[PoE2-My-Watch]PoE2のトレード検索を「watch」として保存・整理するChrome拡張を作った

PoE2のトレード検索を「watch」として保存・整理するChrome拡張を作った

Path of Exile 2を遊んでいると、公式トレードサイトのタブを大量に開いて、どのタブが何のトレードだったのかわからなくなる現象が多発します。整理下手なので……。 それを解決するために、公式trade検索URLをwatchとして保存・整理するChrome拡張「PoE2 My Watch」を作りました。

ブックマーク管理

popupでは一覧からwatchを選び、元の公式検索を開いたり、watch名を編集したりできます。 watch名をタブタイトルに反映させることもできるのでタブも探しやすくなります。

価格の推移

watchを保存すると、価格も保存できます。

popupでは直近の中央値の推移を、ダッシュボードではmin、p10、中央値、p90、maxの価格分布を確認できます。表示通貨はwatchごとに自動、Exalted、Divine、Chaos、Mirrorから選べます。

ただし、これは市場全体の統計ではありません。ユーザーが公式トレードサイトで見ていた、その時点の表示中の内容を記録したものです。

ダウンロード先

以下からインストールできます。

github.com

PoE2 PoB Copy Button:トレードの検索結果に「PoB Copy」ボタンを追加する拡張機能

PoE2 PoB Copy Button:トレードの検索結果に「PoB Copy」ボタンを追加する拡張機能

Path of Exile 2 のトレード結果から、Path of Building 2(Create Custom)に貼り付けられる 「アイテム全文テキスト」をワンクリックでコピーできるChrome拡張を作りました。 非英語サイトで閲覧していても、英語データを裏で取得してPoB互換のテキストを用意します。

どんなことができる?

  • トレード結果の各行に「PoB Copy」ボタンが出る
  • クリックするとPoB互換の全文テキストをコピー
  • 非英語ドメインでも使える(英語データをバックグラウンドで取得)

使い方

  1. PoE2 トレード検索ページを開く https://pathofexile.com/trade2/search/poe2
  2. 各結果行に「PoB Copy」ボタンが表示される
  3. クリックで全文テキストがコピーされる
  4. Path of Building 2 の Create Custom に貼り付ける

インストール手順

  1. GitHub Releases から poe2-pob-copy-button-dist.zip をダウンロード
  2. zipを展開
  3. Chromeで chrome://extensions/ を開く
  4. 「デベロッパー モード」をON
  5. 「パッケージ化されていない拡張機能を読み込む」で展開先フォルダを選択

スクリーンショット

Github

github.com

PoE2 Merchant History: 公式サイトだと最新の100件しか表示できないのでローカルに保存

TL;DR

Path of Exile 2 の Merchant History は公式サイトでは最新の100件しか取得できません。
そこで、履歴をローカルに保存して可視化するChrome拡張を作りました。

作成動機

公式のmerchant historyはで取得できるのが「最新の100件程度」だけです。

「あとから振り返りたい」「リーグ単位で推移を見たい」と思ったときに、公式だけだと手元に残らない。
それなら定期的に取得してローカルに保存できる仕組みが欲しい、というのが出発点でした。

作ったもの:PoE2 Merchant History

Chrome拡張として、履歴をリーグ単位で保存・可視化できるツールを作りました。

主な機能は以下です。

  • リーグ一覧の取得と切り替え
  • 手動更新で履歴を取得(差分のみ追加)
  • 日次・通貨別の折れ線グラフ
  • 通貨別合計の表示
  • 履歴一覧(検索、ページング、詳細表示)
  • CSVエクスポート
  • Cookie状態の確認(options)

ポイント
公式APIの100件制限を補うため、定期的に更新して保存しておくことを前提にしています。

スクリーンショット

screenshot

使い方

  1. 拡張を読み込み
  2. リーグを選択
  3. 「更新」ボタンで履歴を取得
  4. グラフ・一覧で確認

注意点

  • PoE2のトレードサイトにあらかじめログインが必要です
  • 取得はレート制限の都合で1分に1回まで
  • データはローカル(IndexedDB)に保存されます

GitHub

Xの検索結果からミュート/ブロックを消すChrome拡張を作った

X(旧Twitter)の検索結果に、ミュートやブロックしたアカウントの投稿が混ざるという現象に長年悩まされており、なんなんこれと思っておりました。 調べてみると、もっと見る > プラバシーと安全 > 検索設定 > ブロックしているアカウントとミュートしているアカウントを除外するにチェックを入れると検索結果から除外できるということなのですが、私の環境だと効果がない。 そこでXの検索結果からミュート/ブロックを消すChrome拡張を作りました。

github.com

どんな拡張か

  • Xの検索結果ページだけを対象に、ミュート/ブロックしたアカウントの投稿を非表示にする
  • ログイン済みセッションからミュート/ブロック一覧を取得
  • X上でミュート/ブロック操作をすると即時反映
  • ポップアップに一覧件数と非表示件数を表示

仕組み

拡張は大きく3つの役割に分かれています。

1) ミュート/ブロック一覧の取得

背景で動くサービスワーカーが、XのGraphQL API(MutedAccounts / BlockedAccountsAll)を叩いて一覧を取得します。
ポイントはAPIのIDや機能フラグを自動で拾うことです。Xが内部で呼んでいるGraphQLのリクエストを監視して、必要なIDやfeaturesを保存しておきます。

さらに、認証用のBearerトークンやct0(CSRFトークン)も取得し、chrome.storage.localに保存して利用します。
結果として、ログイン中のセッションから「今のXが要求する形式」で一覧を取得できるようになっています。

2) 検索結果のフィルタリング

検索ページにだけ content script を注入し、DOMを監視します。
article[data-testid="tweet"]と[data-testid="UserCell"]を走査して、ミュート/ブロック一覧に含まれるアカウントの投稿をdisplay: noneで隠します。

ページ遷移や無限スクロールで新しい要素が追加された場合も、MutationObserverで即時反映する仕組みです。

3) X上の操作を即時反映

X上でミュート/ブロックを行ったとき、ページ内のfetch/XMLHttpRequestをフックして該当APIのレスポンスからscreen_nameを取得します。
取得したハンドルは拡張側に送信し、保存済みの一覧を更新することで他の画面で操作したミュート/ブロック操作を反映を実現しています。

使い方

  1. Xの検索ページ(https://x.com/search?...)を開く
  2. 拡張アイコンをクリックしてポップアップを開く
  3. 「ミュート/ブロック一覧を取得」をクリック

注意点・補足

  • 対象は「検索結果ページのみ」です
  • 取得したデータはローカル(chrome.storage.local)に保存されます
  • X側の仕様変更が入ると、動かなくなります

おわりに

個人的に使うために作った拡張ですが、同じ悩みを持つ人の参考になれば幸いです。

ABC001からABC007までやってみた思い出

AtCoder Biginner Contestの001から007までやってみて学んだことを覚えている限り

ABC001-D 感雨時刻の整理

いもす法というシンプルですごいアルゴリズムを知った。

いもす法 - いもす研 (imos laboratory)

蟻本を買った当時はまだ生まれていなかったアルゴリズムというのもエモい。

ABC003-D AtCoder社の冬

  1. パスカルの三角形を使うと、足し算のみで二項係数を求められることを知った
  2. 剰余演算の分配則

(a+b) \bmod n = ( (a \bmod n) + (b \bmod n)) \bmod n

ABC006-D トランプ挿入ソート

最長増加部分列( Longest Increasing Subsequence)というアルゴリズムを知った。

最長増加部分列(LIS)の長さを求める - Qiita

ABC007-D 禁止された数字

桁DPというアルゴリズムを知った。

桁DP入門 - ペケンペイのブログ

ここまでJavaScriptで解答してきたが、JavaScriptで表現できる整数が53bitまでという問題があり、Kotlinに切り替えた(AtCoderのNodeのバージョンではBigIntegerは使用できない)。

AtCoder Beginners Selectionの問題でつまづいたところ

積本の中に蟻本があるのを見つけたところ、急に競技プログラミングをやってみたくなった。 日本にはAtCoderというプログラミングコンテストサイトがあり、競技プログラミングの練習ができるという。 (蟻本を買ったのは2010年頃だったが当時はなかったかと思う)

親切なことに「AtCoderに登録したけど何をしていいか分からない・・・!」という人に向けて作られた、初心者向け問題集の AtCoder Beginners Selection が用意されている。 さっそく解いてみたところつまづいた。

行末改行問題

ABC049C - 白昼夢 / Daydream で解法はあっているはずと思っていても、一部のテストケースがさっぱり通らない。 諦めて他の人の解法を見ても、やはり間違っていない。

最終的には入力値をtrimすることですべてのテストケースが通るようになった。 行末が改行で終わっているテストケースとそうでないテストケースがあるのだろうか。

問題文をよく読め問題

ABC086C - Traveling も解法については問題ないはずだが、まったくテストケースが通らない。 公開されているサンプルのテストケースすら通らない。

1日経って気がついた。

求められている出力値は Yes あるいは No だが、 YES NO で出力しているのが問題だった。

言い訳させていただくと、一つ前の問題で求められている出力値が YES NO だったから……。