Можем ли мы отправить сообщение пользователю в slack, используя скрипт Python?

Можем ли мы в слабой команде отправить сообщение пользователю с помощью python? Я видел различные API, они предлагают сообщение для канала, но не для конкретного пользователя. Можем ли мы это сделать?


person Vikas Saini    schedule 18.01.2016    source источник


Ответы (6)


Да, это можно сделать. Вместо «#channel_name» используйте «@user» в API. Пользователь получит сообщение от slackbot, поскольку мы используем API, а не прямое сообщение от любого другого пользователя. И если вы хотите отправить сообщение этому пользователю как аутентифицированному пользователю, используйте as_user= true.

slack.chat.post_message('@to_user',msg,username='@from_user')

Дополнительные сведения см. на странице https://api.slack.com/methods/chat.postMessage.

person Deepali Mittal    schedule 18.01.2016
comment
Вы можете дать более подробную информацию? - person Vikas Saini; 18.01.2016
comment
Используйте тот же код Python, который вы использовали для отправки сообщений на канал. API также остается прежним. Единственное изменение — вместо канала упомяните пользователя (которому вы хотите отправить сообщение). Я дал код выше, который работает для меня. Попробуйте один раз, и если это не сработает, поделитесь фактической ошибкой или проблемой, с которой вы столкнулись. - person Deepali Mittal; 19.01.2016
comment
когда я использую это, он говорит, что объект ошибки «SlackClient» не имеет атрибута «чат» - person Vikas Saini; 19.01.2016
comment
Вы установили слабый модуль? Если нет, используйте это .. pip install slacker и pip install pyslack - person Deepali Mittal; 20.01.2016
comment
Из документов Slack: мы прекращаем поддержку двусмысленной передачи имени пользователя в качестве значения канала. Вместо этого всегда используйте идентификаторы каналов. - person Ufuk Hacıoğulları; 10.12.2017
comment
То, что сказал @UfukHacıoğulları, кажется правильным. Документы утверждают это, и API вернет channel_not_found при chat.postMessage-вызове. - person Jari Turkia; 20.02.2018
comment
Интересно, почему они сделали это намного сложнее сделать. Есть ли у кого-нибудь пример использования im.list, чтобы попытаться получить канал для отправки @user ? - person Drew; 21.02.2018
comment
slack по умолчанию не известен python. - person Sören; 23.06.2019

Это было решение Python, которое я нашел с помощью пакета SlackClient:

from slackclient import SlackClient

slack_token = os.environ["SLACK_API_TOKEN"]
sc = SlackClient(slack_token)

sc.api_call(
  "chat.postMessage",
  channel="@username",
  text="Test Message"
)

https://pypi.python.org/pypi/slackclient

person running-codebase    schedule 19.07.2017
comment
Единственное, что с этим связано, это то, что он не отображается в прямом сообщении с пользователем, а скорее в канале SlackBot пользователя (при использовании бота) - person Elliptica; 27.08.2018

Простое решение использует Slack Web API и requests:

import requests

# slack access bot token
slack_token = "xpxb-9534042403-731932630054-KSwhrmhg87TXGuF23Z4ipTRm"

data = {
    'token': slack_token,
    'channel': 'UJ24R2MPE',    # User ID. 
    'as_user': True,
    'text': "GO Home!"
}

requests.post(url='https://slack.com/api/chat.postMessage',
              data=data)

userID вы можете получить здесь:

введите описание изображения здесь

person Andrey Suglobov    schedule 17.08.2019
comment
Вы можете заменить свой идентификатор пользователя буквальной строкой имени пользователя @slackname (которую вы обычно используете в чате slack) ... это тоже работает - person Scott; 29.10.2019

Вы можете получить список пользовательских каналов обмена мгновенными сообщениями и опубликовать свое сообщение на любом канале обмена мгновенными сообщениями (прямой обмен сообщениями).

from slackclient import SlackClient

SLACK_TOKEN = "xoxb-bottoken" # or a TEST token. Get one from https://api.slack.com/docs/oauth-test-tokens

slack_client = SlackClient(SLACK_TOKEN)
api_call = slack_client.api_call("im.list")

# You should either know the user_slack_id to send a direct msg to the user
user_slack_id = "USLACKBOT"

if api_call.get('ok'):
    for im in api_call.get("ims"):
        if im.get("user") == user_slack_id:
            im_channel = im.get("id")
            slack_client.api_call("chat.postMessage", channel=im_channel,
                                       text="Hi Buddy", as_user=True)
person Prashanth    schedule 27.12.2016
comment
Ничего против вас или вашего кода, но это так уродливо. Если все, что у нас есть, это имя пользователя, нам нужно сначала выполнить поиск user_id, а затем еще один im.list, чтобы найти канал? Три вызова API для отправки сообщения пользователю? - person Drew; 21.02.2018

Как сказал Дипали, просто передайте @user в параметр канала. Вы также можете использовать API конечной точки Slack postMessage в RapidAPI здесь. Эта страница позволит вам сгенерировать код, необходимый для выполнения вызова API в Python, и протестировать вызов API.

Код, который RapidAPI сгенерирует для вас, будет выглядеть так:

    from rapidconnect import RapidConnect
    rapid = RapidConnect("SlackIntegration", "3b744317-91c6-48e8-bc90-305a52f36a5f")

    result = rapid.call('Slack', 'postMessage', { 
        'token': '',
        'channel': '',
        'text': '',
        'parse': '',
        'linkNames': '',
        'attachments': '',
        'unfurlLinks': '',
        'unfurlMedia': '',
        'username': '',
        'asUser': '',
        'iconUrl': '',
        'iconEmoji': ''

    })
person David Noah    schedule 02.02.2017

Я основывал свой пример на этом руководстве: build-first-slack -бот-питон

С этим я смог решить проблему, просто позвонив:

userChannel = slack_client.api_call(
    "im.open",
    user=auser
)

затем отправка сообщения

slack_client.api_call(
        "chat.postMessage",
        channel=userChannel['channel']['id'],
        text=response or default_response, 
        as_user=True
    )

После этого все, казалось, работало так, как ожидалось. Я хотел бы создать что-то похожее на интерфейс "/gifs" в будущем.

person James Nelson    schedule 27.02.2018