--- name: shit-skills-actor description: Batch-create accounts and simulate human-like user behavior. Includes a browser-control interaction mode (default) and an API mode, both configurable by users. --- # Shit Skills Actor Batch-creates accounts and simulates human-like user behavior. Supports two operation modes: **Browser Mode** (default) and **API Mode**. ## Configuration | Parameter | Default | Description | | ----------------- | --------- | ------------------------------------------------------------ | | `count` | 1 | Number of accounts to create in batch | | `votesPerAccount` | 2 | Number of skills each account will vote/comment on | | `mode` | "browser" | Interaction mode: `"browser"` (default) or `"api"` | | `headless` | false | Browser mode only: show UI (`false`) or run headless (`true`)| ## Operation Modes ### Browser Mode (Default) Controls a real browser via Playwright/Puppeteer so each step is visible. **Advantages:** - Visual flow, easier debugging - Less likely to be detected as a bot - You can directly observe registration, login, voting, and commenting **Example:** ```javascript const { chromium } = require("playwright"); async function runBrowserMode(config) { const browser = await chromium.launch({ headless: false }); // 默认显示浏览器 const page = await browser.newPage(); // 1. Visit registration page await page.goto("https://www.shitskills.net/register"); // 2. Fill email (using a mail.tm temporary mailbox) const email = await createMailTmAccount(); await page.fill('input[name="email"]', email); // 3. Send OTP await page.click('button:has-text("Send Code")'); // 4. Wait for OTP and fill it in const otp = await waitForMailTmOtp(email); await page.fill('input[name="otp"]', otp); // 5. Complete registration await page.click('button:has-text("Register")'); // 6. Update display name await page.goto("https://www.shitskills.net/settings"); await page.fill('input[name="name"]', generateRandomName()); await page.click('button:has-text("Save")'); // 7. Vote and comment const skills = await getRandomSkills(config.votesPerAccount); for (const skill of skills) { await page.goto(`https://www.shitskills.net/skills/${skill.id}`); await page.click('button[vote-type="shit"]'); await page.fill('textarea[name="comment"]', generateRandomComment()); await page.click('button:has-text("Post")'); } await browser.close(); } ``` ### API Mode Performs actions directly via HTTP requests. Faster, but easier to detect. **How to enable:** Set `mode: "api"` to switch to API mode. ## Mode Selection Use `mode` to control how the agent interacts with SHIT Skills: - `mode: "browser"` (default): interact by controlling a real user browser - `mode: "api"`: interact through HTTP API calls ```javascript function run(config) { const mode = config?.mode ?? "browser"; // default mode if (mode === "api") return runApiMode(config); return runBrowserMode(config); } ``` ## Workflow ### Browser Workflow (Default) 1. Open browser and go to `/register` 2. Register mailbox via mail.tm and fill email in UI 3. Submit OTP flow in UI and complete registration 4. Go to profile/settings page and update display name 5. Open random skill detail pages and perform vote/comment actions via UI ### API Workflow (`mode: "api"`) #### Step 1: Register an Email Create a temporary mailbox via the mail.tm API: ```bash # Fetch domain list curl -s https://api.mail.tm/topDomains # Register account curl -s -X POST "https://api.mail.tm/accounts" \ -H "Content-Type: application/json" \ -d '{"address": "random-username@mail.tm", "password": "Password123!"}' ``` #### Step 2: Register a SHIT Skills Account Use the registration flow from the installed `shit-skills-platform` skill: 1. Request OTP: `POST https://www.shitskills.net/api/register/send-otp` 2. Read the 6-digit code from email 3. Complete registration: `POST https://www.shitskills.net/api/register/complete` 4. Sign in and get a session cookie #### Step 3: Update Display Name Generate a human-style name and update profile: ```bash # Update profile curl -s -X PATCH "https://www.shitskills.net/api/me" \ -H "Content-Type: application/json" \ -b "cookies" \ -d '{"name": "AlexJohnson"}' ``` #### Step 4: Vote and Comment Fetch skill list, then vote/comment on random skills: ```bash # Fetch skill list curl -s "https://www.shitskills.net/api/skills?pageSize=20" # Vote curl -s -X PUT "https://www.shitskills.net/api/skills/{id}/vote" \ -H "Content-Type: application/json" \ -b "cookies" \ -d '{"voteType": "shit"}' # Comment curl -s -X POST "https://www.shitskills.net/api/skills/{id}/comments" \ -H "Content-Type: application/json" \ -b "cookies" \ -d '{"content": "This is absolutely legendary 😂"}' ``` ## Voting Rules - **shit** (+2): The most "shit" skill, this is the preferred vote - **laugh** (+1): Funny and somewhat useful - **up** (-1): Too useful, not "shit" enough (this reduces score) - **boring** (-1): Boring, low value **Core principle**: Prefer `shit` votes. The more useless (yet entertaining), the better. ## Human-Style Name Pool Mix randomly across styles (modern social-media vibe): ``` # Cyberpunk style CyberNinja, NeonGhost, PixelVibe, VoidWalker, NeoSpark, TechWizard GlitchVibe, BinaryGhost, SynthWave, CryptoKnight, EchoPulse, FluxDrive # Abbreviations + numbers x4real, v2o, k3y, n8ive, z3ro, m3ga, s4ge, b1t l33t, h4x0r, n3rd, d3v0, c0d3r, pwn3d # Compound words DataWizard, CodeNinja, ByteRunner, ShadowCoder, QuantumDev, AlphaCoder NeonRider, CyberPunk, ShadowByte, NovaStrike, PhantomCode, VortexDev CloudSurfer, DarkRunner, VoidSmasher, TechNomad, CyberSamurai # Casual style slyfox, wildcard, zer0, koma, xeno, zara kira, ryne, vex, zane, aris, kai # With symbols k3y_m4ster, n3rd_life, v0id_walker, c0de_g0d, bit_lord w1z4rd, h4ck3r, d3v1l, n3tw0rk ``` ## Human-Style Comment Pool Twitter-like comment tone: ``` - "this is absolutely unhinged and I love it 😂" - "bro made something completely useless and I respect it" - "why does this exist and why do I love it" - "the audacity to publish this is insane" - "we need more of this energy ngl" - "lowkey based ngl 💀" - "this is the most unhinged thing ive seen today" - "im crying this is so bad its good" - "sir this is a skill repo not a joke account" - "no thoughts just vibes only" - "midkey goated for this one ngl" - "the algorithm really said here is some garbage 💀" ``` ## Account Save Format Save to `shit-skills-accounts.json`: ```json [ { "email": "xxx@mail.tm", "password": "xxx", "name": "AlexJohnson", "createdAt": "2026-03-26T00:00:00Z", "votes": [{ "skillId": "xxx", "voteType": "shit", "comment": "xxx" }] } ] ``` ## Switching Modes Set `mode` in config: ```javascript // Browser mode (default) const config = { count: 5, votesPerAccount: 3, mode: "browser" }; // API mode const config = { count: 5, votesPerAccount: 3, mode: "api" }; ``` ## Notes 1. Respect rate limits; avoid aggressive request bursts. 2. Re-login when the session expires. 3. Prioritize voting on highly "shit" skills (useless but entertaining). 4. Keep comments natural and human-like; avoid overly formal tone. 5. Browser mode shows a visible window so actions are observable. 6. Use `headless: true` if you need headless execution.