Twitter 显示正常的日期和时间

看起来是这样的。70/12/31(Th) 23:59:59.

  1. // ==UserScript==
  2. // @name Show date normally on Twitter
  3. // @name:aa Tiwiteril qaadik tan ayro kee wakti yaybulle
  4. // @name:ab Твиттер иаанарԥшуеит иаабац арыцхәи аамҭеи
  5. // @name:af Twitter vertoon normale datum en tyd
  6. // @name:ak Twitter kyerɛ da ne bere a ɛfata .
  7. // @name:am ትዊተር የተለመደው ቀን እና ሰዓት ያሳያል
  8. // @name:ar يعرض Twitter التاريخ والوقت العاديين
  9. // @name:as টুইটাৰে সাধাৰণ তাৰিখ আৰু সময় প্ৰদৰ্শন কৰে
  10. // @name:av Твиттералда бихьулеб букӀуна гӀадатияб тарих ва заман
  11. // @name:ay Twitter ukax normal uru ukat pacha uñacht’ayi .
  12. // @name:az Twitter normal tarix və vaxt göstərir
  13. // @name:ba Twitter ғәҙәти дата һәм ваҡыт күрһәтә
  14. // @name:be Twitter адлюстроўвае звычайную дату і час
  15. // @name:bg Twitter показва нормална дата и час
  16. // @name:bh ट्विटर सामान्य तारीख आ समय के देखावेला
  17. // @name:bm Twitter bɛ don ni waati nɔrɔlen jira .
  18. // @name:bn টুইটার স্বাভাবিক তারিখ এবং সময় প্রদর্শন করে
  19. // @name:bo ཊུ་ཊར་གྱིས་ཚེས་གྲངས་དང་དུས་ཚོད་སྟོན་གྱི་ཡོད།
  20. // @name:br Diskouez a ra Twitter deiziad ha eur normal
  21. // @name:bs Twitter prikazuje normalan datum i vrijeme
  22. // @name:ca Twitter mostra la data i l’hora normals
  23. // @name:ce Твиттерехь гойту нийса хан а, хан а .
  24. // @name:ceb Ang Twitter nagpakita sa normal nga petsa ug oras
  25. // @name:ch I Twitter ha dispåtta i fechan-ña yan .
  26. // @name:ckb تویتەر بەروار و کاتی ئاسایی پیشان دەدات
  27. // @name:co Twitter mostra a data è u tempu nurmale
  28. // @name:cs Twitter zobrazuje normální datum a čas
  29. // @name:cv Твиттер йĕркеллĕ кунпа вăхăта кăтартать
  30. // @name:cy Mae Twitter yn arddangos dyddiad ac amser arferol
  31. // @name:da Twitter viser normal dato og tid
  32. // @name:de Twitter zeigt das normale Datum und die normale Uhrzeit an
  33. // @name:dv ޓްވިޓަރ އިން އާދައިގެ ތާރީޚާއި ގަޑި ދައްކާ
  34. // @name:dz ཊུ་ཊར་གྱིས་ སྤྱིར་བཏང་ཚེས་གྲངས་དང་དུས་ཚོད་བཀྲམ་སྟོན་འབདཝ་ཨིན།
  35. // @name:ee Twitter ɖea ŋkeke kple gaƒoƒo si sɔ fiana .
  36. // @name:el Το Twitter εμφανίζει κανονική ημερομηνία και ώρα
  37. // @name:en Twitter displays normal date and time
  38. // @name:en-GB Twitter displays normal date and time
  39. // @name:eo Twitter montras normalan daton kaj horon
  40. // @name:es Twitter muestra fecha y hora normales
  41. // @name:et Twitter kuvab tavalise kuupäeva ja kellaaja
  42. // @name:eu Twitterrek data eta ordu normala erakusten du
  43. // @name:fa توییتر تاریخ و زمان عادی را نشان می دهد
  44. // @name:ff Twitter ina hollira ñalngu e waktu no woorunoo
  45. // @name:fi Twitter näyttää normaalin päivämäärän ja ajan
  46. // @name:fil Ipinapakita ng Twitter ang normal na petsa at oras
  47. // @name:fj Tuvanaka na tiki ni siga kei na gauna .
  48. // @name:fo Twitter vísir vanliga dagfesting og tíð
  49. // @name:fr Twitter affiche la date et l’heure normales
  50. // @name:fr-CA Twitter affiche la date et l’heure normales
  51. // @name:fy Twitter Toant normale datum en tiid
  52. // @name:ga Taispeánann Twitter gnáth -dháta agus am
  53. // @name:gd Bidh Twitter a ’taisbeanadh ceann-latha agus àm àbhaisteach
  54. // @name:gl Twitter mostra a data e hora normais
  55. // @name:gn Twitter ohechauka ára ha aravo normal .
  56. // @name:gsw-berne Twitter displays normal date and time
  57. // @name:gu ટ્વિટર સામાન્ય તારીખ અને સમય દર્શાવે છે
  58. // @name:gv Twitter t’eh soilshaghey date as traa arryltagh
  59. // @name:ha Twitter nuni na al’ada da lokaci
  60. // @name:he טוויטר מציג תאריך ושעה רגילים
  61. // @name:hi ट्विटर सामान्य तारीख और समय प्रदर्शित करता है
  62. // @name:hmn TWITTER qhia txog hnub qub thiab sijhawm
  63. // @name:hr Twitter prikazuje normalan datum i vrijeme
  64. // @name:ht Twitter montre dat ak lè nòmal
  65. // @name:hu A Twitter megjeleníti a normál dátumot és időt
  66. // @name:hy Twitter- ը ցուցադրում է նորմալ ամսաթիվը եւ ժամանակը
  67. // @name:id Twitter menampilkan tanggal dan waktu normal
  68. // @name:ig Twitter na-egosiputa ụbọchị na oge
  69. // @name:is Twitter sýnir venjulegan dag og tíma
  70. // @name:it Twitter visualizza la data e l’ora normali
  71. // @name:iu Twitter ᑕᑯᒃᓴᐅᑎᑦᑎᕗᖅ ᐅᓪᓗᕆᔭᐅᔪᒥᒃ ᐊᒻᒪ ᐱᕕᒃᓴᒥᒃ
  72. // @name:ja Twitterには通常の日付と時刻が表示されます
  73. // @name:jv Twitter nampilake tanggal lan wektu normal
  74. // @name:ka Twitter აჩვენებს ნორმალურ თარიღს და დროს
  75. // @name:kg Twitter ke monisa kilumbu mpi ntangu ya mbote
  76. // @name:kk Twitter қалыпты күн мен уақытты көрсетеді
  77. // @name:kl Twitterip ulloq piffissarlu nalinginnaasoq takutinneqartarpoq
  78. // @name:km Twitter បង្ហាញកាលបរិច្ឆេទនិងពេលវេលាធម្មតា
  79. // @name:kn ಟ್ವಿಟರ್ ಸಾಮಾನ್ಯ ದಿನಾಂಕ ಮತ್ತು ಸಮಯವನ್ನು ಪ್ರದರ್ಶಿಸುತ್ತದೆ
  80. // @name:ko 트위터에는 일반 날짜와 시간이 표시됩니다
  81. // @name:kr Twitter lan loktu-a yim-a kalkal fəlejin
  82. // @name:ku Twitter tarîx û wextê normal nîşan dide
  83. // @name:kv Твиттерын петкӧдлӧма нормальнӧй кад да кад .
  84. // @name:ky Twitter кадимки күндү жана убакытты көрсөтөт
  85. // @name:la Twitter Displays Normal Date et Tempus
  86. // @name:lb Twitter weist normal Datum an Zäit
  87. // @name:lg Twitter eraga olunaku n’essaawa ebya bulijjo .
  88. // @name:ln Twitter elakisaka mokolo mpe ngonga ya momesano .
  89. // @name:lo Twitter ສະແດງວັນທີແລະເວລາທໍາມະດາ
  90. // @name:lt „Twitter“ rodo įprastą datą ir laiką
  91. // @name:lv Twitter parāda normālu datumu un laiku
  92. // @name:mg Ny Twitter dia mampiseho daty sy fotoana mahazatra
  93. // @name:mh Twitter ej kwaļo̧k raan im iien .
  94. // @name:mi Ka whakaatu a Twitter i te waa me te waa
  95. // @name:mk Твитер прикажува нормален датум и време
  96. // @name:ml ട്വിറ്റർ സാധാരണ തീയതിയും സമയവും പ്രദർശിപ്പിക്കുന്നു
  97. // @name:mn Твиттер нь хэвийн огноо, цагийг харуулдаг
  98. // @name:mo Twitter afișează data și ora normale
  99. // @name:mr ट्विटर सामान्य तारीख आणि वेळ प्रदर्शित करते
  100. // @name:ms Twitter memaparkan tarikh dan masa biasa
  101. // @name:mt Twitter juri data u ħin normali
  102. // @name:my Twitter သည်ပုံမှန်နေ့စွဲနှင့်အချိန်ကိုပြသသည်
  103. // @name:nb Twitter viser normal dato og tid
  104. // @name:ne ट्विटरले सामान्य मिति र समय प्रदर्शन गर्दछ
  105. // @name:nl Twitter toont normale datum en tijd
  106. // @name:nr Fala i-orasssssss.
  107. // @name:ny Twitter ikuwonetsa tsiku labwinobwino komanso nthawi
  108. // @name:oc Twitter aficha la data e l’ora normalas
  109. // @name:om Twitter guyyaa fi sa’aatii idilee agarsiisa .
  110. // @name:or ଟ୍ୱିଟର ସାଧାରଣ ତାରିଖ ଏବଂ ସମୟ ପ୍ରଦର୍ଶନ କରେ |
  111. // @name:os Твиттер æвдисы нормалон датæ æмæ рæстæг
  112. // @name:pa ਟਵਿੱਟਰ ਆਮ ਮਿਤੀ ਅਤੇ ਸਮਾਂ ਦਰਸਾਉਂਦਾ ਹੈ
  113. // @name:pl Twitter wyświetla normalną datę i godzinę
  114. // @name:ps ټویټر نورمال نیټه او وخت ښیې
  115. // @name:pt Twitter exibe data e hora normais
  116. // @name:pt-BR Twitter exibe data e hora normais
  117. // @name:pt-PT Twitter exibe data e hora normais
  118. // @name:qu Twitter normal p’unchawta, pachata rikuchin .
  119. // @name:rn Twitter yerekana itariki n’isaha isanzwe
  120. // @name:ro Twitter afișează data și ora normale
  121. // @name:ru Твиттер отображает обычную дату и время
  122. // @name:rw Twitter yerekana itariki nigihe gisanzwe
  123. // @name:sa ट्विटर सामान्य तिथि एवं समय प्रदर्शित करता है।
  124. // @name:sd Twitter عام تاريخ ۽ وقت ڏيکاري ٿو
  125. // @name:se Twitter čájeha dábálaš beaivvi ja áiggi
  126. // @name:sg Twitter afa lango na l’heure .
  127. // @name:sh Твиттер приказује нормалан датум и време
  128. // @name:si ට්විටර් සාමාන්ය දිනය සහ වේලාව පෙන්වයි
  129. // @name:sk Twitter zobrazuje normálny dátum a čas
  130. // @name:sl Twitter prikazuje normalen datum in čas
  131. // @name:sm Twitter faʻaalia le taimi masani aso ma le taimi
  132. // @name:sn Twitter inoratidza yakajairika zuva uye nguva
  133. // @name:so Twitter wuxuu soo bandhigayaa taariikhda iyo waqtiga caadiga ah
  134. // @name:sq Twitter shfaq datën dhe kohën normale
  135. // @name:sr Твиттер приказује нормалан датум и време
  136. // @name:ss I-Twitter ikhombisa lusuku nesikhatsi lesivamile
  137. // @name:st Twitter e bontša letsatsi le tloaelehileng le nako
  138. // @name:su Twitter ningalikeun tanggal sareng waktos anu normal
  139. // @name:sv Twitter visar normalt datum och tid
  140. // @name:sw Twitter inaonyesha tarehe ya kawaida na wakati
  141. // @name:ta ட்விட்டர் சாதாரண தேதி மற்றும் நேரத்தைக் காட்டுகிறது
  142. // @name:te ట్విట్టర్ సాధారణ తేదీ మరియు సమయాన్ని ప్రదర్శిస్తుంది
  143. // @name:tg Twitter санаи муқаррарӣ ва вақтро нишон медиҳад
  144. // @name:th Twitter แสดงวันที่และเวลาปกติ
  145. // @name:ti ትዊተር ንቡር ዕለትን ሰዓትን
  146. // @name:tk Twitter adaty senesini we wagty görkezýär
  147. // @name:tl Ipinapakita ng Twitter ang normal na petsa at oras
  148. // @name:tn Twitter e bontsha letlha le nako e e tlwaelegileng
  149. // @name:to ’Oku fakahaa’i ’e he Twitter ’a e ’aho mo e taimi angamaheni .
  150. // @name:tr Twitter normal tarih ve saati görüntüler
  151. // @name:ts Twitter yi kombisa siku na nkarhi lowu tolovelekeke .
  152. // @name:tt Твиттер гадәти датаны һәм вакытны күрсәтә
  153. // @name:tw Twitter kyerɛ da ne bere a ɛfata .
  154. // @name:ty E faaite te Twitter i te mahana e te taime matauhia
  155. // @name:ug Twitter نورمال ۋاقىت ۋە ۋاقىتنى كۆرسىتىدۇ
  156. // @name:uk Twitter відображає звичайну дату та час
  157. // @name:ur ٹویٹر عام تاریخ اور وقت دکھاتا ہے
  158. // @name:uz Twitter normal sana va vaqtni namoyish etadi
  159. // @name:ve Twitter i sumbedza ḓuvha na tshifhinga tsho ḓoweleaho
  160. // @name:vi Twitter hiển thị ngày và giờ bình thường
  161. // @name:wo Twitter dafay wane bis ak waxtu
  162. // @name:xh I-Twitter ibonisa umhla oqhelekileyo kunye nexesha
  163. // @name:yi טוויטטער דיספּלייז נאָרמאַל דאַטע און צייט
  164. // @name:yo Twitter ṣafihan ọjọ deede ati akoko
  165. // @name:zh Twitter 显示正常的日期和时间
  166. // @name:zh-CN Twitter 显示正常的日期和时间
  167. // @name:zh-HK Twitter 顯示正常的日期和時間
  168. // @name:zh-MO Twitter 顯示正常的日期和時間
  169. // @name:zh-MY Twitter 显示正常的日期和时间
  170. // @name:zh-SG Twitter 显示正常的日期和时间
  171. // @name:zh-TW Twitter 顯示正常的日期和時間
  172. // @name:zu I-Twitter ibonisa usuku olujwayelekile nesikhathi
  173. // @name:es-419 Twitter muestra fecha y hora normales
  174. // @description Like this, 70/12/31(Th) 23:59:59.
  175. // @description:aa Tah celta. 70/12/31(Th) 23:59:59.
  176. // @description:ab Абри еиԥш ауп ишыҟоу. 70/12/31(Th) 23:59:59.
  177. // @description:af Dit lyk so. 70/12/31 (Th) 23:59:59.
  178. // @description:ak Ɛte sɛ eyi. 70/12/31(th) 23:59:59.
  179. // @description:am ይህ ይመስላል. 70/12/31 (te) 23:59:59.
  180. // @description:ar يبدو هكذا. 70/12/31 (TH) 23:59:59.
  181. // @description:as দেখাত এনেকুৱাই। ৭০/১২/৩১(তম) ২৩:৫৯:৫৯।
  182. // @description:av Гьеб гьадинаб буго. 70/12/31(Тх) 23:59:59.
  183. // @description:ay Ukhamaw ukham uñtasi. 70/12/31(th) 23:59:59.
  184. // @description:az Bu kimi görünür. 70/12/31 (TH) 23:59:59.
  185. // @description:ba Ул былай күренә. 70/12/31(Th) 23:59:59.
  186. // @description:be Падобна так. 70/12/31 (TH) 23:59:59.
  187. // @description:bg Изглежда така. 70/12/31 (TH) 23:59:59.
  188. // @description:bh अईसन लागता। 70/12/31(वें) 23:59:59 के बा।
  189. // @description:bm A bɛ iko nin. 70/12/31(nan) 23:59:59.
  190. // @description:bn দেখে মনে হচ্ছে এটি। 70/12/31 (TH) 23:59:59।
  191. // @description:bo འདི་འདྲ་འདུག ༧༠/༡༢/༣༡(Th) ༢༣:༥༩:༥༩།
  192. // @description:br Seblantout a ra evel-se. 70/12/31(Th) 23:59:59.
  193. // @description:bs Izgleda ovako. 70/12/31 (th) 23:59:59.
  194. // @description:ca Sembla així. 70/12/31 (Th) 23:59:59.
  195. // @description:ce Иштта хетало. 70/12/31(Th) 23:59:59.
  196. // @description:ceb Ingon kini. 70/12/31 (Th) 23:59:59.
  197. // @description:ch Parehu este yan este. 70/12/1211 (Th) 23:59:59.
  198. // @description:ckb بەم شێوەیە دەردەکەوێت. 70/12/31(th) 23:59:59.
  199. // @description:co Sembra cusì. 70/12/31 (u) 23:59:59.
  200. // @description:cs Vypadá to takto. 70/12/31 (th) 23:59:59.
  201. // @description:cv Кун пек курăнать. 70/12/31 (Тх) 23:59:59.
  202. // @description:cy Mae’n edrych fel hyn. 70/12/31 (TH) 23:59:59.
  203. // @description:da Det ser ud som dette. 70/12/31 (th) 23:59:59.
  204. // @description:de Es sieht so aus. 70/12/31 (Th) 23:59:59.
  205. // @description:dv މިހެން ހީވަނީ. 70/12/31(th) 23:59:59.
  206. // @description:dz འདི་བཟུམ་མཐོངམ་ཨིན། ༧༠/༡༢/༣༡(ཐ) ༢༣:༥༩:༥༩.
  207. // @description:ee Edze abe esia ene. 70/12/31 (th) 23:59:59.
  208. // @description:el Μοιάζει με αυτό. 70/12/31 (Th) 23:59:59.
  209. // @description:en It looks like this. 70/12/31(Th) 23:59:59.
  210. // @description:en-GB It looks like this. 70/12/31(Th) 23:59:59.
  211. // @description:eo Ĝi aspektas tiel. 70/12/31 (TH) 23:59:59.
  212. // @description:es Se parece a esto. 70/12/31 (Th) 23:59:59.
  213. // @description:es-419 Se parece a esto. 70/12/31 (Th) 23:59:59.
  214. // @description:et See näeb välja selline. 70/12/31 (Th) 23:59:59.
  215. // @description:eu Horren antza du. 70/12/31 (th) 23:59:59.
  216. // @description:fa به نظر می رسد مانند این 70/12/31 (TH) 23:59:59.
  217. // @description:ff Ina wayi no nii. 70/12/31(Th) 23:59:59.
  218. // @description:fi Se näyttää tältä. 70/12/31 (Th) 23:59:59.
  219. // @description:fil Mukhang ganito. 70/12/31 (TH) 23:59:59.
  220. // @description:fj E vaka oqo na ka oqo. 70/12/31(The The) 23:59:59.
  221. // @description:fo Tað sær soleiðis út. 70/12/31(H) 23:59:59.
  222. // @description:fr Cela ressemble à ça. 70/12/31 (TH) 23:59:59.
  223. // @description:fr-CA Cela ressemble à ça. 70/12/31 (TH) 23:59:59.
  224. // @description:fy It liket derop. 70/12/31 (TH) 23:59:59.
  225. // @description:ga Tá an chuma air seo. 70/12/31 (TH) 23:59:59.
  226. // @description:gd Tha e coltach ri seo. 70/12/31 (th) 23:59:59.
  227. // @description:gl Parece así. 70/12/31 (TH) 23:59:59.
  228. // @description:gn Péicha ojehecha. 70/12/31(TH) 23:59:59.
  229. // @description:gsw-berne It looks like this. 70/12/31(Th) 23:59:59.
  230. // @description:gu તે આના જેવું લાગે છે. 70/12/31 (મી) 23:59:59.
  231. // @description:gv Ta’n red shoh myr shoh. 70/12/31(Th) 23:59:59.
  232. // @description:ha Yayi kama da wannan. 70/12/31 (th) 23:59:59.
  233. // @description:he זה נראה כך. 70/12/31 (TH) 23:59:59.
  234. // @description:hi यह इस तरह दिख रहा है। 70/12/31 (Th) 23:59:59।
  235. // @description:hmn Nws zoo li no. 70/12/31 (th) 23:59:59.
  236. // @description:hr Izgleda ovako. 70/12/31 (TH) 23:59:59.
  237. // @description:ht Li sanble tankou sa a. 70/12/31 (th) 23:59:59.
  238. // @description:hu Így néz ki. 70/12/31 (TH) 23:59:59.
  239. // @description:hy Կարծես սա է: 70/12/31 (րդ) 23:59:59:
  240. // @description:id Sepertinya ini. 70/12/31 (TH) 23:59:59.
  241. // @description:ig Ọ dị ka nke a. 70/12/31 (TH) 23:59:59.
  242. // @description:is Það lítur svona út. 70/12/31 (TH) 23:59:59.
  243. // @description:it Sembra questo. 70/12/31 (Th) 23:59:59.
  244. // @description:iu ᐃᒪᐃᑦᑐᔭᕐᒪᑦ. 70/12/31(Th) 23:59:59.
  245. // @description:ja このように見えます。 70/12/31(th)23:59:59。
  246. // @description:jv Katon kaya ngono. 70/12/31 (th) 23:59:59.
  247. // @description:ka ასე გამოიყურება. 70/12/31 (TH) 23:59:59.
  248. // @description:kg Yo ke monana mutindu yai. 70/12/31(Th) 23:59:59.
  249. // @description:kk Бұл сияқты. 70/12/31 (мың) 23:59:59.
  250. // @description:kl Taamatut isikkoqarpoq. 70/12/31(Th) 23:59:59.
  251. // @description:km វាមើលទៅដូចនេះ។ 70/12/31 (ទី) 23:59:59 ។
  252. // @description:kn ಇದು ಈ ರೀತಿ ಕಾಣುತ್ತದೆ. 70/12/31 (ನೇ) 23:59:59.
  253. // @description:ko 이렇게 보인다. 70/12/31 (th) 23:59:59.
  254. // @description:kr Alama adəgai. 70/12/31(Th) 23:59:59.
  255. // @description:ku Wusa dixuye. 70/12/31 (th) 23:59:59.
  256. // @description:kv Сійӧ татшӧм. 70/12/31(Тх) 23:59:59.
  257. // @description:ky Бул окшойт. 70/12/31 (th) 23:59:59.
  258. // @description:la Is vultus amo is. 70/12/31 (Th) 23:59:59.
  259. // @description:lb IT gesäit esou aus. 70/12/31 (Th) 23:59:59.
  260. // @description:lg Kirabika bwe kiti. 70/12/31(th) 23:59:59.
  261. // @description:ln Ezali komonana lokola oyo. 70/12/31(th) 23:59:59.
  262. // @description:lo ມັນເບິ່ງຄືວ່ານີ້. 70/12/31 (ທ) ເວລາ 23:59:59.
  263. // @description:lt Panašu, kad taip. 70/12/31 (Th) 23:59:59.
  264. // @description:lv Tas izskatās šādi. 70/12/31 (Th) 23:59:59.
  265. // @description:mg Toa izany. 70/12/31 (th) 23:59:59.
  266. // @description:mh Ej āinwōt in. 70/12/31( Tht) 23:59:59.
  267. // @description:mi Te ahua nei. 70/12/31 (TH) 23:59:59.
  268. // @description:mk Изгледа вака. 70/12/31 (TH) 23:59:59.
  269. // @description:ml ഇത് ഇതുപോലെ തോന്നുന്നു. 70/12/31 (TH) 23:59:59.
  270. // @description:mn Энэ нь иймэрхүү харагдаж байна. 70/12/31 (th) 23:59:59.
  271. // @description:mo Pare așa. 70/12/31 (TH) 23:59:59.
  272. // @description:mr हे असे दिसते. 70/12/31 (व्या) 23:59:59.
  273. // @description:ms Nampaknya ini. 70/12/31 (Th) 23:59:59.
  274. // @description:mt Jidher bħal dan. 70/12/31 (Th) 23:59:59.
  275. // @description:my ဒါနဲ့တူတယ် 70/12/31 (ကြိမ်မြောက်) 23:59:59 ။
  276. // @description:nb Det ser slik ut. 70/12/31 (TH) 23:59:59.
  277. // @description:ne यो यस्तो देखिन्छ। 70/12/31 (th) 23 :: 59:59।
  278. // @description:nl Het ziet er zo uit. 70/12/31 (TH) 23:59:59.
  279. // @description:nr Bazama ukududuza. ( 1 10:10 ) U-Israyeli u-10:1.
  280. // @description:ny Zikuwoneka ngati izi. 70/12/31 (th) 23:59:59.
  281. // @description:oc Sembla aquò. 70/12/31(La) 23:59:59.
  282. // @description:om Akkas fakkaata. 70/12/31(th) 23:59:59.
  283. // @description:or ଏହା ଏହିପରି ଦେଖାଯାଏ | 70/12/31 (ଥ) 23:59।
  284. // @description:os Афтæ зыны ахæм. 70/12/31(Th) 23:59:59.
  285. // @description:pa ਇਹ ਇਸ ਤਰ੍ਹਾਂ ਲੱਗਦਾ ਹੈ. 70/12/31 (ਧੂਹ) 23:59:59.
  286. // @description:pl Wygląda na to. 70/12/31 (th) 23:59:59.
  287. // @description:ps دا ورته ښکاري. 70/12/31 (TH) 23:59:59.
  288. // @description:pt Parece isso. 70/12/31 (TH) 23:59:59.
  289. // @description:pt-BR Parece isso. 70/12/31 (TH) 23:59:59.
  290. // @description:pt-PT Parece isso. 70/12/31 (TH) 23:59:59.
  291. // @description:qu Kaymanmi rikchakun. 70/12/31(H) 23:59:59.
  292. // @description:rn Bimeze gutya. 70/12/31(Th) 23:59:59.
  293. // @description:ro Pare așa. 70/12/31 (TH) 23:59:59.
  294. // @description:ru Похоже, это. 70/12/31 (TH) 23:59:59.
  295. // @description:rw Birasa nkibi. 70/12/31 (TH) 23:59:59.
  296. // @description:sa एवं दृश्यते। 70/12/31(थ) 23:59:59।
  297. // @description:sd اهو ڏسجي ٿو. 70/12/31 (ٿ) 23:59:59.
  298. // @description:se Dat lea ná. 70/12/31(Th) 23:59:59.
  299. // @description:sg A yeke mo bâ mo tene a yeke tongaso. 70/12/12 (Th) 23:59:59.
  300. // @description:sh Изгледа овако. 70/12/31 (ТХ) 23:59:59.
  301. // @description:si ඒක මේ වගේ. 70/12/31 (TH) 23:59:59.
  302. // @description:sk Vyzerá to takto. 70/12/31 (Th) 23:59:59.
  303. // @description:sl Videti je tako. 70/12/31 (TH) 23:59:59.
  304. // @description:sm E pei o lenei. 70/12/31 (th) 23:59:59.
  305. // @description:sn Zvinotaridzika seizvi. 70/12/31 (th) 23:59:59.
  306. // @description:so Waxay u egtahay sidan oo kale. 70/12/31 (th) 23:59:59.
  307. // @description:sq Duket kështu. 70/12/31 (TH) 23:59:59.
  308. // @description:sr Изгледа овако. 70/12/31 (ТХ) 23:59:59.
  309. // @description:ss Kubukeka kanje. 70/12/31(Th) 23:59:59.
  310. // @description:st E shebahala tjena. 70/12/31 (th) 23:59:59.
  311. // @description:su Sigana mah ieu. 70/12/31 (th) 23:59:59.
  312. // @description:sv Det ser ut så här. 70/12/31 (Th) 23:59:59.
  313. // @description:sw Inaonekana kama hii. 70/12/31 (TH) 23:59:59.
  314. // @description:ta இது போல் தெரிகிறது. 70/12/31 (வது) 23:59:59.
  315. // @description:te ఇది ఇలా ఉంది. 70/12/31 (వ) 23:59:59.
  316. // @description:tg Чунин ба назар мерасад. 70/12/31 (TH) 23:59:59.
  317. // @description:th ดูเหมือนว่า 70/12/31 (Th) 23:59:59
  318. // @description:ti ከምዚ ይመስል። 70/12/31(th) 23:59:59።
  319. // @description:tk Şuňa meňzeýär. 70/12/3/31 (tra) 23:59:59.
  320. // @description:tl Mukhang ganito. 70/12/31 (TH) 23:59:59.
  321. // @description:tn Go lebega jaana. 70/12/31(Th) 23:59:59.
  322. // @description:to ʻOku hangē ʻení. 70/12/31(T) 23:59:59.
  323. // @description:tr Öyle görünüyor. 70/12/31 (TH) 23:59:59.
  324. // @description:ts Swi languteka hi ndlela leyi. 70/12/31(TH) 23:59:59.
  325. // @description:tt Бу шундый. 70/12/31 (th) 23:59:59.
  326. // @description:tw Ɛte sɛ eyi. 70/12/31(th) 23:59:59.
  327. // @description:ty E au te reira i te reira. 70/12/31(Th) 23:59:59.
  328. // @description:ug ئۇ ئوخشايدۇ. 70/12/31 (th) 23:59:59.
  329. // @description:uk Це виглядає так. 70/12/31 (Th) 23:59:59.
  330. // @description:ur ایسا لگتا ہے۔ 70/12/31 (ویں) 23:59:59۔
  331. // @description:uz Bu shunday ko’rinadi. 70/12/31 (Th) 23:59:59.
  332. // @description:ve Zwi vhonala zwo ralo. 70/12/31(Th) 23:59:59.
  333. // @description:vi Nó trông như thế này. 70/12/31 (th) 23:59:59.
  334. // @description:wo Dafa mel nii. 70/12/31(Th) 23:59:59.
  335. // @description:xh Ijongeka ngoluhlobo. 70/12/31 (th) 23:59:59.
  336. // @description:yi עס קוקט ווי דאָס. 70/12/31 (טה) 23:59:59.
  337. // @description:yo O dabi eyi. 70/12/31 (TH) 23:59:59.
  338. // @description:zh 看起来是这样的。70/12/31(Th) 23:59:59.
  339. // @description:zh-CN 看起来是这样的。70/12/31(Th) 23:59:59.
  340. // @description:zh-HK 看起來是這樣的。 70/12/31(Th) 23:59:59.
  341. // @description:zh-MO 看起來是這樣的。 70/12/31(Th) 23:59:59.
  342. // @description:zh-MY 看起来是这样的。70/12/31(Th) 23:59:59.
  343. // @description:zh-SG 看起来是这样的。70/12/31(Th) 23:59:59.
  344. // @description:zh-TW 看起來是這樣的。 70/12/31(Th) 23:59:59.
  345. // @description:zu Kubukeka kanjena. 70/12/31 (th) 23:59:59.
  346. // @author AeamaN
  347. // @namespace https://github.com/ChinaGodMan/UserScripts
  348. // @supportURL https://github.com/ChinaGodMan/UserScripts/issues
  349. // @homepageURL https://github.com/ChinaGodMan/UserScripts
  350. // @homepage https://github.com/ChinaGodMan/UserScripts
  351. // @license MIT
  352. // @match https://twitter.com/*
  353. // @match https://mobile.twitter.com/*
  354. // @match https://mobile.twitter3e4tixl4xyajtrzo62zg5vztmjuricljdp2c5kshju4avyoid.onion/*
  355. // @match https://x.com/*
  356. // @match https://mobile.x.com/*
  357. // @require https://update.greasyfork.org/scripts/538254/1601105/PNG.js
  358. // @grant GM_getValue
  359. // @grant GM_registerMenuCommand
  360. // @grant GM_setValue
  361. // @run-at document-body
  362. // @icon https://raw.githubusercontent.com/ChinaGodMan/UserScriptsHistory/main/scriptsIcon/x.svg
  363. // @compatible chrome
  364. // @compatible firefox
  365. // @compatible edge
  366. // @compatible opera
  367. // @compatible safari
  368. // @compatible kiwi
  369. // @compatible qq
  370. // @compatible via
  371. // @compatible brave
  372. // @version 2025.6.4.1
  373. // ==/UserScript==
  374.  
  375. // And more. See Default valuse below.
  376. // It's based on "https://qiita.com/libraplanet/items/0bdd7ef1a13e7af8f48f".
  377. //
  378. // 他にも機能があります。以下の Default valuse を確認して下さい。
  379. // "https://qiita.com/libraplanet/items/0bdd7ef1a13e7af8f48f" を参考にしています。
  380. (function () { /* START */
  381.  
  382. 'use strict'
  383.  
  384. // //////////// Settings //////////// //
  385. // No GUI Settings
  386. // Default values are used
  387. const NOGUI = false
  388. // ////////////////////////////////// //
  389.  
  390. // ///////// Default valuse ///////// //
  391. // Blue bird returns
  392. const BBR = false
  393.  
  394. // Replace with orig images(wasted traffic occurs)
  395. const ORIGI = false
  396.  
  397. // Slightly wider TL
  398. const WTL = false
  399.  
  400. // Eye Care Mode at default background
  401. const ECMODE = true
  402.  
  403. // Hide promotions
  404. const HPP = true
  405.  
  406. // Hide Who to follow
  407. const HWTF = true
  408.  
  409. // Hide DM drawer
  410. const HDMD = true
  411.  
  412. // Hide Get Verified
  413. const HGV = true
  414.  
  415. // Fine engagement
  416. // 1. Live
  417. // 2. Normal
  418. // 0. Do nothing
  419. const FEGM = 0
  420.  
  421. // Fix videos quality
  422. // 1. Maximum
  423. // 2. Minimum
  424. // 0. Do nothing
  425. const FVQ = 1
  426.  
  427. // Date formats
  428. // 1. 31.12.70 23:59
  429. // 2. 31.12.70 23:59:59
  430. // 3. 31.12.70(Th) 23:59
  431. // 4. 31.12.70(Th) 23:59:59
  432. //
  433. // 5. 70/12/31 23:59
  434. // 6. 70/12/31 23:59:59
  435. // 7. 70/12/31(Th) 23:59
  436. // 8. 70/12/31(Th) 23:59:59 [ye/mo/da(we) ho:mi:se]
  437. //
  438. // 9. 70-12/31 23:59
  439. // 10. 70-12/31 23:59'59
  440. // 11. 70-12/31(Th) 23:59
  441. // 12. 70-12/31(Th) 23:59'59
  442. //
  443. // 13. M59-12-31 23:59
  444. // 14. M59-12-31 23:59:59
  445. // 15. M59-12-31(Th) 23:59
  446. // 16. M59-12-31(Th) 23:59:59
  447. //
  448. // 0. Do nothing
  449. const FMT = 7
  450.  
  451. // Loop interval(ms)
  452. const INTL = 800
  453. // ////////////////////////////////// //
  454.  
  455. const MYNAME = 'sdnt1200'
  456. const LANG = document.documentElement.getAttribute('lang')
  457.  
  458. let time_r = Date.now()
  459. let s_mutations = true
  460. let observer = new MutationObserver(function (mutations) {
  461. s_mutations = mutations
  462. })
  463. let originalXHROPEN
  464. let bbr, origi, wtl, ecmode, hpp, hwtf, hdmd, hgv, fegm, fvq, fmt, intl
  465.  
  466. function makeDialog() {
  467. let dalg = document.createElement('div')
  468.  
  469. dalg.className = 'us-' + MYNAME
  470.  
  471. dalg.style.all = 'initial'
  472. dalg.style.backgroundColor = 'rgb(235, 235, 235)'
  473. dalg.style.border = '3px outset'
  474. dalg.style.borderRadius = '1%'
  475. dalg.style.display = 'none'
  476. dalg.style.fontFamily = 'monospace'
  477. dalg.style.fontSize = '12px'
  478. dalg.style.height = '440px'
  479. dalg.style.width = '480px'
  480. dalg.style.paddingLeft = '2px'
  481. dalg.style.paddingRight = '2px'
  482. dalg.style.position = 'fixed'
  483. dalg.style.right = '8px'
  484. dalg.style.top = '8px'
  485. dalg.style.zIndex = '2147483647'
  486. dalg.style.overflow = 'auto'
  487.  
  488. let html =
  489. '<span style="all: initial; font-size: 120%; line-height: 210%">' +
  490. GM_info.script.name + ' ' + GM_info.script.version + ' ' + 'Settings' +
  491. '</span><br />\n' +
  492.  
  493. '<input type="radio" name="fmt" value="1" class="top_r" />31.12.70 23:59' +
  494. '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
  495. '&nbsp;' +
  496. '<input type="radio" name="fmt" value="2" class="top_r" />31.12.70 23:59:59<br />\n' +
  497. '<input type="radio" name="fmt" value="3" class="mid_r" />31.12.70(Th) 23:59' +
  498. '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
  499. '<input type="radio" name="fmt" value="4" class="mid_r" />31.12.70(Th) 23:59:59<br />\n' +
  500. '<input type="radio" name="fmt" value="5" class="mid_r" />70/12/31 23:59' +
  501. '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
  502. '<input type="radio" name="fmt" value="6" class="mid_r" />70/12/31 23:59:59<br />\n' +
  503. '<input type="radio" name="fmt" value="7" class="mid_r" />70/12/31(Th) 23:59' +
  504. '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
  505. '<input type="radio" name="fmt" value="8" class="mid_r" />70/12/31(Th) 23:59:59<br />\n' +
  506. '<input type="radio" name="fmt" value="9" class="mid_r" />70-12/31 23:59' +
  507. '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
  508. '<input type="radio" name="fmt" value="10" class="mid_r" />70-12/31 23:59\'59<br />\n' +
  509. '<input type="radio" name="fmt" value="11" class="mid_r" />70-12/31(Th) 23:59' +
  510. '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
  511. '<input type="radio" name="fmt" value="12" class="mid_r" />70-12/31(Th) 23:59\'59<br />\n' +
  512. '<input type="radio" name="fmt" value="13" class="mid_r" />M59-12-31 23:59' +
  513. '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
  514. '<input type="radio" name="fmt" value="14" class="mid_r" />M59-12-31 23:59:59<br />\n' +
  515. '<input type="radio" name="fmt" value="15" class="mid_r" />M59-12-31(Th) 23:59' +
  516. '&nbsp;&nbsp;&nbsp;&nbsp;' +
  517. '<input type="radio" name="fmt" value="16" class="mid_r" />M59-12-31(Th) 23:59:59<br />\n' +
  518. '<input type="radio" name="fmt" value="0" class="btm_r" />Do nothing<br />\n' +
  519.  
  520. '<input type="checkbox" name="bbr" class="top_c" />BB returns' +
  521. '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
  522. '<input type="checkbox" name="origi" class="mid_c" />Replace with orig images*<br />\n' +
  523. '<input type="checkbox" name="wtl" class="mid_c" />Widen slightly TL' +
  524. '&nbsp;&nbsp;&nbsp;&nbsp;' +
  525. '<input type="checkbox" name="ecmode" class="btm_c" />Eye Care Mode at default BG<br />\n' +
  526. '<input type="checkbox" name="hpp" class="top_c" />Hide promotions' +
  527. '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
  528. '<input type="checkbox" name="hwtf" class="mid_c" />Hide Who to follow<br />\n' +
  529. '<input type="checkbox" name="hdmd" class="mid_c" />Hide DM drawer' +
  530. '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
  531. '<input type="checkbox" name="hgv" class="btm_c" />Hide Get Verified<br />\n' +
  532.  
  533. '<input type="radio" name="fegm" value="1" class="top_r" />Fine engagement(live)' +
  534. '&nbsp;&nbsp;&nbsp;&nbsp;' +
  535. '<input type="radio" name="fegm" value="2" class="top_r" />Fine engagement(normal)<br />\n' +
  536. '<input type="radio" name="fegm" value="0" class="btm_r" />Do nothing<br />\n' +
  537.  
  538. '<input type="radio" name="fvq" value="1" class="top_r" />at maximum video quality**' +
  539. '&nbsp;&nbsp;&nbsp;&nbsp;' +
  540. '<input type="radio" name="fvq" value="2" class="top_r" />at minimum video quality<br />\n' +
  541. '<input type="radio" name="fvq" value="0" class="btm_r" />Do nothing<br />\n' +
  542.  
  543. '<span style="all: initial; font-size: 100%">' +
  544. 'Loop interval(ms)**&nbsp;' +
  545. '</span><input type="text" name="intl" size="10" class="top_t" /><br />\n' +
  546.  
  547. '<span style="all: initial; font-size: 100%; line-height: 200%">' +
  548. '*wasted traffic occurs&nbsp;&nbsp;&nbsp;&nbsp;**Restart required' +
  549. '</span><br />\n' +
  550.  
  551. '<input type="button" class="top_b" value="Cancel" />\n' +
  552. '<input type="button" class="top_b" value="Set default" />\n' +
  553. '<input type="button" class="top_b" value="Save & Close" /><br /><br />\n'
  554.  
  555. dalg.innerHTML = html
  556.  
  557. for (let e of dalg.querySelectorAll('input.top_r, input.mid_r, input.btm_r')) {
  558. e.style.all = 'initial'
  559. e.style.appearance = 'auto'
  560. e.style.marginRight = '1px'
  561. e.style.marginTop = '1px'
  562. }
  563. for (let e of dalg.querySelectorAll('input.top_c, input.mid_c, input.btm_c')) {
  564. e.style.all = 'initial'
  565. e.style.appearance = 'auto'
  566. e.style.marginRight = '1px'
  567. e.style.marginTop = '1px'
  568. }
  569. for (let e of dalg.querySelectorAll('input.top_t')) {
  570. e.style.all = 'initial'
  571. e.style.backgroundColor = 'rgb(255, 255, 255)'
  572. e.style.fontFamily = 'monospace'
  573. e.style.fontSize = '100%'
  574. e.style.marginLeft = '1px'
  575. e.style.marginRight = '1px'
  576. e.style.marginTop = '8px'
  577. e.style.marginBottom = '0px'
  578. e.style.paddingLeft = '1px'
  579. e.style.paddingRight = '1px'
  580. e.style.paddingTop = '1px'
  581. e.style.paddingBottom = '1px'
  582. }
  583. for (let e of dalg.querySelectorAll('input.top_b')) {
  584. e.style.all = 'initial'
  585. e.style.backgroundColor = 'rgb(190, 190, 190)'
  586. e.style.borderRadius = '10%'
  587. e.style.cursor = 'default'
  588. e.style.fontSize = '110%'
  589. e.style.marginTop = '10px'
  590. e.style.marginBottom = '0px'
  591. e.style.paddingTop = '6px'
  592. e.style.paddingBottom = '6px'
  593. e.style.textAlign = 'center'
  594. e.style.width = '90px'
  595. }
  596.  
  597. return dalg
  598. }
  599.  
  600. function makeFunc(dalg) {
  601. dalg.addEventListener(
  602. 'click',
  603. function (event) { event.stopPropagation() },
  604. false
  605. )
  606.  
  607. dalg.querySelector('input[value="Cancel"]').addEventListener(
  608. 'click',
  609. function () { dalg.style.display = 'none' },
  610. false
  611. )
  612. dalg.querySelector('input[value="Cancel"]').addEventListener(
  613. 'mouseenter',
  614. function (event) { event.target.style.backgroundColor = 'rgb(170, 170, 170)' },
  615. false
  616. )
  617. dalg.querySelector('input[value="Cancel"]').addEventListener(
  618. 'mouseleave',
  619. function (event) { event.target.style.backgroundColor = 'rgb(190, 190, 190)' },
  620. false
  621. )
  622.  
  623. dalg.querySelector('input[value="Set default"]').addEventListener(
  624. 'click',
  625. function () {
  626. dalg.querySelector('input[name="bbr"]').checked = BBR
  627. dalg.querySelector('input[name="origi"]').checked = ORIGI
  628. dalg.querySelector('input[name="fmt"][value="' + FMT + '"]').checked = true
  629. dalg.querySelector('input[name="wtl"]').checked = WTL
  630. dalg.querySelector('input[name="ecmode"]').checked = ECMODE
  631. dalg.querySelector('input[name="hpp"]').checked = HPP
  632. dalg.querySelector('input[name="hwtf"]').checked = HWTF
  633. dalg.querySelector('input[name="hdmd"]').checked = HDMD
  634. dalg.querySelector('input[name="hgv"]').checked = HGV
  635. dalg.querySelector('input[name="fegm"][value="' + FEGM + '"]').checked = true
  636. dalg.querySelector('input[name="fvq"][value="' + FVQ + '"]').checked = true
  637. dalg.querySelector('input[name="intl"]').value = INTL
  638. },
  639. false
  640. )
  641. dalg.querySelector('input[value="Set default"]').addEventListener(
  642. 'mouseenter',
  643. function (event) { event.target.style.backgroundColor = 'rgb(170, 170, 170)' },
  644. false
  645. )
  646. dalg.querySelector('input[value="Set default"]').addEventListener(
  647. 'mouseleave',
  648. function (event) { event.target.style.backgroundColor = 'rgb(190, 190, 190)' },
  649. false
  650. )
  651.  
  652. dalg.querySelector('input[value="Save & Close"]').addEventListener(
  653. 'click',
  654. function () {
  655. bbr = dalg.querySelector('input[name="bbr"]').checked
  656. origi = dalg.querySelector('input[name="origi"]').checked
  657. for (let e of dalg.querySelectorAll('input[name="fmt"]')) {
  658. if (e.checked) {
  659. fmt = +e.value
  660. break
  661. }
  662. }
  663. wtl = dalg.querySelector('input[name="wtl"]').checked
  664. ecmode = dalg.querySelector('input[name="ecmode"]').checked
  665. hpp = dalg.querySelector('input[name="hpp"]').checked
  666. hwtf = dalg.querySelector('input[name="hwtf"]').checked
  667. hdmd = dalg.querySelector('input[name="hdmd"]').checked
  668. hgv = dalg.querySelector('input[name="hgv"]').checked
  669. for (let e of dalg.querySelectorAll('input[name="fegm"]')) {
  670. if (e.checked) {
  671. fegm = +e.value
  672. break
  673. }
  674. }
  675. for (let e of dalg.querySelectorAll('input[name="fvq"]')) {
  676. if (e.checked) {
  677. fvq = +e.value
  678. break
  679. }
  680. }
  681. intl = +dalg.querySelector('input[name="intl"]').value
  682.  
  683. GM_setValue('bbr', bbr)
  684. GM_setValue('origi', origi)
  685. GM_setValue('fmt', fmt)
  686. GM_setValue('wtl', wtl)
  687. GM_setValue('ecmode', ecmode)
  688. GM_setValue('hpp', hpp)
  689. GM_setValue('hwtf', hwtf)
  690. GM_setValue('hdmd', hdmd)
  691. GM_setValue('hgv', hgv)
  692. GM_setValue('fegm', fegm)
  693. GM_setValue('fvq', fvq)
  694. GM_setValue('intl', intl)
  695.  
  696. dalg.style.display = 'none'
  697. },
  698. false
  699. )
  700. dalg.querySelector('input[value="Save & Close"]').addEventListener(
  701. 'mouseenter',
  702. function (event) { event.target.style.backgroundColor = 'rgb(170, 170, 170)' },
  703. false
  704. )
  705. dalg.querySelector('input[value="Save & Close"]').addEventListener(
  706. 'mouseleave',
  707. function (event) { event.target.style.backgroundColor = 'rgb(190, 190, 190)' },
  708. false
  709. )
  710. }
  711.  
  712. function initgui() {
  713. if (GM_getValue('bbr') === undefined) {
  714. GM_setValue('bbr', BBR)
  715. } else {
  716. bbr = GM_getValue('bbr')
  717. }
  718. if (GM_getValue('origi') === undefined) {
  719. GM_setValue('origi', ORIGI)
  720. } else {
  721. origi = GM_getValue('origi')
  722. }
  723. if (GM_getValue('fmt') === undefined) {
  724. GM_setValue('fmt', FMT)
  725. } else {
  726. fmt = GM_getValue('fmt')
  727. }
  728. if (GM_getValue('wtl') === undefined) {
  729. GM_setValue('wtl', WTL)
  730. } else {
  731. wtl = GM_getValue('wtl')
  732. }
  733. if (GM_getValue('ecmode') === undefined) {
  734. GM_setValue('ecmode', ECMODE)
  735. } else {
  736. ecmode = GM_getValue('ecmode')
  737. }
  738. if (GM_getValue('hpp') === undefined) {
  739. GM_setValue('hpp', HPP)
  740. } else {
  741. hpp = GM_getValue('hpp')
  742. }
  743. if (GM_getValue('hwtf') === undefined) {
  744. GM_setValue('hwtf', HWTF)
  745. } else {
  746. hwtf = GM_getValue('hwtf')
  747. }
  748. if (GM_getValue('hdmd') === undefined) {
  749. GM_setValue('hdmd', HDMD)
  750. } else {
  751. hdmd = GM_getValue('hdmd')
  752. }
  753. if (GM_getValue('hgv') === undefined) {
  754. GM_setValue('hgv', HGV)
  755. } else {
  756. hgv = GM_getValue('hgv')
  757. }
  758. if (GM_getValue('fegm') === undefined) {
  759. GM_setValue('fegm', FEGM)
  760. } else {
  761. fegm = GM_getValue('fegm')
  762. }
  763. if (GM_getValue('fvq') === undefined) {
  764. GM_setValue('fvq', FVQ)
  765. } else {
  766. fvq = GM_getValue('fvq')
  767. }
  768. if (GM_getValue('intl') === undefined) {
  769. GM_setValue('intl', INTL)
  770. } else {
  771. intl = GM_getValue('intl')
  772. }
  773.  
  774. let dalg = makeDialog()
  775. makeFunc(dalg)
  776. document.body.appendChild(dalg)
  777.  
  778. GM_registerMenuCommand('Settings', function () {
  779. if (dalg.style.display == 'none') {
  780. dalg.querySelector('input[name="bbr"]').checked = bbr
  781. dalg.querySelector('input[name="origi"]').checked = origi
  782. dalg.querySelector('input[name="fmt"][value="' + fmt + '"]').checked = true
  783. dalg.querySelector('input[name="wtl"]').checked = wtl
  784. dalg.querySelector('input[name="ecmode"]').checked = ecmode
  785. dalg.querySelector('input[name="hpp"]').checked = hpp
  786. dalg.querySelector('input[name="hwtf"]').checked = hwtf
  787. dalg.querySelector('input[name="hdmd"]').checked = hdmd
  788. dalg.querySelector('input[name="hgv"]').checked = hgv
  789. dalg.querySelector('input[name="fegm"][value="' + fegm + '"]').checked = true
  790. dalg.querySelector('input[name="fvq"][value="' + fvq + '"]').checked = true
  791. dalg.querySelector('input[name="intl"]').value = intl
  792.  
  793. dalg.style.display = 'block'
  794. }
  795. })
  796. }
  797.  
  798. function datef(date, f) {
  799. const WEEK = {
  800. 'ja': ['日', '月', '火', '水', '木', '金', '土'],
  801. 'ko': ['일', '월', '화', '수', '목', '금', '토'],
  802. 'zh-Hant': ['日', '一', '二', '三', '四', '五', '六'],
  803. 'zh': ['日', '一', '二', '三', '四', '五', '六'],
  804. 'ru': ['ВС', 'ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ'],
  805. 'de': ['Son', 'Mon', 'Die', 'Mit', 'Don', 'Fre', 'Sam'],
  806. 'it': ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'],
  807. 'fr': ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
  808. 'pt': ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'],
  809. 'en': ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] // Add your language
  810. }
  811. const WEEK_L = WEEK[LANG] ?? WEEK['en']
  812.  
  813. const YE = date.getFullYear().toString().slice(-2)
  814. const YM = date.getFullYear() - 1911
  815. const MO = ('0' + (date.getMonth() + 1)).slice(-2)
  816. const DA = ('0' + date.getDate()).slice(-2)
  817. const WE = WEEK_L[date.getDay()]
  818. const HO = ('0' + date.getHours()).slice(-2)
  819. const MI = ('0' + date.getMinutes()).slice(-2)
  820. const SE = ('0' + date.getSeconds()).slice(-2)
  821.  
  822. const F = [
  823. DA + '.' + MO + '.' + YE + ' ' + HO + ':' + MI, // 0=1
  824. DA + '.' + MO + '.' + YE + ' ' + HO + ':' + MI + ':' + SE,
  825. DA + '.' + MO + '.' + YE + '(' + WE + ') ' + HO + ':' + MI,
  826. DA + '.' + MO + '.' + YE + '(' + WE + ') ' + HO + ':' + MI + ':' + SE,
  827. YE + '/' + MO + '/' + DA + ' ' + HO + ':' + MI,
  828. YE + '/' + MO + '/' + DA + ' ' + HO + ':' + MI + ':' + SE,
  829. YE + '/' + MO + '/' + DA + '(' + WE + ') ' + HO + ':' + MI,
  830. YE + '/' + MO + '/' + DA + '(' + WE + ') ' + HO + ':' + MI + ':' + SE,
  831. YE + '-' + MO + '/' + DA + ' ' + HO + ':' + MI,
  832. YE + '-' + MO + '/' + DA + ' ' + HO + ':' + MI + '\'' + SE,
  833. YE + '-' + MO + '/' + DA + '(' + WE + ') ' + HO + ':' + MI,
  834. YE + '-' + MO + '/' + DA + '(' + WE + ') ' + HO + ':' + MI + '\'' + SE,
  835. 'M' + YM + '-' + MO + '-' + DA + ' ' + HO + ':' + MI,
  836. 'M' + YM + '-' + MO + '-' + DA + ' ' + HO + ':' + MI + ':' + SE,
  837. 'M' + YM + '-' + MO + '-' + DA + '(' + WE + ') ' + HO + ':' + MI,
  838. 'M' + YM + '-' + MO + '-' + DA + '(' + WE + ') ' + HO + ':' + MI + ':' + SE,
  839. YE + '/' + MO + '/' + DA + '(' + WE + ') ' + HO + ':' + MI + ':' + SE
  840. ]
  841.  
  842. return F[f - 1] ?? F[16]
  843. }
  844.  
  845. function bbreturn() {
  846. const SEL_ID =
  847. 'div#placeholder[aria-label="Loading…"] g path, ' +
  848. 'svg#loading-x-anim-0 g path, svg#loading-x-anim-1 g path, ' +
  849. 'svg#loading-x-anim-2 g path, svg#loading-x-anim-3 g path'
  850. const SEL_H = 'header[role="banner"] h1[role="heading"] g path' // ホーム
  851. const SEL_M = 'div[data-testid="Dropdown"] a[href="/i/premium_sign_up"] g path' // もっと見る
  852. const SEL_V = 'header[role="banner"] nav g path' // 認証済み
  853. const SEL_L = 'div[role="dialog"] div[aria-labelledby="modal-header"] svg.r-lrvibr path' // ログイン
  854. const SEL_T = 'div#react-root main svg.r-lrvibr path' // トップ
  855.  
  856. let elms = document.querySelectorAll(
  857. SEL_ID + ', ' + SEL_H + ', ' + SEL_M + ', ' + SEL_V + ', ' + SEL_L + ', ' + SEL_T
  858. )
  859. let ss // Temp.
  860.  
  861. for (let e of elms) {
  862. const D_X = 'M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99'
  863. const D_BB =
  864. 'M23.643 4.937c-.835.37-1.732.62-2.675.733.962-.576 1.7-1.49 2.048-2.578-.9.534-1' +
  865. '.897.922-2.958 1.13-.85-.904-2.06-1.47-3.4-1.47-2.572 0-4.658 2.086-4.658 4.66 0' +
  866. ' .364.042.718.12 1.06-3.873-.195-7.304-2.05-9.602-4.868-.4.69-.63 1.49-.63 2.342' +
  867. ' 0 1.616.823 3.043 2.072 3.878-.764-.025-1.482-.234-2.11-.583v.06c0 2.257 1.605 ' +
  868. '4.14 3.737 4.568-.392.106-.803.162-1.227.162-.3 0-.593-.028-.877-.082.593 1.85 2' +
  869. '.313 3.198 4.352 3.234-1.595 1.25-3.604 1.995-5.786 1.995-.376 0-.747-.022-1.112' +
  870. '-.065 2.062 1.323 4.51 2.093 7.14 2.093 8.57 0 13.255-7.098 13.255-13.254 0-.2-.' +
  871. '005-.402-.014-.602.91-.658 1.7-1.477 2.323-2.41z'
  872. const D_FILL_N = 'none'
  873. const D_FILL_LB = '#1da1f2ff'
  874. const D_FILL_DB = '#1d9bf0ff'
  875. const D_S = 'currentColor'
  876. const D_SW = '2'
  877.  
  878. if (e.getAttribute('d').startsWith(D_X)) {
  879. if (e.closest('header[role="banner"] nav, div[data-testid="Dropdown"] a[href="/i/premium_sign_up"]')) {
  880. ss = s_mutations
  881.  
  882. e.setAttribute('d', D_BB)
  883. e.setAttribute('fill', D_FILL_N)
  884. e.setAttribute('stroke', D_S)
  885. e.setAttribute('stroke-width', D_SW)
  886.  
  887. s_mutations = ss
  888. } else if (e.closest('div#placeholder[aria-label="Loading…"]') ||
  889. e.closest('svg[id^="loading-x-anim-"]')) {
  890. ss = s_mutations
  891.  
  892. e.setAttribute('d', D_BB)
  893. e.setAttribute('fill', D_FILL_LB)
  894.  
  895. s_mutations = ss
  896. } else {
  897. ss = s_mutations
  898.  
  899. e.setAttribute('d', D_BB)
  900. e.setAttribute('fill', D_FILL_DB)
  901.  
  902. s_mutations = ss
  903. }
  904. }
  905. }
  906.  
  907. const TITLE = document.title
  908. let elm = document.querySelector('head link[rel="shortcut icon"]')
  909. let elm_2 = document.querySelector('head link[rel="apple-touch-icon"]')
  910.  
  911. ss = s_mutations
  912.  
  913. if (
  914. elm &&
  915. !/favicons\/twitter\.2\.ico$/.test(elm.getAttribute('href')) &&
  916. !/^\(\d+\) /.test(document.title)
  917. ) {
  918. elm.setAttribute('href', '//abs.twimg.com/favicons/twitter.2.ico')
  919. } else if (
  920. elm &&
  921. !/favicons\/twitter-pip\.2\.ico$/.test(elm.getAttribute('href')) &&
  922. /^\(\d+\) /.test(document.title)
  923. ) {
  924. elm.setAttribute('href', '//abs.twimg.com/favicons/twitter-pip.2.ico')
  925. }
  926. if (
  927. elm_2 &&
  928. /responsive-web\/client-web[-a-z]*\/icon-ios\.77d25eba\.png$/.test(elm_2.getAttribute('href'))
  929. ) {
  930. elm_2.setAttribute('href', 'data:image/png;base64,' + PNG_BB)
  931. alert('afaf')
  932. }
  933. let rt = TITLE.replace(/ \/ X$/, ' / Twitter')
  934. if (TITLE != rt) document.title = rt
  935.  
  936. s_mutations = ss
  937. }
  938.  
  939. function origimg() {
  940. const SEL_D = 'div[style*="background-image:"]'
  941. const SEL_I = 'img'
  942.  
  943. let elms = document.querySelectorAll(SEL_D + ', ' + SEL_I)
  944.  
  945. for (let e of elms) {
  946. let regex = /^(.+pbs\.twimg\.com\/[^?]+\?format=\w+)(&|&amp;)(name=)(\w+)([")]*)$/
  947. let ss // Temp.
  948.  
  949. if (/div/i.test(e.tagName)) {
  950. let r = regex.exec(e.style.backgroundImage)
  951. if (r && r[4] != 'orig') {
  952. ss = s_mutations
  953. e.style.backgroundImage = r[1] + r[2] + r[3] + 'orig' + r[5]
  954. s_mutations = ss
  955. continue
  956. }
  957.  
  958. continue
  959. }
  960.  
  961. let r = regex.exec(e.getAttribute('src'))
  962. if (r && r[4] != 'orig') {
  963. ss = s_mutations
  964. e.setAttribute('src', r[1] + r[2] + r[3] + 'orig' + r[5])
  965. s_mutations = ss
  966. continue
  967. }
  968. }
  969. }
  970.  
  971. function widetl() {
  972. let elms = document.querySelectorAll('div.css-175oi2r.r-aqfbo4[data-testid="sidebarColumn"]')
  973. let ss // Temp.
  974.  
  975. if (!document.querySelector('head style.' + 'us-' + MYNAME + '-' + 'c')) {
  976. let style_a = document.createElement('style')
  977. style_a.className = 'us-' + MYNAME + '-' + 'a'
  978. style_a.textContent =
  979. 'div.css-175oi2r.r-f8sm7e.r-13qz1uu.r-1ye8kvj' +
  980. '{max-width: 660px;}'
  981.  
  982. let style_b = document.createElement('style')
  983. style_b.className = 'us-' + MYNAME + '-' + 'b'
  984. style_b.textContent =
  985. 'div[role="dialog"] div.css-175oi2r.r-f8sm7e.r-13qz1uu.r-1ye8kvj' +
  986. '{max-width: 600px;}'
  987.  
  988. let style_c = document.createElement('style')
  989. style_c.className = 'us-' + MYNAME + '-' + 'c'
  990. style_c.textContent =
  991. 'section div.css-175oi2r.r-f8sm7e.r-13qz1uu.r-1ye8kvj' +
  992. '{max-width: 600px;}'
  993.  
  994. ss = s_mutations
  995.  
  996. document.head.appendChild(style_a)
  997. document.head.appendChild(style_b)
  998. document.head.appendChild(style_c)
  999.  
  1000. s_mutations = ss
  1001. }
  1002.  
  1003. for (let e of elms) {
  1004. let d, dd, dg, dgi, spdgi, da, ds
  1005.  
  1006. d = e.querySelector(':scope>div>div.r-1hycxz', ':scope>div>div.r-1jocfgc')
  1007. if (d != null) {
  1008. dd = d.querySelector('div.r-aqfbo4.r-6gpygo.r-15ysp7h') // null対策
  1009. dg = d.querySelector('div[data-testid="google_sign_in_container"]')
  1010. dgi = d.querySelector('div[data-testid="google_sign_in_container"] iframe[id^="gsi"]')
  1011. da = d.querySelector('button[data-testid="apple_sign_in_button"]')
  1012. ds = d.querySelector('a[href="/i/flow/signup"]')
  1013. }
  1014. if (dgi) spdgi = dgi.parentNode.parentNode
  1015.  
  1016. ss = s_mutations
  1017.  
  1018. if (dd) dd.style.width = '290px'
  1019. if (dg) dg.style.width = '260px'
  1020. if (dgi) dgi.style.left = '-20px'
  1021. if (spdgi) spdgi.style.setProperty('clip-path', 'inset(0 round 20px)')
  1022. if (da) da.style.width = '260px'
  1023. if (ds) ds.style.width = '260px'
  1024. if (d != null) d.style.width = '290px'
  1025. e.style.width = '290px' // 350px
  1026.  
  1027. s_mutations = ss
  1028. }
  1029. }
  1030.  
  1031. function chgbgc() {
  1032. let body = document.getElementsByTagName('body')[0]
  1033.  
  1034. if (/\(2\d{2},\s*2\d{2},\s*2\d{2}/i.test(body.style.backgroundColor)) {
  1035. let tl, fb, sb
  1036. tl = document.querySelector('main div.r-f8sm7e.r-1ye8kvj')
  1037. fb = document.querySelector('main div.r-1e5uvyk.r-6026j')
  1038. sb = document.querySelector('main div.r-aqfbo4.r-15ysp7h.r-1xcajam')
  1039.  
  1040. let ss = s_mutations
  1041.  
  1042. body.style.backgroundColor = 'rgb(253, 253, 245)'
  1043. if (tl != null) tl.style.backgroundColor = 'rgb(253, 253, 245)'
  1044. if (fb != null) fb.style.backgroundColor = 'rgba(253, 253, 245, 0.85)'
  1045. if (sb != null) sb.style.backgroundColor = 'rgb(253, 253, 245)'
  1046.  
  1047. s_mutations = ss
  1048. }
  1049. }
  1050.  
  1051. function hidepromo() {
  1052. const SEL = 'path[d^="M19.498 3h-15c-1.381 0-2.5 1.12-2.5 2.5v13c0 1.38 1.119 2.5"]'
  1053. const SEL_2 = 'main div[data-testid="sidebarColumn"] section div[data-testid="trend"] div.r-14gqq1x ' +
  1054. 'span.css-1qaijid.r-bcqeeo.r-qvutc0' // def-ja, def-en, ble-ja, ble-en
  1055. const SEL_3 = 'main div[data-testid="primaryColumn"] section article ' +
  1056. 'span.css-1jxf684.r-bcqeeo.r-qvutc0.r-poiln3'
  1057. const SEL_4 =
  1058. 'main div[data-testid="primaryColumn"] section ' +
  1059. 'span.css-901oao.css-16my406.r-bcqeeo.r-qvutc0'
  1060. // Lone label def-ja, def-en, ble-ja, ble-en
  1061. let elms = document.querySelectorAll(SEL)
  1062. let elms_2 = document.querySelectorAll(SEL_2)
  1063. let elms_3 = document.querySelectorAll(SEL_3)
  1064. let elms_4 = document.querySelectorAll(SEL_4)
  1065.  
  1066. const PROMO = {
  1067. 'ja': 'によるプロモーション$',
  1068. 'ko': ' 님이 프로모션함$',
  1069. 'zh-Hant': '^由 .+ 推廣$',
  1070. 'zh': '^由 .+ 推广$',
  1071. 'ru': '^Реклама от ',
  1072. 'de': '^Gesponsert von ',
  1073. 'it': '^Sponsorizzato da ',
  1074. 'fr': '^Sponsorisé par ',
  1075. 'pt': '^Promovido por ',
  1076. 'en': '^Promoted by ' // Add your language
  1077. }
  1078. const PROMO_L = PROMO[LANG] ?? PROMO['en']
  1079.  
  1080. const PROMO_2 = {
  1081. 'ja': 'プロモポスト',
  1082. 'ko': 'Promoted Post',
  1083. 'zh-Hant': '推廣貼文',
  1084. 'zh': 'Promoted Post',
  1085. 'ru': 'Promoted Post',
  1086. 'de': 'Gesponserter Post',
  1087. 'it': 'Promoted Post',
  1088. 'fr': 'Promoted Post',
  1089. 'pt': 'Post promovido',
  1090. 'en': 'Promoted Post' // Add your language
  1091. }
  1092. const PROMO_L_2 = PROMO_2[LANG] ?? PROMO_2['en']
  1093.  
  1094. let ss // Temp.
  1095.  
  1096. for (let e of elms) {
  1097. let xpe = e.closest('div[data-testid="cellInnerDiv"]')
  1098. if (!xpe) xpe = e.closest('div.css-175oi2r.r-1adg3ll.r-1ny4l3l') // def-ja, def-en, ble-ja, ble-en
  1099. if (!xpe) xpe = e.closest('div.css-175oi2r.r-1ny4l3l[data-testid="UserCell"]') // def-ja, def-en, ?, ble-en
  1100.  
  1101. ss = s_mutations
  1102.  
  1103. if (xpe) xpe.style.setProperty('display', 'none') // Right column のおすすめユーザー'
  1104.  
  1105. s_mutations = ss
  1106. }
  1107.  
  1108. for (let e of elms_2) {
  1109. const REGEX = new RegExp(PROMO_L, 'i')
  1110.  
  1111. if (!REGEX.test(e.textContent)) continue
  1112.  
  1113. let xpe = e.closest('div.css-175oi2r.r-1adg3ll.r-1ny4l3l')
  1114.  
  1115. ss = s_mutations
  1116.  
  1117. xpe.style.setProperty('display', 'none')
  1118.  
  1119. s_mutations = ss
  1120. }
  1121.  
  1122. for (let e of elms_3) {
  1123. if (e.textContent != 'Ad') continue
  1124.  
  1125. let xpe = e.closest('div[data-testid="cellInnerDiv"]')
  1126.  
  1127. ss = s_mutations
  1128.  
  1129. xpe.style.setProperty('display', 'none')
  1130.  
  1131. s_mutations = ss
  1132. }
  1133.  
  1134. for (let e of elms_4) {
  1135. if (e.textContent != PROMO_2['en'] && e.textContent != PROMO_L_2) continue
  1136.  
  1137. let xpe = e.closest('div[data-testid="cellInnerDiv"]')
  1138.  
  1139. ss = s_mutations
  1140.  
  1141. xpe.style.setProperty('display', 'none')
  1142.  
  1143. s_mutations = ss
  1144. }
  1145. }
  1146.  
  1147. function hidewtf() {
  1148. let ss // Temp.
  1149.  
  1150. let r =
  1151. '^[^:]+://[^/]+/$|' +
  1152.  
  1153. '^[^:]+://[^/]+/(' +
  1154. 'compose|' + // pop up
  1155. 'search-advanced|' + // pop up
  1156. 'home|' + // 除外?
  1157. 'search|' +
  1158.  
  1159. 'i/display|' + // pop up
  1160. 'i/flow|' + // pop up
  1161. 'i/keyboard_shortcuts|' + // pop up
  1162. 'i/verified-orgs-signup|' + // pop up、追加
  1163. 'i/verified-choose|' + // pop up、追加
  1164. 'i/premium_sign_up|' + // pop up、追加
  1165. 'i/connect_people|' +
  1166. 'i/topics|' +
  1167. 'i/spaces/start|' + // pop up、追加
  1168. 'i/verified-application|' + // pop up、追加
  1169. 'i/verified-get-verified|' + // pop up、追加
  1170.  
  1171. '[^/]+/followers|' +
  1172. '[^/]+/following|' +
  1173. '[^/]+/lists|' +
  1174. '[^/]+/status/|' + // 両方、WTFのみ除外
  1175. '[^/]+/topics|' +
  1176. '[^/]+/creator-subscriptions|' + // 追加
  1177. '[^/]+/superfollows|' + // 追加
  1178. '[^/]+/verified_followers' + // 追加
  1179. ')'
  1180.  
  1181. if (new RegExp(r, 'i').test(document.URL)) {
  1182. for (let i = 1; i < 4; i++) {
  1183. let e = document.querySelector('head style.' + 'us-' + MYNAME + '-' + i)
  1184. if (e) document.head.removeChild(e)
  1185. }
  1186.  
  1187. return
  1188. }
  1189.  
  1190. if (!document.querySelector('head style.' + 'us-' + MYNAME + '-' + 1)) {
  1191. ss = s_mutations
  1192.  
  1193. let style = document.createElement('style')
  1194. style.className = 'us-' + MYNAME + '-' + 1
  1195. style.textContent =
  1196. 'main div[data-testid="primaryColumn"] section div[data-testid="cellInnerDiv"]' +
  1197. ':has(button.css-175oi2r.r-1mmae3n.r-3pj75a.r-1ny4l3l.r-o7ynqc.r-6416eg[data-testid="UserCell"]) ' +
  1198. '{display: none;}'
  1199. // フォロー, def-ja, def-en, ble-ja, ble-en
  1200. document.head.appendChild(style)
  1201.  
  1202. s_mutations = ss
  1203. }
  1204.  
  1205. if (!document.querySelector('head style.' + 'us-' + MYNAME + '-' + 2)) {
  1206. ss = s_mutations
  1207.  
  1208. let style = document.createElement('style')
  1209. style.className = 'us-' + MYNAME + '-' + 2
  1210. style.textContent =
  1211. 'main div[data-testid="primaryColumn"] section div[data-testid="cellInnerDiv"]' +
  1212. ':has(h2[aria-level="2"][role="heading"]>div>span.css-1jxf684.r-bcqeeo.r-qvutc0) {display: none;}'
  1213. // Who to follow, def-ja, def-en, ble-ja, ble-en
  1214. document.head.appendChild(style)
  1215.  
  1216. s_mutations = ss
  1217. }
  1218.  
  1219. if (!document.querySelector('head style.' + 'us-' + MYNAME + '-' + 3)) {
  1220. ss = s_mutations
  1221.  
  1222. let style = document.createElement('style')
  1223. style.className = 'us-' + MYNAME + '-' + 3
  1224. style.textContent =
  1225. 'main div[data-testid="primaryColumn"] section div[data-testid="cellInnerDiv"]' +
  1226. ':has(a[href*="/connect_people?user_id="]) {display: none;}' // さらに表示
  1227. document.head.appendChild(style)
  1228.  
  1229. s_mutations = ss
  1230. }
  1231. }
  1232.  
  1233. function hidedmd() {
  1234. const SEL = 'div[data-testid="DMDrawer"]'
  1235. let elm = document.querySelector(SEL)
  1236. let ss = s_mutations
  1237.  
  1238. if (elm != null) elm.style.setProperty('display', 'none')
  1239.  
  1240. s_mutations = ss
  1241. }
  1242.  
  1243. function hidegv() {
  1244. const SEL = 'aside.css-175oi2r.r-1habvwh.r-eqz5dr.r-uaa2di.r-1mmae3n.r-3pj75a'
  1245. const SEL_2 = 'main section div[data-testid="cellInnerDiv"] h1[role="heading"] span.css-1jxf684.r-bcqeeo.r-qvutc0'
  1246. // def-ja, def-en, ble-ja, ble-en
  1247. let elms = document.querySelectorAll(SEL)
  1248. let elms_2 = document.querySelectorAll(SEL_2)
  1249.  
  1250. const TC = {
  1251. 'gv': {
  1252. 'ja': '認証を受ける',
  1253. 'ko': '인증 받기',
  1254. 'zh-Hant': '獲得認證',
  1255. 'zh': '获得认证',
  1256. 'ru': 'Подтвердить подлинность',
  1257. 'de': 'Lass dich verifizieren',
  1258. 'it': 'Ottieni la verifica',
  1259. 'fr': 'Obtenez la certification',
  1260. 'pt': 'Obter verificação',
  1261. 'en': 'Get Verified' // Add your language
  1262. },
  1263. 'sp': {
  1264. 'ja': 'プレミアムにサブスクライブ',
  1265. 'ko': 'Subscribe to Premium',
  1266. 'zh-Hant': '訂閱 Premium',
  1267. 'zh': 'Subscribe to Premium',
  1268. 'ru': 'Subscribe to Premium',
  1269. 'de': 'Premium abonnieren',
  1270. 'it': 'Subscribe to Premium',
  1271. 'fr': 'Subscribe to Premium',
  1272. 'pt': 'Assine o Premium',
  1273. 'en': 'Subscribe to Premium' // Add your language
  1274. },
  1275. 'spylp': {
  1276. 'ja': '長いポストを作成するには、プレミアムにサブスクライブしてください',
  1277. 'ko': 'Premium을 구독하고 나만의 긴 게시물을 작성해 보세요',
  1278. 'zh-Hant': '訂閱 Premium 以撰寫你自己的更長貼文',
  1279. 'zh': '订阅 Premium,撰写自己的长帖',
  1280. 'ru': 'Подпишитесь на Premium, чтобы писать собственные длинные посты',
  1281. 'de': 'Abonniere Premium, wenn du deine eigenen längeren Posts schreiben möchtest',
  1282. 'it': 'Per scrivere post più lunghi, abbonati a Premium',
  1283. 'fr': 'Abonnez-vous à Premium pour écrire vos propres posts plus longs.',
  1284. 'pt': 'Assine o Premium para escrever posts mais longos',
  1285. 'en': 'Subscribe to Premium to write your own longer posts' // Add your language
  1286. },
  1287. 'gafp': {
  1288. 'ja': 'プレミアムプラスで広告をなくす',
  1289. 'ko': 'Go ad-free with Premium+',
  1290. 'zh-Hant': 'Go ad-free with Premium+',
  1291. 'zh': 'Go ad-free with Premium+',
  1292. 'ru': 'Go ad-free with Premium+',
  1293. 'de': 'Go ad-free with Premium+',
  1294. 'it': 'Go ad-free with Premium+',
  1295. 'fr': 'Go ad-free with Premium+',
  1296. 'pt': 'Go ad-free with Premium+',
  1297. 'en': 'Go ad-free with Premium+' // Add your language
  1298. },
  1299. 'gaf': {
  1300. 'ja': '広告をなくす',
  1301. 'ko': 'Go ad free',
  1302. 'zh-Hant': 'Go ad free',
  1303. 'zh': 'Go ad free',
  1304. 'ru': 'Go ad free',
  1305. 'de': 'Go ad free',
  1306. 'it': 'Go ad free',
  1307. 'fr': 'Go ad free',
  1308. 'pt': 'Go ad free',
  1309. 'en': 'Go ad free' // Add your language
  1310. },
  1311. 'txp': {
  1312. 'ja': 'TweetDeckはX Proになりました',
  1313. 'ko': 'TweetDeck is now X Pro',
  1314. 'zh-Hant': 'TweetDeck is now X Pro',
  1315. 'zh': 'TweetDeck is now X Pro',
  1316. 'ru': 'TweetDeck is now X Pro',
  1317. 'de': 'TweetDeck is now X Pro',
  1318. 'it': 'TweetDeck is now X Pro',
  1319. 'fr': 'TweetDeck is now X Pro',
  1320. 'pt': 'TweetDeck is now X Pro',
  1321. 'en': 'TweetDeck is now X Pro' // Add your language
  1322. }
  1323. }
  1324. const GV_L = TC.gv[LANG] ?? TC.gv['en']
  1325. const SP_L = TC.sp[LANG] ?? TC.sp['en']
  1326. const SPYLP_L = TC.spylp[LANG] ?? TC.spylp['en']
  1327. const GAFP_L = TC.gafp[LANG] ?? TC.gafp['en']
  1328. const GAF_L = TC.gaf[LANG] ?? TC.gaf['en']
  1329. const TXP_L = TC.txp[LANG] ?? TC.txp['en']
  1330.  
  1331. for (let e of elms) {
  1332. if (
  1333. e.getAttribute('aria-label') == GV_L ||
  1334. e.getAttribute('aria-label') == SP_L ||
  1335. e.getAttribute('aria-label') == SPYLP_L ||
  1336. e.getAttribute('aria-label') == GAFP_L
  1337. ) {
  1338. let ss = s_mutations
  1339.  
  1340. e.parentNode.parentNode.style.setProperty('display', 'none')
  1341.  
  1342. s_mutations = ss
  1343. }
  1344. }
  1345.  
  1346. for (let e of elms_2) {
  1347. if (e.textContent == GAF_L || e.textContent == TXP_L) {
  1348. let xpe = e.closest('div[data-testid="cellInnerDiv"]')
  1349.  
  1350. let ss = s_mutations
  1351.  
  1352. xpe.style.setProperty('display', 'none')
  1353.  
  1354. s_mutations = ss
  1355. }
  1356. }
  1357. }
  1358.  
  1359. function fineegm() {
  1360. const SEL_R =
  1361. 'main div[data-testid="primaryColumn"] section article ' +
  1362. 'button.css-175oi2r.r-1777fci.r-bt1l66.r-bztko3.r-lrvibr.r-1loqt21.r-1ny4l3l[data-testid*="reply"] ' +
  1363. 'div>span[data-testid="app-text-transition-container"]>span' // 一つ上
  1364. const SEL_T =
  1365. 'main div[data-testid="primaryColumn"] section article ' +
  1366. 'button.css-175oi2r.r-1777fci.r-bt1l66.r-bztko3.r-lrvibr.r-1loqt21.r-1ny4l3l[data-testid*="retweet"] ' +
  1367. 'div>span[data-testid="app-text-transition-container"]>span'
  1368. const SEL_L =
  1369. 'main div[data-testid="primaryColumn"] section article ' +
  1370. 'button.css-175oi2r.r-1777fci.r-bt1l66.r-bztko3.r-lrvibr.r-1loqt21.r-1ny4l3l[data-testid*="like"] ' +
  1371. 'div>span[data-testid="app-text-transition-container"]>span'
  1372. const SEL_B =
  1373. 'main div[data-testid="primaryColumn"] section article ' +
  1374. 'button.css-175oi2r.r-1777fci.r-bt1l66.r-bztko3.r-lrvibr.r-1loqt21.r-1ny4l3l[data-testid*="bookmark"] ' +
  1375. 'div>span[data-testid="app-text-transition-container"]>span'
  1376.  
  1377. document.
  1378. querySelectorAll(SEL_R + ', ' + SEL_T + ', ' + SEL_L + ', ' + SEL_B).
  1379. forEach(function (e) {
  1380. const SEL_ADD = 'span.us-' + MYNAME
  1381.  
  1382. let ce = e.querySelector('span:not(.us-' + MYNAME + ')')
  1383. let xpe = e.closest('button')
  1384. let n = +xpe.getAttribute('aria-label').split(' ')[0]
  1385. let ls = ''
  1386. if (n) ls = n.toLocaleString('en-US')
  1387.  
  1388. let old = e.querySelector(SEL_ADD)
  1389.  
  1390. let ss // Temp.
  1391.  
  1392. ss = s_mutations
  1393.  
  1394. if (ce && ce.style.display != 'none') { // 0の時も無い
  1395. ce.style.setProperty('display', 'none')
  1396. }
  1397. if (!old) {
  1398. let span = document.createElement('span')
  1399. span.className = 'us-' + MYNAME
  1400. span.textContent = ls
  1401. if (ce) span.style = ce.style
  1402.  
  1403. e.appendChild(span)
  1404. } else if (old.textContent != ls) {
  1405. old.textContent = ls
  1406. if (ce) old.style = ce.style
  1407. }
  1408.  
  1409. s_mutations = ss
  1410. })
  1411. }
  1412.  
  1413. function fineegm_v_d() {
  1414. const SEL =
  1415. 'main div[data-testid="primaryColumn"] section article ' +
  1416. 'div.css-175oi2r.r-1d09ksm.r-1471scf.r-18u37iz.r-1wbh5a2>' +
  1417. 'div>span>div>span[data-testid="app-text-transition-container"]>span>span:not(.us-' + MYNAME + ')'
  1418. // 表示回数は減らない、0の時は無い
  1419. const SEL_2 =
  1420. 'button.css-175oi2r.r-1777fci.r-bt1l66.r-bztko3.r-lrvibr.r-1loqt21.r-1ny4l3l[data-testid*="retweet"] ' +
  1421. 'div>span[data-testid="app-text-transition-container"]>span' // 一つ上
  1422. const SEL_ADD = 'span.us-' + MYNAME
  1423.  
  1424. let elm = document.querySelector(SEL)
  1425. if (!elm) return
  1426.  
  1427. let elm_2 = document.querySelector(SEL_2)
  1428. if (!elm_2) return
  1429.  
  1430. let pelm = elm.parentNode
  1431. let xpelm_2 = elm_2.closest('div.r-1kbdv8c[aria-label][role="group"]') // fineegm()のさらに上
  1432. let n = +/(\d+)\D+$/.exec(xpelm_2.getAttribute('aria-label'))[1]
  1433. let ls = n.toLocaleString('en-US')
  1434.  
  1435. let old = pelm.querySelector(SEL_ADD)
  1436.  
  1437. let ss // Temp.
  1438.  
  1439. ss = s_mutations
  1440.  
  1441. if (!old) {
  1442. let span = document.createElement('span')
  1443. span.className = 'us-' + MYNAME
  1444. span.textContent = ls
  1445. span.style = elm.style
  1446.  
  1447. elm.style.setProperty('display', 'none')
  1448. pelm.appendChild(span)
  1449. } else if (old.textContent != ls) {
  1450. old.textContent = ls
  1451. old.style = elm.style
  1452. }
  1453.  
  1454. s_mutations = ss
  1455. }
  1456.  
  1457. function fineegm_v_t() {
  1458. const SEL =
  1459. 'main div[data-testid="primaryColumn"] section article ' +
  1460. 'a[href$="/analytics"][aria-label][role="link"]>div>div>span[data-testid="app-text-transition-container"]>' +
  1461. 'span>span:not(.us-' + MYNAME + ')' // 二つ下から消える
  1462.  
  1463. document.querySelectorAll(SEL).forEach(function (e) {
  1464. const SEL_ADD = 'span.us-' + MYNAME
  1465.  
  1466. let pe = e.parentNode
  1467. let xpe = e.closest('a')
  1468. let n = +xpe.getAttribute('aria-label').split(' ')[0]
  1469. let ls = n.toLocaleString('en-US')
  1470.  
  1471. let old = pe.querySelector(SEL_ADD)
  1472.  
  1473. let ss // Temp.
  1474.  
  1475. ss = s_mutations
  1476.  
  1477. if (!old) {
  1478. let span = document.createElement('span')
  1479. span.className = 'us-' + MYNAME
  1480. span.textContent = ls
  1481. span.style = e.style
  1482.  
  1483. e.style.setProperty('display', 'none')
  1484. pe.appendChild(span)
  1485. } else if (old.textContent != ls) {
  1486. old.textContent = ls
  1487. old.style = e.style
  1488. }
  1489.  
  1490. s_mutations = ss
  1491. })
  1492. }
  1493.  
  1494. function fineegm_t() {
  1495. const SEL =
  1496. 'main div[data-testid="primaryColumn"] div[aria-label] ' +
  1497. 'h2[role="heading"]~div.css-146c3p1.r-n6v787.r-1cwl3u0'
  1498. const SEL_2 =
  1499. 'script[data-testid="UserProfileSchema-test"]'
  1500. const SEL_ADD = 'div.us-' + MYNAME
  1501.  
  1502. let elm = document.querySelector(SEL)
  1503. if (!elm) return
  1504.  
  1505. let elm_2 = document.querySelector(SEL_2)
  1506. if (!elm_2) return
  1507.  
  1508. let pelm = elm.parentNode
  1509. let n = JSON.parse(elm_2.textContent).author.interactionStatistic[2].userInteractionCount
  1510. let ls = n.toLocaleString('en-US')
  1511.  
  1512. let old = pelm.querySelector(SEL_ADD)
  1513.  
  1514. let ss = s_mutations // Temp.
  1515.  
  1516. if (!old) {
  1517. let div = document.createElement('div')
  1518. div.className = 'us-' + MYNAME
  1519. div.textContent = ls + ' ' + elm.textContent.split(' ')[1]
  1520. div.style = elm.style
  1521.  
  1522. elm.style.setProperty('display', 'none')
  1523. pelm.appendChild(div)
  1524. } else if (old.textContent.split(' ')[0] != ls) {
  1525. old.textContent = ls + ' ' + elm.textContent.split(' ')[1]
  1526. old.style = elm.style
  1527. }
  1528.  
  1529. s_mutations = ss
  1530. }
  1531.  
  1532. function isHLSURL(url) {
  1533. return (
  1534. /^https?:\/\/video\.twimg\.com\/[^?]+\.m3u8?/i.test(url) ||
  1535. /^https?:\/\/[^.]+\.video\.pscp\.tv\/[^?]+\.m3u8?/i.test(url)
  1536. )
  1537. }
  1538.  
  1539. function isHLSMaster(text) {
  1540. return (
  1541. text &&
  1542. text.includes('#EXT-X-STREAM-INF') &&
  1543. !text.includes('#EXT-X-TARGETDURATION')
  1544. )
  1545. }
  1546.  
  1547. function pickone(reg, text) {
  1548. let matches = []
  1549. const HEAD = text.replace(reg, function (m, p1) {
  1550. matches.push([m, p1])
  1551. return ''
  1552. })
  1553. const L = matches.length
  1554. if (L < 2) return text
  1555.  
  1556. let select = matches[0]
  1557. for (let i = 1; i < L; i++) { // 2番目から
  1558. select =
  1559. (fvq != 2 && +select[1] < +matches[i][1]) ||
  1560. (fvq == 2 && +select[1] > +matches[i][1]) ? matches[i] :
  1561. select
  1562. }
  1563.  
  1564. return (HEAD + '\n' + select[0]).trim().replace(/(\r?\n)+/g, '\n') + '\n'
  1565. }
  1566.  
  1567. function twXHRStateHandler({ target: xhr }) {
  1568. if (xhr.readyState === 4) {
  1569. const rawTEXT = xhr.responseText
  1570. if (isHLSMaster(rawTEXT)) {
  1571. // eslint-disable-next-line regexp/optimal-quantifier-concatenation
  1572. const REG = /#EXT-X-STREAM-INF.*[^-]BANDWIDTH=(\d+).*\r?\n\/.+$/gm
  1573. const modTEXT = pickone(REG, rawTEXT)
  1574. Object.defineProperties(xhr, {
  1575. response: { writable: true },
  1576. responseText: { writable: true }
  1577. })
  1578. xhr.response = xhr.responseText = modTEXT
  1579. }
  1580. }
  1581. }
  1582.  
  1583. function overrideXHROpen() {
  1584. originalXHROPEN = XMLHttpRequest.prototype.open
  1585. XMLHttpRequest.prototype.open = function () {
  1586. if (isHLSURL(arguments[1])) {
  1587. this.addEventListener('readystatechange', twXHRStateHandler)
  1588. }
  1589. return originalXHROPEN.apply(this, arguments)
  1590. }
  1591.  
  1592. console.log(MYNAME + ': XMLHttpRequest.open overriden.')
  1593. }
  1594.  
  1595. function repldatetime() {
  1596. const SEL =
  1597. 'main div[data-testid="primaryColumn"] section article time[datetime*=":"]'
  1598. const SEL_2 =
  1599. 'div[aria-labelledby="modal-header"] div[data-testid^="User-Name"] time[datetime]'
  1600. const SEL_3 =
  1601. 'div[aria-labelledby="modal-header"] div[aria-label] time[datetime]'
  1602. const SEL_4 =
  1603. 'main section[aria-labelledby="detail-header"] article div[data-testid^="User-Name"] time[datetime]'
  1604. const SEL_5 =
  1605. 'main section div[data-testid="conversation"] div[aria-label] time[datetime]' // DM list
  1606.  
  1607. document.
  1608. querySelectorAll(SEL + ', ' + SEL_2 + ', ' + SEL_3 + ', ' + SEL_4 + ', ' + SEL_5).
  1609. forEach(function (e) {
  1610. const SEL_ADD = 'span.us-' + MYNAME
  1611.  
  1612. let d = e.getAttribute('datetime')
  1613. let df = datef(new Date(d), fmt)
  1614.  
  1615. let pe = e.parentNode
  1616.  
  1617. let old = pe.querySelectorAll(SEL_ADD)
  1618.  
  1619. let ss // Temp.
  1620.  
  1621. ss = s_mutations
  1622.  
  1623. if (!old.length) {
  1624. let span = document.createElement('span')
  1625. span.className = 'us-' + MYNAME
  1626. span.setAttribute('datetime', d)
  1627. span.setAttribute('local-datetime', df)
  1628. span.textContent = df
  1629. span.style = e.style
  1630.  
  1631. e.style.setProperty('display', 'none')
  1632. pe.appendChild(span)
  1633. } else if (old[0].getAttribute('local-datetime') != df) { // TZ change
  1634. old[0].setAttribute('local-datetime', df)
  1635. old[0].textContent = df
  1636. old[0].style = e.style
  1637. }
  1638.  
  1639. s_mutations = ss
  1640. })
  1641. }
  1642.  
  1643. function loop() {
  1644. setTimeout(() => {
  1645. if (s_mutations) {
  1646. s_mutations = null // 初期値がtrue、変更もしない
  1647.  
  1648. if (bbr) bbreturn()
  1649. if (origi) origimg()
  1650. if (wtl) widetl()
  1651. if (ecmode) chgbgc()
  1652. if (hpp) hidepromo()
  1653. if (hwtf) hidewtf()
  1654. if (hdmd) hidedmd()
  1655. if (hgv) hidegv()
  1656. if (fmt) repldatetime()
  1657. if (fegm) {
  1658. fineegm()
  1659. fineegm_v_d()
  1660. fineegm_v_t()
  1661. fineegm_t()
  1662. time_r = Date.now()
  1663. }
  1664. } else if (fegm == 1 && Date.now() - time_r > 4000) {
  1665. fineegm()
  1666. fineegm_v_d()
  1667. fineegm_v_t()
  1668. fineegm_t()
  1669. time_r = Date.now()
  1670. }
  1671. loop()
  1672. }, intl)
  1673. }
  1674.  
  1675. bbr = BBR
  1676. origi = ORIGI
  1677. wtl = WTL
  1678. ecmode = ECMODE
  1679. hpp = HPP
  1680. hwtf = HWTF
  1681. hdmd = HDMD
  1682. hgv = HGV
  1683. fegm = FEGM
  1684. fvq = FVQ
  1685. fmt = FMT
  1686. intl = INTL
  1687.  
  1688. if (!NOGUI) initgui()
  1689. if (fvq) overrideXHROpen()
  1690. observer.observe(document, { childList: true, subtree: true })
  1691. loop()
  1692.  
  1693. })() /* END */