X from search

Web版Xのユーザープロフ画面にその人の発言(from:@[screenname])を検索する窓を追加

  1. // ==UserScript==
  2. // @name X from search
  3. // @namespace https://spfx.jp/
  4. // @version 2024-05-18
  5. // @license MIT
  6. // @description Web版Xのユーザープロフ画面にその人の発言(from:@[screenname])を検索する窓を追加
  7. // @author https://spfx.jp/
  8. // @match https://twitter.com/*
  9. // @match https://x.com/*
  10. // @icon https://www.google.com/s2/favicons?sz=64&domain=twitter.com
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16. setInterval(() => {
  17. const userActions = document.querySelector('button[data-testid="userActions"');
  18. if (! userActions) {
  19. return;
  20. }
  21.  
  22. let screenName = document.body.innerHTML.match(/<span[^>]+>(@.*?)<\/span>/)[1];
  23. const searchInput = document.getElementById('from-search-input');
  24.  
  25. if (searchInput) {
  26. if (searchInput.value.includes(screenName)) {
  27. return;
  28. } else {
  29. searchInput.value = `from:${screenName} `;
  30. return;
  31. }
  32. }
  33.  
  34. const searchDiv = document.createElement('div');
  35. searchDiv.setAttribute('style', 'margin: 1rem;');
  36. searchDiv.innerHTML = `<form action="/search"><input id="from-search-input" type="text" name="q" value="from:${screenName} "></form>`;
  37. userActions.parentNode.insertBefore(searchDiv, userActions);
  38.  
  39. // NOTE: return後なのでsearchInputは使い回せない
  40. document.getElementById('from-search-input').addEventListener('focus', function() {
  41. const length = this.value.length;
  42. this.setSelectionRange(length, length);
  43. });
  44.  
  45. }, 500);
  46. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址