Skip to content

Instantly share code, notes, and snippets.

@kms70847
Last active October 22, 2019 18:15
Show Gist options
  • Save kms70847/b97968f7be8d6f08b5a281007532b899 to your computer and use it in GitHub Desktop.
Save kms70847/b97968f7be8d6f08b5a281007532b899 to your computer and use it in GitHub Desktop.
Gold Badge Counter
import requests
import base64
import os
import pickle
import time
import re
import json
from bs4 import BeautifulSoup as BS
MIN_TIME_BETWEEN_REQUESTS = 10
CACHED_DATA_DIRECTORY = "res"
def filename_sanitize(s):
"""
Enocode `s` to a form that is (mostly) safe to use as a filename.
This may still fail, for example if the encoded form exceeds Windows' maximum allowable filename length of 255.
"""
return base64.urlsafe_b64encode(s.encode()).decode("ascii")
_last_request_time = 0
def rate_limited_get(url):
"""
get a response for the given url, but possibly sleep first so the server doesn't get flooded
"""
global _last_request_time
elapsed_time = time.time() - _last_request_time
if elapsed_time < MIN_TIME_BETWEEN_REQUESTS:
print(f"Rate-limiting request, since {elapsed_time} seconds have elapsed since the last one")
time.sleep(MIN_TIME_BETWEEN_REQUESTS - elapsed_time)
_last_request_time = time.time()
return requests.get(url)
def get_or_load(url):
"""
get the html of the given url, and store the data in the CACHED_DATA_DIRECTORY directory so we don't have to use bandwidth to fetch it again later.
"""
filename = filename_sanitize(url) + ".html"
filename = os.path.join(CACHED_DATA_DIRECTORY, filename)
if os.path.exists(filename):
with open(filename, "rb") as file:
return file.read()
else:
print(f"Requesting url {url}...")
response = rate_limited_get(url)
response.raise_for_status()
data = response.content
with open(filename, "wb") as file:
file.write(data)
return data
def get_active_rooms(num_pages=1):
"""
gets a list of the most active chat rooms.
Arguments:
num_pages - optional, with default value 1. Number of pages of room listings to scan. Each page contains at most 20 rooms
Returns:
a list of dicts with the keys "name" and "href". The href points to the chat room's info page, rather than the actual chatroom.
"""
results = []
for i in range(1, num_pages+1):
url = f"https://chat.stackoverflow.com/?tab=all&sort=active&page={i}"
html = get_or_load(url)
soup = BS(html, "html.parser")
for span in soup.find_all(class_ = "room-name"):
a = span.find("a")
results.append({
"name": a.text,
#the raw href looks like "/rooms/6/python", but we actually want "/rooms/info/6/python"
"href": a["href"].replace("/rooms/", "/rooms/info/"),
})
return results
def get_regulars(room):
"""
gets all of the regular users of the given room.
Arguments:
room - a string representing a relative url, for example "/rooms/info/7/c"
Returns:
a list of dicts with the keys "name" and "href"
"""
id = re.match(r"/rooms/info/(\d+)/", room).group(1)
url = f"https://chat.stackoverflow.com{room}?id={id}&tab=general&users=frequent"
html = get_or_load(url)
soup = BS(html, "html.parser")
results = []
for a in soup.find(id="room-usercards-container").find_all(class_="username"):
results.append({
"name": a.text,
"href": a["href"],
})
return results
def get_tag_badges(user):
"""
gets all of the tag badges of the given user.
Arguments:
user - a string representing a relative url, for example "/users/2764866/wietlol"
Returns:
a list of (tagname, grade) tuples. grade is either "bronze", "silver", or "gold".
"""
results = []
url = f"https://stackoverflow.com{user}/?tab=badges"
html = get_or_load(url)
soup = BS(html, "html.parser")
for badge in soup.find(class_="user-badges").find_all(class_="badge-tag"):
grade = badge["title"].partition(" ")[0]
assert grade in ("bronze", "silver", "gold")
tag = badge.text.strip()
results.append((tag, grade))
return results
def get_room_tags(room):
"""
gets all of the names of the tags in the room's description.
Arguments:
room - a stting representing a relative url, for example "/rooms/info/7/c"
Returns:
a list of strings, for example `['.net', 'asp.net', 'asp.net-mvc', 'c#', 'coreclr', 'entity-framework', 'linq', 'visual-studio', 'wcf', 'wpf', 'xamarin']`
"""
url = "https://chat.stackoverflow.com" + room
html = get_or_load(url)
soup = BS(html, "html.parser")
return [tag.text.strip() for tag in soup.find_all(class_="tag")]
def get_all_room_data():
data = {"rooms": []}
print("Fetching active rooms...")
rooms = get_active_rooms(4)
room = rooms[0]
print(f"Fetched.")
for room_idx, room in enumerate(rooms, 1):
print(f"Examining room {room['name']} ({room_idx}/{len(rooms)}).")
tags = get_room_tags(room['href'])
room["tags"] = tags
users = get_regulars(room['href'])
room["users"] = []
for user_idx, user in enumerate(users, 1):
print(f" Examining user {user['name']} ({user_idx}/{len(users)}).")
tags = get_tag_badges(user['href'])
user["tag_badges"] = tags
room["users"].append(user)
data["rooms"].append(room)
return data
if not os.path.exists(CACHED_DATA_DIRECTORY):
os.mkdir(CACHED_DATA_DIRECTORY)
data = get_all_room_data()
print("Saving data...")
with open("result.json", "w") as file:
json.dump(data, file, indent=4)
print("Saved.")
with open("result.json") as file:
data = json.load(file)
for room in data["rooms"]:
gold_users = 0
for user in room["users"]:
gold_badges = [name for name, grade in user["tag_badges"] if grade == "gold"]
if any(name in room["tags"] for name in gold_badges):
gold_users += 1
room["gold_count"] = gold_users
room["gold_percentage"] = 100 * gold_users / len(room["users"]) if room["users"] else 0.0
data["rooms"].sort(key=lambda room: (room["gold_percentage"], len(room["users"]), room["name"]), reverse=True)
print("# of users frequently in room -- # of regulars with a relevant gold badge -- % of regulars with gold badge -- Room name")
for room in data["rooms"]:
print(f'{len(room["users"])} \t {room["gold_count"]} \t {room["gold_percentage"]: 6.1f}% \t {room["name"]}')
1 1 100.0% Docker
10 7 70.0% Python
10 6 60.0% Android
10 5 50.0% PHP
5 2 40.0% Ruby :: Sometimes on Rails
9 3 33.3% CHATLAB and Talktave
3 1 33.3% HTML / CSS / WebDesign
8 2 25.0% JavaScript
4 1 25.0% C
9 2 22.2% Rust
5 1 20.0% C#
10 1 10.0% WPF
10 1 10.0% WPF
10 0 0.0% SOBotics
10 0 0.0% SO Close Vote Reviewers
10 0 0.0% Java
10 0 0.0% GMTs
6 0 0.0% SQL
6 0 0.0% SQL
6 0 0.0% Duck Overflow
6 0 0.0% ASP.NET MVC
5 0 0.0% [Rebol*]
5 0 0.0% SOCVR /dev/null
5 0 0.0% KCG
5 0 0.0% Jeeves' Playground...
5 0 0.0% C++ Questions and Answers
4 0 0.0% iOS, Android and PHP Dev
4 0 0.0% Dawg's Waffle Haus
3 0 0.0% friendly bin
3 0 0.0% friendly bin
3 0 0.0% [iOS][Android][ChaosOverFlow]
3 0 0.0% Tamil iOS, Web and Phonegap Developers
3 0 0.0% Sandbox
3 0 0.0% Sandbox
3 0 0.0% SOCVR Testing Facility
3 0 0.0% Meta Stack Overflow Comment Archive W…
2 0 0.0% Web app with MVC
2 0 0.0% Trash can
2 0 0.0% SPA vs MPA
2 0 0.0% Python Ouroboros - The Rotating Knives
2 0 0.0% MPI help
2 0 0.0% Laravel
2 0 0.0% Haskell (and other functional languages)
2 0 0.0% Gtk+
2 0 0.0% F#
2 0 0.0% Erlang/OTP
2 0 0.0% Computer Graphics Articles
2 0 0.0% Burnination progress for the [relativ…
2 0 0.0% Android & Kotlin Experts
2 0 0.0% #!/bin/bash
2 0 0.0% #!/bin/bash
1 0 0.0% help with question
1 0 0.0% featherwaver_Abra
1 0 0.0% event hub trigger
1 0 0.0% _chat
1 0 0.0% Security / Privacy
1 0 0.0% R Public
1 0 0.0% New Answers to Old Questions Headquar…
1 0 0.0% Meta Stack Overflow Comment Archive
1 0 0.0% Discussion from comment thread in "Th…
1 0 0.0% Developer Relations
1 0 0.0% Apache Spark
1 0 0.0% Angular - Quiz - Routing
1 0 0.0% Activity tracker
1 0 0.0% ADHD
0 0 0.0% websocket authentication and authoriz…
0 0 0.0% v_head_aconcagua_i
0 0 0.0% talk
0 0 0.0% symfony-help
0 0 0.0% k8s using kube spray
0 0 0.0% iOS Developer Family (iOS,Android,Flu…
0 0 0.0% Parsing a JSON array item one by one …
0 0 0.0% Laravel Notifications with custom aut…
0 0 0.0% Kotlin
0 0 0.0% Java, Spring,JPA, PHP, jQuery & Javas…
0 0 0.0% How can I add scrollbar vertical in t…
0 0 0.0% Chat with Tedinoz
0 0 0.0% Angular Newbies
0 0 0.0% 58441786
0 0 0.0% 58427568
{
"rooms": [
{
"name": "Android",
"href": "/rooms/info/15/android",
"tags": [
"android",
"cats",
"circleavatars",
"cyanavatars",
"java",
"kotlin",
"o/",
"xkcd"
],
"users": [
{
"name": "ColdFire",
"href": "/users/5148907/coldfire",
"tag_badges": [
[
"android",
"silver"
],
[
"android",
"bronze"
]
]
},
{
"name": "Raghav Sood",
"href": "/users/1069068/raghav-sood",
"tag_badges": [
[
"java",
"silver"
],
[
"java",
"bronze"
],
[
"android-activity",
"bronze"
],
[
"android-layout",
"bronze"
],
[
"android",
"silver"
],
[
"google-play",
"silver"
],
[
"google-play",
"bronze"
],
[
"eclipse",
"bronze"
],
[
"android-manifest",
"bronze"
],
[
"android-intent",
"bronze"
],
[
"android",
"gold"
]
]
},
{
"name": "Ahmad",
"href": "/users/1333975/ahmad",
"tag_badges": [
[
"java",
"silver"
],
[
"actionbarsherlock",
"bronze"
],
[
"android",
"gold"
],
[
"java",
"bronze"
],
[
"android-actionbar",
"bronze"
],
[
"android-layout",
"bronze"
],
[
"android-theme",
"bronze"
],
[
"android",
"bronze"
],
[
"android",
"silver"
]
]
},
{
"name": "codeMagic",
"href": "/users/1380752/codemagic",
"tag_badges": [
[
"android",
"gold"
],
[
"android-activity",
"bronze"
],
[
"android-asynctask",
"bronze"
],
[
"java",
"silver"
],
[
"layout",
"bronze"
],
[
"android-layout",
"bronze"
],
[
"android",
"silver"
],
[
"java",
"bronze"
],
[
"xml",
"bronze"
],
[
"android-intent",
"bronze"
]
]
},
{
"name": "Tim Castelijns",
"href": "/users/1843331/tim-castelijns",
"tag_badges": [
[
"python",
"bronze"
],
[
"android",
"bronze"
],
[
"android",
"gold"
],
[
"git",
"bronze"
],
[
"java",
"bronze"
],
[
"android-studio",
"bronze"
],
[
"android",
"silver"
],
[
"python-2.7",
"bronze"
]
]
},
{
"name": "AdamMc331",
"href": "/users/3131147/adammc331",
"tag_badges": [
[
"java",
"bronze"
],
[
"android",
"bronze"
],
[
"mysql",
"bronze"
],
[
"sql",
"bronze"
]
]
},
{
"name": "WarrenFaith",
"href": "/users/180538/warrenfaith",
"tag_badges": [
[
"sqlite",
"bronze"
],
[
"database",
"bronze"
],
[
"android",
"silver"
],
[
"eclipse",
"bronze"
],
[
"android",
"gold"
],
[
"java",
"bronze"
],
[
"android-layout",
"bronze"
]
]
},
{
"name": "Mauker",
"href": "/users/4070469/mauker",
"tag_badges": [
[
"android",
"silver"
],
[
"java",
"bronze"
],
[
"android",
"bronze"
]
]
},
{
"name": "Graeme",
"href": "/users/726954/graeme",
"tag_badges": [
[
"android",
"gold"
],
[
"android-layout",
"bronze"
],
[
"android",
"silver"
],
[
"android",
"bronze"
]
]
},
{
"name": "Dave S",
"href": "/users/2680506/dave-s",
"tag_badges": [
[
"android",
"bronze"
]
]
}
]
},
{
"name": "Laravel",
"href": "/rooms/info/193158/laravel",
"tags": [],
"users": [
{
"name": "Hasnain Kahn",
"href": "/users/9893974/hasnain-kahn",
"tag_badges": []
},
{
"name": "Zakaria Acharki",
"href": "/users/4281779/zakaria-acharki",
"tag_badges": [
[
"php",
"silver"
],
[
"html",
"silver"
],
[
"json",
"bronze"
],
[
"php",
"bronze"
],
[
"laravel-5.1",
"bronze"
],
[
"css",
"bronze"
],
[
"eloquent",
"bronze"
],
[
"html",
"gold"
],
[
"jquery",
"silver"
],
[
"css",
"silver"
],
[
"jquery",
"gold"
],
[
"javascript",
"silver"
],
[
"ajax",
"bronze"
],
[
"arrays",
"bronze"
],
[
"twitter-bootstrap",
"bronze"
],
[
"laravel",
"bronze"
],
[
"javascript",
"gold"
]
]
}
]
},
{
"name": "C#",
"href": "/rooms/info/7/c",
"tags": [
".net",
"asp.net",
"asp.net-mvc",
"c#",
"coreclr",
"entity-framework",
"linq",
"visual-studio",
"wcf",
"wpf",
"xamarin"
],
"users": [
{
"name": "Wietlol",
"href": "/users/2764866/wietlol",
"tag_badges": []
},
{
"name": "Avner Shahar-Kashtan",
"href": "/users/701054/avner-shahar-kashtan",
"tag_badges": [
[
"c#",
"silver"
],
[
"c#",
"bronze"
],
[
".net",
"bronze"
]
]
},
{
"name": "MikeTheLiar",
"href": "/users/1015495/miketheliar",
"tag_badges": []
},
{
"name": "Amy",
"href": "/users/47589/amy",
"tag_badges": [
[
"c#",
"gold"
],
[
"javascript",
"bronze"
],
[
"asp.net",
"bronze"
],
[
"c#",
"silver"
],
[
"c#",
"bronze"
],
[
".net",
"bronze"
]
]
},
{
"name": "Roel van Uden",
"href": "/users/472015/roel-van-uden",
"tag_badges": [
[
"javascript",
"bronze"
],
[
"node.js",
"bronze"
]
]
}
]
},
{
"name": "Rust",
"href": "/rooms/info/62927/rust",
"tags": [
"fearless-concurrency",
"generic-associated-types",
"kirby-dream-land",
"rust",
"shepmaster-fanclub"
],
"users": [
{
"name": "Shepmaster",
"href": "/users/155423/shepmaster",
"tag_badges": [
[
"iterator",
"silver"
],
[
"rust-cargo",
"silver"
],
[
"future",
"bronze"
],
[
"struct",
"bronze"
],
[
"borrow-checker",
"silver"
],
[
"borrowing",
"bronze"
],
[
"serde",
"bronze"
],
[
"traits",
"silver"
],
[
"pointers",
"bronze"
],
[
"macros",
"bronze"
],
[
"reference",
"bronze"
],
[
"syntax",
"bronze"
],
[
"enums",
"bronze"
],
[
"ffi",
"bronze"
],
[
"types",
"bronze"
],
[
"multithreading",
"bronze"
],
[
"rust-tokio",
"bronze"
],
[
"closures",
"bronze"
],
[
"lifetime",
"silver"
],
[
"vector",
"bronze"
],
[
"arrays",
"bronze"
]
]
},
{
"name": "Stargateur",
"href": "/users/7076153/stargateur",
"tag_badges": [
[
"rust",
"bronze"
],
[
"rust",
"silver"
],
[
"c",
"bronze"
]
]
},
{
"name": "French Boiethios",
"href": "/users/4498831/french-boiethios",
"tag_badges": [
[
"rust",
"silver"
],
[
"rust",
"bronze"
]
]
},
{
"name": "Denys S\u00e9guret",
"href": "/users/263525/denys-seguret",
"tag_badges": [
[
"parsing",
"bronze"
],
[
"eclipse",
"bronze"
],
[
"promise",
"bronze"
],
[
"node.js",
"silver"
],
[
"regex",
"gold"
],
[
"css3",
"bronze"
],
[
"ajax",
"silver"
],
[
"variables",
"bronze"
],
[
"multithreading",
"bronze"
],
[
"scope",
"bronze"
],
[
"php",
"silver"
],
[
"git",
"bronze"
],
[
"arrays",
"gold"
],
[
"sql",
"bronze"
],
[
"sorting",
"bronze"
],
[
"rust",
"bronze"
],
[
"jquery-selectors",
"silver"
],
[
"css",
"gold"
],
[
"google-chrome",
"bronze"
],
[
"internet-explorer",
"bronze"
],
[
"replace",
"bronze"
],
[
"class",
"bronze"
],
[
"date",
"bronze"
]
]
},
{
"name": "S\u00e9bastien Renauld",
"href": "/users/2167834/sebastien-renauld",
"tag_badges": [
[
"javascript",
"bronze"
],
[
"rust",
"bronze"
],
[
"javascript",
"silver"
],
[
"php",
"silver"
],
[
"php",
"bronze"
],
[
"jquery",
"bronze"
]
]
},
{
"name": "Peter Varo",
"href": "/users/2188562/peter-varo",
"tag_badges": [
[
"python",
"bronze"
],
[
"python",
"silver"
]
]
},
{
"name": "E_net4 is still on strike",
"href": "/users/1233251/e-net4-is-still-on-strike",
"tag_badges": [
[
"rust",
"bronze"
],
[
"node.js",
"bronze"
],
[
"rust",
"silver"
]
]
},
{
"name": "Peter Hall",
"href": "/users/493729/peter-hall",
"tag_badges": [
[
"traits",
"bronze"
],
[
"generics",
"bronze"
],
[
"syntax",
"bronze"
],
[
"borrowing",
"bronze"
],
[
"lifetime",
"bronze"
],
[
"rust",
"gold"
],
[
"rust",
"bronze"
],
[
"haskell",
"bronze"
],
[
"reference",
"bronze"
],
[
"rust",
"silver"
]
]
},
{
"name": "Matthieu M.",
"href": "/users/147192/matthieu-m",
"tag_badges": [
[
"struct",
"bronze"
],
[
"reference",
"bronze"
],
[
"std",
"bronze"
],
[
"g++",
"bronze"
],
[
"lifetime",
"bronze"
],
[
"polymorphism",
"bronze"
],
[
"rust",
"silver"
],
[
"rust",
"gold"
],
[
"function",
"bronze"
],
[
"static",
"bronze"
],
[
"traits",
"bronze"
],
[
"namespaces",
"bronze"
],
[
"types",
"bronze"
],
[
"class",
"bronze"
],
[
"const",
"bronze"
],
[
"initialization",
"bronze"
]
]
}
]
},
{
"name": "New Answers to Old Questions Headquar\u2026",
"href": "/rooms/info/126814/new-answers-to-old-questions-headquarters",
"tags": [
"new-answers"
],
"users": [
{
"name": "Natty",
"href": "/users/6817005/natty",
"tag_badges": []
}
]
},
{
"name": "Python",
"href": "/rooms/info/6/python",
"tags": [
"python",
"python-2.x",
"python-3.x"
],
"users": [
{
"name": "Kevin",
"href": "/users/953482/kevin",
"tag_badges": [
[
"python-3.x",
"silver"
],
[
"tkinter",
"silver"
],
[
"list",
"bronze"
],
[
"tkinter",
"bronze"
],
[
"math",
"bronze"
],
[
"python",
"silver"
],
[
"c++",
"bronze"
],
[
"python-3.x",
"bronze"
],
[
"function",
"bronze"
],
[
"dictionary",
"bronze"
],
[
"python",
"gold"
],
[
"string",
"bronze"
],
[
"python-2.7",
"bronze"
],
[
"python-2.7",
"silver"
],
[
"python",
"bronze"
]
]
},
{
"name": "Andras Deak",
"href": "/users/5067311/andras-deak",
"tag_badges": [
[
"plot",
"bronze"
],
[
"matlab",
"silver"
],
[
"matplotlib",
"bronze"
],
[
"matrix",
"bronze"
],
[
"arrays",
"bronze"
],
[
"python",
"silver"
],
[
"numpy",
"silver"
],
[
"vectorization",
"bronze"
],
[
"scipy",
"bronze"
],
[
"python",
"bronze"
],
[
"interpolation",
"bronze"
],
[
"numpy",
"bronze"
]
]
},
{
"name": "Jon Clements",
"href": "/users/1252759/jon-clements",
"tag_badges": [
[
"json",
"bronze"
],
[
"python-3.x",
"silver"
],
[
"datetime",
"bronze"
],
[
"arrays",
"bronze"
],
[
"beautifulsoup",
"bronze"
],
[
"list-comprehension",
"bronze"
],
[
"numpy",
"bronze"
],
[
"dictionary",
"silver"
],
[
"performance",
"bronze"
],
[
"list",
"gold"
],
[
"python-2.7",
"silver"
],
[
"python-3.x",
"gold"
],
[
"indexing",
"bronze"
],
[
"string",
"silver"
],
[
"function",
"bronze"
],
[
"random",
"bronze"
],
[
"csv",
"bronze"
],
[
"file",
"bronze"
],
[
"tuples",
"bronze"
],
[
"sorting",
"bronze"
],
[
"pandas",
"bronze"
],
[
"django",
"bronze"
]
]
},
{
"name": "wim",
"href": "/users/674039/wim",
"tag_badges": [
[
"sorting",
"bronze"
],
[
"pip",
"bronze"
],
[
"python-3.x",
"gold"
],
[
"class",
"bronze"
],
[
"argparse",
"bronze"
],
[
"function",
"bronze"
],
[
"list",
"gold"
],
[
"unicode",
"bronze"
],
[
"django",
"silver"
],
[
"list-comprehension",
"bronze"
],
[
"datetime",
"bronze"
],
[
"numpy",
"gold"
],
[
"python-2.7",
"silver"
],
[
"string",
"silver"
],
[
"python-2.x",
"bronze"
],
[
"regex",
"bronze"
],
[
"python-3.x",
"silver"
]
]
},
{
"name": "PM 2Ring",
"href": "/users/4014959/pm-2ring",
"tag_badges": [
[
"list",
"bronze"
],
[
"numpy",
"bronze"
],
[
"string",
"bronze"
],
[
"dictionary",
"bronze"
],
[
"python-2.7",
"bronze"
],
[
"python",
"bronze"
],
[
"python-3.x",
"silver"
],
[
"tkinter",
"bronze"
],
[
"python-2.7",
"silver"
],
[
"python",
"silver"
],
[
"json",
"bronze"
],
[
"python-3.x",
"bronze"
],
[
"python",
"gold"
]
]
},
{
"name": "Aran-Fey",
"href": "/users/1222951/aran-fey",
"tag_badges": [
[
"python-2.7",
"bronze"
],
[
"regex",
"bronze"
],
[
"python",
"bronze"
],
[
"python",
"gold"
],
[
"list",
"bronze"
],
[
"python",
"silver"
],
[
"python-3.x",
"bronze"
]
]
},
{
"name": "Antti Haapala",
"href": "/users/918959/antti-haapala",
"tag_badges": [
[
"linux",
"bronze"
],
[
"pointers",
"bronze"
],
[
"assembly",
"bronze"
],
[
"c",
"gold"
],
[
"language-lawyer",
"bronze"
],
[
"java",
"bronze"
],
[
"c",
"silver"
],
[
"python-2.7",
"silver"
],
[
"gcc",
"bronze"
],
[
"sqlalchemy",
"bronze"
],
[
"arrays",
"bronze"
],
[
"python-3.x",
"silver"
],
[
"regex",
"bronze"
],
[
"python-2.x",
"bronze"
],
[
"dictionary",
"bronze"
],
[
"c++",
"bronze"
],
[
"string",
"bronze"
],
[
"python-2.7",
"bronze"
]
]
},
{
"name": "roganjosh",
"href": "/users/4799172/roganjosh",
"tag_badges": [
[
"python",
"bronze"
],
[
"python",
"silver"
]
]
},
{
"name": "idjaw",
"href": "/users/1832539/idjaw",
"tag_badges": [
[
"mocking",
"bronze"
],
[
"python",
"bronze"
],
[
"python",
"silver"
],
[
"python",
"gold"
],
[
"python-3.x",
"bronze"
],
[
"list",
"bronze"
]
]
},
{
"name": "davidism",
"href": "/users/400617/davidism",
"tag_badges": [
[
"javascript",
"bronze"
],
[
"jinja2",
"bronze"
],
[
"flask-sqlalchemy",
"bronze"
],
[
"sqlalchemy",
"gold"
],
[
"flask",
"gold"
],
[
"werkzeug",
"bronze"
],
[
"sqlalchemy",
"silver"
],
[
"flask-sqlalchemy",
"silver"
],
[
"python",
"gold"
],
[
"python",
"silver"
],
[
"json",
"bronze"
],
[
"jinja2",
"silver"
],
[
"wtforms",
"bronze"
],
[
"flask",
"silver"
],
[
"flask-login",
"bronze"
],
[
"flask-wtforms",
"bronze"
],
[
"alembic",
"bronze"
]
]
}
]
},
{
"name": "PHP",
"href": "/rooms/info/11/php",
"tags": [
"friday",
"php"
],
"users": [
{
"name": "ircmaxell",
"href": "/users/338665/ircmaxell",
"tag_badges": [
[
"hash",
"bronze"
],
[
"performance",
"bronze"
],
[
"security",
"silver"
],
[
"passwords",
"bronze"
],
[
"class",
"bronze"
],
[
"html",
"bronze"
],
[
"javascript",
"bronze"
],
[
"sql",
"bronze"
],
[
"security",
"bronze"
],
[
"mysql",
"silver"
],
[
"arrays",
"bronze"
],
[
"session",
"bronze"
],
[
"string",
"bronze"
]
]
},
{
"name": "DaveRandom",
"href": "/users/889949/daverandom",
"tag_badges": [
[
"mysql",
"silver"
],
[
"arrays",
"silver"
],
[
"mysqli",
"bronze"
],
[
"html",
"bronze"
],
[
"javascript",
"bronze"
],
[
"apache",
"bronze"
],
[
"arrays",
"bronze"
],
[
"regex",
"bronze"
],
[
"php",
"gold"
],
[
"curl",
"bronze"
],
[
"http",
"bronze"
],
[
"mysql",
"bronze"
]
]
},
{
"name": "PeeHaa",
"href": "/users/508666/peehaa",
"tag_badges": [
[
"html5",
"bronze"
],
[
"php",
"gold"
],
[
"mysql",
"bronze"
],
[
"html",
"silver"
],
[
"security",
"bronze"
],
[
"regex",
"bronze"
],
[
"javascript",
"silver"
],
[
"arrays",
"bronze"
],
[
"oop",
"bronze"
],
[
"php",
"silver"
],
[
"forms",
"bronze"
],
[
"jquery",
"silver"
]
]
},
{
"name": "Wes",
"href": "/users/4251625/wes",
"tag_badges": []
},
{
"name": "Joe Watkins",
"href": "/users/1658631/joe-watkins",
"tag_badges": [
[
"php",
"gold"
],
[
"php",
"bronze"
],
[
"php",
"silver"
],
[
"multithreading",
"silver"
],
[
"pthreads",
"bronze"
],
[
"multithreading",
"bronze"
],
[
"pthreads",
"silver"
]
]
},
{
"name": "bwoebi",
"href": "/users/2153758/bwoebi",
"tag_badges": [
[
"php",
"silver"
],
[
"arrays",
"bronze"
],
[
"php",
"gold"
],
[
"php",
"bronze"
],
[
"html",
"bronze"
]
]
},
{
"name": "Levi Morrison",
"href": "/users/538216/levi-morrison",
"tag_badges": [
[
"javascript",
"bronze"
],
[
"php",
"silver"
],
[
"php",
"bronze"
],
[
"arrays",
"bronze"
],
[
"jquery",
"bronze"
]
]
},
{
"name": "NikiC",
"href": "/users/385378/nikic",
"tag_badges": [
[
"oop",
"bronze"
],
[
"arrays",
"bronze"
],
[
"regex",
"bronze"
],
[
"php",
"gold"
],
[
"mysql",
"bronze"
],
[
"php",
"silver"
]
]
},
{
"name": "Madara Uchiha\u00a0\u2666",
"href": "/users/871050/madara-uchiha",
"tag_badges": [
[
"promise",
"bronze"
],
[
"jquery",
"gold"
],
[
"html",
"gold"
],
[
"typescript",
"bronze"
],
[
"session",
"bronze"
],
[
"javascript",
"gold"
],
[
"date",
"bronze"
],
[
"forms",
"bronze"
],
[
"git",
"bronze"
],
[
"node.js",
"bronze"
],
[
"string",
"bronze"
],
[
"css",
"gold"
],
[
"variables",
"bronze"
],
[
"css3",
"bronze"
],
[
"mysql",
"silver"
]
]
},
{
"name": "Danack",
"href": "/users/778719/danack",
"tag_badges": [
[
"imagick",
"bronze"
],
[
"php",
"silver"
],
[
"nginx",
"bronze"
],
[
"mysql",
"bronze"
],
[
"php",
"bronze"
],
[
"composer-php",
"bronze"
]
]
}
]
},
{
"name": "Meta Stack Overflow Comment Archive",
"href": "/rooms/info/197298/meta-stack-overflow-comment-archive",
"tags": [
"archive",
"comments",
"meta"
],
"users": [
{
"name": "Boson",
"href": "/users/10843908/boson",
"tag_badges": []
}
]
},
{
"name": "SOBotics",
"href": "/rooms/info/111347/sobotics",
"tags": [
"bots",
"pings",
"singularity",
"waffles"
],
"users": [
{
"name": "Natty",
"href": "/users/6817005/natty",
"tag_badges": []
},
{
"name": "Queen",
"href": "/users/6294609/queen",
"tag_badges": []
},
{
"name": "FOX 9000",
"href": "/users/3671802/fox-9000",
"tag_badges": []
},
{
"name": "Shree",
"href": "/users/965146/shree",
"tag_badges": [
[
"javascript",
"bronze"
],
[
"html",
"bronze"
],
[
"jquery",
"bronze"
],
[
"jquery",
"silver"
],
[
"c#",
"bronze"
]
]
},
{
"name": "Zoe the transgirl",
"href": "/users/6296561/zoe-the-transgirl",
"tag_badges": [
[
"java",
"bronze"
],
[
"android",
"bronze"
],
[
"kotlin",
"silver"
],
[
"android-studio",
"bronze"
],
[
"kotlin",
"bronze"
],
[
"android",
"silver"
]
]
},
{
"name": "SmokeDetector",
"href": "/users/3735529/smokedetector",
"tag_badges": []
},
{
"name": "Housekeeping",
"href": "/users/7829893/housekeeping",
"tag_badges": []
},
{
"name": "Generic Bot",
"href": "/users/7481043/generic-bot",
"tag_badges": []
},
{
"name": "double-beep",
"href": "/users/10607772/double-beep",
"tag_badges": [
[
"batch-file",
"bronze"
]
]
},
{
"name": "geisterfurz007",
"href": "/users/6707985/geisterfurz007",
"tag_badges": [
[
"batch-file",
"bronze"
]
]
}
]
},
{
"name": "Dawg's Waffle Haus",
"href": "/rooms/info/169987/dawgs-waffle-haus",
"tags": [
"waffle-related-items",
"waffles"
],
"users": [
{
"name": "QHarr",
"href": "/users/6241235/qharr",
"tag_badges": [
[
"json",
"bronze"
],
[
"beautifulsoup",
"silver"
],
[
"selenium",
"bronze"
],
[
"vba",
"gold"
],
[
"excel-vba",
"bronze"
],
[
"vba",
"bronze"
],
[
"internet-explorer",
"bronze"
],
[
"web-scraping",
"bronze"
],
[
"excel",
"bronze"
],
[
"beautifulsoup",
"bronze"
],
[
"html",
"silver"
],
[
"excel-formula",
"bronze"
],
[
"web-scraping",
"gold"
],
[
"web-scraping",
"silver"
],
[
"python",
"silver"
],
[
"python",
"bronze"
],
[
"excel-vba",
"silver"
],
[
"python-3.x",
"bronze"
],
[
"excel",
"gold"
],
[
"excel",
"silver"
],
[
"vba",
"silver"
],
[
"html",
"bronze"
]
]
},
{
"name": "Zoe the transgirl",
"href": "/users/6296561/zoe-the-transgirl",
"tag_badges": [
[
"java",
"bronze"
],
[
"android",
"bronze"
],
[
"kotlin",
"silver"
],
[
"android-studio",
"bronze"
],
[
"kotlin",
"bronze"
],
[
"android",
"silver"
]
]
},
{
"name": "Stephen Kennedy",
"href": "/users/397817/stephen-kennedy",
"tag_badges": [
[
"visual-studio",
"bronze"
],
[
"c#",
"silver"
],
[
".net",
"bronze"
],
[
"asp.net",
"bronze"
],
[
"c#",
"bronze"
]
]
},
{
"name": "double-beep",
"href": "/users/10607772/double-beep",
"tag_badges": [
[
"batch-file",
"bronze"
]
]
}
]
},
{
"name": "ASP.NET MVC",
"href": "/rooms/info/160742/asp-net-mvc",
"tags": [
"asp.net",
"asp.net-core",
"asp.net-mvc",
"asp.net-web-api",
"c#",
"cshtml"
],
"users": [
{
"name": "Alex",
"href": "/users/177416/alex",
"tag_badges": []
},
{
"name": "Rudi Visser",
"href": "/users/698179/rudi-visser",
"tag_badges": [
[
"c#",
"bronze"
],
[
"mysql",
"bronze"
],
[
"html",
"bronze"
],
[
"php",
"silver"
],
[
"php",
"bronze"
],
[
".net",
"bronze"
],
[
"c#",
"silver"
]
]
},
{
"name": "Falcon",
"href": "/users/7639883/falcon",
"tag_badges": []
},
{
"name": "Roland_dfa",
"href": "/users/6250993/roland-dfa",
"tag_badges": []
},
{
"name": "kabuto178",
"href": "/users/1671933/kabuto178",
"tag_badges": []
},
{
"name": "Ende",
"href": "/users/9427768/ende",
"tag_badges": []
}
]
},
{
"name": "SQL",
"href": "/rooms/info/11391/sql",
"tags": [
"db2",
"mysql",
"oracle",
"postgresql",
"rubberduck",
"sql",
"sql-server",
"tsql"
],
"users": [
{
"name": "Andy K",
"href": "/users/2572645/andy-k",
"tag_badges": []
},
{
"name": "Shaneis",
"href": "/users/2697001/shaneis",
"tag_badges": []
},
{
"name": "ARr0w",
"href": "/users/4993989/arr0w",
"tag_badges": []
},
{
"name": "H\u00e9ctor \u00c1lvarez",
"href": "/users/8300809/hector-alvarez",
"tag_badges": []
},
{
"name": "WhatsThePoint",
"href": "/users/7147233/whatsthepoint",
"tag_badges": []
},
{
"name": "Zulatin",
"href": "/users/1772025/zulatin",
"tag_badges": []
}
]
},
{
"name": "SO Close Vote Reviewers",
"href": "/rooms/info/41570/so-close-vote-reviewers",
"tags": [
"discussion",
"moderation",
"review"
],
"users": [
{
"name": "rene",
"href": "/users/578411/rene",
"tag_badges": [
[
"xml",
"bronze"
],
[
"c#",
"silver"
],
[
"c#",
"gold"
],
[
"winforms",
"bronze"
],
[
".net",
"bronze"
],
[
"batch-file",
"bronze"
],
[
"windows",
"bronze"
],
[
"asp.net",
"bronze"
]
]
},
{
"name": "NathanOliver",
"href": "/users/4342498/nathanoliver",
"tag_badges": [
[
"const",
"bronze"
],
[
"initializer-list",
"bronze"
],
[
"smart-pointers",
"bronze"
],
[
"c++17",
"bronze"
],
[
"g++",
"bronze"
],
[
"for-loop",
"bronze"
],
[
"reference",
"bronze"
],
[
"inheritance",
"bronze"
],
[
"std",
"bronze"
],
[
"lambda",
"bronze"
],
[
"overloading",
"bronze"
],
[
"vector",
"silver"
],
[
"stl",
"silver"
],
[
"struct",
"bronze"
],
[
"initialization",
"bronze"
],
[
"gcc",
"bronze"
],
[
"move-semantics",
"bronze"
],
[
"copy-constructor",
"bronze"
],
[
"iterator",
"bronze"
],
[
"language-lawyer",
"bronze"
],
[
"c++17",
"silver"
],
[
"function",
"bronze"
],
[
"templates",
"silver"
],
[
"class",
"bronze"
],
[
"unique-ptr",
"bronze"
],
[
"random",
"bronze"
],
[
"operator-overloading",
"bronze"
],
[
"string",
"silver"
],
[
"constructor",
"bronze"
],
[
"shared-ptr",
"bronze"
],
[
"c++11",
"gold"
]
]
},
{
"name": "TylerH",
"href": "/users/2756409/tylerh",
"tag_badges": [
[
"css",
"gold"
],
[
"css",
"silver"
],
[
"html",
"silver"
],
[
"css3",
"bronze"
],
[
"css",
"bronze"
],
[
"html",
"bronze"
]
]
},
{
"name": "Kyll",
"href": "/users/4174897/kyll",
"tag_badges": [
[
"javascript",
"bronze"
],
[
"meteor",
"bronze"
]
]
},
{
"name": "Machavity",
"href": "/users/2370483/machavity",
"tag_badges": [
[
"paypal",
"bronze"
],
[
"php",
"silver"
],
[
"php",
"gold"
],
[
"json",
"bronze"
]
]
},
{
"name": "Makyen",
"href": "/users/3773011/makyen",
"tag_badges": [
[
"javascript",
"silver"
],
[
"css",
"bronze"
],
[
"firefox-addon",
"bronze"
],
[
"google-chrome-extension",
"silver"
],
[
"jquery",
"bronze"
],
[
"firefox-addon-sdk",
"bronze"
],
[
"firefox-webextensions",
"bronze"
],
[
"html",
"bronze"
],
[
"firefox-addon",
"silver"
],
[
"google-chrome-extension",
"bronze"
],
[
"google-chrome",
"bronze"
],
[
"javascript",
"bronze"
],
[
"firefox",
"bronze"
]
]
},
{
"name": "kayess",
"href": "/users/4805174/kayess",
"tag_badges": [
[
"c#",
"bronze"
]
]
},
{
"name": "John Dvorak",
"href": "/users/499214/john-dvorak",
"tag_badges": [
[
"algorithm",
"bronze"
],
[
"regex",
"bronze"
],
[
"java",
"bronze"
],
[
"php",
"bronze"
],
[
"javascript",
"bronze"
],
[
"javascript",
"silver"
],
[
"jquery",
"bronze"
]
]
},
{
"name": "Praveen Kumar Purushothaman",
"href": "/users/462627/praveen-kumar-purushothaman",
"tag_badges": [
[
"twitter-bootstrap",
"gold"
],
[
"sql",
"bronze"
],
[
"html5",
"silver"
],
[
"twitter-bootstrap",
"silver"
],
[
"arrays",
"silver"
],
[
"css-selectors",
"bronze"
],
[
"php",
"gold"
],
[
"jquery-ui",
"bronze"
],
[
"validation",
"bronze"
],
[
"arrays",
"bronze"
],
[
"ajax",
"bronze"
],
[
"twitter-bootstrap-3",
"bronze"
],
[
"image",
"bronze"
],
[
"javascript",
"gold"
],
[
"forms",
"bronze"
],
[
"jquery",
"gold"
],
[
"json",
"bronze"
],
[
"html5",
"bronze"
],
[
"css",
"gold"
],
[
"ajax",
"silver"
],
[
"css3",
"silver"
],
[
"html",
"gold"
]
]
},
{
"name": "Petter Friberg",
"href": "/users/5292302/petter-friberg",
"tag_badges": [
[
"java",
"silver"
],
[
"java",
"bronze"
],
[
"jasper-reports",
"silver"
],
[
"jasper-reports",
"bronze"
]
]
}
]
},
{
"name": "#!/bin/bash",
"href": "/rooms/info/98569/bin-bash",
"tags": [
"bash",
"sh"
],
"users": [
{
"name": "Queen",
"href": "/users/6294609/queen",
"tag_badges": []
},
{
"name": "tripleee",
"href": "/users/874188/tripleee",
"tag_badges": [
[
"python",
"gold"
],
[
"variables",
"bronze"
],
[
"macos",
"bronze"
],
[
"utf-8",
"bronze"
],
[
"sed",
"silver"
],
[
"file",
"bronze"
],
[
"scripting",
"bronze"
],
[
"subprocess",
"bronze"
],
[
"linux",
"gold"
],
[
"python",
"silver"
],
[
"debian",
"bronze"
],
[
"shell",
"gold"
],
[
"python-3.x",
"bronze"
],
[
"gnu-make",
"bronze"
],
[
"php",
"bronze"
],
[
"awk",
"silver"
],
[
"makefile",
"bronze"
],
[
"unicode",
"bronze"
],
[
"command-line",
"bronze"
],
[
"if-statement",
"bronze"
],
[
"mime",
"bronze"
],
[
"sh",
"silver"
],
[
"unix",
"silver"
]
]
}
]
},
{
"name": "GMTs",
"href": "/rooms/info/75819/gmts",
"tags": [],
"users": [
{
"name": "David Arenburg",
"href": "/users/3001626/david-arenburg",
"tag_badges": [
[
"list",
"bronze"
],
[
"reshape",
"bronze"
],
[
"merge",
"bronze"
],
[
"aggregate",
"bronze"
],
[
"vectorization",
"bronze"
],
[
"tidyr",
"bronze"
],
[
"subset",
"bronze"
],
[
"dataframe",
"gold"
],
[
"ggplot2",
"bronze"
],
[
"dplyr",
"silver"
],
[
"apply",
"bronze"
],
[
"data.table",
"gold"
],
[
"loops",
"bronze"
],
[
"count",
"bronze"
],
[
"string",
"bronze"
],
[
"plyr",
"bronze"
],
[
"datetime",
"bronze"
],
[
"vector",
"bronze"
],
[
"matrix",
"bronze"
],
[
"dataframe",
"silver"
],
[
"dataframe",
"bronze"
],
[
"data.table",
"silver"
]
]
},
{
"name": "Jaap",
"href": "/users/2204410/jaap",
"tag_badges": [
[
"merge",
"bronze"
],
[
"dataframe",
"bronze"
],
[
"bar-chart",
"bronze"
],
[
"reshape",
"bronze"
],
[
"dplyr",
"bronze"
],
[
"data.table",
"silver"
],
[
"r",
"gold"
],
[
"r-faq",
"bronze"
],
[
"dataframe",
"silver"
],
[
"date",
"bronze"
],
[
"data.table",
"bronze"
],
[
"data.table",
"gold"
],
[
"ggplot2",
"gold"
],
[
"ggplot2",
"silver"
],
[
"r",
"silver"
],
[
"plot",
"bronze"
]
]
},
{
"name": "Tensibai",
"href": "/users/3627607/tensibai",
"tag_badges": [
[
"r",
"bronze"
],
[
"r",
"silver"
],
[
"chef",
"bronze"
],
[
"ruby",
"bronze"
],
[
"chef-recipe",
"bronze"
],
[
"chef",
"silver"
]
]
},
{
"name": "zx8754",
"href": "/users/680068/zx8754",
"tag_badges": [
[
"ggplot2",
"bronze"
],
[
"excel",
"bronze"
],
[
"dataframe",
"bronze"
],
[
"dplyr",
"bronze"
],
[
"plot",
"bronze"
],
[
"r",
"silver"
],
[
"bioinformatics",
"bronze"
],
[
"r",
"gold"
]
]
},
{
"name": "Sotos",
"href": "/users/5635580/sotos",
"tag_badges": [
[
"dplyr",
"silver"
],
[
"data.table",
"bronze"
],
[
"r",
"silver"
],
[
"vector",
"bronze"
],
[
"r",
"gold"
],
[
"dataframe",
"silver"
],
[
"dplyr",
"bronze"
],
[
"regex",
"bronze"
],
[
"r",
"bronze"
],
[
"dataframe",
"bronze"
]
]
},
{
"name": "Queen",
"href": "/users/6294609/queen",
"tag_badges": []
},
{
"name": "Cath",
"href": "/users/4137985/cath",
"tag_badges": [
[
"r",
"bronze"
],
[
"r",
"gold"
],
[
"dataframe",
"bronze"
],
[
"r",
"silver"
],
[
"regex",
"bronze"
]
]
},
{
"name": "Roman Lu\u0161trik",
"href": "/users/322912/roman-lustrik",
"tag_badges": [
[
"r",
"gold"
],
[
"statistics",
"bronze"
],
[
"dataframe",
"bronze"
],
[
"ggplot2",
"bronze"
],
[