forked from jkcl/reposync
66 lines
2.7 KiB
Python
66 lines
2.7 KiB
Python
import requests
|
||
|
||
class GithubAPI:
|
||
def __init__(self, owner, repo, token):
|
||
self.owner = owner
|
||
self.repo = repo
|
||
self.token = token
|
||
|
||
def fetch_issues(self):
|
||
url = f"https://api.github.com/repos/{self.owner}/{self.repo}/issues"
|
||
headers = {'Authorization': f'token {self.token}'}
|
||
resp = requests.get(url, headers=headers)
|
||
return resp.json() if resp.status_code == 200 else []
|
||
|
||
def create_issue(self, title, body):
|
||
url = f"https://api.github.com/repos/{self.owner}/{self.repo}/issues"
|
||
headers = {'Authorization': f'token {self.token}'}
|
||
data = {"title": title, "body": body}
|
||
resp = requests.post(url, headers=headers, json=data)
|
||
return resp.json() if resp.status_code in (200, 201) else None
|
||
|
||
def fetch_pull_requests(self):
|
||
url = f"https://api.github.com/repos/{self.owner}/{self.repo}/pulls"
|
||
headers = {'Authorization': f'token {self.token}'}
|
||
resp = requests.get(url, headers=headers)
|
||
return resp.json() if resp.status_code == 200 else []
|
||
|
||
def create_pull_request(self, title, head, base, body=""):
|
||
url = f"https://api.github.com/repos/{self.owner}/{self.repo}/pulls"
|
||
headers = {'Authorization': f'token {self.token}'}
|
||
data = {
|
||
"title": title,
|
||
"head": head, # 源分支
|
||
"base": base, # 目标分支
|
||
"body": body
|
||
}
|
||
resp = requests.post(url, headers=headers, json=data)
|
||
return resp.json() if resp.status_code in (200, 201) else None
|
||
|
||
# 新增PR评论相关方法
|
||
def fetch_pr_comments(self, pr_number):
|
||
"""获取PR的评论列表"""
|
||
url = f"https://api.github.com/repos/{self.owner}/{self.repo}/pulls/{pr_number}/comments"
|
||
headers = {'Authorization': f'token {self.token}'}
|
||
resp = requests.get(url, headers=headers)
|
||
return resp.json() if resp.status_code == 200 else []
|
||
|
||
def create_pr_comment(self, pr_number, body, commit_id=None, path=None, position=None):
|
||
"""创建PR评论,支持代码行评论"""
|
||
url = f"https://api.github.com/repos/{self.owner}/{self.repo}/pulls/{pr_number}/comments"
|
||
headers = {'Authorization': f'token {self.token}'}
|
||
data = {"body": body}
|
||
|
||
# 如果提供了代码行信息,则创建代码行评论
|
||
if commit_id and path and position is not None:
|
||
data.update({
|
||
"commit_id": commit_id,
|
||
"path": path,
|
||
"position": position
|
||
})
|
||
|
||
resp = requests.post(url, headers=headers, json=data)
|
||
return resp.json() if resp.status_code in (200, 201) else None
|
||
|
||
# PR相关方法同理
|