![見出し画像](https://assets.st-note.com/production/uploads/images/147852630/rectangle_large_type_2_f59e736517c499947e32e9f85fb0b68e.png?width=1200)
PCでTwittwe(X)を快適に検索できるブックマークを作ってみた (初投稿)
こんにちは、僕はTwitterでスマホやガジェットのことを呟いているガジェオタです。ユーザー名は@niwakasumahoです。これは仮の投稿なので、あとで消して作り直すと思いますが、とりあえず作ったTwitter用のブックマークのJavascriptを貼り付けておきます。
注意事項
PCのブラウザでのみ動作します
ChromeとEdgeはちゃんと動作しました。他は検証してません。
必ず、ユーザーのプロフィールページから、ブックマークを起動してください。
もしかしたらバグって動かないかもしれません。そのときはごめんなさい。諦めてください。
機能
![](https://assets.st-note.com/img/1721416209039-9LLM0vZDOp.png?width=1200)
まずは、調べたい人のプロフィールページを開いて、そこからブックマークを起動してください。必ず半角数字で入力してください。
右上の×ボダンをクリックすると、フォームを消すことができます。
キーワードは3つまで入力することができます。
検索方法はデフォルトでは選択しないになっていますが、クリックすると、AND検索かOR検索を選ぶことができます。また、他の項目だけ入力して、キーワードを入力しなくても検索することができます。
いつから、いつまでを指定すると、それに反映して期間を指定して検索をすることができます。
ユーザーが投稿したツイートかユーザーへのリプライか絞って検索することができます。
フォロワーのみ、画像のみ、動画のみのフィルター検索もできます。フォロワーのみにチェックを入れた場合は、ユーザーが投稿/ユーザーへのリプライは選択しないでください。
いいねの数、リプライの数は入力した数値以上の検索結果が表示されます。
完全に一致するワードも指定できます。
除外ワードも指定できます。
言語設定もできます。また、除外設定にチェックを入れると、選択した言語以外のツイートが表示されます。
コード
javascript:(function() { function createInput(labelText, placeholderText, required) { var wrapper = document.createElement('div'); var label = document.createElement('label'); label.textContent = labelText; label.style.color = 'black'; var input = document.createElement('input'); input.type = 'text'; input.placeholder = placeholderText; input.style.color = 'black'; input.style.backgroundColor = 'lightgrey'; if (required) input.required = true; wrapper.appendChild(label); wrapper.appendChild(input); return wrapper; } function createDateInput(labelText) { var wrapper = document.createElement('div'); var label = document.createElement('label'); label.textContent = labelText; label.style.color = 'black'; var yearInput = createInput('年', 'YYYY', false); var monthInput = createInput('月', 'MM', false); var dayInput = createInput('日', 'DD', false); wrapper.appendChild(label); wrapper.appendChild(yearInput); wrapper.appendChild(monthInput); wrapper.appendChild(dayInput); return wrapper; } function createSelect(labelText, options) { var wrapper = document.createElement('div'); var label = document.createElement('label'); label.textContent = labelText; label.style.color = 'black'; var select = document.createElement('select'); select.style.color = 'black'; select.style.backgroundColor = 'lightgrey'; options.forEach(function(optionText) { var option = document.createElement('option'); option.value = optionText.value; option.text = optionText.text; select.add(option); }); wrapper.appendChild(label); wrapper.appendChild(select); return wrapper; } function createCheckbox(labelText) { var wrapper = document.createElement('div'); var label = document.createElement('label'); var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.style.color = 'black'; checkbox.style.backgroundColor = 'lightgrey'; label.textContent = labelText; label.style.color = 'black'; wrapper.appendChild(checkbox); wrapper.appendChild(label); return wrapper; } function getUserName() { var pathArray = window.location.pathname.split('/'); return pathArray[1] || ''; } var user = getUserName(); if (!user) { alert('Twitterプロフィールページでこのブックマークレットを実行してください。'); return; } var form = document.createElement('form'); form.style.position = 'fixed'; form.style.top = '10px'; form.style.left = '10px'; form.style.backgroundColor = 'white'; form.style.padding = '10px'; form.style.border = '1px solid black'; form.style.zIndex = '9999'; var closeButton = document.createElement('button'); closeButton.textContent = '×'; closeButton.style.position = 'absolute'; closeButton.style.top = '5px'; closeButton.style.right = '5px'; closeButton.style.backgroundColor = 'lightgrey'; closeButton.style.border = 'none'; closeButton.style.fontSize = '16px'; closeButton.style.cursor = 'pointer'; closeButton.onclick = function() { form.remove(); }; form.appendChild(closeButton); var searchMethodLabel = createSelect('検索方法', [ { value: '', text: '選択しない' }, { value: 'AND', text: 'AND検索' }, { value: 'OR', text: 'OR検索' } ]); var keyword1 = createInput('キーワード1', 'キーワード1', false); var keyword2 = createInput('キーワード2', 'キーワード2', false); var keyword3 = createInput('キーワード3', 'キーワード3', false); var sinceLabel = createDateInput('いつから ※任意'); var untilLabel = createDateInput('いつまで ※任意'); var postLabel = createSelect('ユーザーが投稿/ユーザーへのリプライ ※任意', [ { value: '', text: '選択しない' }, { value: 'from', text: 'ユーザーが投稿' }, { value: 'to', text: 'ユーザーへのリプライ' } ]); var followerOnly = createCheckbox('フォロワーのみ'); var imagesOnly = createCheckbox('画像のみ'); var videosOnly = createCheckbox('動画のみ'); var minFaves = createInput('いいねの数', '以上', false); var minReplies = createInput('リプライの数', '以上', false); var exactPhrase = createInput('完全に一致するワード', '', false); var excludeWords1 = createInput('除外ワード1', '除外ワード1', false); var excludeWords2 = createInput('除外ワード2', '除外ワード2', false); var excludeWords3 = createInput('除外ワード3', '除外ワード3', false); var langLabel = createSelect('言語', [ { value: '', text: '選択しない' }, { value: 'ja', text: '日本語' }, { value: 'en', text: '英語' }, { value: 'zh', text: '中国語 (簡体字)' }, { value: 'zh-TW', text: '中国語 (繁体字)' }, { value: 'ko', text: '韓国語' }, { value: 'es', text: 'スペイン語' }, { value: 'fr', text: 'フランス語' }, { value: 'de', text: 'ドイツ語' }, { value: 'it', text: 'イタリア語' }, { value: 'pt', text: 'ポルトガル語' }, { value: 'ru', text: 'ロシア語' } ]); var excludeLang = createCheckbox('除外指定'); var submit = document.createElement('button'); submit.textContent = '検索'; submit.type = 'submit'; submit.style.color = 'black'; submit.style.backgroundColor = 'lightgrey'; form.appendChild(searchMethodLabel); form.appendChild(keyword1); form.appendChild(keyword2); form.appendChild(keyword3); form.appendChild(sinceLabel); form.appendChild(untilLabel); form.appendChild(postLabel); form.appendChild(followerOnly); form.appendChild(imagesOnly); form.appendChild(videosOnly); form.appendChild(minFaves); form.appendChild(minReplies); form.appendChild(exactPhrase); form.appendChild(excludeWords1); form.appendChild(excludeWords2); form.appendChild(excludeWords3); form.appendChild(langLabel); form.appendChild(excludeLang); form.appendChild(submit); document.body.appendChild(form); form.onsubmit = function(e) { e.preventDefault(); var baseUrl = 'https://twitter.com/search?q=%27; var query = %27%27; var keywordList = [ keyword1.querySelector(%27input%27).value, keyword2.querySelector(%27input%27).value, keyword3.querySelector(%27input%27).value ].filter(Boolean); var searchMethod = searchMethodLabel.querySelector(%27select%27).value; var sinceYear = sinceLabel.querySelectorAll(%27input%27)[0].value; var sinceMonth = sinceLabel.querySelectorAll(%27input%27)[1].value; var sinceDay = sinceLabel.querySelectorAll(%27input%27)[2].value; var untilYear = untilLabel.querySelectorAll(%27input%27)[0].value; var untilMonth = untilLabel.querySelectorAll(%27input%27)[1].value; var untilDay = untilLabel.querySelectorAll(%27input%27)[2].value; var post = postLabel.querySelector(%27select%27).value; var filters = []; if (followerOnly.querySelector(%27input%27).checked) filters.push(%27filter%3Afollows%27); if (imagesOnly.querySelector(%27input%27).checked) filters.push(%27filter%3Aimages%27); if (videosOnly.querySelector(%27input%27).checked) filters.push(%27filter%3Avideos%27); var minFavesVal = minFaves.querySelector(%27input%27).value; var minRepliesVal = minReplies.querySelector(%27input%27).value; var exactPhraseVal = exactPhrase.querySelector(%27input%27).value; var excludeWordList = [ excludeWords1.querySelector(%27input%27).value, excludeWords2.querySelector(%27input%27).value, excludeWords3.querySelector(%27input%27).value ].filter(Boolean); var lang = langLabel.querySelector(%27select%27).value; var excludeLangChecked = excludeLang.querySelector(%27input%27).checked; if (post) { query += post === %27from%27 ? %27from%3A%27 : %27to%3A%27; } query += encodeURIComponent(user); if (keywordList.length > 0) { var joinedKeywords = keywordList.join(searchMethod ? ` ${searchMethod.toLowerCase()} ` : %27 %27); query += %27 %27 + joinedKeywords; } filters.forEach(function(filter) { query += %27 %27 + filter; }); if (minFavesVal) { query += %27 min_faves%3A%27 + encodeURIComponent(minFavesVal); } if (minRepliesVal) { query += %27 min_retweets%3A%27 + encodeURIComponent(minRepliesVal); } if (exactPhraseVal) { query += %27 "%27 + encodeURIComponent(exactPhraseVal) + %27"%27; } excludeWordList.forEach(function(word) { query += %27 -%27 + encodeURIComponent(word); }); if (lang) { query += excludeLangChecked ? %27 -lang%3A%27 + lang : %27 lang%3A%27 + lang; } if (sinceYear && sinceMonth && sinceDay) { query += %27 since%3A%27 + sinceYear + %27-%27 + sinceMonth + %27-%27 + sinceDay; } if (untilYear && untilMonth && untilDay) { query += %27 until%3A%27 + untilYear + %27-%27 + untilMonth + %27-%27 + untilDay; } window.open(baseUrl + query, %27_blank%27); };})();
これをコピーして、適当なサイトをブックマークして、URLに貼り付けてください。
個人的な感想を述べると、ブックマークは拡張性が無限に広がってロマンがありますよね。ただ、うまく機能しないことが多くて大変でした。あとTwitterはブラウザ版も、スマホのアプリ版のように機能を増やしてほしいと思います。高度な検索から、ある程度、条件指定して検索できますが、例えばフォロワーのみ検索といった機能はスマホのアプリ版にはあるのに、ブラウザ版にはないのが不思議です。必要そうな機能を集約して搭載してみました。機能的にまだ不十分かもしれませんが、よければ活用してみてください。