Where my Love for Botting Started
I have always had a love for automation and “botting” it started in my early teens playing a game called Tibia. Tibia is a 2D MMORPG video game that my friends and I played all the way from grade 8 to grade 12. I say play but what I actually mean is it took over our lives. I would wake up 2 hours before I go to school just to get some “hunting” in on Tibia. So you can get a good understanding of the game that took over my life here is a quick video of me taking part of a quest in this game.
This game was extremely repetitive and I knew there had to be a better way. This is when I was introduced to botting, I started botting at this game and letting my computer level my character up and I love the satisfaction of coming home after school to see how many levels I had gained.
Transitioning to Generating Sales Leads Online
Let’s fast forward 5 years out of high school and I am working a door to door job while going to University for business and computer science. I always wanted to find out how to get more sales and more efficiently. So I did some searching online and ended up finding this online forum in which people who post when they had found “Hot Deals”. I found a section there that a couple of customers had posted their telecom deals on and I had begun messaging the customers letting them know what the current promotions were and that I could help them out directly. Sales started coming in and this was just the start.
6 months goes by and I had transitioned to knocking door to door 50% of the time and the other 50% I was working on the forums. By that time 4 other representatives in my same company from across the company were selling on the forums and now effectively my competition. I started bringing my laptop with me everywhere I went. As soon as I got an email notification on my phone that a new customer had posted I would start up the portable hotspot and boot up my laptop to send the customer a private message with the current offers.
Outsourcing the Bot Creation
This was getting ridiculous and I still wasn’t able to get to every customer before the other reps. This is when I knew there must be another way. I was part of this botting forum and saw the two program Ubot Studio and Win Automation coming up over and over. At this time I was being pretty cheap and didn’t want to fork out the $300 to purchase either of the software and met this guy from the Philipines named Ryan. I ended up paying Ryan $50 CAD to create me a bot to automatically respond to these customers that had posted with what my current offer was. This was awesome but just the start.
I used the bot Ryan had created for about a month until I was out of my home and I noticed the bot started spamming the forums I was on. I panicked and quickly deleted all my posts before anyone else had seen it. At this time I realized it was time, I create the bot myself to ensure this never happened again.
Learning to Create the Bot on my Own
I first started by purchasing UBot Studio as this was the software Ryan had used initially to create me this bot. Ubot Studio was great however it wasn’t stable. The bot wouldn’t last a full 8 hours without having to be restarted. I started playing around with the WinAutomation trial and noticed I was able to get the bot running for 72 hours no problem with no crashes and knew I needed to make the switch.
How the Bot Was Programmed
After about a month of programming WinAutomation it was becoming pretty elaborate. First I was having customers respond in the following format
Customer: New
Current Provider:
City/Province:
Looking for: Cable + Internet + Phone
This allowed me to easily parse out which customers were new, what province they were in and what services they were looking for. My bot would first look to see if they are a new customer if this it true then we will proceed. Now we want to know what city they are in, and then we see what services they are looking for. With all this information the bot will look for the best deal for the customer. These deals were all in txt files sorted in their specific city name folder. These folders were in my DropBox which allowed me to change the promotion at any point.
At this time I was responding to the customers faster than the other reps and I had to continuously filter out my triggers to ensure the bot was accurately understanding what the customer was looking for. If the bot was ever confused it would screenshot the message and put it in a folder. Once a week I would go through this folder and tweak the bot to be able to understand more language.
Following Up With Customers
After the bot would send a private message it will wait 48 business hours and if it didn’t receive a response it would send the customer a message following up asking if they had any other questions and they wanted to sign up. At this time I realized I was getting customers from other cities sending me messages back saying they were helped by their “local rep”. At this time I knew I needed to make myself look local. I had changed my signature to include I was a
Closing More Sales by Making Myself Look “Local”
At this time I knew I needed to make myself look local. The first step was changing my signature to include I was a “National Sales Rep” the second step was I had purchased 4 phone numbers that for each of the provinces that I was selling in. These phone numbers would forward directly to my work phone. I found an awesome provide for these phone numbers for really cheap from FlyNumber.com. Now I modified my bot to identify the customer’s city and then once it scrapes the city it needs to identify what province that city is in and then uses the corresponding phone number in the footer of my message to make myself look “local”.
Top Of The Sales Board
My sales at this point were in the top 30% of my team the bot was tweaked a few times over the next two years. I ended up embedding a picture of my companies mascot on the bottom of the messages but this image was used more than just to spruce up my message. This picture was actually a PHP script that was stored a unique id for each customer that I was able to use to correlate the view with which private message it was. This script allowed me to identify when people that were actually current customers were just trying to fish me for what the current offers were and also allowed me to identify people trying to use multiple accounts to trick me. This code changes the image depending on that specific customer’s ISP when the customers deal I had sent them was expiring. You can find the code below (don’t judge on the code quality, it was a quick and dirty solution I had created)
Getting Analytics Data on Forum Private Messages
<?php $imageurl = "blank.gif"; $ip = $_SERVER['REMOTE_ADDR']; $page = $_SERVER['REQUEST_URI']; $refer = $_SERVER['HTTP_REFERER']; $date_time = date("l j F Y g:ia", time() - date("Z")) ; $agent = $_SERVER['HTTP_USER_AGENT']; header("content-type: image/gif"); $font = 'Font.otf'; $image = ImageCreateFromGIF($imageurl); $text = getAutoBotText(); $ip = $_SERVER['REMOTE_ADDR']; $details = ip_details($ip); $isp = $details->org; //IF ISP OF CUSTOMEr IS TELECOM if (strpos(strtolower($isp), 'Telecom') !== false){ $color = imagecolorresolve ($image, 0, 0, 0); $text[1] = "Refer a Friend"; $text[2] ="to Telecom"; $text[3] = "Today!"; imagettftext($image, 12, 0, 30, 28, $color, $font, $text[1]); imagettftext($image, 12, 0, 50, 44, $color, $font, $text[2]); imagettftext($image, 12, 0, 50, 60, $color, $font, $text[3]); //IF MESSAGE WAS SENT THIS MONTH }elseif(strpos(strtolower($page), strtolower(date("M"))) == false) { $color = imagecolorresolve ($image, 0, 0, 0); $text[1] = "Offer Expired"; $text[2] ="Send Me a PM"; $text[3] = "For New Offer"; imagettftext($image, 12, 0, 23, 28, $color, $font, $text[1]); imagettftext($image, 12, 0, 24, 44, $color, $font, $text[2]); imagettftext($image, 12, 0, 23, 60, $color, $font, $text[3]); //IF THIS IS A FOLLOWUP MSG }elseif(strpos(strtolower($page), 'followup') !== false) { $color = imagecolorresolve ($image, 0, 0, 0); imagettftext($image, 12, 0, 23, 28, $color, $font, $text[1]); imagettftext($image, 12, 0, 47, 44, $color, $font, $text[2]); imagettftext($image, 12, 0, 54, 60, $color, $font, $text[3]); }else { //IF MESSAGE WAS NOT SENT THIS MONTH if($text[4]>7){ $color = imagecolorresolve ($image, 0, 0, 0); imagettftext($image, 12, 0, 23, 28, $color, $font, $text[1]); imagettftext($image, 12, 0, 47, 44, $color, $font, $text[2]); imagettftext($image, 12, 0, 54, 60, $color, $font, $text[3]); } else { $color = imagecolorresolve ($image, 255, 0, 0); imagettftext($image, 12, 0, 40, 28, $color, $font, $text[1]); imagettftext($image, 12, 0, 47, 44, $color, $font, $text[2]); imagettftext($image, 12, 0, 54, 60, $color, $font, $text[3]); } } imagegif($image); //DONT SAVE MYSELF TO THE DATABASE if($ip!="255.255.255.255"){ savetoDatabase($ip,$page,$refer,$agent,$isp,$text[1],$text[2],$text[3],'botlogger'); } function getAutoBotText(){ $curMonth = date('n'); $curYear = date('Y'); if ($curMonth == 12){ $firstDayNextMonth = mktime(0, 0, 0, 0, 0, $curYear+1); }else{ $firstDayNextMonth = mktime(0, 0, 0, $curMonth+1, 1); } $daysTilNextMonth = round(($firstDayNextMonth - mktime()) / (24 * 3600)); if ($daysTilNextMonth>1){ $text[1] ="Promotions are"; $text[2] = "Expiring in"; $text[3] = $daysTilNextMonth . " days!"; } else { $text[1] ="Ahh! Promos"; $text[2] = "are Expiring"; $text[3] = "Tomorrow!"; } $text[4] = $daysTilNextMonth; return $text; } function getBotText(){ try { $db = new PDO('mysql:host=localhost;dbname=database;charset=utf8', 'username', 'password'); foreach($db->query('SELECT * FROM `bottext`') as $row) { $text[1] = $row['text1']; $text[2] = $row['text2']; $text[3] = $row['text3']; } } catch(PDOException $ex) { echo "An Error occured!"; //user friendly message echo($ex->getMessage()); } return $text; } function ip_details($ip) { $json = file_get_contents("http://ipinfo.io/{$ip}"); $details = json_decode($json); return $details; } // function savetoDatabase($ip,$page,$refer,$agent,$isp,$text1,$text2,$text3,$database){ ///FUNCTION TO STORE EACH VIEW OF MY MESSAGE INTO A DATABASE WITH THE CUSTOMERS IP ADDRESS, ISP, USERAGENT } ImageDestroy($image); exit(); ?>
This is how I automated my door to door sales job.