您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Auto catch pokemmons
- // ==UserScript==
- // @name Twitch Pokecatch Bot
- // @description Auto catch pokemmons
- // @namespace https://github.com/victornpb
- // @version 1.0
- // @match *://*.twitch.tv/*
- // @run-at document-idle
- // @author victornpb
- // @homepageURL https://github.com/victornpb/
- // @supportURL https://github.com/victornpb/
- // @contributionURL https://www.buymeacoffee.com/vitim
- // @grant none
- // @license MIT
- // ==/UserScript==
- /* jshint esversion: 8 */
- (function () {
- const LOGPREFIX = '[POKECATCH]';
- function createElm(html) {
- const div = document.createElement('div');
- div.innerHTML = html;
- return div.removeChild(div.children[0]);
- }
- document.head.appendChild(createElm`
- <style>
- .pokeBtn {
- display: inline-flex;
- -webkit-box-align: center;
- align-items: center;
- -webkit-box-pack: center;
- justify-content: center;
- user-select: none;
- height: var(--button-size-default);
- width: var(--button-size-default);
- border-radius: var(--border-radius-medium);
- background-color: var(--color-background-button-text-default);
- color: var(--color-fill-button-icon);
- }
- </style>`);
- // activation button
- const activateBtn = createElm(`
- <span class="pokeBtn" title="Pokecatching...">
- <svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 980 978.9" style="fill: currentcolor;">
- <path d="M509 979h-38l-5-1A485 485 0 0 1 2 531c-1-7 0-14-2-21v-43a59 59 0 0 0 1-5 461 461 0 0 1 18-107Q66 194 201 95c67-50 143-80 226-91a480 480 0 0 1 103-2c38 3 75 10 111 22q208 70 299 271c22 48 34 100 38 153 1 7 0 14 2 20v42l-1 7a464 464 0 0 1-18 106q-43 150-164 248-117 94-267 106c-7 1-14 0-21 2ZM178 521H82c-8 0-8 0-7 7a456 456 0 0 0 8 49q33 148 153 242a406 406 0 0 0 365 72 413 413 0 0 0 304-364c0-4 1-6-5-6H704c-3 0-4 1-5 4l-2 14a212 212 0 0 1-416-14c-1-3-2-4-6-4h-97Zm165-32a147 147 0 0 0 294 0 147 147 0 0 0-294 0Z"/>
- </svg>
- </span>
- `);
- // activateBtn.onclick = toggle;
- let enabled;
- let watchdogTimer;
- setInterval(activatorWatchdog, 5000);
- function activatorWatchdog() {
- const modBtn = document.querySelector('[data-a-target="chat-settings"]');
- if (modBtn) {
- const twitchBar = modBtn.parentElement.parentElement.parentElement.parentElement.parentElement;
- if (twitchBar && !twitchBar.contains(activateBtn)) {
- console.log(LOGPREFIX, 'Adding button...');
- twitchBar.insertBefore(activateBtn, twitchBar.firstChild);
- if (!enabled) {
- console.log(LOGPREFIX, 'Started chatWatchdog...');
- watchdogTimer = setInterval(chatWatchdog, 500);
- enabled = true;
- }
- }
- }
- else {
- if (enabled) {
- console.log(LOGPREFIX, 'Stopped chatWatchdog!');
- clearInterval(watchdogTimer);
- watchdogTimer = enabled = false;
- }
- }
- }
- function parseChat() {
- return Array.from(document.querySelectorAll('[data-test-selector="chat-line-message"]')).map(chat => {
- return {
- username: chat.querySelector('[data-test-selector="message-username"]')?.innerText || '',
- message: chat.querySelector('[data-test-selector="chat-line-message-body"]')?.innerText || '',
- // timestamp: chat.querySelector('[data-test-selector="chat-timestamp"]').innerText,
- };
- });
- }
- const delay = t => new Promise(r => setTimeout(r, t));
- let ignoredMessage = new Set();
- async function chatWatchdog() {
- const messages = parseChat().filter(m => !ignoredMessage.has(m.message));
- for (const m of messages) {
- if (m.username === 'PokemonCommunityGame' && m.message.match(/A wild (\w+) appears/)) {
- ignoredMessage.add(m.message);
- console.log(LOGPREFIX, 'Catching pokemon...', m);
- sendMessage('!pokecatch greatball');
- }
- }
- }
- function sendMessage(msg) {
- console.log(LOGPREFIX, 'Sending...', msg);
- const textarea = document.querySelector("[data-a-target='chat-input']");
- const nativeTextAreaValueSetter = Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype, "value").set;
- nativeTextAreaValueSetter.call(textarea, msg);
- const event = new Event('input', { bubbles: true });
- textarea.dispatchEvent(event);
- document.querySelector("[data-a-target='chat-send-button']").click();
- }
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址