1
0

close_issue.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import os
  2. import requests
  3. issue_labels = ['no respect']
  4. github_repo = 'dqzboy/Docker-Proxy'
  5. github_token = os.getenv("GITHUB_TOKEN")
  6. headers = {
  7. 'Authorization': 'Bearer ' + github_token,
  8. 'Accept': 'application/vnd.github+json',
  9. 'X-GitHub-Api-Version': '2022-11-28',
  10. }
  11. def get_stargazers(repo):
  12. page = 1
  13. _stargazers = {}
  14. while True:
  15. queries = {
  16. 'per_page': 100,
  17. 'page': page,
  18. }
  19. url = f'https://api.github.com/repos/{repo}/stargazers'
  20. resp = requests.get(url, headers=headers, params=queries)
  21. if resp.status_code != 200:
  22. raise Exception('Error get stargazers: ' + resp.text)
  23. data = resp.json()
  24. if not data:
  25. break
  26. for stargazer in data:
  27. _stargazers[stargazer['login']] = True
  28. page += 1
  29. print('list stargazers done, total: ' + str(len(_stargazers)))
  30. return _stargazers
  31. def get_issues(repo):
  32. page = 1
  33. _issues = []
  34. while True:
  35. queries = {
  36. 'state': 'open',
  37. 'sort': 'created',
  38. 'direction': 'desc',
  39. 'per_page': 100,
  40. 'page': page,
  41. }
  42. url = f'https://api.github.com/repos/{repo}/issues'
  43. resp = requests.get(url, headers=headers, params=queries)
  44. if resp.status_code != 200:
  45. raise Exception('Error get issues: ' + resp.text)
  46. data = resp.json()
  47. if not data:
  48. break
  49. _issues += data
  50. page += 1
  51. print('list issues done, total: ' + str(len(_issues)))
  52. return _issues
  53. def close_issue(repo, issue_number):
  54. url = f'https://api.github.com/repos/{repo}/issues/{issue_number}'
  55. data = {
  56. 'state': 'closed',
  57. 'state_reason': 'not_planned',
  58. 'labels': issue_labels,
  59. }
  60. resp = requests.patch(url, headers=headers, json=data)
  61. if resp.status_code != 200:
  62. raise Exception('Error close issue: ' + resp.text)
  63. print('issue: {} closed'.format(issue_number))
  64. def lock_issue(repo, issue_number):
  65. url = f'https://api.github.com/repos/{repo}/issues/{issue_number}/lock'
  66. data = {
  67. 'lock_reason': 'spam',
  68. }
  69. resp = requests.put(url, headers=headers, json=data)
  70. if resp.status_code != 204:
  71. raise Exception('Error lock issue: ' + resp.text)
  72. print('issue: {} locked'.format(issue_number))
  73. if '__main__' == __name__:
  74. try:
  75. stargazers = get_stargazers(github_repo)
  76. issues = get_issues(github_repo)
  77. for issue in issues:
  78. login = issue['user']['login']
  79. if login not in stargazers:
  80. print('issue: {}, login: {} not in stargazers'.format(issue['number'], login))
  81. close_issue(github_repo, issue['number'])
  82. lock_issue(github_repo, issue['number'])
  83. print('done')
  84. except Exception as e:
  85. print(f"Error occurred: {str(e)}")
  86. raise