0

これは私の最初の質問です。私はPythonで電報ボットを書き直そうとしています。私は1つの問題を解決できません。私が自分で自分のボットをテストすると、うまくいっていますが、他のユーザーがボットスクリプトに接続すると、変数の初期状態で彼のために起動しません。たとえば、このコードスクリプトでは、ユーザーが「1」を送信すると変数xがインクリメントされます。しかし、新しいユーザー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

ボットに接続するすべてのユーザーは、他のユーザーのようにスクリプトを使用して作業を開始する必要があります。 x = 0である。 – Dennix

答えて

0

代わりに変数xの、あなたはこのようにPythonの辞書を使用することをお勧めします -

x = {} 

し、このようにそれを使用する -

key = str(chat_id) 
if key in x: 
    x[key] += 1 
else: 
    x[key] = 1 
関連する問題