gogmilestone2.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import requests
  2. from requests.auth import HTTPBasicAuth
  3. from flask import Flask, request, jsonify
  4. app = Flask(__name__)
  5. # Config
  6. LOGIN_URL = "http://localhost:7777/user/login"
  7. EDIT_MILESTONE_URL = "http://localhost:7777/setyotontowi/experiments/milestones/1/edit"
  8. USERNAME = "setyotontowi"
  9. PASSWORD = "nasipadang"
  10. session = requests.Session() # Keep session across requests
  11. def login():
  12. """Log in and store session cookies."""
  13. print("Logging in...")
  14. payload = {
  15. "user_name": USERNAME,
  16. "password": PASSWORD
  17. }
  18. response = session.post(LOGIN_URL, data=payload)
  19. if response.status_code == 200:
  20. print("Login successful.")
  21. return True
  22. else:
  23. print(f"Login failed: {response.status_code} - {response.text}")
  24. return False
  25. def get_csrf_token():
  26. """Fetch CSRF token from the edit milestone page."""
  27. print("Fetching CSRF token...")
  28. response = session.get(EDIT_MILESTONE_URL)
  29. if response.status_code == 200:
  30. token = extract_csrf_token(response.text)
  31. if token:
  32. print(f"CSRF token obtained: {token}")
  33. return token
  34. else:
  35. print("Failed to extract CSRF token.")
  36. return None
  37. elif response.status_code == 401: # Unauthorized → Need to re-login
  38. print("Session expired, re-logging in...")
  39. if login():
  40. return get_csrf_token()
  41. else:
  42. print("Failed to log in while fetching CSRF token.")
  43. return None
  44. else:
  45. print(f"Failed to get CSRF token: {response.status_code} - {response.text}")
  46. return None
  47. def extract_csrf_token(html):
  48. """Extract CSRF token from HTML using regex."""
  49. import re
  50. match = re.search(r'name="_csrf" value="(.*?)"', html)
  51. if match:
  52. return match.group(1)
  53. return None
  54. def update_milestone(title):
  55. """Update milestone with PR title using CSRF token."""
  56. csrf_token = get_csrf_token()
  57. if not csrf_token:
  58. print("Failed to get CSRF token.")
  59. return False
  60. payload = {
  61. "_csrf": csrf_token,
  62. "title": title,
  63. "content": "PR updated via webhook",
  64. "deadline": "2025-03-31"
  65. }
  66. headers = {
  67. "Content-Type": "application/x-www-form-urlencoded"
  68. }
  69. print(f"Sending POST request to update milestone with title: '{title}'...")
  70. response = session.post(EDIT_MILESTONE_URL, data=payload, headers=headers)
  71. if response.status_code == 200:
  72. print("Milestone updated successfully!")
  73. return True
  74. elif response.status_code == 401: # Unauthorized → Need to re-login
  75. print("Session expired, re-logging in...")
  76. if login():
  77. return update_milestone(title)
  78. else:
  79. print(f"Failed to update milestone: {response.status_code} - {response.text}")
  80. return False
  81. @app.route('/webhook', methods=['POST'])
  82. def handle_webhook():
  83. if request.method != 'POST':
  84. return 'Invalid request method', 405
  85. try:
  86. payload = request.get_json()
  87. if not payload:
  88. return 'Invalid JSON payload', 400
  89. # Handle Pull Request Event
  90. if 'pull_request' in payload:
  91. pr = payload.get('pull_request', {})
  92. pr_title = pr.get('title')
  93. print(f"Received PR: {pr_title}")
  94. # Update milestone with PR title
  95. if update_milestone(pr_title):
  96. print("Milestone updated with PR title.")
  97. else:
  98. print("Failed to update milestone.")
  99. return jsonify({'status': 'success'}), 200
  100. except Exception as e:
  101. print(f"Error: {e}")
  102. return 'Internal server error', 500
  103. if __name__ == '__main__':
  104. if login(): # Attempt login at startup
  105. print("Initial login successful.")
  106. else:
  107. print("Initial login failed.")
  108. app.run(port=4001)