コード例 #1
0
ファイル: json_recent_thread.py プロジェクト: MisterO/Steam
class SteamJsonRecentThreading:

    def __init__(self,items_list,wte,sma,sessionid,sls,sl,srl,password,username):
        self.recent_parsing_list = [u'results_html',u'hovers',u'last_listing',u'last_time',u'app_data',u'currency',
                                    u'success',u'more',u'purchaseinfo']
        self.asset_parsing_list = ['currency','contextid','classid','instanceid','amount',
                                   'status','original_amount','tradable',
                                   'background_color','icon_url','icon_url_large',
                                   'descriptions','name','name_color','type',
                                   'market_name','market_actions','commodity','app_icon',
                                   'owner','actions','market_tradable_restriction']
        self.listinginfo_parsing_list = ['fee','publisher_fee_percent','steam_fee','publisher_fee',
                                         'converted_steam_fee','converted_publisher_fee','converted_price_per_unit',
                                         'converted_fee_per_unit','converted_fee_per_unit',
                                         'converted_publisher_fee_per_unit','price',
                                         'publisher_fee_app','converted_steam_fee_per_unit']
        self.listinginfo_asset_parsing_list = ['currency','contextid','amount','market_actions','appid']
        self.float100 = float(100)
        self.http = SteamBotHttp(wte,sma,sessionid,sls,sl,srl,password,username)
        #logic mode recent
        #logic mode item
        self.log = Logic('recent',0,0,items_list)
        self.last_listing_buy = ''
        self.dif_countries = self.log.dif_countries
        self.dif_hosts = self.log.dif_hosts_recent
        self.contaSim = 0
        self.contaNao = 0
        self.list_median_prices = {}
        self.timestamp_lock = threading.Lock()
        self.buy_lock = threading.Lock()
        self.sell_lock = threading.Lock()
        self.last_listing_buy_lock = threading.Lock()
        self.write_active_listings_lock = threading.Lock()
        self.timestamp = ''
        self.search_for_kenny_cobble = False

    def getRecentTotalReady(self, recent_full):
        self.recent_parsed = {}

        if self.search_for_kenny_cobble is True:
            self.searchkenny(recent_full)

        if type(recent_full) == dict:
            for key in self.recent_parsing_list:
                if recent_full.has_key(key):
                    recent_full.pop(key)
        else:
            recent_full = {}
        #retorna um dict so com as keys assets e listinginfo
        return recent_full

#-------------------------------------------------------------------------------------------------------------------
#-------------------------------------------ASSETS!!!!!!!!!!!!!!----------------------------------------------------

    #NAO EXECUTAR MANUALMENTE!!!!!!!!!!!!!!!!!!!!
    def getCleanAssetList(self,recent_parsed):
        if recent_parsed.has_key('assets'):
            asset_list = recent_parsed['assets']
            if asset_list.has_key('730'):
                asset_list = asset_list['730']
                asset_list = asset_list['2']
                for key_item in asset_list:
                    for key in self.asset_parsing_list:
                        if key in asset_list[key_item]:
                            asset_list[key_item].pop(key)
            else:
                return False
        else:
            return False
        return asset_list

    #lista final dos assets = list2 = {'awp worm god':'231342342','ak47 redline':'432342342342',...}
    #nao executar, so no getfinallist()
    def getlistassets(self,asset_list):
        if asset_list == False:
            return False
        else:
            final_list_assets = {}
            for key_item in asset_list.keys():
                if asset_list[key_item].has_key('market_hash_name'):
                    final_list_assets[asset_list[key_item]['market_hash_name']] \
                    = asset_list[key_item]['id']
            return final_list_assets

