HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1030
ABATBelieverbload,bsaveによるURLマネージャー5解決


ABATBeliever

リンク

2023/10/30(Mon) 21:22:20|NO.100384

ブラウザを作っていまして、URLの「お気に入り登録」実装のためにURLと保存名のリストを作成しています。
ほとんどの設定はモジュールを使ってiniファイルで設定しているのですが、WindowsDefenderの都合で
iniへの書き込みやnoteload系が使えません。

bload,bsaveは回避できたので、これを使っています
私自身ちょっと作ったのですが、コードが長いスパゲティなので載せられません。

・bloadで変数に代入
・∣(URLに含まれてない文字)毎にURLと値を切り分け配列で代入
・くっつけて値を追加
・bsaveで保存
はできました。

が不安定過ぎて駄目です

長々と書いてますが、要は信頼性ある実装や値の格納方法が知りたいです
概念でもいいのでよろしくお願いします



この記事に返信する


usagi

リンク

2023/10/30(Mon) 22:29:47|NO.100386

こんにちわ。
私のDefender入っている環境ではこんな感じで、
iniの読み書き出来てるのですが動きますか?

#ifndef __ini__ #define global __ini__ #module _ini_ #uselib "kernel32.dll #func write "WritePrivateProfileStringA" sptr,sptr,sptr,sptr #func read "GetPrivateProfileStringA" sptr,sptr,sptr,var,int,sptr #define guard if mfile = "" { return -1 } #deffunc inisel str file_ mfile = file_ : sdim mbuf, 512 : return #deffunc iniget str sec_, str key_, var val_ guard read sec_, key_, "", mbuf, varsize(mbuf), mfile switch vartype(val_) case vartype("str") : val_ = str(mbuf) : swbreak case vartype("double") : val_ = double(mbuf) : swbreak case vartype("int") : val_ = int(mbuf) : swbreak swend return #deffunc iniset str sec_, str key_, var val_ guard switch vartype(val_) case vartype("str") : mbuf = strf("\"%s\"", val_) : swbreak case vartype("double") : mbuf = strf("%.16e", val_) : swbreak case vartype("int") : mbuf = strf("%d", val_) : swbreak swend write sec_, key_, mbuf, mfile return #deffunc inidel str sec_, str key_ guard : write sec_, key_, 0, mfile : return #global #endif ; サンプル #if 1 name = "hoge" : age = 12 : height = 120.5 inisel ".\\settings.ini" iniset "settings", "name", name iniset "settings", "age", age iniset "settings", "height", height name = "" : age = 0 : height = 0.0 iniget "settings", "name", name iniget "settings", "age", age iniget "settings", "height", height mes strf("%s, %d, %f",name, age, height) #endif

あとは保存先のフォルダ、ファイルが読み取り専用になってるとか。。。
(でもbsaveは出来ているので、お使いのモジュールの問題かな?)

一案ですが、bsaveでテキストとして扱うなら、
csv形式として文字で扱うのが楽かもしれないですね。
行ごとに、split で","で区切って読み書きすれば良いかと思います。
↓こんな感じのテキストとして格納する。

ID,URL,name 0,http://hoge,ページ1 1,http://fuga,ページ2



ABATBeliever

リンク

2023/10/31(Tue) 16:53:49|NO.100390

ブラウザに入れるとトロイ判定来るんです
csv,これならlengh関数で値があるかも確認できるし超楽ですねいいかも
でもこれだと値を削除したときに空行ができちゃってだめなんですよね...



usagi

リンク

2023/10/31(Tue) 17:39:42|NO.100392

あら、動きませんでしたか。残念。。。

「ブラウザに入れる」と言うのが私が理解出来てなく申し訳ないですが、
noteloadは使えないとの事ですが、noteselは使えそうなので
大よその環境で動きそうな感じにしてみました。

あと、値の削除は保存しなければ、読み込みも問題無いかと思いました。
※何かしらの都合で残したければ逆に読み込む時に無視するとか。


