Welcome to JacSON: a Javascript and JSON-based scraper and publishing tool for UQ Jac Course Profiles.
This guide explains everything that must be edited if you’re adapting JacSON for another school, faculty, or institution.
JacSON automates the retrieval of learning outcomes, assessment details, and weekly learning activities from the current (non-archived) version of the UQ course profiles website. These outputs can then be used to pre-populate components in Blackboard Ultra using JavaScript, enabling a more efficient course build process for teaching teams and learning designers.
course-list.csv
file to determine which courses to scrape or ignore.Here’s how to replicate JacSON from scratch in your school or faculty.
If you haven’t already, download the Repo as a ZIP file. Instructions below assume you’ve saved it to: %USERPROFILE%\Documents\JacSON
Make sure Python 3.10 or later is installed.
Once that is installed, open a command prompt window (CMD.exe, not PowerShell!) and change to the folder: e.g. cd %USERPROFILE%\Documents\JacSON
Then install dependencies:
pip install -r requirements.txt
JacSON expects this layout:
A (Course Code) | B (Auto) | C (Status) | D (Manual) | E | F (Notes) |
---|---|---|---|---|---|
ACCT7804 | TRUE |
TRUE
to auto-runTRUE
, the course is ignoredJacSON reads and writes to a shared Google Sheet. To enable this:
jacson-api@your-project.iam.gserviceaccount.com
)Place your credentials JSON here:
./secrets/credentials.json
GOOGLE_SERVICE_ACCOUNT_JSON
.Go to: https://github.com/login
Fill out the form:
JacSON Uploader
repo
→ full control of private repositoriesThis includes:
repo:status
repo_deployment
public_repo
repo:invite
Create a file:
./secrets/github_token.txt
Paste the token into the file:
ghp_XXXXXXXXXXXXXXXXXXXXXXXXXXXX
✔️ Now JacSON’s upload_profiles.py
will authenticate and upload .json
course-list.csv
directlypython scripts/generate_course_list.py
python jacson.py
python scripts/upload_profiles.py
Save this as run_jacson.bat
in the same folder as your JacSON project:
@echo off cd /d "C:\Path\To\Your\JacSON" python scraper_runner.py
🔄 Replace
C:\Path\To\Your\JacSON
with your actual folder path.
Run JacSON Scraper
C:\Path\To\Your\JacSON\run_jacson.bat
Save this as run_jacson.sh
and make it executable:
#!/bin/bash cd /path/to/your/JacSON /usr/bin/python3 scraper_runner.py
Use
which python3
to confirm the Python path
Then make it executable:
chmod +x run_jacson.sh
Edit your crontab:
crontab -e
Add a line like this (for 9:00 PM daily):
0 21 * * * /path/to/your/JacSON/run_jacson.sh >> /path/to/your/JacSON/logs/cron.log 2>&1
Below is a complete list of files, variables, and settings that you will need to modify to get JacSON running in your own environment.
File: scripts/sheets_updater.py
Lines:
SPREADSHEET_ID = '1tJ04EY1AtyS-7iKlmgZhmom0f97xK3DsZ88wkqmRwNs'
RANGE_NAME = 'Sheet1!A2:F'
CREDENTIALS_FILE = os.path.join('secrets', 'credentials.json')
SPREADSHEET_ID
with your own Google Sheet ID (found in the URL).RANGE_NAME
if your data starts in a different cell.credentials.json
exists at ./secrets/credentials.json
.Files:
scripts/sheets_updater.py
scripts/update_status.py
scripts/generate_course_list.py
These scripts expect a service account credential file saved to:
./secrets/credentials.json
File: scripts/upload_profiles.py
Lines:
GITHUB_OWNER = "uqgblaze"
GITHUB_REPO = "jacson"
File: scripts/upload_profiles.py
Line:
TOKEN_PATH = os.path.join(PROJECT_ROOT, "secrets", "github_token.txt")
All Google Sheets integrations assume:
🔄 Adjust in scripts if your Sheet layout differs.
File: jacson.py
Line:
target_domain = "https://course-profiles.uq.edu.au/course-profiles/"
File: jacson.py
→ inside save_course_data()
Line:
profiles_root = os.path.join(base_directory, "profiles")
Files: jacson.py
, generate_course_list.py
, sheets_updater.py
course-list.csv
is read and written by many scripts. You may rename it, but update all references.File: .github/workflows/run-jacson.yml
Line:
cron: '0 17 * * *' # 3:00 AM AEST
What to Change | File(s) | Location/Note |
---|---|---|
Google Sheets ID | sheets_updater.py |
SPREADSHEET_ID |
Sheets API credentials | All Google-related scripts | Path: ./secrets/credentials.json |
GitHub repo details | upload_profiles.py |
GITHUB_OWNER , GITHUB_REPO |
GitHub token | upload_profiles.py |
./secrets/github_token.txt |
Course sheet column logic | Sheets-related scripts | B = Auto, C = Status, D = Manual, F = Notes |
Target scrape domain | jacson.py |
Inside get_course_profile_links() |
Output folder | jacson.py |
Inside save_course_data() |
CSV filename | Most scripts | course-list.csv |
GitHub Action schedule | run-jacson.yml |
cron: section |
JacSON was built by the UQ Business School Learning Design team with both love 💖 and spite 🤬 for Ultra’s Assessment Overview tables. Here’s to never needing to manually update those tables ever again!