Keyboard Jiggler with Python and Raspberry Pi

So I did a pretty simple but amusing little project recently, a bit on a whim. Let’s say, I have a few games that it would be useful to just, let idle for experience or whatever. The problem is, that these games also have built-in idle deterrence. Your character falls asleep, or you just time out of the game after five or ten minutes.

I initially start off trying to use AutoHotkey, a program that basically does what I wanted here, you program it to press keys at certain intervals, basically just a simple keep-alive movement every couple of minutes.

It turns out, at least one of these games detects Autohotkey as a cheat, and won’t launch when it’s running.

I got to thinking, I could probably program one of my Arduino boards to emulate a keyboard. And sure enough, there are libraries for this very task. Then I discovered that, the keyboard library does not work on my old Uno boards. But I found an alternative route with my Raspberry Pi Pico that I picked up a few years ago. The Pico could probably do what I needed as well.

After some digging online, I found plenty of guides on how to build a full-sized Keyboard using GPIO pins on the Pico, but nothing quite exactly what I needed, but there was enough Python Code available, I could figure it out pretty easily by stripping apart some full keyboard code. Instead, I just started with a simpler macro button keyboard script. Most of the scripts I came across have code to detect and save a button press, then send the command using the Python Keyboard library. I just stripped all that out and put it on a timer loop with some simple, regular input. A set of repeated w presses, follow d by repeat d presses of a, s, and d.

Essentially, “walk in a little square loop.”

Step one was to set up Circuit Pi on the Pi Pico, which is detailed here, though only the initial setup is needed.

The test using Notepad worked perfectly, aside from one annoying issue, I could not easily edit the code while the device was plugged in, because the test loop would spit out wwwaaasssddd every 5 seconds.

After some careful quick timing, I adjusted that out to every 300 seconds (5 minutes).

It was time to test things out. Before work, I set the game running and the keyboard Jiggler working. When I came back later it was working just fine.

But there were some issues, one of which I could mostly address.

Firstly, the thing just runs, forever. It doesn’t really need to, I only need it going for around 3-4 hours. I added a counter variable to the script that would count how many runs through the loop had occured, and if it was more than a set amount, it would break the loop, which would stop the scripted movement and idle out of the game.

The other two issues are less easy to solve.

One, I had a thought that I could remote to my PC and swap games halfway through the day (at lunch). Except when you leave Remote Desktop, it locks the remote PC. Meaning the game loses focus and the keyboard Jiggler stops working. It’s literally a hardware device that pretends to be a keyboard.

The second issue, that could be easy to solve with some habit changes. I, very often, will use Firefox’s Tab Share to send tabs to either my desktop or my laptop. These are articles I want to clip and save, something I may want to buy later, notes for some projects I had done. Basically, it’s a way to send myself a reminder of something I don’t want to deal with on my phone. When I send a tab, on the remote machine, Firefox pops up and takes focus, meaning, once again, the game idle breaker stops working and it idles out.

The solution here is to just, get into the habit of only sending tabs after noon or so.

Another little improvement I added was a bit of randomization. I am not really worried about “detection,” but it’s easy to avoid by simply, adjusting the 5-minute timer to be random movement between 4 and 5 minutes, as well as randomizing what the movement is a bit.  I also added a bit of correction if the player moves too far away from the starting position.

Anyway, the script below is the completed script.

import time
import random

import board
import digitalio
import usb_hid
## Aquired from https://github.com/adafruit/Adafruit\_CircuitPython\_HID
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
from adafruit_hid.keycode import Keycode

time.sleep(1)
keyboard = Keyboard(usb_hid.devices)
keyboard_layout = KeyboardLayoutUS(keyboard)  # We're in the US :)
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
total_runs = 0
running = True
# This is the choices for keys to randomly choose from, this is standard WASD
# This could be changed to be whatever to choose from.
keyOptions = ["w","a","s","d"," "]
# "Starting position" is set to 0,0
position = [0,0]

while running:
    # Turn the LED on while doing things
    led.value = True
    
    # Randomly choose 20-50 as an amount of key presses to do
    howMany = random.randint(20, 50)

    for i in range(howMany):
        # For however many key presses, pick a random one and press it
        nextKey = random.choice(keyOptions)
        keyboard_layout.write(nextKey)
        time.sleep(1)
        # This incriments the position above from 0,0 to track how far from start.
        # This whole section could be omitted if movement can be unconstrained
        if nextKey == "w":
            position[1] +=1
        if nextKey == "s":
            position[1] -=1
        if nextKey == "a":
            position[0] +=1
        if nextKey == "d":
            position[0] -=1
        
        # If we get too far in one direction, correct it by moving back to 0.
        if position[0] >= 10:
            keyboard_layout.write(ssssssssss)
        if position[0] <= -10:
            keyboard_layout.write(aaaaaaaaaa)
        if position[1] >= 10:
            keyboard_layout.write(dddddddddd)
        if position[1] <= -10:
            keyboard_layout.write(aaaaaaaaaa)

    led.value = False
    time.sleep(0.1)
    keyboard.release_all()
    # Sleep a random number of seconds between 200 and 300 seconds
    nextSleep = random.randint(200, 300)
    time.sleep(nextSleep)

    # Incriment how many runs have been done
    total_runs = total_runs+1

    # If the total runs is too many, break the loop and essentially "stop".
    if total_runs > 48:
        running = False

