File Extension Image for quizlet.old.py quizlet.old.py
3699 Chars | 135 Lines | 3.70 kb | Text File Parent Directory
import json
import os
from uuid import uuid4
import sys
import re
import shutil
import click
from bs4 import BeautifulSoup
import requests
import time

import firebase_admin
from firebase_admin import firestore

# 
# 
# 
# USE THIS -> https://quizlet.com/webapi/3.4/studiable-item-documents?filters%5BstudiableContainerId%5D=822716358&filters%5BstudiableContainerType%5D=1&perPage=1000&page=1
# 
# 
# 

# Application Default credentials are automatically created.
app = firebase_admin.initialize_app()
db = firestore.client()

# Basic User Agent
headers = {
  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
  'accept-encoding': 'gzip, deflate, br',
  'accept-language': 'en-US,en;q=0.9',
  'cache-control': 'max-age=0',
  'cookie': 'yourcookie',
  'sec-fetch-mode': 'navigate',
  'sec-fetch-site': 'none',
  'sec-fetch-user': '?1',
  'upgrade-insecure-requests': '1',
  'user-agent': 'Mozilla/5.0 (X11; CrOS x86_64 12239.92.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.136 Safari/537.36',
}

def profile_to_tome(profile):
	print(f"Uploading all Quizlets from {profile} to the Tomes")

	if os.path.exists(f"{profile}.html"):
		with open(f"{profile}.html", encoding="utf8") as file:
			html = file.read()

		# Parse it!
		soup = BeautifulSoup(html, "html.parser")
	else :
		# Parse it!
		soup = BeautifulSoup(requests.get(f"https://quizlet.com/{profile}", headers=headers).text, "html.parser")

	# Get all Quizlets
	quizlets = soup.select(".DashboardListItem a.UILink")

	# Process each Quizlet
	for quizlet in quizlets:
		process_quizlet(quizlet["href"], skip=True)
		# Don't trigger bot detection
		time.sleep(1)

def process_quizlet(url, skip=False):
	# Make an out directory
	if os.path.exists("out"):
		shutil.rmtree("out")
	os.makedirs("out")

	# Parse it!
	soup = BeautifulSoup(requests.get(url, headers=headers).text, "html.parser")

	# Extract the metadata
	title = soup.title.string.replace(" | Quizlet", "")
	author = soup.select_one(".UserLink-username").text
	packClass = soup.select_one("ol.AssemblyBreadcrumbs-list").getText(strip=True, separator="/")

	# Base Pack
	pack = {
		"name": title,
		"uid": "none",
		"date": "∞",
		"class": packClass,
		"content": [],
		"published": True,
		"uuid": str(uuid4()),
		"author": "tomes",
		"superficialAuthor": author,
		"folder": packClass,
		"categories": {
			"default": {
				"colors": ["transparent", "transparent"],
				"name": "Default",
			},
		},
	}

	for _i, (term, definition) in enumerate(
		zip(
			soup.select(".SetPageTerm-wordText span"),
			soup.select(".SetPageTerm-definitionText span"),
		),
		1,
	):
		pack["content"].append(
			{
				"term": term.get_text(strip=True, separator='\n'),
				"definition": definition.get_text(strip=True, separator='\n'),
				"uuid": str(uuid4()),
				"category": "default",
			}
		)

	# Write the deck to a file
	scrubbed = re.sub("\W+", "_", title)
	location = f"out/{scrubbed}.json"
	with open(location, "w") as file:
		file.write(json.dumps(pack, indent=4))

	# Write the deck to the database
	if (skip):
		db.collection("packs/tomes/packs").document(pack["uuid"]).set(pack)
		return
	
	if click.confirm(
		f"View the created pack in {location}\nWould you like to upload the pack to Pecto?",
		default=True,
	):
		db.collection("packs/tomes/packs").document(pack["uuid"]).set(pack)


if __name__ == "__main__":
	if (len(sys.argv) >= 2):
		if (sys.argv[1].find("quizlet.com") != -1):
			process_quizlet(sys.argv[1])
		else:
			profile_to_tome(sys.argv[1])