#-------------------------------------------------------------------------------------------------------------------
#-------------------------------------------LISTINGS!!!!!!!!!!!--------------------------------------------------------

    #NAO EXECUTAR MANUALMENTE!!!!!!!!!!!!!!!!!!!!
    #1 a ser executada
    def delNonCsgoListings(self, recent_parsed):
        listinginfo_list = {}
        if recent_parsed.has_key('listinginfo'):
            temp_list = recent_parsed['listinginfo']
            listinginfo_list = temp_list
            for k in listinginfo_list.keys():
                if listinginfo_list[k]['asset']['appid'] != 730:
                    listinginfo_list.pop(k)
                elif listinginfo_list[k]['asset']['amount'] == 0:
                    listinginfo_list.pop(k)
        else:
            return False
        return listinginfo_list

    #2 a ser executada
    #NAO EXECUTAR MANUALMENTE!!!!!!!!!!!!!!!!!!!!
    def getCleanListinginfoListWithAsset(self,listinginfo_list):
        temp_dict = listinginfo_list
        if temp_dict == False:
            return False
        else:
            for key_item in temp_dict:
                for key in self.listinginfo_parsing_list:
                    if temp_dict[key_item].has_key(key):
                        temp_dict[key_item].pop(key)
        return temp_dict

    #3 a ser executada
    #NAO EXECUTAR MANUALMENTE!!!!!!!!!!!!!!!!!!!!
    def getcleanlistings(self,listinginfo_list):
        temp_dict = listinginfo_list
        if temp_dict == False:
            return False
        else:
            for key_item in temp_dict:
                for key in self.listinginfo_asset_parsing_list:
                    if temp_dict[key_item]['asset'].has_key(key):
                        temp_dict[key_item]['asset'].pop(key)
        return temp_dict

    #lista final dos listings: list1 = {'231342342':'2.45','432342342342':'12.76',...
    #nao executar, so no getfinallist()
    def getlistlistings(self,listinginfo_list):

        final_list_listings = listinginfo_list

        if final_list_listings != False:
            for key_item in final_list_listings.keys():
                if final_list_listings[key_item].has_key('converted_price') == False:
                    final_list_listings.pop(key_item)
        else:
            return False

        return final_list_listings
        #except:
            #print "falha no parsing da lista de listings"
            #return False

#-------------------------------------------------------------------------------------------------------------------

    def getfinalrecentlist(self,asset_clean,listing_clean):
        final_list = {}

        if type(listing_clean) == dict:
            listing_clean_this = listing_clean
        else:
            print 'falha no parsing dos listings, try again'
            return False

        if type(asset_clean) == dict:
            asset_clean_this = asset_clean
        else:
            print 'falha no parsing dos assets, try again'
            return False

        for k in listing_clean_this:
            for k2 in asset_clean_this:
                if asset_clean_this.get(k2) == listing_clean_this[k]['asset']['id']:
                    final_list[k2] = listing_clean_this.get(k)
        return final_list

    def seeifrecentiteminlistbuy(self,item):
        for temp in self.log.list_items_to_buy:
            if item == temp:
                return True

    #This function analizes if an item found on a RECENT_LISTING response from Steam belongs in the item list that the
    #user defined and if so it analizes if its worth buying
    #
    #Returns False if anything goes wrong
    def buyingroutine(self,final_list,t_name,host):
        temp_resp = []
        if final_list == False:
            temp_resp.append(False)
            return temp_resp
        else:
            final_list_this = final_list
            for key in final_list_this:
                if key in self.log.list_items_to_buy_unicode:
                    if self.list_median_prices.has_key(key):
                        temp_converted_price_math = float(decimal.Decimal(final_list_this[key]['converted_price'])/100)
                        temp_converted_fee_math = float(decimal.Decimal(final_list_this[key]['converted_fee'])/100)
                        if float(float(self.list_median_prices[key]) -
                                float((temp_converted_price_math+temp_converted_fee_math))) >= \
                                (0.275*(float(self.list_median_prices[key]))):
                            if (temp_converted_price_math+temp_converted_fee_math) <= \
                                    float((95*self.getwalletbalancefromvar())):
                                if int(final_list_this[key]['converted_currencyid']) == 2003:
                                    if final_list_this[key]['listingid'] != self.last_listing_buy:

                                        self.last_listing_buy_lock.acquire()
                                        self.last_listing_buy = final_list_this[key]['listingid']
                                        self.last_listing_buy_lock.release()

                                        print 'Estou prestes a entrar no acquire dos buys ON THREAD ' + str(t_name)
                                        self.buy_lock.acquire()
                                        print 'Entrei no acquire dos buys ON THREAD '  + str(t_name)

                                        try:
                                            if (float(self.list_median_prices[key]) - float(self.getlowestprice(key))) \
                                                    >= (0.15*float(self.list_median_prices[key])):
                                                print "O PRECO LOWEST E MT MAIS BAIXO QUE O MEDIO, NAO VOU COMPRAR"
                                                print 'sai do lock dos buys ON THREAD ' + str(t_name)
                                                self.buy_lock.release()
                                                temp_resp.append(False)
                                                return temp_resp
                                        except (TypeError,KeyError):
                                            self.buy_lock.release()
                                            temp_resp.append(False)
                                            return temp_resp

                                        temp = self.http.buyitem(final_list_this[key]['listingid'],
                                                                 final_list_this[key]['converted_price'],
                                                                 final_list_this[key]['converted_fee'],
                                                                 final_list_this[key]['converted_currencyid'],host)

                                        self.log.writetobuyfile(self.http.httputil.data_buy['subtotal'],
                                                                self.http.httputil.data_buy['fee'],
                                                                self.http.httputil.data_buy,
                                                                final_list_this[key]['listingid'],
                                                                key,temp[0],temp[1],t_name)

                                        if temp[0] == 200:
                                            if temp[1]['wallet_info'].has_key('wallet_balance'):
                                                if self.log.writetowallet(temp[1]['wallet_info']['wallet_balance']) == True:
                                                    print "Ok COMPREI A: " + key + " ao preco: " + \
                                                         str(final_list_this[key]['converted_price'] +
                                                             final_list_this[key]['converted_fee'])
                                                    temp_resp.append(True)
                                                    temp_resp.append(self.list_median_prices[key])
                                                    temp_resp.append(key)
                                                    temp_resp.append(temp_converted_fee_math+temp_converted_price_math)
                                                    self.buy_lock.release()
                                                    print 'sai do lock dos buys ON THREAD ' + str(t_name)
                                                    return temp_resp
                                        else:
                                            print "Nao pude comprar item " + key
                                            print "erro ao comprar item"
                                            self.buy_lock.release()
                                            print 'sai do lock dos buys ON THREAD ' + str(t_name)
                                            temp_resp.append(False)
                                            return temp_resp
                                    else:
                                        temp_resp.append(False)
                                        return temp_resp
                            else:
                                print "Nao pude comprar: " + key +" porque nao tenho fundos On THREAD " + str(t_name)
                                temp_resp.append(False)
                                return temp_resp
                        else:
                            print "THREAD " + str(t_name) + " nao pode comprar " + key + \
                                  " porque margens nao sao suficientes. " \
                                  "Preco medio: " + str(self.list_median_prices[key]) +\
                                  ' Preco do item: ' + str(temp_converted_fee_math+temp_converted_price_math)
                            temp_resp.append(False)
                            return temp_resp
                    else:
                        temp_resp.append(False)
                        return temp_resp
        temp_resp.append(False)
        return temp_resp