Tuesday 2024-09-17 – Link List

Blogging Intensifies Link List for Tuesday 2024-09-17

Monday 2024-09-16 – Link List

Blogging Intensifies Link List for Monday 2024-09-16

AI Music and the Dead Internet Theory

A man was arrested for creating AI music and using bots to stream it, netting 10 million dollars from Spotify.

https://www.forbes.com/sites/lesliekatz/2024/09/08/man-charged-with-10-million-streaming-scam-using-ai-generated-songs

A few things to note here, and some thoughts on it in general. He was doing this for a while, since 2017 according to the article, so it wasn’t like he made it in a month. Apparently, he was a music maker, he just wasn’t getting anywhere with his produced music. As he has been doing it since 2017, this predates even ChatGPT by about 5 years. He was not using the current crop of “AI” tools. My guess, he was just using a script of some kind to compile together loop tracks to mass-produce generic EDM music. Because AI is the current buzzword, this automation is being called AI by news outlets.

In the end though, the automation part is not the illegal part, it’s the scamming using bots that is the illegal part, as morally justified as it may be. Spotify is extremely popular, but Spotify doesn’t make artists any money. For example, Snoop Dogg, one of the most popular rap musicians ever, made about $45,000 for a billion plays. And a billion plays is a LOT. My favorite artist Aurora, has just under a billion plays on her most popular track, Runaway. The next most popular of her tracks is almost half that and third place is about 150 million plays.

Snoop Dogg has a LOT of plays.

The point is, that Spotify isn’t exactly the patron saint of supporting artists, and so the fraudster in the story above may be a bit morally justified in his efforts. That’s part of why I prefer to buy music, digitally, on CDs, on Vinyl. A larger chunk goes to the artist that way, especially on Bandcamp Fridays or buying direct from the band’s website, or even direct from the band at a show.

Anyway, I am not here to try to defend the guy in the original article above, just to talk a bit about AI and the Internet. I seriously doubt he is the only one doing this. He is just the first to get caught. Or at least the first high-profile one. Especially with current tools of AI, making it easier than ever to mass-produce garbage. Heck, I am pretty sure record labels themselves use software to pump up numbers on certain artists, less for the Spotify money, but for marketing.

But this also likely pushes into other areas too. It would be easy to do similar tricks on YouTube with bots, or Kindle Unlimited, just bots turning pages in free, AI-created eBooks.

A long while ago, probably a decade now, I came across a post on 4chan’s /g/ board (/g/ = Technology) with a guide on how to set up a Blogspot blog using scraping tools, add it to a ring of other Blogspot blogs, then automated a script that would click through the blogs gathering AdSense money from Google, to the benefit of anyone involved. I am pretty sure this was a regular post too, to keep new people coming in.

It’s the same principle as the automated Spotify system above. Hell, it may even be the brainchild of the same folks.

Which is all in the end just a version of the Dead Internet Theory.


The dead Internet theory is an online conspiracy theory that asserts that the Internet now consists mainly of bot activity and automatically generated content manipulated by algorithmic curation to intentionally manipulate the population and minimize organic human activity.

Which is probably less about “manipulating the population” and more just about extracting wealth through automated systems. Like the top level morally gray hero, it’s all a sort of, not necessarily evil activity. It’s very “Digital Robin Hood” in a way. Except instead of directly taking from the rich to give to the poor, this Robin Hood is out making posts on 4chan on how to create automated blog systems. I mean, Google has replaced all of its systems for support and everything with bots, why shouldn’t the users replace themselves with bots as well? It’s bots all the way down!

Bots are trivially easy to build as well. One of the lessons in my 100 Days of Python class was making a bit that would play a cookie clicker game in a maximum my efficient way.

Even without using software it gets done in manual ways in the real world sometimes, for marketing purposes.  It’s all just manipulating the algorithm for money.  I guess in the end the trick is to do it in a way that it doesn’t harm the “wrong people”.  Sometimes I feel like I could be rich if I weren’t so honest because a lot of this isn’t that hard to do.

Wednesday 2024-09-11 – Link List

Blogging Intensifies Link List for Wednesday 2024-09-11