generated at
Discordに垂れ流す用のStream検索UserScript
使い方
自分のユーザーページにこのスクリプトをimportする
任意のページ上で任意の単語を選択する
ポップアップメニューに下記2つが追加されている
「Stream検索」:選択文字列でStreamを検索して、その結果をクリップボードにコピーする
「Stream検索爆弾」:選択文字列でStreamを検索して、その結果をクリップボードにコピーする(Discordに貼り付けた結果、プレビューが表示される)
どれかを実行したら、クリップボードにコピーされているのでDiscordの任意のチャンネルにペーストする。
Q.こちらはスマホでも使えるスクリプトですか?(スマホでメニューが出てこないので念のため確認)
Chromeなら使えるみたいです!Firefoxは無理でした。。
ありがとうございます、なるほどです(Safariの民より)。
なるほど!情報ご提供ありがとうございます!スマホの民には厳しいScrapbox。
Porterでは使えました
おお!良かったです
ChromeのPWAはダメだった。Chromeでは大丈夫だったのに。。ナゼ。
あれ?いま試したらChromeでもできなくなってる。
ええええ、解せぬ…。

script.js
scrapbox.PopupMenu.addButton({ title: 'Stream検索', onClick: function (text) { main(text) } }); scrapbox.PopupMenu.addButton({ title: 'Stream検索爆弾', onClick: function (text) { main(text, true) } }); export function main(word, bomb=false) { const project_url = 'https://scrapbox.io/arpla/' const api_url = 'https://scrapbox.io/api/stream/arpla/' const search_word = word === '' ? '哲学' : word const stream = JSON.parse(httpGet(api_url)) const filtered_stream = filterStream(search_word, stream) const result = filtered_stream.slice(0,10).map(page => { let url = `${project_url}${page.title}#${page.line.id}` url = bomb ? `● ${url}` : `● <${url}>` return url + ' 【' + page.line.text.replace(new RegExp(search_word,"g"), `**__${search_word}__**`).replace(/^ +/g,'') + '】' }) const message = filtered_stream.length > 0 ? `✨✨✨アープラノートの最近の記事で「 ${search_word} 」 が${filtered_stream.length}件ヒットしました(内${result.length}件を表示します):✨✨✨` : `😳😳😳アープラノートの最近の記事で「 ${search_word} 」はヒットしませんでした。記事を書いてみましょう。😳😳😳` if( copyText(message + '\n\n' + '>>> ' + result.join('\n')) ){ alert('クリップボードにコピーしました。Discordに貼り付けてね') } } function httpGet(theUrl) { var xmlHttp = new XMLHttpRequest(); xmlHttp.open( 'GET', theUrl, false ); // false for synchronous request xmlHttp.send( null ); return xmlHttp.responseText; } function filterStream(word, stream) { // streamの各ページで検索ワードに該当する行を抽出する let filtered_pages = stream['pages'].map(page => { let texts = page['lines'].map(line => line['text']) return { 'title': page['title'], 'lines': page['lines'].filter(line => line['text'].includes(word)) } }) filtered_pages = filtered_pages.filter(x => x['lines'].length > 0) // 最新履歴の行だけ抽出する filtered_pages = filtered_pages.map(page => { return { 'title': page['title'], 'line': page['lines'].reduce((a,b) => a['updated']>b['updated'] ? a : b) } }) return filtered_pages } function copyText(target_str) { // Clipboard APIが使えるかの確認 if(navigator.clipboard){ // 対象となる要素のテキストをコピー navigator.clipboard.writeText(target_str); return true; } else { return false; } }