#----------------------------------------------AUX FUNCTIONS-----------------------------------------------------------
    #Calls the querie recent function on the HTTP class
    def queryrecent(self,thread):
        lista = []
        lista.append(self.http.queryrecent('steamcommunity.com',thread))
        lista.append('steamcommunity.com')
        return lista

    #Calls the querie recent function on the HTTP class with diferent country codes!
    def queryrecentdifcountries(self,thread):
        country = random.choice(self.log.list_countries)
        lista = []
        lista.append(self.http.urlqueryrecentwithcountry('steamcommunity.com',country,thread))
        lista.append('steamcommunity.com')
        return lista

    #Calls the querie recent function on the HTTP class with diferent hosts
    def queryrecentdifhosts(self,thread):
        host = random.choice(self.log.list_hosts)
        lista = []
        lista.append(self.http.queryrecent(host,thread))
        lista.append(host)
        return lista

    #Calls the querie recent function on the HTTP class with diferent hosts and country codes
    def queryrecentdifhostsdifcountries(self,thread):
        host = random.choice(self.log.list_hosts)
        country = random.choice(self.log.list_countries)
        lista = []
        lista.append(self.http.urlqueryrecentwithcountry(host,country,thread))
        lista.append(host)
        return lista

    #Returns the id of the item with the number 1 position on your inventory or False if anything goes wrong
    def getpositiononeiteminv(self):
        return self.http.getpositiononeiteminv()

    def sellitem(self,assetid,price):
        return self.http.sellitem(assetid,price)

    def exportJsonToFile(self,json,file):
        try:
            with open('util/'+file+'.json', 'w') as outfile:
                ujson.dump(json, outfile)
            outfile.close()
        except ValueError:
            return False
        return True

    def writeInItemsTxt(self,item):
        return self.log.writeInItemsTxt(item)

    def delInItemsTxt(self,item):
        return self.log.delInItemsTxt(item)

    def getlistbuyitems(self):
        return self.log.list_items_to_buy

    #Returns the balance from the VAR in log.wallet_balance
    def getwalletbalancefromvar(self):
        return float(self.log.wallet_balance)

    #Loads the median prices from the file median_prices.json
    #Return false in case of error
    def loadmedianpricesfromfile(self):
        try:
            file = open('util/median_prices.json','r')
            self.list_median_prices = ujson.load(file)
            file.close()
        except ValueError:
            return False

        return self.list_median_prices

    def writetosellfile(self,status,content,item,price,thread_n,price_no_fee):
        return self.log.writetosellfile(status,content,item,price,thread_n,price_no_fee)

    def writetobuyfile(self,subtotal,fee,data_buy,listingid,key,responsecode,responsedict,thread_n):
        return self.log.writetobuyfile(subtotal,fee,data_buy,listingid,key,responsecode,responsedict,thread_n)

    def sellitemtest(self,assetid,price):
        return self.http.sellitem(assetid,price)

    #Writes to the wallet file the balance that is currently stored in the var Walletbalance
    #IT DOES NOT RETURN OR WRITE THE BALANCE DIRECTLY FROM STEAM
    def writetowalletadd(self,amount_add):
        temp = float(amount_add) + float(self.getwalletbalancefromvar())
        temp = temp*100
        return self.log.writetowallet(int(temp))

    #Returns the lowest price for the item directly from Steam
    #In case of error returns False
    def getlowestprice(self,item):
        temp_item_priceover = self.http.querypriceoverview(item)
        if type(temp_item_priceover) == int:
            print "Erro ao obter preco mais baixo actualmente de " + item
            print "Status code da querie: " + str(temp_item_priceover)
            return False

        if type(temp_item_priceover) == bool:
            return False

        elif temp_item_priceover.has_key('lowest_price'):
            temp_lowest_price = temp_item_priceover['lowest_price']
            if isinstance(temp_lowest_price, basestring):
                temp_lowest_price = temp_lowest_price.replace('&#8364; ','').replace(',','.').replace('-','0')
                temp_lowest_price = "{0:.2f}".format(float(temp_lowest_price))
                print temp_lowest_price
                return temp_lowest_price

    def buyitemtest(self,listing,subtotal,fee,currency,host):
        temp =  self.http.buyitemTEST(listing,subtotal,fee,currency,host)
        print str(temp[0]) + '\n'
        print temp[1]

    #returns the median price for every item on the list that the user chooses at the start of the program
    #In case of error for any item, you will not get that item median price
    def getmedianitemlist(self):

        self.list_median_prices = {}

        for key in self.log.list_items_to_buy_unicode:
            temp_item_priceover = {}
            temp_item_priceover = self.http.querypriceoverview(key.encode('utf-8'))
            if type(temp_item_priceover) == int:
                print "Erro ao obter preco medio de " + key
                print "Status code da querie: " + str(temp_item_priceover)

            elif type(temp_item_priceover) == bool:
                print "Erro ao obter preco medio de " + key
                print "Status code da querie: " + str(temp_item_priceover)

            elif temp_item_priceover.has_key('median_price'):
                temp_median_price = temp_item_priceover['median_price']
                if isinstance(temp_median_price, basestring):
                    temp_median_price = temp_median_price.decode('unicode_escape').encode('ascii','ignore')
                    temp_median_price = temp_median_price.replace(',','.').replace('-','0')
                    temp_median_price = "{0:.2f}".format(float(temp_median_price))
                self.list_median_prices[key] = float(temp_median_price)

            if self.list_median_prices.has_key(key):
                print 'O preco medio de ' + key + ' e: ' + str(self.list_median_prices[key])

        return self.list_median_prices

    #returns wallet balance from steam website in float format
    def parsewalletbalance(self):
        soup = BeautifulSoup(self.http.getsteamwalletsite(),'html.parser')
        balance_soup = soup.find('span',{'id':'marketWalletBalanceAmount'})

        if balance_soup != None:
            balance_soup = balance_soup.get_text()
            balance_str = balance_soup.encode('ascii','ignore').replace(',','.').replace('-','0')

            return float(balance_str)
        else:
            print "ERROR GETTING WALLET BALANCE, TRY TO LOGIN AGAIN!"
            return False


    #Vai buscar o valor o balance da minha carteira ao Steam diretamente
    #e se encontrar, atualiza a var wallet_balance
    def parsewalletbalanceandwrite(self):

        soup = BeautifulSoup(self.http.getsteamwalletsite(),'html.parser')
        balance_soup = soup.find('span',{'id':'marketWalletBalanceAmount'})

        if balance_soup != None:
            balance_soup = balance_soup.get_text()
            balance_str = balance_soup.encode('ascii','ignore').replace(',','.').replace('-','0')

            self.log.writetowallet(float(balance_str)*100)

            return float(balance_str)
        else:
            print "ERROR GETTING WALLET BALANCE, MAYBE FAZER LOGIN RESOLVE ESTE PROBLEMA"
            return False

    #faz uma querie para ver as active listings que a conta tem
    #retorna as active_listings actuais ou false
    def getactivelistingsparsed(self):
        active_listings = self.http.getmyactivelistingsraw()
        active_listings_list = []

        if type(active_listings) == dict:
            if active_listings.has_key('assets'):
                if type(active_listings['assets']) == dict:
                    if active_listings['assets'].has_key('730'):
                        active_listings = active_listings['assets']['730']['2']

                        for id in active_listings:
                            active_listings_list.append(id)

                        print type(active_listings_list)
                        return active_listings_list
                else:
                    return False
        else:
            return False

    #returns new active listings list or False
    def updateactivelistings(self):
        temp = self.getactivelistingsparsed()
        if temp != False:
            if type(self.log.writenewactivelistings(temp)) == list:
                print "NEW ACTIVE LISTINGS: \n"
                return self.log.ids_active_listings
        else:
            return False

    #ver se algum item nas active_listings vendeu
    #retorna uma nova active listings se sim
    #return a active listings se nao
    def seeifanyitemsold(self):

        active_listings = self.getactivelistingsparsed()
        if active_listings != False:
            if self.log.ids_active_listings != active_listings:
                self.log.writenewactivelistings(active_listings)
                print 'VENDI ITEMS!'
                return True
        else:
            print "ERROR"
            return False

    #todo
    def selltestfirst(self,item_name,id,price,trys):
        print 'selling item ' + item_name + ' with id ' + str(id)
        file_languages = open('util/languages.txt','r')
        languages = [line.rstrip('\n') for line in file_languages]
        sell_response = self.http.sellitem(id,float(price))
        if sell_response[0] is 200:
            print 'sold item'
            i = 0
            while i < trys:
                host = random.choice(self.log.list_hosts)
                recent_response = self.http.urlqueryrecentwithcountry(host,'US',0)
                language = random.choice(languages)
                item_response = self.http.urlqueryspecificitemind(host,item_name,language)

                if type(recent_response) is dict:
                    try:
                        for ids in recent_response['assets']['730']['2']:
                            if id == ids:
                                print "ENCONTREI O MEU ITEM NO RECENT COM O ID" + str(ids)
                    except (KeyError,ValueError):
                        print 'Error in finding the item on recent!'
                print
                if type(item_response) is dict:
                    try:
                        for ids in recent_response['assets']['730']['2']:
                            if id == ids:
                                print "ENCONTREI O MEU ITEM NO ITEM MODE COM O ID" + str(ids)
                    except (KeyError,ValueError):
                        print 'Error in finding the item on item mode!'
                i += 1
        else:
            print 'failed to sell item!'
            print sell_response[0]
            print '\n'
            print sell_response[1]

    #Searches for kennyS cooblestone cases on the newly listed
    #If it finds one it trys to buy it if not nothing happens
    def searchkenny(self,recent):
        try:
            if recent.has_key('assets'):
                if recent['assets'].has_key('730'):

                    for item_id in recent['assets']['730']['2']:
                        if recent['assets']['730']['2'][item_id]['market_hash_name'] \
                                == 'ESL One Cologne 2015 Cobblestone Souvenir Package':

                            if 'Kenny' in recent['assets']['730']['2'][item_id]['descriptions']['2']['value']:

                                for listing_id in recent['listinginfo']:
                                    if recent['listinginfo'][listing_id]['asset']['id'] == item_id:

                                        if int(recent['listinginfo'][listing_id]['converted_currencyid']) == 2003:

                                            if int(recent['listinginfo'][listing_id]['converted_fee']) + \
                                                int(recent['listinginfo'][listing_id]['converted_price']) <= 70000:

                                                if recent['listinginfo'][listing_id]['listingid'] != self.last_listing_buy:

                                                    self.last_listing_buy_lock.acquire()
                                                    self.last_listing_buy = recent['listinginfo'][listing_id]['listingid']
                                                    self.last_listing_buy_lock.release()

                                                    print 'Estou prestes a entrar no acquire dos buys ON THREAD ' + str(0)
                                                    self.buy_lock.acquire()
                                                    try:
                                                        print 'Entrei no acquire dos buys ON THREAD '  + str(0)

                                                        temp = self.http.buyitem(recent['listinginfo'][listing_id]['listingid'],
                                                                                 recent['listinginfo'][listing_id]['converted_price'],
                                                                                 recent['listinginfo'][listing_id]['converted_fee'],
                                                                                 recent['listinginfo'][listing_id]['converted_currencyid'])

                                                        self.log.writetobuyfile(self.http.httputil.data_buy['subtotal'],
                                                                                self.http.httputil.data_buy['fee'],
                                                                                self.http.httputil.data_buy,
                                                                                recent['listinginfo'][listing_id]['listingid'],
                                                                                recent['assets']['730']['2']
                                                                                [item_id]['market_hash_name']
                                                                                ,temp[0],temp[1],0)
                                                        self.buy_lock.release()
                                                        print 'sai do lock dos buys ON THREAD ' + str(0)
                                                    except:
                                                        print "something went wrong buying a kennys case, f**k me!"
                                                        self.buy_lock.release()
        except (ValueError,KeyError):
            print "Error in the kennyS function!"


