Spaces:
Sleeping
Sleeping
| import requests | |
| def get_codeforces_profile(username: str): | |
| api_base = "https://codeforces.com/api/" | |
| info_url = f"{api_base}user.info?handles={username}" | |
| rating_url = f"{api_base}user.rating?handle={username}" | |
| status_url = f"{api_base}user.status?handle={username}" | |
| friends_url = f"{api_base}user.friends?handle={username}" | |
| blogs_url = f"{api_base}user.blogEntries?handle={username}" | |
| try: | |
| # 1. User info | |
| info_resp = requests.get(info_url) | |
| info_resp.raise_for_status() | |
| info_data = info_resp.json() | |
| if info_data.get("status") != "OK": | |
| return {"success": False, "error": info_data.get("comment")} | |
| user_info = info_data["result"][0] | |
| # 2. Contest rating history | |
| rating_data = requests.get(rating_url).json() | |
| contests = rating_data.get("result", []) if rating_data.get("status") == "OK" else [] | |
| # 3. Recent submissions | |
| status_data = requests.get(status_url).json() | |
| submissions = status_data.get("result", []) if status_data.get("status") == "OK" else [] | |
| # 4. Friends | |
| friends_data = requests.get(friends_url).json() | |
| friends = friends_data.get("result", []) if friends_data.get("status") == "OK" else [] | |
| # 5. Blogs by user | |
| blogs_data = requests.get(blogs_url).json() | |
| blogs = blogs_data.get("result", []) if blogs_data.get("status") == "OK" else [] | |
| # 6. Blog comments (first 5) | |
| blog_comments = [] | |
| for entry in blogs[:5]: | |
| blog_id = entry['id'] | |
| blog_url = f"{api_base}blogEntry.comments?blogEntryId={blog_id}" | |
| comments_data = requests.get(blog_url).json() | |
| if comments_data.get("status") == "OK": | |
| blog_comments.append({ | |
| "blog_id": blog_id, | |
| "comments": comments_data.get("result", []) | |
| }) | |
| # 7. Compute top tags + solved stats from submissions | |
| from collections import Counter, defaultdict | |
| tag_counter = Counter() | |
| verdict_counter = Counter() | |
| problem_counter = defaultdict(set) | |
| successful_submissions = [s for s in submissions if s.get('verdict') == 'OK'] | |
| for s in successful_submissions: | |
| tags = s['problem'].get('tags', []) | |
| for tag in tags: | |
| tag_counter[tag] += 1 | |
| pkey = f"{s['problem']['contestId']}-{s['problem']['index']}" | |
| problem_counter[s['problem']['type']].add(pkey) | |
| verdict_counter[s['verdict']] += 1 | |
| # Solve/attempt summary | |
| solved = len(problem_counter['PROGRAMMING']) | |
| attempts = len(submissions) | |
| top_tags = tag_counter.most_common(10) | |
| # 8. Markdown Profile Summary | |
| md = [] | |
| md.append(f"# Codeforces Profile: {user_info.get('handle')}") | |
| md.append(f"**Name**: {user_info.get('firstName', '')} {user_info.get('lastName', '')}") | |
| md.append(f"**Country**: {user_info.get('country', 'N/A')}") | |
| md.append(f"**Rank**: {user_info.get('rank', 'N/A')} | **Rating**: {user_info.get('rating', 'N/A')}") | |
| md.append(f"**Max Rank**: {user_info.get('maxRank', 'N/A')} (Max Rating: {user_info.get('maxRating', 'N/A')})") | |
| md.append(f"**Solved Problems**: {solved}") | |
| md.append(f"**Total Attempts**: {attempts}") | |
| md.append("## Top Tags") | |
| for tag, count in top_tags: | |
| md.append(f"- {tag}: {count} problems") | |
| md.append("\n## Recent Contest Performance") | |
| for contest in contests[-5:]: | |
| md.append(f"- {contest['contestName']}: {contest['rank']}th, ΔRating: {contest['newRating'] - contest['oldRating']} ({contest['newRating']})") | |
| md.append("\n## Recent Submissions (last 5 OK)") | |
| for sub in successful_submissions[:5]: | |
| problem_url = f"https://codeforces.com/problemset/problem/{sub['problem']['contestId']}/{sub['problem']['index']}" | |
| md.append(f"- [{sub['problem']['name']}]({problem_url}), {sub['programmingLanguage']}, {sub['creationTimeSeconds']}") | |
| md.append("\n## Blog Entries") | |
| for entry in blogs[:3]: | |
| blog_entry_url = f"https://codeforces.com/blog/entry/{entry['id']}" | |
| md.append(f"- [{entry['title']}]({blog_entry_url}), Comments: {entry.get('commentsCount', 0)}") | |
| result = { | |
| "success": True, | |
| "data": { | |
| "profile": user_info, | |
| "contests": contests, | |
| "submissions": submissions, | |
| "friends": friends, | |
| "blogs": blogs, | |
| "blog_comments": blog_comments, | |
| "solved_stats": { | |
| "solved_problems": solved, | |
| "total_attempts": attempts, | |
| "top_tags": dict(top_tags), | |
| "verdicts": dict(verdict_counter) | |
| }, | |
| "markdown_summary": "\n".join(md) | |
| } | |
| } | |
| return result | |
| except requests.exceptions.RequestException as e: | |
| return {"success": False, "error": str(e)} | |