0

это мой первый вопрос здесь. Я пытаюсь переписать телеграмму бота в Python. И я не могу решить одну проблему. Когда я сам тестирую свой бот, все хорошо, но если другой пользователь подключается к моему бот-скрипту, он не запускается для него с начальным состоянием переменных. Например, в этом скрипте сценария приращение переменной x, когда пользователь отправляет «1». Но для нового пользователя x уже не null. Пожалуйста, помогите мне исправить это.Как перезапустить бот телеграммы в Python (с начальным состоянием переменных) для нового клиента?

import StringIO 
import json 
import logging 
import random 
import urllib 
import urllib2 

# for sending images 
from PIL import Image 
import multipart 

# standard app engine imports 
from google.appengine.api import urlfetch 
from google.appengine.ext import ndb 
import webapp2 

TOKEN = 'TOKEN HERE' 

BASE_URL = 'https://api.telegram.org/bot' + TOKEN + '/' 

x = 0 

# ================================ 

class EnableStatus(ndb.Model): 
# key name: str(chat_id) 
enabled = ndb.BooleanProperty(indexed=False, default=False) 


# ================================ 

def setEnabled(chat_id, yes): 
es = EnableStatus.get_or_insert(str(chat_id)) 
es.enabled = yes 
es.put() 

def getEnabled(chat_id): 
es = EnableStatus.get_by_id(str(chat_id)) 
if es: 
    return es.enabled 
return False 


# ================================ 

class MeHandler(webapp2.RequestHandler): 
def get(self): 
    urlfetch.set_default_fetch_deadline(60) 
    self.response.write(json.dumps(json.load(urllib2.urlopen(BASE_URL + 'getMe')))) 


class GetUpdatesHandler(webapp2.RequestHandler): 
def get(self): 
    urlfetch.set_default_fetch_deadline(60) 
    self.response.write(json.dumps(json.load(urllib2.urlopen(BASE_URL + 'getUpdates')))) 


class SetWebhookHandler(webapp2.RequestHandler): 
def get(self): 
    urlfetch.set_default_fetch_deadline(60) 
    url = self.request.get('url') 
    if url: 
     self.response.write(json.dumps(json.load(urllib2.urlopen(BASE_URL + 'setWebhook', urllib.urlencode({'url': url}))))) 


class WebhookHandler(webapp2.RequestHandler): 
def post(self): 
    urlfetch.set_default_fetch_deadline(60) 
    body = json.loads(self.request.body) 
    logging.info('request body:') 
    logging.info(body) 
    self.response.write(json.dumps(body)) 

    update_id = body['update_id'] 
    message = body['message'] 
    message_id = message.get('message_id') 
    date = message.get('date') 
    text = message.get('text') 
    fr = message.get('from') 
    chat = message['chat'] 
    chat_id = chat['id'] 

    if not text: 
     logging.info('no text') 
     return 
    def reply(msg=None, img=None): 
     if msg: 
      resp = urllib2.urlopen(BASE_URL + 'sendMessage', urllib.urlencode({ 
       'chat_id': str(chat_id), 
       'text': msg.encode('utf-8'), 
       'disable_web_page_preview': 'true', 
       #'reply_to_message_id': str(message_id), 
      })).read() 
     elif img: 
      resp = multipart.post_multipart(BASE_URL + 'sendPhoto', [ 
       ('chat_id', str(chat_id)), 
       #('reply_to_message_id', str(message_id)), 
      ], [ 
       ('photo', 'image.jpg', img), 
      ]) 
     else: 
      logging.error('no msg or img specified') 
      resp = None 

     logging.info('send response:') 
     logging.info(resp) 

    if text.startswith('/'): 
     if text == '/start': 
      reply('Bot start') 
      setEnabled(chat_id, True) 
     elif text == '/stop': 
      reply('Bot disabled') 
      setEnabled(chat_id, False) 
     else: 
      reply('What command?') 

    elif '1' in text: 
     global x 
     x = x + 1 
     reply(str(x)) 
    else: 
     if getEnabled(chat_id): 
      reply('?') 
     else: 
      logging.info('not enabled for chat_id {}'.format(chat_id)) 


app = webapp2.WSGIApplication([ 
('/me', MeHandler), 
('/updates', GetUpdatesHandler), 
('/set_webhook', SetWebhookHandler), 
('/webhook', WebhookHandler), 
], debug=True) 
+0

Параметр 'x' переменная для каждого пользователя или должны делиться глобально? PS. Я знаю, что вы объявили его «глобальным», но я хочу быть уверенным в ваших намерениях. – unnikked

+0

Я хочу удалить x каждому новому пользователю. Но я не знаю, как это сделать правильно. – Dennix

+0

Каждый пользователь, который подключается к боту, должен начинать работу со сценарием, как никакие другие пользователи, и сценарий впервые для него с начальным состоянием, например. х = 0. – Dennix

ответ

0

Вместо переменной х, вы можете использовать словарь питона, как это -

x = {} 

, а затем использовать его как это -

key = str(chat_id) 
if key in x: 
    x[key] += 1 
else: 
    x[key] = 1