#----------------------------------------------THREADING-----------------------------------------------------------

    #Gets the retrieved JSON all ready for the buying routine
    def getfinallistfromrecent(self,recent_full):
        temp_full = self.getRecentTotalReady(recent_full)
        temp1_assets = self.getCleanAssetList(temp_full)
        temp2_assets = self.getlistassets(temp1_assets)
        temp1_listings = self.delNonCsgoListings(temp_full)
        temp2_listings = self.getCleanListinginfoListWithAsset(temp1_listings)
        temp3_listings = self.getcleanlistings(temp2_listings)
        temp4_listings = self.getlistlistings(temp3_listings)
        temp_final = self.getfinalrecentlist(temp2_assets,temp4_listings)
        return temp_final

    #This function is a thread
    def recentthread(self,http_interval,name):
        counter = 0
        times = []
        while True:
            time.sleep(http_interval)

            if self.dif_hosts == 'yes':
                if self.dif_countries == 'yes':
                    recent = self.queryrecentdifhostsdifcountries(name)
                else:
                    recent = self.queryrecentdifhosts(name)

            elif self.dif_hosts == 'no':
                if self.dif_countries == 'yes':
                    recent = self.queryrecentdifcountries(name)
                else:
                    recent = self.queryrecent(name)

            if recent[0] == False:
                print "CONN REFUSED ON THREAD " + str(name) +", sleeping..."
                time.sleep(30)
                pass

            elif recent[0] == -1:
                    time.sleep(http_interval)

            elif recent[0] == -2:
                    sleepe = random.randint(16,31)
                    print 'TIMEOUT NA THREAD ' + str(name) + ' SLEEPING FOR ' + str(sleepe) + ' SECS'
                    time.sleep(sleepe)

            elif type(recent[0]) == dict:
                buygoodresp = self.buyingroutine(self.getfinallistfromrecent(recent[0]),name,recent[1])

                if buygoodresp[0] is True:

                    id_item_pos_one = self.getpositiononeiteminv()

                    lowest_price = self.getlowestprice(buygoodresp[2])

                    if ((float(lowest_price)+(0.02*float(lowest_price)))/float(buygoodresp[3])) >= 1.07:
                        price_sell = float(lowest_price)
                        price_sell_str = "{0:.2f}".format(price_sell)
                        print price_sell
                    else:
                        price_sell = float(buygoodresp[1] * 0.94)
                        price_sell_str = "{0:.2f}".format(price_sell)
                        print price_sell

                    price_sell_without_fee = price_sell/1.15
                    print price_sell_without_fee
                    sell_response = self.sellitem(id_item_pos_one,float(price_sell_without_fee))

                    print 'Estou prestes a entrar no acquire dos sells on THREAD ' + str(name)
                    self.sell_lock.acquire()
                    print 'entrei no lock dos sells'

                    if sell_response[0] == 200:
                        self.log.writetosellfile(sell_response[0],sell_response[1],buygoodresp[2],
                                                 price_sell_str,name,price_sell_without_fee)
                    elif sell_response[0] == 502:
                        self.log.writetosellfile(sell_response[0],sell_response[1],buygoodresp[2],
                                                 price_sell_str,name,price_sell_without_fee)

                    self.sell_lock.release()
                    print 'sai do lock dos sells ON THREAD ' + str(name)

                counter += 1
                if counter % 10 == 0:
                    print 'A THREAD ' + str(name) + ' ESTA OK!!!!!!!!!!!!!!!!!!!!!!'

                elif counter % 250 == 0:
                    self.write_active_listings_lock.acquire()
                    if self.seeifanyitemsold():
                        self.parsewalletbalanceandwrite()
                    self.write_active_listings_lock.release()
                    print "CHEGUEI AS " + str(counter) + ' SLEEPING NOW!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
                    time.sleep(random.randint(10,20))

            else:
                counter += 1
                if counter % 10 == 0:
                    print 'A THREAD ' + str(name) + ' ESTA OK!!!!!!!!!!!!!!!!!!!!!!'

                elif counter % 250 == 0:
                    self.write_active_listings_lock.acquire()
                    if self.seeifanyitemsold():
                        self.parsewalletbalanceandwrite()
                    self.write_active_listings_lock.release()
                    print "CHEGUEI AS " + str(counter) + ' SLEEPING NOW!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
                    time.sleep(random.randint(10,20))

                time.sleep(http_interval)


    def executethreads(self,n_threads,http_interval):
        list_threads = []

        for i in range(1,int(n_threads)+1):
            name = i
            t = threading.Thread(target=self.recentthread, args=(http_interval,name))
            t.start()
            list_threads.append(t)

        while True:
            for thread in list_threads:
                if not thread.is_alive():
                    list_threads.remove(thread)
                    print "Removed thread " + str(thread)
            time.sleep(900)
