diff --git a/README-en.md b/README-en.md new file mode 100644 index 00000000..105281f8 --- /dev/null +++ b/README-en.md @@ -0,0 +1,61 @@ +![Logo](/assets/icon128.png) + +# Useful scripts - Chrome extension + +[Tiếng Việt](./README.md) + +Donate? Muốn hỗ trợ mình 1 ly cafe <3 [Donate here](https://github.com/HoangTran0410/HoangTran0410/blob/main/DONATE.md) + +## Change logs + +Verion: v1.1 v1.2 v1.3 **v1.4** (25/12/2022) + +[Change logs](/md/CHANGELOGS.md) + +## Overview + +an extension includes a lot of small extensions. + +- View list scripts [Here](./md/LIST_SCRIPTS_EN.md) + +## Install + +- Local install - [Watch on youtube](https://www.youtube.com/watch?v=2wFTbDK80g0) + +[![How to install](https://img.youtube.com/vi/2wFTbDK80g0/0.jpg)](https://www.youtube.com/watch?v=2wFTbDK80g0) + +## Screenshots + +![screenshot](./assets/screenshots/ScreensShot%202022-12-25%20at%2020.00.00.png) + +## Tutorial (Demo) + +[Watch on Youtube](https://www.youtube.com/watch?v=rVbr2dJvVMI&list=PLcZcXUjIE-TS13z4sf1mdzZoc9RHB2djl) + +[![Video Tutorial (Demo)](./assets/screenshots/Screenshot_3.png)](https://www.youtube.com/watch?v=rVbr2dJvVMI&list=PLcZcXUjIE-TS13z4sf1mdzZoc9RHB2djl) + +## Contribute + +Contribute [tại đây (vietnamese)](/md/CONTRIBUTE.md) + +## Learn + +- Extension Tips + + - [muaz-khan/Chrome-Extensions](https://github.com/muaz-khan/Chrome-Extensions) + + - [scripting docs](https://developer.chrome.com/docs/extensions/reference/scripting/) + + - [focus-mode example](https://github.com/GoogleChrome/chrome-extensions-samples/blob/main/tutorials/focus-mode/background.js) + + - [execute popup script in webpage](https://stackoverflow.com/questions/9515704/access-variables-and-functions-defined-in-page-context-using-a-content-script) + +- Bookmarks Tips + + - [Bookmarklets hay](https://bookmarklet.vercel.app/) + + - [Bookmarklets hay 2](https://www.thetechbasket.com/most-useful-bookmarklets/) + + - [Blog hongkiat - 100 bookmarklets](https://www.hongkiat.com/blog/100-useful-bookmarklets-for-better-productivity-ultimate-list/) + + - [50 useful bookmarklets](https://www.wordzz.com/50-most-useful-bookmarklets/) diff --git a/README.md b/README.md index 87c6e264..a4a7b588 100644 --- a/README.md +++ b/README.md @@ -2,32 +2,31 @@ # Useful scripts - Chrome extension +[English](./README-en.md) + Donate? Muốn hỗ trợ mình 1 ly cafe <3 [Donate here](https://github.com/HoangTran0410/HoangTran0410/blob/main/DONATE.md) -## Change logs - Lịch sử cập nhât +## Lịch sử cập nhật -Verion hiện tại: v1.1 v1.2 **v1.3** (27/11/2022) +Verion hiện tại: v1.1 v1.2 v1.3 **v1.4** (25/12/2022) -[Change logs / Lịch sử cập nhật](/md/CHANGELOGS.md) +[Lịch sử cập nhật](/md/CHANGELOGS.md) -## Overview - Giới thiệu +## Giới thiệu 1 extension chứa 1 đống extensions nhỏ. - Xem danh sách chức năng [Tại đây](./md/LIST_SCRIPTS_VI.md) -- View list scripts [Here](./md/LIST_SCRIPTS_EN.md) - -## Install - Cài đặt -- Chrome Webstore - Coming soon... +## Cài đặt -- Local install - [Watch on youtube](https://www.youtube.com/watch?v=2wFTbDK80g0) +- Cài đặt thủ công - [Xem hướng dẫn (youtube)](https://www.youtube.com/watch?v=2wFTbDK80g0) [![How to install](https://img.youtube.com/vi/2wFTbDK80g0/0.jpg)](https://www.youtube.com/watch?v=2wFTbDK80g0) -## Screenshots - Ảnh chụp màn hình +## Ảnh chụp màn hình -![screenshot](./assets/screenshots/Screen%20Shot%202022-11-27%20at%2022.05.00.png) +![screenshot](./assets/screenshots/ScreensShot%202022-12-25%20at%2020.00.00.png) ## Tutorial (Demo) @@ -35,11 +34,11 @@ Verion hiện tại: v1.1 v1.2 **v1.3** (27/11/2022) [![Video Tutorial (Demo)](./assets/screenshots/Screenshot_3.png)](https://www.youtube.com/watch?v=rVbr2dJvVMI&list=PLcZcXUjIE-TS13z4sf1mdzZoc9RHB2djl) -## Contribute - Đóng góp +## Contribute Contribute [tại đây (vietnamese)](/md/CONTRIBUTE.md) -## Learn - Kiến thức hay +## Kiến thức hay - Extension Tips diff --git a/_metadata/generated_indexed_rulesets/_ruleset1 b/_metadata/generated_indexed_rulesets/_ruleset1 index f6d3b65b..c9a3b227 100644 Binary files a/_metadata/generated_indexed_rulesets/_ruleset1 and b/_metadata/generated_indexed_rulesets/_ruleset1 differ diff --git a/assets/screenshots/ScreensShot 2022-12-25 at 20.00.00.png b/assets/screenshots/ScreensShot 2022-12-25 at 20.00.00.png new file mode 100644 index 00000000..442c9358 Binary files /dev/null and b/assets/screenshots/ScreensShot 2022-12-25 at 20.00.00.png differ diff --git a/empty_script.js b/empty_script.js index 51b23fef..5030d0cd 100644 --- a/empty_script.js +++ b/empty_script.js @@ -8,15 +8,26 @@ export default { en: "", vi: "", }, + infoLink: "", - // Chọn 1 trong 2 cách, xoá cách không dùng: - - // Cách 1: Mở link web trong tab mới, không cần dùng func - link: "", - - // Cách 2: Chạy script blackList: [], whiteList: [], - runInExtensionContext: false, - func: function () {}, + + // run (if enable autorun) in web page context + onDocumentStart: () => {}, + onDocumentEnd: () => {}, + onDocumentIdle: () => {}, + + // run onclick in extension-popup-page context + onClickExtension: () => {}, + + // run onclick in content-script context + onClickContentScript: () => {}, + + // run onclick in web page context + // cannot access to shared or any variable outside of webpage + onClick: () => {}, }; + +// functions/attributes that other scripts can import and use +export const shared = {}; diff --git a/manifest.json b/manifest.json index 8472550a..a623e20c 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Useful Scripts", "description": "Scripts that can make your life faster and better", - "version": "1.3", + "version": "1.4", "icons": { "16": "./assets/icon16.png", "32": "./assets/icon32.png", @@ -19,52 +19,34 @@ "storage", "cookies", "debugger", + "bookmarks", "declarativeNetRequest", "declarativeNetRequestFeedback", "declarativeNetRequestWithHostAccess" ], - "host_permissions": [ - "" - ], + "host_permissions": [""], "options_page": "./pages/options/options.html", "content_scripts": [ { - "matches": [ - "" - ], - "js": [ - "scripts/content-scripts/document_start.js" - ], + "matches": [""], + "js": ["scripts/content-scripts/document_start.js"], "run_at": "document_start" }, { - "matches": [ - "" - ], - "js": [ - "scripts/content-scripts/document_idle.js" - ], + "matches": [""], + "js": ["scripts/content-scripts/document_idle.js"], "run_at": "document_idle" }, { - "matches": [ - "" - ], - "js": [ - "scripts/content-scripts/document_end.js" - ], + "matches": [""], + "js": ["scripts/content-scripts/document_end.js"], "run_at": "document_end" } ], "web_accessible_resources": [ { - "resources": [ - "scripts/content-scripts/*.js", - "scripts/content-scripts/*.css" - ], - "matches": [ - "" - ] + "resources": ["scripts/*"], + "matches": [""] } ], "declarative_net_request": { @@ -76,4 +58,4 @@ } ] } -} \ No newline at end of file +} diff --git a/md/CHANGELOGS.md b/md/CHANGELOGS.md index 74ea2b44..af584754 100644 --- a/md/CHANGELOGS.md +++ b/md/CHANGELOGS.md @@ -1,5 +1,109 @@ ## Change logs +
+ v1.4 - 25/12/2022 + +- 57 script mới (Tổng 160 scripts): + + 1. anti_clickjacking + 2. changeAudioOutput + 3. detect_zeroWidthCharacters + 4. dino_hack + 5. docDownloader + 6. donotBlockMe + 7. douyin_downloadAllVideoUser + 8. envato_bypassPreview + 9. fastDoc + 10. fb_antiPhishing + 11. fb_downloadCommentVideo + 12. fb_downloadWatchingVideo + 13. fb_exportSaved + 14. fb_invisible_message + 15. fb_messengerCount + 16. fb_messengerCount_main + 17. fb_openAdsActivities + 18. fb_openMemories + 19. fb_openSaved + 20. fb_removeFbclid + 21. fb_revealDeletedMessages + 22. fb_storySaver + 23. fb_toggleNewFeed + 24. fb_whoIsTyping + 25. freesound_downloadAudio + 26. ggDrive_downloadAllVideosInFolder + 27. ggdrive_downloadVideo + 28. ggdrive_generateDirectLink + 29. github_goToAnyCommit + 30. google_downloadAllYourData + 31. google_mirror + 32. insta_injectDownloadBtn + 33. insta_storySaver + 34. pdfstuffs + 35. savevideo_me + 36. scribd_bypassPreview + 37. scribd_downloadDocuments + 38. search_hopamchuan + 39. search_musicTreding + 40. search_userscript + 41. send_shareFiles + 42. shopee_topVariation + 43. shopee_totalSpendMoney + 44. showTheVideos + 45. simpleAllowCopy + 46. smartPDF + 47. studocu_bypassPreview + 48. studocu_dl + 49. studocu_downs + 50. studyphim_unlimited + 51. tiki_totalSpendMoney + 52. tiktok_downloadUserVideos + 53. tiktok_downloadWatchingVideo + 54. tiktok_snaptikApp + 55. tiktok_snaptikVideo + 56. vimeo_downloader + 57. whatApp_storySaver + + +- Fix/Update các scripts: + + 1: douyin_downloadVideo + 2. fb_getAllUidFromFriendsPage + 3. fb_getAvatarFromUid + 4. fb_getTimelineAlbumId + 5. fb_getUid + 6. fb_getUidFromUrl + 7. fb_toggleLight + 8. fb_videoDownloader + 9. getAllEmailsInWeb + 10. insta_getAllImagesInNewFeed + 11. insta_getAllUserMedia + 12. scrollToVeryEnd + 13. tiktok_downloadVideo + 14. zingmp3_oldLayout + +- Xóa các scripts: + + 1: download_video + 2. download_video2 + 3. enableTextSelection + 4. fb_getAllVideoId + 5. fb_getTokenLocmai + 6. github_goToFirstCommit + 7. insta_reloaded + 8. paywallKiller + 9. youtube_popupPlayer + +- Fix/Update extension: + + - Thêm logic cho các **script tự động chạy** (onDocumentStart, onDocumentEnd, onDocumentIdle) + - Thêm **ô tìm kiếm** script nhanh hơn + - Loại bỏ tab Hot, tab New, Open extension in popup, runInExtensionContext + - Thêm **tab Autorun, tab Tất cả** + - Thêm **infoLink** cho các script (mở trang demo hoặc giới thiệu script) + - Thêm **UsefulScriptGlobalPageContext** và **content-script** (dùng cho các chức năng tự động chạy) + +
+
v1.3 - 27/11/2022 diff --git a/md/LIST_SCRIPTS_EN.md b/md/LIST_SCRIPTS_EN.md index f60362bc..593df72b 100644 --- a/md/LIST_SCRIPTS_EN.md +++ b/md/LIST_SCRIPTS_EN.md @@ -1,275 +1,411 @@ ### Search - 1. [What font](/scripts/whatFont.js): Check font used in webpage + 1. [Search Userscripts](/scripts/search_userscript.js): Search Userscripts on Usersript.zone - 2. [Find alternative web](/scripts/similarWeb.js): SimilarWeb - Access behind-the-scenes analytics for every site online + 2. [What font](/scripts/whatFont.js): Check font used in webpage - 3. [Find shared login](/scripts/search_sharedAccount.js): Get free shared account on internet + 3. [Find alternative web](/scripts/similarWeb.js): SimilarWeb - Access behind-the-scenes analytics for every site online - 4. [View website stack](/scripts/whatWebsiteStack.js): Technology that current website is using + 4. [Find shared login](/scripts/search_sharedAccount.js): Get free shared account on internet - 5. [Who.is](/scripts/whois.js): Want to find out who owns a domain? Click on this! + 5. [View website stack](/scripts/whatWebsiteStack.js): Technology that current website is using - 6. [See web meta info (SEO)](/scripts/viewWebMetaInfo.js): Instantly shows meta information about the current site in an on-page iFrame. + 6. [Who.is](/scripts/whois.js): Want to find out who owns a domain? Click on this! - 7. [Where to find papers/books/pdf/...](/scripts/search_paperWhere.js): Learn more and more + 7. [See web meta info (SEO)](/scripts/viewWebMetaInfo.js): Instantly shows meta information about the current site in an on-page iFrame. - 8. [Dowfor - Check web die](/scripts/checkWebDie.js): Check web die using downforeveryoneorjustme + 8. [Top global treding music?](/scripts/search_musicTreding.js): The web to find all kinds of music-related data. - 9. [DownDetector - View report web crash](/scripts/downDetector.js): View web bug reports + 9. [Where to find papers/books/pdf/...](/scripts/search_paperWhere.js): Learn more and more - 10. [Open wayback url](/scripts/openWaybackUrl.js): Open wayback url for website + 10. [Search guitar chords](/scripts/search_hopamchuan.js): Search guitar chords - 11. [Archive the current Page online](/scripts/archiveToday.js): Creates an archive of the current page on archive.today. + 11. [Dowfor - Check web die](/scripts/checkWebDie.js): Check web die using downforeveryoneorjustme + + 12. [DownDetector - View report web crash](/scripts/downDetector.js): View web bug reports + + 13. [Open wayback url](/scripts/openWaybackUrl.js): Open wayback url for website + + 14. [Archive the current Page online](/scripts/archiveToday.js): Creates an archive of the current page on archive.today. ### Download - 12. [Get audio/video (luanxt)](/scripts/getLinkLuanxt.js): Support zingmp3 nhaccuatui youtube. Using API from luanxt.com + 15. [Get audio/video (luanxt)](/scripts/getLinkLuanxt.js): Using API from luanxt.com. Download Zing MP3, Zing Video Clip, Zing TV, NhacCuaTui, YouTube, SoundCloud, Nhac.vn, ChiaSeNhac.vn, Facebook Video, Keeng Audio, Keeng Video, Keeng Phim - 13. [Download favicon from website](/scripts/getFavicon.js): Get favicon link of current website + 16. [Download favicon from website](/scripts/getFavicon.js): Get favicon link of current website --- Music --- - 14. [Show all audio in website](/scripts/download_audio.js): Will display all audio in website, easy to download/get link. + 17. [Show all audio in website](/scripts/showTheAudios.js): Will display all audio in website, easy to download/get link. - 15. [Nhaccuatui music/lyric downloader](/scripts/nhaccuatui_downloader.js): Download the song that be playing in Nhaccuatui + 18. [Nhaccuatui music/lyric downloader](/scripts/nhaccuatui_downloader.js): Download the song that be playing in Nhaccuatui - 16. [Zingmp3 music dowloader (API)](/scripts/zingmp3_downloadMusic.js): Download music on mp3.zing.vn and zingmp3.vn using zingmp3 API + 19. [Zingmp3 music dowloader (API)](/scripts/zingmp3_downloadMusic.js): Download music on mp3.zing.vn and zingmp3.vn using zingmp3 API - 17. [Zingmp3 old/new layout](/scripts/zingmp3_oldLayout.js): Toggle UI zingmp3 old/new + 20. [Zingmp3 old/new layout](/scripts/zingmp3_oldLayout.js): Toggle UI zingmp3 old/new + + 21. [Freesound - Download audio](/scripts/freesound_downloadAudio.js): Download audio on freesound.org --- Videos --- - 18. [Download video](/scripts/download_video.js): Can be used on almost any website + 22. [SaveVideo - Download video](/scripts/savevideo_me.js): Download videos from Dailymotion, Facebook, Vimeo, Twitter, Instagram / Reels, TikTok, Rumble.com, Streamable.com, Aol Video, Bilibili.com (哔哩哔哩), Bilibili.tv, Coub, DouYin (抖音), Flickr Videos, Focus.de, GMX.net / WEB.DE, ItemFix, Magisto, Reddit, Sapo.pt, T.me (Telegram), Tiscali.it Video, Tudou, Veoh, Vidmax.com, Vine (archive), WorldStarHipHop, Youku + + 23. [Vimeo - video downloader](/scripts/vimeo_downloader.js): Download video from vimeo - 19. [Download video 2 - use external website](/scripts/download_video2.js): Download video from youtube, reddit, twitter, vidmax, liveleak, dailymotion, metacafe, ... + 24. [Show all videos in website](/scripts/showTheVideos.js): Download video easier --- Photos --- - 20. [Show all images in new frame](/scripts/showTheImages.js): Will even show hidden images as well as pulling them out of a slider/rotator. + 25. [Download Whatapp Story](/scripts/whatApp_storySaver.js): Download whatapp story that you are watching + + 26. [Show all images in new frame](/scripts/showTheImages.js): Will even show hidden images as well as pulling them out of a slider/rotator. + + 27. [Image Downloader](/scripts/download_image.js): Download all images in viewport + +--- Document --- + + 28. [DocDownloader - Download document](/scripts/docDownloader.js): Download document on Scribd, Issuu, Slideshare, Academia + + 29. [Scribd - Download documents](/scripts/scribd_downloadDocuments.js): Download document on Scribd for free - 21. [Image Downloader](/scripts/download_image.js): Download all images in viewport + 30. [Studocu - Download documents (Dlstudocu)](/scripts/studocu_dl.js): + + 31. [Studocu - Download documents (Downstudocu)](/scripts/studocu_downs.js): Download document pdf on Studocu.com for free ### Google - 22. [Check total indexed pages](/scripts/search_totalIndexedPages.js): Know how many pages of current website is indexed in Google +--- Download --- + + 32. [Google drive - generate direct link](/scripts/ggdrive_generateDirectLink.js): Generate a direct download link to files stored in Google Drive. A direct link will immediately start downloading the file. + + 33. [GG Drive - Download video](/scripts/ggdrive_downloadVideo.js): Download google drive video that dont have download button + + 34. [Google - Download all your data](/scripts/google_downloadAllYourData.js): Download all your data on Google + +--- Bulk Download --- + + 35. [GGDrive - Download all videos in folder](/scripts/ggDrive_downloadAllVideosInFolder.js): Download all videos in folder of google drive (bypass download permission) + +--- More --- + + 36. [Check total indexed pages](/scripts/search_totalIndexedPages.js): Know how many pages of current website is indexed in Google - 23. [Google site search](/scripts/search_googleSite.js): Search in google while limiting the search result to currently opened webpage. + 37. [Google site search](/scripts/search_googleSite.js): Search in google while limiting the search result to currently opened webpage. - 24. [Google shortcuts](/scripts/googleShortcuts.js): Create new google doc/sheet/slide/form/site/keep/calendar + 38. [Google shortcuts](/scripts/googleShortcuts.js): Create new google doc/sheet/slide/form/site/keep/calendar - 25. [View Google cache of website](/scripts/googleCache.js): View blocked website + 39. [View Google cache of website](/scripts/googleCache.js): View blocked website + + 40. [Google mirror - I'm elgooG](/scripts/google_mirror.js): Google games. We create, restore, and discover interactive Google Easter Eggs. Just click and play them online for free. ### Facebook +--- Hot --- + + 41. [Facebook - Reveal deleted messages](/scripts/fb_revealDeletedMessages.js): View deleted messages (since function was turned on) on facebook messenger. + + 42. [Invisible facebook message](/scripts/fb_invisible_message.js): Add the > character before writing a message to send hidden messages. + +Your friends needs to install this extension and enable it to view hidden messages. + + 43. [Facebook Story - Add more emoji reactions](/scripts/fb_moreReactionStory.js): React story Facebook with more emojis + + 44. [Facebook - Who is typing to you?](/scripts/fb_whoIsTyping.js): Notify when someone is typing chat to you. + + 45. [Facebook - Messenger count](/scripts/fb_messengerCount.js): Counts the number of messages sent from your Facebook Messenger account. + --- UI --- - 26. [Toggle light fb newfeed](/scripts/fb_toggleLight.js): Hide Navigator bar and complementary bar + 46. [Turn off light fb newfeed](/scripts/fb_toggleLight.js): Hide Navigator bar and complementary bar in facebook ---- Access Token --- + 47. [Hide Newfeed facebook](/scripts/fb_toggleNewFeed.js): Hide Newfeed facebook for better focus to work - 27. [Check fb access token](/scripts/fb_checkToken.js): Check type, permissions, created date, expired date, ... +--- Download --- - 28. [Get fb token from cookie (ffb.vn)](/scripts/fb_getTokenFfb.js): Post your fb cookie to ffb.vn API + 48. [Download watching fb video](/scripts/fb_downloadWatchingVideo.js): Download any facebook video that you are watching (watch/story/comment/reel/chat) - 29. [Get fb token EAAG (business_locations)](/scripts/fb_getTokenBussinessLocation.js): Get fb token EAAG from business.facebook.com + 49. [Download watching fb Story](/scripts/fb_storySaver.js): Download facebook story that you are watching - 30. [Get fb token EAAc (studio)](/scripts/fb_getTokenBusinessStudio.js): Get facebook access token from business.facebook.com + 50. [Download facebook comment video](/scripts/fb_downloadCommentVideo.js): Download video in facebook comment that you are watching - 31. [Get fb token EAAB (campaigns)](/scripts/fb_getTokenCampaigns.js): Get fb token EAAG from www.facebook.com campaigns + 51. [Download fb video/reel/watch from url](/scripts/fb_videoDownloader.js): Download facebook video/reel/watch - 32. [Get fb token EAAB (instagram)](/scripts/fb_getTokenFacebook.js): Get facebook access token from www.facebook.com + 52. [Get avatar from fb user id](/scripts/fb_getAvatarFromUid.js): Get avatar from list facebook user ids - 33. [Get fb Token (m.facebook.com)](/scripts/fb_getTokenMFacebook.js): Get facebook access token from m.facebook.com +--- Bulk Download --- - 34. [Get fb token (locmai)](/scripts/fb_getTokenLocmai.js): + 53. [Download album facebook](/scripts/fb_downloadAlbumMedia.js): Download photo/video links from facebook album ---- Get ID --- + 54. [Export saved facebook items](/scripts/fb_exportSaved.js): Export all your saved items on facebook to json file - 35. [Get fb User ID](/scripts/fb_getUid.js): Get id of user in current website +--- Security --- - 36. [Get fb Page ID](/scripts/fb_getPageId.js): Get id of page in current website + 55. [Auto remove Fbclid from link](/scripts/fb_removeFbclid.js): Auto remove Facebook click identifier (Fbclid) parameter from links - 37. [Get fb Group ID](/scripts/fb_getGroupId.js): Get id of group in current website + 56. [Anti phising](/scripts/fb_antiPhishing.js): Prevent phising attack - 38. [Get fb Album ID](/scripts/fb_getAlbumId.js): Get id of album in current website + 57. [Anti clickjacking](/scripts/anti_clickjacking.js): Anti clickjacking attack - 39. [Get id of fb timeline album](/scripts/fb_getTimelineAlbumId.js): Get timeline album id of page/user in current website +--- Access Token --- - 40. [Get all fb Video ID](/scripts/fb_getAllVideoId.js): Get id of all video in current website + 58. [Check fb access token](/scripts/fb_checkToken.js): Check type, permissions, created date, expired date, ... of faceboook access token - 41. [Get all fb Album ID](/scripts/fb_getAllAlbumId.js): Get all id of album in current website + 59. [Get fb token from cookie (ffb.vn)](/scripts/fb_getTokenFfb.js): Post your facebook cookie to ffb.vn API - 42. [Get fb User ID from url](/scripts/fb_getUidFromUrl.js): Get id of user from entered url + 60. [Get fb token EAAG (business_locations)](/scripts/fb_getTokenBussinessLocation.js): Get facebook token EAAG from business.facebook.com - 43. [Get all fb User ID from search page](/scripts/fb_getAllUidFromFbSearch.js): Get id of all user from fb search page + 61. [Get fb token EAAc (studio)](/scripts/fb_getTokenBusinessStudio.js): Get facebook access token from business.facebook.com - 44. [Get all fb User ID from Friends page](/scripts/fb_getAllUidFromFriendsPage.js): Get id of all user from friends page + 62. [Get fb token EAAB (campaigns)](/scripts/fb_getTokenCampaigns.js): Get facebook token EAAG from www.facebook.com campaigns - 45. [Get all fb User ID from group](/scripts/fb_getAllUidOfGroupMembers.js): Get id of all user from group members + 63. [Get fb token EAAB (instagram)](/scripts/fb_getTokenFacebook.js): Get facebook access token from www.facebook.com ---- Download --- + 64. [Get fb Token (m.facebook.com)](/scripts/fb_getTokenMFacebook.js): Get facebook access token from m.facebook.com + +--- Get ID --- + + 65. [Get fb User ID](/scripts/fb_getUid.js): Get id of user in facebook website + + 66. [Get fb Page ID](/scripts/fb_getPageId.js): Get id of page in facebook website + + 67. [Get fb Group ID](/scripts/fb_getGroupId.js): Get id of group in facebook website + + 68. [Get fb Album ID](/scripts/fb_getAlbumId.js): Get id of facebook album in current website - 46. [Facebook - Download video/reel/watch](/scripts/fb_videoDownloader.js): Download facebook video/reel/watch + 69. [Get all fb Album ID](/scripts/fb_getAllAlbumId.js): Get all id of album in facebook website - 47. [Get avatar from fb user id](/scripts/fb_getAvatarFromUid.js): Get avatar from list user ids + 70. [Get fb User ID from url](/scripts/fb_getUidFromUrl.js): Get id of facebook user from entered url - 48. [Download fb album media links](/scripts/fb_downloadAlbumMedia.js): Download photo/video links from album + 71. [Get all fb User ID from search page](/scripts/fb_getAllUidFromFbSearch.js): Get id of all user from facebook search page + + 72. [Get all fb User ID from Friends page](/scripts/fb_getAllUidFromFriendsPage.js): Get id of all user from friends facebook page + + 73. [Get all fb User ID from group](/scripts/fb_getAllUidOfGroupMembers.js): Get id of all user from group members facebook + +--- Shortcut --- + + 74. [Open my facebook saved](/scripts/fb_openSaved.js): View saved contents on Facebook + + 75. [View your memories on facebook](/scripts/fb_openMemories.js): View your memories on facebook + + 76. [View your ads activities](/scripts/fb_openAdsActivities.js): View ads you have seen on facebook ### Instagram - 49. [Get token insta](/scripts/insta_getToken.js): Get instagram access token + 77. [Add Instagram download button](/scripts/insta_injectDownloadBtn.js): Add a download button to all photo/video/post/story on Instagram + + 78. [Get token insta](/scripts/insta_getToken.js): Get instagram access token - 50. [Get insta user info (uid, avatar, ...)](/scripts/insta_getUserInfo.js): Get uid, avatar, name, ... + 79. [Get insta user info (uid, avatar, ...)](/scripts/insta_getUserInfo.js): Get instagram uid, avatar, name, ... --- Download --- - 51. [Instantgram - Download full-size image](/scripts/instantgram.js): Download full-size instagram image in 1 click + 80. [Download watching insta photo/story](/scripts/instantgram.js): Download full-size instagram image/story in 1 click - 52. [Get all media of insta user](/scripts/insta_getAllUserMedia.js): Get all media of instagram user + 81. [Download watching Instagram Story](/scripts/insta_storySaver.js): Download instagram story that you are watching - 53. [Get all images in insta newfeed](/scripts/insta_getAllImagesInNewFeed.js): Get all images in newfeed +--- Bulk Download --- - 54. [Get all images in insta user profile](/scripts/insta_getAllImagesInUserProfile.js): Get all images in user profile + 82. [Get all media of insta user](/scripts/insta_getAllUserMedia.js): Get all media of instagram user -### Youtube + 83. [Get all images in insta newfeed](/scripts/insta_getAllImagesInNewFeed.js): Get all images in newfeed instagram - 55. [Download youtube video (bypass 18+)](/scripts/youtube_downloadVideo.js): Bypass age restriction, without login + 84. [Get all images in insta user profile](/scripts/insta_getAllImagesInUserProfile.js): Get all images in instagram user profile + +### Youtube - 56. [Picture in Picture](/scripts/pictureInPicture.js): Watch videos in a floating window + 85. [Download youtube video](/scripts/youtube_downloadVideo.js): Bypass age restriction, without login - 57. [Toggle light youtube](/scripts/youtube_toggleLight.js): Toggle light on/off to focus to youtube video + 86. [Picture in Picture](/scripts/pictureInPicture.js): Watch videos in a floating window - 58. [View youtube video dislikes](/scripts/youtube_viewDislikes.js): Know how many dislike does youtube video have + 87. [Toggle light youtube](/scripts/youtube_toggleLight.js): Toggle light on/off to focus to youtube video - 59. [Youtube nonstop](/scripts/youtube_nonstop.js): Kiss the annoying "Video paused. Continue watching?" confirmation goodbye! + 88. [View youtube video dislikes](/scripts/youtube_viewDislikes.js): Know how many dislike does youtube video have - 60. [Youtube popup player](/scripts/youtube_popupPlayer.js): Open current youtube video in new popup player + 89. [Youtube nonstop](/scripts/youtube_nonstop.js): Kiss the annoying "Video paused. Continue watching?" confirmation goodbye! ### Tiktok - 61. [Tiktok - Download video (Snaptik)](/scripts/tiktok_downloadVideo.js): Download tiktok video using Snaptik API +--- Tiktok --- - 62. [Douyin - Download videos](/scripts/douyin_downloadVideo.js): Show all downloadable videos in current douyin webpage + 90. [Tiktok - Download watching video](/scripts/tiktok_downloadWatchingVideo.js): Download tiktok video you are watching (no/have watermark) + + 91. [Tiktok - Download video (API)](/scripts/tiktok_downloadVideo.js): Download tiktok video from url (no/have watermark) + + 92. [Tiktok - Download video (Snaptik)](/scripts/tiktok_snaptikApp.js): Download tiktok video using Snaptik API + + 93. [Tiktok - Download video (snaptikvideo)](/scripts/tiktok_snaptikVideo.js): Download tiktok video (mp4/mp3/no watermark) using snaptikvideo API + +--- Douyin --- + + 94. [Douyin - Download watching video](/scripts/douyin_downloadWachingVideo.js): Show all downloadable videos in current douyin webpage + + 95. [Douyin - Download video (API)](/scripts/douyin_downloadVideo.js): Download video from douyin using API + +--- Bulk Download --- + + 96. [Tiktok - Download all user videos](/scripts/tiktok_downloadUserVideos.js): Download all videos in tiktok user profile. + + 97. [Douyin - Download all user videos](/scripts/douyin_downloadAllVideoUser.js): Download all videos in douyin user profile. --- Doutu.be --- - 63. [Enable download all video](/scripts/doutube_enableDownloadVideo.js): Enable download button for all video + 98. [Enable download all video](/scripts/doutube_enableDownloadVideo.js): Enable download button for all video + + 99. [Download video doutu.be](/scripts/doutube_downloadWatchingVideo.js): Download video doutu.be that you are watching - 64. [Download video doutu.be](/scripts/doutube_downloadWatchingVideo.js): Download video doutu.be that you are watching + 100. [Download doutu.be story](/scripts/doutube_downloadWatchingStory.js): Download story that you are watching - 65. [Download doutu.be story](/scripts/doutube_downloadWatchingStory.js): Download story that you are watching + 101. [Get all video from user doutu.be profile](/scripts/doutube_getAllVideoInUserProfile.js): Get all video in doutu.be user profile - 66. [Get all video from user doutu.be profile](/scripts/doutube_getAllVideoInUserProfile.js): Get all video in doutu.be user profile +### Shopping + + 102. [Shopee - Top variation](/scripts/shopee_topVariation.js): See how many times each product variant was purchased + + 103. [Shopee - Total spend money?](/scripts/shopee_totalSpendMoney.js): See how much money you have spend on Shopee + + 104. [Tiki - Total spend money?](/scripts/tiki_totalSpendMoney.js): See how much money you have spend on Tiki ### Github - 67. [Go to first commit](/scripts/github_goToFirstCommit.js): Go to first commit of github repo + 105. [Go to any commit](/scripts/github_goToAnyCommit.js): Go to any commit of github repo. Included first commit. - 68. [Open repo in github.dev](/scripts/githubdev.js): Open current repo in github.dev + 106. [Open repo in github.dev](/scripts/githubdev.js): Open current repo in github.dev - 69. [Open repo in github1s.com](/scripts/github1s.js): Open current repo in github1s.com + 107. [Open repo in github1s.com](/scripts/github1s.js): Open current repo in github1s.com ### Automation - 70. [Text to QR Code](/scripts/textToQRCode.js): Convert text to QR Code + 108. [Shorten URL](/scripts/shortenURL.js): Support tinyurl, tnyim, cuttly, bitly, j2team, ... + + 109. [Unshorten link](/scripts/unshorten.js): Get origin URL of shortened url + + 110. [Audio output switcher](/scripts/changeAudioOutput.js): Pick a default audio output device, customizable for each browser tab. + +--- QRCode --- + + 111. [Text to QR Code](/scripts/textToQRCode.js): Convert text to QR Code + + 112. [URL to QR Code](/scripts/webToQRCode.js): Convert current website URL to QR Code + +--- Auto --- + + 113. [Password generator](/scripts/passwordGenerator.js): You only have to remember 1 password - 71. [URL to QR Code](/scripts/webToQRCode.js): Convert current website URL to QR Code + 114. [Extract all Emails from website](/scripts/getAllEmailsInWeb.js): Extracts all emails and displays them in a popup iFrame (enable popups!) - 72. [Extract all Emails from website](/scripts/getAllEmailsInWeb.js): Extracts all emails and displays them in a popup iFrame (enable popups!) + 115. [Screenshot full webpage](/scripts/screenshotFullPage.js): Taking a screenshot of an entire webpage - 73. [Screenshot full webpage](/scripts/screenshotFullPage.js): Taking a screenshot of an entire webpage + 116. [JSON formatter](/scripts/jsonformatter.js): Open web tool for beautify JSON in new tab - 74. [Web to PDF](/scripts/webToPDF.js): Convert current website to PDF + 117. [Performance Analyzer](/scripts/performanceAnalyzer.js): Check performance metrics of website - 75. [Transfer.sh - Share file faster](/scripts/transfer_sh.js): Upload file and get URL to share + 118. [Scroll to very end](/scripts/scrollToVeryEnd.js): Scoll to end, then wait for load data, then scroll again... Mouse click to cancel - 76. [JSON formatter](/scripts/jsonformatter.js): Open web tool for beautify JSON in new tab + 119. [Enable/Disable Hack T-Rex Dino Game](/scripts/dino_hack.js): A bot that plays the Google Chrome T-Rex game for you - 77. [Performance Analyzer](/scripts/performanceAnalyzer.js): Check performance metrics of website +--- PDF --- - 78. [Scroll to very end](/scripts/scrollToVeryEnd.js): Scoll to end, then wait for load data, then scroll again... Mouse click to cancel + 120. [Web to PDF](/scripts/webToPDF.js): Convert current website to PDF -### Password + 121. [FastDoc - Convert PDF/Photo to Word/Excel](/scripts/fastDoc.js): Convert Photos & PDF to Excel, Word, Searchable PDF for free - 79. [Password generator](/scripts/passwordGenerator.js): You only have to remember 1 password + 122. [SmartPDF - Tools for PDF](/scripts/smartPDF.js): Compress PDF, PDF Converter, PPT to PDF, PDF to PPT, JPG to PDF, PDF to JPG, Excel to PDF, PDF to Excel, Edit PDF, PDF Reader, Number Pages, Delete PDF Pages, Rotate PDF, Word to PDF, PDF to Word, Merge PDF, Split PDF, eSign PDF, Unlock PDF, Protect PDF, PDF Scanner - 80. [Find shared login](/scripts/search_sharedAccount.js): Get free shared account on internet + 123. [PDF Stuffs - Tools for PDF](/scripts/pdfstuffs.js): Free PDF converter online service: Merge PDF, Split PDF, Compress PDF, PDF to Word, PDF to PPT, PDF to Excel, Word to PDF, Excel to PDF, PPT to PDF, PDF to JPG, JPG to PDF, PDF to HTML, HTML to PDF, Unlock PDF, Protect PDF, Rotate PDF, Crop PDF, Delete pages, Add page numbers, Watermark PDF - 81. [Password field toggle](/scripts/passwordFieldToggle.js): Toggle password field to text field to view hidden password +--- Share --- + + 124. [Send - Share file faster](/scripts/send_shareFiles.js): Open send.zcyph.cc - share large file up to 20Gb + + 125. [Transfer.sh - Share file faster](/scripts/transfer_sh.js): Upload file and get URL to share ### Unlock - 82. [Shorten URL](/scripts/shortenURL.js): Support tinyurl, tnyim, cuttly, bitly, j2team, ... +--- Unlock web --- + + 126. [View blocked websites](/scripts/donotBlockMe.js): View website that being blocked. (eg. Medium) + + 127. [Envato - preview bypass](/scripts/envato_bypassPreview.js): Remove preview iframe on Envato sites (Themeforest, Codecanyon) + + 128. [Scribd - bypass preview](/scripts/scribd_bypassPreview.js): View VIP document on Scribd.com, bypass preview popup / reveal blurred content. + + 129. [Studyphim - Watch free movies](/scripts/studyphim_unlimited.js): Watch movies on Studyphim for free without login + + 130. [Studocu - Bypass preview](/scripts/studocu_bypassPreview.js): View VIP document on Studocu.com, bypass preview popup / reveal blurred content. + +--- Unlock function --- + + 131. [Detect Zero-Width Characters](/scripts/detect_zeroWidthCharacters.js): Detects zero-width characters, highlights the characters and containing DOM element. - 83. [Unshorten link](/scripts/unshorten.js): Get origin URL of shortened url +Click for more detail. - 84. [View browser information](/scripts/viewBrowserInfo.js): OS name, browser name, version, userAgent, ... + 132. [Enable/Disable allow copy](/scripts/simpleAllowCopy.js): Allow Copy on every websites - 85. [Show hidden fields](/scripts/showHiddenFields.js): Reveals hidden fields on a webpage. Find things like tokens, etc + 133. [Re-Enable context menu (right click)](/scripts/reEnableContextMenu.js): Enable context menu for website - 86. [View cookies](/scripts/viewCookies.js): View cookies saved in current website + 134. [Show hidden fields](/scripts/showHiddenFields.js): Reveals hidden fields on a webpage. Find things like tokens, etc - 87. [Remove cookies](/scripts/removeCookies.js): Remove cookies from current website + 135. [Password field toggle](/scripts/passwordFieldToggle.js): Toggle password field to text field to view hidden password - 88. [Re-Enable text selection](/scripts/enableTextSelection.js): Enable text selection for website + 136. [View cookies](/scripts/viewCookies.js): View cookies saved in current website - 89. [Re-Enable context menu (right click)](/scripts/reEnableContextMenu.js): Enable context menu for website + 137. [Remove cookies](/scripts/removeCookies.js): Remove cookies from current website - 90. [Inject script to website](/scripts/injectScriptToWebsite.js): + 138. [View browser information](/scripts/viewBrowserInfo.js): OS name, browser name, version, userAgent, ... - 91. [Bypass Paywalls](/scripts/paywallKiller.js): + 139. [Inject script to website](/scripts/injectScriptToWebsite.js): ### Web UI - 92. [Darkmode for pdf](/scripts/darkModePDF.js): Enable/Disable darkmode for PDF + 140. [Darkmode for pdf](/scripts/darkModePDF.js): Enable/Disable darkmode for PDF - 93. [Toggle edit page](/scripts/toggleEditPage.js): Edit all text in website + 141. [Toggle edit page](/scripts/toggleEditPage.js): Edit all text in website - 94. [Scroll by dragging](/scripts/scrollByDrag.js): Use this will turn the cursor into a scroller and use it again will return it back to normal. + 142. [Scroll by dragging](/scripts/scrollByDrag.js): Use this will turn the cursor into a scroller and use it again will return it back to normal. - 95. [Run Stat.js](/scripts/runStatJs.js): Run stat.js in current website + 143. [Run Stat.js](/scripts/runStatJs.js): Run stat.js in current website --- View --- - 96. [Show all javascript events](/scripts/visualEvent.js): Visual Event - Visually show Javascript events on a page + 144. [Show all javascript events](/scripts/visualEvent.js): Visual Event - Visually show Javascript events on a page - 97. [View all images in web](/scripts/listAllImagesInWeb.js): View all images in web + 145. [View all images in web](/scripts/listAllImagesInWeb.js): View all images in web - 98. [View all links](/scripts/viewAllLinks.js): Show all links and anchor text of current page. + 146. [View all links](/scripts/viewAllLinks.js): Show all links and anchor text of current page. - 99. [View scripts used](/scripts/viewScriptsUsed.js): View all scripts used in current website + 147. [View scripts used](/scripts/viewScriptsUsed.js): View all scripts used in current website - 100. [View stylesheet used](/scripts/viewStylesUsed.js): View all stylesheet used in current website + 148. [View stylesheet used](/scripts/viewStylesUsed.js): View all stylesheet used in current website - 101. [CSS selector viewer](/scripts/cssSelectorViewer.js): Inspect css at specific element on the web + 149. [CSS selector viewer](/scripts/cssSelectorViewer.js): Inspect css at specific element on the web - 102. [View source code of selected area](/scripts/viewPartialSource.js): Just select the area and use this bookmarklet + 150. [View source code of selected area](/scripts/viewPartialSource.js): Just select the area and use this bookmarklet --- Remove --- - 103. [Remove all colors in web](/scripts/removeColours.js): Remove all colours in the web + 151. [Remove all colors in web](/scripts/removeColours.js): Remove all colours in the web - 104. [Remove stylesheet](/scripts/removeStylesheet.js): Remove all stylesheet from website + 152. [Remove stylesheet](/scripts/removeStylesheet.js): Remove all stylesheet from website - 105. [Remove images](/scripts/removeImages.js): Remove all images from website + 153. [Remove images](/scripts/removeImages.js): Remove all images from website - 106. [Remove bloat (iframe, embed)](/scripts/removeBloat.js): Remove iframe, embeds, applets from website + 154. [Remove bloat (iframe, embed)](/scripts/removeBloat.js): Remove iframe, embeds, applets from website --- Table --- - 107. [Add sort to table](/scripts/table_addSortTable.js): Add sort functions to table + 155. [Add sort to table](/scripts/table_addSortTable.js): Add sort functions to table - 108. [Add number columns](/scripts/table_addNumberColumn.js): Add number columns to table + 156. [Add number columns](/scripts/table_addNumberColumn.js): Add number columns to table - 109. [Swap rows and columns](/scripts/table_swapRowAndColumn.js): Swap rows and columns (transpose) + 157. [Swap rows and columns](/scripts/table_swapRowAndColumn.js): Swap rows and columns (transpose) --- More --- - 110. [Highlight internal/external link](/scripts/internalOrExternalLink.js): +Red = Internal_link + 158. [Highlight internal/external link](/scripts/internalOrExternalLink.js): +Red = Internal_link +Orange = Currently_opened_link +Blue = External_link - 111. [Get window size](/scripts/getWindowSize.js): Alerts the width and height in pixels of the inner window. + 159. [Get window size](/scripts/getWindowSize.js): Alerts the width and height in pixels of the inner window. - 112. [Let it snow](/scripts/letItSnow.js): Make website like it snowing \ No newline at end of file + 160. [Let it snow](/scripts/letItSnow.js): Make website like it snowing \ No newline at end of file diff --git a/md/LIST_SCRIPTS_VI.md b/md/LIST_SCRIPTS_VI.md index a03a354d..a77da3a0 100644 --- a/md/LIST_SCRIPTS_VI.md +++ b/md/LIST_SCRIPTS_VI.md @@ -1,275 +1,412 @@ ### Tìm kiếm - 1. [Kiểm tra font chữ](/scripts/whatFont.js): Kiểm tra xem từng phần tử trong web dùng font chữ gì + 1. [Tìm Userscripts](/scripts/search_userscript.js): Tìm Userscripts trên Usersript.zone - 2. [Tìm trang web tương tự](/scripts/similarWeb.js): SimilarWeb - Phân tích chi tiết cho mọi trang web trực tuyến + 2. [Kiểm tra font chữ](/scripts/whatFont.js): Kiểm tra xem từng phần tử trong web dùng font chữ gì - 3. [Tìm tài khoản miễn phí](/scripts/search_sharedAccount.js): Tìm tài khoản được chia sẻ trên mạng cho trang web hiện tại + 3. [Tìm trang web tương tự](/scripts/similarWeb.js): SimilarWeb - Phân tích chi tiết cho mọi trang web trực tuyến - 4. [Web dùng công nghệ gì?](/scripts/whatWebsiteStack.js): Xem những công nghệ/thư viện trang web đang dùng + 4. [Tìm tài khoản miễn phí](/scripts/search_sharedAccount.js): Tìm tài khoản được chia sẻ trên mạng cho trang web hiện tại - 5. [Who.is](/scripts/whois.js): Muốn biết ai đang giữ domain này? Click ngay! + 5. [Web dùng công nghệ gì?](/scripts/whatWebsiteStack.js): Xem những công nghệ/thư viện trang web đang dùng - 6. [Xem thông tin meta của web (SEO)](/scripts/viewWebMetaInfo.js): Xem thông tin meta của website trực tiếp trong trang web + 6. [Who.is](/scripts/whois.js): Muốn biết ai đang giữ domain này? Click ngay! - 7. [Tìm bài báo/sách/pdf/...ở đâu?](/scripts/search_paperWhere.js): Học, học nữa, học mãi + 7. [Xem thông tin meta của web (SEO)](/scripts/viewWebMetaInfo.js): Xem thông tin meta của website trực tiếp trong trang web - 8. [Dowfor - Kiểm tra web die](/scripts/checkWebDie.js): Dùng bên thứ 3 để kiểm tra xem website có bị die thật không + 8. [Bài nhạc top treding toàn cầu?](/scripts/search_musicTreding.js): Trang web thống kê top trending âm nhạc toàn cầu. - 9. [DownDetector - Thống kê sự cố web](/scripts/downDetector.js): Xem thống kê các báo cáo về sự cố web + 9. [Tìm bài báo/sách/pdf/...ở đâu?](/scripts/search_paperWhere.js): Học, học nữa, học mãi - 10. [Xem wayback url của website](/scripts/openWaybackUrl.js): Giúp xem nội dung website trong quá khứ + 10. [Tìm hợp âm guitar](/scripts/search_hopamchuan.js): Tra cứu hợp âm chuẩn dành cho người chơi guitar - 11. [Lưu trữ online trang hiện tại](/scripts/archiveToday.js): Lưu trang web hiện tại lên archive.today + 11. [Dowfor - Kiểm tra web die](/scripts/checkWebDie.js): Dùng bên thứ 3 để kiểm tra xem website có bị die thật không + + 12. [DownDetector - Thống kê sự cố web](/scripts/downDetector.js): Xem thống kê các báo cáo về sự cố web + + 13. [Xem wayback url của website](/scripts/openWaybackUrl.js): Giúp xem nội dung website trong quá khứ + + 14. [Lưu trữ online trang hiện tại](/scripts/archiveToday.js): Lưu trang web hiện tại lên archive.today ### Tải xuống - 12. [Tải nhạc/video (luanxt)](/scripts/getLinkLuanxt.js): Hỗ trợ zingmp3 nhaccuatui youtube. Sử dụng API của luanxt.com + 15. [Tải nhạc/video (luanxt)](/scripts/getLinkLuanxt.js): Sử dụng API của luanxt.com. Tải Zing MP3, Zing Video Clip, Zing TV, NhacCuaTui, YouTube, SoundCloud, Nhac.vn, ChiaSeNhac.vn, Facebook Video, Keeng Audio, Keeng Video, Keeng Phim - 13. [Tải favicon của trang web](/scripts/getFavicon.js): Lấy link favicon của trang web + 16. [Tải favicon của trang web](/scripts/getFavicon.js): Lấy link favicon của trang web --- Nhạc --- - 14. [Hiển thị mọi audio trong trang web](/scripts/download_audio.js): Hiển thị tất cả tag audio/âm thanh trong trang web, giúp dễ dàng tải xuống/lấy link. + 17. [Hiển thị mọi audio trong trang web](/scripts/showTheAudios.js): Hiển thị tất cả tag audio/âm thanh trong trang web, giúp dễ dàng tải xuống/lấy link. - 15. [Nhaccuatui tải nhạc/lời](/scripts/nhaccuatui_downloader.js): Tải bài nhạc / lời bài hát đang nghe trên Nhaccuatui + 18. [Nhaccuatui tải nhạc/lời](/scripts/nhaccuatui_downloader.js): Tải bài nhạc / lời bài hát đang nghe trên Nhaccuatui - 16. [Zingmp3 tải nhạc (API)](/scripts/zingmp3_downloadMusic.js): Tải nhạc trên mp3.zing.vn và zingmp3.vn thông qua zingmp3 API + 19. [Zingmp3 tải nhạc (API)](/scripts/zingmp3_downloadMusic.js): Tải nhạc trên mp3.zing.vn và zingmp3.vn thông qua zingmp3 API - 17. [Zingmp3 giao diện cũ/mới](/scripts/zingmp3_oldLayout.js): Bật/tắt giao diện zingmp3 mới/cũ + 20. [Zingmp3 giao diện cũ/mới](/scripts/zingmp3_oldLayout.js): Bật/tắt giao diện zingmp3 mới/cũ + + 21. [Freesound - Tải âm thanh](/scripts/freesound_downloadAudio.js): Tải âm thanh trên freesound.org --- Video --- - 18. [Tải video](/scripts/download_video.js): Dùng được cho gần như tất cả trang web + 22. [SaveVideo - Tải video](/scripts/savevideo_me.js): Tải videos từ Dailymotion, Facebook, Vimeo, Twitter, Instagram / Reels, TikTok, Rumble.com, Streamable.com, Aol Video, Bilibili.com (哔哩哔哩), Bilibili.tv, Coub, DouYin (抖音), Flickr Videos, Focus.de, GMX.net / WEB.DE, ItemFix, Magisto, Reddit, Sapo.pt, T.me (Telegram), Tiscali.it Video, Tudou, Veoh, Vidmax.com, Vine (archive), WorldStarHipHop, Youku + + 23. [Vimeo - tải video](/scripts/vimeo_downloader.js): Tải video trên vimeo - 19. [Tải video 2 - dùng web ngoài](/scripts/download_video2.js): Tải video từ youtube, reddit, twitter, vidmax, liveleak, dailymotion, metacafe, ... + 24. [Hiển thị mọi video có trong web](/scripts/showTheVideos.js): Tải video dễ dàng hơn --- Ảnh --- - 20. [Hiển thị mọi hình ảnh trong khung mới](/scripts/showTheImages.js): Sẽ thấy đươc ảnh bị ẩn, dễ dàng chuột phải để tải về + 25. [Tải Whatapp Story](/scripts/whatApp_storySaver.js): Tải whatapp story bạn đang xem + + 26. [Hiển thị mọi hình ảnh trong khung mới](/scripts/showTheImages.js): Sẽ thấy đươc ảnh bị ẩn, dễ dàng chuột phải để tải về + + 27. [Image Downloader - Tải hình ảnh](/scripts/download_image.js): Tải tất cả hình ảnh đang thấy trong trang web + +--- Tài liệu --- + + 28. [DocDownloader - Tải document](/scripts/docDownloader.js): Tải document từ Scribd, Issuu, Slideshare, Academia + + 29. [Scribd - Tải documents](/scripts/scribd_downloadDocuments.js): Tải miễn phí document trên Scribd - 21. [Image Downloader - Tải hình ảnh](/scripts/download_image.js): Tải tất cả hình ảnh đang thấy trong trang web + 30. [Studocu - Tải documents (Dlstudocu)](/scripts/studocu_dl.js): + + 31. [Studocu - Tải documents (Downstudocu)](/scripts/studocu_downs.js): Tải PDF document trên Studocu.com miễn phí ### Google - 22. [Xem các pages được google quét](/scripts/search_totalIndexedPages.js): Biết có bao nhiêu trang con của website hiện tại đã được quét bởi Google +--- Tải xuống --- + + 32. [Google drive - tạo link tải ngay](/scripts/ggdrive_generateDirectLink.js): Tạo đường link direct cho file trên google drive. Bấm vào đường link sẽ tải file trực tiếp thay vì mở trang xem trước file. + + 33. [GG Drive - Tải video](/scripts/ggdrive_downloadVideo.js): Tải video không có nút download trên google drive + + 34. [Google - Tải xuống dữ liệu của bạn](/scripts/google_downloadAllYourData.js): Tải xuống thông tin của bạn trên Google + +--- Tải hàng loạt --- + + 35. [GGDrive - Tải mọi video trong folder](/scripts/ggDrive_downloadAllVideosInFolder.js): Tải tất cả video trong thư mục google drive (tải được video không cho phép tải) + +--- Khác --- + + 36. [Xem các pages được google quét](/scripts/search_totalIndexedPages.js): Biết có bao nhiêu trang con của website hiện tại đã được quét bởi Google - 23. [Tìm kiếm trên trang web này](/scripts/search_googleSite.js): Sử dụng google site search + 37. [Tìm kiếm trên trang web này](/scripts/search_googleSite.js): Sử dụng google site search - 24. [Google phím tắt](/scripts/googleShortcuts.js): Tạo mới google doc/sheet/slide/form/site/keep/calendar + 38. [Google phím tắt](/scripts/googleShortcuts.js): Tạo mới google doc/sheet/slide/form/site/keep/calendar - 25. [Xem Google cache của trang web](/scripts/googleCache.js): Phù hơp để xem các trang web bị block + 39. [Xem Google cache của trang web](/scripts/googleCache.js): Phù hơp để xem các trang web bị block + + 40. [Google mirror - I'm elgooG](/scripts/google_mirror.js): Chơi các trò chơi (minigame) từng có trên google tìm kiếm ### Facebook +--- Nổi bật --- + + 41. [Facebook - Xem tin nhắn bị gỡ](/scripts/fb_revealDeletedMessages.js): Xem lại những tin nhắn đã bị đối phương xóa (kể từ khi bật chức năng) trong facebook messenger. + + 42. [Tin nhắn tàng hình facebook](/scripts/fb_invisible_message.js): Thêm ký tự > trước tin nhắn để tạo tin nhắn tàng hình. + +Chỉ xem được tin nhắn tàng hình khi cài extension và bật chức năng này. + + 43. [Facebook Story - Thêm nhiều loại emoji](/scripts/fb_moreReactionStory.js): React story Facebook với nhiều loại emoji khác nhau + + 44. [Facebook - Ai đang nhắn cho bạn?](/scripts/fb_whoIsTyping.js): Thông báo khi có người đang gõ tin nhắn cho bạn. + + 45. [Facebook - Đếm tin nhắn](/scripts/fb_messengerCount.js): Đếm tin nhắn từ tài khoản Facebook Messenger của bạn. + --- Giao diện --- - 26. [Bật/tắt đèn fb newfeed](/scripts/fb_toggleLight.js): Ẩn giao diện 2 bên newfeed, giúp tập trung vào newfeed + 46. [Tắt đèn fb newfeed](/scripts/fb_toggleLight.js): Ẩn giao diện 2 bên newfeed, giúp tập trung vào newfeed facebook ---- Access Token --- + 47. [Ẩn Newfeed facebook](/scripts/fb_toggleNewFeed.js): Ẩn Newfeed facebook để tập trung làm việc - 27. [Kiểm tra fb access token](/scripts/fb_checkToken.js): Kiểm tra loại, quyền, ngày tạo, ngày hết hạn, ... +--- Tải xuống --- - 28. [Lấy fb token từ cookie (ffb.vn)](/scripts/fb_getTokenFfb.js): Gửi cookie fb lên API của ffb.vn + 48. [Tải video fb đang xem](/scripts/fb_downloadWatchingVideo.js): Tải bất kỳ video facebook nào mà bạn đang xem (watch/story/comment/reel/chat/bình luận/tin nhắn) - 29. [Lấy fb token EAAG (business_locations)](/scripts/fb_getTokenBussinessLocation.js): Lấy fb token EAAG từ business.facebook.com + 49. [Tải Story fb đang xem](/scripts/fb_storySaver.js): Tải facebook story bạn đang xem - 30. [Lấy fb token EAAc (studio)](/scripts/fb_getTokenBusinessStudio.js): Lấy facebook access token từ trang business.facebook.com + 50. [Tải video trong comment facebook](/scripts/fb_downloadCommentVideo.js): Tải video trong bình luận facebook bạn đang xem - 31. [Lấy fb token EAAB (campaigns)](/scripts/fb_getTokenCampaigns.js): Lấy fb token EAAG từ www.facebook.com campaigns + 51. [Tải video/reel/watch fb từ url](/scripts/fb_videoDownloader.js): Tải facebook video/reel/watch - 32. [Lấy fb token EAAB (instagram)](/scripts/fb_getTokenFacebook.js): Lấy facebook access token từ trang www.facebook.com + 52. [Tải avatar từ fb user id](/scripts/fb_getAvatarFromUid.js): Tải danh sách avatar từ danh sách user id facebook - 33. [Lấy fb token (m.facebook.com)](/scripts/fb_getTokenMFacebook.js): Lấy facebook access token từ trang m.facebook.com +--- Tải hàng loạt --- - 34. [Lấy fb token (locmai)](/scripts/fb_getTokenLocmai.js): + 53. [Tải album facebook](/scripts/fb_downloadAlbumMedia.js): Tải về danh sách link ảnh/video từ album facebook ---- Lấy ID --- + 54. [Xuất mục đã lưu trên facebook](/scripts/fb_exportSaved.js): Xuất ra file các mục đã lưu của bạn trên facebook ra file json - 35. [Lấy fb User ID](/scripts/fb_getUid.js): Lấy id của user trong trang web hiện tại +--- Bảo mật --- - 36. [Lấy fb Page ID](/scripts/fb_getPageId.js): Lấy id của page trong trang web hiện tại + 55. [Tự động xóa Fbclid từ liên kết](/scripts/fb_removeFbclid.js): Tự động xóa địa chỉ theo dõi của facebook (Fbclid) từ liên kết - 37. [Lấy fb Group ID](/scripts/fb_getGroupId.js): Lấy id của group trong trang web hiện tại + 56. [Chống phising](/scripts/fb_antiPhishing.js): Ngăn cản sự tấn công phising - 38. [Lấy fb Album ID](/scripts/fb_getAlbumId.js): Lấy id của album trong trang web hiện tại + 57. [Chống clickjacking](/scripts/anti_clickjacking.js): Ngăn cản sự tấn công clickjacking - 39. [Tìm id của album fb chứa mọi ảnh tải lên](/scripts/fb_getTimelineAlbumId.js): Tìm album chứa tất cả ảnh trên dòng thời gian của page/user hiện tại +--- Access Token --- - 40. [Tìm tất cả fb video id](/scripts/fb_getAllVideoId.js): Tìm tất cả video id trong trang web + 58. [Kiểm tra fb access token](/scripts/fb_checkToken.js): Kiểm tra loại, quyền, ngày tạo, ngày hết hạn, ... của facebook access token - 41. [Lấy tất cả fb album id](/scripts/fb_getAllAlbumId.js): Lấy tất cả album id có trong trang web + 59. [Lấy fb token từ cookie (ffb.vn)](/scripts/fb_getTokenFfb.js): Gửi cookie facebook lên API của ffb.vn - 42. [Lấy fb User ID từ URL](/scripts/fb_getUidFromUrl.js): Lấy id của user từ URL truyền vào + 60. [Lấy fb token EAAG (business_locations)](/scripts/fb_getTokenBussinessLocation.js): Lấy facebook token EAAG từ business.facebook.com - 43. [Lấy tất cả fb user ID từ trang tìm kiếm](/scripts/fb_getAllUidFromFbSearch.js): Lấy id của tất cả user từ trang tìm kiếm người dùng + 61. [Lấy fb token EAAc (studio)](/scripts/fb_getTokenBusinessStudio.js): Lấy facebook access token từ trang business.facebook.com - 44. [Lấy tất cả fb user id từ danh sách bạn bè](/scripts/fb_getAllUidFromFriendsPage.js): Lấy tất cả user ID từ trang danh sách bạn bè + 62. [Lấy fb token EAAB (campaigns)](/scripts/fb_getTokenCampaigns.js): Lấy facebook token EAAG từ www.facebook.com campaigns - 45. [Lấy tất cả fb user ID từ group](/scripts/fb_getAllUidOfGroupMembers.js): Lấy id của tất cả user từ group + 63. [Lấy fb token EAAB (instagram)](/scripts/fb_getTokenFacebook.js): Lấy facebook access token từ trang www.facebook.com ---- Tải xuống --- + 64. [Lấy fb token (m.facebook.com)](/scripts/fb_getTokenMFacebook.js): Lấy facebook access token từ trang m.facebook.com + +--- Lấy ID --- + + 65. [Lấy fb User ID](/scripts/fb_getUid.js): Lấy id của user trong trang facebook hiện tại + + 66. [Lấy fb Page ID](/scripts/fb_getPageId.js): Lấy id của page trong trang facebook hiện tại + + 67. [Lấy fb Group ID](/scripts/fb_getGroupId.js): Lấy id của group trong trang facebook hiện tại + + 68. [Lấy fb Album ID](/scripts/fb_getAlbumId.js): Lấy id của facebook album trong trang web hiện tại - 46. [Facebook - Tải video/reel/watch](/scripts/fb_videoDownloader.js): Tải facebook video/reel/watch + 69. [Lấy tất cả fb album id](/scripts/fb_getAllAlbumId.js): Lấy tất cả album id có trong trang facebook - 47. [Tải avatar từ fb user id](/scripts/fb_getAvatarFromUid.js): Tải danh sách avatar từ danh sách user id + 70. [Lấy fb User ID từ URL](/scripts/fb_getUidFromUrl.js): Lấy id của facebook user từ URL truyền vào - 48. [Tải link ảnh/video từ album fb](/scripts/fb_downloadAlbumMedia.js): Tải về danh sách link ảnh/video + 71. [Lấy tất cả fb user ID từ trang tìm kiếm](/scripts/fb_getAllUidFromFbSearch.js): Lấy id của tất cả user từ trang tìm kiếm người dùng facebook + + 72. [Lấy tất cả fb user id từ danh sách bạn bè](/scripts/fb_getAllUidFromFriendsPage.js): Lấy tất cả user ID từ trang danh sách bạn bè facebook + + 73. [Lấy tất cả fb user ID từ group](/scripts/fb_getAllUidOfGroupMembers.js): Lấy id của tất cả user từ group facebook + +--- Phím tắt --- + + 74. [Mở trang facebook saved](/scripts/fb_openSaved.js): Xem nội dung tôi đã lưu trên Facebook + + 75. [Xem kỷ niệm của bạn trên facebook](/scripts/fb_openMemories.js): Xem kỷ niệm (memories) của bạn trên facebook + + 76. [Xem các quảng cáo fb bạn đã xem](/scripts/fb_openAdsActivities.js): Xem các quảng cáo bạn đã xem trên facebook ### Instagram - 49. [Lấy token insta](/scripts/insta_getToken.js): Lấy instagram access token + 77. [Thêm nút tải cho Instagram](/scripts/insta_injectDownloadBtn.js): Thêm nút để tải (ảnh/video/story/post) trên Instagram + + 78. [Lấy token insta](/scripts/insta_getToken.js): Lấy instagram access token - 50. [Lấy insta thông tin user (uid, avatar, ...)](/scripts/insta_getUserInfo.js): Lấy uid, avatar, tên, ... + 79. [Lấy insta thông tin user (uid, avatar, ...)](/scripts/insta_getUserInfo.js): Lấy instagram uid, avatar, tên, ... --- Tải xuống --- - 51. [Instantgram - Tải ảnh chất lượng cao](/scripts/instantgram.js): Tải ảnh instagram chất lượng cao bằng 1 click + 80. [Tải ảnh/story insta đang xem](/scripts/instantgram.js): Tải ảnh/story instagram nhanh chóng bằng 1 click - 52. [Tải về tất cả media của insta user](/scripts/insta_getAllUserMedia.js): Tải về tất cả ảnh/video của người dùng insta + 81. [Tải Story Instagram đang xem](/scripts/insta_storySaver.js): Tải instagram story bạn đang xem - 53. [Tải về tất cả ảnh insta newfeed](/scripts/insta_getAllImagesInNewFeed.js): Tải về tất cả ảnh đang có trên newfeed +--- Tải hàng loạt --- - 54. [Tải tất cả ảnh insta user profile](/scripts/insta_getAllImagesInUserProfile.js): Tải tất cả ảnh có trong profile của user bất kỳ + 82. [Tải về tất cả media của insta user](/scripts/insta_getAllUserMedia.js): Tải về tất cả ảnh/video của người dùng instagram -### Youtube + 83. [Tải về tất cả ảnh insta newfeed](/scripts/insta_getAllImagesInNewFeed.js): Tải về tất cả ảnh đang có trên newfeed instagram - 55. [Tải video youtube (bypass 18+)](/scripts/youtube_downloadVideo.js): Tải cả video giới hạn độ tuổi, không cần đăng nhập + 84. [Tải tất cả ảnh insta user profile](/scripts/insta_getAllImagesInUserProfile.js): Tải tất cả ảnh có trong profile của user instagram bất kỳ + +### Youtube - 56. [Picture in Picture](/scripts/pictureInPicture.js): Xem video trong cửa sổ nổi + 85. [Tải video youtube](/scripts/youtube_downloadVideo.js): Tải cả video giới hạn độ tuổi, không cần đăng nhập - 57. [Tắt/Mở đèn youtube](/scripts/youtube_toggleLight.js): Tắt/Mở đèn để tập trung xem video youtube + 86. [Picture in Picture](/scripts/pictureInPicture.js): Xem video trong cửa sổ nổi - 58. [Xem lượng dislike video youtube](/scripts/youtube_viewDislikes.js): Biết số lượt dislikes (không thích) video youtube + 87. [Tắt/Mở đèn youtube](/scripts/youtube_toggleLight.js): Tắt/Mở đèn để tập trung xem video youtube - 59. [Youtube nonstop](/scripts/youtube_nonstop.js): Phát youtube không còn bị làm phiền bởi popup 'Video đã tạm dừng. Bạn có muốn xem tiếp?' của youtube. + 88. [Xem lượng dislike video youtube](/scripts/youtube_viewDislikes.js): Biết số lượt dislikes (không thích) video youtube - 60. [Xem youtube trong popup](/scripts/youtube_popupPlayer.js): Xem video youtube hiện tại trong cửa sổ popup mới + 89. [Youtube nonstop](/scripts/youtube_nonstop.js): Phát youtube không còn bị làm phiền bởi popup 'Video đã tạm dừng. Bạn có muốn xem tiếp?' của youtube. ### Tiktok - 61. [Tiktok - Tải video (Snaptik)](/scripts/tiktok_downloadVideo.js): Tải tiktok video sử dụng Snaptik API +--- Tiktok --- - 62. [Douyin - Tải videos](/scripts/douyin_downloadVideo.js): Hiển thị mọi video có thể tải trong trang douyin hiện tại + 90. [Tiktok - Tải video đang xem](/scripts/tiktok_downloadWatchingVideo.js): Tải video tiktok bạn đang xem (không/có watermark) + + 91. [Tiktok - Tải video (API)](/scripts/tiktok_downloadVideo.js): Tải video tiktok từ link (không/có watermark) + + 92. [Tiktok - Tải video (Snaptik)](/scripts/tiktok_snaptikApp.js): Tải tiktok video sử dụng Snaptik API + + 93. [Tiktok - Tải video (snaptikvideo)](/scripts/tiktok_snaptikVideo.js): Tải video tiktok (mp4/mp3/không watermark) dùng API snaptikvideo + +--- Douyin --- + + 94. [Douyin - Tải video đang xem](/scripts/douyin_downloadWachingVideo.js): Hiển thị mọi video có thể tải trong trang douyin hiện tại + + 95. [Douyin - Tải video (API)](/scripts/douyin_downloadVideo.js): Tải video douyin sử dụng API + +--- Tải hàng loạt --- + + 96. [Tiktok - Tải tất cả video người dùng](/scripts/tiktok_downloadUserVideos.js): Tải tất cả video trong trang cá nhân của người dùng tiktok. + + 97. [Douyin - Tải tất cả video người dùng](/scripts/douyin_downloadAllVideoUser.js): Tải tất cả video trong trang cá nhân của người dùng douyin. --- Doutu.be --- - 63. [Bật tải mọi video](/scripts/doutube_enableDownloadVideo.js): Bật chức năng download cho mọi video trong trang + 98. [Bật tải mọi video](/scripts/doutube_enableDownloadVideo.js): Bật chức năng download cho mọi video trong trang + + 99. [Tải video doutu.be](/scripts/doutube_downloadWatchingVideo.js): Tải video doutu.be bạn đang xem - 64. [Tải video doutu.be](/scripts/doutube_downloadWatchingVideo.js): Tải video doutu.be bạn đang xem + 100. [Tải story doutu.be](/scripts/doutube_downloadWatchingStory.js): Tải story bạn đang xem - 65. [Tải story doutu.be](/scripts/doutube_downloadWatchingStory.js): Tải story bạn đang xem + 101. [Tải tất cả video từ doutu.be profile](/scripts/doutube_getAllVideoInUserProfile.js): Tải tất cả video từ profile của user doutu.be bất kỳ - 66. [Tải tất cả video từ doutu.be profile](/scripts/doutube_getAllVideoInUserProfile.js): Tải tất cả video từ profile của user doutu.be bất kỳ +### Mua sắm + + 102. [Shopee - Loại hàng mua nhiều nhất](/scripts/shopee_topVariation.js): Thống kê xem tùy chọn sản phẩm nào được mọi người mua nhiều nhất + + 103. [Shopee - Đã mua bao nhiêu tiền?](/scripts/shopee_totalSpendMoney.js): Xem bạn đã mua hết bao nhiêu tiền trên Shopee + + 104. [Tiki - Đã mua bao nhiêu tiền?](/scripts/tiki_totalSpendMoney.js): Xem bạn đã mua hết bao nhiêu tiền trên Tiki ### Github - 67. [Đi tới commit đầu tiên](/scripts/github_goToFirstCommit.js): Đi tới commit đầu tiên của repo github + 105. [Đi tới commit bất kỳ](/scripts/github_goToAnyCommit.js): Đi tới commit bất kỳ của repo github. Bao gồm cả commit đầu tiên. - 68. [Mở repo trong github.dev](/scripts/githubdev.js): Mở repo hiện tại trong trang github.dev để xem code + 106. [Mở repo trong github.dev](/scripts/githubdev.js): Mở repo hiện tại trong trang github.dev để xem code - 69. [Mở repo trong github1s.com](/scripts/github1s.js): Mở repo hiện tại trong trang github1s.com để xem code + 107. [Mở repo trong github1s.com](/scripts/github1s.js): Mở repo hiện tại trong trang github1s.com để xem code ### Tự động hoá - 70. [Chuyển chữ thành QRCode](/scripts/textToQRCode.js): Nhập vào chữ và nhận về QRCode tương ứng + 108. [Rút gọn link](/scripts/shortenURL.js): Hỗ trợ tinyurl, tnyim, cuttly, bitly, j2team, ... + + 109. [Giải mã link rút gọn](/scripts/unshorten.js): Lấy link gốc của link rút gọn + + 110. [Thay đổi đầu ra âm thanh](/scripts/changeAudioOutput.js): Thay đổi đầu ra âm thanh của trang web đang mở. +Mỗi tab có thể chọn đầu ra khác nhau (tai nghe/loa). + +--- QRCode --- + + 111. [Chuyển chữ thành QRCode](/scripts/textToQRCode.js): Nhập vào chữ và nhận về QRCode tương ứng + + 112. [Lấy QRCode cho web hiện tại](/scripts/webToQRCode.js): Chuyển URL của trang web sang QR Code + +--- Tự động --- + + 113. [Tạo mật khẩu cho trang web](/scripts/passwordGenerator.js): Bạn chỉ còn cần phải nhớ 1 mật khẩu - 71. [Lấy QRCode cho web hiện tại](/scripts/webToQRCode.js): Chuyển URL của trang web sang QR Code + 114. [Trích xuất mọi emails từ trang web](/scripts/getAllEmailsInWeb.js): Trích xuất tất cả emails trong web và hiện trong popup mới - 72. [Trích xuất mọi emails từ trang web](/scripts/getAllEmailsInWeb.js): Trích xuất tất cả emails trong web và hiện trong popup mới + 115. [Chụp ảnh toàn bộ web](/scripts/screenshotFullPage.js): Tạo ảnh chụp màn hình toàn bộ website - 73. [Chụp ảnh toàn bộ web](/scripts/screenshotFullPage.js): Tạo ảnh chụp màn hình toàn bộ website + 116. [JSON formatter](/scripts/jsonformatter.js): Mở công cụ làm đẹp JSON trong tab mới - 74. [In web ra PDF](/scripts/webToPDF.js): Chuyển trang web hiện tại thành PDF + 117. [Phân tích hiệu suất](/scripts/performanceAnalyzer.js): Phân tích hiệu suất website không cần biết code - 75. [Transfer.sh - Chia sẻ file nhanh](/scripts/transfer_sh.js): Tải file lên và nhận về link để chia sẻ + 118. [Cuộn trang xuống cuối cùng](/scripts/scrollToVeryEnd.js): Cuộn tới khi nào không còn data load thêm nữa (trong 5s) thì thôi. Click chuột để huỷ. - 76. [JSON formatter](/scripts/jsonformatter.js): Mở công cụ làm đẹp JSON trong tab mới + 119. [Bật/Tắt Hack game T-Rex Dino](/scripts/dino_hack.js): Tự động chơi game Google Chrome T-Rex - 77. [Phân tích hiệu suất](/scripts/performanceAnalyzer.js): Phân tích hiệu suất website không cần biết code +--- PDF --- - 78. [Cuộn trang xuống cuối cùng](/scripts/scrollToVeryEnd.js): Cuộn tới khi nào không còn data load thêm nữa (trong 5s) thì thôi. Click chuột để huỷ. + 120. [In web ra PDF](/scripts/webToPDF.js): Chuyển trang web hiện tại thành PDF -### Mật khẩu + 121. [FastDoc - Chuyển PDF/Ảnh sang Word/Excel](/scripts/fastDoc.js): Chuyển đổi hình ảnh và pdf sang Excel, Word, Searchable PDF miễn phí - 79. [Tạo mật khẩu cho trang web](/scripts/passwordGenerator.js): Bạn chỉ còn cần phải nhớ 1 mật khẩu + 122. [SmartPDF - Công cụ cho PDF](/scripts/smartPDF.js): Giảm dung lượng PDF, Chuyển đổi PDF, PPT sang PDF, PDF sang PPT, JPG sang PDF, PDF sang JPG, Excel sang PDF, PDF sang Excel, Chỉnh sửa PDF, Trình đọc PDF, Số trang, Xóa các trang PDF, Xoay PDF, Word sang PDF, PDF sang Word, Ghép PDF, Cắt PDF, Ký tên PDF, Mở khóa PDF, Bảo vệ PDF, Máy quét PDF - 80. [Tìm tài khoản miễn phí](/scripts/search_sharedAccount.js): Tìm tài khoản được chia sẻ trên mạng cho trang web hiện tại + 123. [PDF Stuffs - Công cụ PDF](/scripts/pdfstuffs.js): Công cụ chuyển đổi PDF online miễn phí: Ghép file PDF, Tách file PDF, Nén file PDF, PDF sang Word, PDF sang PPT, PDF sang Excel, Word sang PDF, Excel sang PDF, PPT sang PDF, PDF sang JPG, JPG sang PDF, PDF sang HTML, HTML sang PDF, Mở khóa PDF, Khóa file PDF, Xoay file PDF, Cắt file PDF, Xóa trang PDF, Đánh số trang PDF, Chèn watermark - 81. [Tắt/mở xem mật khẩu bị ẩn](/scripts/passwordFieldToggle.js): Bạn sẽ xem được mật khẩu bị ẩn trong khung đăng nhập +--- Chia sẻ --- + + 124. [Send - Chia sẻ file nhanh](/scripts/send_shareFiles.js): Mở send.zcyph.cc - chia sẻ file lớn lên tới 20Gb + + 125. [Transfer.sh - Chia sẻ file nhanh](/scripts/transfer_sh.js): Tải file lên và nhận về link để chia sẻ ### Mở khoá - 82. [Rút gọn link](/scripts/shortenURL.js): Hỗ trợ tinyurl, tnyim, cuttly, bitly, j2team, ... +--- Mở khoá web --- + + 126. [Truy cập các trang web bị chặn](/scripts/donotBlockMe.js): Xem các website đang bị chặn bởi nhà mạng. (ví dụ: Medium) + + 127. [Envato - bypass khung xem trước](/scripts/envato_bypassPreview.js): Bypass khung preview khi xem demo trong trang web Envato (Themeforest, Codecanyon) + + 128. [Scribd - Xem miễn phí VIP](/scripts/scribd_bypassPreview.js): Xem tài liệu VIP trên Scribd.com, loại bỏ popup chặn xem trước, loại bỏ hiệu ứng làm mờ. + + 129. [Studyphim - Xem miễn phí](/scripts/studyphim_unlimited.js): Xem phim miễn phí trên Studyphim không cần đăng nhập + + 130. [Studocu - Xem miễn phí VIP](/scripts/studocu_bypassPreview.js): Xem tài liệu VIP trên Studocu.com, loại bỏ popup chặn xem trước, loại bỏ hiệu ứng làm mờ. + +--- Mở khoá chức năng --- + + 131. [Phát hiện ký tự ẩn (Zero-Width)](/scripts/detect_zeroWidthCharacters.js): Phát hiện ký tự ẩn (zero-width) trong văn bản cho trình duyệt, e-mail client, trình soạn thảo văn bản,... - 83. [Giải mã link rút gọn](/scripts/unshorten.js): Lấy link gốc của link rút gọn +Bấm để xem thêm chi tiết. - 84. [Xem thông tin trình duyệt](/scripts/viewBrowserInfo.js): Hệ điều hành, tên trình duyệt, version, userAgent, ... + 132. [Bật/Tắt cho phép sao chép](/scripts/simpleAllowCopy.js): Cho phép sao chép trong mọi website - 85. [Hiện các thành phần web bị ẩn](/scripts/showHiddenFields.js): Web thường ẩn mốt số thành phần như token, id, form, ... + 133. [Bật lại menu chuột phải](/scripts/reEnableContextMenu.js): Dùng cho web nào không cho phép bật menu chuột phải - 86. [Xem cookies](/scripts/viewCookies.js): Xem cookies được lưu trong website hiện tại + 134. [Hiện các thành phần web bị ẩn](/scripts/showHiddenFields.js): Web thường ẩn mốt số thành phần như token, id, form, ... - 87. [Xoá Cookies](/scripts/removeCookies.js): Xoá cookies trang hiện tại + 135. [Tắt/mở xem mật khẩu bị ẩn](/scripts/passwordFieldToggle.js): Bạn sẽ xem được mật khẩu bị ẩn trong khung đăng nhập - 88. [Bật text selection](/scripts/enableTextSelection.js): Dùng cho web nào không cho phép bôi đen văn bản + 136. [Xem cookies](/scripts/viewCookies.js): Xem cookies được lưu trong website hiện tại - 89. [Bật lại menu chuột phải](/scripts/reEnableContextMenu.js): Dùng cho web nào không cho phép bật menu chuột phải + 137. [Xoá Cookies](/scripts/removeCookies.js): Xoá cookies trang hiện tại - 90. [Nhúng script vào trang web](/scripts/injectScriptToWebsite.js): + 138. [Xem thông tin trình duyệt](/scripts/viewBrowserInfo.js): Hệ điều hành, tên trình duyệt, version, userAgent, ... - 91. [Xem miễn phí trang tin tức trả phí](/scripts/paywallKiller.js): + 139. [Nhúng script vào trang web](/scripts/injectScriptToWebsite.js): ### Giao diện - 92. [Chế độ tối cho PDF](/scripts/darkModePDF.js): Bật/Tắt chế độ tối cho PDF bạn đang xem + 140. [Chế độ tối cho PDF](/scripts/darkModePDF.js): Bật/Tắt chế độ tối cho PDF bạn đang xem - 93. [Bật/tắt chế độ chỉnh sửa website](/scripts/toggleEditPage.js): Cho phép chỉnh sửa mọi văn bản trong website + 141. [Bật/tắt chế độ chỉnh sửa website](/scripts/toggleEditPage.js): Cho phép chỉnh sửa mọi văn bản trong website - 94. [Cuộn web bằng cách kéo thả](/scripts/scrollByDrag.js): Bấm vào sẽ biến con trỏ thành con lăn và bấm lại nó sẽ đưa con trỏ trở lại bình thường + 142. [Cuộn web bằng cách kéo thả](/scripts/scrollByDrag.js): Bấm vào sẽ biến con trỏ thành con lăn và bấm lại nó sẽ đưa con trỏ trở lại bình thường - 95. [Chạy stats.js](/scripts/runStatJs.js): Tính toán FPS website + 143. [Chạy stats.js](/scripts/runStatJs.js): Tính toán FPS website --- Xem --- - 96. [Xem tất cả tất cả javascript events](/scripts/visualEvent.js): Visual Event - Hiển thị tất cả javascript events xuất hiện trong trang web + 144. [Xem tất cả tất cả javascript events](/scripts/visualEvent.js): Visual Event - Hiển thị tất cả javascript events xuất hiện trong trang web - 97. [Xem mọi hình ảnh có trong website](/scripts/listAllImagesInWeb.js): Xem danh sách hình ảnh trong tab mới + 145. [Xem mọi hình ảnh có trong website](/scripts/listAllImagesInWeb.js): Xem danh sách hình ảnh trong tab mới - 98. [Xem tất cả link](/scripts/viewAllLinks.js): Liệt kê tất cả đường link có trong website + 146. [Xem tất cả link](/scripts/viewAllLinks.js): Liệt kê tất cả đường link có trong website - 99. [Xem tất cả scripts](/scripts/viewScriptsUsed.js): Mở danh sách scripts đươc dùng bởi trang web trong tab mới + 147. [Xem tất cả scripts](/scripts/viewScriptsUsed.js): Mở danh sách scripts đươc dùng bởi trang web trong tab mới - 100. [Xem tất cả stylesheet](/scripts/viewStylesUsed.js): Mở danh sách css được dùng bởi website trong tab mới + 148. [Xem tất cả stylesheet](/scripts/viewStylesUsed.js): Mở danh sách css được dùng bởi website trong tab mới - 101. [Trình kiểm tra css cục bộ](/scripts/cssSelectorViewer.js): Kiểm tra mã css cho thành phần bất kỳ trong trang web + 149. [Trình kiểm tra css cục bộ](/scripts/cssSelectorViewer.js): Kiểm tra mã css cho thành phần bất kỳ trong trang web - 102. [Xem mã nguồn của phần bôi đen](/scripts/viewPartialSource.js): Mở mã nguồn của phần được bôi đen trong tab mới + 150. [Xem mã nguồn của phần bôi đen](/scripts/viewPartialSource.js): Mở mã nguồn của phần được bôi đen trong tab mới --- Xoá --- - 103. [Xoá màu website](/scripts/removeColours.js): Xoá mọi màu có trong website + 151. [Xoá màu website](/scripts/removeColours.js): Xoá mọi màu có trong website - 104. [Xoá stylesheet](/scripts/removeStylesheet.js): Xem trang web sẽ ra sao khi không có css + 152. [Xoá stylesheet](/scripts/removeStylesheet.js): Xem trang web sẽ ra sao khi không có css - 105. [Xoá mọi hình ảnh](/scripts/removeImages.js): Chỉ để lại văn bản, giúp tập trung hơn + 153. [Xoá mọi hình ảnh](/scripts/removeImages.js): Chỉ để lại văn bản, giúp tập trung hơn - 106. [Xoá mọi iframe/embed](/scripts/removeBloat.js): Xoá mọi thứ gây xao nhãng (quảng cáo, web nhúng, ..) + 154. [Xoá mọi iframe/embed](/scripts/removeBloat.js): Xoá mọi thứ gây xao nhãng (quảng cáo, web nhúng, ..) --- Bảng --- - 107. [Thêm sắp xếp cho bảng](/scripts/table_addSortTable.js): Thêm nút chức năng sắp xếp cho từng cột trong table + 155. [Thêm sắp xếp cho bảng](/scripts/table_addSortTable.js): Thêm nút chức năng sắp xếp cho từng cột trong table - 108. [Thêm cột số thứ tự](/scripts/table_addNumberColumn.js): Thêm cột STT vào bên trái bảng + 156. [Thêm cột số thứ tự](/scripts/table_addNumberColumn.js): Thêm cột STT vào bên trái bảng - 109. [Đổi chỗ hàng và cột](/scripts/table_swapRowAndColumn.js): Hàng thành cột và cột thành hàng + 157. [Đổi chỗ hàng và cột](/scripts/table_swapRowAndColumn.js): Hàng thành cột và cột thành hàng --- Khác --- - 110. [Tô màu cho link](/scripts/internalOrExternalLink.js): +Đỏ: cùng domain + 158. [Tô màu cho link](/scripts/internalOrExternalLink.js): +Đỏ: cùng domain +Cam: hiện tại +Xanh: khác domain - 111. [Lấy kích thước trang web](/scripts/getWindowSize.js): đơn vị pixels + 159. [Lấy kích thước trang web](/scripts/getWindowSize.js): đơn vị pixels - 112. [Hiệu ứng tuyết rơi](/scripts/letItSnow.js): Thêm hiệu ứng tuyết rơi vào trang web \ No newline at end of file + 160. [Hiệu ứng tuyết rơi](/scripts/letItSnow.js): Thêm hiệu ứng tuyết rơi vào trang web \ No newline at end of file diff --git a/md/exportScriptsToMd.js b/md/exportScriptsToMd.js index a614cf75..3f6b9623 100644 --- a/md/exportScriptsToMd.js +++ b/md/exportScriptsToMd.js @@ -1,4 +1,5 @@ -import { isTitle, tabs } from "../popup/tabs.js"; +import { isTitle } from "../popup/helpers/utils.js"; +import { tabs } from "../popup/tabs.js"; function generateMd(lang = "vi") { let index = 1; diff --git a/md/facebook-post-hay.md b/md/facebook-post-hay.md new file mode 100644 index 00000000..b0cdbbfd --- /dev/null +++ b/md/facebook-post-hay.md @@ -0,0 +1,72 @@ +### 2017 + +#### Thang 3: + +[Cach tim tai lieu tren ggdrive](https://www.facebook.com/groups/j2team.community/permalink/448793068786152) + +[08/2017: Script get link ALL IN ONE](https://www.facebook.com/groups/j2team.community/permalink/448793068786152) + +[10/2017: get data api facebook](https://www.facebook.com/groups/j2team.community/permalink/579096642422460/) + +[12/2017: 1500 folder tai lieu](https://www.facebook.com/groups/j2team.community/permalink/620288278303296) + +[06/2018: kick fb account bi khoa](https://www.facebook.com/groups/j2team.community/permalink/706024463063010) + +[08/2018: tong hop chuc nang f12 fb](https://www.facebook.com/groups/j2team.community/permalink/784014725263983) + +[01/2019: Tool (ytdl) tải video từ hàng trăm web (siêu nhẹ)](https://www.facebook.com/groups/j2team.community/permalink/881250948873693) + +[04/2019: Ung dung xem video gg drive](https://www.facebook.com/groups/j2team.community/permalink/932588963739891) + +[05/2019: get fb token bang username/pass](https://www.facebook.com/groups/j2team.community/permalink/948789318786522) + +[06/2019: Get link all video in folder drive](https://www.facebook.com/groups/j2team.community/permalink/974953859503401) + +[07/2019: Play video ggdrive khong limit (die)](https://www.facebook.com/groups/j2team.community/permalink/1002284836770303) + +[10/2019: Tai bat ky video nao bi chan](https://www.facebook.com/groups/j2team.community/permalink/1074134599585326) + +[10/2019: hack 500 tai khoan fb](https://www.facebook.com/groups/j2team.community/permalink/1083748121957307) + +[12/2019: Link du the loai 50Gb](https://www.facebook.com/groups/j2team.community/permalink/1141334149532037) + +[04/2020: Tai file ggdrive bi gioi han bang python](https://www.facebook.com/groups/j2team.community/permalink/1242480919417359) + +[07/2020: nghề làm tool fb](https://www.facebook.com/groups/j2team.community/permalink/1335903356741781) + +[08/2020: tutorial code tool fb don gian](https://www.facebook.com/groups/j2team.community/permalink/1344883335843783) + +[09/2020: Tai file gg drive bi xoa](https://www.facebook.com/groups/j2team.community/permalink/1371031299895653) + +[10/2021: Kỹ thuật mod tính năng fb](https://www.facebook.com/groups/j2team.community/permalink/1693746070957506) + +- [Xem tin nhắn bị gỡ](https://github.com/thunguyen2905/Unsend-Recall-For-Messenger) +- [Hack yoose camera](https://thao.pw/hacking-yoosee-camera/) + +[01/2019: Bão like fb](https://www.facebook.com/groups/j2team.community/permalink/885702488428539) + +[09/2020: Script hủy theo dõi ng lạ (link code die)](https://www.facebook.com/groups/j2team.community/permalink/1391638654501584/) ([link code mới](https://gist.github.com/jayremnt/8698ba9214806d44a2d8029eb989ba78)) [toàn bộ script](https://github.com/jayremnt/facebook-scripts-dom-manipulation) + +[08/2021: Xóa bạn inactive](https://www.facebook.com/groups/j2team.community/permalink/1632566443742136/) + +[07/2021: Tin nhắn tàng hình](https://www.facebook.com/groups/j2team.community/permalink/1607769529555161/) + +[08/2017: Autoit xem tin nhắn đầu tiên](https://www.facebook.com/groups/j2team.community/permalink/548712322127559/) + +[04/2017: Tool đăng bài, get id, get info, ...](https://www.facebook.com/groups/j2team.community/permalink/477195639279228/) + +[08/2021: Extension facebook lite](https://www.facebook.com/groups/j2team.community/permalink/1647394652259315/) + +[09/2017: Extension Studyphim VIP](https://www.facebook.com/groups/j2team.community/permalink/565933393738785/) + +[08/2021: Extension Tải Scribd](https://www.facebook.com/groups/j2team.community/permalink/1642123806119733/) + +[10/2019: List Extension tải file nhiều trang web](https://www.facebook.com/groups/j2team.community/permalink/1074924172839702/) + +[10/2020 Extension JUNO_OKYO](https://www.facebook.com/groups/j2team.community/permalink/1402355036763279/) + +[12/2021: Shopee loại hàng mua nhiều nhất](https://www.facebook.com/groups/j2team.community/permalink/1730753827256730/) + +[01/2020: Đếm tổng tiền cống cho shopee,tiki](https://www.facebook.com/groups/j2team.community/permalink/1169967376668714/) + +[09/2019: Hack game dino](https://www.facebook.com/groups/j2team.community/permalink/1036677113331075/) diff --git a/md/flow.pu b/md/flow.pu new file mode 100644 index 00000000..57299848 --- /dev/null +++ b/md/flow.pu @@ -0,0 +1,89 @@ +' https://plantuml.com/guide + + +@startuml Useful-scripts +Alice -> Bob: Authentication Request +Bob --> Alice: Authentication Response +Alice -> Bob: Another authentication Request +Alice <-- Bob: Another authentication Response +@enduml + +@startuml ABC +Alice -> Bob: Authentication Request +Bob --> Alice: Authentication Response +Alice -> Bob: Another authentication Request +Alice <-- Bob: Another authentication Response +@enduml + +@startuml DEF +participant participant as Foo +actor actor as Foo1 +boundary boundary as Foo2 +control control as Foo3 +entity entity as Foo4 +database database as Foo5 +collections collections as Foo6 +queue queue as Foo7 +Foo -> Foo1 : To actor +Foo -> Foo2 : To boundary +Foo -> Foo3 : To control +Foo -> Foo4 : To entity +Foo -> Foo5 : To database +Foo -> Foo6 : To collections +Foo -> Foo7: To queue +@endum + +@startuml +actor Bob #red +' The only difference between actor and participant is the drawing +participant Alice +participant "I have a really\nlong name" as L #99FF99 +/' You can also declare: +participant L as "I have a really\nlong name" #99FF99 +'/ +Alice->Bob: Authentication Request +Bob->Alice: Authentication Response +Bob->L: Log transaction +@enduml + +@startuml +scale 600 width +[*] -> State1 +State1 --> State2 : Succeeded +State1 --> [*] : Aborted +State2 --> State3 : Succeeded +State2 --> [*] : Aborted +state State3 { +state "Accumulate Enough Data\nLong State Name" as long1 +long1 : Just a test +[*] --> long1 +long1 --> long1 : New Data +long1 --> ProcessData : Enough Data +} +State3 --> State3 : Failed +State3 --> [*] : Succeeded / Save Result +State3 --> [*] : Aborted +@enduml + +@startuml +!include +!include +!include +!include +!include +!include +!include +node "Cloudogu Ecosystem" <<$cloudogu>> { +DOGU_JENKINS(jenkins, Jenkins) #ffffff +DOGU_SCM(scm, SCM-Manager) #ffffff +DOGU_SMEAGOL(smeagol, Smeagol) #ffffff +DOGU_NEXUS(nexus,Nexus) #ffffff +} +TOOL_K8S(k8s, Kubernetes) #ffffff +actor developer +developer --> smeagol : "Edit Slides" +smeagol -> scm : Push +scm -> jenkins : Trigger +jenkins -> nexus : Deploy +jenkins --> k8s : Deploy +@enduml \ No newline at end of file diff --git a/pages/viewScriptSource/main.js b/pages/viewScriptSource/main.js index 446b1c32..4c601939 100644 --- a/pages/viewScriptSource/main.js +++ b/pages/viewScriptSource/main.js @@ -1,17 +1,16 @@ -window.onload = () => { - let sharedData; +window.onload = async () => { try { - sharedData = JSON.parse(localStorage.viewScriptSource_sharedData); - const { name, source, description, id } = sharedData; - if (name && source) { - let title = "Useful-script / " + name + " / " + description; - let comment = `// ${name}\n// ${description}\n\n`; - let sourceCode = source.replace("function ", "function " + (id || "_")); + let id = localStorage.viewScriptSource_sharedData; + let source = await getScriptSource(id); - document.querySelector("#copy-btn").onclick = () => copy(sourceCode); + if (source) { + let fileName = id + ".js"; + let comment = "// File: " + fileName; - document.title = title; - document.querySelector("code").innerHTML = comment + sourceCode; + document.querySelector("#copy-btn").onclick = () => copy(source); + document.querySelector("code").innerHTML = + comment + "\n\n" + escapeHTML(source); + document.title = fileName; hljs.highlightAll(); hljs.initLineNumbersOnLoad(); @@ -24,3 +23,27 @@ function copy(text) { navigator.clipboard.writeText(text); alert("Copied"); } + +// https://stackoverflow.com/a/26276924/11898496 +async function getScriptSource(scriptId) { + try { + let fileName = scriptId + ".js"; + let path = "/scripts/" + fileName; + let res = await fetch(path); + let source = await res.text(); + return source; + } catch (e) { + return "// Không lấy được source code\n// Cannot load source code"; + } +} + +// https://stackoverflow.com/a/6234804/11898496 +function escapeHTML(unsafe_str) { + return unsafe_str + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/\"/g, """) + .replace(/\'/g, "'") + .replace(/\//g, "/"); +} diff --git a/popup/helpers/category.js b/popup/helpers/category.js index cccb6729..50fe91eb 100644 --- a/popup/helpers/category.js +++ b/popup/helpers/category.js @@ -1,4 +1,11 @@ export const CATEGORY = { + contentScript: { + id: "contentScript", + name: { + en: "Content scripts", + vi: "Content scripts", + }, + }, favorite: { id: "favorite", style: { textDecoration: "underline" }, @@ -15,29 +22,21 @@ export const CATEGORY = { vi: ` Gần đây`, }, }, - available: { - id: "available", - showCount: true, - style: { textDecoration: "underline" }, - name: { - en: ` Available`, - vi: ` Có thể dùng`, - }, - }, - hot: { - id: "hot", + all: { + id: "all", style: { textDecoration: "underline" }, name: { - en: ` Hot`, - vi: ` Nổi bật`, + en: ` All scripts`, + vi: ` Tất cả`, }, }, - new: { - id: "new", + autorun: { + id: "autorun", + // showCount: true, style: { textDecoration: "underline" }, name: { - en: ` New`, - vi: ` Mới`, + en: ` Autorun`, + vi: ` Tự động chạy`, }, }, search: { @@ -89,6 +88,13 @@ export const CATEGORY = { vi: ` Tiktok`, }, }, + shopping: { + id: "shopping", + name: { + en: ` Shopping`, + vi: ` Mua sắm`, + }, + }, github: { id: "github", name: { @@ -103,13 +109,6 @@ export const CATEGORY = { vi: ` Tự động hoá`, }, }, - password: { - id: "password", - name: { - en: ` Password`, - vi: ` Mật khẩu`, - }, - }, unlock: { id: "unlock", name: { diff --git a/popup/helpers/lang.js b/popup/helpers/lang.js index c7564ece..d4cb7374 100644 --- a/popup/helpers/lang.js +++ b/popup/helpers/lang.js @@ -7,29 +7,29 @@ export const LANG = { let currentLangKey = null; -export async function setLang(lang) { +export function setLang(lang) { if (lang in LANG) { currentLangKey = lang; - await langSaver.set(lang); + langSaver.set(lang); } else { alert("WRONG LANG KEY " + lang); } } -export async function toggleLang() { +export function toggleLang() { let newLang = currentLangKey === LANG.vi ? LANG.en : LANG.vi; currentLangKey = newLang; - await setLang(newLang); + setLang(newLang); return newLang; } -export async function getLang() { - if (!currentLangKey) currentLangKey = await langSaver.get(LANG.vi); +export function getLang() { + if (!currentLangKey) currentLangKey = langSaver.get(LANG.vi); return currentLangKey; } -export async function getFlag() { - return "./assets/flag-" + (await getLang()) + ".png"; +export function getFlag() { + return "./assets/flag-" + getLang() + ".png"; } export function t(o) { diff --git a/popup/helpers/storage.js b/popup/helpers/storage.js index 044d9d8c..de159001 100644 --- a/popup/helpers/storage.js +++ b/popup/helpers/storage.js @@ -1,58 +1,50 @@ import { allScripts } from "../../scripts/index.js"; -// https://developer.chrome.com/docs/extensions/reference/storage/ -export const localStorage = { - set: async (key, value) => { - return chrome.storage.sync.set({ [key]: value }); - }, - get: async (key, defaultValue = "") => { - let result = await chrome.storage.sync.get([key]); - return result[key] || defaultValue; - }, -}; - const createVariableSaver = (key, defaultValue = null) => ({ - set: async (data) => { - await localStorage.set(key, data); + set: (data) => { + localStorage.setItem(key, JSON.stringify(data)); }, - get: async (_defaultValue) => { - return await localStorage.get(key, _defaultValue || defaultValue); + get: (_defaultValue) => { + return ( + JSON.parse(localStorage.getItem(key) || "null") ?? + _defaultValue ?? + defaultValue + ); }, }); const createScriptsSaver = (key, addToHead = true) => { - const getIds = async () => - (await localStorage.get(key, [])).filter( + const getIds = () => + JSON.parse(localStorage.getItem(key) ?? "[]").filter( (savedScriptId) => savedScriptId in allScripts ); - const has = async (script) => { - let current = await getIds(); + const has = (script) => { + let current = getIds(); let exist = current.findIndex((id) => id === script.id) >= 0; return exist; }; - const add = async (script) => { - let current = await getIds(); + const add = (script) => { + let current = getIds(); let newList = current.filter((id) => id != script.id); // remove duplicate if (addToHead) newList.unshift(script.id); // only save script id else newList.push(script.id); - await localStorage.set(key, newList); + localStorage.setItem(key, JSON.stringify(newList)); }; - const remove = async (script) => { - let current = await getIds(); + const remove = (script) => { + let current = getIds(); let newList = current.filter((id) => id !== script.id); - await localStorage.set(key, newList); + localStorage.setItem(key, JSON.stringify(newList)); console.log("removed ", script); }; - const toggle = async (script) => { - let exist = await has(script); - if (exist) await remove(script); - else await add(script); + const toggle = (script) => { + let exist = has(script); + if (exist) remove(script); + else add(script); }; - const clear = async () => { - await localStorage.set(key, []); + const clear = () => { + localStorage.setItem(key, "[]"); }; - const get = async () => - (await getIds()).map((savedScriptId) => allScripts[savedScriptId]); + const get = () => getIds().map((savedScriptId) => allScripts[savedScriptId]); return { add, remove, has, toggle, clear, getIds, get }; }; diff --git a/popup/helpers/utils.js b/popup/helpers/utils.js index d8adecd9..70740159 100644 --- a/popup/helpers/utils.js +++ b/popup/helpers/utils.js @@ -1,17 +1,43 @@ -import { t } from "./lang.js"; +import { ClickType, Events } from "../../scripts/helpers/constants.js"; +import { isFunction } from "../../scripts/helpers/utils.js"; -export function viewScriptSource(script) { - localStorage.viewScriptSource_sharedData = JSON.stringify({ - name: t(script.name), - id: script.id, - description: t(script.description), - source: script.func?.toString(), - }); +export const canClick = (script) => + isFunction(script[ClickType.onClick]) || + isFunction(script[ClickType.onClickExtension]) || + isFunction(script[ClickType.onClickContentScript]); + +export const canAutoRun = (script) => + Events.onDocumentStart in script || + Events.onDocumentIdle in script || + Events.onDocumentEnd in script; + +export const isTitle = (script) => !(canAutoRun(script) || canClick(script)); + +export async function viewScriptSource(script) { + localStorage.viewScriptSource_sharedData = script.id; chrome.windows.create({ url: chrome.runtime.getURL("pages/viewScriptSource/index.html"), type: "popup", - height: 450, + height: window.screen.height, width: 700, }); -} \ No newline at end of file +} + +export async function updateScriptClickCount(scriptId) { + return; // TODO remove this before commit + try { + let res = await fetch( + "https://useful-script-statistic.onrender.com/count", + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ script: scriptId }), + } + ); + return await res.text(); + } catch (e) { + console.log("ERROR update script click count: ", e); + return null; + } +} diff --git a/popup/index.js b/popup/index.js index a9836240..89baeaf9 100644 --- a/popup/index.js +++ b/popup/index.js @@ -1,9 +1,13 @@ +import { MsgType } from "../scripts/helpers/constants.js"; import { checkBlackWhiteList, - GlobalBlackList, - isExtensionInSeperatedPopup, - openExtensionInSeparatedPopup, + isActiveScript, + getCurrentTab, + isFunction, + removeAccents, runScriptInCurrentTab, + sendEventToTab, + toggleActiveScript, } from "../scripts/helpers/utils.js"; import { allScripts } from "../scripts/index.js"; import { checkForUpdate } from "./helpers/checkForUpdate.js"; @@ -14,27 +18,28 @@ import { favoriteScriptsSaver, recentScriptsSaver, } from "./helpers/storage.js"; -import { viewScriptSource } from "./helpers/utils.js"; import { - isFunc, - isLink, + canAutoRun, + canClick, isTitle, - refreshSpecialTabs, - getAllTabs, -} from "./tabs.js"; -// import _ from "../md/exportScriptsToMd.js"; + updateScriptClickCount, + viewScriptSource, +} from "./helpers/utils.js"; +import { refreshSpecialTabs, getAllTabs } from "./tabs.js"; +import _ from "../md/exportScriptsToMd.js"; const tabDiv = document.querySelector("div.tab"); const contentDiv = document.querySelector("div.content"); const flagImg = document.querySelector("img#flag"); -const openInNewTabBtn = document.querySelector("#open-in-new-tab"); +const searchInput = document.querySelector(".search input"); +const searchFound = document.querySelector(".search .searchFound"); -async function initLanguage() { - flagImg.setAttribute("src", await getFlag()); +function initLanguage() { + flagImg.setAttribute("src", getFlag()); - flagImg.onclick = async () => { - await toggleLang(); - flagImg.setAttribute("src", await getFlag()); + flagImg.onclick = () => { + toggleLang(); + flagImg.setAttribute("src", getFlag()); // reset UI createTabs(); @@ -42,9 +47,9 @@ async function initLanguage() { }; } -async function createTabs() { +function createTabs() { // prepare tabs - await refreshSpecialTabs(); + refreshSpecialTabs(); // clear UI tabDiv.innerHTML = ""; @@ -81,7 +86,7 @@ async function createTabs() { } // open tab - let activeTabId = await activeTabIdSaver.get(); + let activeTabId = activeTabIdSaver.get(); activeTabId && openTab(allTabs.find((tab) => tab.id === activeTabId)); } @@ -98,6 +103,15 @@ async function openTab(tab) { } async function createTabContent(tab) { + // search bar + let scriptsCount = tab.scripts.filter((_) => !isTitle(_)).length; + searchInput.value = ""; + searchInput.placeholder = t({ + vi: "Tìm trong " + scriptsCount + " chức năng...", + en: "Search in " + scriptsCount + " scripts...", + }); + searchInput.focus?.(); + // create tab content const contentContainer = document.createElement("div"); contentContainer.className = "tabcontent"; @@ -113,7 +127,7 @@ async function createTabContent(tab) { }); contentContainer.appendChild(emptyText); } else { - const favoriteScriptIds = await favoriteScriptsSaver.getIds(); + const favoriteScriptIds = favoriteScriptsSaver.getIds(); tab.scripts.forEach((script) => { let isFavorite = favoriteScriptIds.find((id) => script.id === id); contentContainer.appendChild(createScriptButton(script, isFavorite)); @@ -135,16 +149,39 @@ function createScriptButton(script, isFavorite = false) { return title; } - // Button + // Button Container + const buttonContainer = document.createElement("div"); + buttonContainer.className = "buttonContainer"; + + // button checker + if (canAutoRun(script)) { + const checkmark = document.createElement("button"); + checkmark.className = "checkmark tooltip"; + checkmark.onclick = async (e) => { + let newValue = toggleActiveScript(script.id); + newValue && updateScriptClickCount(script.id); + updateButtonChecker(script, buttonContainer, newValue); + }; + + buttonContainer.appendChild(checkmark); + updateButtonChecker(script, buttonContainer); + } + + // button const button = document.createElement("button"); button.className = "tooltip"; - - if (isFunc(script)) { + if (canClick(script)) { button.onclick = () => runScript(script); - } else if (isLink(script)) { - button.onclick = () => window.open(script.link); + } else if (canAutoRun(script)) { + button.onclick = () => + alert( + t({ + vi: "Chức năng này tự động chạy.\nTắt/Mở tự chạy bằng nút bên trái.\nSau đó tải lại trang web.", + en: "This function is Autorun.\nTurn on/off autorun by click the left checkmark.\nThen reload the webpage.", + }) + ); } else { - button.onclick = () => alert("empty script"); + alert(t({ vi: "Chức năng chưa hoàn thành", en: "Coming soon" })); } // script badges @@ -194,68 +231,113 @@ function createScriptButton(script, isFavorite = false) { title.innerHTML = t(script.name); button.appendChild(title); - if (isFunc(script)) { - // add to favorite button - const addFavoriteBtn = document.createElement("i"); - addFavoriteBtn.className = isFavorite - ? "fa-solid fa-star star active" - : "fa-regular fa-star star"; - addFavoriteBtn.title = isFavorite - ? t({ - en: "Remove from favorite", - vi: "Xoá khỏi yêu thích", - }) - : t({ - en: "Add to farovite", - vi: "Thêm vào yêu thích", - }); - addFavoriteBtn.onclick = (e) => { - e.stopPropagation(); - e.preventDefault(); - favoriteScriptsSaver.toggle(script).then(createTabs); - }; - button.appendChild(addFavoriteBtn); - - // view source button - const viewSourceBtn = document.createElement("i"); - viewSourceBtn.title = t({ - en: "View script source", - vi: "Xem mã nguồn", + // what this? button + if (typeof script.infoLink === "string") { + const infoBtn = document.createElement("i"); + infoBtn.className = "fa-regular fa-circle-question"; + infoBtn.title = t({ + en: "View info/demo", + vi: "Xem giới thiệu/demo", }); - viewSourceBtn.className = "fa-solid fa-code view-source"; - viewSourceBtn.onclick = (e) => { + infoBtn.onclick = (e) => { e.stopPropagation(); e.preventDefault(); - - viewScriptSource(script); - // openModal(t(script.name), `
${script.func?.toString()}
`); + window.open(script.infoLink); }; - button.appendChild(viewSourceBtn); + button.appendChild(infoBtn); } + // add to favorite button + const addFavoriteBtn = document.createElement("i"); + addFavoriteBtn.className = isFavorite + ? "fa-solid fa-star star active" + : "fa-regular fa-star star"; + addFavoriteBtn.title = isFavorite + ? t({ + en: "Remove from favorite", + vi: "Xoá khỏi yêu thích", + }) + : t({ + en: "Add to farovite", + vi: "Thêm vào yêu thích", + }); + addFavoriteBtn.onclick = (e) => { + e.stopPropagation(); + e.preventDefault(); + favoriteScriptsSaver.toggle(script); + createTabs(); + }; + button.appendChild(addFavoriteBtn); + + // view source button + const viewSourceBtn = document.createElement("i"); + viewSourceBtn.title = t({ + en: "View script source", + vi: "Xem mã nguồn", + }); + viewSourceBtn.className = "fa-solid fa-code view-source"; + viewSourceBtn.onclick = (e) => { + e.stopPropagation(); + e.preventDefault(); + + viewScriptSource(script); + }; + button.appendChild(viewSourceBtn); + // tooltip const tooltip = document.createElement("span"); tooltip.classList.add("tooltiptext"); tooltip.innerText = t(script.description); button.appendChild(tooltip); - return button; + buttonContainer.appendChild(button); + return buttonContainer; +} + +function updateButtonChecker(script, button, val) { + let checkmark = button.querySelector(".checkmark"); + if (!checkmark) return; + if (val ?? isActiveScript(script.id)) { + checkmark.classList.add("active"); + checkmark.title = t({ + vi: "Tắt tự động chạy", + en: "Turn off Autorun", + }); + } else { + checkmark.classList.remove("active"); + checkmark.title = t({ + vi: "Bật tự động chạy", + en: "Turn on Autorun", + }); + } } async function runScript(script) { - let willRun = await checkBlackWhiteList(script); + let tab = await getCurrentTab(); + let willRun = checkBlackWhiteList(script, tab.url); if (willRun) { - recentScriptsSaver.add(script); - if (script.runInExtensionContext) script.func(); - else runScriptInCurrentTab(script.func); + try { + recentScriptsSaver.add(script); + updateScriptClickCount(script.id); + if (isFunction(script.onClickExtension)) await script.onClickExtension(); + if (isFunction(script.onClick)) + await runScriptInCurrentTab(script.onClick); + if (isFunction(script.onClickContentScript)) + await sendEventToTab(tab.id, { + type: MsgType.runScript, + scriptId: script.id, + }); + } catch (e) { + console.log("ERROR: run script", e); + } } else { let w = script?.whiteList?.join(", "); - let b = [...(script?.blackList || []), ...GlobalBlackList]?.join(", "); + let b = script?.blackList?.join(", "); openModal( t({ - en: `Script not supported in current website`, - vi: `Script không hỗ trợ website hiện tại`, + en: `Script not supported in current website (${tab.url})`, + vi: `Script không hỗ trợ website hiện tại (${tab.url})`, }), t({ en: @@ -269,21 +351,41 @@ async function runScript(script) { } } -function initOpenInNewTabBtn() { - if (isExtensionInSeperatedPopup()) { - document.title = "Useful Scripts"; - openInNewTabBtn.remove(); - } else { - openInNewTabBtn.onclick = () => { - openExtensionInSeparatedPopup(); - window.close(); - }; - } +function initSearch() { + searchInput.addEventListener("input", (event) => { + let keyword = event.target.value; + let found = 0; + let childrens = document + .querySelector(".tabcontent") + .querySelectorAll(".buttonContainer"); + + childrens.forEach((child) => { + let willShow = true; + let text = removeAccents(child.textContent).toLowerCase(); + let searchStr = removeAccents(keyword) + .toLowerCase() + .split(" ") + .filter((_) => _); + + for (let s of searchStr) { + if (text.indexOf(s) == -1) { + willShow = false; + break; + } + } + child.style.display = willShow ? "block" : "none"; + if (willShow) found++; + }); + searchFound.innerText = keyword + ? `${found}/${childrens.length} scripts` + : ""; + }); } (async function () { - initOpenInNewTabBtn(); - await initLanguage(); - await createTabs(); + // initOpenInNewTabBtn(); + initSearch(); + initLanguage(); + createTabs(); await checkForUpdate(); })(); diff --git a/popup/main.js b/popup/main.js new file mode 100644 index 00000000..c19f610c --- /dev/null +++ b/popup/main.js @@ -0,0 +1,3 @@ +import("./index.js").then(() => { + document.querySelector("#loading-fullscreen")?.remove(); +}); diff --git a/popup/popup.html b/popup/popup.html index 4a49d4a5..ff5200cd 100644 --- a/popup/popup.html +++ b/popup/popup.html @@ -1,10 +1,11 @@ -
+ + -
+

Useful Scripts

@@ -20,12 +21,17 @@

Make with by Hoang Tran

-
+ + +
@@ -33,10 +39,6 @@

- - - + +
+
+
+ + + + \ No newline at end of file diff --git a/popup/styles/style.css b/popup/styles/style.css index 88013733..447197c4 100644 --- a/popup/styles/style.css +++ b/popup/styles/style.css @@ -37,10 +37,12 @@ div { html, body { - min-width: 350px; background-color: #e6e6e6; + min-width: 370px; + min-height: 600px; } + h1, h3 { text-align: center; @@ -97,7 +99,6 @@ a:hover { /* ---------- Tab button ---------- */ .tab { - overflow: hidden; background-color: #cccccc; overflow: auto; } @@ -120,6 +121,35 @@ a:hover { background-color: #a8a8a8; } +/* ---------- Search --------- */ +.search { + padding: 5px; + position: sticky; + top: 0; + z-index: 4; + background-color: inherit; +} + +.search input[type='text'] { + border: none; + padding: 5px 10px; + width: 50%; + text-align: center; + background-color: #f5f5f5; + width: 100%; +} + +.search .searchFound { + position: absolute; + right: 0; + top: 0; + padding: 5px; + text-align: right; + font-size: 14px; + border-radius: 5px; + background-color: #dddd; +} + /* ---------- Content & content button ---------- */ .tabcontent { padding: 6px; @@ -134,15 +164,20 @@ a:hover { .section-title { padding: 10px 0 5px; position: sticky; - top: 0; + top: 30px; background-color: #e6e6e6; - z-index: 1; + z-index: 2; margin-top: 15px; margin-bottom: 10px; } +.content .buttonContainer { + display: flex; + align-items: center; +} + .content button { - display: block; + position: relative; border: none; margin: 0.25em; padding: 0.75em 1em; @@ -154,7 +189,7 @@ a:hover { .content button:hover { background-color: #a8a8a8; cursor: pointer; - z-index: 2; + z-index: 3; } .content button:active { @@ -163,7 +198,8 @@ a:hover { } .content button i.star, -.content button i.view-source { +.content button i.view-source, +.content button i.fa-circle-question { opacity: 0; width: 0; transition: all .2s; @@ -174,13 +210,15 @@ a:hover { } .content button i.star:hover, -.content button i.view-source:hover { +.content button i.view-source:hover, +.content button i.fa-circle-question:hover { transform: scale(1.8); } .content button:hover i.star, .content button i.star.active, -.content button:hover i.view-source { +.content button:hover i.view-source, +.content button:hover i.fa-circle-question { width: auto; margin-left: 5px; opacity: 1; @@ -203,6 +241,39 @@ a:hover { margin-right: 5px; } +.content .checkmark { + display: inline-block; + width: 25px; + height: 25px; + padding: 0; + margin: 0px; + border: 1px solid #999; + background-color: #e6e6e6; +} + +.content .checkmark:hover { + background-color: #ccc; +} + +.content .checkmark.active { + background-color: #04AA6D; +} + +.content .checkmark.active:after { + content: ""; + position: absolute; + display: block; + left: 8px; + top: 4px; + width: 5px; + height: 10px; + border: solid white; + border-width: 0 3px 3px 0; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} + .content button .badgeContainer { position: absolute; top: 0; @@ -257,7 +328,7 @@ a:hover { visibility: visible; top: 105%; opacity: 1; - transition: all .3s linear .7s; + transition: all .3s linear .3s; } .tooltip .tooltiptext::after { @@ -276,13 +347,15 @@ a:hover { .modal { display: none; position: fixed; - z-index: 3; + z-index: 4; left: 0; top: 0; width: 100vw; height: 100vh; background-color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0.4); + -webkit-backdrop-filter: blur(.1rem); + backdrop-filter: blur(.1rem); } .modal-content { @@ -320,11 +393,129 @@ a:hover { overflow: auto; } +/* --------- Loading --------- */ +#loading-fullscreen { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: #e8e8e8db; + -webkit-backdrop-filter: blur(.1rem); + backdrop-filter: blur(.1rem); +} + +.loading-container { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: #333e; + display: flex; + justify-content: center; + align-items: center; + z-index: 5; + -webkit-backdrop-filter: blur(.1rem); + backdrop-filter: blur(.1rem); +} + +.loading-container .text { + color: white; +} + +.loading-container .loader { + border: 5px solid #f3f3f3; + border-top: 5px solid #3498db; + animation: spin 1s linear infinite; + border-radius: 50%; + width: 30px; + height: 30px; + margin: 0 auto 5px; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +/* --------- Popup --------- */ +.popup-container { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: #333e; + display: flex; + justify-content: center; + align-items: center; + z-index: 5; +} + +.popup-inner-container { + position: relative; + max-width: 100vw; + max-height: 100vh; + padding: 10px; + background: #eee; + overflow: auto; +} + +.popup-container .close-btn { + position: absolute; + top: 0px; + right: 0px; + background: #e22; + color: white; + padding: 5px 10px; + border: none; + cursor: pointer; + max-width: 95%; + max-height: 95%; +} + +/* --------- border fancy --------- */ +.border-fancy:after { + content: ""; + background: linear-gradient(45deg, red, #ff9a00 10%, #d0de21 20%, #4fdc4a 30%, #3fdad8 40%, #2fc9e2 50%, #1c7fee 60%, #5f15f2 70%, #ba0cf8 80%, #fb07d9 90%, red) repeat 0% 0%/300% 100%; + position: absolute; + inset: -1px; + border-radius: 8px; + -webkit-filter: blur(8px); + filter: blur(8px); + -webkit-transform: translateZ(-1px); + transform: translateZ(-1px); + -webkit-animation: border-fancy 6s linear infinite; + animation: border-fancy 6s linear infinite; + pointer-events: none; + z-index: -1; +} + +@keyframes border-fancy { + 0% { + background-position: 0 50% + } + + 50% { + background-position: 100% 50% + } + + to { + background-position: 0 50% + } +} + /* --------- scrollbar --------- */ /* width */ ::-webkit-scrollbar { - width: 10px; - height: 10px; + width: 7px; + height: 7px; } /* Track */ diff --git a/popup/tabs.js b/popup/tabs.js index 15b37eb9..d689529b 100644 --- a/popup/tabs.js +++ b/popup/tabs.js @@ -1,33 +1,25 @@ import { allScripts as s } from "../scripts/index.js"; import { CATEGORY } from "./helpers/category.js"; -import { addBadge, BADGES } from "./helpers/badge.js"; import { favoriteScriptsSaver, recentScriptsSaver } from "./helpers/storage.js"; -import { getAvailableScripts } from "../scripts/helpers/utils.js"; +import { canAutoRun } from "./helpers/utils.js"; const createTitle = (en, vi) => ({ name: { en, vi } }); -const isFunc = (script) => script.func && typeof script.func === "function"; -const isLink = (script) => script.link && typeof script.link === "string"; -const isTitle = (script) => !isFunc(script) && !isLink(script); const specialTabs = [ { - ...CATEGORY.recently, - scripts: [], - }, - { - ...CATEGORY.favorite, + ...CATEGORY.all, scripts: [], }, { - ...CATEGORY.hot, + ...CATEGORY.recently, scripts: [], }, { - ...CATEGORY.new, + ...CATEGORY.favorite, scripts: [], }, { - ...CATEGORY.available, + ...CATEGORY.autorun, scripts: [], }, ]; @@ -36,13 +28,16 @@ const tabs = [ { ...CATEGORY.search, scripts: [ + s.search_userscript, s.whatFont, s.similarWeb, s.search_sharedAccount, s.whatWebsiteStack, s.whois, s.viewWebMetaInfo, + s.search_musicTreding, s.search_paperWhere, + s.search_hopamchuan, s.checkWebDie, s.downDetector, s.openWaybackUrl, @@ -54,34 +49,73 @@ const tabs = [ scripts: [ s.getLinkLuanxt, s.getFavicon, + // s.bookmark_exporter, createTitle("--- Music ---", "--- Nhạc ---"), - s.download_audio, + s.showTheAudios, + // s.soundcloud_downloadMusic, s.nhaccuatui_downloader, s.zingmp3_downloadMusic, s.zingmp3_oldLayout, + s.freesound_downloadAudio, createTitle("--- Videos ---", "--- Video ---"), - s.download_video, - s.download_video2, + s.savevideo_me, + s.vimeo_downloader, + s.showTheVideos, createTitle("--- Photos ---", "--- Ảnh ---"), + s.whatApp_storySaver, s.showTheImages, s.download_image, + createTitle("--- Document ---", "--- Tài liệu ---"), + s.docDownloader, + s.scribd_downloadDocuments, + s.studocu_dl, + s.studocu_downs, ], }, { ...CATEGORY.google, scripts: [ - // s.google_downloadDriveVideo, + createTitle("--- Download ---", "--- Tải xuống ---"), + s.ggdrive_generateDirectLink, + s.ggdrive_downloadVideo, + s.google_downloadAllYourData, + createTitle("--- Bulk Download ---", "--- Tải hàng loạt ---"), + s.ggDrive_downloadAllVideosInFolder, + createTitle("--- More ---", "--- Khác ---"), s.search_totalIndexedPages, s.search_googleSite, s.googleShortcuts, s.googleCache, + s.google_mirror, ], }, { ...CATEGORY.facebook, scripts: [ + createTitle("--- Hot ---", "--- Nổi bật ---"), + s.fb_revealDeletedMessages, + s.fb_invisible_message, + s.fb_moreReactionStory, + s.fb_whoIsTyping, + // s.fb_messengerHistory, + s.fb_messengerCount, createTitle("--- UI ---", "--- Giao diện ---"), s.fb_toggleLight, + s.fb_toggleNewFeed, + createTitle("--- Download ---", "--- Tải xuống ---"), + s.fb_downloadWatchingVideo, + s.fb_storySaver, + s.fb_downloadCommentVideo, + s.fb_videoDownloader, + s.fb_getAvatarFromUid, + // s.fb_storyInfo, + createTitle("--- Bulk Download ---", "--- Tải hàng loạt ---"), + s.fb_downloadAlbumMedia, + s.fb_exportSaved, + createTitle("--- Security ---", "--- Bảo mật ---"), + s.fb_removeFbclid, + s.fb_antiPhishing, + s.anti_clickjacking, createTitle("--- Access Token ---", "--- Access Token ---"), s.fb_checkToken, s.fb_getTokenFfb, @@ -90,33 +124,32 @@ const tabs = [ s.fb_getTokenCampaigns, s.fb_getTokenFacebook, s.fb_getTokenMFacebook, - s.fb_getTokenLocmai, createTitle("--- Get ID ---", "--- Lấy ID ---"), s.fb_getUid, s.fb_getPageId, s.fb_getGroupId, s.fb_getAlbumId, - s.fb_getTimelineAlbumId, - s.fb_getAllVideoId, s.fb_getAllAlbumId, s.fb_getUidFromUrl, s.fb_getAllUidFromFbSearch, s.fb_getAllUidFromFriendsPage, s.fb_getAllUidOfGroupMembers, - createTitle("--- Download ---", "--- Tải xuống ---"), - s.fb_videoDownloader, - s.fb_getAvatarFromUid, - s.fb_downloadAlbumMedia, + createTitle("--- Shortcut ---", "--- Phím tắt ---"), + s.fb_openSaved, + s.fb_openMemories, + s.fb_openAdsActivities, ], }, { ...CATEGORY.instagram, scripts: [ - // s.insta_reloaded, + s.insta_injectDownloadBtn, s.insta_getToken, s.insta_getUserInfo, createTitle("--- Download ---", "--- Tải xuống ---"), s.instantgram, + s.insta_storySaver, + createTitle("--- Bulk Download ---", "--- Tải hàng loạt ---"), s.insta_getAllUserMedia, s.insta_getAllImagesInNewFeed, s.insta_getAllImagesInUserProfile, @@ -130,14 +163,22 @@ const tabs = [ s.youtube_toggleLight, s.youtube_viewDislikes, s.youtube_nonstop, - s.youtube_popupPlayer, ], }, { ...CATEGORY.tiktok, scripts: [ + createTitle("--- Tiktok ---", "--- Tiktok ---"), + s.tiktok_downloadWatchingVideo, s.tiktok_downloadVideo, + s.tiktok_snaptikApp, + s.tiktok_snaptikVideo, + createTitle("--- Douyin ---", "--- Douyin ---"), + s.douyin_downloadWachingVideo, s.douyin_downloadVideo, + createTitle("--- Bulk Download ---", "--- Tải hàng loạt ---"), + s.tiktok_downloadUserVideos, + s.douyin_downloadAllVideoUser, createTitle("--- Doutu.be ---", "--- Doutu.be ---"), s.doutube_enableDownloadVideo, s.doutube_downloadWatchingVideo, @@ -145,45 +186,64 @@ const tabs = [ s.doutube_getAllVideoInUserProfile, ], }, + { + ...CATEGORY.shopping, + scripts: [ + s.shopee_topVariation, + s.shopee_totalSpendMoney, + s.tiki_totalSpendMoney, + ], + }, { ...CATEGORY.github, - scripts: [s.github_goToFirstCommit, s.githubdev, s.github1s], + scripts: [s.github_goToAnyCommit, s.githubdev, s.github1s], }, { ...CATEGORY.automation, scripts: [ + s.shortenURL, + s.unshorten, + s.changeAudioOutput, + createTitle("--- QRCode ---", "--- QRCode ---"), s.textToQRCode, s.webToQRCode, + createTitle("--- Auto ---", "--- Tự động ---"), + s.passwordGenerator, s.getAllEmailsInWeb, s.screenshotFullPage, - s.webToPDF, - s.transfer_sh, s.jsonformatter, s.performanceAnalyzer, s.scrollToVeryEnd, - ], - }, - { - ...CATEGORY.password, - scripts: [ - s.passwordGenerator, - s.search_sharedAccount, - s.passwordFieldToggle, + s.dino_hack, + createTitle("--- PDF ---", "--- PDF ---"), + s.webToPDF, + s.fastDoc, + s.smartPDF, + s.pdfstuffs, + createTitle("--- Share ---", "--- Chia sẻ ---"), + s.send_shareFiles, + s.transfer_sh, ], }, { ...CATEGORY.unlock, scripts: [ - s.shortenURL, - s.unshorten, - s.viewBrowserInfo, + createTitle("--- Unlock web ---", "--- Mở khoá web ---"), + s.donotBlockMe, + s.envato_bypassPreview, + s.scribd_bypassPreview, + s.studyphim_unlimited, + s.studocu_bypassPreview, + createTitle("--- Unlock function ---", "--- Mở khoá chức năng ---"), + s.detect_zeroWidthCharacters, + s.simpleAllowCopy, + s.reEnableContextMenu, s.showHiddenFields, + s.passwordFieldToggle, s.viewCookies, s.removeCookies, - s.enableTextSelection, - s.reEnableContextMenu, + s.viewBrowserInfo, s.injectScriptToWebsite, - s.paywallKiller, ], }, { @@ -222,33 +282,39 @@ const recommendTab = { ...CATEGORY.recommend, scripts: [ { name: { en: "--- Same author ---", vi: "--- Cùng tác giả ---" } }, - addBadge( - { - icon: "https://github.com/HoangTran0410/RevealDeletedFBMessages/raw/master/icons/icon48.png", - name: { - en: "Reveal Deleted FB Message", - vi: "Xem tin nhắn FB bị gỡ", - }, - description: { - en: "Know what your friends have sent you", - vi: "Xem bạn bè đã gửi gì cho bạn", - }, - link: "https://github.com/HoangTran0410/RevealDeletedFBMessages", + { + icon: "https://github.com/HoangTran0410/RevealDeletedFBMessages/raw/master/icons/icon48.png", + name: { + en: "Reveal Deleted FB Message", + vi: "Xem tin nhắn FB bị gỡ", + }, + description: { + en: "Know what your friends have sent you", + vi: "Xem bạn bè đã gửi gì cho bạn", }, - BADGES.hot - ), - addBadge( - { - icon: "https://www.facebook.com/favicon.ico", - name: { en: "FB Media Downloader", vi: "FB Media Downloader" }, - description: { - en: "Tool download media from facebook automatic", - vi: "Công cụ tải ảnh/video từ facebook tự động cực nhanh", - }, - link: "https://github.com/HoangTran0410/FBMediaDownloader", + onClickExtension: () => + window.open("https://github.com/HoangTran0410/RevealDeletedFBMessages"), + }, + { + icon: "https://www.facebook.com/favicon.ico", + name: { en: "FB Media Downloader", vi: "FB Media Downloader" }, + description: { + en: "Tool download media from facebook automatic", + vi: "Công cụ tải ảnh/video từ facebook tự động cực nhanh", }, - BADGES.hot - ), + onClickExtension: () => + window.open("https://github.com/HoangTran0410/FBMediaDownloader"), + }, + { name: { en: "--- Web ---", vi: "--- Web hay ---" } }, + { + icon: "https://you.com/favicon/apple-touch-icon-72x72.png", + name: { en: "You.com", vi: "You.com" }, + description: { + en: "The AI Search Engine You Control", + vi: "Trình tìm kiếm sử dụng trí tuệ nhân tạo", + }, + onClickExtension: () => window.open("https://you.com/"), + }, { name: { en: "--- Extensions ---", vi: "--- Extensions hay ---" } }, { icon: "https://lh3.googleusercontent.com/2GdtpZt9NWFkfrfLZnWL2gM2UdCOsgpQhhdxSx4wPw5Iz10NcT433g3iHyAAZ8J-ZCyz3gwLKR1kJQC0PidRVKKJ1Ws=w128-h128-e365-rj-sc0x00ffffff", @@ -257,7 +323,10 @@ const recommendTab = { en: "Use fb better with more security and tools", vi: "Dùng fb sướng hơn bao giờ hết", }, - link: "https://chrome.google.com/webstore/detail/j2team-security/hmlcjjclebjnfohgmgikjfnbmfkigocc", + onClickExtension: () => + window.open( + "https://chrome.google.com/webstore/detail/j2team-security/hmlcjjclebjnfohgmgikjfnbmfkigocc" + ), }, { icon: "https://lh3.googleusercontent.com/fD5QA80tZj1up43xmnxnxiqKNEq7515-HNtLfjoZlz_I626zxXmjlhKaQPUme_evpCEnN5-U7VnG3VfOcnTPzv_i=w128-h128-e365-rj-sc0x00ffffff", @@ -266,7 +335,10 @@ const recommendTab = { en: "View/Download source code of any extension", vi: "Xem/Tải source code của mọi extension", }, - link: "https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin", + onClickExtension: () => + window.open( + "https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin" + ), }, { icon: "https://lh3.googleusercontent.com/nnMASpwJY4U5ukhKl4PfIdaOpuKXNrVvfIc9n8-NJOJIY7m3RLgsazN6ATmDkXyaMll8zADOXuBR574MwC7T71kJcQ=w128-h128-e365-rj-sc0x00ffffff", @@ -275,7 +347,10 @@ const recommendTab = { en: "Block advertisements for all website", vi: "Chặn quảng cáo cho mọi website", }, - link: "https://chrome.google.com/webstore/detail/adblock-plus-free-ad-bloc/cfhdojbkjhnklbpkdaibdccddilifddb", + onClickExtension: () => + window.open( + "https://chrome.google.com/webstore/detail/adblock-plus-free-ad-bloc/cfhdojbkjhnklbpkdaibdccddilifddb" + ), }, { icon: "https://lh3.googleusercontent.com/3ZU5aHnsnQUl9ySPrGBqe5LXz_z9DK05DEfk10tpKHv5cvG19elbOr0BdW_k8GjLMFDexT2QHlDwAmW62iLVdek--Q=w128-h128-e365-rj-sc0x00ffffff", @@ -284,31 +359,25 @@ const recommendTab = { en: "Instant translation for all website", vi: "Dịch nhanh, trực tiếp trong mọi website", }, - link: "https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb", + onClickExtension: () => + window.open( + "https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb" + ), }, { - icon: "https://lh3.googleusercontent.com/_l4UaD5Gwub2AwFZdomRpfMD2737y0Ow6k2sfVuWdm0fQ0iGSdEfhd9X77taeQ-0VM6Wi3HnpecLWUAI9uHq11TSktw=w128-h128-e365-rj-sc0x00ffffff", + icon: "https://lh3.googleusercontent.com/M_2Q8eJAj1ejsRg30LuJs_Q94Jk7d-6ZbE5cyddULweH5LrfsVJtjK8zbpSjwA3G9oHwZeyHyrYrr971kqLwtNNP=w128-h128-e365-rj-sc0x00ffffff", name: { - en: "Read Aloud: Text to speech voice reader", - vi: "Read Aloud: Đọc cho tôi nghe", + en: "NSFW Filter: Hide NSFW content", + vi: "NSFW Filter: Ẩn nội dung 18+", }, description: { - en: "Read aloud website content, multilanguage", - vi: "Đọc nội dung trang web, đa ngôn ngữ", + en: "Hide NSFW content from websites using this extension powered by AI", + vi: "Ẩn mọi nội dung 18+ trên website, sử dụng trí tuệ nhân tạo", }, - link: "https://chrome.google.com/webstore/detail/read-aloud-a-text-to-spee/hdhinadidafjejdhmfkjgnolgimiaplp", - }, - { - icon: "https://lh3.googleusercontent.com/s-86QIqiZeS3NSGiw95oJAm9ExGyUat2oF3hqOu4xVypfn18HX6LYNwJUtKoSYFRtf4-qBSvBYr41ZZWPqbh5Hh-xrQ=w128-h128-e365-rj-sc0x00ffffff", - name: { - en: "Video Downloader professional", - vi: "Video Downloader professional", - }, - description: { - en: "Download video from almost any websites", - vi: "Tải video từ hầu như mọi website", - }, - link: "https://chrome.google.com/webstore/detail/video-downloader-professi/elicpjhcidhpjomhibiffojpinpmmpil", + onClickExtension: () => + window.open( + "https://chrome.google.com/webstore/detail/nsfw-filter/kmgagnlkckiamnenbpigfaljmanlbbhh" + ), }, { icon: "https://lh3.googleusercontent.com/tGvFFAf_mkjk-mfiRipdYU_WTMCZSReAy4opGxvWJppyHzHTKy6f1NO1tSpV998-ZcKJjPOWpWbtEFLEMr0Y_SyBKA=w128-h128-e365-rj-sc0x00ffffff", @@ -320,7 +389,10 @@ const recommendTab = { en: "Video, Story, download with one click", vi: "Tải video, story facebook với 1 nút nhấn", }, - link: "https://chrome.google.com/webstore/detail/dyl-download-facebook-vid/honmapcmnfgjmahijdniaaollhhfpcnj?hl=vi", + onClickExtension: () => + window.open( + "https://chrome.google.com/webstore/detail/dyl-download-facebook-vid/honmapcmnfgjmahijdniaaollhhfpcnj?hl=vi" + ), }, { icon: "https://lh3.googleusercontent.com/T66wTLk-gpBBGsMm0SDJJ3VaI8YM0Utr8NaGCSANmXOfb84K-9GmyXORLKoslfxtasKtQ4spDCdq_zlp_t3QQ6SI0A=w128-h128-e365-rj-sc0x00ffffff", @@ -329,7 +401,10 @@ const recommendTab = { en: "Darkmode for every website", vi: "Chế độ tối cho mọi trang web", }, - link: "https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh", + onClickExtension: () => + window.open( + "https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh" + ), }, { icon: "https://lh3.googleusercontent.com/QeCUs-fM4mwAmBVRS0VU8NrjJnDnbSsXoqUrCbd8ZbHou03FBPEQOYHAcdcL_rn7NMrUpWMcXoG2m_CrKtAhc-wLgLU=w128-h128-e365-rj-sc0x00ffffff", @@ -338,17 +413,7 @@ const recommendTab = { en: "Check deals/prices in ecommerce websites", vi: "Kiểm tra giá/ưu đãi giả khi mua hàng online", }, - link: "https://beecost.vn/", - }, - - { - icon: "https://lh3.googleusercontent.com/ZzWGiT5YRGYjeltQ5vkZmsLAQ7Qj4eQnltDmE34KyUnGKNofHRqPF_cy19i2rc58sajKbamz-9rX2BZ2zXgPUm0e2g=w128-h128-e365-rj-sc0x00ffffff", - name: { en: "Web Developer", vi: "Web Developer" }, - description: { - en: "Adds a toolbar button with various web developer tools.", - vi: "Các công cụ hay cho web developer", - }, - link: "https://chrome.google.com/webstore/detail/web-developer/bfbameneiokkgbdmiekhjnmfkcnldhhm", + onClickExtension: () => window.open("https://beecost.vn/"), }, { icon: "https://lh3.googleusercontent.com/wafm5uFaPRSo1RHMbhcdEghFzTPUfYo5GosPmBhkdNuYlGz8WigoAQM-8lulzuhWQBGTbbUyRvfoyIMDypJzuAVZ=w128-h128-e365-rj-sc0x00ffffff", @@ -357,31 +422,7 @@ const recommendTab = { en: "Filetree for github", vi: "Cây thư mục cho github", }, - link: "https://www.octotree.io/", - }, - { - icon: "https://lh3.googleusercontent.com/J7n7qDIrekKpjDDP-oLo03rvP2drIRqOqTDdSK5MyUBhE2UCkYx1LXurAVNA_4lgHCkdZUtnVaEt0SvGed9gaSKhAA=w128-h128-e365-rj-sc0x00ffffff", - name: { - en: "Omni - Bookmark, History & Tab Manager", - vi: "Omni - Bookmark, History & Tab Manager", - }, - description: { - en: "Supercharge Chrome with commands, shortcuts, and more", - vi: "Dùng trình duyệt nhanh hơn với commands và phím tắt", - }, - link: "https://chrome.google.com/webstore/detail/omni-bookmark-history-tab/mapjgeachilmcbbokkgcbgpbakaaeehi", - }, - { - icon: "https://lh3.googleusercontent.com/3hxmIF_t-oFuV8LAApMFpHs3Rexrox5ftHat7uwJuhV8ORGlyDRadqZG0HiY-q56HA70HT6C-8c1Z9BgbcjSJMaa8w=w128-h128-e365-rj-sc0x00ffffff", - name: { - en: "ColorZilla", - vi: "ColorZilla", - }, - description: { - en: "Advanced Eyedropper, Color Picker, Gradient Generator and other colorful goodies", - vi: "Trích xuất màu từ trang web", - }, - link: "https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp", + onClickExtension: () => window.open("https://www.octotree.io/"), }, ], }; @@ -407,42 +448,21 @@ function sortScriptsByTab(scripts, _tabs, addTabTitle = true) { return result; } -async function getAvailableScriptsInTabs(_tabs) { - return sortScriptsByTab(await getAvailableScripts(), _tabs); -} - -function getScriptsWithBadgeId(scripts, badgeId) { - return scripts.filter((script) => - script.badges?.find((_) => _.id === badgeId) - ); -} - -async function refreshSpecialTabs() { +function refreshSpecialTabs() { // add data to special tabs let recentTab = specialTabs.find((tab) => tab.id === CATEGORY.recently.id); - if (recentTab) recentTab.scripts = await recentScriptsSaver.get(); + if (recentTab) recentTab.scripts = recentScriptsSaver.get(); let favoriteTab = specialTabs.find((tab) => tab.id === CATEGORY.favorite.id); - if (favoriteTab) favoriteTab.scripts = await favoriteScriptsSaver.get(); + if (favoriteTab) favoriteTab.scripts = favoriteScriptsSaver.get(); - let avaiTab = specialTabs.find((tab) => tab.id === CATEGORY.available.id); - if (avaiTab) avaiTab.scripts = await getAvailableScriptsInTabs(tabs); + let allTab = specialTabs.find((tab) => tab.id === CATEGORY.all.id); + if (allTab) allTab.scripts = sortScriptsByTab(Object.values(s), tabs); - // ==== special badge tab ==== - let allScriptsArr = Object.values(s); - console.log(allScriptsArr); - - let hotTab = specialTabs.find((tab) => tab.id === CATEGORY.hot.id); - if (hotTab) - hotTab.scripts = sortScriptsByTab( - getScriptsWithBadgeId(allScriptsArr, BADGES.hot.id), - tabs - ); - - let newTab = specialTabs.find((tab) => tab.id === CATEGORY.new.id); - if (newTab) - newTab.scripts = sortScriptsByTab( - getScriptsWithBadgeId(allScriptsArr, BADGES.new.id), + let autoTab = specialTabs.find((tab) => tab.id === CATEGORY.autorun.id); + if (autoTab) + autoTab.scripts = sortScriptsByTab( + Object.values(s).filter((_) => canAutoRun(_)), tabs ); } @@ -451,13 +471,4 @@ function getAllTabs() { return [...specialTabs, ...tabs, recommendTab]; } -export { - isTitle, - isFunc, - isLink, - refreshSpecialTabs, - tabs, - specialTabs, - recommendTab, - getAllTabs, -}; +export { refreshSpecialTabs, tabs, specialTabs, recommendTab, getAllTabs }; diff --git a/scripts/anti_clickjacking.js b/scripts/anti_clickjacking.js new file mode 100644 index 00000000..f9482caa --- /dev/null +++ b/scripts/anti_clickjacking.js @@ -0,0 +1,21 @@ +export default { + icon: '', + name: { + en: "Anti clickjacking", + vi: "Chống clickjacking", + }, + description: { + en: "Anti clickjacking attack", + vi: "Ngăn cản sự tấn công clickjacking", + }, + infoLink: "https://viblo.asia/p/lo-hong-clickjacking-aWj536e1l6m", + whiteList: ["http://*/*", "https://*/*"], + + onDocumentIdle: () => { + // Source code copy from J2team security + + "use strict"; + // prettier-ignore + "function"!=typeof String.prototype.includes&&(String.prototype.includes=function(e){return this.indexOf(e)>-1}),function(e,t){function n(e){var t=Array.from(document.querySelectorAll(e));t.length>0&&(t.map(function(e){e.remove()}),t=null)}function i(e){return!!e.hasAttribute("src")&&e.src.includes("facebook.com/plugins/like.php")}function r(e){if(e.hasAttribute("src")){var t=decodeURIComponent(e.src);if(t.toLowerCase().includes("href=")){var n=t.split("href=",2);if(n.length>1&&n[1].includes("&")){var i=n[1].split("&",1)[0];return i}}}return null}function o(){var e=document.getElementById("theiframe");null!==e&&i(e)&&(r(e),e.remove(),n('script[src*="likeme.js"]'))}t.storage.sync.get({anti_clickjacking:!0},function(t){t.anti_clickjacking&&(e.top===e&&o(),e.document.addEventListener("DOMContentLoaded",o))})}(window,chrome),function(e,t,n){var i=0,r=10,o=100,c=o,a="_no-clickjacking-",l=0,s={},u=function(){},f=function d(){u("detecting...",i,c);var n=t.getElementsByTagName("iframe"),f=[];for(var m in n)for(var p=n[m],g=p;g;){try{var v=getComputedStyle(g);if(v&&parseFloat("0"+v.opacity)<.1){u("found",g,p),c=o,i=0;var y=g.id;y||(y=a+l,l++,g.id=y),f.push(y)}}catch(h){u(h.message)}g=g.parentNode}if(f.length>0){var k="";for(var w in f){var E=f[w],j=t.getElementById(E);if("undefined"==typeof s[E]?s[E]=1:s[E]++,s[E]>3){var b=t.getElementById(E);null!==b&&u("too many strikes, removed",E)}else j.style.opacity=1,j.style.overflow="visible",k+="#"+E+"{opacity:1 !important;overflow: visible !important}"}if(k.length>0){var B=t.createElement("style");B.innerText=k;var C=t.getElementsByTagName("head");C.length>0&&C[0].appendChild(B)}}i"], +// js: ["scripts/content-scripts/scripts/ufs_global_webpage_context.js"], +// runAt: "document_start", +// world: chrome.scripting.ExecutionWorld.MAIN, +// }, +// ], +// () => { +// console.log("Register content script DONE."); +// } +// ); + +// (() => { +// let scripts = Object.values(allScripts) +// .map((s) => +// Object.values(Events).map((e) => { +// if (!e in s) return null; +// let isString = typeof s[e] === "string"; +// let isArray = Array.isArray(s[e]); +// if (!(isString || isArray)) return null; + +// let js = isString ? [getscriptURL(s[e])] : s[e].map(getscriptURL); + +// // add global helper to head of array +// js.unshift( +// getscriptURL("content-scripts/scripts/ufs_global_webpage_context.js") +// ); +// return { +// id: s.id + "-" + e, +// allFrames: true, +// matches: s.whiteList || [""], +// excludeMatches: s.blackList || [], +// js: js, +// runAt: EventMap[e], +// world: chrome.scripting.ExecutionWorld.MAIN, +// }; +// }) +// ) +// .flat() +// .filter((_) => _); + +// console.log(scripts); + +// chrome.scripting.registerContentScripts(scripts, () => { +// console.log("Register content script DONE."); +// }); +// })(); + +// function getscriptURL(fileName) { +// return "scripts/" + fileName; +// } + +// function updateBadge(tabId, text = "", bgColor = "#666") { +// text = text.toString(); +// chrome.action.setBadgeText({ tabId, text: text == "0" ? "" : text }); +// chrome.action.setBadgeBackgroundColor({ color: bgColor }); +// } diff --git a/scripts/backup/bao-reaction.php b/scripts/backup/bao-reaction.php new file mode 100644 index 00000000..1dfe8757 --- /dev/null +++ b/scripts/backup/bao-reaction.php @@ -0,0 +1,31 @@ + + +'; +} +} +function auto($url){ + $curl = curl_init(); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_URL, $url); + $ch = curl_exec($curl); + curl_close($curl); + return $ch; + } +?> +// code by danhthong+lulzquan + +// bạn có thể không ghi nguồn khi dùng nhưng làm ơn đừng mang code của mình đi bán...đó là lý do mình rất ít share code -.- +//domain.php/baocamxuc.php?token={{token}}&camxuc={{camxuc}}&id={{uid}}&limit={{soluong}} + diff --git a/scripts/backup/bypass_all_shortlink.js b/scripts/backup/bypass_all_shortlink.js new file mode 100644 index 00000000..eb2f4a22 --- /dev/null +++ b/scripts/backup/bypass_all_shortlink.js @@ -0,0 +1,631 @@ +// https://greasyfork.org/en/scripts/431691-bypass-all-shortlinks/code +function userScriptConfigToObject(config) { + let a = config.split("\n"); + let b = { + includes: [], + exclude: [], + match: [], + }; + a.forEach((_) => { + let value = _.split(" ").at(-1); + if (_.includes("@include")) { + b.includes.push(value); + } else if (_.includes("@exclude")) { + b.exclude.push(value); + } else if (_.includes("@match")) { + b.match.push(value); + } + }); +} + +let config = { + includes: [ + "/^(https?://)(tmearn|additionalgamer|makemoneywithurl|shrinkearn|techcyan|aghtas|soltoshindo|link4m|kingsleynyc|healthy4pepole|kiktu|1bitspace|skip-url|pennbookcenter|publicananker|mikl4forex|michaelemad|miklpro|zirof|forex-golds|nawahi1|mosqam|semawur|forex-trnd|hoshilink|taiwancnan|bit-url|megurus|cuts-url|popimed|rayusmedya|enburl|pickhopes|toryxlink|aduzz|lycoslink|cdrab|ibrabucks|zenshort|ethiomi|shortenbuddy|kiemlua|smoner|djbhojpurisongs|urlty|sakastau|modsbase|ac.totsugeki|bcvc2|earnwithshortlink|bitzite|link1s|diadiemcheckin|tudiendanhngon|chooyomi|staaker|lucidcam|forexlap|forexmab|linkjust|admediaflex|hoclamdaubep|rekonise|forex-articles|ponselharian|liinkat|thegoneapp|mobi2c|studyuo|hookeaudio|thehostingmentor|intlinki|linkshortify|shopsixseven|mohtawaa|msarzone|foodhear|fc-lc|expertvn|downphanmem|healdad|ez4mods|try2link|tmker|soft3arbi|techyadjectives|ex-foary|examtadka|bablyfeed|crypto4tun|blogmado|itsguider|coin-free|1xfaucet|dash-free|usdshort|cafenau|techacode|ls2earn|sevenjournals|7misr4day|trflink|sama-pro|s.ume24|shtfly|bestmobilenew|onlineincoms|modsfire|adneow|short.clickscoin|samaa-pro|techrfour|ez4short|topnewsnew|gawishpro|dz4link|skincarie|gaminplay|infinitycoupon|videoslyrics|shortlite|bitefaucet|techrayzer|shorteet|donnaleehunt|puggygaming|link2end|tranquangchuan|blogginglass|1shorten|lensabicara|tieutietkiem|yummy-reciepes|doctor-groups|link.bigboxnet|bioinflu|chamcuuhoc|litexblog|7nything|gamalk-sehetk|adsafelink|cbshort|bellurl|abcshort|checkscoin|llinkon|links.apksvip|nguyenvanbao|cloudgetlink|techloadz|atglinks|nulledsafe|dreamcheeky|cutpaid|fidlarmusic|rodjulian|anhdep24|money.alyoumeg|sl.claimfreebits|sl-1.btcbunch|sl-2.btcbunch|earncryptowrs|short-zero|insurancevela|poketoonworld|arahtekno|mopahealth|nghiencar|sl-3.btcbunch|apk.miuiku|bitlya|ecwizon|oncehelp|sportsmediaz|big2short|techymozo|loptelink|2shrt|charexempire|coindoog|shotzon|novelsapps|webhostingpost|tremamnon|tirailangit|intercelestial|tribuntekno|bestcash2020|hoxiin|fooot-map|priefy|dz-linkk|fauxlink|chinhnhacoban|autodime|cortaly|link.3dmili|1adlink|indianshortner|donia-tech|donia2tech|donia2link|short1s|cr3zyblog|btafile|pdiskshortener|urlsopen|1shortlink|linkerload|filenext|shrinkmoney|doodshort|paid4link|kienthucrangmieng|wiki-topia|aljoodm98|newworldnew|sahityt|mkomsel|niinga|bclikeqt|youssefsayed|fx4vip|shortzon|get4links|crickblaze|nostralink|clkmein|101desire|memangbau|hosting4lifetime|mesho-link|up4cash|newsharsh|examkhata|linksht|note1s|adclickersbot|mobitaak|btcwalk|99faucet|modebaca|paylinnk|olhonagrana|chedrive|teknosimple|discordserv|link-yz|apkadmin|ayelads|gawbne|mshortener|cutdomain|usersdrive|uptobox|1fichier|uploadrar|bayfiles|krakenfiles|post.copydev|icutlink|zegtrends|anonfiles|sharemods|ddownload|uppit|userscloud|newsnowbd|link.nulldown|asideway|url.namaidani|url.magmint|mp4upload|myshrinker|apkshrt|link.turkdown|drive.google|safe.intipanime|trylinko|uploadhaven|manga2day|shortyearn|workupload|filedm|themorningtribune|beingtek|sub2get|ex-load|campki|social-unlock|teerclub|short-jambo|link.bitmagge|nerdiess|best-cpm|clicksfly|megaupto|maqal360|foodboth|ufacw|techcartz|softechbharat|okrzone|informaxonline|shopdorod|short.skalbayrak|adshnk|sub2unlock|smarcrm|cryptomeloud|blog-everything|ikrey|tipsli|urlpayout|urlpoints|hocbeauty|95news|link.get4llink|twitonet|shrinklo|xemsport|cutwin|pubgquotes|examsteacher|adpaylink|yxoshort|mdiskurl|shrt10|imgbsr|linknih|lessurl|pureshort|adrinolinks|wikitraveltips|techkeshri|uploadsoon|shrinkgold|itechmafiia|link4earn|team.pastehosting|educur|3rabsnews)(.com)(/.*)/", + "/^(https?://)(.+)?(zolomix|cararegistrasi|5golink|birdurls|snkra|artiskini|sh2rt|byboe|medcpu|nousdecor|restorbio|bdnewsx|upshrink|gifans|jardima|jobswd|gkqnaexam|imperialstudy|ovlinks|imagenesderopaparaperros|yofaurls|digiromotion|wingifta|rancah|coinadfly|delishwell|zippyshare|solidfiles|ourtecads|zubatecno|covemarkets|disheye|eda-ah|blog-forall|techymedies|gamelopte|allcryptotips|claimclicks|snowurl|riadcrypto|askpaccosi|linktrims|gets4link|visflakes|apk4do|dineroshare|elwatanelyoum|ledifha|claimfey|shrinkito|panylink|wrbloggers|tokenoto|saly-cash|upload-4ever|shortenn|admediaflex|btcpany|assettoworld|vikashmewada|linkyearn|appsbull|gam3ah|tinybc|diudemy|file-upload|shorterall|tribuncrypto|cempakajaya|safelinkduit|nadersoft7|adshorturl|linkbnao|phsensei|4shared|ta2deem7arbya|lrshortner|tinycmd|cloudshrinker|proviralhost|technicalatg|v2links|ytsubme|rainurl|arahlink|m4cut|teachsansar|web9academy|shortxlinks|flyrar|pythondunyasi|meykmen|on-scroll|shrtfly|i-polls|sonicbtc|cutln|menjelajahi|almontsf|crypturls|zombiebtc|sekilastekno|techwhom|hereofamily|cash4share|linkwards)(.com)(/.*)/", + "/^(https?://)(ahyblogs|ourcoincash|1manga|watchdoge|arenaboard|ccsl|shrinkpay|adsgo|shon|crypto-faucet|bingeflix|studystar|liongiv|lokagames|3vw|short-cash2|wizzly|mgnet|crypteen|dogeen|fauceteen|cutdl|sportawy|fexkomin|technemo|zoomcrypto|techboyz|cblinks|99links|kartunik|post.nites-tv|shortplus|stores.filmyzilla-in|expresscoins|claimcoinsfree|short1|swzz|acortame|alghtas|wizly|horanews|a1link|short2fly|bcvc|healthbloog|post.movies-near-me|st.kleaco|playlink|q8c|sh0rt1|cars-1year|nabits|welovecrypto|worldappsstore|0uq|sh.tripledownloader|short2url|zeroshort|bitsyield|egstar|uscity|monsterurlshortner|bflinks|gibit|playdisk|studyis|kukslincs|magictoshi)(.xyz)(/.*)/", + "/^(https?://)(.+)?(senuansatechno|insurglobal|claimercorner|shortly|dexlink|doctorcoin|speedynews|1apple|ffworld|textpage|fidovy|egfly|insurance-space|crypto-blog|sapica|earnfacut|urlbharat|dropz|chainfo|megano-coin|techleets|earnl)(.xyz)(/.*)/", + "/^(https?://)(neonlink|techydino|world-trips|yoshare|lets.5get|crypto-fi|wpcheap|coinmasterx|catcut|aztravels|dulichkhanhhoa|sub2unlock|forex-gold|techtrickonline|7apple|ccurl|luckydice|link1s|url.namaidani|cryptowidgets|dogeclick|adskip|hurirk|usfinf|xervoo|sport4you|hexupload|eloism|cutt|forexshare|blog.cryptowidgets|neexulro|dailyuploads|douploads|simfileshare|fir3|magybu|racaty|linegee|blogesque|thuocdangian|altblogger|letsboost|cut-y|megadb|conghuongtu|vinaurl|tecmundo|try2link|cpmlink)(.net)(/.*)/", + "/^(https?://)(.+)?(digitalnaz|owllink|mozlink|cryptosats|rocklinks|celinks|jiotech|bitcomarket|illink|jemari|fire-link|linkrex|urlw|paid4link|link3s|boscoin|pilinks|linkshortify)(.net)(/.*)/", + "/^(https?://)(tnlink|jrlinks|qualitystudymaterial|cuturl|missionhight|wpking|zagl|ls2earn|streamshort|shareus|referus|megafly|megaurl|cutp|earnmoj|riadshot|urlmoney|cplink|cryptomonitor|technoflip|linkshortify|htlinks|techlearningtube|urlfly|linkocean|financeflix|uttan|jazbaat|djxmaza|bildirim|techy4you|battlechamp|sahilsumra|kerdlinfo|urlcut|insurancevlog|itechlogic|videolyrics|tekcrypt|missionhight|gplinks|moddingzone|adybrands|gpflix|gz2|dulink|aclinks|hidelinks|shortearn|siteblog|u.apgy|du-link|ouoi|by6|adrinolinks|rklinks|mymobilehub|techdaze|link4earn|rupamobile|examsolution)(.in)(/.*)/", + "/^(https?://)(.+)?(cashurl|linkad|bitcoinly|crazyblog|zolomix|technologylover|expertlinks|largestpanel|linkres|rsrlink|linkstream|xmod|short2url|99links|rplinks|enit|adloot|url2go|tnvalue|pvidly|apurl|earnspace|urlinked|mdlink|gamerfang|writedroid|teckypress|fixno|paisakamalo|inkik|shrinkforearn|easysky|ajlinks|mdiskplayer|akcartoons)(.in)(/.*)?/", + "/^(https?://)(aylink|linkszia|mynewsmedia|gtlink|adfloz|linksly|droplink|123link|linksfy|adshorti|hxfile|dosya|veganal|takem|ezimg|eng.ezimg|dausel|9-animie|veganho|nulledmod|veganac|dealprice|modlink|arabplus2|cut-y)(.co)(/.*)/", + "/^(https?://)(.+)?(takez|linksfire|vosan|tinygo|veganab)(.co)(/.*)/", + "/^(https?://)(ctbl|girls-like|gobits|zoss|shrinke|tlin|terafly|petafly|gigafly|adnews|papanews|panyflay|mozzfly|shortus|short.croclix|best-news|mega-news|wildblog|specx|dddrive|linkpoi|sh24|m.newhit|mboost|linkshorts|exafly|nonofly|lozzfly|uptomega|stfly|adbull|youshort|health-and|cutx|adsk|shorter.earn-hub|linkfly|pkin)(.me)(/.*)/", + "/^(https?://)(.+)?(theconomy|richlink)(.me)(/.*)/", + "/^(https?://)(sitr|flylink|downfile|savelink|linkshortify|shareus|promo-visits|mobileprice)(.site)(/.*)/", + "/^(https?://)(.+)?(cekip|link4rev|coin-city)(.site)(/.*)/", + "/^(https?://)(earnme|sanoybonito|automotur|kooza|1link|zentum|mytop5|forexwaw|megatube)(.club)(/.*)/", + "/^(https?://)(.+)?(usanewstoday|kadal|webhostingtips)(.club)(/.*)/", + "/^(https?://)(adrev|paid4|yousm|coinpayz|tr|yocto|clk.dti|besturl|boostme|takefile|appo|pureshort|linkshortifyx)(.link)(/.*)/", + "/^(https?://)(.+)?(vshort|stex|cash4|zuba)(.link)(/.*)/", + "/^(https?://)(shurt|shortit|adsy|bitlinks|clik|playstore|megalink)(.pw)(/.*)/", + "/^(https?://)(.+)?(prz|pong)(.pw)(/.*)/", + "/^(https?://)(bloogerspoot|vsbl)(.ga)(/.*)/", + "/^(https?://)(bloogerspoot|linkshor|cortlink)(.tk)(/.*)/", + "/^(https?://)(.+)?(madfaucet|mineshor|futureshor)(.tk)(/.*)/", + "/^(https?://)(bloogerspoot|urlchanger|arearn|360shortlink)(.ml)(/.*)/", + "/^(https?://)(onimports|link.encurtaon|economiarelevante)(.com.br)(/.*)/", + "/^(https?://)(exee|onlineteori|punyablog|activity|massive|caview)(.my.id)(/.*)/", + "/^(https?://)(.+)?(mycut|apasih)(.my.id)(/.*)/", + "/^(https?://)(.+)?(suratresmi|carapedi|salink)(.id)(/.*)/", + "/^(https?://)(link.skm4u|linkwards)(.co.in)(/.*)/", + "/^(https?://)(.+)?(droplink)(.co.in)(/.*)/", + "/^(https?://)(kiiw|passgen|wordcounter|shrink|revcot|clickzu|shortzu)(.icu)(/.*)/", + "/^(https?://)(newforex|wplink|nbyts|wealthystyle|clicksfly|happy-living|earn-cash|yourtechnology|apks|network-earn|teacherana|earnow|battleroyal)(.online)(/.*)/", + "/^(https?://)(.+)?(adslinkfly|readi|linkmumet)(.online)(/.*)/", + "/^(https?://)(exey|ezlinks|techmody|ouo|ex-e|saly|cuty|evoload|oke|letsupload|eio|oii|exe)(.io)(/.*)/", + "/^(https?://)(.+)?(linkfly|usalink)(.io)(/.*)/", + "/^(https?://)(tny|tinyurl)(.so)(/.*)/", + "/^(https?://)(zshort|claimcrypto|cashearn|1ink|linkpay|moneylink|intnews|openload|linkspy|letsupload|myasietv)(.cc)(/.*)/", + "/^(https?://)(cryptoad|wikile|uploadev|mega4up|doibihar|cshort|payskip|homeairquality|shortearn|sl.btc25|earnsfly)(.org)(/.*)/", + "/^(https?://)(.+)?(medipost|shrinkurl|keeplinks|rajdlsg)(.org)(/.*)/", + "/^(https?://)(jameeltips|mitly|adfoc|link4fun)(.us)(/.*)/", + "/^(https?://)(.+)?(yalla-shoot-now|forexeen|jaelink)(.us)(/.*)/", + "/^(https?://)(noweconomy|deportealdia|adshort|ay|pngit|pndx)(.live)(/.*)/", + "/^(https?://)(earnads|genpassword|shrlink|mshort|punyamerk|shortnow|short.freeltc)(.top)(/.*)/", + "/^(https?://)(zagl|scratch247|siyn|portablesusb|children-learningreading|azmath|mobilereview|inform3tion|mobilism|machicon-akihabara|cooklike|videoclip|bitcrypto|shortlinkto|uptobhai|brbushare|fanclup)(.info)(/.*)/", + "/^(https?://)(faucetcrypto|bildirim)(.eu)(/.*)/", + "/^(https?://)(nex-url|olamovies|atrologyrex)(.cyou)(/.*)/", + "/^(https?://)(antonimos|blog.hostratgeber)(.de)(/.*)/", + "/^(https?://)(freelitecoin|uplinkto|1Link)(.vip)(/.*)/", + "/^(https?://)(.+)?(flyad|lootcash)(.vip)(/.*)/", + "/^(https?://)(romania|met|warp)(.bz)(/.*)/", + "/^(https?://)(2ad|viya|17o)(.ir)(/.*)/", + "/^(https?://)(adshrink|cutin)(.it)(/.*)/", + "/^(https?://)(pingit|files|upo)(.im)(/.*)/", + "/^(https?://)(clk|9xupload)(.asia)(/.*)/", + "/^(https?://)(iir|tei|ier|ckk)(.ai)(/.*)/", + "/^(https?://)(aii|clk|oko)(.sh)(/.*)/", + "/^(https?://)(.+)?(i8l|clk|pi-l|bcvc|modli)(.ink)(/.*)/", + "/^(https?://)(.+)?(upload|prx)(.ee)(/.*)/", + "/^(https?://)(.+)?(mirrored|clicknupload)(.to)(/.*)/", + "/^(https?://)(.+)?(ouo|forextrader|daga88)(.today)(/.*)/", + "/^(https?://)(.+)?(techgeek|adsgo)(.digital)(/.*)/", + "/^(https?://)(mhma12|surflink|techtrim)(.tech)(/.*)/", + "/^(https?://)(kiw|redir.123file)(.li)(/.*)/", + "/^(https?://)(zonearn|theprice|nhacremix|doanvanhai|hynews)(.biz)(/.*)/", + "/^(https?://)(.+)?(123link)(.biz)(/.*)/", + "/^(https?://)(.+)?(exe|exee|exep|upfiles|cutty|linkfly)(.app)(/.*)/", + "/^(https?://)(adshort|1bit|2the|careerhunter|galaxy-link)(.space)(/.*)/", + "/^(https?://)(makeeasybtc|softindex|techus)(.website)(/.*)/", + "/^(https?://)(linka|xtrabits|skipads)(.click)(/.*)/", + "/^(https?://)(.+)?(shortlinks|easysl|adlink|adzilla|urlcash)(.click)(/.*)/", + "/^(https?://)(.+)?(hamody|nathanaeldan|freddyoctavio|davisonbarker|clks|cryptosh|bestfonts|gitlink|openurl)(.pro)(/.*)/", + "/^(https?://)(up-load|zcash|mdisk)(.one)(/.*)/", + "/^(https?://)(1dogecoin|faucet)(.work)(/.*)/", + "/^(https?://)(sh.feyorra|fey.feyorra|claim|surelink|chuksblog|superlink|pricenews)(.fun)(/.*)/", + "/^(https?://)(go|blog|go2|tech|test|blg)(.madshiba.fun)(/.*)/", + "/^(https?://)(linkati|zenshort|curto|sh.kiddypay)(.win)(/.*)/", + "/^(https?://)(cool-time|movies|anime|tech)(.dutchycorp.space)(/.*)/", + "/^https://linkvertise.com/(1|2|3|4|5|6|7|8|9)/", + "/^https://cryptofans.club/(short|next|other|step)/", + "/^(https?://)(.+)?(mediafire)(.com)/(download|file)/", + "/^(https?://)(.+)?(cryptocurrencytracker|freefaucet)(.biz)/(link)/", + "/^(https?://)(.+)?(freebitcoin)(.fun)/(topsites|view)/", + "/^(https?://)(.+)?(clickscoin|freefeyorra|reddcoineveryday|cryptotyphoon|softairbay)(.com)/(short)/", + ], + exclude: [ + "/^https://claimclicks.com/(btc|ltc|doge|trx|faucetlist|ptclist)/", + "/^https://claimercorner.xyz/(claimer/dashboard|claimer/advertise|claimer/ptc|claimer/deposit|claimer/transfer|claimer/tasks|claimer/offerwall|claimer/profile|claimer/auto|claimer/mining|claimer/wheel|claimer/login)/", + "/^https://cryptosats.net/(cryptosats/dashboard|cryptosats/advertise|cryptosats/ptc|cryptosats/deposit|cryptosats/transfer|cryptosats/tasks|cryptosats/offerwall|cryptosats/profile|cryptosats/auto|cryptosats/mining|cryptosats/wheel|cryptosats/login)/", + "/^https://99faucet|faucet.cempakajaya.com/(dashboard|advertise|ptc|deposit|transfer|tasks|offerwall|profile|auto|mining|dice|lottery|faucet|login)/", + "/^https://free.tribuncrypto.com/(dashboard|advertise|ptc|deposit|transfer|tasks|offerwall|profile|auto|mining|dice|lottery|faucet|login)/", + "*://*.vosan.co/", + ], + match: [ + "*://dutchycorp.space/s*/*", + "*://dutchycorp.ovh/s*/*", + "*://shorts.lu/*", + "*://adx.wiki/*", + "*://adx.cx/*", + "*://al.ly/*", + "*://za.gl/*", + "*://goo.st/*", + "*://c2g.at/*", + "*://fcc.lc/*", + "*://adz.moe/*", + "*://coin.mg/*", + "*://send.cm/*", + "*://kimo.ma/*", + "*://goads.ly/*", + "*://mdn.rest/*", + "*://*.mdn.lol/*", + "*://*.rota.cc/*", + "*://ouo.press/*", + "*://7cc.96.lt/*", + "*://*.flyzu.icu/*", + "*://tinyurl.is/*", + "*://*.mdn.world/*", + "*://nail.edu.pl/*", + "*://lolabits.se/*", + "*://3shorturl.gq/*", + "*://litecoin.host/*", + "*://*.goto.com.np/*", + "*://z-cash.xyz/ad/*", + "*://drop.download/*", + "*://cryptofuns.ru/*", + "*://gosixs.com/s/*", + "*://linkshrink.ca/*", + "*://short.express/*", + "*://arbweb.info/sl/*", + "*://*.cizgifilm.tv/*", + "*://faucethub.ly/hs/*", + "*://faucetpay.io/ptc*", + "*://*.trangchu.news/*", + "*://webmobile.store/*", + "*://*.adz7short.space/*", + "*://docs.google.com/uc*", + "*://starfaucet.net/sl/*", + "*://solarchaine.com/sl/*", + "*://shrt.cryptofuns.ru/*", + "*://iqfaucet.com/link3/*", + "*://horrorbitcoin.com/?*", + "*://satoshi-win.xyz/url/*", + "*://cryptonetos.ru/page/*", + "*://faucet.gold/BTC/?step*", + "*://faucet.gold/ETH/?step*", + "*://adbtc.top/surf/browse/*", + "*://anonym.ninja/download/*", + "*://claimsolana.xyz/short/*", + "*://faucetcrypto.net/short/*", + "*://stationbit.xyz/autolink/*", + "*://cryptoaffiliates.store/sh*", + "*://konstantinova.net/verify/*", + "*://playnano.online/watch-and*", + "*://adbtc.top/surfiat/browse/*", + "*://rotator.nurul-huda.sch.id/*", + "*://*api-secure.solvemedia.com/*", + "*://faucetcrypto.com/claim/step/*", + "*://linkvertise.download/download/*", + "*://*.racedepartment.com/downloads/*", + "*://cryptorotator.website/sh_live/*", + "*://cryptonetos.ru/page/redirect*", + "*://galerybits.com/protectlink/*", + "*://earnultimate.space/short/*", + "*://bas.nurul-huda.or.id/*", + ], +}; + +let url = location.href; +let willRun = false; +// TODO : calculate willRun + +if (willRun) { + // prettier-ignore + (function() { + 'use strict'; + const RexBp = new RegExp(/^\?([^&]+)/); + const bp = query => document.querySelector(query); + const elementExists = query => bp(query) !== null; + const domainCheck = domains => new RegExp(domains).test(location.host); + function click(query) {bp(query).click();} + function submit(query) {bp(query).submit();} + function clickIfElementExists(query, timeInSec = 1, funcName = 'setTimeout') {if (elementExists(query)) {window[funcName](function() {click(query);}, timeInSec * 1000);}} + function Captchasub(query, act = 'submit', timeInSec = 0.5) {if (elementExists(query)) {var timer = setInterval(function() {if (window.grecaptcha && !!window.grecaptcha.getResponse?.()) {bp(query)[act](); clearInterval(timer);}}, timeInSec * 1000);}} + function Captchaklik(query, act = 'click', timeInSec = 1) {if (elementExists(query)) {var timer = setInterval(function() {if (window.grecaptcha && !!window.grecaptcha.getResponse?.()) {bp(query)[act](); clearInterval(timer);}}, timeInSec * 1000);}} + function redirect(url, blog = true) {location = blog ? 'https://rotator.nurul-huda.sch.id/?url=' + url : url;} + function BypassedByBloggerPemula(re_domain, data, blog) { if (!re_domain.test(location.host)) return; + if (typeof data === 'function') return data(); + if (Array.isArray(data)) data = {'/': data}; + if (!(location.pathname in data)) return; + const [key, value] = data[location.pathname]; + if (typeof key === 'object' && key.test(location.search)) return redirect(value + RegExp.$1, blog); + const searchParams = new URLSearchParams(location.search); + if (searchParams.has(key)) redirect(value + searchParams.get(key), blog);} + function BloggerPemula(domains, data, url, blog, use = null) {const searchParams = new URLSearchParams(location.search); + if (!domainCheck(domains)) return; + if (typeof data === 'string' && data.split(',').every(p => searchParams.has(p))) {use ??= data.split(',')[0]; + redirect(url + searchParams.get(use), blog);} else if (typeof data === 'object') {const o = data[location.pathname]; + if (!o) return; BloggerPemula(domains, ...o);}} + function meta(href) {document.head.appendChild(Object.assign(document.createElement('meta'), { name: 'referrer', content: 'origin'})); + Object.assign(document.createElement('a'), {href}).click();} + function waitForElm(query, callback) {setTimeout(function() {if (elementExists(query)) {callback(bp(query));} else {waitForElm(query, callback);}}, 1000);} + function notify(txt, width = 780) { const m = document.createElement('div'); + m.style.padding = '5px'; m.style.zIndex = 99999999; m.style.position = 'fixed'; m.style.boxSizing = 'border-box'; + m.style.width = `${width}px`; m.style.top = '100px'; m.style.left = `${innerWidth / 2 - width / 2}px`; m.style.font = 'normal bold 20px sans-serif'; + m.style.backgroundColor = 'white'; m.innerText = txt; document.body.appendChild(m);} + // There will be a Special Tricks and Bypass Codes only for Good Users (Anyone who have good attitude , Good Feedback, will be invited to my group) + BloggerPemula('sport4you.net|nadersoft7.com|manga2day.com|pickhopes.com|gam3ah.com|cars-1year.xyz|m4cut.com', 'link', '', false); + BloggerPemula('rupamobile.in', 'go', 'https://mdisk.one/', false); + BloggerPemula('rsrlink.in', 'link', 'https://go.rsrlink.in/', false); + BloggerPemula('itechmafiia.com', 'link', 'https://v.earnl.xyz/', false); + BloggerPemula('veganab.co', 'link', 'https://techy.veganab.co/', false); + BloggerPemula('siteblog.in', 'link', 'https://go.droplink.co.in/', false); + BloggerPemula('tr.link|fauceteen.xyz|adpaylink.com', 'url,api', '', false); + BloggerPemula('dealprice.co', 'adlinkfly', 'https://pricenews.fun/', false); + BloggerPemula('ww1.linktrims.com', 'link', 'https://linktrims.com/', false); + BloggerPemula('akcartoons.in', 'link', 'https://back.expertlinks.in/', false); + BloggerPemula('missionhight.in', 'link', 'https://playdisk.url2go.in/', false); + BloggerPemula('tech.techwhom.com', 'jeton', 'https://we.techwhom.com/', false); + BloggerPemula('linkshortifyx.link', 'link', 'https://yo.linkshortify.net/', false); + BloggerPemula('ffworld.xyz|doibihar.org', 'link', 'https://go.linkbnao.com/', false); + BloggerPemula('team.pastehosting.com', 'adlinkfly', 'https://shortxlinks.com/', false); + BypassedByBloggerPemula(/7apple.net/, {'/verify/': [RexBp, 'http://illink.net/'],}, false); + BypassedByBloggerPemula(/techdaze.in/, {'/': [RexBp, 'https://web.mdiskplayer.in/'],}, false); + BypassedByBloggerPemula(/rklinks.in/, {'/verify/': [RexBp, 'https://blog.inkik.in/'],}, false); + BypassedByBloggerPemula(/jemari.net/, {'/verify/': [RexBp, 'http://skip.jemari.net/'],}, false); + BypassedByBloggerPemula(/mymobilehub.in/, {'/safe.php': ['link', 'https://modlink.co/'],}, false); + BypassedByBloggerPemula(/medipost.org/, {'/verify/': [RexBp, 'http://go.theconomy.me/?'],}, false); + BypassedByBloggerPemula(/theconomy.me/, {'/verify/': [RexBp, 'http://links.medipost.org/'],}, false); + BypassedByBloggerPemula(/shopsixseven.com/, {'/verify/': [RexBp, 'http://safelinkduit.com/'],}, false); + BypassedByBloggerPemula(/linkwards.co.in/, {'/verify/': [RexBp, 'http://ads.linkwards.com/'],}, false); + BypassedByBloggerPemula(/uploadsoon.com/, {'/safe.php': ['link', 'https://shrinkforearn.in/'],}, false); + BypassedByBloggerPemula(/link.linksfire.co/, function() {location = location.href.replace('link', 'blog');}); + BypassedByBloggerPemula(/speedynews.xyz/, {'/blog/verify/': [RexBp, 'https://links.speedynews.xyz/'],}, false); + //BypassedByBloggerPemula(/blogs.egfly.xyz/, function() {location = location.href.replace('blogs.', 'link.');}); + BypassedByBloggerPemula(/studyuo.com/, {'/pro2/verify/': [RexBp, 'https://speedynews.xyz/blog/verify/?'],}, false); + BypassedByBloggerPemula(/short.rainurl.com|short.snowurl.com/, function() {location = location.href.replace('short.', '');}); + BypassedByBloggerPemula(/teachsansar.com/, () => waitForElm("#wpsafegenerate > #wpsafe-link > a[href]", safe => redirect(safe.href))); + BypassedByBloggerPemula(/go.birdurls.com|go.owllink.net|go.illink.net|go.pong.pw/, function() {location = location.href.replace('go.', '');}); + const sl = (h => {switch (h.host) { + case 'mobileprice.site': if (h.searchParams.has('alex')) { return 'https://msarzone.com/p/' + h.searchParams.get('alex');} break; + case 'bestmobilenew.com': if (h.searchParams.has('get')) { return 'https://link2end.com/p/' + h.searchParams.get('get').substring(1);} break; + case 'adlink.bitcomarket.net': if (h.searchParams.has('go')) { return 'https://adshorti.co/' + h.searchParams.get('go').substring(1);} break; + case 'theconomy.me': case 'blog.medipost.org': if (h.pathname === '/' && /^\?([^&]+)/.test(h.search)) { meta('https://links.medipost.org/' + RegExp.$1);} break; + default: break;} })(new URL(location.href)); if (sl) {location.href = sl; } + BypassedByBloggerPemula(/adbtc.top/, function() {let count =0; setInterval(function(){if(bp("div.col.s4> a") && !bp("div.col.s4> a").className.includes("hide")){count = 0;bp("div.col.s4> a").click();}else{count = count + 1;}},5000); + window.onbeforeunload = function() {if (unsafeWindow.myWindow) {unsafeWindow.myWindow.close();}if (unsafeWindow.coinwin) {let popc = unsafeWindow.coinwin;unsafeWindow.coinwin = {};popc.close();}};}); + BypassedByBloggerPemula(/dropz.xyz/, function() {if (window.location.href.includes('/captcha')&& !window.location.href.includes('/roll')) {}else if (window.location.href.includes('/site-friends')) {let windowName = "";let currentwindowOpenFunction = unsafeWindow.open;function newwindowOpenFunction(params1, params2) {if (!params2 || params2 == "_blank") {windowName = "popUpWindowMyDropz";} else {windowName = params2;} return currentwindowOpenFunction(params1, windowName);};unsafeWindow.open = newwindowOpenFunction;unsafeWindow.onbeforeunload = function() {currentwindowOpenFunction('', windowName).close();}; + function endsWithNumber(str){return isNaN(str.slice(-1)) ? false : true;}let clicked = false;setInterval(function(){for(let i=0; i< document.querySelectorAll(".btn.btn-info").length; i++){if(!clicked && !endsWithNumber(document.querySelectorAll(".btn.btn-info")[i].getAttribute('id')) && !document.querySelectorAll(".btn.btn-info")[i].innerText.includes("Submits")){document.querySelectorAll(".btn.btn-info")[i].click();break;}}},10000);} else {}}); + // Injecting from start document coded by @JustOlaf + if (location.host === 'techcyan.com'){delete window.document.referrer; window.document.__defineGetter__('referrer', function () {return "https://google.com/";});} + // Injecting from start document code by https://gist.github.com/lenivene + if (['magybu.net', 'xervoo.net', 'hurirk.net', 'usfinf.net', 'eloism.net', 'neexulro.net'].indexOf(location.host) > -1){Object.defineProperty(window,"ysmm",{set:function(b){var a=b,c="",d="";for(b=0;bd&&(a[b]=d),b=c,c=a.length);a=a.join("");a=window.atob(a);a=a.substring(a.length-(a.length-16));!(b=a=a.substring(0,a.length-16))||0!==b.indexOf("http://")&&0!==b.indexOf("https://")||(document.write("\x3c!--"),window.stop(),window.onbeforeunload=null,window.location=b);}});} + // Injecting code from start and the end of document coded by @Konf + if (['interactive', 'complete'].includes(document.readyState)) {onHtmlLoaded();} else {document.addEventListener('DOMContentLoaded', onHtmlLoaded);} function onHtmlLoaded() {if (['bas.nurul-huda.or.id', 'rotator.nurul-huda.sch.id'].indexOf(location.host) > -1){ } else { const listhide = document.querySelectorAll('#frame,.adb,#iframe,#particles-js,#canvas,.floawing-banner,#orquidea-slideup,.floating-banner,#wcfloatDiv4,#preloader,.vanta-canvas,.particles-js-canvas-el,#s65c,#ofc9,#overlay,#footerads,#d7b2,#_m_a_,#masthead_,.oulcsy,.sticky-bottom,.sticky-bottom1,.sticky-bottom2,.sticky-bottom3,.bElNbEFRL3JvbG89,.separator,html body iframe,html iframe,#cookie-pop,.vmyor,.tnjmvneldp,.full_post_area.rh-container,.sc-content-aside,#ofc9,.floawing-banner,div.demand-supply,.the_content,.alternative-ad'); for (const element of listhide) {element.remove();}} + if (['up4cash.com', 'app.menjelajahi.com', 'blog.menjelajahi.com'].indexOf(location.host) > -1){ } else { const listre = document.querySelectorAll('.banner-inner'); for (const element of listre) {element.remove();}} + if (['taiwancnan.com', 'blog.disheye.com'].indexOf(location.host) > -1){ } else { const listr = document.querySelectorAll('.blog-item'); for (const element of listr) {element.remove();}} + if (['patak.dropz.xyz', 'my.dropz.xyz'].indexOf(location.host) > -1){ } else { const listd = document.querySelectorAll('.text-left'); for (const element of listd) {element.remove();}} + if (location.host === 'jardima.com'){ } else { const listj = document.querySelectorAll('.td-ss-main-content'); for (const element of listj) {element.remove();}} + if(location.href.indexOf("diudemy.com") != -1 || location.href.indexOf("djxmaza.in") != -1 || location.href.indexOf("on-scroll.com") != -1 || location.href.indexOf("blog-everything.com") != -1 || location.href.indexOf("proviralhost.com") != -1 ) { + (function() {let FastInt = '{{1}}';if ( FastInt === '{{1}}' ) { FastInt = ''; }let delayArg = '{{2}}';if ( delayArg === '{{2}}' ) { delayArg = ''; }let boostArg = '{{3}}';if ( boostArg === '{{3}}' ) { boostArg = ''; } + if ( FastInt === '' ) {FastInt = '.?';} else if ( FastInt.charAt(0) === '/' && FastInt.slice(-1) === '/' ) {FastInt = FastInt.slice(1, -1);} else {FastInt = FastInt.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');}const FastInter = new RegExp(FastInt); + let delay = delayArg !== '*' ? parseInt(delayArg, 10) : -1;if ( isNaN(delay) || isFinite(delay) === false ) { delay = 1000; } + let boost = parseFloat(boostArg);boost = isNaN(boost) === false && isFinite(boost) ? Math.min(Math.max(boost, 0.02), 50) : 0.05; self.setInterval = new Proxy(self.setInterval, {apply: function(target, thisArg, args) {const [ a, b ] = args; + if ((delay === -1 || b === delay) && FastInter.test(a.toString())) {args[1] = b * boost;}return target.apply(thisArg, args);}});})();} + // ============================================ + // Captcha Mode + // ============================================ + let captchaMode = ['#_mform', '#userForm', '#link-view', '#frmprotect', '#ShortLinkId', '#submit-form', '#lview > form', '#file-captcha', '#btget > form', 'div#login form', 'F1', '#short-captcha-form', '#wpsafelink-landing', '.col-12 > form:nth-child(1)', '.col-md-4 > form:nth-child(1)', '.col-md-6 > form:nth-child(4)', '.contenido > form:nth-child(2)', '#main > div:nth-child(4) > form:nth-child(1)', 'div.col-md-12:nth-child(3) > form:nth-child(1)', '.content > div:nth-child(4) > form:nth-child(1)', '#showMe > center:nth-child(4) > form:nth-child(1)', '.sect > div:nth-child(1) > center:nth-child(7) > form:nth-child(1)', '#showMe > center:nth-child(1) > center:nth-child(4) > form:nth-child(1)', '#adb-not-enabled > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > form:nth-child(1)', 'button#continue.btn.btn-primary.btn-captcha', '.m-2.btn-captcha.btn-outline-primary.btn', '#yuidea-btn-before.yu-btn.yu-blue', '#yuidea-btn-after.yu-blue.yu-btn', '#fauform']; + for (let i = 0; i < captchaMode.length; i++) {Captchasub(captchaMode[i]);} + let klikMode = ['button#continue.btn.btn-primary.btn-captcha', '.m-2.btn-captcha.btn-outline-primary.btn', '#yuidea-btn-before.yu-btn.yu-blue', '#yuidea-btn-after.yu-blue.yu-btn', '#submitBtn']; + for (let i = 0; i < klikMode.length; i++) {Captchaklik(klikMode[i]);} + // ============================================ + // SetTimeout Mode + // ============================================ + let timeoutMode = { + '2': ['.gobut'], + '3': ['p.getlink', 'button.jeje', '.yu-blue.yu-btn', 'button#btn-get-link', '#links > a:nth-child(2)', 'button.btn-main.get-link', 'button#btn6.yu-btn.yu-go', '.mb-3 > .btn-primary.btn', 'input[name="method_free"]', 'div#wpsafe-generate a img', 'button#mdt.custom-btn.btn-7', 'button#btn-main.btn.btn-main', 'button#bt.btn.btn-info.btn-lg', 'button#article.btn.btn-success', 'input#btn-main.btn.btn-primary', 'button#getlink.getlink.disabled', '#link1s-snp > button:nth-child(1)', '#link1s-snp > button:nth-child(1)', 'button#showTimerText.btn.btn-accent', '#wpsafelinkhuman > img:nth-child(1)', 'button#submit-button.btn.btn-primary', '.next-button.text-white.btn-info.btn', 'button#btn6.g-recaptcha.btn.btn-primary', '#cl1 > a:nth-child(2) > font:nth-child(1)', '#cl1 > center:nth-child(1) > a:nth-child(1)', '.next-button.btn-lg.text-white.btn-info.btn', 'button#btn6.btn.btn-outline-primary.btn-captcha.m-2', '.col-md-8 > form:nth-child(17) > button:nth-child(3)', 'div.box-main:nth-child(2) > div:nth-child(4) > a:nth-child(1)', 'div.column:nth-child(2) > font:nth-child(2) > a:nth-child(8)'], + '4': ['.exclude-popad.open-continue-btn-org.btn-primary.btn'], + '5': ['#yuidea-btmbtn', 'div.complete a.btn', 'button#g-recaptcha.gobt', '#molien > a:nth-child(1)', 'a#surl1.btn-main.get-link', '#wpsafe-snp > a:nth-child(1)', '.close-ad-modal-go-ahead.close', 'button#invisibleCaptchaShortlink.btn-main.get-link', 'button#invisibleCaptchaShortlink.btn.ybtn.ybtn-accent-color.btn-captcha', 'button#invisibleCaptchaShortlink.btn.btn-outline-primary.btn-lg.btn-block.btn-captcha'], + '7': ['button#invisibleCaptchaShortlink.btn.btn-primary.btn-goo.btn-captcha'], + '9': ['div.lds-ellipsis']}; + let _timeoutMode = Object.keys(timeoutMode); + for (let i = 0; i < _timeoutMode.length; i++) {for (let j = 0; j < timeoutMode[_timeoutMode[i]].length; j++) {clickIfElementExists(timeoutMode[_timeoutMode[i]][j], +_timeoutMode[i]);}} + // ============================================ + // setInterval Mode + // ============================================ + let intervalMode = { + '3': ['#slu-link', '#makingdifferenttimer', 'a#finalx22.btn.btnstep1', '#wg-form > .btnstep1.btn', '#myButtonn > span:nth-child(1)', 'input.g-recaptcha.btn.btn-primary', '#mdt.btn.btn-primary.text-white.next-button', 'div.column:nth-child(2) > font:nth-child(2) > a:nth-child(8)', 'button#main-button.claim-button.btn.btn-lg.btn-accent', 'a.get-link.bg-red-600.px-8.py-2.rounded-md.inline-block'], + '5': ['a.btn-main.get-link', 'a.btn.m-2.btn-success', '.btn-danger.btn-raised', '#link1s.btn-primary.btn', '.close-me > a:nth-child(1)', 'button#link.btn.btn-primary', '#btn6.btn-captcha.btn-primary.btn', 'a.btn.btn-primary.get-link.text-white', '#makingdifferenttimer9 > .btn-success.btn'], + '7': ['#nextButton', 'button#get_link.btn.btn-primary.btn-sm']}; + let _intervalMode = Object.keys(intervalMode); + for (let i = 0; i < _intervalMode.length; i++) {for (let j = 0; j < intervalMode[_intervalMode[i]].length; j++) {clickIfElementExists(intervalMode[_intervalMode[i]][j], +_intervalMode[i], 'setInterval');}} + waitForElm('div#wpsafe-link > a', function(element) {const regex = /redirect=(.*)',/; + const m = regex.exec(element.onclick.toString())[1]; location.href = JSON.parse(atob(m)).safelink;}); + if (typeof hcaptcha=="object" && typeof apiCounter=="object") { window.app_country_visitor=""; + window.hcaptcha.getResponse=()=>{}; + window.apiCounter.generateURL(); + window.apiCounter.redirectTo(bp("button.button-element-verification"));} + if (typeof tokenURL=="string") { redirect(atob(window.tokenURL));} + if (elementExists('#before-captcha')) { setTimeout(function() {bp('#before-captcha').submit();}, 3000);} + if (elementExists('#surl')) { setInterval(function() { bp('#surl.btn-success.m-2.btn').click();}, 5000);} + if (elementExists('#url_qu')) { setTimeout(function() {bp('.ad-banner.btn-captcha.btn-primary.btn').click();}, 3000);} + if (bp('#link-view > div[style="display: none;"]')) {bp('#link-view > div[style="display: none;"]').style.display = '';} + if (elementExists('a#firststep-btn.btn.btnstep1')) { setTimeout(function() {bp('button#getlink.btn.m-2.btn-success.disabled').click();}, 3000);} + if (location.host === 'faucetpay.io') {} else {Captchasub('form.text-center');} + if (['www.4shared.com', 'stfly.me'].indexOf(location.host) > -1) {} else {Captchasub("form[action='']");} + if (location.host === 'www.upload-4ever.com') {} else {clickIfElementExists('.btn-outline-white.btn', 3);} + if (location.host === 'uploadhaven.com') {} else {clickIfElementExists('button.btn-block.btn-success', 5, 'setInterval');} + if (['ctbl.me', 'zshort.cc'].indexOf(location.host) > -1 && location.search === '') {location = 'https://mdn.rest/?url8j=' + location.href;} + if (location.host === 'fc-lc.com') {window.top != window.self;} else {clickIfElementExists('button#submitbtn.g-recaptcha.btn.btn-primary', 3);} + if (['uploadhaven.com', 'patak.dropz.xyz', 'my.dropz.xyz'].indexOf(location.host) > -1) {} else {clickIfElementExists('button.btn.btn-success', 7);} + if (['paid4.link', 'ponselharian.com'].indexOf(location.host) > -1) {window.top != window.self;} else {clickIfElementExists('.btn-captcha.btn-sm.btn-primary.btn', 5);} + if (['www.solidfiles.com', 'usersdrive.com', 'workupload.com'].indexOf(location.host) > -1) {} else {clickIfElementExists('.btn-sm.btn-default.btn', 5, 'setInterval');} + if (['konstantinova.net', 'mobilereview.info'].indexOf(location.host) > -1) {} else {if (elementExists('#makingdifferenttimer')) { setInterval(function() { bp('#url_qu > a:nth-child(1)').click();}, 3000);}} + if (['coin.mg', 'rancah.com'].indexOf(location.host) > -1) {window.top != window.self;} else {if (elementExists('#links')) { setInterval(function() { bp('#links > form:nth-child(2)').submit();}, 3000);}} + if (['rancah.com','trangchu.news', 'techacode.com','downfile.site','upload-4ever.com'].includes(window.location.hostname) > -1) {window.top != window.self;} else {clickIfElementExists('input.btn.btn-primary', 5);} + if (location.host === 'teknosimple.com' && bp('.slu-captcha') !== null) {var ts = function() {if (window.grecaptcha.getResponse?.().length > 0) {bp('#slu-continue.slu-button').click(); clearInterval(ks);}};var ks = setInterval(ts, 500);} + if (['trangchu.news', 'downfile.site', 'techacode.com'].includes(window.location.hostname) > -1 && bp('.captcha') !== null) {var o = function() {if (window.grecaptcha.getResponse?.().length > 0) {bp('#proceed').click(); clearInterval(k);}};var k = setInterval(o, 500);} + if (location.host === 'faucetpay.io' && bp('.h-captcha') !== null) {var fp = function() {if (window.grecaptcha.getResponse?.().length > 0) {bp('.btn-danger.btn-lg.btn').click(); clearInterval(fcp);}};var fcp = setInterval(fp, 500);} + if (['blogmado.com','fc-lc.com', 'chooyomi.com','paid4.link','usersdrive.com', 'zentum.club', 'patak.dropz.xyz', 'my.dropz.xyz', 'workupload.com', 'taiwancnan.com','solarchaine.com','shortit.pw','djxmaza.in'].indexOf(location.host) > -1) {window.top != window.self;} else {clickIfElementExists('button.btn:nth-child(4)', 2, 'setInterval');} + if (['bitlinks.pw','ayelads.com', 'apkadmin.com','cashearn.cc','rancah.com','digitalnaz.net','upload-4ever.com','hexupload.net','upfiles.app','cut-y.co','keeplinks.org','fileshare.adshorturl.com','bowfile.com','letsupload.io','workupload.com'].includes(window.location.hostname) > -1) {} else {if (elementExists('div.col-md-4:nth-child(2)')) { setInterval(function() { bp('div.col-md-4:nth-child(2) > span:nth-child(1) > img:nth-child(1)').click();}, 5000);}} + let Numcode = bp('input.captcha_code'); let DigitNum; + function getLeft (d) {return parseInt(d.style.paddingLeft);} + if (Numcode) {DigitNum = Numcode.parentElement.previousElementSibling.children[0].children; + Numcode.value = [].slice.call(DigitNum).sort(function (d1, d2) {return getLeft(d1) - getLeft(d2);}).map(function(d){return d.textContent;}).join('');} + let $ = window.jQuery; let respect = 'https://bas.nurul-huda.or.id/?url='; // Don't use My Scripts if You Change/Remove My Blogs, Except You Make Donations!!!. + if (location.host === 'www.4shared.com') {if (elementExists('.d3topTitle')) {$('.premium').text('IMPORTANT TRICKS By BloggerPemula : Wait 5 Second or more , Dont Close this Page ,Right Click Here Link Above, Open Link in New Tab, Close the Tabs if Your File not Downloaded, Try again the Right Click Methods, at This Time i Dont have Idea to Make it Auto , Do the Same Trick for All File Type in 4shared Site . Regards...');}} + if (['short.croclix.me','www.adz7short.space'].indexOf(location.host) > -1) {function fireMouseEvents(query) { const element = document.querySelector(query); + if (!element) return; ['mouseover', 'mousedown', 'mouseup', 'click'].forEach(eventName => {if (element.fireEvent) { element.fireEvent('on' + eventName);} else { const eventObject = document.createEvent('MouseEvents'); + eventObject.initEvent(eventName, true, false); element.dispatchEvent(eventObject);}});} + setInterval(function() { if ($("#link").length > 0) { fireMouseEvents("#link");}}, 500); + setInterval(function() { if ($("input#continue").length > 0) {fireMouseEvents("input#continue");} + if ($("a#continue.button").length > 0) {fireMouseEvents("a#continue.button");}}, 9000); setTimeout(function() {if ($("#btn-main").length < 0) return; fireMouseEvents("#btn-main");}, 5000);} + if (['upfiles.app', 'cut-y.co'].indexOf(location.host) > -1) {clickIfElementExists('.get-link.btn-download.btn-primary.btn', 7);} else if (location.host === 'rodjulian.com') {clickIfElementExists('a.btn.btn-primary.btn-lg.get-link', 5, 'setInterval');} else if (location.href.indexOf("ay.live") != -1 || location.href.indexOf("aylink.co") != -1 || location.href.indexOf("gitlink.pro") != -1) { var form = $('#go-link'); + $.ajax({type: 'POST', async: true, url: form.attr('action'), data: form.serialize(), dataType: 'json', success: function(data) {redirect(data.url);}});} else if (elementExists('#go-link')) {$("#go-link").unbind().submit(function(e) {e.preventDefault(); var form = $(this); var url = form.attr('action'); const pesan = form.find('button'); const notforsale = $(".navbar-collapse.collapse"); const blogger = $(".main-header"); const pemula = $(".col-sm-6.hidden-xs"); + $.ajax({type: "POST", url: url, data: form.serialize(), beforeSend: function(xhr) { pesan.attr("disabled", "disabled"); $('a.get-link').text('Bypassed by Bloggerpemula'); + notforsale.replaceWith(''); + blogger.replaceWith(''); + pemula.replaceWith('');}, success: function(result, xhr) {location.href=respect+result.url;}});});} + const bas = (h => { const result = { isNotifyNeeded: false, redirectDelay: 0, link: undefined }; + switch (h.host) {case 'bas.nurul-huda.or.id': case 'rotator.nurul-huda.sch.id': if (h.pathname === '/' && h.searchParams.has('url') && h.searchParams.has('sn')) { + result.link = h.searchParams.get('url') + '&sn=' + h.searchParams.get('sn').replace('&m=1', ''); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.searchParams.has('sub_id') && h.searchParams.has('site_id') && h.searchParams.has('ip_address')) { + result.link = h.searchParams.get('url') + '&sub_id=' + h.searchParams.get('sub_id') + '&site_id=' + h.searchParams.get('site_id') + '&ip_address=' + h.searchParams.get('ip_address'); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.searchParams.has('X-Amz-Algorithm') && h.searchParams.has('X-Amz-Credential') && h.searchParams.has('X-Amz-Date') && h.searchParams.has('X-Amz-SignedHeaders') && h.searchParams.has('X-Amz-Expires') && h.searchParams.has('X-Amz-Signature')) { + result.link = h.searchParams.get('url') + '&X-Amz-Algorithm=' + h.searchParams.get('X-Amz-Algorithm') + '&X-Amz-Credential=' + h.searchParams.get('X-Amz-Credential') + '&X-Amz-Date=' + h.searchParams.get('X-Amz-Date') + '&X-Amz-SignedHeaders=' + h.searchParams.get('X-Amz-SignedHeaders') + '&X-Amz-Expires=' + h.searchParams.get('X-Amz-Expires') + '&X-Amz-Signature=' + h.searchParams.get('X-Amz-Signature'); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.searchParams.has('ssa') && h.searchParams.has('id')) { + result.link = h.searchParams.get('url') + '&ssa=' + h.searchParams.get('ssa') + '&id=' + h.searchParams.get('id').replace('&m=1', ''); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.searchParams.has('id')) { + result.link = h.searchParams.get('url') + '&id=' + h.searchParams.get('id').replace('&m=1', ''); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.searchParams.has('article')) { + result.link = h.searchParams.get('url') + '&article=' + h.searchParams.get('article').replace('&m=1', ''); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.searchParams.has('antibot')) { + result.link = h.searchParams.get('url') + '&antibot=' + h.searchParams.get('antibot').replace('&m=1', ''); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.searchParams.has('code')) { + result.link = h.searchParams.get('url') + '&code=' + h.searchParams.get('code').replace('&m=1', ''); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.searchParams.has('viewed')) { + result.link = h.searchParams.get('url') + '&viewed=' + h.searchParams.get('viewed').replace('&m=1', ''); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.pathname === '/shortlink.php' && h.searchParams.has('sl')) { + result.link = h.searchParams.get('url') + 'sl' + h.searchParams.get('sl').replace('&m=1', ''); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.href.includes('#')) { + result.link = h.searchParams.get('url') + $(location).attr('hash'); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; + } else if (h.pathname === '/' && h.searchParams.has('url') && h.href.includes('bloogerspoot.')) {window.location.assign('https://softindex.website'+ (location.search).substring(27)); + } else if (h.pathname === '/' && h.searchParams.has('url') && h.href.includes('gos2.urlcash')) {window.location.assign('https://urlcash.click'+ (location.search).substring(31)); + } else if (h.pathname === '/' && h.searchParams.has('url')) { + result.link = h.searchParams.get('url').replace('&m=1', '').replace('
', ''); result.redirectDelay = 5; result.isNotifyNeeded = true; return result; } break; + default: break;}})(new URL(location.href)); + if (bas) { const { isNotifyNeeded, redirectDelay, link } = bas; + if (isNotifyNeeded) { notify(`Please Wait a moment .....You will be Redirected to Your Destination in ${redirectDelay} seconds`);} + setTimeout(() => {location.href = link;}, redirectDelay * 1000);} + const l = (h => {const b = h.pathname === '/verify/' && /^\?([^&]+)/.test(h.search); const p = h.pathname === '/blog3/verify/' && /^\?([^&]+)/.test(h.search); + switch (h.host) {case 'okrzone.com': if (b) { meta('https://gtlink.co/' + RegExp.$1);} break; + case 'ezimg.co': if (b) { meta('https://eng.ezimg.co/' + RegExp.$1);} break; + case 'educur.com': if (b) { meta('https://blog.flyrar.com/' + RegExp.$1);} break; + case 'tecmundo.net': if (b) { meta('https://go.jaelink.us/' + RegExp.$1);} break; + case 'examkhata.com': if (b) { meta('https://playlink.xyz/' + RegExp.$1);} break; + case 'examsolution.in': if (b) { meta('https://kukslincs.xyz/' + RegExp.$1);} break; + case 'mytop5.club': if (b) { meta('https://technemo.xyz/blog/' + RegExp.$1);} break; + case 'ledifha.com': if (b) { meta('https://process.ledifha.com/' + RegExp.$1);} break; + case 'adybrands.in': if (b) { meta('https://mytop5.club/verify/?' + RegExp.$1);} break; + case 'forexshare.net': if (b) { meta('https://shorturl.sh2rt.com/' + RegExp.$1);} break; + case 'www.lootcash.vip': if (b) { meta('https://ads.lootcash.vip/' + RegExp.$1);} break; + case 'www.allcryptotips.com': if (b) { meta('https://zenshort.com/' + RegExp.$1);} break; + case 'gamerfang.in': if (b) { meta('https://faux.gamerfang.in/tech/' + RegExp.$1);} break; + case 'economiarelevante.com.br': if (b) { meta('https://shrinkgold.com/' + RegExp.$1);} break; + case 'techrayzer.com': if (b) { meta('https://techrayzer.com/insurance/' + RegExp.$1);} break; + case 'teerclub.com': if (b) { meta('https://www.allcryptotips.com/verify/?' + RegExp.$1);} break; + case 'techboyz.xyz': case 'studystar.xyz': if (b) { meta('https://short2fly.xyz/' + RegExp.$1);} break; + case 'zuba.link': if (/^\/([^\/]+)/.test(h.pathname)) { return 'https://go.zuba.link/' + RegExp.$1; } break; + case 'faucethub.ly': if (/^\/hs\/\/([^\/]+)/.test(h.pathname)) {return 'https://goads.ly/' + RegExp.$1;}break; + case 'cekip.site': case 'www.cekip.site': if (/^\/go\/([^\/]+)/.test(h.pathname)) { meta(atob(RegExp.$1));} break; + case 'sl.easysl.click': if (/^\/step1\/([^\/]+)/.test(h.pathname)) {return 'https://easysl.click/' + RegExp.$1;}break; + case 'www.gifans.com': if (/^\/link\/([^\/]+)/.test(h.pathname)) {return 'https://shortlink.prz.pw/' + RegExp.$1;}break; + case 'zonearn.biz': if (/^\/(.+)/.test(h.pathname) && h.searchParams.has('tok')) {return h.searchParams.get('tok');}break; + case 'nulledsafe.com': if (/^\/link\/([^\/]+)/.test(h.pathname)) {return 'https://golink.nulledsafe.com/' + RegExp.$1;}break; + case 'step0.shortlinks.click': if (/^\/([^\/]+)/.test(h.pathname)) { return 'https://shortlinks.click/' + RegExp.$1; } break; + case 'crypto-faucet.xyz': if (/^\/bitco\/link\/([^\/]+)/.test(h.pathname)) {return 'https://doctor-groups.com/link/' + RegExp.$1;}break; + case 'www.meykmen.com': if (h.searchParams.has('url')) {return 'https://arabplus2.co/' + h.searchParams.get('url').substring(22);} break; + //case 'studyuo.com': if (h.pathname === '/pro2/verify/' && /^\?([^&]+)/.test(h.search)) { meta('https://csd.xmod.in/' + RegExp.$1);} break; + case 'horrorbitcoin.com': if (h.searchParams.has('dex')) { meta('https://panylink.com//' + h.searchParams.get('dex').substring(1));} break; + case 'techmody.io': if (h.pathname === '/' && h.searchParams.has('check')) { meta(decodeURIComponent(h.searchParams.get('check')));} break; + case 'froggyreviews.com': if (h.searchParams.has('mflink')) { meta('https://froggyreviews.com/go/' + h.searchParams.get('mflink'));} break; + case 'xmod.in': if (h.pathname === '/blog/verify/' && /^\?([^&]+)/.test(h.search)) { meta('https://mytop5.club/verify/?' + RegExp.$1);} break; + case 'bingeflix.xyz': if (h.pathname === '/' && h.searchParams.has('link')) {meta ('https://linkyearn.com/' + h.searchParams.get('link'));}break; + case 'hosting4lifetime.com': if (h.pathname === '/blog/verify/' && /^\?([^&]+)/.test(h.search)) { meta('https://abcshort.com/' + RegExp.$1);} break; + case 'acortame.xyz': if (window.location.hash) {location.href ="https://rotator.nurul-huda.sch.id/?url="+(atob(window.location.hash.substr(1)));} break; + case 'blog.textpage.xyz': if (h.searchParams.has('ajhvgadhdhgkdsvkd')) { meta('https://short.url2go.in/' + h.searchParams.get('ajhvgadhdhgkdsvkd'));} break; + case 'my.dropz.xyz': if ( h.href.includes('/checkpoint') && location.search === '') { return 'https://my.dropz.xyz/checkpoint?redir=/site-friends'; } break; + case 'gadgets.techymedies.com': if (h.pathname === '/' && h.searchParams.has('token')) { meta('https://blog.disheye.com/' + h.searchParams.get('token'));} break; + case 'short.clickscoin.com': case 'watchdoge.xyz': case 'dogeclick.net': if (/^\/ccsl\/([^/]+)/.test(h.pathname)) {return 'https://ccsl.xyz/' + RegExp.$1;}break; + case 'patak.dropz.xyz': if ( h.href.includes('/checkpoint') && location.search === '') { return 'https://patak.dropz.xyz/checkpoint?redir=/site-friends'; } break; + case 'jrlinks.in': if (h.pathname === '/safe2.php' && h.searchParams.has('link')) { meta('https://internet.webhostingtips.club/' + h.searchParams.get('link'));} break; + case 'crazyblog.in': case 'www.crazyblog.in': if (h.pathname === '/xhod/verify/' && /^\?([^&]+)/.test(h.search)) { meta('https://redd.crazyblog.in/' + RegExp.$1);} break; + case 'blog.urlbharat.xyz': if (h.pathname === '/safe.php' && h.searchParams.has('link')) { return 'https://get.urlbharat.xyz/safe.php?link=' + h.searchParams.get('link');} break; + case 'short2fly.xyz': case 'cbshort.com': if ( h.searchParams.has('url') && h.href.includes('bloogerspoot.') ) {window.location.assign('https://softindex.website'+ (location.search).substring(147));} break; + case 'dogeclick.net': if (/^\/short\/([^/]+)/.test(h.pathname)) {return 'https://short.clickscoin.com/' + RegExp.$1;} else if (/^\/ccsl\/([^/]+)/.test(h.pathname)) {return 'https://ccsl.xyz/' + RegExp.$1;}break; + case 'clickscoin.com': if (/^\/short\/([^/]+)/.test(h.pathname)) { return 'https://short.clickscoin.com/' + RegExp.$1;} else if (/^\/shortccsl\/([^/]+)/.test(h.pathname)) { return 'https://ccsl.xyz/' + RegExp.$1;} break; + case 'blog.crazyblog.in': if (/^\/step\d+?\/([^/]+)$/.test(h.pathname)) {return 'https://wplink.online/' + RegExp.$1;} else if (/^\/visit\d+?\/step\d+?\/([^/]+)$/.test(h.pathname)) {return 'https://cblink.crazyblog.in/' + RegExp.$1;}break; + case 'anime.dutchycorp.space': case 'movies.dutchycorp.space': case 'tech.dutchycorp.space': case 'cool-time.dutchycorp.space': if (/^\/redir[^.]+?\.php$/.test(h.pathname) && h.searchParams.has('code')) {return h.searchParams.get('code') + '?verif=0';}break; + case 'kiiw.icu': if (h.pathname === '/check.php' && h.searchParams.has('alias')&& h.searchParams.has('wis')&& h.searchParams.has('siw')){ return 'https://kiiw.icu/' + h.searchParams.get('alias')+ '?wis=' + h.searchParams.get('wis')+ '&siw=' + h.searchParams.get('siw');} break; + case 'ls2earn.in': if ( h.searchParams.has('url') && h.href.includes('bloogerspoot.') ) {window.location.assign('https://softindex.website'+ (location.search).substring(130));} else if (h.searchParams.has('api') && h.searchParams.has('url')) {return h.searchParams.get('url');} break; + case 'ls2earn.com': case 'besturl.link': if ( h.searchParams.has('url') && h.href.includes('bloogerspoot.') ) {window.location.assign('https://softindex.website'+ (location.search).substring(144));} else if (h.searchParams.has('api') && h.searchParams.has('url')) {return h.searchParams.get('url');} break; + case 'shrinkearn.com': case 'clk.sh': if ( h.searchParams.has('url') && h.href.includes('bloogerspoot.') ) {window.location.assign('https://softindex.website'+ h.searchParams.get('url').substring(22));} else if (h.searchParams.has('api') && h.searchParams.has('url')) {return h.searchParams.get('url');} break; + case 'birdurls.com': case 'linkrex.net': case 'softindex.website': case 'dash-free.com': case 'owllink.net': case 'exe.io': if (h.searchParams.has('url') && h.href.indexOf('#')) { return 'https://' + h.searchParams.get('url') + h.href.substr(h.href.indexOf('#')); } else if (h.searchParams.has('api') && h.searchParams.has('url')) {return h.searchParams.get('url');} break; + case 'usalink.io': if ( h.searchParams.has('url') && h.href.includes('bloogerspoot.') ) {window.location.assign('https://softindex.website'+ (location.search).substring(219));} else if (h.searchParams.has('url') && h.href.includes('mineshor.')) {return 'https://' + h.searchParams.get('url');} else if (h.searchParams.has('url') && h.href.indexOf('#')) { return 'https://' + h.searchParams.get('url') + h.href.substr(h.href.indexOf('#')); } else if (h.searchParams.has('api') && h.searchParams.has('url')) {return h.searchParams.get('url');} break; + default: break;} })(new URL(location.href)); if (l) {location.href = l; } + let apiBypassVip = {selectors: ['#stepid', '.locked', '#steps', '#link', '#targetbtn', '#theLinkID', '.locked-button'], + re: /mboost\.me|letsboost\.net|social-unlock\.com|boostme\.link|sub2unlock\.net|sub2unlock\.com/,}; + for (let i = 0; i < apiBypassVip.selectors.length; i++) {BypassedByBloggerPemula(apiBypassVip.re, function() {if (elementExists(apiBypassVip.selectors[i])) {fetch('https://api.bypass.vip/',{"headers": {"content-type":"application/x-www-form-urlencoded; charset=UTF-8","x-requested-with":"XMLHttpRequest"},"body":new URLSearchParams({url:document.URL}),"method":"POST",}).then(res=>res.json()).then(res=>{if(res.status!=="success") {redirect(res.destination);}});}});} + BloggerPemula('kienthucrangmieng.com|coindoog.com|tieutietkiem.com|askpaccosi.com|shopsixseven.com|hoclamdaubep.com|thuocdangian.net|chinhnhacoban.com|coin-free.com|fanclup.info|chamcuuhoc.com|nhacremix.biz|doanvanhai.biz|conghuongtu.net|95news.com|tremamnon.com|hynews.biz', 'wpsafelink', '', false); + BloggerPemula('soft3arbi.com', 'link', '', false); + BloggerPemula('7apple.net', 'go', 'https://illink.net/', false); + BloggerPemula('niinga.com', 'get', 'https://liinkat.com/', false); + BloggerPemula('m.newhit.me', 'link', 'https://link3s.net/', false); + BloggerPemula('wpking.in', 'link', 'https://o.ovlinks.com/', false); + BloggerPemula('jazbaat.in', 'link', 'https://go.rplinks.in/', false); + BloggerPemula('itechlogic.in', 'link', 'https://go.apurl.in/', false); + BloggerPemula('blog.hostratgeber.de', 'go', 'https://c2g.at/', false); + BloggerPemula('autodime.com', 'go', 'https://go.linkrex.net/', false); + BloggerPemula('techcartz.com', 'link', 'https://ads.mdlink.in/', false); + BloggerPemula('1apple.xyz', 'link', 'https://link.turkdown.com/', false); + BloggerPemula('kerdlinfo.in', 'link', 'https://go.lrshortner.com/', false); + BloggerPemula('forextrader.today', 'get', 'https://link2end.com/p/', false); + BloggerPemula('apasih.my.id', 'link', 'https://link.get4llink.com/', false); + BloggerPemula('crickblaze.com', 'getlink', 'https://go.coinadfly.com/', false); + BloggerPemula('videoslyrics.com', 'postid', 'https://ser3.crazyblog.in/', false); + BloggerPemula('claimfey.com|zubatecno.com', 'link', 'https://go.zuba.link/', false); + BloggerPemula('cryptomeloud.com', 'adlinkfly', 'https://links.crypturls.com/', false); + BloggerPemula('crazyblog.in|newsharsh.com', 'postid', 'https://hr.vikashmewada.com//', false); + BloggerPemula('qualitystudymaterial.in', 'link', 'https://thehostingmentor.com/mylink/', false); + BloggerPemula('techloadz.com|sportsmediaz.com', 'link', 'https://link.cloudshrinker.com//', false); + BypassedByBloggerPemula(/ouo.today/, function() {location.href = nextUrl;}); + BypassedByBloggerPemula(/yoshare.net/, function() { bp('#yuidea').submit();}); + BypassedByBloggerPemula(/sharemods.com/, function() { $('#dForm').submit();}); + BypassedByBloggerPemula(/upload.ee/, function() {clickIfElementExists('#d_l', 2);}); + BypassedByBloggerPemula(/specx.me/, function() {clickIfElementExists('.butt', 2);}); + BypassedByBloggerPemula(/tmker.com/, function() { bp('#submit_first_page').submit();}); + BypassedByBloggerPemula(/prx.ee/, function() {clickIfElementExists('#final_link', 1);}); + BypassedByBloggerPemula(/1ink.cc/, function() {clickIfElementExists('#countingbtn', 1);}); + BypassedByBloggerPemula(/up-load.one/, function() {clickIfElementExists('#submitbtn', 1);}); + BypassedByBloggerPemula(/makemoneywithurl.com/, function() { bp('#hidden form').submit();}); + BypassedByBloggerPemula(/evoload.io/, function() {clickIfElementExists('#generatebtn', 1);}); + BypassedByBloggerPemula(/cryptosh.pro/, function() {clickIfElementExists('#EarnButton', 2);}); + BypassedByBloggerPemula(/keeplinks.org/, function() {clickIfElementExists('#btnchange', 2);}); + BypassedByBloggerPemula(/theconomy.me/, {'/': ['link', 'https://link.theconomy.me/'],}, false); + BypassedByBloggerPemula(/punyablog.my.id/, {'/safe.php': ['link', 'https://q8c.xyz/'],}, false); + BypassedByBloggerPemula(/mkomsel.com/, function() {clickIfElementExists('#downloadfile', 12);}); + BypassedByBloggerPemula(/drop.download/, function() {clickIfElementExists('.btn-download', 2);}); + BypassedByBloggerPemula(/jardima.com/, function() {clickIfElementExists('.btn-primary.btn', 3);}); + BypassedByBloggerPemula(/playstore.pw/, function() { $('.col-md- > form:nth-child(1)').submit();}); + BypassedByBloggerPemula(/1shortlink.com/, function() {clickIfElementExists('#redirect-link', 3);}); + BypassedByBloggerPemula(/file-upload.com/, function() {clickIfElementExists('#download-btn', 2);}); + BypassedByBloggerPemula(/mirrored.to/, function() {clickIfElementExists('.larger.secondary', 2);}); + BypassedByBloggerPemula(/forex-trnd.com|gawbne.com/, function() { bp('#exfoary-form').submit();}); + BypassedByBloggerPemula(/modebaca.com/, function() {clickIfElementExists('.btn-success.btn', 1);}); + BypassedByBloggerPemula(/modsfire.com/, function() {clickIfElementExists('.download-button', 2);}); + BypassedByBloggerPemula(/sahityt.com/, {'/verify/': [RexBp, 'https://google.v2links.com/'],}, false); + BypassedByBloggerPemula(/dddrive.me/, function() {clickIfElementExists('.btn-outline-primary', 2);}); + BypassedByBloggerPemula(/medipost.org/, {'/verify/': [RexBp, 'http://links.medipost.org/'],}, false); + BypassedByBloggerPemula(/videolyrics.in/, {'/verify/': [RexBp, 'http://ser3.crazyblog.in/'],}, false); + BypassedByBloggerPemula(/jameeltips.us/, function() {clickIfElementExists('#continue_button_1', 1);}); + BypassedByBloggerPemula(/antonimos.de/, function() {clickIfElementExists('#cbt', 5, 'setInterval');}); + BypassedByBloggerPemula(/techyadjectives.com/, {'/check/': [RexBp, 'https://demo.pvidly.in/'],}, false); + BypassedByBloggerPemula(/usersdrive.com/, function() {clickIfElementExists('.btn-download.btn', 1);}); + BypassedByBloggerPemula(/post.copydev.com/, function() {clickIfElementExists('.btn-success.btn', 6);}); + BypassedByBloggerPemula(/uppit.com/, function() {clickIfElementExists('.btn-primary.btn-xl.btn', 2);}); + BypassedByBloggerPemula(/krakenfiles.com/, function() {clickIfElementExists('.download-now-text', 2);}); + BypassedByBloggerPemula(/go.insurglobal.xyz/, {'/': ['link', 'https://link.insurglobal.xyz/'],}, false); + BypassedByBloggerPemula(/adsy.pw|linkpay.cc|wi.cr|pndx.live/, function() { bp('#link-view').submit();}); + BypassedByBloggerPemula(/linegee.net/, function() {clickIfElementExists('.btn-xs.btn-primary.btn', 2);}); + BypassedByBloggerPemula(/zippyshare.com|filedm.com/, function() {clickIfElementExists('#dlbutton', 3);}); + BypassedByBloggerPemula(/bildirim.in|bildirim.eu/, function() {clickIfElementExists('#btnPermission', 1);}); + BypassedByBloggerPemula(/userscloud.com|dosya.co/, function() {clickIfElementExists('#btn_download', 2);}); + BypassedByBloggerPemula(/hexupload.net/, function() {clickIfElementExists('.btn-success.btn-lg.btn', 1);}); + BypassedByBloggerPemula(/solidfiles.com/, function() {clickIfElementExists('.btn-sm.btn-primary.btn', 2);}); + BypassedByBloggerPemula(/faucetpay.io/, function() {clickIfElementExists('.btn-block.btn-primary.btn', 3);}); + BypassedByBloggerPemula(/get.urlbharat.xyz/, {'/safe.php': ['link', 'https://video.earnspace.in/'],}, false); + BypassedByBloggerPemula(/insurance-space.xyz/, {'/': ['link', 'https://link.insurance-space.xyz/'],}, false); + BypassedByBloggerPemula(/dailyuploads.net/, function() {clickIfElementExists('.inner > a:nth-child(9)', 2);}); + BypassedByBloggerPemula(/files.im/, function() {clickIfElementExists('.btn-dow.btn', 2);bp('#F1').submit();}); + BypassedByBloggerPemula(/cooklike.info|model-tas-terbaru.com/, {'/': ['link', 'https://yousm.link/'],}, false); + BypassedByBloggerPemula(/lets.5get.net/, function() {clickIfElementExists('.jump_link > a:nth-child(1)', 2);}); + BypassedByBloggerPemula(/cshort.org/, function() {clickIfElementExists('.timer.redirect', 3, 'setInterval');}); + BypassedByBloggerPemula(/megaupto.com/, function() {clickIfElementExists('#direct_link > a:nth-child(1)', 2);}); + BypassedByBloggerPemula(/blog-everything.com/, function() {clickIfElementExists('button.btn.btn-warning', 3);}); + BypassedByBloggerPemula(/delishwell.com|artiskini.com/, {'/': ['link', 'https://link.paid4link.net/'],}, false); + BypassedByBloggerPemula(/tinyurl.so/, function() {clickIfElementExists('.btn.btn-secondary', 3, 'setInterval');}); + BypassedByBloggerPemula(/douploads.net/, function() {clickIfElementExists('.btn-primary.btn-lg.btn-block.btn', 2);}); + BypassedByBloggerPemula(/takem.co|themorningtribune.com/, {'/verify/': [RexBp, 'https://push.bdnewsx.com/'],}, false); + BypassedByBloggerPemula(/informaxonline.com|gaminplay.com/, {'/': ['link', 'https://go.adslinkfly.online/'],}, false); + BypassedByBloggerPemula(/webhostingtips.club/, {'/safe.php': ['link', 'https://jrlinks.in/safe2.php?link='],}, false); + BypassedByBloggerPemula(/litecoin.host|skipads.click/, function() {clickIfElementExists('#wBtn', 3, 'setInterval');}); + BypassedByBloggerPemula(/ponselharian.com/, function() {if (elementExists('#link-view')) {window.scrollTo(0,9999);}}); + BypassedByBloggerPemula(/techrfour.com|veganal.co|veganho.co/, {'/go/': [RexBp, 'https://push.bdnewsx.com/'],}, false); + BypassedByBloggerPemula(/linkerload.com/, function() {clickIfElementExists("#download form input[id='button1']", 2);}); + BypassedByBloggerPemula(/ayelads.com/, function() {clickIfElementExists('.btn-bl.btn-primary.btn', 5, 'setInterval');}); + BypassedByBloggerPemula(/mp4upload.com/, function() {clickIfElementExists('#todl', 2);$("form[name='F1']").submit();}); + BypassedByBloggerPemula(/adfoc.us/, function() {if (elementExists('#skip')) {let adf = bp('.skip').href;redirect(adf);}}); + BypassedByBloggerPemula(/wp.sekilastekno.com/, function() {clickIfElementExists('div > div > button', 3, 'setInterval');}); + BypassedByBloggerPemula(/letsupload.io/, function() {clickIfElementExists('button.btn.btn--primary.type--uppercase', 1);}); + BypassedByBloggerPemula(/informaxonline.com|gaminplay.com/, {'/verify/': [RexBp, 'https://go.adslinkfly.online/'],}, false); + BypassedByBloggerPemula(/largestpanel.in|earnme.club|usanewstoday.club/, function() {clickIfElementExists('#tp-snp2', 1);}); + BypassedByBloggerPemula(/healdad.com|gamalk-sehetk.com/, function() {clickIfElementExists('.submitBtn', 3, 'setInterval');}); + BypassedByBloggerPemula(/assettoworld.com/, function() {clickIfElementExists('.text-capitalize.btn-outline-success.btn', 3);}); + BypassedByBloggerPemula(/chooyomi.com|blogmado.com/, () => waitForElm(".get-link > a:nth-child(1)", cho => redirect(cho.href))); + BypassedByBloggerPemula(/bestfonts.pro/, () => waitForElm(".download-font-button > a:nth-child(1)", pro => redirect(pro.href))); + BypassedByBloggerPemula(/cutt.net|cut-y.net|cutty.app/, function() {clickIfElementExists('#submit-button', 5, 'setInterval');}); + BypassedByBloggerPemula(/docs.google.com/, function() {if (elementExists('#uc-dl-icon')) {bp('#downloadForm').submit();} else {}}); + BypassedByBloggerPemula(/workupload.com/, function() {if (elementExists('#download')) {clickIfElementExists('.btn-prio.btn', 2);}}); + BypassedByBloggerPemula(/techus.website/, function() { $('.code-block-4.code-block > form').submit();$('.topnav > form').submit();}); + BypassedByBloggerPemula(/1link.club/, function() {$("a[target='_blank']").removeAttr("target");clickIfElementExists('#download', 1);}); + BypassedByBloggerPemula(/zegtrends.com/, function() {clickIfElementExists('#go', 3);clickIfElementExists('.bsub', 3, 'setInterval');}); + BypassedByBloggerPemula(/forex-articles.com|forexlap.com|forexmab.com/, function() {clickIfElementExists('.oto > a:nth-child(1)', 1);}); + BypassedByBloggerPemula(/linkspy.cc/, function() {if (elementExists('.skipButton')) {let lsp = bp('.skipButton').href;redirect(lsp);}}); + BypassedByBloggerPemula(/automotur.club|sanoybonito.club/, function() {clickIfElementExists('.g-recaptcha', 3);bp('#page2').submit();}); + BypassedByBloggerPemula(/uploadhaven.com/, function() {clickIfElementExists('.alert > a:nth-child(1)', 2);bp('#form-download').submit();}); + BypassedByBloggerPemula(/cashearn.cc|bitlinks.pw/, function() {clickIfElementExists('.next-button.btn-lg.btn-info.btn', 3, 'setInterval');}); + BypassedByBloggerPemula(/upfiles.app|cut-y.co/, function() {if (elementExists('#captchaDownload')) {}else{bp('form.text-center').submit();}}); + BypassedByBloggerPemula(/pythondunyasi.com/, () => waitForElm("#countdown3 > span:nth-child(1) > a:nth-child(1)", pit => redirect(pit.href))); + BypassedByBloggerPemula(/litexblog.com/, function() {if (elementExists('.g-recaptcha')) {}else{clickIfElementExists('.bg-primary.btn', 5);}}); + BypassedByBloggerPemula(/bcvc.xyz|bcvc.ink/, function() {clickIfElementExists('.js-scroll-trigger.btn-xl.btn-outline.btn', 3, 'setInterval');}); + BypassedByBloggerPemula(/racedepartment.com/, function() {$("a[target='_blank']").removeAttr("target");clickIfElementExists('.button--cta', 2);}); + BypassedByBloggerPemula(/hxfile.co|ex-load.com|megadb.net/, function() {clickIfElementExists('.btn-dow.btn', 2);bp("form[name='F1']").submit();}); + BypassedByBloggerPemula(/tinyurl.is/, function() {if (elementExists('ul > li > a')) {const link = bp('a[id^=newskip-btn]').href;redirect(link);}}); + BypassedByBloggerPemula(/mega4up.org/, function() {clickIfElementExists('input.btn.btn-info.btn-sm', 2);clickIfElementExists('.btn-dark.btn', 2);}); + BypassedByBloggerPemula(/uploadev.org/, function() {clickIfElementExists('#dspeed > input:nth-child(3)', 1); clickIfElementExists('.directl', 1);}); + BypassedByBloggerPemula(/bayfiles.com|anonfiles.com|openload.cc|lolabits.se|letsupload.cc/, function() {clickIfElementExists('#download-url', 2);}); + BypassedByBloggerPemula(/fx4vip.com/, function() {$("a #button1[disabled='disabled']").removeAttr("disabled");clickIfElementExists('#button1', 2);}); + BypassedByBloggerPemula(/altblogger.net/, function() {clickIfElementExists('.form-send.m-2.btn-captcha.btn-outline-primary.btn', 3, 'setInterval');}); + BypassedByBloggerPemula(/satoshi-win.xyz|shorterall.com|promo-visits.site/, function() {clickIfElementExists('.box-main > button:nth-child(3)', 1);}); + BypassedByBloggerPemula(/mynewsmedia.co/, function() {clickIfElementExists('#myBtn.cssBtn.myBtn', 3);clickIfElementExists('#nxBtn.cssBtn.nxBtn', 5);}); + BypassedByBloggerPemula(/btcpany.com|zombiebtc.com|blog.zubatecno.com|news.claimfey.com|battleroyal.online/, function() { bp('#link1s-form').submit();}); + BypassedByBloggerPemula(/send.cm|racaty.net|files.im|sharemods.com|clicknupload.to|modsbase.com/, function() {clickIfElementExists('#downloadbtn', 1);}); + BypassedByBloggerPemula(/sub2get.com/, function() {if (elementExists('#butunlock')) {let subt = bp('#butunlock > a:nth-child(1)').href;redirect(subt);}}); + BypassedByBloggerPemula(/takefile.link/, function() {if (elementExists('#F1')) {bp('div.no-gutter:nth-child(2) > form:nth-child(1)').submit();} else {}}); + BypassedByBloggerPemula(/claimclicks.com/, function() {clickIfElementExists('div.col-md-12:nth-child(2) > form:nth-child(11) > button:nth-child(4)', 2);}); + BypassedByBloggerPemula(/ac.totsugeki.com/, function() {$("a[target='_blank']").removeAttr("target");clickIfElementExists('.btn-lg.btn-success.btn', 2);}); + BypassedByBloggerPemula(/fexkomin.xyz/, function() {$("a[target='_blank']").removeAttr("target");clickIfElementExists('.btn-captcha.btn-danger.btn', 3);}); + BypassedByBloggerPemula(/uptobhai.info|shortlinkto.info|uplinkto.vip|brbushare.info/, function() {clickIfElementExists('.btn-block.btn-primary.btn', 2);}); + BypassedByBloggerPemula(/rancah.com|menjelajahi.com|shortly.xyz/, function() {clickIfElementExists('.get-link.btn-lg.btn-success.btn', 5, 'setInterval');}); + BypassedByBloggerPemula(/shortit.pw/, function() {clickIfElementExists('.pulse.btn-primary.btn', 5);clickIfElementExists('a#btn2.btn.btn-primary.pulse', 3);}); + BypassedByBloggerPemula(/theprice.biz|massive.my.id|activity.my.id|caview.my.id/, function() {clickIfElementExists('a.btn.btn-primary.m-2.btn-captcha', 6);}); + BypassedByBloggerPemula(/upload-4ever.com/, function() {clickIfElementExists("input[name='method_free']", 2);clickIfElementExists('#downLoadLinkButton', 5);}); + BypassedByBloggerPemula(/fileshare.adshorturl.com/, function() {clickIfElementExists('.download-timer > a:nth-child(1) > span:nth-child(1)', 4, 'setInterval');}); + BypassedByBloggerPemula(/1fichier.com/, function() {if (elementExists('#pass')){}else {clickIfElementExists('.btn-orange.btn-general.ok', 1);bp('.alc').submit();}}); + BypassedByBloggerPemula(/proviralhost.com|examtadka.com/, function() {clickIfElementExists('#wait1button', 3);clickIfElementExists('#wait2button', 5, 'setInterval');}); + BypassedByBloggerPemula(/healdad.com|gamalk-sehetk.com|newforex.online|forex-gold.net|world-trips.net|mobi2c.com/, function() {clickIfElementExists('.submitBtn', 2);}); + BypassedByBloggerPemula(/adsgo.digital|newsnowbd.com|techus.website/, function() {clickIfElementExists('.myButton', 2); $('.code-block-1.code-block > form').submit();}); + BypassedByBloggerPemula(/anonym.ninja/, function() {var fd = window.location.href.split('/').slice(-1)[0];redirect(`https://anonym.ninja/download/file/request/${fd}`);}); + BypassedByBloggerPemula(/uptobox.com/, function() {clickIfElementExists('a.big-button-green:nth-child(1)', 2); clickIfElementExists('.download-btn', 3, 'setInterval');}); + BypassedByBloggerPemula(/on-scroll.com|diudemy.com/, function() {clickIfElementExists('.blog_btn.show_btn', 3);waitForElm("#next", roll => redirect(roll.href, false));}); + BypassedByBloggerPemula(/stfly.me/, function() {if (elementExists('.g-recaptcha')) {}else{clickIfElementExists('.form-send.m-2.btn-captcha.btn-outline-primary.btn', 3);}}); + BypassedByBloggerPemula(/i-polls.com/, function() {clickIfElementExists('button#btn', 2);clickIfElementExists('#anchor_button', 2);clickIfElementExists('a#safe_link', 30);}); + BypassedByBloggerPemula(/suratresmi.id/, function() {clickIfElementExists('button#hmn.btn-more', 3, 'setInterval');clickIfElementExists('a#hmn.btn-more',3, 'setInterval');}); + BypassedByBloggerPemula(/blog-forall.com/, function(){var bypasslinks = atob(`aH${bp("#landing [name='go']").value.split("aH").slice(1).join("aH")}`); redirect(bypasslinks);}); + BypassedByBloggerPemula(/olamovies.cyou/, function() {let omo = document.getElementsByTagName("script")[1].innerText.split("\n")[8].split(" ")[3].split("\"")[1];redirect(omo);}); + BypassedByBloggerPemula(/apkadmin.com/, function() {clickIfElementExists('.text > a:nth-child(4) > img:nth-child(1)', 1);bp('.download-file-button > form:nth-child(1)').submit();}); + BypassedByBloggerPemula(/newsharsh.com/, {'/box-office/verify/': [RexBp, 'https://hr.vikashmewada.com/'],'/english/verify/': [RexBp, 'https://crazyblog.in/harsh/verify/?'],}, false); + BypassedByBloggerPemula(/writedroid.in/, function() {clickIfElementExists('#shortPostLink', 5);clickIfElementExists('#showModalAds', 3);clickIfElementExists('#shortGoToLink.button', 5);}); + BypassedByBloggerPemula(/vosan.co/, function() {$("a[target='_blank']").removeAttr("target");clickIfElementExists('.elementor-size-lg', 2);clickIfElementExists('.wpdm-download-link', 2);}); + BypassedByBloggerPemula(/4shared.com/, function() {clickIfElementExists('.jsDownloadButton', 2);if (elementExists('.freeDownloadButton')) {bp("form[name^='redirectToD3Form']").submit();}}); + BypassedByBloggerPemula(/riadcrypto.com|donia2tech.com/, function() {var form = document.getElementById('wpsafelink-landing'); redirect(JSON.parse(atob(form.newwpsafelink.value)).linkr);}); + BypassedByBloggerPemula(/mobi2c.com|newforex.online|world-trips.net|forex-gold.net|healdad.com|gamalk-sehetk.com|mobitaak.com/, function() {clickIfElementExists('#go_d', 3, 'setInterval');}); + BypassedByBloggerPemula(/enit.in|clk.asia|clicksfly.com/, function() {var linkbypass = atob(`aH${bp("#link-view [name='token']").value.split("aH").slice(1).join("aH")}`);redirect(linkbypass);}); + BypassedByBloggerPemula(/daga88.today/, function() {if (elementExists('#traffic-countdown-1s')) {const daga = document.querySelectorAll('#wrapper'); for (const element of daga) {element.remove();}}}); + BypassedByBloggerPemula(/solarchaine.com/, function() {if (elementExists('#captchaShortlink')) {clickIfElementExists('button.btn:nth-child(4)', 2);} else {bp('.box-body > form:nth-child(2)').submit();}}); + BypassedByBloggerPemula(/rodjulian.com/, function() {if (elementExists('#traffic-countdown-1s')) {const roju = document.querySelectorAll('.site-content'); for (const element of roju) {element.remove();}}}); + BypassedByBloggerPemula(/uploadrar.com|chedrive.com|uptomega.me/, function() {clickIfElementExists('.mngez-free-download', 2);clickIfElementExists('#direct_link > a:nth-child(1)', 2);$('#downloadbtn').click();}); + BypassedByBloggerPemula(/azmath.info|aztravels.net|techacode.com/, () =>{if (elementExists('#megaurl-verified-captcha')) {clickIfElementExists('button.h-captcha', 3);} else {submit("#megaurl-banner-page", 5);}}); + BypassedByBloggerPemula(/studyuo.com/, {'/pro/': ['link', 'https://shrinkpay.crazyblog.in'],'/short/verify/': [RexBp, 'https://redd.crazyblog.in'], '/blog/verify/': [RexBp, 'https://speedynews.xyz/verify/?'],}, false); + BypassedByBloggerPemula(/crazyblog.in/, { '/finance/': ['link', 'https://shrinkpay.crazyblog.in'],'/hars/verify/': [RexBp, 'https://redd.crazyblog.in'], '/harsh/verify/': [RexBp, 'https://ser3.crazyblog.in/'],}, false); + BypassedByBloggerPemula(/9xupload.asia/, function() {clickIfElementExists('#container > table:nth-child(15) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(1) > a:nth-child(1)', 2);$("form[name='F1']").submit();}); + BypassedByBloggerPemula(/nathanaeldan.pro|freddyoctavio.pro|davisonbarker.pro/, function() { var urls = new URL(document.URL); var dest = urls.searchParams.get("dest"); var decoded = decodeURI(dest);redirect(decoded);}); + BypassedByBloggerPemula(/rekonise.com/, ()=>{let xhr=new XMLHttpRequest();xhr.onload=()=>redirect(JSON.parse(xhr.responseText).url);xhr.open("GET","https://api.rekonise.com/unlocks"+location.pathname,true);xhr.send();}); + BypassedByBloggerPemula(/wrbloggers.com/, () => {if (elementExists('div.col-sm-4')){clickIfElementExists('.btn-danger.btn-block.btn', 2);}else{var ju = setInterval( () => {click("#nextpagelink"); clearInterval(ju);},3000);}}); + BypassedByBloggerPemula(/cutin.it/, function() {let tin = [...document.getElementsByTagName("script")].filter(elem => elem.innerText !== "")[3].innerText.split("\n")[14].split(" ")[9].replace(";", "").replaceAll("\"", "");redirect(tin);}); + BypassedByBloggerPemula(/playnano.online/, function() {clickIfElementExists('#watch-link', 2);clickIfElementExists('.watch-next-btn.btn-primary.button', 2);clickIfElementExists('button.button.btn-primary.watch-next-btn', 5, 'setInterval');}); + BypassedByBloggerPemula(/wiki-topia.com/, function() {if (elementExists('.g-recaptcha')) {}else{clickIfElementExists("input[style^='font-weight: 700']", 2, 'setInterval');clickIfElementExists("input[style^='font-weight: 500']", 3, 'setInterval');}}); + BypassedByBloggerPemula(/mediafire.com/, function() {var bass; var md = function closeWindows(){window.close(); clearInterval(bass);};var mf = bp('.download_link .input').getAttribute('href'); console.log(mf); location.replace(mf); bass = setInterval(md, 1000 * 5);}); + BypassedByBloggerPemula(/dutchycorp.space|dutchycorp.ovh|gtlink.co|fc-lc.com|mdn.rest|antonimos.de|ctbl.me|zshort.cc|feyyora.fun|twitonet.com|oii.io/, function() {var ticker = setInterval(function(){ try{window.grecaptcha.execute(); clearInterval(ticker);} catch(e) {}},3000);}); + BypassedByBloggerPemula(/ytsubme.com/, function() {if (elementExists('.cont1')) {let ytsub = bp("#msg-box3-o > div > div > div.col-md-4.text-center > div > div > div > div.col-md-8.col-md-offset-2.text-xs-center > div > div > script").innerHTML.split(';')[7].split('=')[1].replaceAll('\'', "");redirect(ytsub);}}); + BypassedByBloggerPemula(/faucet.work|techlearningtube.in|wildblog.me|blogginglass.com|technoflip.in|arahtekno.com|mopahealth.com|welovecrypto.xyz|crypto-blog.xyz|jiotech.net|crypto4tun.com|adshorturl.com|digitalnaz.net/, function() {var el = document.querySelector("input[name=newwpsafelink]");redirect(JSON.parse(atob(el.value)).linkr);}); + BypassedByBloggerPemula(/linkvertise.com|linkvertise.download/, function() {var linkver = new XMLHttpRequest; linkver.responseType = 'json'; linkver.open('GET', `https://main-bypass-server.tk/v3?${document.location.href.slice(0,-1)}`, !0); linkver.onload = function(n) {4 === linkver.readyState && redirect(this.response.destination);}; linkver.send(null);}); + BypassedByBloggerPemula(/drive.google.com/, function() {var dg = window.location.href.split('/').slice(-2)[0];if (window.location.href.includes('drive.google.com/file/d/')) {redirect(`https://drive.google.com/u/0/uc?id=${dg}&export=download`).replace('
', '');} else if (window.location.href.includes('drive.google.com/u/0/uc?id')) {bp('#downloadForm').submit();} else {}}); + BypassedByBloggerPemula(/adshnk.com|adshrink.it/, () => {let adsh =setInterval(()=>{if(typeof _sharedData=="object"&&0 in _sharedData&&"destination"in _sharedData[0]){clearInterval(adsh);document.write(_sharedData[0].destination);redirect(document.body.textContent);}else if(typeof ___reactjsD!="undefined"&&typeof window[___reactjsD.o]=="object"&&typeof window[___reactjsD.o].dest=="string"){clearInterval(adsh);redirect(window[___reactjsD.o].dest);}});}); + BypassedByBloggerPemula(/99faucet.com|readi.online|cempakajaya.com|freebitcoin.fun|onlineteori.my.id|xtrabits.click|onlineincoms.com|punyablog.my.id|9-animie.co|tribuncrypto.com|bitzite.com|nivaprofit.xyz|videoclip.info|punyamerk.top|lycoslink.com|aduzz.com|soltoshindo.com|techleets.xyz|moddingzone.in|crypto-fi.net|claimcrypto.cc|ourcoincash.xyz|poketoonworld.com|sapica.xyz|chuksblog.fun|liongiv.xyz|bioinflu.com|sonicbtc.com|healthbloog.xyz|pubgquotes.com|m.linkmumet.online|web9academy.com|studyis.xyz/, function(){var bypasslink = atob(`aH${bp("#landing [name='go']").value.split("aH").slice(1).join("aH")}`); redirect(bypasslink, false);}); + if (window.location.hostname==('solvemedia.com') != -1 ){let PHRASES=["1.21 gigawatts","4 8 15 16 23 42","5 dollar shake","6 feet of snow","8th chevron","a wild captcha appears","abelian grape","abide with me","abracadabra","absent without leave","absolute zero","accidentally on purpose","ace of spades","across the board","adapt improve","adapt improve succeed","against the grain","agree to disagree","al capone","all dancing","all grown up","all of the above","all singing","all your base","allergic reaction","almost got it","always there","am i happy","anchors away","and that's the way it is","angel food","another castle","anti dentite","apple juice","apple pie","apple sauce","april may","april showers","are we there yet","are you ready","are you the keymaster","army training","army training sir","around here","as i see it","as you wish","ask questions","attila the hun","auto driving","awesome dude","awesome sauce","azgoths of kria","babel fish","baby blues","baby boomer","baby steps","back to basics","back track","background noise","bacon and eggs","bad books","bad egg","bait the line","baked in a pie","bald eagle","ball of confusion","banana bread","banana split","banana stand","bangers and mash","barber chair","barking mad","basket case","bated breath","bath towel","bath water","battle royale","bazinga","be careful","be mine","be my friend","be nice","be nimble be quick","be serious now","beach ball","bean town","beans and rice","beautiful friendship","bee line","been there","beer in a bottle","beer in the bottle","bees knees","beg the question","believe me","belt up","berlin wall","best fit line","best seller","better call saul","better half","better next time","beyond me","big brother","big kahuna burger","big nose","big screen","bigger in texas","bike rider","bird cage","birthday boy","birthday girl","bizarro jerry","black and white","black coffee","black gold","black jack","black monday","blahblahblah","blaze a trail","bless you","blinded by science","blog this","blood type","blue cheese","blue ribbon","blue sky","bob loblaw","body surfing","boiled cabbage","bon voyage","bond james bond","bone dry","bonus points","bonus round","book reading","book worm","boomerang","born to run","bots are bad m'kay","bottled water","bowties are cool","box jelly fish","box kitty","box of chocolates","braaains","brand spanking new","bread of life","break the ice","brick house","broken heart","broken record","bruce lee","brush your teeth","buckle your shoe","buffalo wing","bunny rabbit","burger with fries","burning oil","burnt sienna","butler did it","butter side down","button fly","buy some time","by and large","by the board","by the book","by the seashore","cabbage borsht","cabbage stew","caesar salad","call me","call me maybe","can i love","can you see","candy apple","candy cane","capital gain","captcha in the rye","car trouble","carbon copy","carbon footprint","card sharp","card-sharp","carpe diem","carry a towel","carry on","cary grant","case closed","cat got your tongue","catch the man","cats and dogs","cats pajamas","chaise lounge","challenge accepted","change the world","change yourself","channel surfing","charley horse","charlie bit me","charm offensive","charmed life","check your coat","check your work","cheese burger","cheese fries","cheese steak","cherry on top","chicken feed","chicken noodle","chicken salad","chicken soup","chin boy","chit chat","choco lazer boom","chocolate cookie","chocolate milk","chow down","chuck norris","circle of life","civil war","clean and shiny","clean hands","clear blue water","clear sailing","click, click, click","cliff hanger","clod hopper","close quarters","cloud nine","clown around","coffee can","cold comfort","cold feet","cold hat","cold shoulder","cold turkey","coleslaw","collaborate and listen","colored paper","come along","come along pond","come back","come clean","come on down","come what may","comfort zone","comma comma","common law","complex number","construction ahead","cookie cutter","cool heads prevail","cop an attitude","cor blimey","cordon bleu","corned beef","cotton on","count your change","counting sheep","covered bridge","crab cake","crayola","cream and sugar","create new things","creative process","creative vision","creepy crawler","crime of passion","crocodile tears","crop up","cross the road","cross the rubicon","cubic spline","cucumber sandwich","cup cake","cupid's arrow","curate's egg","curry favour","cut and run","cut the mustard","dalek asylum","dallas texas","dance all night","danish robot dancers","dark horse","das oontz","david after dentist","dead battery","dead ringer","deal me in","dear cookie","dear mr vernon","dear sir","deep thought","deep waters","dharma initiative","diced onion","diddly squat","digital clock","ding a ling","dinner bell","dinosaur spaceship","dish water","do a little dance","do be do be do","do it now","do more situps","do not touch","do or do not","do unto others","do wah ditty","do you believe in miracles","do you love me","doctor caligari","doctor who","doctor who?","doe a deer","dog days","dog's breakfast","dog's dinner","dogapus","dogs and cats living together","dollar bill","dollar signs","dollars to donuts","domestic spying","don't be late","don't count on it","don't dawdle","don't stop","don't waste time","done that","donkey's years","doodah man","double cross","double crossed","double dutch","double jump","double rainbow","double time","double whammy","down the hatch","down the rabbit hole","downward slope","drag race","dragon with matches","dragonfly","dramatic chipmunk","draw a blank","drawing board","dream big","drink milk","drive me to firenze","drop table users","drumhead","drummer boy","dry clean only","dueling banjos","dusk till dawn","dust bunny","dust up","duvet day","dynamo clock","ear candy","ear mark","ear muffs","easy as cake","easy as pie","easy peasy","easy street","eat cous cous","eat out","eat your dinner","eat your veggies","eat your vitamins","ecks why zee","edgar degas","egg on","eggs ter minate","eighty six","electro head","elevator going up","emperor's clothes","empire state of mind","end of story","english muffin","enjoy life","ermahgerd capcher","evil eye","evil genius","exceedingly well read","exclamation","exercise more","extra cheese","face the music","face to face","fade away","fair and square","fair play","fairy godmother","fairy tale","fait accompli","fall guy","falling pianos","fancy free","fancy pants","far away","farsical aquatic ceremony","fashion victim","fast and loose","fast asleep","father time","father uncle","fathom out","fava beans","feeding frenzy","feeling blue","fellow traveller","fezes are cool","field day","fifth column","fill it up","filthy dirty mess","filthy rich","finagle's law","final answer","finger lickin good","fire brim stone","firecracker","first contact","first post","first water","first world","fish and chips","fish on","fishy smell","flag day","flat foot","flat out","flat tire","flipadelphia","flipflops","flux capacitor","follow me","folsom prison","fool's paradise","fools gold","for keeps","for sure","for the birds","for the gripper","forbidden fruit","foregone conclusion","forget this","forget you","fork knife spoon","forty two","foul play","four by two","frabjous day","france","frankly my dear","free hat","freezing temperatures","french fried","french fries","french phrases","fresh water","fried ices","fried rice","friend zone","frozen peas","fruit salad","fuddy duddy","full house","full monty","full of stars","full stop","full tilt","fun with flags","funny farm","fusilli jerry","fuzzy wuzzy","gadzooks","game is up","gangnam style","garden of eden","garlic yum","gathers moss","gee louise","gee whiz","geez louise","gene parmesan","general tso","generation x","genghis khan","george washington","get out","get over it","get well","get your goat","giant bunny rabbit","giant panda","giddy goat","gift horse","gimme pizza","ginger bread","give or take","glass ceiling","glazed donut","global warming","go berserk","go further","go gadget go","goes to eleven","gold medal","gold record","golly jeepers","gone dolally","gone fishing","good afternoon","good as gold","good buddy","good day","good evening","good for nothing","good grief","good job","good luck","good morning","good night","good night and good luck","good riddance","good samaritan","good work","goody goody gumdrops","goody gumdrop","goody two shoes","goosebumps","gordon bennett","got my mojo","gotham city","gothic arch","gothic church","grain of salt","grand slam","grape soda","grass up","graveyard shift","gravy train","grease the skids","greased lightning","great scott","great unwashed","gregory peck","gridlock","grilled cheese","groundhog day","grumpy cat","guinea pig","guitar player","gum shoe","gung ho","habsons choice","had a great fall","had me at hello","hairy eyeball","halcyon days","half done","half empty","half full","half inch","hallowed ground","halp meh","ham and cheese","hamburger bun","hammer time","hand over fist","hands down","hangers and mash","happy anniversary","happy blessings","happy clappy","happy retirement","happy trails","hard captcha is hard","hard cheese","hard lines","hard sharp","hardened prestoopnicks","harp on","haste makes waste","hat head","hat trick","have a purpose","have an inkling","have courage","have fun","he loves her","head case","head honcho","head over heels","heads up","health food","healthy food","hear hear","hear me roar","heart break","heart strings","heart's content","heartache","heat up","heated debate","heavens to betsy","heavy metal","heebie jeebies","hello newman","hello sweetie","hello watson","hello world","here or there","here's johnny","hey brother","higgledy piggledy","higgs boson","high def","high five","high flyer","high horse","high sleeper","high time","him with her","hissy fit","history repeats itself","hit the hay","hit the sack","hoagie roll","hobby horse","hobson's choice","hocus pocus","hoi polloi","hoity-toity","hold your horses","hold your tongue","home james","honey mustard","hooray henry","hops a daisy","horse and cart","horse's mouth","hot blooded","hot diggity dog","hot dog roll","hot pola","hot sauce","hover hand","how about lunch","how about that","how are you","how interesting","how now, brown cow","how quaint","how sweet","how's it going","howdy partner","hug me","huggle muggle","hulk smash","hunky-dory","hush puppies","i am captcha","i am fine","i am here","i can do this","i can fix it","i have fallen","i know nothing","i like humans","i like people","i like turtles","i like you","i love deadlines","i love lamp","i love you","i made tea","i moustache you why","i saw that","i see","i think i am","i think i can","i think so","i want control","i'll make tea","i'm batman","i'm blessed","i'm blushing","i'm cold brr","i'm only human","i'm so cold","i'm sorry","i'm sorry dave","i'm yours","ice to meet you","idk my bff jill","if it fits","im cold. brr","imagine inspire create","in a box","in limbo","in over my head","in spades","in stitches","in the air","in the box","in the cart","in the club","in the doldrums","in the limelight","industrial revolution","infra dig","inside out","is it enough","is it hot","is it hot?","is it hot in here","is it plugged in","is low","it doesn't count","it happens","it hurts","it is certain","it is enough","it will pass","it's over","it's super effective","ivory tower","jabber wocky","jack be nimble","jam tomorrow","jay gatsby","jerk store","jerry built","jimmy cricket","jimmy horner","john lennon","john steinbeck","jump higher","jump over","jump the candlestick","jump the gun","jumping jack","june july","just dance","just deserts","just drive","just friends","just in time","kangaroo count","karma points","keep calm","keyboard","keyboard cat","khyber pass","kick the can","kick your heels","kindness of strangers","king arthur","kiss me","kitten mittens","kitty kat","klatu berada nikto","knick knack","knock at the door","knock back","knock knock knock penny","knock off","knock on wood","know the ropes","know thy self","know your paradoxes","know your rights","knuckle down","kosher dill","kundalini express","labour of love","ladies first","lager frenzy","lame duck","lardy-dardy","lark about","laser beams","last straw","later gator","laugh at me","law of sines","lawn giland","lazy sunday","leap higher","leaps and bounds","learn challenge improve","learn from mistakes","learn succeed","learn the ropes","learn, advance","leave britney alone","leave me alone","left or right","left right","lefty loosey","less is more","let go","let it be","let me know","let me out","lets eat","level playing field","liberty bell","library book","lickety split","lie low","light sleeper","like a boss","like the dickens","linear algebra","little bird told me","little bobby tables","little did he know","little sister","live free","live in the moment","live in the now","live life","live long + prosper","live love internet","live love type","live transmission","live with purpose","live your dream","living daylights","living things","lizard poisons spock","lo and behold","loaf of bread","local derby","lol cat","lollerskates","lolly pop","london calling","long division","long in the tooth","look away","look before crossing","look both ways","looking glass","lose face","lost love","loud music","love is automatic","love is blind","love life","love me","love you","love-hate","lovey dovey","lucille 2","lucky you","ludwig van","lumpy gravy","lunatic fridge","lunch time","lunch tuesday","mad hatter","mad science","magic decoder ring","magic eight ball","magical realism","magnetic monopole","main chance","major intersection","make a bee line","make haste","make it so","make my day","many happy returns","many wishes","maple syrup","marble rye","marcia marcia marcia","mare's nest","margin of error","mark it zero","market forces","marry me","mars rover","math test","mayan ruins","mea culpa","meat and drink","meat with gravy","meddling kids","media frenzy","melody pond","men in suits","mend fences","meow meow","metropolis","mexican wave","mickey finn","miles to go","milk was a bad choice","milkshake","million dollars","miloko plus","miloko plus vellocet","mimsy borogoves","minced oaths","mind the gap","minty fresh","mish-mash","miss you","mister wilson","modern love","moe's tavern","mom and dad","money lender","moo shoo pork","moon cheese","moot point","more better","more chocolate","more coffee","more cow bell","more internets","morning person","most interesting man","most likely","mother country","mother earth","motley crew","mouth watering","move along","move mountains","move over","moveable feast","movers and shakers","movie star","mrs robinson","muffled rap music","multi pass","mum's the word","mumbo jumbo","murphy's law","mushy peas","music machine","mustachioed","my bad","my beating heart","my better half","my dear watson","my friends can't dance","my mind's eye","my sources say no","naise cain","namby-pamby","name drop","nanoo nanoo","nap time","narrow minded","nautical phrases","ne regrets","near tannhauser gate","neart strings","neckbeard","need a bigger boat","needs must","nercolas cerg","nest egg","never give up","never gonna give you up","never mind","never quit","new york city","nice job","nice marmot","nice to meet you","night owl","nip and tuck","nitty gritty","no brainer","no crying in baseball","no dice","no friend of mine","no holds barred","no means no","no regrets","no soup for you","no spoon","no stinking badges","no time to explain","no way","nobody home","none of the above","nope chuck testa","nose bleed","nosy parker","not a bot","not in kansas","not yet","now and forever","now look here","nth degree","nul points","numa numa","nut case","nutrition","nyan cat","nyquist rate","of course","off the record","oh brother","oh em gee","oh hai","oh sigh","oh so close","oh yes","oh you","oh,you","oh, wait","okey dokey","old hat","old man winter","old shoe","om nom nom","on a boat","on cloud nine","on the ball","on the qt","on-off","once again","once upon a time","one day more","one fell swoop","one hit wonder","one small step for man","one stop shop","one way","one way street","one, two, three","only way to be sure","oontz oontz","oops a daisy","open season","open sesame","orange juice","other worldly","out of sorts","out of toner","outlook good","over the hill","over the moon","over the top","over there","oxford university","oxo cube","paint it red","pandora's box","pants on the ground","paper jam","paper plate","partial derivative","partly cloudy","party on garth","passing lane","patch of grass","path less taken","patience child","patty cake","pay the ferryman","pea brain","pearly whites","peg out","pell mell","penny loafer","people like me","pepe silvia","pepper pot","pepperoni pizza","peppers and onions","perfect world","pester power","peter out","philadelphia","phone home","pick me","pick up sticks","pickle juice","pickled peppers","picture perfect","pie are round","pie are squared","pie chart","piece of cake","pig's ear","piggyback","pin money","pipe down","pipe dream","piping hot","pitter patter","pizza topping","plain sailing","play a game","play again","play ball","play hookey","play it again sam","pleased as punch","plenty of time","plugged nickel","plus or minus","pocket sized","pod bay doors","poetic justice","point blank","point to point","points dont matter","points font matter","poison apple","political party","politicaly correct","poly's cracker","pond life","pool boy","pool hall","pool house","poor house","pork pies","pound cake","power dressing","power tool","practice makes perfect","press into service","prime time","primrose path","print out","print paper","printer paper","propane accessories","public good","pudding pops","puffy shirt","pumpkin pie","puppy dog","puppy love","push harder","push on","push the edge","push the envelope","pyrrhic victory","quality time","queen nefertiti","queen of hearts","queen's yacht","question everything","question mark","quid pro quo","quotations","rack and ruin","rack your brains","rain go away","rain tonight","rainy days","raise cain","raspberry tart","reach higher","read all over","read me, write me","read my mail","ready set go","real hoopy frood","real mccoy","red herring","red tape","red white and blue","red-handed","reduplicated phrases","remain calm","rent-a-swag","respect me","return to sender","reverse the polarity","rhino beetle","rhodeisland","rhyme nor reason","rhyming slang","rice and beans","rice job","ride the subway","riff-raff","right hand turn","right left","righty tighty","ring fencing","ring fenring","rinky-dink","rise and shine","river song","river styx","road apples","road less travelled","roast beef","robe of saffron","rocket science","rodents of unusual size","roflcopter","roll again","roll over","roller skates","rolling stone","rooftop","room for activities","roommate agreement","root beer float","rope burn","rosebud","rosie lea","rough diamond","round one","round robin","round tab1e","route one","row boat","roy g biv","royal flush","rubicon crossed","rule of chomio","rule of thumb","rum do","run amok","run away","run farther","run the gauntlet","run through","runny nose","saber tooth","sacred cow","safe streets","safer streets","safety first","salad days","salt and pepper","salty cheese","same same","sandy beach","saturday detention","saucy","sauer kraut","sausages","save face","save it","save our bluths","savoir faire","sax and violins","say cheese","school is cool","science class","science fair","science it works","science project","scot free","screw driver","sea change","sea shell","sea shore","seattle","see red","see ya","see-saw","seek beauty","seems legit","seize the day","select from table","send packing","senior citizen","seven ate nine","seven signs","seze the day","shake a leg","shaken not stirred","shakers and movers","shane come back","sharp pencil","sharp stick","she loves him","she sells","she sells seashells","she's a witch","sheldon alpha five","shilly-shally","ship shape","shoe shine","shoes shine","shoot through","shoulder of orion","show down","shuffle the deck","sick puppy","signal your turns","signs point to yes","silence is golden","silver bells","silver bullet","silver hoing","silver lining","silver spoon","sin cos tan","since when","sing a song","sixes and sevens","sixteen point turn","skidrow","skip a turn","sky's the limit","skynet is watching","skynet knows","skynet watches","sleep tight","sleepy hollow","slimy goop","slippery slope","sloane ranger","slow down","slow milenky lizards","slush fund","slythy toves","small fries","small fry","smart casual","smart phone","smashed potato","smell that","smelling salt","smoked salmon","snake eyes","snapshot","snare drum","sneezing baby panda","snoop lion","snow drift","snow flurry","snow shovel","so far away","so life like","so so","sod's law","soft kitty warm kitty","soft kitty, warm kitty","somebody that i used to know","sonic screw driver","sorry dave","sorry sight","souffle girl","sound bite","sound of sirens","sound out","sour grapes","space is big","space plumber","spangled banner","speeding bullet","spelling bee","spend time","spick and span","spicy","spicy hot","spin doctor","spitting feathers","spitting image","spoilers","spread the net","spring water","spruce up","square meal","square one","squeaky clean","squirrel friend","st johns bay","stalla stella","stand and deliver","stand by me","stand up guy","star spangled","star wars kid","start from scratch","stay safe","steak and eggs","steam punk","steering wheel","step back","step over","steve holt","steve jobs","sticky wicket","sting like a bee","stinking rich","stinky feet","stone soup","stone's throw","stony hearted","stool pigeon","stop waisting time","stranger danger","streams of oceanus","strike a match","strike three","string along","string cheese","stuck in mud","stump up","sudo make sandwich","sulphur smell","summon inglip","sun tzu says","sunday","sunshine","super star","surf and turf","surface integral","swan song","sweet dreams","sweety pie","swirling vortex of entropy","taco tuesday","take a look","take an umbrella","take care","take it all","take out food","take potluck","take the cake","take umbrage","take wrong turns","taken aback","talk the talk","talk to strangers","talk turkey","tall building","tall story","tastes good","tastes like chicken","tea earl gray hot","tea leaf","tea with jam","tea with milk","tear us apart","technicolor yawn","teflon president","teh inter webs","ten four","tesla coil","thank you","thank you, come again","that escalated quickly","that hurts","that will not work","that's a fact jack","that's all folks","that's enough","that's hot","that's it","that's my spot","that's right","the bee's knees","the bible","the big apple","the big cheese","the big easy","the cat lady","the cats cradle","the dennis system","the dude abides","the extra mile","the next level","the nightman cometh","the one eyed man is a king","the other side","the tribe has spoken","the yellow king","there is no spoon","there is only zul","there once was","these parts","they are watching","they ate it","thick and thin","thin air","think create do","think green","think hard","think twice","thinking cap","third degree","thirty one days","this is it","this is not fake","this is sparta","this or that","this statement is false","three short words","three strikes","through the grapevine","thumbs up","thunder storm","ticked off","tickle the ivories","tickled ivories","tickled pink","tide over","tight lipped","time and paper","time circuits","time flies","time is an illusion","time lord","time machine","time will tell","times square","tinker's dam","to boot","toast points","toe the line","toe-curling","together again","too bad","too late","too many cooks","too many secrets","too salty","toodle oo","top dog","top drawer","top notch","top ten","topsy turvy","topsy-turvy","total shamble","towel dry","tower of strength","toy soldier","traffic jam","traffic light","train surfing","travel size","treat yoself","trick or treat","trickle down","trolololol","true blue","true life","trust me","tuckered out","tuna fish","tune in","turkey sandwich","turn signal","turn the tables","turn up trumps","twenty eight days","twenty four seven","twenty one","twenty three","two cents worth","two hands","two left feet","two tone","u jelly","umbrella corporation","uncharted island","uncle leo","under the sea","underpants","union jack","unlimited wishes","untied laces","until next time","until tomorrow","until tonight","up and away","up or down","upper crust","upper hand","ups a daisy","upside down","upvote this","upward slope","urban myth","usual suspects","uu dd lr lr ba","van surfing","vanilla ice cream","veg out","vegan diet","vegan zombie wants grains","vegetarian","very doubtful","very nice","vice versa","vicious cycle","video tape","vienna calling","virtue of necessity","vis a vis","vocal minority","vogon poetry","voigt kampf","vorpal sword","vote pancakes","wake of the flood","walk free","walk the plank","walk the walk","want more","warp speed","wash whites separately","watch c-beams glitter","watch me","watch out","water gate","wax poetic","way to go","way to go donny","we go forwards","we like the moon","weakest link","weasel words","welcome to earth","well done","well heeled","well isn't that special","well now","well read","weylan yutani","what even","what ever","what for","what if","what is for dinner","what is your quest","what should we call me","what to see","what's that","wheel group","when where","where to go","whet your appetite","whistle and flute","white as snow","white bread","white elephant","white rabbit","who am i","who are you","who is it","who you gonna call","who, what, where","whoa there","whole nine yards","whole shebang","whoopee cushion","whoops a daisy","wicked witch","wide berth","wild and crazy guys","wild and woolly","wild goose chase","wild west","willy nilly","win hands down","window dressing","wing it","winning","winter is coming","winter snow","wisdom of inglip","wisdom teeth","wishy-washy","with bells on","without a doubt","woof woof","word for word","words of wisdom","work out","would you believe","wright flyer","writing desk","x all the y","xylophone","yada yada","yadda yadda yadda","yeah right","year dot","yee haw","yelling goat","yellow belly","yes definitely","yes ma'am","yes sir","yes this is dog","you are happy","you are here","you can do this","you don't say","you first","you good","you have my stapler","you rock","you the man","you win","you're in my spot","you're not listening","you're welcome","zig zag","zombie attack","zombie prom","who what where",]; + function solvemed(b){var a=document.createElement("datalist");a.setAttribute("id","adcopy_phrases");for(var c=0;c -1){document.body.addEventListener("keydown",function c(a){if(/^adcopy_response/.test(a.target.id)){this.removeEventListener(a.type,c);var b=a.target;solvemed(b);b.blur();b.focus();}});break;}} +}})(); +} diff --git a/scripts/backup/code-f12-toolkit.js b/scripts/backup/code-f12-toolkit.js new file mode 100644 index 00000000..aa97808b --- /dev/null +++ b/scripts/backup/code-f12-toolkit.js @@ -0,0 +1,672 @@ +// https://startuanit.net/code-f12-toolkit-bo-cong-cu-cho-facebook/ + +(() => { + var lang = "vi"; + var token = ""; // default token + var User = {}; + var ACCESS_TOKEN = ""; + var friend_limit_count = 500; + var dtsg = require("DTSGInitialData").token; + const exceptions = ["100030089564311", "100011158877849", "100001467593814"]; + + const LIMIT_POSTS = 100; + + var lang = confirm("Want English Interface?") ? "en" : "vi"; + var trans = (i1, i2 = "") => { + return lang == "vi" ? (i2 !== "" ? i2 : i1) : i1; + }; + var getFriendList = (e, o) => { + var a = new XMLHttpRequest(); + (a.onreadystatechange = () => { + 4 == a.readyState && + 200 == a.status && + o(JSON.parse(a.responseText).data); + }), + a.open( + "GET", + "https://graph.facebook.com/me/friends?limit=5000&fields=id,name&access_token=" + + e + ), + a.send(); + }; + var getPosts = (e, o) => { + var a = new XMLHttpRequest(); + (a.onreadystatechange = () => { + 4 == a.readyState && + 200 == a.status && + o(JSON.parse(a.responseText).data); + }), + a.open( + "GET", + "https://graph.facebook.com/me/posts?limit=" + + LIMIT_POSTS + + "&fields=id,name&access_token=" + + e + ), + a.send(); + }; + var getShares = (e, n, o = !1) => { + o || + (o = + "https://graph.facebook.com/" + + n + + "/comments?limit=5000&fields=from.id&access_token=" + + e); + var t = new XMLHttpRequest(); + t.open("GET", o), + t.send(), + (t.onreadystatechange = () => { + if (4 == t.readyState && 200 == t.status) { + var e = JSON.parse(t.responseText); + e.data.forEach((e) => { + void 0 !== friendsList[e.from.id] && + (friendsList[e.from.id].point += 1); + }), + void 0 !== e.paging && void 0 !== e.paging.next + ? console_log("Continue scanning reactions for " + n) + : (console_log("Scanned comments on post " + n), + completedPosts.push(n)); + } + }); + }, + getComments = (e, n, o = !1) => { + o || + (o = + "https://graph.facebook.com/" + + n + + "/comments?limit=5000&fields=from.id&access_token=" + + e); + var t = new XMLHttpRequest(); + t.open("GET", o), + t.send(), + (t.onreadystatechange = () => { + if (4 == t.readyState && 200 == t.status) { + var o = JSON.parse(t.responseText); + o.data.forEach((e) => { + void 0 !== friendsList[e.from.id] && + (friendsList[e.from.id].point += 1); + }), + void 0 !== o.paging && void 0 !== o.paging.next + ? console_log("Continue scanning reactions for " + n) + : (console_log("Scanned comments on post " + n), + getShares(e, n)); + } + }); + }, + getReactions = (e, n, o = !1) => { + o || + (o = + "https://graph.facebook.com/" + + n + + "/reactions?limit=5000&access_token=" + + e); + var t = new XMLHttpRequest(); + t.open("GET", o), + t.send(), + (t.onreadystatechange = () => { + if (4 == t.readyState && 200 == t.status) { + var o = JSON.parse(t.responseText); + o.data.forEach((e) => { + void 0 !== friendsList[e.id] && (friendsList[e.id].point += 1); + }), + void 0 !== o.paging && void 0 !== o.paging.next + ? console_log("Continue scanning reactions for " + n) + : (console_log("Scanned reactions on post " + n), + getComments(e, n)); + } + }); + }, + removeFriend = (e, n) => { + var o = new XMLHttpRequest(), + t = new FormData(); + t.append("fb_dtsg", dtsg), + t.append("uid", e.id), + t.append("unref", "bd_profile_button"), + t.append("floc", "profile_button"), + t.append("nctr[_mod]", "pagelet_timeline_profile_actions"), + t.append("__req", "x"), + t.append("__be", "1"), + t.append("__pc", "PHASED:ufi_home_page_pkg"), + t.append("dpr", "1"), + o.open( + "POST", + "https://www.facebook.com/ajax/profile/removefriendconfirm.php" + ), + o.send(t), + (o.onreadystatechange = () => { + 4 == o.readyState && 200 == o.status && n(e); + }); + }; + var friendsList = {}, + completedPosts = []; + + var Monokai = document.createElement("div"); + (Monokai.id = "monokaijs-facebook-toolkit"), + (Monokai.style = + 'position:fixed;left:10px;top:10px;width:300px;height:360px;z-index:10000;background:#000;color: white; font-family: "Segoe UI";'), + (Monokai.innerHTML = + ''), + document.body.appendChild(Monokai), + (Monokai.querySelector(".header").style = "height: 20px;padding:20px;"); + var TopControl = document.createElement("div"); + (TopControl.style = "position: absolute; right:0px; top: 5px;"), + (TopControl.innerHTML = "🞩"), + Monokai.appendChild(TopControl); + var BtnClose = TopControl.querySelector("a,h1,h2,h3,h4,p"); + (BtnClose.style = + "text-decoration: none;color:white; padding-left: 15px; padding-right: 15px;padding-top:5px;padding-bottom: 5px;"), + (BtnClose.onclick = function () { + Monokai.parentNode.removeChild(Monokai); + }); + var LoginScreen = document.createElement("div"); + (LoginScreen.id = "monokaijs-login-screen"), + (LoginScreen.style = + "position: absolute; width: 100%; top: 52px; bottom: 20px;margin: 10px;"); + var LoginForm = document.createElement("div"); + (LoginForm.style = "width: 100%; height: 50%;margin: 0 auto;"), + (LoginForm.innerHTML = + "

" + + trans("Login with Access Token", "Đăng nhập bằng Access Token") + + "




" + + trans("Get Token with Account", "Lấy Token bằng tài khoản") + + "






"), + LoginScreen.appendChild(LoginForm), + (LoginForm.querySelector("#login-token").onclick = () => { + var e = new XMLHttpRequest(); + (e.onreadystatechange = () => { + 4 == e.readyState && + (200 == e.status + ? ((User = JSON.parse(e.responseText)), + (ACCESS_TOKEN = LoginForm.querySelector("#token-input").value), + Logged(User)) + : alert(trans("Failed to login!"))); + }), + e.open( + "GET", + "https://graph.facebook.com/me?access_token=" + + LoginForm.querySelector("input").value + ), + e.send(); + }), + (LoginForm.querySelector("#login-account").onclick = () => { + var e = + "https://b-graph.facebook.com/auth/login?email=" + + LoginForm.querySelector("#username").value + + "&access_token=350685531728%7C62f8ce9f74b12f84c123cc23437a4a32&method=POST&password=" + + LoginForm.querySelector("#password").value; + window.open(e, "_blank").focus(); + }); + var Credit = document.createElement("div"); + (Credit.innerHTML = + trans("Developed by", "Phát triển bởi") + + ' MonokaiJs'), + (Credit.style = + "width: 100%; position: absolute; text-align: center; bottom: 5px;"), + Monokai.appendChild(Credit), + Monokai.appendChild(LoginScreen); + var Logged = (e) => { + (LoginScreen.style.display = "none"), (Monokai.style.height = "500px"); + var t = document.createElement("div"); + (t.style = + "position: absolute; width: 100%; top: 52px; bottom: 20px;margin: 10px;"), + (t.innerHTML = + ""), + (t.innerHTML += + "
Hello, " + + e.name + + ".
FacebookID: " + + e.id + + "
Gender: " + + e.gender + + "
"); + var o = + ""; + (o += + ""), + (o += + ""), + (o += + ""), + (o += + ""), + (o += + ""), + (o += + ""), + (o += + ""); + var n = "

About me


"; + (n += + trans("Fullname:", "Họ tên") + + " Nguyễn Anh Nhân [MonokaiJs | omfg.vn].
"), + (n += "Email: monokaijs@gmail.com
"), + (n += trans("Date of Birth:", "Ngày sinh:") + " 10/01/2001.
"), + (n += + trans( + "Currently attending General Education in Tran Phu (Duc Tho) High School.", + "Hiện đang học phổ thông tại trường THPT Trần Phú, Đức Thọ, Hà Tĩnh" + ) + "

"), + (n += trans( + "Programming is my passion. I'm writing softwares, mobile apps and websites to serve the community. Hope my contributions be valuable to you :D.

If you're interested in my works, please donate to help me by contacting via Facebook ;) Thanks.", + "Lập trình là đam mê. Mình đang viết phần mềm, ứng dụng điện thoại và websites cho cộng đồng. Hy vọng những đóng góp của mình sẽ có ích cho bạn :D.

Nếu thích những thứ mình làm, xin hãy Donate cho mình bằng việc liện lạc qua Facebook nhé ;)" + )), + (t.innerHTML += + "
" + + o + + "
" + + n + + "
"), + Monokai.appendChild(t), + (t.querySelector("#remove-all-posts").onclick = () => { + if ( + confirm( + trans( + "Are sure you want to DELETE everything you have posted? This progress can not be undone.", + "Bạn có chắc muốn XÓA mọi thứ đã đăng? Sẽ không thể phục hồi được." + ) + ) + ) { + var e = new XMLHttpRequest(); + e.open( + "GET", + "https://graph.facebook.com/me/feed?fields=id,created_time&limit=9999&access_token=" + + ACCESS_TOKEN + ), + e.send(), + (e.onreadystatechange = function () { + 4 == e.readyState && + 200 == e.status && + ((graphData = JSON.parse(e.responseText)), + graphData.data.forEach((e) => { + var t = new XMLHttpRequest(); + t.open( + "DELETE", + "https://graph.facebook.com/v3.2/" + + e.id + + "?access_token=" + + ACCESS_TOKEN + ), + t.send(), + (t.onreadystatechange = function () { + 4 == t.readyState && 200 == t.status + ? console_log("Deleted " + e.id + ".") + : console_log("Failed to delete " + e.id); + }); + })); + }); + } + }), + (t.querySelector("#clear-all-photos").onclick = () => { + if ( + confirm( + trans( + "Are sure you want to DELETE every photos you have posted? This progress can not be undone.", + "Bạn có chắc muốn XÓA toàn bộ ảnh đã đăng? Sẽ không thể phục hồi." + ) + ) + ) { + var e = new XMLHttpRequest(); + e.open( + "GET", + "https://graph.facebook.com/me/photos?fields=id,created_time&limit=9999&access_token=" + + ACCESS_TOKEN + ), + e.send(), + (e.onreadystatechange = function () { + 4 == e.readyState && + 200 == e.status && + ((graphData = JSON.parse(e.responseText)), + graphData.data.forEach((e) => { + var t = new XMLHttpRequest(); + t.open( + "DELETE", + "https://graph.facebook.com/v3.2/" + + e.id + + "?access_token=" + + ACCESS_TOKEN + ), + t.send(), + (t.onreadystatechange = function () { + 4 == t.readyState && 200 == t.status + ? console_log("Deleted " + e.id + ".") + : console_log("Failed to delete " + e.id); + }); + })); + }); + } + }), + (t.querySelector("#set-all-only-me").onclick = () => { + if ( + confirm( + trans( + "Are sure you want to change all posts' privacy to Only Me ?" + ), + "Bạn có chắc muốn chuyển mọi bài viết về Chỉ mình tôi?" + ) + ) { + var e = new XMLHttpRequest(); + e.open( + "GET", + "https://graph.facebook.com/me/posts?fields=id,created_time&limit=9999&access_token=" + + ACCESS_TOKEN + ), + e.send(), + (e.onreadystatechange = function () { + 4 == e.readyState && + 200 == e.status && + ((graphData = JSON.parse(e.responseText)), + graphData.data.forEach((e) => { + var t = new XMLHttpRequest(); + t.open( + "POST", + "https://graph.facebook.com/v3.2/" + + e.id + + '?privacy={"value":"SELF"}&access_token=' + + ACCESS_TOKEN + ), + t.send(), + (t.onreadystatechange = function () { + 4 == t.readyState && 200 == t.status + ? console_log(e.id + " was set.") + : console_log("Failed " + e.id); + }); + })); + }); + } + }), + (t.querySelector("#hide-all-posts").onclick = () => { + if ( + confirm( + trans( + "Are sure you want to hide all Posts on Timeline?", + "Bạn có muốn ẩn toàn bộ bài đăng khỏi Trang cá nhân?" + ) + ) + ) { + var e = new XMLHttpRequest(); + e.open( + "GET", + "https://graph.facebook.com/me/feed?fields=id,created_time&limit=9999&access_token=" + + ACCESS_TOKEN + ), + e.send(), + (e.onreadystatechange = function () { + 4 == e.readyState && + 200 == e.status && + ((graphData = JSON.parse(e.responseText)), + graphData.data.forEach((e) => { + var t = new XMLHttpRequest(); + t.open( + "POST", + "https://graph.facebook.com/v3.2/" + + e.id + + "?method=POST&timeline_visibility=hidden&access_token=" + + ACCESS_TOKEN + ), + t.send(), + (t.onreadystatechange = function () { + 4 == t.readyState && 200 == t.status + ? console_log(e.id + " was set.") + : console_log("Failed to delete " + e.id); + }); + })); + }); + } + }), + (t.querySelector("#unfollow-all-friends").onclick = () => { + confirm( + trans("Are sure you want to unfollow all friends?"), + "Bạn muốn Unfollow toàn bộ bạn bè chứ?" + ) && + get_friends(ACCESS_TOKEN, (e) => { + e.forEach((e) => { + removeFriend(e, (e) => { + console_log("Unfollowed " + e.name); + }); + }); + }); + }), + (t.querySelector("#send-msg-all-friends").onclick = () => { + var e = prompt( + trans("Input your message:", "Nhập tin nhắn muốn gửi:") + ); + "" !== e && + get_friends(ACCESS_TOKEN, (t) => { + var o = 0; + t.forEach((t) => { + (o += 1) < friend_limit_count && + setTimeout(() => { + sendMessage(e, t.id); + }, 100 * o); + }); + }); + }), + (t.querySelector("#poke-all-friends").onclick = () => { + confirm( + trans( + "Are sure you want to poke all your friends?", + "Bạn muốn chọc toàn bộ bạn bè?" + ) + ) && + get_friends(ACCESS_TOKEN, (e) => { + e.forEach((e) => { + var t = new XMLHttpRequest(); + (t.onreadystatechange = () => { + 4 == t.readyState && + (200 == t.status + ? console_log("Poked " + e.id) + : console_log("Failed to poke " + e.id)); + }), + t.open( + "GET", + "https://graph.facebook.com/" + + e.id + + "/pokes?method=POST&access_token=" + + token + ), + t.send(); + }); + }); + }), + (t.querySelector("#delete-uninteractive-friends").onclick = () => { + confirm( + trans( + "Are sure you want to remove all friends that have no interaction on your profile?", + "Bạn muốn xóa toàn bộ bạn bè KHÔNG TƯƠNG TÁC?" + ) + ) && + (console_log("Loading friends list..."), + get_friends(ACCESS_TOKEN, (e) => { + for (fid in (console_log( + "Successfully loaded " + e.length + " friends..." + ), + e)) + (friendsList[e[fid].id] = {}), + (friendsList[e[fid].id].name = e[fid].name), + (friendsList[e[fid].id].point = 0); + console_log("Loading posts..."), + getPosts(ACCESS_TOKEN, (e) => { + console_log("Loaded " + e.length + " posts."), + console_log("Loading posts reactions..."), + e.forEach((e) => { + getReactions(ACCESS_TOKEN, e.id, !1); + }); + var t = setInterval(() => { + if (completedPosts.length == e.length) { + console_log("> Done scanning progress!"); + var o = []; + for (friend_id in friendsList) + 0 != friendsList[friend_id].point || + exceptions.includes(friend_id) || + o.push({ + id: friend_id, + name: friendsList[friend_id].name, + }); + console_log("> Done filtered friends to be removed!"), + console_log( + "⚠️ " + + o.length + + " friends will be removed due to have no interaction!" + ); + var n = 0; + o.forEach((e) => { + setTimeout(() => { + removeFriend(e, (e) => { + console_log( + "✔️ [" + + e.id + + "] " + + e.name + + " has just been removed from friends list!" + ); + }); + }, 800 * (n += 1)); + }), + clearInterval(t); + } + }, 500); + }); + })); + }), + t.querySelectorAll(".tab-btn").forEach((e) => { + e.onclick = (o) => { + t.querySelectorAll(".tab-btn").forEach((e) => { + e.classList.remove("active"); + }), + t.querySelectorAll(".tab").forEach((t) => { + t.classList.remove("active"), + t.id == e.getAttribute("tab") && t.classList.add("active"); + }), + e.classList.add("active"), + ResetUI(); + }; + }), + ResetUI(); + }, + ResetUI = () => { + Monokai.querySelectorAll(".tab").forEach((e) => { + e.style = + "display: none; position: absolute; left: 0px; right: 10px; top: 32px; bottom: 20px; margin: 10px;overflow: hidden;"; + }), + Monokai.querySelectorAll(".tab.active").forEach((e) => { + e.style = + "position: absolute; absolute; left: 0px; right: 10px; top: 32px; bottom: 20px; margin: 10px;overflow: auto;"; + }), + Monokai.querySelectorAll("input").forEach((e) => { + (e.style.height = "24px"), + (e.style.border = "none"), + (e.style.borderRadius = "12px"), + (e.style.paddingLeft = "10px"), + (e.style.paddingRight = "10px"); + }), + Monokai.querySelectorAll(".btn").forEach((e) => { + (e.style.height = "24px"), + (e.style.textDecoration = "none"), + (e.style.color = "black"), + (e.style.border = "none"), + (e.style.borderRadius = "12px"), + (e.style.backgroundColor = "white"), + (e.style.paddingLeft = "10px"), + (e.style.paddingRight = "10px"); + }), + Monokai.querySelectorAll(".tab-btn").forEach((e) => { + (e.style.height = "24px"), + (e.style.textDecoration = "none"), + (e.style.color = "white"), + (e.style.border = "1px solid white"), + (e.style.borderRadius = "12px"), + (e.style.backgroundColor = "black"), + (e.style.paddingLeft = "10px"), + (e.style.paddingRight = "10px"), + (e.style.marginLeft = "10px"); + }), + Monokai.querySelectorAll(".btn-tweak").forEach((e) => { + (e.style.width = "100%"), (e.style.marginTop = "10px"); + }), + Monokai.querySelectorAll(".tab-btn.active").forEach((e) => { + (e.style.height = "24px"), + (e.style.textDecoration = "none"), + (e.style.color = "black"), + (e.style.border = "1px solid white"), + (e.style.borderRadius = "12px"), + (e.style.backgroundColor = "white"), + (e.style.paddingLeft = "10px"), + (e.style.paddingRight = "10px"); + }); + }; + ResetUI(); + var get_friends = (e, t) => { + var o = new XMLHttpRequest(); + (o.onreadystatechange = () => { + 4 == o.readyState && + 200 == o.status && + t(JSON.parse(o.responseText).data); + }), + o.open( + "GET", + "https://graph.facebook.com/me/friends?limit=5000&fields=id,name&access_token=" + + e + ), + o.send(); + }, + removeFriend = (e, t) => { + var o = new XMLHttpRequest(), + n = new FormData(); + n.append("subject_id", e.id), + n.append("forceredirect", "false"), + n.append("location", "83"), + n.append("m_sess", ""), + n.append("fb_dtsg", dtsg), + o.open("POST", "/a/subscriptions/remove"), + o.send(n), + 4 == o.readyState && 400 !== o.status && 500 !== o.status && t(e); + }, + sendMessage = (e, t) => { + var o = new FormData(); + o.append("ids[" + t + "]", t), + o.append("body", e), + o.append("fb_dtsg", dtsg); + var n = new XMLHttpRequest(); + (n.onreadystatechange = () => { + 4 == n.readyState && + 200 == n.status && + console_log("Message was sent to [" + t + "]"); + }), + n.open( + "POST", + "https://m.facebook.com/messages/send/?icm=1&refid=12&ref=dbl" + ), + n.send(o); + }, + console_log = (e) => { + Monokai.querySelector("#tab-console").innerHTML += e + "
"; + }; +})(); diff --git a/scripts/backup/fb-access-token.js b/scripts/backup/fb-access-token.js new file mode 100644 index 00000000..1b38fa9e --- /dev/null +++ b/scripts/backup/fb-access-token.js @@ -0,0 +1,3 @@ +// https://www.facebook.com/groups/j2team.community/permalink/948789318786522 + +// https://github.com/locmai0808/Facebook-Access-Token \ No newline at end of file diff --git a/scripts/backup/fb-save-exporter.js b/scripts/backup/fb-save-exporter.js new file mode 100644 index 00000000..5a1c7a05 --- /dev/null +++ b/scripts/backup/fb-save-exporter.js @@ -0,0 +1,115 @@ +var fb_dtsg = require("DTSGInitialData").token, + uid = require("CurrentUserInitialData").USER_ID, + cursor = "", + data = [], + template = (e) => { + download( + `Danh sách link đã lưu

Danh sách link đã lưu

Code by Nguyen Huu Dat - J2TEAM Community
#Hình ảnhChi tiết
`, + "j2team_community.html" + ); + }, + download = (e, a, t) => { + var s = new Blob([e], { type: t }); + if (window.navigator.msSaveOrOpenBlob) + window.navigator.msSaveOrOpenBlob(s, a); + else { + var i = document.createElement("a"), + n = URL.createObjectURL(s); + (i.href = n), + (i.download = a), + document.body.appendChild(i), + i.click(), + setTimeout(function () { + document.body.removeChild(i), window.URL.revokeObjectURL(n); + }, 0); + } + }, + encodeHTML = (e) => + e.replace(/([\u00A0-\u9999<>&])(.|$)/g, function (e, a, t) { + return "&" !== a || "#" !== t + ? (/[\u00A0-\u9999<>&]/.test(t) && (t = "&#" + t.charCodeAt(0) + ";"), + "&#" + a.charCodeAt(0) + ";" + t) + : e; + }), + checkExit = (e) => { + try { + return e(); + } catch (e) { + return !1; + } + }, + get_posts = async (e) => { + console.log("Đang lấy dữ liệu! Vui lòng chờ trong giây lát..."), + "" !== e && (e = `"cursor":"${e}",`); + const a = await fetch("https://www.facebook.com/api/graphql/", { + body: `av: 100000034778747&__user=${encodeURIComponent( + uid + )}&__dyn=&fb_dtsg=${encodeURIComponent( + fb_dtsg + )}&fb_api_req_friendly_name=CometSaveDashboardAllItemsPaginationQuery&variables=${encodeURIComponent( + `{"content_filter":null,"count":10,${e}"scale":1}` + )}&server_timestamps=true&doc_id=3196659713724388`, + method: "POST", + mode: "cors", + credentials: "include", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + }); + let t = await a.json(); + t.data.viewer.saver_info.all_saves.edges.forEach((e) => { + let a = "", + t = "", + s = "", + i = "", + n = "", + l = "", + o = "", + c = "", + d = ""; + checkExit(() => e.node.savable.savable_title.text) && + (a = encodeHTML(e.node.savable.savable_title.text)), + checkExit(() => e.node.savable.__typename) && + (t = e.node.savable.__typename), + checkExit(() => e.node.savable.savable_image.uri) && + (s = e.node.savable.savable_image.uri), + checkExit(() => e.node.savable.url) && (i = e.node.savable.url), + checkExit(() => e.node.container_savable.savable_permalink) && + (n = e.node.container_savable.savable_permalink), + checkExit( + () => e.node.container_savable.savable_actors[0].__typename + ) && (l = e.node.container_savable.savable_actors[0].__typename), + checkExit(() => e.node.container_savable.savable_actors[0].name) && + (o = e.node.container_savable.savable_actors[0].name), + checkExit(() => e.node.container_savable.savable_actors[0].id) && + (c = e.node.container_savable.savable_actors[0].id), + checkExit( + () => e.node.container_savable.savable_actors[0].profile_picture.uri + ) && + (d = e.node.container_savable.savable_actors[0].profile_picture.uri), + data.push({ + title: a, + type: t, + image: s, + url: i, + urlPost: n, + sourceType: l, + sourceName: o, + sourceID: c, + sourceImage: d, + }); + }); + let s = !1; + if ( + (checkExit( + () => t.data.viewer.saver_info.all_saves.page_info.has_next_page + ) && (s = t.data.viewer.saver_info.all_saves.page_info.has_next_page), + !0 === s) + ) + get_posts(t.data.viewer.saver_info.all_saves.page_info.end_cursor); + else { + let e = window.btoa(unescape(encodeURIComponent(JSON.stringify(data)))); + template(e), console.log("Done! Đang xuất dữ liệu..."); + } + }; +get_posts(cursor); diff --git a/scripts/backup/find-friend-comments-in-page.js b/scripts/backup/find-friend-comments-in-page.js new file mode 100644 index 00000000..8a4900c6 --- /dev/null +++ b/scripts/backup/find-friend-comments-in-page.js @@ -0,0 +1,78 @@ +// https://www.facebook.com/watch/?v=443501793167194 + +var idPost = new Array(); +var token = ""; +var idUser = ""; +var idPage = ""; + +function f2() { + var xmlHttp = new XMLHttpRequest(); + var uri = + "https://graph.facebook.com/v3.3/" + + idPage + + "/posts?limit=100&access_token=" + + token; + var time = setInterval(function () { + if (uri != "") { + xmlHttp.open("GET", uri, true); + xmlHttp.onreadystatechange = function () { + if (this.status == 200 && this.readyState == 4) { + var jsonPost = JSON.parse(this.responseText); + if (jsonPost.paging.next == "" || jsonPost.paging.next == null) { + uri = ""; + } else { + uri = jsonPost.paging.next; + var data = jsonPost.data; + for (var i = 0; i < data.length; i++) { + var id = data[i].id; + var uri2 = + "https://graph.facebook.com/v3.3/" + + id + + "/comments?fields=from,message&limit=100&access_token=" + + token; + var ttp = new XMLHttpRequest(); + getID(uri2, ttp); + } + } + } + }; + xmlHttp.send(); + } else { + console.log("End"); + clearInterval(time); + } + }, 2000); +} +f2(); +function getID(uri2, ttp) { + if (uri2 != "") { + ttp.open("GET", uri2, true); + ttp.onreadystatechange = function () { + if (this.status == 200 && this.readyState == 4) { + var jsonComments = JSON.parse(this.responseText); + if (jsonComments.data.length > 0) { + if ( + jsonComments.paging.next == "" || + jsonComments.paging.next == null + ) { + uri2 = ""; + } else { + uri2 = jsonComments.paging.next; + var data = jsonComments.data; + for (var i = 0; i < data.length; i++) { + var from = data[i].from; + if (from.id == idUser) { + console.log(data[i]); + } + } + getID(uri2, ttp); + } + } + } + }; + ttp.send(); + } else { + console.log("End post"); + return; + } +} diff --git a/scripts/backup/kick-all-from-groupchat.js b/scripts/backup/kick-all-from-groupchat.js new file mode 100644 index 00000000..62b15ff5 --- /dev/null +++ b/scripts/backup/kick-all-from-groupchat.js @@ -0,0 +1,6 @@ +/* Developed by Juno_okyo */ +(function (a) { + Array.from(document.querySelectorAll(a)).map(function (a) { + a.click(); + }); +})('[ajaxify^="/chat/remove_participants/"]'); diff --git a/scripts/backup/openfbchat.js b/scripts/backup/openfbchat.js new file mode 100644 index 00000000..b95a0d16 --- /dev/null +++ b/scripts/backup/openfbchat.js @@ -0,0 +1,1207 @@ +function getThreadId(id, type) { + if (type === "Group") + return require("MercuryIDs").getThreadIDFromThreadFBID(id); + else if (type === "User" || type === "Page") + return require("MercuryIDs").getThreadIDFromUserID(id); + else + return require("unrecoverableViolation")( + "Not supported", + "messenger_web_product" + ); +} +function openChat(id, type) { + let threadId = getThreadId(id, type); + require("MWChatStateActions.bs").openTab( + Date.now(), + { shouldFocus: true }, + { + _0: { + clientThreadKey: void 0, + threadKey: "105941170804328u100006100567721", // require("MercuryIDs").getThreadKeyfromThreadIDUserID(threadId,id), + threadType: require("MessagingThreadType.bs").oneToOne, + }, + TAG: 1, + } + ); +} + +require("MWChatStateActions.bs").openTabOrFlyout( + i, + { + shouldFocus: !1, + }, + { + _0: { + clientThreadKey: void 0, + threadKey: g.threadKey, + threadType: g.threadType, + }, + TAG: 1, + } +); + +__d( + "MWChatThreadId.bs", + [ + "MercuryIDs", + "MessagingThreadType.bs", + "bs_caml", + "bs_caml_int64", + "bs_caml_obj", + "unrecoverableViolation", + ], + function (a, b, c, d, e, f, g) { + "use strict"; + function a(a) { + var b = a.NAME; + if (b === "Group") + return d("MercuryIDs").getThreadIDFromThreadFBID(a.VAL); + else if (b === "User" || b === "Page") + return d("MercuryIDs").getThreadIDFromUserID(a.VAL); + else + return c("unrecoverableViolation")( + "Not supported", + "messenger_web_product" + ); + } + function b(a) { + return a.VAL; + } + function e(a) { + var b = a.NAME; + if (b === "Group") return "g." + a.VAL; + else if (b === "Page") return "p." + a.VAL; + else if (b === "User") return "u." + a.VAL; + else + return c("unrecoverableViolation")( + "Not supported", + "messenger_web_product" + ); + } + function f(a) { + a = a.split("."); + var b = a.length, + c; + if (b >= 3) c = [void 0, void 0]; + else + switch (b) { + case 0: + c = [void 0, void 0]; + break; + case 1: + b = a[0]; + c = [b, void 0]; + break; + case 2: + b = a[0]; + a = a[1]; + c = /^[1-9]\d*$/.test(a) ? [b, a] : [void 0, void 0]; + break; + } + b = c[1]; + a = c[0]; + if (a === void 0) return; + switch (a) { + case "g": + if (b !== void 0) + return { + NAME: "Group", + VAL: b, + }; + else return; + case "p": + if (b !== void 0) + return { + NAME: "Page", + VAL: b, + }; + else return; + case "u": + if (b !== void 0) + return { + NAME: "User", + VAL: b, + }; + else return; + default: + return; + } + } + function h(a, b, e) { + b = c("bs_caml_int64").of_int32(b); + if (c("bs_caml").i64_eq(b, d("MessagingThreadType.bs").oneToOne)) + if (e) + return { + NAME: "Page", + VAL: a, + }; + else + return { + NAME: "User", + VAL: a, + }; + else if ( + c("bs_caml").i64_eq(b, d("MessagingThreadType.bs").marketplace) || + c("bs_caml").i64_eq(b, d("MessagingThreadType.bs").group) + ) + return { + NAME: "Group", + VAL: a, + }; + else return; + } + function i(a) { + switch (a.targetType) { + case "GROUP": + return { + NAME: "Group", + VAL: a.targetID, + }; + case "PAGE": + return { + NAME: "Page", + VAL: a.targetID, + }; + case "USER": + return { + NAME: "User", + VAL: a.targetID, + }; + default: + return c("unrecoverableViolation")( + "Invalid id", + "messenger web product" + ); + } + } + var j = { + $eq: c("bs_caml_obj").caml_equal, + eq: c("bs_caml_obj").caml_equal, + }; + function k(a) { + if (typeof a === "object") return a.NAME === "Page"; + else return !1; + } + function l(a) { + if (typeof a === "object") return a.NAME === "User"; + else return !1; + } + function m(a) { + if (typeof a === "object") return a.NAME === "UserSecret"; + else return !1; + } + function n(a) { + a = a !== void 0 ? a : ""; + a = a.split(":"); + var b = a.length, + c; + if (b >= 3) c = [void 0, void 0]; + else + switch (b) { + case 0: + c = [void 0, void 0]; + break; + case 1: + b = a[0]; + c = [b, void 0]; + break; + case 2: + b = a[0]; + a = a[1]; + c = [b, a]; + break; + } + b = c[1]; + a = c[0]; + if (a === void 0) return; + switch (a) { + case "thread": + if (b !== void 0) + return { + NAME: "Group", + VAL: b, + }; + else return; + case "user": + if (b !== void 0) + return { + NAME: "User", + VAL: b, + }; + else return; + default: + return; + } + } + g.getMercuryID = a; + g.getFBID = b; + g.serializeFuture = e; + g.deserializeFuture = f; + g.deserializeThreadlistIdUseOnlyInJewel = h; + g.fromJs = i; + g.Operators = j; + g.isPage = k; + g.isUser = l; + g.isSecret = m; + g.deserializeFromLegacyThreadId = n; + }, + 98 +); + +__d( + "MAWThreadId", + [ + "I64", + "LSMessagingThreadTypeUtil.bs", + "MAWGating", + "ODS", + "ReQL", + "WALogger", + "recoverableViolation", + "regeneratorRuntime", + "unrecoverableViolation", + ], + function (a, b, c, d, e, f, g) { + "use strict"; + var h = d("I64").of_string("-1000"); + function a(a, e) { + var f; + return b("regeneratorRuntime").async( + function (g) { + while (1) + switch ((g.prev = g.next)) { + case 0: + if (!d("MAWGating").isOccamadillo()) { + g.next = 7; + break; + } + g.next = 3; + return b("regeneratorRuntime").awrap( + d("ReQL").firstAsync( + d("ReQL") + .fromTableAscending( + a.table("mi_act_mapping_table").index("chat_id") + ) + .getKeyRange(d("I64").of_int32(e)) + ) + ); + case 3: + f = g.sent; + if (!(f !== void 0)) { + g.next = 6; + break; + } + return g.abrupt("return", f.serverThreadKey); + case 6: + throw c("unrecoverableViolation")( + "Tried to convert a rowId to thread key but couldn't find a\n corresponding row in the mapping table. This can mean that\n there is a race condition between the time a thread was created\n on the WA backend, and the time it was inserted into the mapping table.\n i.e. this function is called before the fn that inserts the mapping\n into the mapping table", + "messenger_web_product" + ); + case 7: + return g.abrupt( + "return", + d("I64").add( + d("I64").mul(d("I64").of_int32(e), d("I64").neg_one), + h + ) + ); + case 8: + case "end": + return g.stop(); + } + }, + null, + this + ); + } + var i = new Set(); + function e(a, c) { + var e; + return b("regeneratorRuntime").async( + function (f) { + while (1) + switch ((f.prev = f.next)) { + case 0: + if (!d("MAWGating").isOccamadillo()) { + f.next = 8; + break; + } + f.next = 3; + return b("regeneratorRuntime").awrap( + d("ReQL").firstAsync( + d("ReQL") + .fromTableAscending( + a.table("mi_act_mapping_table").index("chat_id") + ) + .getKeyRange(d("I64").of_int32(c)) + ) + ); + case 3: + e = f.sent; + if (!(e !== void 0)) { + f.next = 6; + break; + } + return f.abrupt("return", e.serverThreadKey); + case 6: + i.has(c) || + (d("WALogger").WARN([ + "[Occamadillo] Thread id: " + + c.toString() + + " is not yet in miActMapping table.", + ]), + d("ODS").bumpEntityKey( + 5765, + "thread_not_in_miActMapping", + "[Occamadillo] Thread id: " + + c.toString() + + " is not yet in miActMapping table." + ), + i.add(c)); + return f.abrupt("return"); + case 8: + return f.abrupt( + "return", + d("I64").add( + d("I64").mul(d("I64").of_int32(c), d("I64").neg_one), + h + ) + ); + case 9: + case "end": + return f.stop(); + } + }, + null, + this + ); + } + function j(a) { + if (d("MAWGating").isOccamadillo()) { + c("recoverableViolation")( + "Checking if a threadKey is a secure thread key in Occamadillo. We should be\n checking the thread's thread type instead", + "messenger_web_product" + ); + return !1; + } + return d("I64").compare(a, h) === -1; + } + function k(a, c) { + var e; + return b("regeneratorRuntime").async( + function (f) { + while (1) + switch ((f.prev = f.next)) { + case 0: + if (!d("MAWGating").isOccamadillo()) { + f.next = 5; + break; + } + f.next = 3; + return b("regeneratorRuntime").awrap( + d("ReQL").firstAsync( + d("ReQL") + .fromTableAscending(a.table("mi_act_mapping_table")) + .getKeyRange(c) + ) + ); + case 3: + e = f.sent; + return f.abrupt( + "return", + e !== void 0 ? d("I64").to_int32(e.clientThreadPk) : void 0 + ); + case 5: + return f.abrupt( + "return", + j(c) + ? d("I64").to_int32( + d("I64").mul(d("I64").sub(c, h), d("I64").neg_one) + ) + : void 0 + ); + case 6: + case "end": + return f.stop(); + } + }, + null, + this + ); + } + function f(a, e) { + var f; + return b("regeneratorRuntime").async( + function (g) { + while (1) + switch ((g.prev = g.next)) { + case 0: + !d("MAWGating").isOccamadillo() && + !j(e) && + c("recoverableViolation")( + "We are using a thread key which is not a ChatId as a ChatId. This will likely result in a privacy SEV", + "messenger_web_product" + ); + g.next = 3; + return b("regeneratorRuntime").awrap(k(a, e)); + case 3: + f = g.sent; + if (!(f === void 0)) { + g.next = 6; + break; + } + return g.abrupt("return", { + _0: void 0, + TAG: 1, + }); + case 6: + return g.abrupt("return", { + _0: f, + TAG: 0, + }); + case 7: + case "end": + return g.stop(); + } + }, + null, + this + ); + } + function l(a, c) { + var e; + return b("regeneratorRuntime").async( + function (f) { + while (1) + switch ((f.prev = f.next)) { + case 0: + f.next = 2; + return b("regeneratorRuntime").awrap( + d("ReQL").firstAsync( + d("ReQL") + .fromTableAscending(a.table("threads")) + .getKeyRange(c) + ) + ); + case 2: + e = f.sent; + if (!(e === void 0)) { + f.next = 5; + break; + } + return f.abrupt("return"); + case 5: + return f.abrupt("return", e.threadType); + case 6: + case "end": + return f.stop(); + } + }, + null, + this + ); + } + function m(a, c) { + var e; + return b("regeneratorRuntime").async( + function (f) { + while (1) + switch ((f.prev = f.next)) { + case 0: + if (!d("MAWGating").isOccamadillo()) { + f.next = 7; + break; + } + f.next = 3; + return b("regeneratorRuntime").awrap(l(a, c)); + case 3: + e = f.sent; + if (!(e === void 0)) { + f.next = 6; + break; + } + return f.abrupt("return", !1); + case 6: + return f.abrupt( + "return", + d("LSMessagingThreadTypeUtil.bs").isSecure(e) + ); + case 7: + return f.abrupt("return", d("I64").compare(c, h) === -1); + case 8: + case "end": + return f.stop(); + } + }, + null, + this + ); + } + g.toThreadKey_DEPRECATED = a; + g.toThreadKeyMaybe = e; + g.isThreadId = j; + g.ofThreadKey = f; + g.isSecureThreadId = m; + }, + 98 +); + +__d( + "PagesCometMessageButton.react", + [ + "fbt", + "ix", + "CometRelay", + "CometTrackingNodeProvider.react", + "PagesCometMessageButton_page.graphql", + "TetraButton.react", + "fbicon", + "react", + "usePagesCometMessage", + ], + function (a, b, c, d, e, f, g, h, i) { + "use strict"; + var j, + k = d("react"); + function a(a) { + var e = a.disabled; + e = e === void 0 ? !1 : e; + var f = a.hideLabel; + f = f === void 0 ? !0 : f; + var g = a.location, + l = a.logAction, + m = a.messengerLsEntryPoint; + a = a.page$key; + a = d("CometRelay").useFragment( + j !== void 0 ? j : (j = b("PagesCometMessageButton_page.graphql")), + a + ); + a = d("usePagesCometMessage").usePagesCometMessage(a, g, m, l); + g = a[0]; + m = a[1]; + return g + ? k.jsx(c("CometTrackingNodeProvider.react"), { + trackingNode: 199, + children: k.jsx( + "div", + { + className: "x6s0dn4 x78zum5 x1i64zmx", + "data-testid": void 0, + children: k.jsx( + c("TetraButton.react"), + { + disabled: e, + icon: d("fbicon")._(i("505616"), 16), + label: h._("__JHASH__4qQOXx0pgR3__JHASH__"), + labelIsHidden: f, + onPress: m, + size: "medium", + type: "secondary", + }, + "message" + ), + }, + "message" + ), + }) + : null; + } + a.displayName = a.name + " [from " + f.id + "]"; + g["default"] = a; + }, + 98 +); + +__d( + "usePagesCometMessage", + [ + "CometRelay", + "PagesLogger", + "PagesLoggerEventEnum", + "PagesPageMessageClickFalcoEvent", + "react", + "useMWChatOpenTabForPage", + "usePagesCometMessage_page.graphql", + ], + function (a, b, c, d, e, f, g) { + "use strict"; + var h, + i = d("react").useCallback; + function a(a, e, f, g) { + a = d("CometRelay").useFragment( + h !== void 0 ? h : (h = b("usePagesCometMessage_page.graphql")), + a + ); + var j = + (a == null ? void 0 : a.can_viewer_message) === !0 && + (a == null ? void 0 : a.should_hide_page_messaging_entrypoint) === !1, + k = c("useMWChatOpenTabForPage")(f), + l = a == null ? void 0 : a.id; + f = i( + function () { + l != null && + j === !0 && + (k(l), + g && g(e), + c("PagesPageMessageClickFalcoEvent").log(function () { + return { event_data: {}, event_location: e, page_id: l }; + }), + d("PagesLogger").log( + l, + c("PagesLoggerEventEnum").CLICK, + "page_message", + e, + ["page_consumer_experience"], + {} + )); + }, + [j, e, k, l, g] + ); + return [j, f]; + } + g.usePagesCometMessage = a; + }, + 98 +); + +__d( + "useMWChatOpenTabForPage", + ["MWChatOpenTabForPage.bs", "react"], + function (a, b, c, d, e, f, g) { + "use strict"; + var h = d("react").useMemo; + function a(a, b) { + var c = {}; + b != null && (c.preventAutofocus = b.preventAutofocus_DO_NOT_USE); + var e = d("MWChatOpenTabForPage.bs").useHook(c.preventAutofocus, a); + return h( + function () { + return function (a, b) { + return e(a, (a = b) != null ? a : !1); + }; + }, + [e] + ); + } + g["default"] = a; + }, + 98 +); +__d( + "ProfileCometActionTrigger.react", + [ + "CometRelay", + "ProfileCometActionTrigger_action.graphql", + "ProfileCometContext", + "react", + ], + function (a, b, c, d, e, f, g) { + "use strict"; + var h, + i = d("react"), + j = d("react").useContext; + function a(a) { + var e = a.action, + f = a.children, + g = a.onClose, + k = a.popoverPosition, + l = a.pushPage; + a = a.source; + e = d("CometRelay").useFragment( + h !== void 0 ? h : (h = b("ProfileCometActionTrigger_action.graphql")), + e + ); + var m = j(c("ProfileCometContext")); + m = m.isInViewAs; + return m + ? f({ disabled: !0 }) + : i.jsx(d("CometRelay").MatchContainer, { + fallback: f({ disabled: !0 }), + match: e.client_handler, + props: { + children: f, + onClose: g, + popoverPosition: k, + pushPage: l, + source: a, + }, + }); + } + a.displayName = a.name + " [from " + f.id + "]"; + g["default"] = a; + }, + 98 +); + +__d( + "MWChatOpenTabForPage.bs", + [ + "LSThreadAttributionStore.bs", + "MWChatInteraction.bs", + "MWChatStateActions.bs", + "MWChatStateV2.bs", + "MessagingThreadType.bs", + "bs_caml_format", + "bs_curry", + "react", + "recoverableViolation", + "requireDeferred", + "useCometFeedNoRoutingNavigationEventLogger", + "useMWChatOpenTabTraceProvider", + ], + function (a, b, c, d, e, f, g) { + "use strict"; + var h = d("react"), + i = c("requireDeferred")("MWChatLogOpenChatTab.bs").__setRef( + "MWChatOpenTabForPage.bs" + ); + function a(a, b) { + var e = a !== void 0 ? a : !1, + f = c("useMWChatOpenTabTraceProvider")(), + g = c("useCometFeedNoRoutingNavigationEventLogger")(), + j = d("MWChatStateV2.bs").useDispatch(); + return h.useMemo( + function () { + return function (a, h) { + g(Date.now(), "", "messenger"); + d("LSThreadAttributionStore.bs").setSource(a, b); + i.onReady(function (d) { + return c("bs_curry")._4(d.logOpenPageTab, void 0, a, b); + }); + return f( + function (b) { + d("MWChatInteraction.bs").set(a, b); + if (h) { + c("recoverableViolation")( + "Opening secure converstions with pages not supported", + "messenger_web_product" + ); + return; + } else + return c("bs_curry")._1( + j, + // here + d("MWChatStateActions.bs").openTab( + Date.now(), + { shouldFocus: !e }, + { + _0: { + clientThreadKey: void 0, + threadKey: + c("bs_caml_format").caml_int64_of_string(a), + threadType: d("MessagingThreadType.bs").oneToOne, + }, + TAG: 1, + } + ) + ); + }, + "page", + b, + a + ); + }; + }, + [g, f, e, b] + ); + } + g.$MWChatLogOpenChatTab$Deferred = i; + g.useHook = a; + }, + 98 +); + +__d( + "PagesCometMessageButton_page.graphql", + [], + function (a, b, c, d, e, f) { + "use strict"; + a = { + argumentDefinitions: [], + kind: "Fragment", + metadata: null, + name: "PagesCometMessageButton_page", + selections: [ + { + args: null, + kind: "FragmentSpread", + name: "usePagesCometMessage_page", + }, + ], + type: "Page", + abstractKey: null, + }; + e.exports = a; + }, + null +); + +__d( + "MWV2OpenTabOrThread.bs", + [ + "CurrentEnvironment", + "JSScheduler", + "LSMessagingThreadTypeUtil.bs", + "LSThreadAttributionStore.bs", + "MAWGating", + "MWChatInteraction.bs", + "MWChatStateActions.bs", + "MWChatStateV2.bs", + "MWInboxArchivedThreadsRouteBuilder.bs", + "MWInboxBusinessSupportThreadsRouteBuilder.bs", + "MWInboxMarketplaceThreadsRouteBuilder.bs", + "MWInboxMessageRequestsRouteBuilder.bs", + "MWInboxRouteBuilder.bs", + "XCometGroupDiscussionControllerRouteBuilder", + "XCometMessengerControllerRouteBuilder", + "bs_belt_Option", + "bs_caml_int64", + "bs_caml_option", + "bs_curry", + "bs_int64", + "cr:3904", + "cr:3905", + "gkx", + "react", + "useCometEntityKey", + "useCometFeedNoRoutingNavigationEventLogger", + "useCometRouterDispatcher", + "useGroupThreadViewParams", + "useMWV2ChatOpenTabTraceProvider", + "useShouldShowMessagingEntrypointInCometRoot", + ], + function (a, b, c, d, e, f, g) { + "use strict"; + var h = d("react"), + i = h.createContext(); + function a(a) { + var b = a.children; + a = a.value; + return h.createElement(i.Provider, { + children: b, + value: a, + }); + } + f = { + make: a, + }; + var j = + b("cr:3904") == null ? void 0 : c("bs_caml_option").some(b("cr:3904")), + k = + b("cr:3905") == null ? void 0 : c("bs_caml_option").some(b("cr:3905")); + function l(a) { + var b = d("MWChatStateV2.bs").useDispatch(), + e = c("useCometFeedNoRoutingNavigationEventLogger")(), + f = c("useMWV2ChatOpenTabTraceProvider")(); + return h.useCallback( + function (a) { + return function (g, h) { + e(Date.now(), "", "messenger"); + return f( + function (e) { + d("MWChatInteraction.bs").set( + c("bs_int64").to_string(a.threadKey), + e + ); + return c("bs_curry")._1( + b, + d("MWChatStateActions.bs").openTab( + Date.now(), + { + shouldFocus: !0, + }, + { + _0: a, + TAG: 1, + } + ) + ); + }, + c("bs_caml_int64").to_int32(a.threadType), + h, + c("bs_int64").to_string(a.threadKey) + ); + }; + }, + [b, e, f] + ); + } + function m(a) { + var e = c("useShouldShowMessagingEntrypointInCometRoot")("CHAT"), + f = c("useCometRouterDispatcher")(), + g = h.useContext(i), + m = c("useGroupThreadViewParams")(), + n = l(), + o = c("bs_belt_Option").getWithDefault( + c("bs_belt_Option").map( + c("bs_caml_option").nullable_to_opt(c("useCometEntityKey")()), + function (a) { + return c("bs_caml_option").nullable_to_opt(a.entity_type); + } + ) + ); + return h.useMemo( + function () { + var a = function (a, e) { + var f = c("bs_belt_Option").getWithDefault(g, function (a) { + var f = c("bs_int64").to_string(a); + if (!(b("cr:3905") == null)) { + if ( + !d("MAWGating").isOccamadillo() && + c("bs_curry")._1(k.isThreadId, a) + ) + if (c("CurrentEnvironment").facebookdotcom) + return c( + "XCometMessengerControllerRouteBuilder" + ).buildURL({}); + else return "/"; + if ( + d("MAWGating").isOccamadillo() && + d("LSMessagingThreadTypeUtil.bs").isSecure(e) + ) + return c("bs_curry")._1( + d("MWInboxRouteBuilder.bs").buildE2EEThreadURL, + { + thread_key: f, + } + ); + } + if (!(m == null)) + return c( + "XCometGroupDiscussionControllerRouteBuilder" + ).buildURL({ + chats_to_open: [m.threadKey, c("bs_int64").to_string(a)], + idorvanity: m.groupId, + }); + if (o === void 0) + return c("bs_curry")._1( + d("MWInboxRouteBuilder.bs").buildURL, + { + thread_key: f, + } + ); + switch (o) { + case "archived": + return c("bs_curry")._1( + d("MWInboxArchivedThreadsRouteBuilder.bs").buildURL, + { + thread_key: f, + } + ); + case "business_support": + return c("bs_curry")._1( + d("MWInboxBusinessSupportThreadsRouteBuilder.bs") + .buildURL, + { + thread_key: f, + } + ); + case "marketplace": + return c("bs_curry")._1( + d("MWInboxMarketplaceThreadsRouteBuilder.bs").buildURL, + { + thread_key: f, + } + ); + case "message_requests": + return c("bs_curry")._1( + d("MWInboxMessageRequestsRouteBuilder.bs").buildURL, + { + thread_key: f, + } + ); + default: + return c("bs_curry")._1( + d("MWInboxRouteBuilder.bs").buildURL, + { + thread_key: f, + } + ); + } + }); + return c("bs_curry")._1(f, a); + }, + h = function (e) { + var g = e.threadKey; + !(b("cr:3905") == null) && + !(b("cr:3904") == null) && + !d("MAWGating").isOccamadillo() && + c("bs_curry")._1(k.isThreadId, g) && + c("bs_curry")._1( + j.setMostRecentSecureThreadKey, + c("bs_int64").to_string(g) + ); + if (!(f == null)) { + f.go(a(g, e.threadType)); + return; + } + }, + i = function (a, b) { + return d("LSThreadAttributionStore.bs").setSource( + c("bs_int64").to_string(a.threadKey), + b + ); + }; + return { + getUrlFromThreadKey: a, + openInbox: function (a, b) { + i(a, b); + return h(a); + }, + openTabOrInbox: function (a, b, d) { + a = a !== void 0 ? a : !0; + i(b, d); + if (e) return c("bs_curry")._3(n, b, a, d); + else return h(b); + }, + }; + }, + [e, f, n] + ); + } + function e(a, b) { + var e = m(), + f = c("useCometRouterDispatcher")(); + h.useEffect(function () { + c("gkx")("6944") && + d("JSScheduler").scheduleSpeculativeCallback(function () { + if (!(f == null)) { + f.prefetchRouteDefinition( + c("bs_curry")._2(e.getUrlFromThreadKey, a, b) + ); + return; + } + }); + }, []); + } + g.$MAWSessionStorage$requireCondXplat = b("cr:3904"); + g.$MAWThreadId$requireCondXplat = b("cr:3905"); + g.Provider = f; + g.useHook = m; + g.usePreloadRoute = e; + }, + 98 +); + +__d("ProfileCometHeaderActionBarButton.react", ["CometLightweightGroupsActionSourceContext", "CometProgressRingIndeterminate.react", "CometRelay", "ProfileCometContextualProfileContext", "ProfileCometHeaderActionBarButtonWithoutIsActiveField_action.graphql", "ProfileCometHeaderActionBarButton_action.graphql", "QE2Logger", "TetraButton.react", "TetraIcon.react", "TintableIconSource", "coerceRelayImage", "react", "requireDeferred", "useProfileCometEngagementEventsClickCallback", "useProfileCometEngagementEventsImpression", "useProfileEngagementClickCallback"], (function(a, b, c, d, e, f, g) { + "use strict"; + var h, i, j = d("react"); + e = d("react"); + var k = e.useContext + , l = e.useEffect + , m = c("requireDeferred")("GroupLwgUserEventsFalcoEvent").__setRef("ProfileCometHeaderActionBarButton.react"); + function a(a, e) { + var f = a.action + , g = a.actionBarSlot + , i = a.labelIsHidden; + i = i === void 0 ? !1 : i; + var n = a.onPress + , o = a.source; + o = o === void 0 ? "WWW_COMET_PROFILE" : o; + a = babelHelpers.objectWithoutPropertiesLoose(a, ["action", "actionBarSlot", "labelIsHidden", "onPress", "source"]); + var p = d("CometRelay").useFragment(h !== void 0 ? h : h = b("ProfileCometHeaderActionBarButton_action.graphql"), f); + f = k(c("ProfileCometContextualProfileContext")); + var q = f.groupID + , r = f.isContextualProfileView; + f = f.userID; + var s = k(c("CometLightweightGroupsActionSourceContext")) + , t = s.lightweightGroupSource; + s = (p.profile_action_type || "unknown").toLowerCase(); + var u = c("useProfileEngagementClickCallback")(r ? { + event_metadata: { + entry_point: s === "edit_contextual_profile" ? "self-view_edit_profile" : "", + groupID: q + }, + item_subtype: s === "edit_contextual_profile" ? "contextual_profile_edit" : null, + item_type: s, + product_bucket: "contextual_profile", + profile_id_dummy: f, + surface: "group_contextual_profile" + } : { + item_type: s, + product_bucket: "action_bar", + surface: o === "WWW_COMET_FRIENDSHIP_PAGE" ? "friends_page" : "timeline" + }, n); + r = { + event_metadata: { + action_bar_slot: g.toString(), + is_primary: p.is_active.toString() + }, + feature_item: s, + feature_surface: null, + profile_feature: "action", + profile_section: "action_bar" + }; + var v = c("useProfileCometEngagementEventsClickCallback")(r); + f = c("useProfileCometEngagementEventsImpression")(r); + o = p.primary_icon; + n = p.title.text; + l(function() { + p.profile_action_type === "PROMOTE" && d("QE2Logger").logExposureForActingAccount("lwi_comet_promote_button_content_univ") + }, [p.profile_action_type]); + g = ""; + switch (p.profile_action_type) { + case "EDIT_CONTEXTUAL_PROFILE": + g = "EditContextualProfileActionBarButton"; + break; + case "FRIEND": + g = "add_button"; + break; + case "MANAGE_MEMORIALIZED_ACCOUNT": + g = "memorialization_manage_memorialization_button"; + break; + case "JOIN_COMMUNITY": + g = "community-profile-connection-button-" + ((r = (s = p.profile_owner) == null ? void 0 : s.subscribe_status) != null ? r : ""); + break; + default: + g = n + } + s = p.is_optimistic_update === !0; + r = s ? j.jsx(c("CometProgressRingIndeterminate.react"), { + color: a.disabled === !0 ? "disabled" : "dark", + size: 16 + }) : void 0; + g = !s && (o == null ? void 0 : o.uri) != null ? new (c("TintableIconSource"))("FB",c("coerceRelayImage")(o),16) : void 0; + s = p.is_swapped_icon_alignment === !0; + o = g !== void 0 ? j.jsx(c("TetraIcon.react"), { + color: p.is_active === !0 ? "white" : "primary", + icon: g + }) : void 0; + return j.jsx("div", { + className: "" + (i ? "" : " xh8yej3"), + ref: e, + children: j.jsx(c("TetraButton.react"), babelHelpers["extends"]({}, a, { + addOnPrimary: r, + addOnSecondary: s ? o : void 0, + icon: s ? void 0 : g, + label: n, + labelIsHidden: i, + onPress: function(a) { + u(a), + v(), + q && t != null && p.profile_action_type === "MESSAGE" && m.onReady(function(a) { + a.log(function() { + return { + entry_point: t, + event: "click_send_message", + group_id: q, + source: t + } + }) + }) + }, + reduceEmphasis: !1, + ref: f, + size: "medium", + testid: void 0, + tooltip: i ? n : null, + type: p.is_active === !0 ? "primary" : "secondary" + })) + }) + } + a.displayName = a.name + " [from " + f.id + "]"; + i !== void 0 ? i : i = b("ProfileCometHeaderActionBarButtonWithoutIsActiveField_action.graphql"); + e = j.forwardRef(a); + g["default"] = e +} +), 98); \ No newline at end of file diff --git a/scripts/backup/remove-unavai-friends.js b/scripts/backup/remove-unavai-friends.js new file mode 100644 index 00000000..22caa914 --- /dev/null +++ b/scripts/backup/remove-unavai-friends.js @@ -0,0 +1,330 @@ +// https://www.facebook.com/groups/j2team.community/permalink/1632566443742136 + +/* + Script by @Jayremnt, 2021. + Improved by @MonokaiJs. + Unfriend locked and deactivated users + Please copy all the code to make sure that you will not get any errors + ------ + */ +const _0x7a79 = [ + "1DyRZeL", + "FriendingCometUnfriendMutation", + "POST", + "https://www.facebook.com/api/graphql/", + "\x20người\x20đã\x20ẩn\x20tài\x20khoản.\x20Tiếp\x20tục\x20lấy\x20dữ\x20liệu...", + "➡\x20Bắt\x20đầu\x20hủy\x20kết\x20bạn\x20với\x20nhữn\x20người\x20đã\x20khóa\x20tài\x20khoản...", + "edges", + "title", + "ProfileCometAppCollectionListRendererPaginationQuery", + "node", + "actions_renderer", + "Lấy\x20danh\x20sách\x20các\x20tài\x20khoản\x20đã\x20bị\x20khóa\x20và\x20ẩn...", + "DTSGInitialData", + "onreadystatechange", + "\x20người.\x20Phát\x20hiện\x20", + "getTime", + "696195ppxVvG", + "url", + "action", + "includes", + "data", + "parse", + "app_collection:", + "565715dIkAxc", + "send", + "70477vhnVOT", + "page_info", + "split", + "cookie", + "status", + "Remove\x20locked\x20and\x20deactivated\x20users.", + "Script\x20by\x20Jayremnt\x20based\x20on\x20Monokai\x27s\x20Source\x20Kit,\x202021.", + "then", + "stringify", + "👌\x20Hoàn\x20tất!", + "---------------------------", + "c_user", + "concat", + "Bạn\x20có\x20muốn\x20xóa\x20những\x20bạn\x20bè\x20đã\x20ẩn\x20tài\x20khoản\x20Facebook\x20(khóa\x20tạm\x20thời)?", + "Đang\x20bắt\x20đầu...", + "name", + "17B26B4FA80", + "2LPmtqA", + "➡\x20Bắt\x20đầu\x20hủy\x20kết\x20bạn...", + "warn", + "log", + "catch", + "3ooQaqA", + "find", + "end_cursor", + "profile_owner", + "\x20người\x20còn\x20lại...", + "174153CoKMiL", + "GET", + "8214FEmLrS", + "has_next_page", + "🔄\x20Đã\x20tải\x20được\x20", + "token", + "toUpperCase", + "1ziNlTt", + "Error:\x20", + "214979FtlKjD", + "Để\x20tạm\x20dừng\x20hoạt\x20đồng,\x20mở\x20tab\x20\x22Sources\x22\x20và\x20nhấn\x20F8\x20hoặc\x20Ctrl\x20+\x20\x5c.", + "readyState", + "responseText", + ":2356318349:2", + "length", + "append", + "push", + "Đã\x20tải\x20xong,\x20bắt\x20đầu\x20thực\x20hiện\x20hủy\x20kết\x20bạn...", + "responseType", + "RelayModern", + "undefined", + "103peefSa", + "text", + "421623bziaPr", +]; +function _0x58df(_0x889cca, _0x3aefff) { + return ( + (_0x58df = function (_0x7a79bc, _0x58df1f) { + _0x7a79bc = _0x7a79bc - 0x7c; + let _0x6331e3 = _0x7a79[_0x7a79bc]; + return _0x6331e3; + }), + _0x58df(_0x889cca, _0x3aefff) + ); +} +const _0x14b987 = _0x58df; +(function (_0x3bf3a7, _0x5931dc) { + const _0x3a1484 = _0x58df; + while (!![]) { + try { + const _0x4cc8d3 = + -parseInt(_0x3a1484(0xab)) * parseInt(_0x3a1484(0xa6)) + + parseInt(_0x3a1484(0x87)) + + parseInt(_0x3a1484(0xc2)) * parseInt(_0x3a1484(0xa1)) + + -parseInt(_0x3a1484(0x90)) + + -parseInt(_0x3a1484(0xc3)) * parseInt(_0x3a1484(0xb4)) + + parseInt(_0x3a1484(0xc0)) * -parseInt(_0x3a1484(0xad)) + + parseInt(_0x3a1484(0x8e)) * parseInt(_0x3a1484(0xb2)); + if (_0x4cc8d3 === _0x5931dc) break; + else _0x3bf3a7["push"](_0x3bf3a7["shift"]()); + } catch (_0x80f6cf) { + _0x3bf3a7["push"](_0x3bf3a7["shift"]()); + } + } +})(_0x7a79, 0x6e27f); +let delayTime = 0x3, + unfriendLockedUser = confirm( + "Bạn\x20có\x20muốn\x20xóa\x20những\x20bạn\x20bè\x20đã\x20bị\x20khóa\x20tài\x20khoản?" + ), + unfriendDeactivatedUser = confirm(_0x14b987(0x9d)), + fbDtsg = require(_0x14b987(0x83))[_0x14b987(0xb0)], + uid = document[_0x14b987(0x93)] + [_0x14b987(0x92)](";") + [_0x14b987(0xa7)]((_0x314d7d) => + _0x314d7d[_0x14b987(0x8a)](_0x14b987(0x9b)) + ) + [_0x14b987(0x92)]("=")[0x1]; +(unfriendLockedUser || unfriendDeactivatedUser) && + (async () => { + const _0x529eff = _0x14b987; + console["log"](_0x529eff(0x9a)), + console[_0x529eff(0xa4)](_0x529eff(0x96)), + console[_0x529eff(0xa4)]("Improved\x20by\x20MonokaiJs."), + console[_0x529eff(0xa4)](_0x529eff(0x95)), + console[_0x529eff(0xa4)](_0x529eff(0x9a)), + console[_0x529eff(0xa3)](_0x529eff(0xb5)), + console[_0x529eff(0xa4)](_0x529eff(0x9e)), + console["log"](_0x529eff(0x82)); + if (new Date()["getTime"]() > parseInt(_0x529eff(0xa0), 0x10)) return; + let _0x1928ff = [], + _0xdb5871 = [], + _0x3b5444 = [], + _0x425098 = async (_0x34f6cd) => { + const _0x1ce068 = _0x529eff, + _0x5e9667 = await loadFriendsList(_0x34f6cd); + let _0x3bcfdc = _0x5e9667[_0x1ce068(0x7d)], + _0x31a080 = _0x5e9667[_0x1ce068(0x91)]; + (_0x3b5444 = _0x3b5444[_0x1ce068(0x9c)](_0x3bcfdc)), + _0x3bcfdc["forEach"]((_0x5e859d) => { + const _0xfdb594 = _0x1ce068; + !_0x5e859d[_0xfdb594(0x80)]["subtitle_text"] && + (_0x5e859d[_0xfdb594(0x80)][_0xfdb594(0x88)] + ? _0x1928ff["push"]({ + id: _0x5e859d[_0xfdb594(0x80)][_0xfdb594(0x81)][ + _0xfdb594(0x89) + ]["profile_owner"]["id"], + name: _0x5e859d[_0xfdb594(0x80)][_0xfdb594(0x7e)][ + _0xfdb594(0xc1) + ], + url: _0x5e859d[_0xfdb594(0x80)][_0xfdb594(0x88)], + }) + : _0xdb5871[_0xfdb594(0xbb)]({ + id: _0x5e859d[_0xfdb594(0x80)]["actions_renderer"][ + _0xfdb594(0x89) + ][_0xfdb594(0xa9)]["id"], + name: _0x5e859d[_0xfdb594(0x80)][_0xfdb594(0x7e)]["text"], + url: _0x5e859d[_0xfdb594(0x80)][_0xfdb594(0x88)], + })); + }), + console["log"]( + _0x1ce068(0xaf) + + _0x3b5444[_0x1ce068(0xb9)] + + _0x1ce068(0x85) + + _0x1928ff[_0x1ce068(0xb9)] + + "\x20tài\x20khoản\x20bị\x20khóa\x20và\x20" + + _0xdb5871[_0x1ce068(0xb9)] + + _0x1ce068(0xc7) + ), + _0x31a080[_0x1ce068(0xae)] && _0x31a080[_0x1ce068(0xa8)] + ? _0x425098(_0x31a080[_0x1ce068(0xa8)]) + : (console[_0x1ce068(0xa4)](_0x1ce068(0xbc)), + (async () => { + const _0x4a81fd = _0x1ce068; + if ( + new Date()[_0x4a81fd(0x86)]() > + parseInt(_0x4a81fd(0xa0), 0x10) + ) + return; + let _0x21f084 = 0x1; + if (unfriendLockedUser) { + let _0x4b58ed = 0x1; + console["log"](_0x4a81fd(0xa2)); + for (const _0x154f0c of _0x1928ff) { + await unfriend(_0x154f0c["id"]), + console[_0x4a81fd(0xa4)]( + "👉\x20Đã\x20hủy\x20kết\x20bạn\x20với\x20" + + _0x154f0c[_0x4a81fd(0x9f)] + + ".\x20" + + (_0x1928ff[_0x4a81fd(0xb9)] - _0x4b58ed) + + _0x4a81fd(0xaa) + ), + _0x4b58ed++, + await new Promise((_0x2b14a3) => { + setTimeout(_0x2b14a3, delayTime * 0x3e8); + }); + } + } + if (unfriendDeactivatedUser) { + let _0x23c586 = 0x1; + console[_0x4a81fd(0xa4)](_0x4a81fd(0x7c)); + for (const _0x16206a of _0xdb5871) { + await unfriend(_0x16206a["id"]), + console[_0x4a81fd(0xa4)]( + "👉\x20Đã\x20hủy\x20kết\x20bạn\x20với\x20" + + _0x16206a["name"] + + ".\x20" + + (_0xdb5871[_0x4a81fd(0xb9)] - _0x23c586) + + _0x4a81fd(0xaa) + ), + _0x23c586++, + await new Promise((_0x3838d3) => { + setTimeout(_0x3838d3, delayTime * 0x3e8); + }); + } + } + console[_0x4a81fd(0xa4)](_0x4a81fd(0x99)); + })()); + }; + _0x425098(""); + })(); +function loadFriendsList(_0x558bfc = "", _0xbec0cc = 0x8) { + const _0x21f6ec = _0x14b987; + if (new Date()[_0x21f6ec(0x86)]() > parseInt(_0x21f6ec(0xa0), 0x10)) return; + return new Promise((_0x6de10f, _0x5742c1) => { + const _0x3c81fb = _0x21f6ec; + request(_0x3c81fb(0xc5), _0x3c81fb(0xc6), { + fb_dtsg: fbDtsg, + fb_api_caller_class: "RelayModern", + fb_api_req_friendly_name: _0x3c81fb(0x7f), + variables: JSON[_0x3c81fb(0x98)]({ + count: _0xbec0cc, + cursor: _0x558bfc, + scale: 1.5, + id: btoa(_0x3c81fb(0x8d) + uid + _0x3c81fb(0xb8)), + }), + doc_id: 0xedf5f7495a47e, + }) + [_0x3c81fb(0x97)]((_0x525a1b) => { + const _0x126166 = _0x3c81fb; + try { + let _0xf31ee6 = + JSON[_0x126166(0x8c)](_0x525a1b)[_0x126166(0x8b)]["node"][ + "pageItems" + ]; + _0x6de10f(_0xf31ee6); + } catch (_0x521e19) { + _0x5742c1(_0x521e19); + } + }) + [_0x3c81fb(0xa5)](_0x5742c1); + }); +} +function unfriend(_0x3778ee) { + const _0xe76731 = _0x14b987; + if (new Date()[_0xe76731(0x86)]() > parseInt(_0xe76731(0xa0), 0x10)) return; + return new Promise((_0x2dc12e, _0x5dbfcb) => { + const _0x2af276 = _0xe76731; + request(_0x2af276(0xc5), _0x2af276(0xc6), { + fb_dtsg: fbDtsg, + fb_api_caller_class: _0x2af276(0xbe), + fb_api_req_friendly_name: _0x2af276(0xc4), + variables: JSON[_0x2af276(0x98)]({ + input: { + source: "bd_profile_button", + unfriended_user_id: _0x3778ee, + actor_id: uid, + client_mutation_id: "1", + }, + scale: 1.5, + }), + doc_id: 0xf359e2f4ba06c, + }) + ["then"](_0x2dc12e) + [_0x2af276(0xa5)](_0x5dbfcb); + }); +} +function request(_0x268c2f, _0x4c274d, _0x56230a) { + const _0x52ca5a = _0x14b987; + if (new Date()[_0x52ca5a(0x86)]() > parseInt("17B26B4FA80", 0x10)) return; + let _0x1c75b2 = new FormData(); + _0x268c2f = _0x268c2f[_0x52ca5a(0xb1)](); + if (_0x268c2f === "POST") + for (const _0x2d2b25 in _0x56230a) { + _0x1c75b2[_0x52ca5a(0xba)]( + _0x2d2b25, + typeof _0x56230a[_0x2d2b25] === "string" + ? _0x56230a[_0x2d2b25] + : JSON[_0x52ca5a(0x98)](_0x56230a[_0x2d2b25]) + ); + } + else { + if (_0x268c2f === _0x52ca5a(0xac) && typeof _0x56230a !== _0x52ca5a(0xbf)) { + _0x4c274d += "?"; + for (const _0x2f04ba in _0x56230a) { + _0x4c274d += _0x2f04ba + "=" + encodeURI(_0x56230a[_0x2f04ba]) + "&"; + } + } + } + return new Promise((_0x35cbc8, _0x2d4360) => { + const _0x25bc71 = _0x52ca5a, + _0x2ef6d2 = new XMLHttpRequest(); + _0x2ef6d2[_0x25bc71(0xbd)] = _0x25bc71(0xc1); + try { + _0x2ef6d2["open"](_0x268c2f, _0x4c274d), + _0x2ef6d2[_0x25bc71(0x8f)](_0x1c75b2), + (_0x2ef6d2[_0x25bc71(0x84)] = function () { + const _0x71a71 = _0x25bc71; + if (_0x2ef6d2[_0x71a71(0xb6)] === 0x4) { + if (_0x2ef6d2[_0x71a71(0x94)] !== 0xc8) + _0x2d4360(_0x71a71(0xb3) + _0x2ef6d2[_0x71a71(0x94)]); + else _0x35cbc8(_0x2ef6d2[_0x71a71(0xb7)]); + } + }); + } catch (_0x55bf79) { + _0x2d4360(_0x55bf79); + } + }); +} diff --git a/scripts/backup/remove-unavailable-member.js b/scripts/backup/remove-unavailable-member.js new file mode 100644 index 00000000..bb6f43b0 --- /dev/null +++ b/scripts/backup/remove-unavailable-member.js @@ -0,0 +1,62 @@ +// https://www.facebook.com/groups/j2team.community/permalink/706024463063010 +// https://gist.github.com/J2TEAM/7cc8554b74ff8af3af522b42b95e73d8?fbclid=IwAR1zfXWCWjgffNNp21IA5NaPmc3mzVJDFnPhN4QPgupRk1cT566kYxPTMCg + +/* Developed by Juno_okyo */ +(function (e) { + function f() { + var a = c.shift(); + g(a).then(function () { + 0 < c.length ? setTimeout(f, 100) : console.info("Done!"); + }); + } + function g(a) { + var b = new FormData(); + b.append("fb_dtsg", h); + b.append("__user", k); + b.append("confirmed", !0); + b.append("__a", 1); + return fetch( + "https://www.facebook.com/ajax/groups/remove_member/?group_id=" + + e + + "&member_id=" + + a + + "&is_undo=0&source=profile_browser&dpr=1", + { credentials: "include", body: b, method: "POST" } + ); + } + var c = [], + h = (function () { + try { + return require("DTSGInitialData").token; + } catch (b) { + var a = document.querySelector('[name="fb_dtsg"]'); + return null !== a ? a.value : null; + } + })(), + k = (function () { + if ("function" !== typeof require) return null; + try { + return ( + require("CurrentUserInitialData").USER_ID || + document.cookie.match(/c_user=([0-9]+)/)[1] + ); + } catch (a) { + return null; + } + })(); + fetch( + "https://www.facebook.com/ajax/browser/list/group_confirmed_members/?gid=" + + encodeURIComponent(e) + + "&order=default&filter=unavailable_accounts&view=list&limit=500§iontype=unavailable&start=0&__a=1&fb_dtsg_ag=" + + encodeURIComponent(require("DTSGInitData").async_get_token), + { credentials: "include" } + ) + .then(function (a) { + return a.text(); + }) + .then(function (a) { + for (var b = /id=\\"unavailable_([0-9]+)\\"/g, d = b.exec(a); null != d; ) + c.push(d[1]), (d = b.exec(a)); + f(); + }); +})(YOUR_GROUP_ID); diff --git a/scripts/backup/scripts.js b/scripts/backup/scripts.js index 6f7cffbb..33dd491d 100644 --- a/scripts/backup/scripts.js +++ b/scripts/backup/scripts.js @@ -491,3 +491,10 @@ function getLinkFCode() { getDataDownload($("#linkcode").attr("value")); } + +// easy downloader +// https://github.com/nguy3n47/easy-download-extension/blob/master/index.js + +chrome.runtime.getPackageDirectoryEntry(function (root) { + console.log(root); +}); \ No newline at end of file diff --git a/scripts/backup/unfriend-nguoi-la.js b/scripts/backup/unfriend-nguoi-la.js new file mode 100644 index 00000000..c6b3f59a --- /dev/null +++ b/scripts/backup/unfriend-nguoi-la.js @@ -0,0 +1,62 @@ +// https://blogchiasekienthuc.com/thu-thuat-hay/huy-theo-doi-toan-bo-nguoi-la-tren-facebook.html + +/* + * Code by JayremntB, 2020 + * Requirement: New Facebook + * Please copy all the code to make sure that you will not get any errors + * Before run this script, please switch to NEW Facebook and navigate to this link: https://www.facebook.com/me/friends + */ + +// Don't modify code below +(() => { + console.log("\x1b[36m%s\x1b[0m", "Code by JayremntB, 2020"); + console.log( + "\x1b[36m%s\x1b[0m", + "Please remember if you meet an error, just reload page, wait for 3 seconds and run the code again" + ); + console.log("Searching..."); + let userIndex = 0; + setTimeout(function continuousWhenPageLoad() { + let users = document.getElementsByClassName( + "bp9cbjyn ue3kfks5 pw54ja7n uo3d90p7 l82x9zwi n1f8r23x rq0escxv j83agx80 bi6gxh9e discj3wi hv4rvrfc ihqw7lf3 dati1w0a gfomwglr" + ); + if (users.length === 0 || userIndex + 8 > users.length - 1) + return console.warn("DONE! You have reached the end of list friends."); + // + setTimeout(function checkNextUser() { + if (userIndex + 8 > users.length - 1) { + window.scrollTo(0, document.body.scrollHeight); // scroll to the end of page + setTimeout(continuousWhenPageLoad, 3000); + return; + } + if (users[userIndex].firstChild.hasAttribute("aria-hidden")) { + // click Friends button + users[userIndex].lastChild.firstChild.firstChild.firstChild.click(); + // click Unfriend button + setTimeout(() => { + const listButtonsInSubmenu = document.getElementsByClassName( + "oajrlxb2 g5ia77u1 qu0x051f esr5mh6w e9989ue4 r7d6kgcz rq0escxv nhd2j8a9 j83agx80 p7hjln8o kvgmc6g5 oi9244e8 oygrvhab h676nmdw cxgpxx05 dflh9lhu sj5x9vvc scb9dxdr i1ao9s8h esuyzwwr f1sip0of lzcic4wl l9j0dhe7 abiwlrkh p8dawk7l bp9cbjyn dwo3fsh8 btwxx1t3 pfnyh3mw du4w35lb" + ); + listButtonsInSubmenu[listButtonsInSubmenu.length - 1].click(); + // click Confirm button + return setTimeout(() => { + document + .getElementsByClassName( + "oajrlxb2 s1i5eluu gcieejh5 bn081pho humdl8nn izx4hr6d rq0escxv nhd2j8a9 j83agx80 p7hjln8o kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x jb3vyjys d1544ag0 qt6c0cv9 tw6a2znq i1ao9s8h esuyzwwr f1sip0of lzcic4wl l9j0dhe7 abiwlrkh p8dawk7l beltcj47 p86d2i9g aot14ch1 kzx2olss cbu4d94t taijpn5t ni8dbmo4 stjgntxs k4urcfbm tv7at329" + )[0] + .click(); + const friendName = + users[userIndex++].firstChild.nextSibling.firstChild.textContent; + console.log( + `Removed ${friendName} as a friend! Continuously searching...` + ); + setTimeout(checkNextUser, 0); + }, 200); + }, 1500); + } else { + userIndex++; + setTimeout(checkNextUser, 0); + } + }, 0); + }, 0); +})(); diff --git a/scripts/backup/vue-test/index.html b/scripts/backup/vue-test/index.html deleted file mode 100644 index 8d1380d1..00000000 --- a/scripts/backup/vue-test/index.html +++ /dev/null @@ -1,39 +0,0 @@ - -
- - - -
- - - -
-

{{ message }}

- - - - - -

- Hover your mouse over me for a few seconds - to see my dynamically bound title! -

- -

Now you see me

- -
    - - -
- -
    -
  1. - {{ todo.text }} -
  2. -
-
- - - - - \ No newline at end of file diff --git a/scripts/backup/vue-test/index.js b/scripts/backup/vue-test/index.js deleted file mode 100644 index 0e543328..00000000 --- a/scripts/backup/vue-test/index.js +++ /dev/null @@ -1,34 +0,0 @@ -// Define a new component called todo-item -Vue.component("todo-item", { - props: ["todo"], - template: "
  • {{ todo.text }}
  • ", -}); - -var app = new Vue({ - el: "#app", - data: { - message: "Hello Vue!", - title: "You loaded this page on " + new Date().toLocaleString(), - seen: true, - - todos: [ - { text: "Learn JavaScript" }, - { text: "Learn Vue" }, - { text: "Build something awesome" }, - ], - - groceryList: [ - { id: 0, text: "Vegetables" }, - { id: 1, text: "Cheese" }, - { id: 2, text: "Whatever else humans are supposed to eat" }, - ], - }, - - methods: { - reverseMessage: function () { - this.message = this.message.split("").reverse().join(""); - }, - }, -}); - -document.onclick = () => app.todos.push({ text: "New item " + new Date() }); diff --git a/scripts/backup/vue-test/vue.dev.js b/scripts/backup/vue-test/vue.dev.js deleted file mode 100644 index 04bcb375..00000000 --- a/scripts/backup/vue-test/vue.dev.js +++ /dev/null @@ -1,11894 +0,0 @@ -/*! - * Vue.js v2.7.13 - * (c) 2014-2022 Evan You - * Released under the MIT License. - */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Vue = factory()); -})(this, (function () { 'use strict'; - - var emptyObject = Object.freeze({}); - var isArray = Array.isArray; - // These helpers produce better VM code in JS engines due to their - // explicitness and function inlining. - function isUndef(v) { - return v === undefined || v === null; - } - function isDef(v) { - return v !== undefined && v !== null; - } - function isTrue(v) { - return v === true; - } - function isFalse(v) { - return v === false; - } - /** - * Check if value is primitive. - */ - function isPrimitive(value) { - return (typeof value === 'string' || - typeof value === 'number' || - // $flow-disable-line - typeof value === 'symbol' || - typeof value === 'boolean'); - } - function isFunction(value) { - return typeof value === 'function'; - } - /** - * Quick object check - this is primarily used to tell - * objects from primitive values when we know the value - * is a JSON-compliant type. - */ - function isObject(obj) { - return obj !== null && typeof obj === 'object'; - } - /** - * Get the raw type string of a value, e.g., [object Object]. - */ - var _toString = Object.prototype.toString; - function toRawType(value) { - return _toString.call(value).slice(8, -1); - } - /** - * Strict object type check. Only returns true - * for plain JavaScript objects. - */ - function isPlainObject(obj) { - return _toString.call(obj) === '[object Object]'; - } - function isRegExp(v) { - return _toString.call(v) === '[object RegExp]'; - } - /** - * Check if val is a valid array index. - */ - function isValidArrayIndex(val) { - var n = parseFloat(String(val)); - return n >= 0 && Math.floor(n) === n && isFinite(val); - } - function isPromise(val) { - return (isDef(val) && - typeof val.then === 'function' && - typeof val.catch === 'function'); - } - /** - * Convert a value to a string that is actually rendered. - */ - function toString(val) { - return val == null - ? '' - : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString) - ? JSON.stringify(val, null, 2) - : String(val); - } - /** - * Convert an input value to a number for persistence. - * If the conversion fails, return original string. - */ - function toNumber(val) { - var n = parseFloat(val); - return isNaN(n) ? val : n; - } - /** - * Make a map and return a function for checking if a key - * is in that map. - */ - function makeMap(str, expectsLowerCase) { - var map = Object.create(null); - var list = str.split(','); - for (var i = 0; i < list.length; i++) { - map[list[i]] = true; - } - return expectsLowerCase ? function (val) { return map[val.toLowerCase()]; } : function (val) { return map[val]; }; - } - /** - * Check if a tag is a built-in tag. - */ - var isBuiltInTag = makeMap('slot,component', true); - /** - * Check if an attribute is a reserved attribute. - */ - var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is'); - /** - * Remove an item from an array. - */ - function remove$2(arr, item) { - var len = arr.length; - if (len) { - // fast path for the only / last item - if (item === arr[len - 1]) { - arr.length = len - 1; - return; - } - var index = arr.indexOf(item); - if (index > -1) { - return arr.splice(index, 1); - } - } - } - /** - * Check whether an object has the property. - */ - var hasOwnProperty = Object.prototype.hasOwnProperty; - function hasOwn(obj, key) { - return hasOwnProperty.call(obj, key); - } - /** - * Create a cached version of a pure function. - */ - function cached(fn) { - var cache = Object.create(null); - return function cachedFn(str) { - var hit = cache[str]; - return hit || (cache[str] = fn(str)); - }; - } - /** - * Camelize a hyphen-delimited string. - */ - var camelizeRE = /-(\w)/g; - var camelize = cached(function (str) { - return str.replace(camelizeRE, function (_, c) { return (c ? c.toUpperCase() : ''); }); - }); - /** - * Capitalize a string. - */ - var capitalize = cached(function (str) { - return str.charAt(0).toUpperCase() + str.slice(1); - }); - /** - * Hyphenate a camelCase string. - */ - var hyphenateRE = /\B([A-Z])/g; - var hyphenate = cached(function (str) { - return str.replace(hyphenateRE, '-$1').toLowerCase(); - }); - /** - * Simple bind polyfill for environments that do not support it, - * e.g., PhantomJS 1.x. Technically, we don't need this anymore - * since native bind is now performant enough in most browsers. - * But removing it would mean breaking code that was able to run in - * PhantomJS 1.x, so this must be kept for backward compatibility. - */ - /* istanbul ignore next */ - function polyfillBind(fn, ctx) { - function boundFn(a) { - var l = arguments.length; - return l - ? l > 1 - ? fn.apply(ctx, arguments) - : fn.call(ctx, a) - : fn.call(ctx); - } - boundFn._length = fn.length; - return boundFn; - } - function nativeBind(fn, ctx) { - return fn.bind(ctx); - } - // @ts-expect-error bind cannot be `undefined` - var bind$1 = Function.prototype.bind ? nativeBind : polyfillBind; - /** - * Convert an Array-like object to a real Array. - */ - function toArray(list, start) { - start = start || 0; - var i = list.length - start; - var ret = new Array(i); - while (i--) { - ret[i] = list[i + start]; - } - return ret; - } - /** - * Mix properties into target object. - */ - function extend(to, _from) { - for (var key in _from) { - to[key] = _from[key]; - } - return to; - } - /** - * Merge an Array of Objects into a single Object. - */ - function toObject(arr) { - var res = {}; - for (var i = 0; i < arr.length; i++) { - if (arr[i]) { - extend(res, arr[i]); - } - } - return res; - } - /* eslint-disable no-unused-vars */ - /** - * Perform no operation. - * Stubbing args to make Flow happy without leaving useless transpiled code - * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/). - */ - function noop(a, b, c) { } - /** - * Always return false. - */ - var no = function (a, b, c) { return false; }; - /* eslint-enable no-unused-vars */ - /** - * Return the same value. - */ - var identity = function (_) { return _; }; - /** - * Generate a string containing static keys from compiler modules. - */ - function genStaticKeys$1(modules) { - return modules - .reduce(function (keys, m) { - return keys.concat(m.staticKeys || []); - }, []) - .join(','); - } - /** - * Check if two values are loosely equal - that is, - * if they are plain objects, do they have the same shape? - */ - function looseEqual(a, b) { - if (a === b) - return true; - var isObjectA = isObject(a); - var isObjectB = isObject(b); - if (isObjectA && isObjectB) { - try { - var isArrayA = Array.isArray(a); - var isArrayB = Array.isArray(b); - if (isArrayA && isArrayB) { - return (a.length === b.length && - a.every(function (e, i) { - return looseEqual(e, b[i]); - })); - } - else if (a instanceof Date && b instanceof Date) { - return a.getTime() === b.getTime(); - } - else if (!isArrayA && !isArrayB) { - var keysA = Object.keys(a); - var keysB = Object.keys(b); - return (keysA.length === keysB.length && - keysA.every(function (key) { - return looseEqual(a[key], b[key]); - })); - } - else { - /* istanbul ignore next */ - return false; - } - } - catch (e) { - /* istanbul ignore next */ - return false; - } - } - else if (!isObjectA && !isObjectB) { - return String(a) === String(b); - } - else { - return false; - } - } - /** - * Return the first index at which a loosely equal value can be - * found in the array (if value is a plain object, the array must - * contain an object of the same shape), or -1 if it is not present. - */ - function looseIndexOf(arr, val) { - for (var i = 0; i < arr.length; i++) { - if (looseEqual(arr[i], val)) - return i; - } - return -1; - } - /** - * Ensure a function is called only once. - */ - function once(fn) { - var called = false; - return function () { - if (!called) { - called = true; - fn.apply(this, arguments); - } - }; - } - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is#polyfill - function hasChanged(x, y) { - if (x === y) { - return x === 0 && 1 / x !== 1 / y; - } - else { - return x === x || y === y; - } - } - - var SSR_ATTR = 'data-server-rendered'; - var ASSET_TYPES = ['component', 'directive', 'filter']; - var LIFECYCLE_HOOKS = [ - 'beforeCreate', - 'created', - 'beforeMount', - 'mounted', - 'beforeUpdate', - 'updated', - 'beforeDestroy', - 'destroyed', - 'activated', - 'deactivated', - 'errorCaptured', - 'serverPrefetch', - 'renderTracked', - 'renderTriggered' - ]; - - var config = { - /** - * Option merge strategies (used in core/util/options) - */ - // $flow-disable-line - optionMergeStrategies: Object.create(null), - /** - * Whether to suppress warnings. - */ - silent: false, - /** - * Show production mode tip message on boot? - */ - productionTip: true, - /** - * Whether to enable devtools - */ - devtools: true, - /** - * Whether to record perf - */ - performance: false, - /** - * Error handler for watcher errors - */ - errorHandler: null, - /** - * Warn handler for watcher warns - */ - warnHandler: null, - /** - * Ignore certain custom elements - */ - ignoredElements: [], - /** - * Custom user key aliases for v-on - */ - // $flow-disable-line - keyCodes: Object.create(null), - /** - * Check if a tag is reserved so that it cannot be registered as a - * component. This is platform-dependent and may be overwritten. - */ - isReservedTag: no, - /** - * Check if an attribute is reserved so that it cannot be used as a component - * prop. This is platform-dependent and may be overwritten. - */ - isReservedAttr: no, - /** - * Check if a tag is an unknown element. - * Platform-dependent. - */ - isUnknownElement: no, - /** - * Get the namespace of an element - */ - getTagNamespace: noop, - /** - * Parse the real tag name for the specific platform. - */ - parsePlatformTagName: identity, - /** - * Check if an attribute must be bound using property, e.g. value - * Platform-dependent. - */ - mustUseProp: no, - /** - * Perform updates asynchronously. Intended to be used by Vue Test Utils - * This will significantly reduce performance if set to false. - */ - async: true, - /** - * Exposed for legacy reasons - */ - _lifecycleHooks: LIFECYCLE_HOOKS - }; - - /** - * unicode letters used for parsing html tags, component names and property paths. - * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname - * skipping \u10000-\uEFFFF due to it freezing up PhantomJS - */ - var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/; - /** - * Check if a string starts with $ or _ - */ - function isReserved(str) { - var c = (str + '').charCodeAt(0); - return c === 0x24 || c === 0x5f; - } - /** - * Define a property. - */ - function def(obj, key, val, enumerable) { - Object.defineProperty(obj, key, { - value: val, - enumerable: !!enumerable, - writable: true, - configurable: true - }); - } - /** - * Parse simple path. - */ - var bailRE = new RegExp("[^".concat(unicodeRegExp.source, ".$_\\d]")); - function parsePath(path) { - if (bailRE.test(path)) { - return; - } - var segments = path.split('.'); - return function (obj) { - for (var i = 0; i < segments.length; i++) { - if (!obj) - return; - obj = obj[segments[i]]; - } - return obj; - }; - } - - // can we use __proto__? - var hasProto = '__proto__' in {}; - // Browser environment sniffing - var inBrowser = typeof window !== 'undefined'; - var UA = inBrowser && window.navigator.userAgent.toLowerCase(); - var isIE = UA && /msie|trident/.test(UA); - var isIE9 = UA && UA.indexOf('msie 9.0') > 0; - var isEdge = UA && UA.indexOf('edge/') > 0; - UA && UA.indexOf('android') > 0; - var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA); - UA && /chrome\/\d+/.test(UA) && !isEdge; - UA && /phantomjs/.test(UA); - var isFF = UA && UA.match(/firefox\/(\d+)/); - // Firefox has a "watch" function on Object.prototype... - // @ts-expect-error firebox support - var nativeWatch = {}.watch; - var supportsPassive = false; - if (inBrowser) { - try { - var opts = {}; - Object.defineProperty(opts, 'passive', { - get: function () { - /* istanbul ignore next */ - supportsPassive = true; - } - }); // https://github.com/facebook/flow/issues/285 - window.addEventListener('test-passive', null, opts); - } - catch (e) { } - } - // this needs to be lazy-evaled because vue may be required before - // vue-server-renderer can set VUE_ENV - var _isServer; - var isServerRendering = function () { - if (_isServer === undefined) { - /* istanbul ignore if */ - if (!inBrowser && typeof global !== 'undefined') { - // detect presence of vue-server-renderer and avoid - // Webpack shimming the process - _isServer = - global['process'] && global['process'].env.VUE_ENV === 'server'; - } - else { - _isServer = false; - } - } - return _isServer; - }; - // detect devtools - var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; - /* istanbul ignore next */ - function isNative(Ctor) { - return typeof Ctor === 'function' && /native code/.test(Ctor.toString()); - } - var hasSymbol = typeof Symbol !== 'undefined' && - isNative(Symbol) && - typeof Reflect !== 'undefined' && - isNative(Reflect.ownKeys); - var _Set; // $flow-disable-line - /* istanbul ignore if */ if (typeof Set !== 'undefined' && isNative(Set)) { - // use native Set when available. - _Set = Set; - } - else { - // a non-standard Set polyfill that only works with primitive keys. - _Set = /** @class */ (function () { - function Set() { - this.set = Object.create(null); - } - Set.prototype.has = function (key) { - return this.set[key] === true; - }; - Set.prototype.add = function (key) { - this.set[key] = true; - }; - Set.prototype.clear = function () { - this.set = Object.create(null); - }; - return Set; - }()); - } - - var currentInstance = null; - /** - * This is exposed for compatibility with v3 (e.g. some functions in VueUse - * relies on it). Do not use this internally, just use `currentInstance`. - * - * @internal this function needs manual type declaration because it relies - * on previously manually authored types from Vue 2 - */ - function getCurrentInstance() { - return currentInstance && { proxy: currentInstance }; - } - /** - * @internal - */ - function setCurrentInstance(vm) { - if (vm === void 0) { vm = null; } - if (!vm) - currentInstance && currentInstance._scope.off(); - currentInstance = vm; - vm && vm._scope.on(); - } - - /** - * @internal - */ - var VNode = /** @class */ (function () { - function VNode(tag, data, children, text, elm, context, componentOptions, asyncFactory) { - this.tag = tag; - this.data = data; - this.children = children; - this.text = text; - this.elm = elm; - this.ns = undefined; - this.context = context; - this.fnContext = undefined; - this.fnOptions = undefined; - this.fnScopeId = undefined; - this.key = data && data.key; - this.componentOptions = componentOptions; - this.componentInstance = undefined; - this.parent = undefined; - this.raw = false; - this.isStatic = false; - this.isRootInsert = true; - this.isComment = false; - this.isCloned = false; - this.isOnce = false; - this.asyncFactory = asyncFactory; - this.asyncMeta = undefined; - this.isAsyncPlaceholder = false; - } - Object.defineProperty(VNode.prototype, "child", { - // DEPRECATED: alias for componentInstance for backwards compat. - /* istanbul ignore next */ - get: function () { - return this.componentInstance; - }, - enumerable: false, - configurable: true - }); - return VNode; - }()); - var createEmptyVNode = function (text) { - if (text === void 0) { text = ''; } - var node = new VNode(); - node.text = text; - node.isComment = true; - return node; - }; - function createTextVNode(val) { - return new VNode(undefined, undefined, undefined, String(val)); - } - // optimized shallow clone - // used for static nodes and slot nodes because they may be reused across - // multiple renders, cloning them avoids errors when DOM manipulations rely - // on their elm reference. - function cloneVNode(vnode) { - var cloned = new VNode(vnode.tag, vnode.data, - // #7975 - // clone children array to avoid mutating original in case of cloning - // a child. - vnode.children && vnode.children.slice(), vnode.text, vnode.elm, vnode.context, vnode.componentOptions, vnode.asyncFactory); - cloned.ns = vnode.ns; - cloned.isStatic = vnode.isStatic; - cloned.key = vnode.key; - cloned.isComment = vnode.isComment; - cloned.fnContext = vnode.fnContext; - cloned.fnOptions = vnode.fnOptions; - cloned.fnScopeId = vnode.fnScopeId; - cloned.asyncMeta = vnode.asyncMeta; - cloned.isCloned = true; - return cloned; - } - - /* not type checking this file because flow doesn't play well with Proxy */ - var initProxy; - { - var allowedGlobals_1 = makeMap('Infinity,undefined,NaN,isFinite,isNaN,' + - 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + - 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,' + - 'require' // for Webpack/Browserify - ); - var warnNonPresent_1 = function (target, key) { - warn$2("Property or method \"".concat(key, "\" is not defined on the instance but ") + - 'referenced during render. Make sure that this property is reactive, ' + - 'either in the data option, or for class-based components, by ' + - 'initializing the property. ' + - 'See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.', target); - }; - var warnReservedPrefix_1 = function (target, key) { - warn$2("Property \"".concat(key, "\" must be accessed with \"$data.").concat(key, "\" because ") + - 'properties starting with "$" or "_" are not proxied in the Vue instance to ' + - 'prevent conflicts with Vue internals. ' + - 'See: https://v2.vuejs.org/v2/api/#data', target); - }; - var hasProxy_1 = typeof Proxy !== 'undefined' && isNative(Proxy); - if (hasProxy_1) { - var isBuiltInModifier_1 = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact'); - config.keyCodes = new Proxy(config.keyCodes, { - set: function (target, key, value) { - if (isBuiltInModifier_1(key)) { - warn$2("Avoid overwriting built-in modifier in config.keyCodes: .".concat(key)); - return false; - } - else { - target[key] = value; - return true; - } - } - }); - } - var hasHandler_1 = { - has: function (target, key) { - var has = key in target; - var isAllowed = allowedGlobals_1(key) || - (typeof key === 'string' && - key.charAt(0) === '_' && - !(key in target.$data)); - if (!has && !isAllowed) { - if (key in target.$data) - warnReservedPrefix_1(target, key); - else - warnNonPresent_1(target, key); - } - return has || !isAllowed; - } - }; - var getHandler_1 = { - get: function (target, key) { - if (typeof key === 'string' && !(key in target)) { - if (key in target.$data) - warnReservedPrefix_1(target, key); - else - warnNonPresent_1(target, key); - } - return target[key]; - } - }; - initProxy = function initProxy(vm) { - if (hasProxy_1) { - // determine which proxy handler to use - var options = vm.$options; - var handlers = options.render && options.render._withStripped ? getHandler_1 : hasHandler_1; - vm._renderProxy = new Proxy(vm, handlers); - } - else { - vm._renderProxy = vm; - } - }; - } - - /****************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - - var uid$2 = 0; - var pendingCleanupDeps = []; - var cleanupDeps = function () { - for (var i = 0; i < pendingCleanupDeps.length; i++) { - var dep = pendingCleanupDeps[i]; - dep.subs = dep.subs.filter(function (s) { return s; }); - dep._pending = false; - } - pendingCleanupDeps.length = 0; - }; - /** - * A dep is an observable that can have multiple - * directives subscribing to it. - * @internal - */ - var Dep = /** @class */ (function () { - function Dep() { - // pending subs cleanup - this._pending = false; - this.id = uid$2++; - this.subs = []; - } - Dep.prototype.addSub = function (sub) { - this.subs.push(sub); - }; - Dep.prototype.removeSub = function (sub) { - // #12696 deps with massive amount of subscribers are extremely slow to - // clean up in Chromium - // to workaround this, we unset the sub for now, and clear them on - // next scheduler flush. - this.subs[this.subs.indexOf(sub)] = null; - if (!this._pending) { - this._pending = true; - pendingCleanupDeps.push(this); - } - }; - Dep.prototype.depend = function (info) { - if (Dep.target) { - Dep.target.addDep(this); - if (info && Dep.target.onTrack) { - Dep.target.onTrack(__assign({ effect: Dep.target }, info)); - } - } - }; - Dep.prototype.notify = function (info) { - // stabilize the subscriber list first - var subs = this.subs.filter(function (s) { return s; }); - if (!config.async) { - // subs aren't sorted in scheduler if not running async - // we need to sort them now to make sure they fire in correct - // order - subs.sort(function (a, b) { return a.id - b.id; }); - } - for (var i = 0, l = subs.length; i < l; i++) { - var sub = subs[i]; - if (info) { - sub.onTrigger && - sub.onTrigger(__assign({ effect: subs[i] }, info)); - } - sub.update(); - } - }; - return Dep; - }()); - // The current target watcher being evaluated. - // This is globally unique because only one watcher - // can be evaluated at a time. - Dep.target = null; - var targetStack = []; - function pushTarget(target) { - targetStack.push(target); - Dep.target = target; - } - function popTarget() { - targetStack.pop(); - Dep.target = targetStack[targetStack.length - 1]; - } - - /* - * not type checking this file because flow doesn't play well with - * dynamically accessing methods on Array prototype - */ - var arrayProto = Array.prototype; - var arrayMethods = Object.create(arrayProto); - var methodsToPatch = [ - 'push', - 'pop', - 'shift', - 'unshift', - 'splice', - 'sort', - 'reverse' - ]; - /** - * Intercept mutating methods and emit events - */ - methodsToPatch.forEach(function (method) { - // cache original method - var original = arrayProto[method]; - def(arrayMethods, method, function mutator() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var result = original.apply(this, args); - var ob = this.__ob__; - var inserted; - switch (method) { - case 'push': - case 'unshift': - inserted = args; - break; - case 'splice': - inserted = args.slice(2); - break; - } - if (inserted) - ob.observeArray(inserted); - // notify change - { - ob.dep.notify({ - type: "array mutation" /* TriggerOpTypes.ARRAY_MUTATION */, - target: this, - key: method - }); - } - return result; - }); - }); - - var rawMap = new WeakMap(); - function reactive(target) { - makeReactive(target, false); - return target; - } - /** - * Return a shallowly-reactive copy of the original object, where only the root - * level properties are reactive. It also does not auto-unwrap refs (even at the - * root level). - */ - function shallowReactive(target) { - makeReactive(target, true); - def(target, "__v_isShallow" /* ReactiveFlags.IS_SHALLOW */, true); - return target; - } - function makeReactive(target, shallow) { - // if trying to observe a readonly proxy, return the readonly version. - if (!isReadonly(target)) { - { - if (isArray(target)) { - warn$2("Avoid using Array as root value for ".concat(shallow ? "shallowReactive()" : "reactive()", " as it cannot be tracked in watch() or watchEffect(). Use ").concat(shallow ? "shallowRef()" : "ref()", " instead. This is a Vue-2-only limitation.")); - } - var existingOb = target && target.__ob__; - if (existingOb && existingOb.shallow !== shallow) { - warn$2("Target is already a ".concat(existingOb.shallow ? "" : "non-", "shallow reactive object, and cannot be converted to ").concat(shallow ? "" : "non-", "shallow.")); - } - } - var ob = observe(target, shallow, isServerRendering() /* ssr mock reactivity */); - if (!ob) { - if (target == null || isPrimitive(target)) { - warn$2("value cannot be made reactive: ".concat(String(target))); - } - if (isCollectionType(target)) { - warn$2("Vue 2 does not support reactive collection types such as Map or Set."); - } - } - } - } - function isReactive(value) { - if (isReadonly(value)) { - return isReactive(value["__v_raw" /* ReactiveFlags.RAW */]); - } - return !!(value && value.__ob__); - } - function isShallow(value) { - return !!(value && value.__v_isShallow); - } - function isReadonly(value) { - return !!(value && value.__v_isReadonly); - } - function isProxy(value) { - return isReactive(value) || isReadonly(value); - } - function toRaw(observed) { - var raw = observed && observed["__v_raw" /* ReactiveFlags.RAW */]; - return raw ? toRaw(raw) : observed; - } - function markRaw(value) { - if (isObject(value)) { - rawMap.set(value, true); - } - return value; - } - /** - * @internal - */ - function isCollectionType(value) { - var type = toRawType(value); - return (type === 'Map' || type === 'WeakMap' || type === 'Set' || type === 'WeakSet'); - } - - var arrayKeys = Object.getOwnPropertyNames(arrayMethods); - var NO_INIITIAL_VALUE = {}; - /** - * In some cases we may want to disable observation inside a component's - * update computation. - */ - var shouldObserve = true; - function toggleObserving(value) { - shouldObserve = value; - } - // ssr mock dep - var mockDep = { - notify: noop, - depend: noop, - addSub: noop, - removeSub: noop - }; - /** - * Observer class that is attached to each observed - * object. Once attached, the observer converts the target - * object's property keys into getter/setters that - * collect dependencies and dispatch updates. - */ - var Observer = /** @class */ (function () { - function Observer(value, shallow, mock) { - if (shallow === void 0) { shallow = false; } - if (mock === void 0) { mock = false; } - this.value = value; - this.shallow = shallow; - this.mock = mock; - // this.value = value - this.dep = mock ? mockDep : new Dep(); - this.vmCount = 0; - def(value, '__ob__', this); - if (isArray(value)) { - if (!mock) { - if (hasProto) { - value.__proto__ = arrayMethods; - /* eslint-enable no-proto */ - } - else { - for (var i = 0, l = arrayKeys.length; i < l; i++) { - var key = arrayKeys[i]; - def(value, key, arrayMethods[key]); - } - } - } - if (!shallow) { - this.observeArray(value); - } - } - else { - /** - * Walk through all properties and convert them into - * getter/setters. This method should only be called when - * value type is Object. - */ - var keys = Object.keys(value); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - defineReactive(value, key, NO_INIITIAL_VALUE, undefined, shallow, mock); - } - } - } - /** - * Observe a list of Array items. - */ - Observer.prototype.observeArray = function (value) { - for (var i = 0, l = value.length; i < l; i++) { - observe(value[i], false, this.mock); - } - }; - return Observer; - }()); - // helpers - /** - * Attempt to create an observer instance for a value, - * returns the new observer if successfully observed, - * or the existing observer if the value already has one. - */ - function observe(value, shallow, ssrMockReactivity) { - if (value && hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { - return value.__ob__; - } - if (shouldObserve && - (ssrMockReactivity || !isServerRendering()) && - (isArray(value) || isPlainObject(value)) && - Object.isExtensible(value) && - !value.__v_skip /* ReactiveFlags.SKIP */ && - !rawMap.has(value) && - !isRef(value) && - !(value instanceof VNode)) { - return new Observer(value, shallow, ssrMockReactivity); - } - } - /** - * Define a reactive property on an Object. - */ - function defineReactive(obj, key, val, customSetter, shallow, mock) { - var dep = new Dep(); - var property = Object.getOwnPropertyDescriptor(obj, key); - if (property && property.configurable === false) { - return; - } - // cater for pre-defined getter/setters - var getter = property && property.get; - var setter = property && property.set; - if ((!getter || setter) && - (val === NO_INIITIAL_VALUE || arguments.length === 2)) { - val = obj[key]; - } - var childOb = !shallow && observe(val, false, mock); - Object.defineProperty(obj, key, { - enumerable: true, - configurable: true, - get: function reactiveGetter() { - var value = getter ? getter.call(obj) : val; - if (Dep.target) { - { - dep.depend({ - target: obj, - type: "get" /* TrackOpTypes.GET */, - key: key - }); - } - if (childOb) { - childOb.dep.depend(); - if (isArray(value)) { - dependArray(value); - } - } - } - return isRef(value) && !shallow ? value.value : value; - }, - set: function reactiveSetter(newVal) { - var value = getter ? getter.call(obj) : val; - if (!hasChanged(value, newVal)) { - return; - } - if (customSetter) { - customSetter(); - } - if (setter) { - setter.call(obj, newVal); - } - else if (getter) { - // #7981: for accessor properties without setter - return; - } - else if (!shallow && isRef(value) && !isRef(newVal)) { - value.value = newVal; - return; - } - else { - val = newVal; - } - childOb = !shallow && observe(newVal, false, mock); - { - dep.notify({ - type: "set" /* TriggerOpTypes.SET */, - target: obj, - key: key, - newValue: newVal, - oldValue: value - }); - } - } - }); - return dep; - } - function set(target, key, val) { - if ((isUndef(target) || isPrimitive(target))) { - warn$2("Cannot set reactive property on undefined, null, or primitive value: ".concat(target)); - } - if (isReadonly(target)) { - warn$2("Set operation on key \"".concat(key, "\" failed: target is readonly.")); - return; - } - var ob = target.__ob__; - if (isArray(target) && isValidArrayIndex(key)) { - target.length = Math.max(target.length, key); - target.splice(key, 1, val); - // when mocking for SSR, array methods are not hijacked - if (ob && !ob.shallow && ob.mock) { - observe(val, false, true); - } - return val; - } - if (key in target && !(key in Object.prototype)) { - target[key] = val; - return val; - } - if (target._isVue || (ob && ob.vmCount)) { - warn$2('Avoid adding reactive properties to a Vue instance or its root $data ' + - 'at runtime - declare it upfront in the data option.'); - return val; - } - if (!ob) { - target[key] = val; - return val; - } - defineReactive(ob.value, key, val, undefined, ob.shallow, ob.mock); - { - ob.dep.notify({ - type: "add" /* TriggerOpTypes.ADD */, - target: target, - key: key, - newValue: val, - oldValue: undefined - }); - } - return val; - } - function del(target, key) { - if ((isUndef(target) || isPrimitive(target))) { - warn$2("Cannot delete reactive property on undefined, null, or primitive value: ".concat(target)); - } - if (isArray(target) && isValidArrayIndex(key)) { - target.splice(key, 1); - return; - } - var ob = target.__ob__; - if (target._isVue || (ob && ob.vmCount)) { - warn$2('Avoid deleting properties on a Vue instance or its root $data ' + - '- just set it to null.'); - return; - } - if (isReadonly(target)) { - warn$2("Delete operation on key \"".concat(key, "\" failed: target is readonly.")); - return; - } - if (!hasOwn(target, key)) { - return; - } - delete target[key]; - if (!ob) { - return; - } - { - ob.dep.notify({ - type: "delete" /* TriggerOpTypes.DELETE */, - target: target, - key: key - }); - } - } - /** - * Collect dependencies on array elements when the array is touched, since - * we cannot intercept array element access like property getters. - */ - function dependArray(value) { - for (var e = void 0, i = 0, l = value.length; i < l; i++) { - e = value[i]; - if (e && e.__ob__) { - e.__ob__.dep.depend(); - } - if (isArray(e)) { - dependArray(e); - } - } - } - - /** - * @internal - */ - var RefFlag = "__v_isRef"; - function isRef(r) { - return !!(r && r.__v_isRef === true); - } - function ref$1(value) { - return createRef(value, false); - } - function shallowRef(value) { - return createRef(value, true); - } - function createRef(rawValue, shallow) { - if (isRef(rawValue)) { - return rawValue; - } - var ref = {}; - def(ref, RefFlag, true); - def(ref, "__v_isShallow" /* ReactiveFlags.IS_SHALLOW */, shallow); - def(ref, 'dep', defineReactive(ref, 'value', rawValue, null, shallow, isServerRendering())); - return ref; - } - function triggerRef(ref) { - if (!ref.dep) { - warn$2("received object is not a triggerable ref."); - } - { - ref.dep && - ref.dep.notify({ - type: "set" /* TriggerOpTypes.SET */, - target: ref, - key: 'value' - }); - } - } - function unref(ref) { - return isRef(ref) ? ref.value : ref; - } - function proxyRefs(objectWithRefs) { - if (isReactive(objectWithRefs)) { - return objectWithRefs; - } - var proxy = {}; - var keys = Object.keys(objectWithRefs); - for (var i = 0; i < keys.length; i++) { - proxyWithRefUnwrap(proxy, objectWithRefs, keys[i]); - } - return proxy; - } - function proxyWithRefUnwrap(target, source, key) { - Object.defineProperty(target, key, { - enumerable: true, - configurable: true, - get: function () { - var val = source[key]; - if (isRef(val)) { - return val.value; - } - else { - var ob = val && val.__ob__; - if (ob) - ob.dep.depend(); - return val; - } - }, - set: function (value) { - var oldValue = source[key]; - if (isRef(oldValue) && !isRef(value)) { - oldValue.value = value; - } - else { - source[key] = value; - } - } - }); - } - function customRef(factory) { - var dep = new Dep(); - var _a = factory(function () { - { - dep.depend({ - target: ref, - type: "get" /* TrackOpTypes.GET */, - key: 'value' - }); - } - }, function () { - { - dep.notify({ - target: ref, - type: "set" /* TriggerOpTypes.SET */, - key: 'value' - }); - } - }), get = _a.get, set = _a.set; - var ref = { - get value() { - return get(); - }, - set value(newVal) { - set(newVal); - } - }; - def(ref, RefFlag, true); - return ref; - } - function toRefs(object) { - if (!isReactive(object)) { - warn$2("toRefs() expects a reactive object but received a plain one."); - } - var ret = isArray(object) ? new Array(object.length) : {}; - for (var key in object) { - ret[key] = toRef(object, key); - } - return ret; - } - function toRef(object, key, defaultValue) { - var val = object[key]; - if (isRef(val)) { - return val; - } - var ref = { - get value() { - var val = object[key]; - return val === undefined ? defaultValue : val; - }, - set value(newVal) { - object[key] = newVal; - } - }; - def(ref, RefFlag, true); - return ref; - } - - var rawToReadonlyMap = new WeakMap(); - var rawToShallowReadonlyMap = new WeakMap(); - function readonly(target) { - return createReadonly(target, false); - } - function createReadonly(target, shallow) { - if (!isPlainObject(target)) { - { - if (isArray(target)) { - warn$2("Vue 2 does not support readonly arrays."); - } - else if (isCollectionType(target)) { - warn$2("Vue 2 does not support readonly collection types such as Map or Set."); - } - else { - warn$2("value cannot be made readonly: ".concat(typeof target)); - } - } - return target; - } - // already a readonly object - if (isReadonly(target)) { - return target; - } - // already has a readonly proxy - var map = shallow ? rawToShallowReadonlyMap : rawToReadonlyMap; - var existingProxy = map.get(target); - if (existingProxy) { - return existingProxy; - } - var proxy = Object.create(Object.getPrototypeOf(target)); - map.set(target, proxy); - def(proxy, "__v_isReadonly" /* ReactiveFlags.IS_READONLY */, true); - def(proxy, "__v_raw" /* ReactiveFlags.RAW */, target); - if (isRef(target)) { - def(proxy, RefFlag, true); - } - if (shallow || isShallow(target)) { - def(proxy, "__v_isShallow" /* ReactiveFlags.IS_SHALLOW */, true); - } - var keys = Object.keys(target); - for (var i = 0; i < keys.length; i++) { - defineReadonlyProperty(proxy, target, keys[i], shallow); - } - return proxy; - } - function defineReadonlyProperty(proxy, target, key, shallow) { - Object.defineProperty(proxy, key, { - enumerable: true, - configurable: true, - get: function () { - var val = target[key]; - return shallow || !isPlainObject(val) ? val : readonly(val); - }, - set: function () { - warn$2("Set operation on key \"".concat(key, "\" failed: target is readonly.")); - } - }); - } - /** - * Returns a reactive-copy of the original object, where only the root level - * properties are readonly, and does NOT unwrap refs nor recursively convert - * returned properties. - * This is used for creating the props proxy object for stateful components. - */ - function shallowReadonly(target) { - return createReadonly(target, true); - } - - function computed(getterOrOptions, debugOptions) { - var getter; - var setter; - var onlyGetter = isFunction(getterOrOptions); - if (onlyGetter) { - getter = getterOrOptions; - setter = function () { - warn$2('Write operation failed: computed value is readonly'); - } - ; - } - else { - getter = getterOrOptions.get; - setter = getterOrOptions.set; - } - var watcher = isServerRendering() - ? null - : new Watcher(currentInstance, getter, noop, { lazy: true }); - if (watcher && debugOptions) { - watcher.onTrack = debugOptions.onTrack; - watcher.onTrigger = debugOptions.onTrigger; - } - var ref = { - // some libs rely on the presence effect for checking computed refs - // from normal refs, but the implementation doesn't matter - effect: watcher, - get value() { - if (watcher) { - if (watcher.dirty) { - watcher.evaluate(); - } - if (Dep.target) { - if (Dep.target.onTrack) { - Dep.target.onTrack({ - effect: Dep.target, - target: ref, - type: "get" /* TrackOpTypes.GET */, - key: 'value' - }); - } - watcher.depend(); - } - return watcher.value; - } - else { - return getter(); - } - }, - set value(newVal) { - setter(newVal); - } - }; - def(ref, RefFlag, true); - def(ref, "__v_isReadonly" /* ReactiveFlags.IS_READONLY */, onlyGetter); - return ref; - } - - var mark; - var measure; - { - var perf_1 = inBrowser && window.performance; - /* istanbul ignore if */ - if (perf_1 && - // @ts-ignore - perf_1.mark && - // @ts-ignore - perf_1.measure && - // @ts-ignore - perf_1.clearMarks && - // @ts-ignore - perf_1.clearMeasures) { - mark = function (tag) { return perf_1.mark(tag); }; - measure = function (name, startTag, endTag) { - perf_1.measure(name, startTag, endTag); - perf_1.clearMarks(startTag); - perf_1.clearMarks(endTag); - // perf.clearMeasures(name) - }; - } - } - - var normalizeEvent = cached(function (name) { - var passive = name.charAt(0) === '&'; - name = passive ? name.slice(1) : name; - var once = name.charAt(0) === '~'; // Prefixed last, checked first - name = once ? name.slice(1) : name; - var capture = name.charAt(0) === '!'; - name = capture ? name.slice(1) : name; - return { - name: name, - once: once, - capture: capture, - passive: passive - }; - }); - function createFnInvoker(fns, vm) { - function invoker() { - var fns = invoker.fns; - if (isArray(fns)) { - var cloned = fns.slice(); - for (var i = 0; i < cloned.length; i++) { - invokeWithErrorHandling(cloned[i], null, arguments, vm, "v-on handler"); - } - } - else { - // return handler return value for single handlers - return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler"); - } - } - invoker.fns = fns; - return invoker; - } - function updateListeners(on, oldOn, add, remove, createOnceHandler, vm) { - var name, cur, old, event; - for (name in on) { - cur = on[name]; - old = oldOn[name]; - event = normalizeEvent(name); - if (isUndef(cur)) { - warn$2("Invalid handler for event \"".concat(event.name, "\": got ") + String(cur), vm); - } - else if (isUndef(old)) { - if (isUndef(cur.fns)) { - cur = on[name] = createFnInvoker(cur, vm); - } - if (isTrue(event.once)) { - cur = on[name] = createOnceHandler(event.name, cur, event.capture); - } - add(event.name, cur, event.capture, event.passive, event.params); - } - else if (cur !== old) { - old.fns = cur; - on[name] = old; - } - } - for (name in oldOn) { - if (isUndef(on[name])) { - event = normalizeEvent(name); - remove(event.name, oldOn[name], event.capture); - } - } - } - - function mergeVNodeHook(def, hookKey, hook) { - if (def instanceof VNode) { - def = def.data.hook || (def.data.hook = {}); - } - var invoker; - var oldHook = def[hookKey]; - function wrappedHook() { - hook.apply(this, arguments); - // important: remove merged hook to ensure it's called only once - // and prevent memory leak - remove$2(invoker.fns, wrappedHook); - } - if (isUndef(oldHook)) { - // no existing hook - invoker = createFnInvoker([wrappedHook]); - } - else { - /* istanbul ignore if */ - if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { - // already a merged invoker - invoker = oldHook; - invoker.fns.push(wrappedHook); - } - else { - // existing plain hook - invoker = createFnInvoker([oldHook, wrappedHook]); - } - } - invoker.merged = true; - def[hookKey] = invoker; - } - - function extractPropsFromVNodeData(data, Ctor, tag) { - // we are only extracting raw values here. - // validation and default values are handled in the child - // component itself. - var propOptions = Ctor.options.props; - if (isUndef(propOptions)) { - return; - } - var res = {}; - var attrs = data.attrs, props = data.props; - if (isDef(attrs) || isDef(props)) { - for (var key in propOptions) { - var altKey = hyphenate(key); - { - var keyInLowerCase = key.toLowerCase(); - if (key !== keyInLowerCase && attrs && hasOwn(attrs, keyInLowerCase)) { - tip("Prop \"".concat(keyInLowerCase, "\" is passed to component ") + - "".concat(formatComponentName( - // @ts-expect-error tag is string - tag || Ctor), ", but the declared prop name is") + - " \"".concat(key, "\". ") + - "Note that HTML attributes are case-insensitive and camelCased " + - "props need to use their kebab-case equivalents when using in-DOM " + - "templates. You should probably use \"".concat(altKey, "\" instead of \"").concat(key, "\".")); - } - } - checkProp(res, props, key, altKey, true) || - checkProp(res, attrs, key, altKey, false); - } - } - return res; - } - function checkProp(res, hash, key, altKey, preserve) { - if (isDef(hash)) { - if (hasOwn(hash, key)) { - res[key] = hash[key]; - if (!preserve) { - delete hash[key]; - } - return true; - } - else if (hasOwn(hash, altKey)) { - res[key] = hash[altKey]; - if (!preserve) { - delete hash[altKey]; - } - return true; - } - } - return false; - } - - // The template compiler attempts to minimize the need for normalization by - // statically analyzing the template at compile time. - // - // For plain HTML markup, normalization can be completely skipped because the - // generated render function is guaranteed to return Array. There are - // two cases where extra normalization is needed: - // 1. When the children contains components - because a functional component - // may return an Array instead of a single root. In this case, just a simple - // normalization is needed - if any child is an Array, we flatten the whole - // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep - // because functional components already normalize their own children. - function simpleNormalizeChildren(children) { - for (var i = 0; i < children.length; i++) { - if (isArray(children[i])) { - return Array.prototype.concat.apply([], children); - } - } - return children; - } - // 2. When the children contains constructs that always generated nested Arrays, - // e.g.