2016-06-27 101 views
0

我試圖寫一個非常基本的slackbot,從查找機器人的 user_id開始,這比我期待的要困難得多。我可以從documentation得出的唯一方法是拉出每個用戶的列表,然後爲我的機器人用戶搜索該列表。這似乎有點奇怪,所以如果任何人都可以提出一個更好的方法,我是全部耳朵。爲什麼我的代碼打印「if」結果和「else」結果?

但現在正在發生的事情是,它找到的USER_ID,然後繼續嗆:

Ready to look for REDACTED 
<type 'dict'> 
2016-06-27 20:22:05.380408 DEBUG REDACTED : ABC123 
2016-06-27 20:22:05.381173 DEBUG No user found named REDACTED 
2016-06-27 20:22:05.385158 DEBUG ABC123 

這是我的代碼:

from slackclient import SlackClient 
import re 

class Bot(object): 

    def __init__(self, token, username): 
     self.client = SlackClient(token) 
     self.username = username 
     self.user_id = {} 


    def run(self): 
     if self.client.rtm_connect(): 
      self.user_id = self.whoami(self.client.server.username) 
     else: 
      print("Connection failed.") 

    def whoami(self, username): 
     """ 
     finds the ID for this username. 
     """ 
     all_users = self.client.api_call("users.list") 
     print "Ready to look for " + username 

     for user in all_users['members']: 
      if re.match(username, user['name']): 
       print(user['name'] + " : " + user['id']) 
       user_id = user['id'] 
     if (user_id not in locals()): 
      print("No user found named " + username) 
     else: 
      print(user_id) 
     return user_id 

然後我把它叫做:

api_token = 'redacted' 
username = 'redacted' 

first_bot = Bot(api_token, username) 
first_bot.run() 

我想弄清楚爲什麼它找到用戶,然後立即說「找不到用戶」 - 然後打印user_id - 我希望它打印一個或另一個。

+2

哎呀,什麼可怕的代碼!不要使用'locals()'!首先要檢查你想要什麼,你應該在'loca()'中引用'user_id'而不是'user_id',否則yuo會得到'UnboundLocalError'。相反,你應該從循環中斷開並使用'for'循環的'else'子句。 – Bakuriu

+0

至少在python 3中,如果你在'locals()'中檢查一個變量,如果不作爲字符串傳遞,你會得到'False'。 'n在當地人()'→'假'; ''n'in locals()'→'True' – Luis

+0

@Bakuriu我想你的意思是說「locals()」不是一個很好的方法來確定變量是否已被設置,因爲{reason} 。但是你遺漏了{reason}部分:)至少有一個問題明確推薦在'quotes''中使用'locals()'tho ...和變量名。 – Amanda

回答

0

我覺得if ("user_id" not in locals()):(注意周圍user_id引號)會做的伎倆,但我會用locals()強烈建議

這裏有許多可能的解決方法之一:

def whoami(self, username): 
    """ 
    finds the ID for this username. 
    """ 
    all_users = self.client.api_call("users.list") 
    print "Ready to look for " + username 

    user_id = None 

    for user in all_users['members']: 
     if re.match(username, user['name']): 
      self._log(user['name'] + " : " + user['id']) 
      user_id = user['id'] 

    if user_id is None: 
     self._log("No user found named ") 

    return user_id 

編輯

而且,沒有經過充分測試,但這裏有一個更好的方式來獲得機器人的用戶ID:

def whoami(self): 
    """ 
    finds the bot's user ID 
    """ 

    return self.client.api_call("auth.test")["user_id"] 
+0

fwiw,機器人不能調用'bots.info' - 這只是返回一個錯誤,「用戶是一個機器人。」似乎對我很直觀,但那是另一回事。 – Amanda

+0

@Amanda糟糕,取而代之的是'auth.test'。 – smarx

相關問題