如何通过脚本远程获取GitHub私有仓库PR描述中的图片?
如何在脚本中下载私有GitHub仓库PR描述中的图片并推送到Slack
核心思路
GitHub私有仓库中PR描述里的assets图片(https://github.com/owner/repo/assets/...)需要授权访问,通过携带**GitHub个人访问令牌(PAT)**发起请求,GitHub会自动重定向到短期有效的公开URL,直接跟随重定向即可获取图片内容,之后上传到Slack即可。
步骤详解
1. 创建GitHub个人访问令牌(PAT)
- 登录GitHub,进入「Settings」→「Developer settings」→「Personal access tokens」
- 生成新令牌,勾选
repo权限(私有仓库访问必需),保存好令牌(只会显示一次)
2. 提取PR描述中的图片URL
从GitHub PR的webhook payload或GitHub API获取PR的body内容,用正则表达式提取所有<img>标签的src属性:
import re pr_body = "你的PR描述内容" img_urls = re.findall(r'<img.*?src="(https://github\.com/[^"]+/assets/[^"]+)"', pr_body)
3. 授权下载图片
用HTTP客户端(如requests)发送GET请求,携带Authorization头,跟随重定向获取图片二进制数据:
import requests github_pat = "你的GitHub PAT" headers = {"Authorization": f"token {github_pat}"} for img_url in img_urls: response = requests.get(img_url, headers=headers, allow_redirects=True) response.raise_for_status() # 捕获请求错误 image_content = response.content # 图片二进制数据
4. 上传图片到Slack
使用Slack的files.upload API上传图片,同时可以附带PR的相关信息:
from slack_sdk import WebClient from slack_sdk.errors import SlackApiError slack_token = "你的Slack Bot Token" slack_channel = "#目标频道" slack_client = WebClient(token=slack_token) try: response = slack_client.files_upload( channels=slack_channel, content=image_content, filename="pr-change-screenshot.png", # 根据实际格式调整后缀 title="PR合并变更截图" ) print(f"图片上传成功:{response['file']['permalink']}") except SlackApiError as e: print(f"Slack上传失败:{e.response['error']}")
关键注意事项
- PAT权限:必须勾选
repo权限,否则无法访问私有仓库的assets资源 - 重定向处理:确保HTTP客户端允许跟随302重定向(requests默认开启)
- Slack权限:Slack Bot Token需要拥有
files:write和chat:write权限,才能完成文件上传和消息发送 - 多媒体支持:如果PR中的是GIF等短视频,只需修改
filename的后缀,Slack会自动识别格式 - Webhook集成:如果是响应GitHub的PR合并webhook,可以直接从payload中提取PR标题、描述、合并者等信息,无需手动输入
内容的提问来源于stack exchange,提问作者plowman
相关产品推荐
相关产品推荐

