The button: social experiment driving Reddit crazy
vox.com
vox.com
The craziest thing I've seen so far is that another group known as the Assassins created a fork of that extension that would claim they would press the button, but in fact wouldn't so that the timer would run out.
There are groups sabotaging other groups' code based on their goals for the button.
https://www.reddit.com/r/Knightsofthebutton/comments/31x3c0/...
All hail the great and glorious Button! Long may we serve, long may it live.
username = r.config.logged; // stealing reddit username and sending them to your own server
socket.on('alert_autoclick', thebutton.click() ); // click the button automatically when your server tells it to
socket.on('reload', location.reload() ); // reload page when your server asks to inject new code from it
and the server code isn't even publicly available...
is this a joke? do you know what malware is?
Also, you use the squire on your own volition.
That seems like a pretty good unique identifier, but I think it could be hashed for privacy.
> socket.on('alert_autoclick', thebutton.click() ); // click the button automatically when your server tells it to
Isn't that the whole point of this extension, to click the button when the server tells your browser to? It seems like you're implying that's a bad thing.
> socket.on('reload', location.reload() ); // reload page when your server asks to inject new code from it
This seems to be the most common JavaScript live updating technique (reload when websocket says so is what grunt watch uses). Again, it seems like you're implying that's not normal.
Whoever made it must be a pretty cool dude.
Here is a website for /r/thebutton stats
Here's a google doc of current record holders:
https://docs.google.com/spreadsheets/d/1v7RV0R9Q133W2QAJSAEq...
Raw data:
The one I go back to over and over is Cookie Clicker (orteil.dashnet.org/cookieclicker/) any time I feel like getting a watch that counts my steps or a Tesco Club Card or any other gamification device -- I play the master of gamification. Or I watch the button, 13 days in and 55, 54, 53, click! Idiot, 59, 58, 57, 56, 55, click! Idiot, 59, 58, 57....
"You only get one click" or something right next to the button would have been awesome.
It proves my personal theory of trust. If you create something so large and peaceful(ish) that people instinctively trust it, you can get away with anything. What if the button ran something malicious on your machine? What if it permanently deleted your account and banned that username from ever being used again? What if that button permanently banned you from reddit?
These are things no one considered, because reddit is just a big, friendly Lenny.
Put that button on 4chan. See what happens there.
And their own knowledge
> What if the button ran something malicious on your machine?
presses button 'This site attempted to download something to your computer. Download?' no
> What if it permanently deleted your account and banned that username from ever being used again?
'reddit pissing off thousands of users over an april fool's joke' -> I'm guessing not
> These are things no one considered, because
It's not in flash, we know what HTML's limits are, etc etc
It's amazing how many people don't have that. Their first instinct is click oh, what have I done?
Hints to me that the Great Filter could well be addictive and selfish behaviour transfixing the instinctive and basic aspects of our minds.
But also, it can be even more addictive if the game would go back to zero after a period of inactivity (like a tamagachi pet "dying" without attention, or a Flappy Bird). Maybe not going back to zero but to some lower "saved" level like Mario.
This is the kind of stuff that makes people see how high a score they can get, for no reason other than the score!
https://www.dropbox.com/s/z26yrpi2nokp78f/Screenshot%202015-...
Just to see what it would look like
I also looked at the source and sped up the game by running the game loop much faster with an extra setTimeout :)
I posed this question once when I was copying and pasting a pixel to fill a line. Given a time cost of selecting & copying vs pasting, what is the optimal number of pastes before I should select and copy? What if the cost of selecting & copying is a function of the current size of the line? That is what Cookie Clicker raises, but with more kinds of "boosts" and whose costs also increase based on how many you've purchased.
Or perhaps you can also pose it in higher dimensions later (copying and pasting to make 2d squares, or even more complicated shapes).
I wonder if algorithms can be written to compete in Cookie Clicker-type games.
http://puzzlersworld.com/interview-questions/google-code-jam...
http://particle-clicker.web.cern.ch/particle-clicker/
as you click away you accrue data and grant money
the data publishes real scientific discoveries as if you were the researcher and the grant money buys you grad students to click for you
edit: Apparently another thread is discussing this too. They posted [0] which is what I was talking about.
sec10s = document.getElementById("thebutton-s-10s");
sec1s = document.getElementById("thebutton-s-1s");
sec10ms = document.getElementById("thebutton-s-10ms");
sec100ms = document.getElementById("thebutton-s-100ms");
button = document.getElementById("thebutton");
time = function() {
return sec10s.innerHTML +
sec1s.innerHTML; // +
//sec10ms.innerHTML +
//sec100ms.innerHTML;
};
pressAt = function(timeStr) {
return function() {
if (time() == timeStr) {
button.click();
}
};
};
setInterval(pressAt("00"), 100);
But even with setInterval set to 1, this won't get called every millisecond, so you can't get accuracy to the second decimal point, not that there's really any need to. (It turns out setInterval has a minimum delay. setTimeout's minimum delay is 4ms and likely setInterval's minimum delay is the same.) Just set this up and leave your computer running for the next few months and you ought to get it eventually.The fact that it'll press it again if it hits that time again and do nothing is beside the point; there's no need to add complexity of exiting.
no way to program it to guarantee you are the last person to ever press it.
A better strategy is to pick a random time number that you wait until, biased towards the lower part of the range.
"The more dedicated cheaters will hit the button API outside of the browser, which is pretty hard to stop"
How this would be accomplished, I guess from the command line ?
EDIT: found what Monkeypatch means.
It doesn't do anything to intercept people pushing the button.
window.setTimeout = function setTimeout(fn, ms) {
alert("No you don't, cheater!");
assign_button_color_of_shame();
original_setTimeout(fn, ms);
}This would be a really easy "security" measure to circumvent, though - I could literally just delete your monkey patch, for a start!
Though, you do raise a valid point, so let's see how it plays out.
setTimeout = function(){...}
delete setTimeout // true - you've removed the patch
window.setTimeout = function(){...}
delete window.setTimeout // true - you've removed the patch
window.constructor.prototype.setTimeout = function(){...}
delete window.constructor.prototype.setTimeout // false - the patch is still there!
I don't know about the hierarchy of the prototype chain up at this level but it seems to work.Maybe there's some other way of getting to the built-in setTimeout so you can create your own version to mask the one I added?
EDIT you can embed an iframe and rip the native setTimeout from there.
The only real way to detect this is through usage pattern analysis and detection on the web socket side, because if you can write something in JS that catches people, someone can make minor modifications to their code to make it work again.
I've found a way to get access to the original setTimeout again by embedding an iframe into the page and extracting it from there.
Would be interested in hearing other methods of getting a handle to the original setTimeout again.
I guess you could simulate it by using some other mechanism, say firing off an async request to a server that returns after a certain time and running a callback.
var cheaterFunc = function () {
console.error('cheater!');
// report cheater to server somehow...
};
$('*').each(function (i, el) {
if (el instanceof Object) {
Object.defineProperties(el, {
innerHTML: {get: cheaterFunc},
innerText: {get: cheaterFunc}
});
}
});
...and of course to defeat this, you could simply use a tampering proxy to prevent this javascript from making it to the browser.(There are probably other ways to get the value of each digit with javascript, but you should be able to just add cheaterFunc to each of those. .childNode, change the style to use a custom font where each number has a different, predictable width and test .offsetWidth, etc.)
This is because two things: 1) the userbase size, and 2) the userbase behaviour.
Because the userbase is so large, there's always going to be some people on there, meaning even with a robot you always have some competition.
So the only thing a robot will allow you to do is potentially have better reaction times than a human, however, this is also invalid when you consider that it's likely people are not trying "hit" a particular countdown number they're "aiming for" but rather simply pressing the button when their "threshold" for waiting any longer is exceeded.
Wit enough people this is probably well modelled by a random process, with clicks coming essentially randomly over time with some weighting to increase the closer you get to zero. So even a "reflex reaction" is not going to outbeat a horde of random clickers. The robot is really only competing with itself, how fast can it check and how fast can it click after determining the person it's working for's risk/reward utility threshold has been crossed?
So having a robot to play for you is not going to allow you to cheat, only to spend your time dong something more constructive for humanity than clicking a button :)
Maybe I'm missing something here, and I still don't see a way to cheat that actually has significant chance of beating others ! :)
In other words cheating since "normal" players need to spend their time doing that while you can have it on 24/7. I don't understand how you can say it doesn't make you more likely to beat human players. You increase your chances of getting the orange flair by magnitudes.
As far as you are concerned the rest of reddit may be either 10million human players, or 1 million robots, can you tell me who you are playing against? I'd say to you, it's the same.
Now, in a two player tournament, yes, using a robot gives you an advantage because the opponent probably has less stamina than your robot.
But in a competition involving thousands of people, there's really no advantage over any one person because the greatest force on any individual player is the sum of all other players against them, not one player with a robot. Do you think that sounds reasonable?
So the way I see it using a robot is really only a way to make things more comfortable for yourself, just like driving coast to coast is probably more comfortable and likely less time consuming than walking. It's not unfair to walkers, you're not stopping them from walking coast to coast. The only thing that might stop walkers is their stamina.
So while it's true that the reddit case does exhibit scarcity and competition for that (there's only so many click spots per reset), whether people are playing with robots or flesh doesn't make any difference to you, because wherever you are, at whatever time, there's always someone else there with you. It's somewhat ludicrous to think that you will have an advantage if it's all people because say at 2:14 am August 29th, 2015, all 2927 other people are all dozing off just at the same moment that the counter gets to 19 seconds and you push it. I mean, does that sound likely?
Not really, right, because there's always going to be people just alert as you. And robots don't really give you any more grief than people.
It's an interesting argument, and there's probably more to it. I'm sure I'm missing something, and thanks for giving me something to bounce off.
Hey, maybe you can try out a Chrome Ext robot yourself :)
https://chrome.google.com/webstore/detail/rthebutton-robot/m...
Please let me know if there's any bugs.
Ultimately, though, someone could just use HTTP instead of monkeying about with scripting in the browser. You could only deter this by serving up a new JS file every day that has a new way to e.g. calculate a checksum on the button click. Ultimately people are going to find a way to cheat no matter what you do. If this is a social experiment that is a result, too.
With a reasonably sized observation pool, they could compare subsequent clicks and detect outliers.
I think it would be hard to circumvent since people attempting to reverse engineer wouldn't have the observation pool to know what signals Reddit admins were modeling. The biggest downside I can think of is that there would be some delay before calling out a cheater depending on the reliability of the model.
The client side JS could detect the lack of an event capture payload and warn legitimate users after they unlock but before they click so they wouldn't be flagged due to browser incompatibility or JS restrictions from a security policy or privacy extension.
4ms caps your max reflex time at, say, 10ms. Or about 16x faster than your average human [https://www.biology.usu.edu/files/uploads/Courses/Biology%20...]
I'm no expert in sampling. Any bona fide experts want to weigh in? That works ! :)
var buttonSocket = new WebSocket("wss://wss.redditmedia.com/thebutton?h=3b85664277e270cfd024faee2cc021a359a8af73&e=1429012932");
buttonSocket.onmessage = function (event) { console.log(event.data); }
data is just plain json in the form {"type": "ticking", "payload": {"participants_text": "715,197", "tick_mac": "e2dc885fe4836cad86f9cd7670645871e11401f4", "seconds_left": 50.0, "now_str": "2015-04-13-12-33-44"}}
That lets you know what the seconds are on the server and you can calculate your own ms (it looks like they do it client side too), just remember that timeouts are not guaranteed to fire exactly at the time you set since it's a single thread. Maybe a webworker could come in handy here but the event triggerd by a message would still be subject to delay if something else wanted to run. requestAnimationFrame is another place you could look or if you can scrape together the details you need to send the button press you could run something in node with more accurate timing.
I think the patient survived for 24 hours or so, which is quite remarkable for the smaller audience. If I remember correctly, this little game even made it into some German online newspaper (probably Spiegel Online).
Unfortunately, I couldn't find the game for reference.
This is both "ironic if you're taking it at face value" and a pretty good pun.
The two games are a little different, but they're similar. In Impetus, everybody cooperates to continue pressing the button, but you can press it as often as you like. There's no per-user tracking or anything like that. Also the timer was 10 seconds instead of 60. It lasted under 12 hours.
cool to see it come up again.
Also, assuming that if it hits 0, the game is over. So it could be over in a week or two once the focus dies down.
http://www.ebay.com/sch/i.html?_odkw=reddit+button&_nkw=redd...
It might be a good purchase if the account was active before this. You know, for "marketing".
https://en.wikipedia.org/wiki/Shades_of_Grey_1:_The_Road_to_...
https://www.reddit.com/r/OutOfTheLoop/comments/2jne44/what_w...
https://play.google.com/store/apps/details?id=com.nebulights...
Is there any code available to prove that?
Network monitoring on the browser shows nothing (maybe an anti-debugging technique)
tcpdump shows an SSL connection to EC2
You really can't synchronise so many people (especially with connection latencies), I think there's some amount of faking in it.
"In [the The Robbers Cave Experiment], the experimental subjects—excuse me, 'campers'—were 22 boys between 5th and 6th grade, selected from 22 different schools in Oklahoma City, of stable middle-class Protestant families, doing well in school, median IQ 112. They were as well-adjusted and as similar to each other as the researchers could manage.
"The experiment, conducted in the bewildered aftermath of World War II, was meant to investigate the causes—and possible remedies—of intergroup conflict. How would they spark an intergroup conflict to investigate? Well, the 22 boys were divided into two groups of 11 campers, and—
"—and that turned out to be quite sufficient.
"The researchers' original plans called for the experiment to be conducted in three stages. In Stage 1, each group of campers would settle in, unaware of the other group's existence. Toward the end of Stage 1, the groups would gradually be made aware of each other. In Stage 2, a set of contests and prize competitions would set the two groups at odds.
"They needn't have bothered with Stage 2. There was hostility almost from the moment each group became aware of the other group's existence: They were using our campground, our baseball diamond. On their first meeting, the two groups began hurling insults...."
Eliezer Yudkowsky, The Robber's Cave Experiment: http://lesswrong.com/lw/lt/the_robbers_cave_experiment/
Distressing how well it fits, isn't it?
My gut says this was just a silly April Fool's joke to confuse Reddit users, but now it's evolved into its own animal.
(I don't plan to click, anyway)
Like, don't people know freemium smartphone games are a scam? I see people who had the same education as me, people I know have read the same psychology textbooks, paying hundreds of dollars to play these games that have no compelling "fun" factor. These games have such shallow verniers over their slot-machine nature that I don't understand why supposedly intelligent, knowledgeable people can't see them for what they are.
I get needing entertainment and I get not spending 100% of your time single-mindedly focused on "business" or whatever. I watch movies, play games, read books, drink in bars, go to sportsball recitals. I'm here, posting on HN. At least with HN I, get practice writing, have my opinions challenged, learn about new and interesting things, and get a chance to share my own work for feedback and traffic. I don't get money out of HN, but I do get real things out of it.
"Fun" is subjective. To the people that play these games, they are fun and they are deriving enjoyment from them. I don't understand why the enjoy it either, but then again, they probably see some of my hobbies and wonder why the fuck I would spend time/money on them.
Live and let live man.
Look at it like a very simple role-playing game. When you play D&D, your roleplay has to fall within the constructs of the world and the story. In the 'game' of /r/thebutton, though, the only actual 'story elements' are the button, the timer, and the flairs.
I dunno. Mostly, it's just fun, I think.
(* = only shows up if they choose to exercise admin/mod powers when posting)
Instead of having to make insightful comments to earn imaginary karma points in HN or provide helpful answers on Stack Overflow to earn imaginary badges, with this new system you only have to stare at your screen for a really long time and click a button at just the right time to earn higher status!
Also this uses websockets to different servers outside of the normal content servers.
so how was this introduced to reddit, it was not on the front page for long if ever. if not for reading here I doubt I would have ever encountered it
> The button is a feature that the popular social media site Reddit introduced on April 1, 2015. It has its own subreddit at /r/thebutton.
After April 1st it hasn't been that visible though
They also have a blog post [1] about it.
It was also most likely featured at some point on trending subs. And if you read a hell of a lot of reddit, you'll see it mentioned elsewhere on the site (like in memes, comments etc)
[0] http://www.reddit.com/r/ads/comments/3181or/did_you_press_th...
[0] http://web.archive.org/web/20150402105722/http://www.reddit....
setInterval(function(){
var seconds = parseInt($("#thebutton-s-10s").html()) * 10
+ parseInt($("#thebutton-s-1s").html());
if (seconds > 15 && seconds < 20) {
$("#thebutton").click();
}
}, 100);quick edit: Another top level reply to this post is saying something similar.
function validateClickEvent(e) {
var r = e.target.getBoundingClientRect();
if (e.x >= r.left && e.x <= r.right && e.y >= r.top && e.y <= r.bottom) {
console.log('looks legit');
} else {
console.log('faked click');
}
}
Set this as the click handler. The click method is browser specific, but on Chrome the x/y coordinates on the event will be incorrect. A smarter script could fool this, though.And it would still be pretty easy for a cheating script to work cheat your validation!
Or something along those lines!! :)
The github:
https://github.com/humanarity/reddit-thebutton-push-it
And the Webstore:
https://chrome.google.com/webstore/detail/rthebutton-robot/m...
Check it out! :)
Dunno if folks would tolerate that, but I get the sense it'd work.
I guess you could use the data from this to determine how the network functions. It's depth, breadth, how quickly messages propagate through the network, who the influencers are and so forth.
Edit: Watching /r/button is interesting... almost makes me wish I had a Reddit account, but there would seem to be no point now as I wouldn't be permitted to push the button.
Some good things have come out of it, most recently: https://www.reddit.com/r/thebutton/comments/33jpwe/the_endga...
https://www.reddit.com/r/thebutton/comments/32hf6y/for_sale_...
I agree that the game you describe is more personable, but /r/thebutton does have an air of mystery going for it. The simple premise has left room for a lot of interpretation. Is it better to press the button, or stay gray? Which colors are the most desirable? What will happen after the timer runs out? etc.
Disclaimer, I didn't make it.
Until of course orange and red start to appear.
Wrong. Because : "Only accounts created before 2015-04-01 can press the button"
It's not a growth hack...
Even disregarding the possible neat conclusions that could be drawn from the dataset regarding group behavior and psychology, what's wrong with doing something silly because it's fun?
I'm very curious what Kiro thinks. I hope they clarify and weren't just being hyperbolic.
I can easily see the position that pressing this button is a horrible skinner box action. It doesn't require being anti-fun. I don't happen to agree, but it's a valid opinion.
What I can't figure out is the true opposite to that position, where it's an amazing consequence of technology. What's the logic there, I'm highly curious! Like, mixing work and play is kind of neat but you can do that anywhere.
Nonsensical activity on which I won't be wasting any more time than the 2 minutes I spent reading about it.
It highlights the difference between hackernews and reddit. People here are highly motivated and have a goal (fame and fortune). Reddit users are highly motivated, but don't have that goal (entertain me!)