Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UA別プリセットの検討 #8

Closed
5 of 8 tasks
onihusube opened this issue Jul 30, 2022 · 6 comments
Closed
5 of 8 tasks

UA別プリセットの検討 #8

onihusube opened this issue Jul 30, 2022 · 6 comments

Comments

@onihusube
Copy link
Owner

onihusube commented Jul 30, 2022

基本構想

preset.yamlのようなファイルを導入して、ここにUA別にプリセットを書いておいて読み込ませて使用するようにするとする。

- style
  - UA : Monazilla/1.00 JaneStyle/4.23 Windows/10.0.19044
  - Appkey : ****
  - HMkey : ****
  - PostFiledOrder : submit&FROM&mail&MESSAGE&bbs&key&time
  - ThreadPostFieldOrder : submit&FROM&mail&MESSAGE&bbs&key&time
  - NonceType : Sec
  - RefererType : Board
  - KeepAlive : false
- mate
  - ...

みたいな構文を想定。

BoardSettings.yamlの各設定には新しいPresetのようなプロパティを追加して、これによって板毎に参照するUA設定を制御する。

  • メリット
    • 板毎設定とUA/キー関連設定を分離できる
    • プロファイル的な使い方に拡張可能
  • デメリット
    • 設定ファイルが増える
    • 書き込み関連設定のほとんどがUIから制御できなくなる
      • UIの設定は読み込みに関するもの、という分離にはなる・・・?
    • UIと設定項目の重複がある
    • 設定変更に再起動が必要

