slackapi / slackapi/bolt-python
`extract_team_id` crashes with `TypeError when payload["user"]` is a string (e.g. `member_joined_channel` events)
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 1.3k
- Forks
- 288
- Merge moyen
- 1 j 8 h
- PR mergées (30 j)
- 10
Description
Reproducible in:
The slack_bolt version
slack-bolt==1.27.0
slack-sdk==3.39.0
Python runtime version
Python 3.14.0
OS info
ProductName: macOS
ProductVersion: 26.3
BuildVersion: 25D125
Darwin Kernel Version 25.3.0: Wed Jan 28 20:53:05 PST 2026; root:xnu-12377.81.4~5/RELEASE_ARM64_T6020
Steps to reproduce:
- Register a
member_joined_channellistener in a Slack Bolt app:
@app.event("member_joined_channel")
def handle_channel_join(event, client, say):
say("Hello!")
-
Add the bot to any Slack channel.
-
Observe the incoming event payload — Slack sends
"user"as a plain string (the user ID):
{
"type": "member_joined_channel",
"user": "U0123456789",
"channel": "C0123456789",
"team": "T0123456789"
}
Expected result:
The listener is invoked normally.
Actual result:
The request crashes before the listener is reached, with:
TypeError: string indices must be integers, not 'str'
File "slack_bolt/adapter/aws_lambda/handler.py", line 87, in to_bolt_request
return BoltRequest(
File "slack_bolt/request/request.py", line 69, in __init__
self.context = build_context(BoltContext(context if context else {}), self.body)
File "slack_bolt/request/internals.py", line 276, in build_context
team_id = extract_team_id(body)
File "slack_bolt/request/internals.py", line 116, in extract_team_id
return payload["user"]["team_id"]
Root cause
extract_team_id in slack_bolt/request/internals.py assumes payload["user"] is always a dict:
if payload.get("user") is not None:
return payload["user"]["team_id"]
But member_joined_channel sends "user" as a plain string (the user ID). Accessing "U0123456789"["team_id"] raises the TypeError.
The same function already handles payload["team"] correctly with an isinstance check:
if payload.get("team") is not None:
team = payload.get("team")
if isinstance(team, str):
return team
elif team and "id" in team:
return team.get("id")
The same guard is missing for payload["user"]. This pattern (subscribing to member_joined_channel and checking if the joined user is the bot) is what maintainers recommend in #710, so users following that guidance will hit this bug.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez dans slack_bolt/request/internals.py, au niveau de extract_team_id, puis examinez la gestion existante du type de payload["team"]. Reproduisez le payload member_joined_channel avec une valeur user de type chaîne et vérifiez que le traitement de la request atteint le listener sans TypeError. Le travail est terminé lorsque les champs user contenant des valeurs de type chaîne ne provoquent plus d’erreur lors de l’extraction de l’ID de l’équipe et que les formats de payload existants continuent de fonctionner.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- api, backend
- Type d'issue
- Bug
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Activité
- Calme
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 72/100