はてなキーワード: greasemonkeyとは
ご紹介いいただいたgreasemonkeyをインストールすると、特定IDの「このエントリーを含む日記」を非表示にすることができるのですか?
週末に試してみます。
それグリとか思いつつ、前になんか作ったよな、とおもって探した。
[greasemonkey] [anond:20080302214727:title]を勝手に改造をちょっといじれば出来そうなのでメモ。
後でやるかはわからない。
[追記] つか、まとめあるじゃんか。
罵倒語、誹謗中傷語、差別語等を■に置換するきれいなインターネット(笑)Greasemonkey scriptを誰か作らないかな。無論、縦読みとか対応できないし、言い換えも進むから、実効性は不十分であることはおいといて。そういったものを見たくないカジュアルユーザに薦められるものがあったらいいなぁと。共通の辞書とユーザ辞書も作成できるようなものがあるといいな。
http://digimaga.net/internet/200806/hatena-is-just-like-2ch.html
とりあえずGreasemonkeyでも書いてみた
でもproxomitronの方が軽いような気がする
// ==UserScript== // @name simple reply // @namespace aomid // @include http://anond.hatelabo.jp/ // ==/UserScript== document.body.innerHTML = document.body.innerHTML.replace(/<!--\s(<a.*href=".*edit\?title.*\/a>)\s-->/g,"$1");
追記:firefoxの拡張「MR Tech Link Wrapper」と干渉して、日記の編集時、日記の確認画面から編集画面に戻った時、本文に<wbr>タグが付加されるバグを確認。
増田のソースを眺めてたら、「この記事について書く」って機能のリンクがコメントアウトされてたのでproxomitronを使って復活させてみた。
何でコメントアウトしてんだろう、結構便利なのに。
greasemonkeyあたりで書けば需要あるかね?
[Patterns] Name = "masuda:simple reply" Active = TRUE Multi = TRUE URL = "anond.hatelabo.jp/*" Limit = 256 Match = "<!--\s($NEST(<a*,href=$AV(*edit\?title*)*,/a>))\1\s-->" Replace = "\1"
それGreasemonkeyで、ということで
インストールはこちらから
http://userscripts.org/scripts/show/37782
初めて Greasemonkey を作って自信が無いので増田で投稿。切り換えボタンがあった方が便利だと思うが、まぁいいや。
やっぱり切り換えボタンがあった方がいいかな、と思ったので追加した。
Reverse Bookmark Comment [sort]変更した、詳細は下記で
の [sort] をクリックで昇順・降順の切り換え。
ブックマークが無い場合の処理と、ソートを行うかの設定を追加した。始めに並べ替えたくない場合は
ReverseHatenaBookmarkComment を false に(上で追加した [sort] [▽] で昇順・降順の切り換えは可能。)
実際使ってみると、通常の並びの方が見やすく感じたので。でも慣れのせいかも。だからそこら辺の設定があった方がいいんじゃね?という。
ブックマーク数が多い場合の詳細ページっていうのかな?要は
こういうページにも対応した。
関連エントリー機能が追加されて、ページ構造が変化したので修正。でもこの関連エントリーの位置はまた変わるかもしれないけれども。
関連エントリーの位置が変更されたので、修正。対応が遅れてスミマセン。
コメント一覧非表示機能が追加されたので、それに応じて修正。
リニューアルに対応、また分かりやすいようにソートされてる場合[▲]通常の並びでは[▽]と変更しました。
cf.はてなダイアリーの過去ログを日附昇順に竝べ替へるユーザスクリプト - MORIYAMA Hiroshi's Diary
cf. はてブからネットイナゴを駆除(?)する「Hatebu Tag Killer」 (ひぐまのひまグ)
ちなみに後者の方は、コメントの内容を正規表現でブックマークコメントが削除できるGreasemonkeyが便利。
こっちはスター順に並べる
http://www.dan.co.jp/~dankogai/ldr-hbc/ より
// ==UserScript== // @name tsun-buyo // @include http://b.hatena.ne.jp/* // ==/UserScript== (function(){ buyobuyo = document.getElementById('bookmark-user-buyobuyo'); buyobuyo.innerHTML = buyobuyo.innerHTML.replace(/あたまがわるい/g,'もうっバカッ/////').replace(/あとでDISる/g,'そんなことばっかり言って……。後で覚えてなさいよ……!').replace(/これはひどい/g,'これってひっどーい!ぷんぷん!').replace(/意味がわからない/g,'なにわけわかんないこと言ってんの!!!/////').replace(/死ねばいいのに/g,'バカッ!変態!もう、○○なんか、し、しんじゃえ///'); })();
参考: http://d.hatena.ne.jp/mujin/20080326/p3
buyobuyoという人のことはよく知らないし、ツンデレなんて好きでもなんでもないんだからねっ!
UIなしだけど両方ともgreasemonkeyがある。この二つだけならユーザスクリプトでクライアント側でやる方が効率はよいだろうね。ただ、一番問題なのはUIが面倒、ってことだ。
とりあえずリストアップ
こんなところか?その他、キーワードgreasemonkeyとかnameとかタグ[[greasemonkey]]とかで色々あったりする。でも探すのははてブの方が良いかな?
firefoxでしか確認していないけれど、URL、正規表現、XPathで指定できる様にしてみたよ。
// ==UserScript== // @name filter for Hatena::Bookmark // @namespace http://anond.hatelabo.jp/ // @include http://b.hatena.ne.jp/hotentry* // @include http://b.hatena.ne.jp/entrylist* // origin http://anond.hatelabo.jp/20080302214727 // ==/UserScript== (function(){ var itemxpath = "//div[@class='entry']"; function xpathgenURL(url) {return "//div[@class='entry' and descendant::a[starts-with(@href,'"+url+"')]]"} var filters = [ // start with '//' then xpath // moconico douga // {"tag": "div", "name": "entry", "pattern": "nicovideo\.jp"}, "//div[@class='entry' and descendant::a[contains(@href,'nicovideo.jp')]]", /* // tag of "2ch" {"tag": "a", "name": "tag", "pattern": "2ch", "parentNum": HatebuTagParentNum}, {"tag": "a", "name": "tag", "pattern": "\\*2ch", "parentNum": HatebuTagParentNum}, ***/ // start with 'http' then url // 2ch blogs // livedoor // {"tag": "div", "name": "entry", // "pattern": /http:\/\/blog\.livedoor\.jp\/(insidears|dqnplus)\//}, "http://blog.livedoor.jp/insidears/", "http://blog.livedoor.jp/dqnplus/", // {"tag": "div", "name": "entry", // "pattern": /http:\/\/(guideline|alfalfa|news4vip)\.livedoor\.biz\//}, "http://guideline.livedoor.biz/", "http://alfalfa.livedoor.biz/", "http://news4vip.livedoor.biz/", // typeof /regexp/ is function (@firefox) then regexp pattern // fc2 // {"tag": "div", "name": "entry", // "pattern": /http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//}, /http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//, // tag of "neta" // {"tag": "a", "name": "tag", "pattern": "ネタ", "parentNum": HatebuTagParentNum}, "//div[@class='entry' and descendant::a[@class='tag' and string()='ネタ']]", // {"tag": "a", "name": "tag", "pattern": "*ネタ", "parentNum": HatebuTagParentNum}, "//div[@class='entry' and descendant::a[@class='tag' and string()='*ネタ']]", // hatena anonymouse diary // {"tag": "div", "name": "entry", "pattern": /http:\/\/anond\.hatelabo\.jp\//} "http://anond.hatelabo.jp/", ]; for (var i=0; i<filters.length; i++) { var filter = filters[i]; var type = typeof filter; var regexp; var xpath; if (type == "function") { xpath = itemxpath; regexp = filter; } else if (type == "string") { if (filter.match(/^http/)) { xpath = xpathgenURL(filter); } else if (filter.match(/^\/\//)) { xpath = filter; } else { next; } } var removeNodes = document.evaluate(xpath,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var j=0; j<removeNodes.snapshotLength; j++) { var node = removeNodes.snapshotItem(j); if (!regexp || node.innerHTML.match(regexp)) { node.parentNode.removeChild(node); } } } })();
ついでに増田版も作ってみたよ。
// ==UserScript== // @name filter for Hatelabo::AnonymousDiary // @namespace http://anond.hatelabo.jp/ // @include http://anond.hatelabo.jp/ // @include http://anond.hatelabo.jp/*?page=* // @exclude http://anond.hatelabo.jp/YourID/* // ==/UserScript== // origin http://anond.hatelabo.jp/20080302214727 (function(){ var itemxpath = "//div[@class='section']"; function xpathgenURL(url) {return "//div[@class='section' and descendant::a[starts-with(@href,'"+url+"')]]"} var filters = [ // start with '//' then xpath "//div[@class='section' and child::h3[starts-with(string(),'■はてなの嫌われ者!')]]", // start with 'http' then url "http://anond.hatelabo.jp/", // typeof /regexp/ is function (@firefox) then regexp pattern /釣り/, ]; for (var i=0; i<filters.length; i++) { var filter = filters[i]; var type = typeof filter; var regexp; var xpath; if (type == "function") { xpath = itemxpath; regexp = filter; } else if (type == "string") { if (filter.match(/^http/)) { xpath = xpathgenURL(filter); } else if (filter.match(/^\/\//)) { xpath = filter; } else { next; } } var removeNodes = document.evaluate(xpath,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var j=0; j<removeNodes.snapshotLength; j++) { var node = removeNodes.snapshotItem(j); if (!regexp || node.innerHTML.match(regexp)) { node.parentNode.removeChild(node); } } } })();
Pipes: Rewire the webを使うと他人のサイトが簡単にスクレイピング出来てしまう。これまでスクレイピングするのにはほんのちょっとだけ技術的心理的障壁があった。今はそれすら要らない。loopとfetchだけわかればいい。広告を消すのも全文配信させるのも簡単に出来てしまう。
自前でplagger置いて加工するのはセーフ?
じゃあfeedreaderで読んでてgreasemonkeyで引っ張リ出すのは?
じゃあpipesは?
じゃあそれを公開するのは?
UTF-8ではないフィードを変換するのにwebサービスを使った。そのサービスが広告を差し込んでくるのは?
RSSに広告が差し込んであるのはウザい。それを消したものを公開するのは?
他人のフィードのアフィリエイトIDを全部自分のものに書き換えて公開するのは?
一度公開されてる情報だから好きにしていいだろ、これって通じるの?
出来てしまう事に逆らうべきではないという思考停止。
便利だからいいじゃないかという思考停止。
考えてもよくわからないから他人に丸投げして思考停止。
やってはいけないことのような気がするから触れないという思考停止。
フィードって何なのだろう。
webサイトって何なのだろう。
お金の臭いや作為の臭いがするとうわって思うけど判断基準はそれでいいの?それだけなの?
フィードで全文配信しないサイトは絶滅すればいいと思ってる。でもそれとこれとは話が別だ。
拒否するにはhttpd.conf(.htaccess)にUA書くかmeta tagに書くかpipesチームにメールを出せってこいつは何様なんだ?Pipes - Frequently Asked Questions
webサイトの書き手は、読み手は、いったいどこまで情報をコントロールする権利があるんだ?
サーバ型のFeed Readerが過去から未来までフィードを無限に全部蓄積して、すべて全文配信してくれれば一切余計なこと考えなくて済むのに。
とりあえずこれは読んだ。
ニュースのRSSを全文配信で読む - ytsuchiyamaの日記
こんなときのXPathじゃまいか。といってみる。
http://anond.hatelabo.jp/20080102122736
汎用性を上げてみた。
をはてブのhotentryから削除するgreasemonkey。
Sleipnir2のseahorseでも使える。
// ==UserScript== // @name hatebufilter // @namespace hatebufilter // @description Hatena bookmark filter // @include http://b.hatena.ne.jp/hotentry* // @include http://b.hatena.ne.jp/entrylist* // ==/UserScript== /* 問題点 いまのところなし ・問題が起こりそうなURL http://b.hatena.ne.jp/hotentry?mode=daily&date=20080224 http://b.hatena.ne.jp/hotentry?mode=daily&date=20080218 **/ (function(){ // Hatebu Tag var HatebuTagParentNum = 3; var filters = [ // moconico douga {"tag": "div", "name": "entry", "pattern": "nicovideo\.jp"}, /* // tag of "2ch" {"tag": "a", "name": "tag", "pattern": "2ch", "parentNum": HatebuTagParentNum}, {"tag": "a", "name": "tag", "pattern": "\\*2ch", "parentNum": HatebuTagParentNum}, **/ // 2ch blogs // livedoor {"tag": "div", "name": "entry", "pattern": /http:\/\/blog\.livedoor\.jp\/(insidears|dqnplus)\//}, {"tag": "div", "name": "entry", "pattern": /http:\/\/(guideline|alfalfa|news4vip)\.livedoor\.biz\//}, // fc2 {"tag": "div", "name": "entry", "pattern": /http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//}, // tag of "neta" {"tag": "a", "name": "tag", "pattern": "ネタ", "parentNum": HatebuTagParentNum}, {"tag": "a", "name": "tag", "pattern": "*ネタ", "parentNum": HatebuTagParentNum}, // hatena anonymouse diary {"tag": "div", "name": "entry", "pattern": /http:\/\/anond\.hatelabo\.jp\//} ]; for (var i = 0; i < filters.length; i++) { var f = filters[i]; filtering(f.tag, f.name, f.pattern, f.parentNum== undefined ? 1 : f.parentNum); } function filtering(tag, name, pattern, parentNodeNum){ var entrylist = document.getElementsByTagName(tag); //print("pattern = " + pattern); for(var idx = entrylist.length - 1; 0 <= idx; idx--){ // for(var idx = 0; idx < entrylist.length - 1; idx++){ if (entrylist[idx].className == name){ if (entrylist[idx].innerHTML.match(pattern)) { var node = entrylist[idx]; var oldNode = null; for (var j = 0; j < parentNodeNum; j++) { oldNode = node; node = node.parentNode; } // print("class = " + oldNode.getAttribute("class")); // print("id = " + oldNode.getAttribute("id")); node.removeChild(oldNode); } } } } })();
hatebufilter.user.jsなどとUTF-8で保存して使う。
しかし、増田のコード記法、日本語貼り付けたら化けるんだが・・・どうすればいいんだろ?
コメントアウトを直せば、2chコピペブログ以外の「2ch」タグ自体での削除も可能です。
> 一般的に大人と比べて経験も知識も足りない
自分の書いたGreasemonkeyがまとめサイトに紹介され自分の書いたソフトウェアが窓の杜に紹介された消防の僕はどうですか?
ついかっとなって書いた。動くことを優先で書いてるので、変なコードあるかも。
参考にしたもの:増田にあぼーん機能を追加するgreasemonkey
// ==UserScript== // @name hatena diary comment filter // @namespace http://anond.hatelabo.jp/ // @description abone specified id's comments. // @include http://d.hatena.ne.jp/* // ==/UserScript== (function(){ var ignore = [/kyoumoe/, /DASM/]; var abonemessage = "abone"; var commentatorIDs = document.evaluate('//a[@class="hatena-id-icon"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (i=0; i < commentatorIDs.snapshotLength; i++) { var commentatorID = commentatorIDs.snapshotItem(i); var idName = commentatorID.textContent; for (j=0; j < ignore.length; j++) { var isIgnoreID = ignore[j].test(idName); if(isIgnoreID) { break; } } if(isIgnoreID) { var commentator = commentatorID.parentNode; while(commentator.firstChild) { commentator.removeChild(commentator.firstChild); } commentator.textContent = abonemessage; var commentBody = commentator.nextSibling.nextSibling.nextSibling.nextSibling; while(commentBody.firstChild) { commentBody.removeChild(commentBody.firstChild); } commentBody.textContent = abonemessage; } } })();
インスパイヤ元 - http://anond.hatelabo.jp/20080219145538
@-moz-document domain("b.hatena.ne.jp") { ul#bookmarked_user{ font-size: 105%; } #bookmarked_user li{ list-style-type: decimal; } #bookmarked_user li:before{ content: '\FF1A'; } #bookmarked_user .timestamp:before{ content: '\756A\7D44\306E\9014\4E2D\3067\3059\304C\306F\3066\306A\3067\3059\FF1A '; font-size: 110%; font-weight: bold; color: #008000; } #bookmarked_user img.hatena-id-icon, #bookmarked_user .user-tag, #bookmarked_user .hatena-star-comment-container, #bookmarked_user .hatena-star-star-container{ display: none; } #bookmarked_user a[href*='bookmark-']:before{ content: 'ID:'; } #bookmarked_user a[href*='bookmark-']:link, #bookmarked_user a[href*='bookmark-']:hover{ color: black; text-decoration: none; } #bookmarked_user a[href*='bookmark-']:hover{ color: blue; text-decoration: underline; } #bookmarked_user span.comment{ display: block; padding: 8px 1em; margin-left: 1.5em; } }
曜日の表記と「2008年02月19日」を「2008/02/19」にしたかったが、方法が分からなかった。あ、あと投稿時間も。Greasemonkey じゃないと無理か?
転載・改変は自由なので、再利用したいとかここを変えた方がより良い、という方は好きに使って結構です。
→ はてブちゃんねる
誰か教えて。
oncontextmenuで禁止してるのを無効にするgreasemonkey書いてみた。
つ ツール→オプション→コンテンツタブ→「Javascriptを有効にする」チェックボックス横の「詳細設定」ボタン→「コンテキストメニューを無効化または変更する」チェックボックス
GMならURLでオンオフ指定できるけれども。アドオンでサイト毎設定とかはありそうな気がする。その昔はどっかの野良アドオン使ってた。piroさんのところだったっけか。
そんな私は現在NoScript。なので、
右クリック禁止にしてあったところで何の問題もない
わけだが、コンテキストメニューを変更して便利にしてるサイトを知らない。
誰か教えて。
http://anond.hatelabo.jp/20080127094645
oncontextmenuで禁止してるのを無効にするgreasemonkey書いてみた。
onmousedownで禁止してるのは無理だった。
http://userscripts.org/scripts/source/21614.user.js
// ==UserScript== // @name Allow Rightclick // @namespace http://www.petitnoir.net/ // @description // @include * // ==/UserScript== (function (){ var w = (typeof unsafeWindow == 'undefined') ? window : unsafeWindow; function unprotect(){ var contextmenus = document.evaluate('//*[@oncontextmenu]',document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (i=0; i < contextmenus.snapshotLength; i++) { handler = contextmenus.snapshotItem(i).getAttribute("oncontextmenu", false); if(handler.match("return false")){ if(handler.match(/alert\(\S+\)/)){ handler = handler.replace(/alert\(\S+\);/, ""); } handler = handler.replace("return false", "return true"); contextmenus.snapshotItem(i).setAttribute("oncontextmenu", handler,false); } } } var onload = w.onload; if (onload) { w.onload = (function(){ onload(); unprotect(); })(); }else{ unprotect(); } })();
nikkansports.comで右クリックを有効にしたい。その2 - Muibrogを参考にした。文京区立図書館のならこっちのスクリプトでも無効にできるよ。