#module #define DEF_FILE_NAME "favoriteList.csv" #deffunc saveFavorite array _urls, array _names data = "" foreach _urls if _urls.cnt = "" : continue ; 空なら保存しない。 data += strf("%s,%s\n",_urls.cnt, _names.cnt) loop bsave DEF_FILE_NAME, data, varsize(data) return #deffunc loadFavorite array _urls, array _names sdim _urls : sdim _names bload DEF_FILE_NAME, data notesel data repeat notemax noteget sline, cnt getstr _urls.cnt, sline, 0, ',' getstr _names.cnt, sline, strsize, ',' loop return #global favoriteUrlList = "ここにURL1", "", "ここにURL3" favoriteNameList = "〇〇ページ", "", "××ページ" saveFavorite favoriteUrlList, favoriteNameList loadFavorite favoriteUrlList, favoriteNameList foreach favoriteUrlList mes strf("%s,%s",favoriteUrlList.cnt, favoriteNameList.cnt) loop



ABATBeliever

リンク

2023/11/1(Wed) 22:04:58|NO.100403

おお〜
動きましたんでこれ使うかもですありがとうございます。
一応自分でもcsvのインスピレーションでコード書いたんで(?)置いときます。

favos.bin
有効な値(https),1,www.youtube.com|カンマ区切りがおかしいが修復できる場合(http),2,www.sample.com,,|ダメな奴(要素不足),|50|
;50(ポケモン由来)が来たらそのあとは読まないので関係ないことかける ;50ない時は変数最後尾に追加するEOFが来るまで読むが、その場合こんなコメントあるとおそらくまずい ;カンマは要素の区切り(タイトル/省略コード/URL)で、|はデータ(パケット)の境目 ;このコードはライセンスフリーで ;値の追加はできるけど、削除の実装方法わかんない

Loader.hsp

//ファイル名は favos.bin、dialogなどでファイル選択させると引っかかる //VirusTotal合格、WebViewと統合しないならnote系がいいかと sdim FavoBuffer,12800 gosub *FavoLoad//読込 repeat OKPaket mes FavoTitles(cnt)+"|"+FavoURLs(cnt)//読み取ったやつ loop stop *FavoLoad exist "favos.bin" if strsize = -1 {mes "No bin":return}//有無 bload "favos.bin",FavoBuffer FavoBuffer = FavoBuffer+"|EOF|"//オーバーフロー対策で終端文字追加 split FavoBuffer,"|",FavoPaket//項目ごとに分ける //読み取り用変数初期化 ReadingPaket=-1//精査するパケットの番号 DevidePaket=""//精査するパケットそのもの OKPaket=0//代入する値 Total=-1//有効なパケット gosub *PaketLoad mes "\nパケット合計 :"+(length(FavoPaket)-2)+"\n有効 :"+OKPaket+"\n破損 :"+(ReadingPaket-OKPaket) return *PaketLoad ReadingPaket=ReadingPaket+1//次精査するパケット DevidePaket(0)=""//データ複製防止 DevidePaket(1)=""//データ複製防止 DevidePaket(2)=""//データ複製防止 title str(ReadingPaket):wait 50 if FavoPaket(ReadingPaket) = "50" {mes "\n<正常終了>":return}//終端? if FavoPaket(ReadingPaket) = "EOF" {mes "\n<ファイルに終端文字50が存在しません>":return}//終端? split FavoPaket(ReadingPaket),",",DevidePaket//パケット分ける if DevidePaket(0) = "" or DevidePaket(1) = "" or DevidePaket(2) = ""{mes "無効値:"+readingPaket+"|":gosub *PaketLoad:return}//破損してない? FavoTitles(OKPaket)=DevidePaket(0) FavoProtocol=DevidePaket(1) FavoURLs(OKPaket)=DevidePaket(2) if FavoProtocol=1 {FavoURLs(OKPaket)="https://"+FavoURLs(OKPaket)//https,http,ftpを短縮するやつ }else:if FavoProtocol=2 {FavoURLs(OKPaket)="http://"+FavoURLs(OKPaket) }else:if FavoProtocol=3 {FavoURLs(OKPaket)="ftp://"+FavoURLs(OKPaket) } Total=Total+1//有効な合計 OKPaket=OKPaket+1//有効な代入数、異常だった場合上書き gosub *PaketLoad return



ABATBeliever

リンク

2023/11/1(Wed) 22:24:12|NO.100405

追記
ダメでした
試しにブラウザに入れてDiscordからダウンロードしたら判定来ました

Win32/Contebrew.A!ml

ブラウザへの追加はHSPでは困難かもしれません



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100384への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.