コード例 #2
0
ファイル: json_item.py プロジェクト: MisterO/Steam
class SteamJsonItem:

    def __init__(self,item,ind_hosts,dif_countries,wte,sma,sessionid,slc,sl,srl,password,username):
        self.recent_parsing_list = [u'results_html',u'hovers',u'app_data',u'currency',
                                    u'success',u'start',u'pagesize',u'total_count',u'assets']
        self.asset_parsing_list = ['currency','contextid','classid','instanceid','amount',
                                   'status','original_amount','tradable',
                                   'background_color','icon_url','icon_url_large','descriptions',
                                   'name','name_color','type',
                                   'market_name','market_actions','commodity','app_icon','owner','actions',
                                   'market_tradable_restriction']
        self.listinginfo_parsing_list = ['fee','publisher_fee_percent','currencyid','steam_fee','publisher_fee',
                                         'converted_steam_fee','converted_price_per_unit',
                                         'converted_fee_per_unit','converted_fee_per_unit',
                                         'converted_publisher_fee_per_unit','price',
                                         'publisher_fee_app','converted_steam_fee_per_unit']
        self.listinginfo_asset_parsing_list = ['currency','contextid','amount','market_actions','appid']
        self.item = item
        self.listinginfo_list = {}
        self.final_list_listings = {}
        self.final_list_assets = {}
        self.final_item = {}
        self.float100 = float(100)
        self.http = SteamBotHttp(wte,sma,sessionid,slc,sl,srl,password,username)
        self.log = Logic('item',ind_hosts,dif_countries,0)
        self.host_counter = 0
        self.contaSim = 0
        self.contaNao = 0

    def getitemtotalready(self, item_full):
        self.recent_parsed = {}
        if type(item_full) == dict:
            for key in self.recent_parsing_list:
                if item_full.has_key(key):
                    item_full.pop(key)
        else:
            item_full = {}
        #retorna um dict so com as keys assets e listinginfo
        self.recent_parsed = item_full


