Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
ММм а поподрбнее про золиан? ЧТо то после запрета баксовых его стали продавать тоннами...я прикупил уже, может какой баг есть на его выращивание, в чем подвох? Или обычное поведение рынка?
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
народ, такое дело, решил восстановить бота, и в следствии чего возник такой вопрос, в данном пункте все модификации есть для исправления http://zhyk.ru/forum/showpost.php?p=...postcount=3143 , или что-либо уже не актуально и нужно делать по другому, или может нужно что-либо добавить
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от doubleaggent
народ, такое дело, решил восстановить бота, и в следствии чего возник такой вопрос, в данном пункте все модификации есть для исправления http://zhyk.ru/forum/showpost.php?p=...postcount=3143 , или что-либо уже не актуально и нужно делать по другому, или может нужно что-либо добавить
давно уже есть решение проблемы более простым методом)
это message_factory.py
PHP код:
# coding=utf8 from read_swf import swf2functions import urllib2 import hashsum import json import collections import os import subprocess import _subprocess import random import logging
logger = logging.getLogger(__name__)
def __saltFunction(string): result = "" # from classWithGo result += str(len(string)) + hashsum._md5hash(string + "stufff...") salt13 = str(len(string) * 17 + 13) #то , что заменили #salt13 = str(len(string) * 13) # from main.initialize salt2 = hashsum._md5hash(salt13 + str(len(string))+ str(len(salt13))) #то , что заменили #salt2 = hashsum._md5hash(salt13 + str(len(salt13)) + str(len(string))) result += salt2 characterSum = 0 # calc sum of byte codes in a string for i in range(0, len(string)): characterSum += (ord(string[i]) & 250) #то , что заменили #characterSum += (ord(string[i]) & 255) result += str(characterSum) return result
Sig = sessionKey + str(requestId) + authKey Sig += __saltFunction(Sig) Sig = hashsum._md5hash(Sig) return Sig
def calcAuth(requestId, authKey): auth = str(requestId) + authKey auth += __saltFunction(auth) sig = hashsum._md5hash(auth) return sig
class Session(): ''' This class represents session data needed to authenticate and sign messages ''' def __init__(self, user_id, auth_key, client_version=1362084734, session_key=None): self.__user_id = user_id # vk user id self.__session_key = session_key # session key from TIME request self.__auth_session_key = None # key from TIME response self.__auth_key = auth_key # auth key from vk.com flashvars self.CLIENT_VERSION = client_version
class Factory(): ''' This class will be used to generate signed messages ''' def __init__(self, session, base_request_id=None): if base_request_id is None: base_request_id = _getInitialId() self.__session = session assert isinstance(self.__session, Session) self.BASE_REQUEST_ID = base_request_id # "magick" initial value self.__request_id = self.BASE_REQUEST_ID
def createRequest(self, data, data_keys_order=None): request_data = {} request_data['data'] = self.__createDataValue(data, data_keys_order) request_data['crc'] = calcCRC(request_data['data']) return Request(request_data) def calcSig(self,sessionKey, requestId, authKey): postfix = sessionKey.split(':')[1] if not hasattr(self,'postfix') or self.postfix != postfix: self.postfix = postfix url = base_redirect_url+'/salt' #logger.info('Getting %s?postfix=%s'%(url,postfix)) opener = urllib2.build_opener() response = opener.open(url, 'postfix='+postfix, timeout=8) if response: content = response.read() response.close() else: raise GameError("Cannot load salt swf") self.functions = swf2functions(content,postfix) sig = sessionKey + str(requestId) + authKey saltFunction_sig = sig for f in self.functions: saltFunction_sig = f(saltFunction_sig) sig += saltFunction_sig sig = hashsum._md5hash(sig) return sig
def __createDataValue(self, data, data_keys_order): if data_keys_order is None: data_keys_order = _getDataKeyOrder(data['type']) datacopy = data.copy() datacopy['user'] = str(self.__session.getUserId()) datacopy['id'] = self.__request_id datacopy['sig'] = '' datacopy['auth'] = '' datacopy['clientVersion'] = self.__session.CLIENT_VERSION data_value = collections.OrderedDict() for key in data_keys_order: if key in datacopy: data_value[key] = datacopy[key] message_type = datacopy['type'] if message_type == 'START': info_keys = ["uid", "bdate", "country", "first_name", "sex", "city", "last_name"] data_value['info'] = collections.OrderedDict() for info_key in info_keys: if info_key in datacopy['info']: data_value['info'][info_key] = datacopy['info'][info_key] self.__addSigOrAuth(data_value) result = json.dumps(data_value, separators=(',', ':'), ensure_ascii=False, encoding="utf-8") self._generateRequestId() return result
if sessionKey is not None: objectData["sig"] = self.calcSig(sessionKey, self.__request_id, auth_key) else: objectData["auth"] = calcAuth(self.__request_id, auth_key) if authSessionKey is not None: objectData["key"] = authSessionKey return objectData
class Request(): ''' This class represents a POST body ready to be send via HTTP ''' def __init__(self, data): self.__data = data
def __str__(self): return str(self.__data)
def getData(self): return self.__data
def send(self, connection): ''' Sends request data to server, handles redirect Returns response as dict ''' response = self.send_request_get_response(connection)
global base_redirect_url response = self.send_request_get_response(connection) if 'redirect' in response: #with open("sig\\bin\\url.txt",'wt') as f: # f.write(response['redirect']) base_redirect_url = response['redirect'] server_url = response['redirect'] + '/go' connection.setUrl(server_url)
if 'cmd' in response: if response['cmd'] == 'REDIRECT': # send request again with new url response = self.send_request_get_response(connection) elif response['cmd'] == 'ERR': error_msg = response["msg"] logger.error(error_msg) # TODO send error to the game server open('error_log.txt','a').write("Connection: " + str(self.getData())+'\nResponse: '+str(response)+'\n\n') logger.info("Connection : " + str(self.getData())) logger.info("Response : " + str(response)) raise GameError("Game server returned error: " + error_msg) return response
class Response(): ''' This class represents a response ''' def __init__(self, response_string): if '$' in response_string: crc, response = response_string.split("$", 1) if(calcCRC(response) != crc): raise ValueError("CRC is invalid: " + crc) else: response = response_string self.__response = json.loads(response)
def getDict(self): return self.__response
def _getInitialId(): ''' flash.utils.getTimer() called to get initial request id. http://help.adobe.com/en_US/FlashPlatform/reference/ actionscript/3/flash/utils/package.html#getTimer() varies randomly from 40 to 60 ''' random.seed() return random.randrange(40, 60)
def read_method(self): ''' method_info { u30 param_count u30 return_type u30 param_type[param_count] u30 name u8 flags option_info options param_info param_names } ''' data={} data['param_count']=self.readU30() data['return_type']=self.readU30() #multiname data['param_type']=[] for i in xrange(data['param_count']): data['param_type'].append(self.readU30()) #multiname data['name']=self.readU30() #string data['flags']=self.readUI8() flags={'NEED_ARGUMENTS': 0x01, 'NEED_ACTIVATION': 0x02, 'NEED_REST': 0x04, 'HAS_OPTIONAL': 0x08, 'SET_DXNS': 0x40, 'HAS_PARAM_NAMES': 0x80} if data['flags'] & flags['HAS_OPTIONAL']: data['option_info']=self.read_method_option_info() ## if data['flags'] & flags['HAS_PARAM_NAMES']: data['param_name']=[] for i in xrange(data['param_count']): data['param_name'].append(self.readU30()) #string return data
def read_metadata(self): res_metadata=[] res_metadata_count = self.readU30() for i in xrange(res_metadata_count): metadata={} metadata['name']=self.readU30() metadata['item_count']=self.readU30() metadata['items']=[(self.readU30(),self.readU30()) for j in xrange(metadata['item_count'])] res_metadata.append(metadata) return res_metadata_count, res_metadata
def read_instance(self): ''' instance_info { u30 name u30 super_name u8 flags u30 protectedNs u30 intrf_count u30 interface[intrf_count] u30 iinit u30 trait_count traits_info trait[trait_count] }''' data={} data['name']=self.readU30() #multiname data['super_name']=self.readU30() #multiname data['flags']=self.readUI8() flags={'ClassSealed': 0x01, 'ClassFinal': 0x02, 'ClassInterface': 0x04, 'ClassProtectedNs': 0x08, } if data['flags'] & flags['ClassProtectedNs']: data['protectedNs']=self.readU30() #namespace data['intrf_count']=self.readU30() data['interface']=[self.readU30() for i in xrange(data['intrf_count'])] #multiname self.read_class(data) return data
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от zloy_gnom_2012
давно уже есть решение проблемы более простым методом)
благодарю за столь быстрый ответ спасибо все работает!!
У меня еще такой вопрос, не подскажите хоть примерно где искать активацию супер урожая, а то она мне не нужна на данный момент а активация осуществляется автоматически
Последний раз редактировалось doubleaggent; 12.12.2014 в 12:46.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от 3HtSCtBGcBOf
а чем вас этот бот не устраивает?
[Ссылки могут видеть только зарегистрированные пользователи. ]
привет, для начала его нельзя под себя написать.....что то подправить так, как нужно именно тебе, что то добавить свое, а не постоянно бегать к нашему уважаемому автору и писать - добавь это, добавь то и так далее и тому подобное. хотя я может не прав, надеюсь кто то допишет мою мысль)
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
понятно,но в основном то бот полностью функционален,все что необходимо бот делает,а по поводу бегать или нет,думаю можно собрать список пожеланий и отправить автору!Лично меня этот бот полностью устраивает,если бы я конечно и соображал в программировании,то возможно согласился бы с Вами)
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от 3HtSCtBGcBOf
понятно,но в основном то бот полностью функционален,все что необходимо бот делает,а по поводу бегать или нет,думаю можно собрать список пожеланий и отправить автору!Лично меня этот бот полностью устраивает,если бы я конечно и соображал в программировании,то возможно согласился бы с Вами)
Согласен, функционал не плохой у него, но вот лично я не пользуюсь им так-как он платный, а платить каждый месяц хоть и не большую цену у меня нет желания, так-как есть и бесплатные боты с почти таким же функционалом, да и это все го лишь игра и вложения в неё не имеют смысла