Guest User

ROBLOX Bot

a guest
Mar 28th, 2012
2,259
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ##This requires Python 3.2 http://www.python.org/download/releases/3.2.2/
  2. ##This is a bot that will scan every single LE(Limited Edition) item(hats + gear),
  3. ##and it will display buttons with the snipe price, the next price, and the break even price.
  4. ##You can tell it to copy the link to the item upon clicking, or you can open Google Chrome(if installed)
  5. ##
  6. ##Open notepad and copy and paste EVERYTHING in here and save it as LScanner.py,
  7. ##then you just need to doubleclick it (provided you installed Python 3.2.2 correctly).
  8.  
  9. from tkinter import *
  10. import re
  11. import gc,base64,tkinter.ttk,string,urllib.request,urllib.error,urllib.parse,sys,queue,threading,socket,random,time,math,os
  12. import string, urllib.request, urllib.parse, urllib.error, urllib.request, urllib.error, urllib.parse,_thread,time,sys,queue,threading,datetime,os,socket,base64
  13. import binascii,re
  14. from subprocess import Popen
  15.  
  16. try:
  17.     import LE_Items
  18. except:
  19.     print("First time being run, so the hatlist doesn't exist so I'm gonna create it now.")
  20.     #Oh noes first time being run
  21.     urlpart1 = base64.b64decode(b'9AnJ9EnJsxWQ9QmJrVWZXR3chBVP0ZCO9MmJlxmYpR3YlxGbvNUPt9DewNXYuc2bsFGdhN0Lt92Yug3bsJ2by5yd3d3LvoDc0RHa'[::-1]).decode("ascii")
  22.     urlpart2 =  base64.b64decode(b'=cDM4UzN3QTN4YzMwIzNzMjMykTP41mJ4ADO1czN0UDO2MDMyczMzIjM50SPu1mJ'[::-1]).decode("ascii")
  23.     threads = 5
  24.     pages = 100
  25.     queue = queue.LifoQueue(0)
  26.     point1 =  (base64.b64decode(b"Ij1mZXJoICJrbmlMcmVweUhlbWFOdGVzc0E=")[::-1]).decode("ascii")
  27.     lenpoint1 = len(point1)
  28.     superstring = "hats = []\n"
  29.     apds = []
  30.     hat = []
  31.     class string:
  32.         def find(src,find,offset):
  33.             srch = re.compile(find)
  34.             m = srch.search(src,offset)
  35.             if (not m):
  36.                 return -1
  37.             return m.start(0)
  38.     class Worker2(threading.Thread):
  39.         def __init__(self, queue):
  40.             self.__queue = queue
  41.             threading.Thread.__init__(self)
  42.  
  43.         def run(self):
  44.             while 1:
  45.                 item = self.__queue.get()
  46.                 if item is None:
  47.                     self.__queue.task_done()
  48.                     break
  49.                 try:
  50.                     resp = urllib.request.urlopen(urllib.request.Request(urlpart1+str(item)+urlpart2,headers={'Request-Range':'bytes=50000-79000'}),timeout=1)
  51.                     src = resp.read().decode("utf-8")
  52.                     resp.close()
  53.                     off = 0
  54.                     prices = ""
  55.                     rt = 0
  56.                     st = 0
  57.                     for y in range(5):
  58.                         prices = ""
  59.                         for x in range(4):
  60.                             rt = string.find(src,point1,off)
  61.                             if (rt == -1):
  62.                                 break;
  63.                             st = string.find(src,'\?id=',rt)
  64.                             prices+="[\""+(src[rt+lenpoint1+1:st-5]).replace("-"," ")+"\","
  65.                             rt = string.find(src,'\"',st)
  66.                             prices +=str(src[st+4:rt]) + "],"
  67.                             off = rt+1
  68.                             hat.append(1)
  69.                         apds.append(prices[:len(prices)-1])
  70.                         if (rt == -1):
  71.                             break;
  72.                     del prices,off,resp,src,rt,st
  73.                 except urllib.error.URLError as e:
  74.                     print(str(e)[:200])
  75.                     self.__queue.put(item)
  76.                 except socket.error as e:
  77.                     print(str(e)[:200])
  78.                     self.__queue.put(item)
  79.                 except:
  80.                     print(sys.exc_info()[:200])
  81.                     self.__queue.put(item)
  82.                 self.__queue.task_done()
  83.     start = 0
  84.     start = time.clock()
  85.     for i in range(threads):
  86.         queue.put(None)
  87.     for x in range(int(pages)+1):
  88.         if (x == 0):
  89.             continue
  90.         else:
  91.             queue.put(x)    
  92.     for i in range(threads):
  93.         Worker2(queue).start()
  94.     queue.join()
  95.     for x in range(len(apds)):
  96.         superstring += "hats.extend([" + apds[x] + "])\n"
  97.     superstring+= "timestamp = \""+ str(time.strftime("%b %d,%Y %H:%M:%S", time.gmtime()))+"\""
  98.     f = open("LE_Items.py","w")
  99.     f.write(superstring)
  100.     f.close()
  101.     input("I just created the hat list, to update the list, delete LE_Items.py")
  102. __Vers = "5.0"
  103. base3 = "http://www.roblox.com/Item.aspx?id="
  104. base = "http://www.roblox.com/"
  105. base2 = "-item?id="
  106. hitall = False
  107. reduced = False
  108. s = ['button']
  109. callbase1 = "\""+os.getenv("localappdata")+"\Google\Chrome\Application\chrome.exe\""
  110. callbase2 = "\"C:\Program Files\Google\Chrome\Application\chrome.exe\""
  111. gc.enable()
  112. class SmartRedirectHandler(urllib.request.HTTPRedirectHandler):    
  113.     def http_error_301(self, req, fp, code, msg, headers):  
  114.         result = urllib.request.HTTPRedirectHandler.http_error_301(
  115.             self, req, fp, code, msg, headers)              
  116.         result.status = code                                
  117.         return result                                      
  118.  
  119.     def http_error_302(self, req, fp, code, msg, headers):  
  120.         result = urllib.request.HTTPRedirectHandler.http_error_302(
  121.             self, req, fp, code, msg, headers)              
  122.         result.status = code                                
  123.         return result
  124. class string:
  125.     def find(src,find,offset):
  126.         srch = re.compile(find)
  127.         m = srch.search(src,offset)
  128.         if (not m):
  129.             return -1
  130.         return m.start(0)
  131. class Worker(threading.Thread):
  132.     def __init__(self, queue):
  133.         self.__queue = queue
  134.         threading.Thread.__init__(self)
  135.     def run(self):
  136.         mymoney = int(app.MyMoney.get())
  137.         minprofit = int(app.MinProfit.get())
  138.         broke = False
  139.         while 1:
  140.             item = self.__queue.get(True)
  141.             if item is None:
  142.                 self.__queue.task_done()
  143.                 break
  144.             try:
  145.                 print(base+str(item[0].replace(" ","-"))+base2+str(item[1]))
  146.                 resp = urllib.request.urlopen(base+str(item[0].replace(" ","-"))+base2+str(item[1]),timeout = 5)
  147.                 src = resp.read().decode("utf-8")
  148.                 resp.close()
  149.                 del resp
  150.                 app.HitCount.append(1)
  151.                 off = 0
  152.                 broke = False
  153.                 prices = []
  154.                 rt = 0
  155.                 for x in range(2):
  156.                     rt = string.find(src,'<b style=\"color: Green;\">R',off)
  157.                     if (rt != -1):
  158.                         rt+=27
  159.                         print(src[rt:string.find(src,'</b',rt)])
  160.                         prices.append(int(src[rt:string.find(src,'</b',rt)]))
  161.                         if (prices[0] > mymoney): #If the lowest price is already out of our range... Skip it.
  162.                             time.sleep(0.2)
  163.                             broke = True
  164.                             break
  165.                         off = rt
  166.                     else:
  167.                         broke = True
  168.                         break
  169.                 if (broke == False):
  170.                     prices.append(prices[1] - (prices[0]/.75))
  171.                     time.sleep(0.2)
  172.                     if ((prices[2] >= minprofit) and prices[0] < mymoney):
  173.                         app.Add({"button":None,"item":item,"prices":prices})
  174.                 del prices,off,src,rt
  175.             except urllib.error.URLError as e:
  176.                 print("url error " + str(e))
  177.                 if (hitall):
  178.                     self.__queue.put(item)
  179.                 else:
  180.                     pass
  181.             except socket.error:
  182.                 print(e)
  183.                 if (hitall):
  184.                    
  185.                     self.__queue.put(item)
  186.                 else:
  187.                     pass
  188.             except:
  189.                 print("Unknown Error "+str(item)+"\n")
  190.                 print(sys.exc_info()[:200])
  191.                 if (hitall):
  192.                     self.__queue.put(item)
  193.                 else:
  194.                     pass
  195.             app.Update()
  196.             self.__queue.task_done()
  197.        
  198. class Application(Frame):
  199.     def Run(self):
  200.         if (not self.Running):
  201.             for x in range(len(self.SnipeButtons)):
  202.                 self.SnipeButtons[x]['button'].destroy()
  203.             del self.SnipeButtons
  204.             print(gc.collect())
  205.             self.SnipeButtons = []
  206.             self.Running = True
  207.             self.HitCount = []
  208.             self.Queue = queue.LifoQueue(0)
  209.             self.SnipeCount = queue.LifoQueue(0)
  210.             self.SnipeButtons = []
  211.             print("Starting")
  212.             for i in range(int(self.ThreadCount.get())):
  213.                 self.Queue.put(None)
  214.             random.shuffle(LE_Items.hats)
  215.             for i in range(len(LE_Items.hats)):
  216.                 self.Queue.put(LE_Items.hats[i])
  217.             for i in range(int(self.ThreadCount.get())):
  218.                 Worker(self.Queue).start()
  219.        
  220.     def EntryCallback(app,e):
  221.         print(e)
  222.     def Clicked(self,e):
  223.         root.clipboard_clear()
  224.         url = ""
  225.         if ((not (self.AutoBuyVar.get())) or reduced):
  226.             url = str(base3 + str(e[0]))
  227.         else:
  228.             url = str(base3 + str(e[0]))+"#snipe="+str(e[1])+"&next="+str(e[2])+"&safe="+self.Safe.get()
  229.         if (self.Mode.get() == 2):
  230.                 root.clipboard_append(url)
  231.         else:
  232.             try:
  233.                 mm = callbase1 + " \"" +  (url)+ "\""
  234.                 Popen(mm)
  235.             except:
  236.                 try:
  237.                     mm = callbase2 + " \"" +  (url)+ "\""
  238.                     Popen(mm)
  239.                 except:
  240.                     pass
  241.     def Add(self,di):
  242.         if (di != None):
  243.             di['button'] = Button(self.HatHolder,font="Times 8",wraplength=80,command=lambda:self.Clicked([di['item'][1],di['prices'][0],di['prices'][1]]))
  244.             print(str(round(di['prices'][0])))
  245.             di['button']['text'] = str(di['item'][0][:20])+"\n"+ str(round(di['prices'][1]))+"-"+str(round(di['prices'][0]))+"\nProfit="+str(round(di['prices'][2]))+"\nMin="+str(round(di['prices'][0]/.75))
  246.             di['button']['width'] = 5
  247.             di['button']['height'] = 5
  248.             di['button'].grid_propagate(0)      
  249.             self.SnipeButtons.append(di)
  250.         if (self.SortMode.get() == 0):
  251.             self.SnipeButtons.sort(key=lambda d:(d["prices"][2]))
  252.         elif(self.SortMode.get() == 1):
  253.             self.SnipeButtons.sort(key=lambda d:(d["prices"][0]))
  254.         elif(self.SortMode.get() == 2):
  255.             self.SnipeButtons.sort(key=lambda d:(d["prices"][1]))
  256.         elif(self.SortMode.get() == 3):
  257.             self.SnipeButtons.sort(key=lambda d:(d["prices"][1]/d["prices"][2]))
  258.         if (self.ReverseSort.get()):
  259.             self.SnipeButtons.reverse()
  260.         c = 0
  261.         r = 0
  262.         cm = self.Cols.get()
  263.         for x in range(len(self.SnipeButtons)):
  264.             try:
  265.                 self.SnipeButtons[x]['button'].place(height=82,width=82,x=82.5*c,y=82.5*r)
  266.                 sortvar = self.SnipeButtons[x]['prices'][2]
  267.                 if (self.SortMode.get() == 0):
  268.                      sortvar = self.SnipeButtons[x]['prices'][2]
  269.                 elif(self.SortMode.get() == 1):
  270.                      sortvar = self.SnipeButtons[x]['prices'][0]
  271.                 elif(self.SortMode.get() == 2):
  272.                      sortvar = self.SnipeButtons[x]['prices'][1]
  273.                 elif(self.SortMode.get() == 3):
  274.                      sortvar = float(float(self.SnipeButtons[x]['prices'][2])/float(self.SnipeButtons[x]['prices'][1]))
  275.  
  276.                 if (self.ReverseSort.get()):
  277.                     if (sortvar > float(self.TierThree.get())):
  278.                          self.SnipeButtons[x]["button"]["bg"] = "red"
  279.                          self.SnipeButtons[x]["button"]['font']="Times 8 bold"
  280.                     elif (sortvar > float(self.TierTwo.get())):
  281.                          self.SnipeButtons[x]["button"]["bg"] = "yellow"
  282.                          self.SnipeButtons[x]["button"]['font']="Times 8"
  283.                     elif (sortvar > float(self.TierOne.get())):
  284.                          self.SnipeButtons[x]["button"]["bg"] = "green"
  285.                          self.SnipeButtons[x]["button"]['font']="Times 8"
  286.                     else:
  287.                          self.SnipeButtons[x]["button"]["bg"] = "white"
  288.                          self.SnipeButtons[x]["button"]['font']="Times 8"
  289.                 else:
  290.                     if (sortvar > float(self.TierThree.get())):
  291.                         self.SnipeButtons[x]["button"]["bg"] = "white"
  292.                         self.SnipeButtons[x]["button"]['font']="Times 8"
  293.                     elif (sortvar > float(self.TierTwo.get())):
  294.                         self.SnipeButtons[x]["button"]["bg"] = "green"
  295.                         self.SnipeButtons[x]["button"]['font']="Times 8"
  296.                     elif (sortvar > float(self.TierOne.get())):
  297.                         self.SnipeButtons[x]["button"]["bg"] = "yellow"
  298.                         self.SnipeButtons[x]["button"]['font']="Times 8"
  299.                     else:
  300.                         self.SnipeButtons[x]["button"]["bg"] = "red"
  301.                         self.SnipeButtons[x]["button"]['font']="Times 8 bold"
  302.             except:
  303.                 pass
  304.             c+=1
  305.             if(c==cm):
  306.                 c = 0
  307.                 r+=1
  308.     def Update(self):
  309.         self.Progress.step(1)
  310.         try:
  311.             self.ProgressLabel['text'] = str(self.ProgVar.get())
  312.             if (self.ProgVar.get() == 0):
  313.                 print("Done")
  314.                 self.Running = False
  315.                 if (self.LoopVar.get()):
  316.                     time.sleep(float(self.LoopWait.get()))
  317.                     self.Run()
  318.         except:
  319.             pass
  320.     def SortModeChange(self,wat,wat2,wat3):
  321.         if (not self.TierBlock):
  322.             self.TierBlock = True
  323.             self.TierOne.set(self.SortTiers[self.SortMode.get()][0])
  324.             self.TierTwo.set(self.SortTiers[self.SortMode.get()][1])
  325.             self.TierThree.set(self.SortTiers[self.SortMode.get()][2])
  326.             self.TierBlock = False
  327.         if (self.Running):
  328.             self.Add(None)
  329.     def TierChange(self,wat,wat2,wat3):
  330.         if (not self.TierBlock):
  331.             self.TierBlock = True
  332.             self.SortTiers[self.SortMode.get()][0] = self.TierOne.get()
  333.             self.SortTiers[self.SortMode.get()][1] = self.TierTwo.get()
  334.             self.SortTiers[self.SortMode.get()][2] = self.TierThree.get()
  335.             self.TierBlock = False
  336.         try:
  337.             self.Add(None)
  338.         except:
  339.             pass
  340.     def createWidgets(self):
  341.         self.HatHolder = Frame(self,relief = "groove",height = str(82.5*7),width = str((82.5*10)+3),bd = 2 )
  342.         self.HatHolder.grid(row=0,column=0)
  343.         self.HatHolder.grid_propagate(0)
  344.         time.sleep(0.1)
  345.         self.HatHolder.grid_rowconfigure(0, minsize=50,weight=0)
  346.         self.HatHolder.grid_columnconfigure(0, minsize=50,weight=0)
  347.         self.Controls = Frame(self,relief = "groove",width = 100,bd = 2)
  348.         self.Controls.grid(row=0,column=1,sticky=NE)
  349.        
  350.         Button(self.Controls,width = 10,text = "Start",command=lambda: self.Run()).grid(row=0,column=0,sticky=N)
  351.          
  352.         self.LoopVar = BooleanVar()
  353.         Checkbutton(self.Controls,variable = self.LoopVar,offvalue = False,onvalue = True,text = "Loop Scan").grid(row = 1,column=0,sticky=W)
  354.         self.LoopWait = StringVar()
  355.         Entry(self.Controls,textvariable = self.LoopWait,width=6).grid(row=1,column=0,sticky = E)
  356.         self.LoopWait.set("7")
  357.         self.Mode = IntVar()
  358.         self.Mode.set(2)
  359.         self.AutoBuyVar = BooleanVar()
  360.         self.AutoBuyVar.set(False)
  361.         self.Safe = StringVar()
  362.         self.Safe.set("YES")
  363.         if (not reduced):
  364.             Checkbutton(self.Controls,variable = self.Safe,onvalue = "NO",offvalue = "YES").grid(row=2,column=0,sticky=E)
  365.             Checkbutton(self.Controls,variable = self.AutoBuyVar,offvalue = False,onvalue = True,text = "Buy").grid(row=3,column=0,sticky=E)
  366.         Radiobutton(self.Controls,variable = self.Mode,value = 1,text = "Open Chrome").grid(row=2,column=0,sticky=W)
  367.         Radiobutton(self.Controls,variable = self.Mode,value = 2,text = "Copy Link",state = "active").grid(row=3,column=0,sticky=W)
  368.        
  369.  
  370.         self.ThreadCount = StringVar()
  371.         if (not reduced):
  372.             Label(self.Controls,text = "# Of Threads").grid(row=4,column=0,sticky=W)
  373.             Entry(self.Controls,textvariable = self.ThreadCount).grid(row=5,column=0,sticky=W)
  374.             pass
  375.         self.ThreadCount.set("10")
  376.  
  377.         self.MyMoney = StringVar()
  378.         Label(self.Controls,text = "Maximum Price").grid(row=6,column=0,sticky=W)
  379.         self.MoneyInput = Entry(self.Controls,textvariable = self.MyMoney)
  380.         self.MoneyInput.grid(row=7,column=0,sticky=W)
  381.         self.MyMoney.set("298")
  382.        
  383.         self.MinProfit = StringVar()
  384.         Label(self.Controls,text = "Minimum Profit").grid(row=8,column=0,sticky=W)
  385.         Entry(self.Controls,textvariable = self.MinProfit).grid(row=9,column=0,sticky=W)
  386.         self.MinProfit.set("1")
  387.         self.SortMode = IntVar()
  388.         self.SortMode.trace("w",self.SortModeChange)
  389.         self.TierOne = StringVar()
  390.         self.TierTwo = StringVar()
  391.         self.TierThree = StringVar()
  392.         self.SortMode.set(0)
  393.         self.TierOne.trace("w",self.TierChange)
  394.         self.TierTwo.trace("w",self.TierChange)
  395.         self.TierThree.trace("w",self.TierChange)
  396.         Label(self.Controls,text = "Tier One Minimum").grid(row=10,column=0,sticky = W)
  397.         Entry(self.Controls,textvariable = self.TierOne).grid(row=11,column=0,sticky=W)
  398.         Label(self.Controls,text = "Tier Two Minimum").grid(row=12,column=0,sticky = W)
  399.         Entry(self.Controls,textvariable = self.TierTwo).grid(row=13,column=0,sticky=W)
  400.         Label(self.Controls,text = "Tier Three Minimum").grid(row=14,column=0,sticky = W)
  401.         Entry(self.Controls,textvariable = self.TierThree).grid(row=15,column=0,sticky=W)
  402.        
  403.         self.SortMode = IntVar()
  404.         self.SortMode.trace("w",self.SortModeChange)
  405.         self.SortMode.set(0)
  406.         self.ReverseSort = BooleanVar()
  407.         self.ReverseSort.set(True)
  408.         self.ReverseSort.trace("w",self.TierChange)
  409.         Checkbutton(self.Controls,text = "Reverse",variable = self.ReverseSort).grid(row=16,sticky=E)
  410.      
  411.         Label(self.Controls,text = "Sorting:").grid(row=16,sticky=W)
  412.         if (not reduced):
  413.             Radiobutton(self.Controls,text = "Proft",variable = self.SortMode,value = 0).grid(row=17,stick=W)
  414.             Radiobutton(self.Controls,text = "Snipe Price",variable = self.SortMode,value = 1).grid(row=18,sticky=W)
  415.             Radiobutton(self.Controls,text = "Next Price",variable = self.SortMode,value = 2).grid(row=19,sticky = W)
  416.             Radiobutton(self.Controls,text = "Percent Profit",variable = self.SortMode,value = 3).grid(row=20,sticky = W)
  417.             pass
  418.        
  419.         Label(self.Controls,text = str(len(LE_Items.hats)) + " hats").grid(row=31,sticky=E)
  420.         Label(self.Controls, text =LE_Items.timestamp).grid(row=32,sticky=E)
  421.        
  422.         self.ProgVar = IntVar()
  423.         self.Progress = tkinter.ttk.Progressbar(self.Controls, orient=HORIZONTAL, maximum=len(LE_Items.hats),variable = self.ProgVar, mode='determinate')
  424.         self.Progress.grid(row=30,sticky=W)
  425.         self.ProgressLabel = Label(self.Controls,text = "0")
  426.         self.ProgressLabel.grid(row=30,column=0,sticky=E)
  427.         self.Cols = IntVar()
  428.         self.Cols.set(10)
  429.  
  430.        
  431.     def Resize(self,event):
  432.         try:
  433.             if (self.Loaded):
  434.                 if (event.widget == self.master):
  435.                     self.HatHolder['width'] = event.width-(self.Controls['width']+30)+2
  436.                     self.HatHolder['height'] = event.height
  437.                     self.Cols.set(int(math.floor(self.HatHolder['width']/82.5)))
  438.                     self.Add(None)
  439.         except:
  440.             pass
  441.     def __init__(self, master=None):
  442.         Frame.__init__(self, master)
  443.         self.Running = False
  444.         self.Queue = queue.LifoQueue(0)
  445.         self.HitCount = []
  446.         self.SnipeCount = queue.LifoQueue(0)
  447.         self.SnipeButtons = []
  448.         self.SnipeButtons2 = []
  449.         self.Loaded = False
  450.         self.TierBlock = False
  451.         self.SortTiers = [[300,700,1500],[500,1200,3000],[1000,5000,20000],[.20,.5,.70]]
  452.         self.createWidgets()
  453.         self.grid()
  454.         self.Loaded = True
  455.  
  456. root = Tk()
  457. root.title("LScanner[" + __Vers + "]~Monica")
  458. #root.wm_iconbitmap('Test.ico') #You guys don't have the ico
  459. app = Application(master = root)
  460. app.mainloop()
RAW Paste Data