#-------------------------------------------------------------------------------------------------------------------
#-------------------------------------------ASSETS!!!!!!!!!!!!!!----------------------------------------------------
    '''
    #NAO EXECUTAR MANUALMENTE!!!!!!!!!!!!!!!!!!!!
    def getCleanAssetList(self):
        self.asset_list = {}
        if self.recent_parsed.has_key('assets'):
            self.asset_list = self.recent_parsed['assets']
            if self.asset_list.has_key('730'):
                self.asset_list = self.asset_list['730']
                self.asset_list = self.asset_list['2']
                for key_item in self.asset_list:
                    for key in self.asset_parsing_list:
                        if key in self.asset_list[key_item]:
                            self.asset_list[key_item].pop(key)
            else:
                return False
        else:
            return False

    #lista final dos assets = list2 = {'awp worm god':'231342342','ak47 redline':'432342342342',...}
    #nao executar, so no getfinallist()
    def getlistassets(self):
        try:
            self.final_list_assets = {}
            self.getCleanAssetList()
            for key_item in self.asset_list.keys():
                if self.asset_list[key_item].has_key('market_hash_name'):
                    self.final_list_assets[self.asset_list[key_item]['market_hash_name']] \
                    = self.asset_list[key_item]['id']
            return True
        except:
            print "falha no parsing dos assets"
            return False
    '''
