Как перезапустить бота Telegram на Python (с начальным состоянием переменных) для нового клиента?

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

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)

person Dennix    schedule 24.03.2016    source источник
comment
Переменная x предназначена для каждого пользователя или должна использоваться глобально? PS. Я знаю, что вы заявили об этом global, но я хочу быть уверен в ваших намерениях.   -  person unnikked    schedule 24.03.2016
comment
Хочу бросить х каждому новому пользователю. Но я не знаю, как это правильно делать.   -  person Dennix    schedule 24.03.2016
comment
Каждый пользователь, который подключается к боту, должен начать работу со сценарием, как никто другой, и сценарий для него впервые с начальным состоянием, например. х = 0.   -  person Dennix    schedule 24.03.2016
comment
x следует хранить для каждого пользователя, а не как глобальную переменную. Глобальная переменная используется для всех запросов к конкретному экземпляру.   -  person marcadian    schedule 25.03.2016
comment
Я понимаю это, но не знаю, как именно это сделать   -  person Dennix    schedule 25.03.2016


Ответы (1)


Вместо переменной x вы можете использовать словарь Python следующим образом:

x = {}

а затем используйте это так -

key = str(chat_id)
if key in x:
  x[key] += 1
else:
  x[key] = 1
person lamirap    schedule 28.03.2016