見出し画像

PCでTwittwe(X)を快適に検索できるブックマークを作ってみた (初投稿)

こんにちは、僕はTwitterでスマホやガジェットのことを呟いているガジェオタです。ユーザー名は@niwakasumahoです。これは仮の投稿なので、あとで消して作り直すと思いますが、とりあえず作ったTwitter用のブックマークのJavascriptを貼り付けておきます。

注意事項

PCのブラウザでのみ動作します
ChromeとEdgeはちゃんと動作しました。他は検証してません。
必ず、ユーザーのプロフィールページから、ブックマークを起動してください。
もしかしたらバグって動かないかもしれません。そのときはごめんなさい。諦めてください。

機能


こんなふうに表示される(はず)

まずは、調べたい人のプロフィールページを開いて、そこからブックマークを起動してください。必ず半角数字で入力してください。

右上の×ボダンをクリックすると、フォームを消すことができます。

キーワードは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はブラウザ版も、スマホのアプリ版のように機能を増やしてほしいと思います。高度な検索から、ある程度、条件指定して検索できますが、例えばフォロワーのみ検索といった機能はスマホのアプリ版にはあるのに、ブラウザ版にはないのが不思議です。必要そうな機能を集約して搭載してみました。機能的にまだ不十分かもしれませんが、よければ活用してみてください。







いいなと思ったら応援しよう!