検討項目

  • 使用するプリセットの選択について(いくつか実装が考えられる
    1. 書き込みUAとプリセット名のマッチングをとって、使用するプリセットを自動選択する
    2. 書き込みUAは無視してBoardSettings.yamlで使用するプリセットを指定する
    • UIから指定できるようにするとして、板毎設定の共通設定との関係をどうするか?
    1. 1と2を両立する
      • 共通設定の扱いはどうするか?
  • プリセットに必要なプロパティ
  • YamlDotNetは列挙値をデシリアライズできるのか?
    • 普通にできた
  • 各プリセット毎のmonakeyをどこに保存するか?
    • yamlは読み込み専用にしたい気持ちがある
    • settings.xmlに1つの文字列にして保存
  • 板別設定の共通設定の扱い
    • 全て無視されるようになるため、必要なくなる
    • プリセットが存在しない時のフォールバック先にする?
  • UI上の設定との優先度付けなど
    • 書き込みUAの扱いをどうするか
      • プリセットが無い場合と旧書き込み方式でのみ使用される
  • 実装時の優先順位
    • 指定されたプリセットを常に使用する
    • 板別設定はプリセット指定とUAのみを上書きする
    • プリセットが無い場合に、旧(現在の)書き込み設定を使用
    • 旧書き込み方式では旧(現在の)の設定を使用
  • 現在の設定項目の後方互換性について
    • 少なくともエラーにならないようにする必要がある
    • プリセットが無い場合にのみ既存設定を使用する

関連

#2 #6

ご意見等ありましたらご自由にどうぞ

@onihusube
Copy link
Owner Author

参考になるかもしれない要望等

yaml2つ読んでくれるようにならないかな
_default : だけxmlの方に保存でもいいけど
pink と 板別設定は一律だけど _default : だけはkeyと結び付いてるので

余所規制と同じ状態になって来たのでやっぱ板別設定出来るようになって欲しいな
設定別に多重起動しておいて専ブラ側で手動でポート切り替えるのはちょっと手間。切り替え忘れて鍵無効なるし

UAのWinVerとか泥のDalvikを複数登録しておいて書ける組み合わせを自動で探して板別設定として保持してくれたら完璧
その際、不正取得なったらこれも自動でIP変えてくれたら神
IP変えられるかどうかは契約回線サービス次第だけどIP変更してくれるソフトとかあるから技術的に不可能てことは無いと思うんだが

ただ、新しい書き込み仕様の噂も立ってるから使い回せなくてガックリ来るような機能の実装は避けた方が良いだろうけど板別の機能は無駄にはならないと思うんよね
作者さん頼りで申し訳ないが頑張って欲しい

モチベ湧かんなら寄付の窓口用意してみるとか
更に下がる可能性もあるが

@onihusube
Copy link
Owner Author

onihusube commented Jul 30, 2022

専ブラ事の新書き込み時リクエストの多様性、mateを基本とすると

  • 共通
    • X-2ch-UAヘッダがない
      • 今んとこ必要なのはmateだけ?
    • ポストフィールドの順序が違う(書き込みとスレ立てでも違う
    • 細かいヘッダが異なる
  • style
    • nonceの値が秒単位
    • Refererが板URL
  • En2ch
    • nonceのミリ秒単位が常に000
    • Content-TypeのUTF-8が小文字?

@onihusube
Copy link
Owner Author

onihusube commented Aug 1, 2022

作者さんが 「UA別プリセットの検討」 を始めて下さったようです
皆さん情報提供、エールをお願いします
Githubはアカウントが無いと投稿出来無いようですのでこちらに投稿させて頂きます

デメリット
設定ファイルが増える

のは各設定を整理されると思えば問題無いんじゃないでしょうか

書き込み関連設定のほとんどがUIから制御できなくなる
 UIの設定は読み込みに関するもの、という分離にはなる・・・?

これです。"専ブラ←→串"間と"串←→5chAPI"間の設定の分離

UIと設定項目の重複がある

重複はなるべく避けたいですね

設定変更に再起動が必要

リロード可能な方が良いですがそれが手間なら再起動でも問題無いかと

何か気付きや参考になればと思い、素人ながらプリセット(プロファイル)仕様を考えてみました

APIKey,HMKey,書き込みやスレ立てのヘッダーとその値類をテンプレート化 "./template/2chMate_0.8.10.153.tpl"
各tplファイルのAPIKey,HMKeyを空欄にしておき、そこだけユーザーに書き込んでもらう
この部分がテンプレート化するメリットとして根本的な仕様変更以外は有志による対応が可能に
今後、専ブラ毎にSIDやMonakeyの計算式が違って来たりした場合、それらもテンプレートとする事で有志に任せ本体側更新の手間を減らせられます
Winver.txt,Dalvik.txtにUA後半の固有情報羅列。UIから選択時に使用
profile.ini かsettings.xml に
iniの場合:
[PF1]
name=2chMate/0.8.10.153 Dalvik/2.1.0 (省略)#UIプロファイル選択欄に表示されるプロファイル名
type=2chMate_0.8.10.153.tpl#POSTに使用するテンプレート
Dalvik=Dalvik/2.1.0 (省略)#.tplと組み合わせられるUA後半ユーザー固有機種OS等情報
key=#Monakey
[PF2]
name=JaneStyle/4.23 Windows/10.0.22000
type=JaneStyle_4.23.tpl
Winver=Windows/10.0.22000
key=

こんな感じで "テンプレート(偽装専ブラ)" + "UAのユーザー固有部分" を組み合わせプロファイル化
デフォルトや板別などをプロファイルにて指定
UIからのプロファイル作成時はテンプレートと対応した固有情報部分(Winver.txt|Dalvik.txt)をプルダウンで選択し保存
プロファイル名をそれらから自動で出力しつつユーザーが名前変更可能
テンプレート側にWinverかDalvikどちらと組み合わされるかの情報が必要

通知アイコン右クリックメニューに[プロファイル→]
マウスオーバーでプロファイル名と「解除」をズラッと表示し選択で現在のプロファイルを一時的に変更
[解除]で一時変更を解除し設定してあるデフォや板別に従う、みたいな

肝心なテンプレート化のメリットとして
StyleやLiveのスレなどでどこどこの板はWindows/10.0.22000では書けないけどWindows/10.0.25151では書けるといった情報が共有されており
板依存の規制ではWinver違いのプロファイルを複数用いることが想定されます
分けて居ない場合、設定データが無駄に重複して大きくなってしまいます
共通部分としてテンプレート化することで設定データをスッキリさせられます

🙏🙏🙏🙏

板毎にUAのバージョン部が異なりうると言うのは盲点だった。
板毎設定(BoardSettings.yaml)の方で指定したUAで置換するようにすれば割と自然にフィットしそう。

将来的に他の部分が変わる場合は・・・プリセットの重複を許容する?

そうなると、共通も含めた板毎設定で使用するプリセットを指定して使用するようにして、UIの書き込みUAから自動判別のやり方はなしかな

UI上でプリセットを指定できるようにする(タスクトレイのメニューも含めて)のは多分将来の方向性で、そうなると板毎設定の共通設定との兼ね合いをどうするか

@onihusube
Copy link
Owner Author

onihusube commented Aug 1, 2022

1つのプリセットに必要なプロパティ、暫定

    // nonce値の表記の指定
    public enum NonceTypeEnum
    {
        Sec = 0,
        Milisec,
        MilisecZero,
        MilisecRandom
    }

    // リファラの種類の指定
    public enum RefererTypeEnum
    {
        BoardURL,
        ThreadURL,
        ThreadURLl50
    }

    // 1つのプリセットを表すクラス
    public class PostSettings
    {
        public string UserAgent { get; set; }

        public string AppKey { get; set; }

        public string HMkey { get; set; }

        public string X2chUA { get; set; }

        public string PostFiledOrder { get; set; }

        public string ThreadPostFieldOrder { get; set; }

        public NonceTypeEnum NonceType { get; set; } = NonceTypeEnum.Milisec;

        public RefererTypeEnum RefererType { get; set; } = RefererTypeEnum.ThreadURL;

        public bool KeepAlive { get; set; } = false;

        //public string ContentType { get; set; }

        public Dictionary<string, string> Headers { get; set; } = new Dictionary<string, string>();
    }

ContentTypeの指定はヘッダ指定としてやったほうが良いかな?

  • これをプリセット名文字列をキーとするDictionary<string, PostSettings>みたいなのに入れて、プリセット名から引き当てる。
  • プリセット名は板別設定で指定。
  • デフォルトで使用するプリセットはUIから設定できるようにして、その場合は共通設定を上書きする(共通設定のプリセット指定は無視される?)。
  • 指定されたプリセット名が削除されている場合エラーを出さないようにする必要がある(保存された設定と食い違いうるため)
    • その場合は残ってるプリセットから何か選択するしかない
    • プリセットが空の場合はエラーをログに出す

こうなると、板別設定はプリセット名とUA(とお絵描き?)くらいしか指定するものがなくなり、板別共通設定はpink専用になりそう。

@onihusube
Copy link
Owner Author

onihusube commented Aug 6, 2022

monakeyの保存は現在同様settings.xmlにシリアライズして行う。

monakeyはUAとセットで扱う。その際問題になるのはDictionalyxmlselalizerでシリアライズできないこと。

そのため、(UA, monakey)のペアの列を1つの文字列としてシリアライズする。その際さらに問題なのは、ペア間の境界とペア内でのUAとkeyの境界判定。UAには任意の文字が入るし、monakeyも何か仮定できそうにない。

何かしらエンコードしてその結果に表れない文字でつないでいく

  • URLエンコード
  • Base64エンコード

URLエンコードすることにする。URLエンコードをE(...)であらわして、次のように文字列化

E(UA1):E(monakey1)&E(UA2):E(monakey2)&...&E(UAn):E(monakeyn)

@onihusube
Copy link
Owner Author

ひとまず必要なくなったっぽい

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant