Skip to content

Instantly share code, notes, and snippets.

@eopo
Last active January 28, 2024 19:50
Show Gist options
  • Save eopo/f0dc692f23e2373000df6134b7b4e4e0 to your computer and use it in GitHub Desktop.
Save eopo/f0dc692f23e2373000df6134b7b4e4e0 to your computer and use it in GitHub Desktop.
iOS widget powered by the Scriptable app that shows the current capacity of your XtraFIT gym
/**
* Script for scriptable to get the current capacity of XTRAFIT Gyms
*/
let gymId = 210
let param = args.widgetParameter
if (param != null && param.length > 0) {
gymId = param
}
const gymDetails = await fetchGymDetails(gymId)
const currentGymCapacity = await fetchGymCapacity(gymDetails)
const gymName = gymDetails.webName
const widget = new ListWidget()
await createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()
//Create the widget
async function createWidget() {
const headlineText = widget.addText("🏋️ Capacity")
headlineText.font = Font.mediumRoundedSystemFont(19)
widget.addSpacer()
const widgetStack = widget.addStack()
widgetStack.layoutVertically()
widgetStack.bottomAlignContent()
const capacityText = widgetStack.addText(currentGymCapacity.toString() + "%")
capacityText.font = Font.mediumRoundedSystemFont(50)
if (currentGymCapacity < 20) {
capacityText.textColor = new Color("#33cc33")
} else if (currentGymCapacity < 30){
capacityText.textColor = new Color("#ff9900")
}else{
capacityText.textColor = new Color("#ff3300")
}
widgetStack.addSpacer(1)
const gymNameText = widgetStack.addText(gymName)
gymNameText.font = Font.regularSystemFont(12)
}
//Fetches the current capacity of the XTRAFit gym
async function fetchGymDetails(id) {
const url = 'https://xtrafitclubsdynamic.hirschenvalley.de/application'
const req = new Request(url)
req.headers = {"Content-Type": "application/json"}
const apiResult = await req.loadJSON()
for (var i in apiResult){
if(apiResult[i].centerId == id)
{
return apiResult[i]
}
}
return {webName: 'Studio nicht gefunden', currentlyCheckedInCount: 0, maximumAllowedCheckedIn: 0}
}
//Fetches the Capacity of the gym
async function fetchGymCapacity(gymDetails) {
return gymDetails.currentlyCheckedInCount * 100 / gymDetails.maximumAllowedCheckedIn || 0
}
@eopo
Copy link
Author

eopo commented Oct 26, 2020

This gist ist not up to date and the code shown does not work anymore

Head to this gist for a working version!

Fork of https://gist.github.com/masselmello/6d4f4c533b98b2550ee23a7a5e6c6cff

Original Content