#-------------------------------------------------------------------------------------------------------------------
#-------------------------------------------LISTINGS!!!!!!!!!!!--------------------------------------------------------

    #NAO EXECUTAR MANUALMENTE!!!!!!!!!!!!!!!!!!!!
    #1 a ser executada
    def delNonCsgoListings(self):
        self.listinginfo_list = {}
        if self.recent_parsed.has_key('listinginfo'):
            temp_list = self.recent_parsed['listinginfo']
            self.listinginfo_list = temp_list
            for k in self.listinginfo_list.keys():
                if self.listinginfo_list[k]['asset']['appid'] != 730:
                    self.listinginfo_list.pop(k)
                elif self.listinginfo_list[k]['asset']['amount'] == 0:
                    self.listinginfo_list.pop(k)
        else:
            return False

    #2 a ser executada
    #NAO EXECUTAR MANUALMENTE!!!!!!!!!!!!!!!!!!!!
    def getCleanListinginfoListWithAsset(self):
        for key_item in self.listinginfo_list:
            for key in self.listinginfo_parsing_list:
                if self.listinginfo_list[key_item].has_key(key):
                    self.listinginfo_list[key_item].pop(key)

    #3 a ser executada
    #NAO EXECUTAR MANUALMENTE!!!!!!!!!!!!!!!!!!!!
    def getcleanlistings(self):
        for key_item in self.listinginfo_list:
            for key in self.listinginfo_asset_parsing_list:
                if self.listinginfo_list[key_item]['asset'].has_key(key):
                    self.listinginfo_list[key_item]['asset'].pop(key)

    #lista final dos listings: list1 = {'231342342':'2.45','432342342342':'12.76',...
    #nao executar, so no getfinallist()
    def getlistlistings(self):
        self.final_list_listings = {}

        if self.delNonCsgoListings() != False:
            self.getCleanListinginfoListWithAsset()
            self.getcleanlistings()
            for key_item in self.listinginfo_list.keys():
                if self.listinginfo_list[key_item].has_key('converted_price') is False:
                    self.listinginfo_list.pop(key_item)
        else:
            return False
        #except:
            #print "falha no parsing da lista de listings"
            #return False

