我正在使用slackclient使用以下python代码测试松弛API:
# pip install slackclient to install SlackClient library
from slackclient import SlackClient
import json
import time
def test_slack(sc):
# use for debugging
print("Testing API")
print(80 * "=")
print (sc.api_call("api.test"))
def get_channel_info(sc, channel):
# get info about the channel
print("Getting Channel Info")
print(80 * "=")
print (sc.api_call("channels.info", channel=channel))
def get_list_of_channels(sc):
print("Getting List of Channels")
print(80 * "=")
# get list of channels
channels = sc.api_call("channels.list")
channels = json.dumps(channels)
channels = json.loads(str(channels))
print channels
return channels
def display_channels(channels):
print("Display Channels")
print(80 * "=")
for i in channels['channels']:
print("Channel:", i['name'], i['id'])
def post_message(sc, text, channel, icon_url, username):
print("Posting Message to Slack")
print(80 * "=")
# post a message into the #general channel
print (sc.api_call("chat.postMessage", channel=channel, text=text, username=username, icon_url=icon_url,
unfurl_links="true"))
def get_users(sc):
print("Get Users")
print(80 * "=")
# call the users.list api call and get list of users
users = (sc.api_call("users.list"))
print users
users = json.dumps(users)
users = json.loads(str(users))
return users
def display_users(sc, users):
print("User List")
print(80 * "=")
# display active users
for i in users['members']:
print users
# don't display slackbot
if i['profile']['real_name'] != "slackbot":
# don't display deleted users
if not i['deleted']:
# display real name
print (i['profile']['real_name'])
def main():
# define variables
token = "HERE YOUR SLACK TESTER TOKEN"
channel = "general"
username = "moderator"
icon_url = ""
# connect to Slack
sc = SlackClient(token)
# test slack
test_slack(sc)
# get channel info
get_channel_info(sc, channel)
# get list of channels
channels = get_list_of_channels(sc)
# display channels
display_channels(channels)
# post message
post_message(sc, "Testing 123 testing 123.", channel, icon_url, username)
# get users
users = get_users(sc)
# display users
display_users(sc, users)
if sc.rtm_connect():
while True:
for slack_message in sc.rtm_read():
print slack_message
message = slack_message.get("text")
user = slack_message.get("user")
if not message or not user:
continue
print "User: ", user, message
time.sleep(3)
else:
print "Connection Failed, invalid token?"
main()
这在PyCharm环境或python命令行中运行良好。 在使用PyInstaller构建一个windows exe后,应用程序无法连接,因为rtm_connect()始终返回False。令牌或其他任何内容尚未更改。
有关如何调试此问题或任何可能导致连接问题的想法的任何建议?
PyInstaller脚本:
# -*- mode: python -*-
import os
from os.path import join
datas = []
# list of modules to exclude from analysis
excludes = ['Tkinter', '_tkinter', 'twisted', 'pygments']
# list of hiddenimports
hiddenimports = []
# binary data
bin_tocs = []
# assets
tocs = []
a = Analysis(['slacktest.py'],
pathex=[os.getcwd()],
binaries=None,
datas=datas,
hiddenimports=hiddenimports,
hookspath=[],
runtime_hooks=[],
excludes=excludes,
win_no_prefer_redirects=False,
win_private_assemblies=False)
pyz = PYZ(a.pure, a.zipped_data)
exe1 = EXE(pyz,
a.scripts,
name='slacktest',
exclude_binaries=True,
debug=False,
strip=False,
upx=True,
console=True)
coll = COLLECT(exe1,
a.binaries,
a.zipfiles,
a.datas,
*tocs,
strip=False,
upx=True,
name='slacktest')
答案 0 :(得分:0)
对于那些对解决方案感兴趣的人,我在此发布了由签约开发人员开发的解决方案的详细信息......
问题是由于缺少包含" cacert.pem"的websocket文件夹引起的。文件。 PyInstaller脚本在下面更新,以便" cacert.pem"文件复制到分发目录中。
这是PyInstaller缺少的功能。 解决这个问题的正确方法是提交" hook-websocket.py"到PyInstaller的钩子,以便它可以包含在PyInstaller的下一个版本中。 钩子文件应该类似于hook-requests.py。
此外,slackclient应该引发错误或记录消息,而不是仅仅在rtm_connect方法中返回False。
# -*- mode: python -*-
import os
import websocket
from os.path import join, dirname, basename
from PyInstaller.compat import modname_tkinter
block_cipher = None
websocket_lib_path = dirname(websocket.__file__)
websocket_cacert_file_path = join(websocket_lib_path, 'cacert.pem')
analysis_data = [
# For websocket library to find "cacert.pem" file, it must be in websocket
# directory inside of distribution directory.
# This line can be removed once PyInstaller adds hook-websocket.py
(websocket_cacert_file_path, join('.', basename(websocket_lib_path)))
]
a = Analysis(['slacktest.py'],
pathex=[os.getcwd()],
binaries=None,
datas=analysis_data,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[modname_tkinter],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='slacktest',
debug=False,
strip=False,
upx=True,
console=True)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='slacktest')