![image](https://user-images.githubusercontent.com/26900313/97023504-e434c880-1555-11eb-9995-f02f04c0ead7.png)

How to use:

  1. You need to have Scriptable on your iOS 14 device and open it
  2. Tap on the plus in the upper right corner
  3. Tap on "Untitled Script" and give the script a name, for example "Gym Capacity"
  4. Copy the source code from above and paste it in the blank field
  5. Save it.
  6. Go to your home screen and enter wiggle mode. Then tap on the plus in the upper left corner.
  7. Select Scriptable from the promoted widgets, the app list or search for scriptable.
  8. Select your widget size.
  9. Tap on "Add widget"
  10. Tap on the newly added widget.
  11. Select the John Reed script. On "When Interacting", you can select "Run Script", but it'll work just fine with "Open App"
  12. Paste your studio ID as parameter. You can see it in the table below.
    image
  13. Finished! 😍
Studio ID
Bonn-Zentrum 310
Essen-Vogelheim 210
Frankfurt Nieder-Eschbach 280
Hamburg-Wandsbek 320
Krefeld-Cracau 230
Köln-Buchheim 220
Köln-Ehrenfeld 200
Köln-Marsdorf 270
Köln-Ossendorf 250
Langenfeld-Berghausen 290
Mainz-Bretzenheim 240
Offenbach-Zentrum 300
Wiesbaden-Hauptbahnhof 260
Zentrale 100

@matzepipo
Copy link

matzepipo commented Apr 3, 2021

Ist da eine Störung??????
Bekomme keine Verbindung mehr

@matzepipo
Copy link

Nochmal ich. Das Script funktioniert irgendwie nicht mehr mit dem Xtrafit Studio.

Kann sich das mal jemand ansehen ?

Gruß

Stefan

Script didn’t work with Xtrafit. Could anybody fix it ?

Stefan

@max-sti
Copy link

max-sti commented Jul 29, 2021

2021-07-29 09:56:58: Error: Das Zertifikat für diesen Server ist ungültig. Eventuell wird eine Verbindung mit einem Server hergestellt, der vorgibt, „xtrafitclubsdynamic.hirschenvalley.de“ zu sein und vertrauliche Daten gefährdet.

@dennismetz
Copy link

@Jonas-wav
Copy link

Jonas-wav commented Dec 14, 2023

@dennismetz, leider haben die bei Xtrafit die Api erneut verändert. Konnte mit viel Ausprobieren keine Lösung finden.... Hast du evtl noch einen Fix oder irgendwer anders hier?

@dennismetz
Copy link

@Jonas-wav Die haben die API leider vor längerer Zeit entfernt... aktuell gibt's leider keine Chance da wieder was zu machen - ärgert mich auch etwas

@N1c093
Copy link

N1c093 commented Jan 21, 2024

@dennismetz
Aktuell scheint die offizielle App nur noch eine Webseite einzubetten. Diese Webseite ist z.B. für Hamburg-Wandsbek unter folgender URL erreichbar: https://api.myfitapp.de/metric/display/160173

Mit curl lassen sich die prozentualen Werte z.B: so auslesen curl -s "https://api.myfitapp.de/metric/display/160173" | grep -o 'data-display-percentage="[0-9]\+"'

Vielleicht könnt ihr die Webseite auch für euer Projekt benutzen.
Falls ihr auch noch die URLs für die anderen Standorte benötigt, sagt gerne bescheid.

@dennismetz
Copy link

@N1c093 super, danke für die Info!
Das Script funktioniert damit tatsächlich wieder.

Kannst du die IDs/URLs der anderen Standorte bereitstellen - dann würde ich das Script mal aktualisieren.
Wie liest du die IDs der anderen Standorte aus?

@N1c093
Copy link

N1c093 commented Jan 22, 2024

@dennismetz
Hier ist einmal die Auflistung:

Standort Url
Bonn-Zentrum https://api.myfitapp.de/metric/display/155160
Essen-Vogelheim https://api.myfitapp.de/metric/display/157483
Frankfurt-Nord https://api.myfitapp.de/metric/display/160171
Hamburg-Wandsbek https://api.myfitapp.de/metric/display/160173
Köln-Buchheim https://api.myfitapp.de/metric/display/160174
Köln-Ehrenfeld https://api.myfitapp.de/metric/display/160176
Köln-Marsdorf https://api.myfitapp.de/metric/display/160177
Köln-Ossendorf https://api.myfitapp.de/metric/display/160178
Köln-Poll https://api.myfitapp.de/metric/display/160179
Krefeld-Cracau https://api.myfitapp.de/metric/display/160180
Langenfeld-Berghausen https://api.myfitapp.de/metric/display/160181
Mainz-Bretzenheim https://api.myfitapp.de/metric/display/160183
Offenbach-Zentrum https://api.myfitapp.de/metric/display/160184
Reutlingen-Mitte https://api.myfitapp.de/metric/display/196775
Sindelfingen-Goldbach https://api.myfitapp.de/metric/display/168112
Unna-Kamen Karree https://api.myfitapp.de/metric/display/160185
Wiesbaden-Hauptbahnhof https://api.myfitapp.de/metric/display/160186

Die URLs habe ich über die Android App herausgefunden indem ich https://httptoolkit.com/ verwendet habe. Alternativ kann auch https://www.charlesproxy.com/ verwendet werden. Sobald du die entsprechende Auslastung in der App aufrufst, kannst du über diese Tools die genaue URL sehen.

@dennismetz
Copy link

Super, danke!

Ich habe das Script mal angepasst, hier ist die aktuelle Version:

https://gist.github.com/dennismetz/611b1e8f64c2160c8f24253f792fa0b6

IMG_0698

@Jonas-wav
Copy link

@N1c093 Das hatte ich auch gesehen, bin aber am Script gescheitert. Danke @dennismetz <3

@eopo
Copy link
Author

eopo commented Jan 28, 2024

Ich habe die Beschreibung mal angepasst und auf @dennismetz' Repo verwiesen. Der Übersichtlichkeit halber würde ich vorschlagen, den Austausch dann auch dort weiterzuführen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment