Greasy Fork is available in English.

crocoSkipper

croco.siteをスキップ

< 脚本crocoSkipper的反馈

提问/评论

§
发表于:2017-03-06
编辑于:2017-03-06

URLに「?l=」が含まれない場合の動作について

croco.site(croco.me)にはリダイレクトを含めると以下の4パターンのURLが考えられます("→"はJSによるページ遷移です)。
(1) http://www.croco.site/fUpG5PA4/?l=mint.2ch.net/test/read.cgi/download/1480597080/http://www.croco.site/sk78s5E2zq
(2) http://croco.site/fUpG5PA4/?l=mint.2ch.net/test/read.cgi/download/1480597080/http://www.croco.site/sk78s5E2zq
(3) http://www.croco.site/sk78s5E2zq
(4) http://croco.site/sk78s5E2zq

スクリプトが期待した動作となるのは(1)と(4)の場合のみで、(2)のような「www.」を含まないURLではそもそもスクリプトが動作しませんし、(3)のような「?l=」を含まないURLにアクセスした場合はlocation.href.split("?l=")[1]の部分がundefinedになりループに陥ってしまいます。

また、存在するかはわかりませんが「?l=」が複数個あるようなURLだった場合、2個目以降の部分が無視されてしまいます。
splitではなくsubstrなどで切り出すのはどうでしょうか?

plgdown作者
§
发表于:2017-03-06

マサカリ飛んできた!痛気持ち良い

splitを使ってる理由は、URLの「?l=」以前の文字数が一定かどうかわからなかったからですが、多分変わるのはwwwの有無ぐらいですかね

URLのパターンありがとうございました パターンを考慮したり無限ループを直したりしてみます

§
发表于:2017-03-06
编辑于:2017-03-06

この分野に関しては初心者なのですが(略)

v1.4のコードを読んだのですが、転送先URLがhttpsだった場合(例:href.li)は
dest_url = "http://https://href.li/?http://example.com/";
となりおかしくなってしまうようです。

また、?l= が複数個ある場合の対処も考えてみたのですがいかがでしょうか。

(function() {
var current_url = location.href;
var separator = "?l=";
var index;
if ((index = current_url.indexOf(separator)) === -1) {
return;
}
var dest_url = current_url.slice(index + separator.length);
if (dest_url.indexOf("://") === -1) {
dest_url = "http://" + dest_url;
}
location.href = dest_url;
})();


正直?l=の部分が変更されることは無いはずですが(既に使っているサイトが困ってしまうので)、自分的には"?l=".lengthindex + 3では気味が悪いのでseparatorに入れています。
動けば良いんですよ、動けば

plgdown作者
§
发表于:2017-03-07

なるほど、sliceで切り出せってそういうことでしたか if文の判定もdest_url.indexOf("://") === -1で良いんですね 危うくhttps用のif文を追記するところでした

ロジックは良さそうだし変数も整理されてるし僕のコードが入る余地がないじゃないですかやだー どうしようもないので書いて頂いたこれをそのまま1.5にしました また何か書いたら勉強させてください

发表回复

登录以发表回复。