#-------------------------------------------------------------------------------------------------------------------

    def minpriceitem(self,dict):
        temp_simple = {}
        for keys in dict:
            temp_simple[keys] = dict[keys]['converted_price']
        return min(temp_simple,key=temp_simple.get)

    def getfinalitem(self):
        self.final_item = {}
        if self.getlistlistings() == False:
            print 'falha no parsing dos listings, try again'
            return False
        else:
            min_price_key = self.minpriceitem(self.listinginfo_list)
            for k in self.listinginfo_list:
                if k == min_price_key:
                    self.final_item[k] = self.listinginfo_list[k]
        return self.final_item

    def seeifindividualiteminlistbuy(self,item):
        if item == self.item:
            return True
        else:
            return False

    def buyingroutinesingleitem(self,median_price):
        temp_resp = []
        try:
            id = self.final_item.keys()[0]
        except:
            temp_resp.append(False)
            return temp_resp
        try:
            temp_converted_price_math = float(decimal.Decimal(self.final_item[id]['converted_price']) / 100)
            temp_converted_fee_math = float(decimal.Decimal(self.final_item[id]['converted_fee'])/100)
            if float(float(median_price) -
                    float((temp_converted_price_math+temp_converted_fee_math))) >= \
                    (0.275*float(median_price)):
                if (temp_converted_price_math+temp_converted_fee_math) <= (80*self.getwalletbalance()):
                    if int(self.final_item[id]['converted_currencyid']) == 2003:
                        if self.final_item['listingid'] != self.last_listing_buy:

                            self.last_listing_buy = self.final_item['listingid']

                            try:
                                if (float(median_price) - float(self.getlowestprice(self.item))) \
                                        >= (0.15*float(median_price)):
                                    print "O PRECO LOWEST E MT MAIS BAIXO QUE O MEDIO, NAO VOU COMPRAR"
                                    temp_resp.append(False)
                                    return temp_resp
                            except KeyError:
                                temp_resp.append(False)
                                return temp_resp
                            except TypeError:
                                temp_resp.append(False)
                                return temp_resp

                            temp = self.http.buyitem(self.final_item[id]['listingid'],
                                                     self.final_item[id]['converted_price'],
                                                     self.final_item[id]['converted_fee'],
                                                     self.final_item[id]['converted_currencyid'])

                            self.log.writetobuyfile(self.http.httputil.data_buy['subtotal'],
                                                    self.http.httputil.data_buy['fee'],
                                                 self.http.httputil.data_buy,
                                                    self.final_item[id]['listingid'],self.item,temp[0],temp[1],0)

                            if temp[0] == 200:
                                if temp[1]['wallet_info'].has_key('wallet_balance'):
                                    if self.log.writetowallet(temp[1]['wallet_info']['wallet_balance']) == True:
                                        print "Ok COMPREI A: " + self.item + " ao preco: " + \
                                              str(self.final_item[id]['converted_price'] +
                                                  self.final_item[id]['converted_fee'])
                                        temp_resp.append(True)
                                        temp_resp.append(median_price)
                                        temp_resp.append(self.item)
                                        temp_resp.append(temp_converted_fee_math+temp_converted_price_math)
                                        return temp_resp
                            else:
                                print "Nao pude comprar item " + self.item
                                print "erro ao comprar item"
                                temp_resp.append(False)
                                return temp_resp
                        else:
                            temp_resp.append(False)
                            return temp_resp
                else:
                    print "Nao pude comprar: " + self.item +" porque nao tenho fundos"
                    temp_resp.append(False)
                    return temp_resp
            else:
                print "THREAD " + str(0) + " nao pode comprar " + self.item + \
                        " porque margens nao sao suficientes. " \
                        "Preco medio: " + str(median_price) +\
                        ' Preco do item: ' + str(temp_converted_fee_math+temp_converted_price_math)
                temp_resp.append(False)
                return temp_resp
        except ValueError, KeyError:
            print "float not valid"
            temp_resp.append(False)
            return temp_resp
        temp_resp.append(False)
        return temp_resp