BBB HTML Statistik - Python - Moodle Kursname hinzufügen?

Hallo zusammen,
ich habe mir mit dem Python-Script von dominik ein wirklich unsauberes und dreckiges Script gebastelt, welches ich in eine nur mir bekannte HTML-Datei umleite.
Zum loggen nutze ich das Script übrigens schon lange und finde es Hammer!
So habe ich eine super mobile Übersicht. Allerdings hätte ich gerne noch die Angabe zum Moodle-Kurs. Leider habe ich noch nie Python programmiert und auch mit der API etc. kenne ich mich nicht aus.
Kann mir hier evtl. jemand zu diesem Problem helfen?

Hier ist mein Python-Script, wo ich die Ausgabe minütlich in eine HTML-Datei umleite:

#!/usr/bin/env python
#coding:utf-8
# Mit bbb-conf --secret den Endpoint und das Secret anzeigen lassen
# import time module
import time
import os.path
 
URL = "URL/bigbluebutton/"
SECRET = "SECRET"

import imp, hashlib
from xml.etree import ElementTree

try:
    imp.find_module('requests')
    import requests
except ImportError:
    print "Package requests fehlt. Bitte mit pip install requests installieren."
    exit()

meeting_api_url = "getMeetings"

def main():

	request_url = URL + "api/" + meeting_api_url  + "?checksum=" + get_checksum(meeting_api_url)
	response = get_server_response(request_url)
	tree = get_tree_from_response(response)
	meetings = tree.find("meetings")

	sum_audio = 0
	sum_video = 0
	sum_listening = 0
	sum_participants = 0

	output_table = [["<table border=1><tr><th>ID</th>", "<th>room</th>", "<th>mod</th>", "<th>user</th>", "<th>hear</td>", "<th>speak</th>", "<th>vid</th>" , "<th>moodle</th><tr>"]]

	for index, meeting in enumerate(meetings):
		
		table_row = generate_table_row(meeting)
		table_row.insert(0, str(index+1))
		
		sum_participants += int(table_row[3])
		sum_listening += int(table_row[4])
		sum_audio += int(table_row[5])
		sum_video += int(table_row[6])
		moodle = meeting.find("bbb-context-name")
		table_row[0] = "<tr><td>"+table_row[0]+"</td>"
		table_row[1] = "<td>"+table_row[1]+"</td>"
		table_row[2] = "<td>"+table_row[2]+"</td>"
		table_row[3] = "<td>"+table_row[3]+"</td>"
		table_row[4] = "<td>"+table_row[4]+"</td>"
		table_row[5] = "<td>"+table_row[5]+"</td>"
		table_row[6] = "<td>"+table_row[6]+"</td>"
		output_table.append(table_row)
		output_table.append(["<td>"+str(moodle)+"</td></tr>"])
		
	
	output_table.append(["<tr><td colspan='8'>&nbsp;</td></tr>"])
	output_table.append(["<tr><td colspan='3'><b>Gesamt</b></td>", "<td><b>"+str(sum_participants)+"</b></td>", "<td><b>"+str(sum_listening)+"</b></td>", "<td><b>"+str(sum_audio)+"</b></td><b>", "<td><b>"+str(sum_video)+"</b></td></tr></table></body>"])

	max_width = calculate_max_width(output_table)
	print("<!DOCTYPE html><html lang='de'>  <head>    <meta charset='utf-8' />  <META NAME='robots' CONTENT='noindex, nofollow'>  <meta name='viewport' content='width=device-width, initial-scale=1.0' />    <title></title><style>td {text-align:center;}</style></head><body><center>"),
	if sum_participants > 0:
		# hier datum zeit ausgabe etc.
		print("<h1> --  BBB  --</h1><h1>"),
		print(time.strftime("%d.%m.%Y %H:%M")),
		print("</h1></center>"),
		# hier erfolgt ausgabe, falls min. 1 User Online ist
		for row in output_table:
			for index, data in enumerate(row):
				print (data.ljust(max_width[index])),
	else:
		print("<h1>Aktuell kein BBB offen</h1>")
		print("<h1>Zuletzt geprueft: "),
		print(time.strftime("%d.%m.%Y %H:%M")),
		print("</h1>")
		print("<h1> Letzter aktiver BBB: <u>"),
		print time.ctime(os.path.getmtime("/root/BBBlog/logs/5onlyBBB.log"))
		print("</u></h1></body>")
		

def get_server_response(url):
	try:
		response = requests.get(url=url)
	except requests.exceptions.ConnectionError:
		print ("Rufe URL " + url + " auf.")
		print ("Es trat ein Fehler bei der Verbindung auf. Ist die URL korrekt?")
	except requests.exceptions.MissingSchema:
		print ("Die URL ist nicht korrekt. Bitte auf Fehler prüfen.")


	if response.status_code != 200:
		print "Die URL gibt den Statuscode " + str(response.status_code)  + " zurück."
		exit()

	return response.content

def get_checksum(api_url):
	m = hashlib.sha1()
	m.update(api_url + SECRET)
	return m.hexdigest()

def get_tree_from_response(response):
	tree = ElementTree.fromstring(response)

	if tree.find("returncode").text != "SUCCESS":
		print "API-Fehler:",
		print tree.find("message").text
		exit()
	return tree

def generate_table_row(meeting):
	meetingName = meeting.find("meetingName").text.encode('utf-8')
	meetingAudio = int(meeting.find("voiceParticipantCount").text)
	meetingVideo = int(meeting.find("videoCount").text)
	meetingParticipants = int(meeting.find("participantCount").text)
	meetingListening = int(meeting.find("listenerCount").text)
	creator = "-"
	attendees = meeting.find("attendees")
	count = 0
	for attendee in attendees:
		if attendee.find("role").text == "MODERATOR":
			count+=1
			if count==1:
				creator = attendee.find("fullName").text.encode('utf-8')
			else:
				creator += ", " + attendee.find("fullName").text.encode('utf-8')

	return [meetingName, creator, str(meetingParticipants), str(meetingListening), str(meetingAudio), str(meetingVideo)]

def calculate_max_width(table):
	max_width = [0, 0, 0, 0, 0, 0, 0, 0]
	for row in table:
		for index, data in enumerate(row):
			max_width[index] = max(len(data), max_width[index])

	return max_width

if __name__ == '__main__':
    main()

Ich habe schon versucht mit

moodle = meeting.find(„bbb-context-name“)

eine Variable mit dem moodle-Raum zu füllen. Aber das war nur ins Blaue rein geraten, da Dominik hier etwas gepostet hatte, dass man die Moodle-Daten wohl abgreifen kann:

So sieht es dann momentan bei mir aus:

Ein Raum wäre, wenn hinten bei Moodle noch der Moodle-Raum stehen würde.
Es ist wirklich sehr schlecht gemacht und vermutlich sträuben sich da einige Haare, aber es hat mir schon sehr viel Übersicht gebracht, wenn 30 Räume oder mehr offen sind! Und auch gut auf dem Handy zu lesen.

Vielen Dank und viele Grüße
Thomas

Die von Moodle übergebenden Metadaten sehen so aus:

      <metadata>
        <bbb-context-name>A20 Einführungsphase</bbb-context-name>
        <bbb-origin-version>3.10.1+ (Build: 20210219)</bbb-origin-version>
        <bbb-context-id>280</bbb-context-id>
        <bbb-recording-name>Gruppenraum 2</bbb-recording-name>
        <bbb-origin-server-name>moodle.schule.de</bbb-origin-server-name>
        <bbb-recording-tags />
        <bbb-recording-description />
        <bbb-origin-tag>moodle-mod_bigbluebuttonbn (2019101003)</bbb-origin-tag>
        <bbb-origin-server-common-name />
        <bbb-context-label>A20</bbb-context-label>
        <bbb-origin>Moodle</bbb-origin>
        <bbb-context>A20 Einführungsphase</bbb-context>
      </metadata>

Ja, aber ich habe ja keine Ahnung, wie ich auf solche Meta-Daten aus dem Python-Script zugreifen kann. Sicherlich nur eine Kleinigkeit, aber ich habe da einfach keine Fachkenntnis :frowning:

meeting.find(„bbb-context-name“) scheint ja so wie versucht nicht zu funktionieren

Hallo Thomas & hmt,

schön das Du uns dein Script zur Verfügung stellst.
Wir haben zumindest 2 Sachen gemeinsam: Wenig(st) Programmier-Kenntnisse und -

das Problem mit den Moodle-Räumen.
Ich habe zeitweise über 5 Moodle-Plattformen und weiss nie von welchem Moodle gerade und Kurs aus auf BBB zugriffen wird.

htm:
Gerne stelle ich Dir einen Zugang zu meinem Moodle-Test-System bereit, wenn Du dadurch weiter kommst :slight_smile:
VG Andre

Hallo,

from bs4 import BeautifulSoup as bs

data = """
<metadata>
        <bbb-context-name>A20 Einführungsphase</bbb-context-name>
        <bbb-origin-version>3.10.1+ (Build: 20210219)</bbb-origin-version>
        <bbb-context-id>280</bbb-context-id>
        <bbb-recording-name>Gruppenraum 2</bbb-recording-name>
        <bbb-origin-server-name>moodle.schule.de</bbb-origin-server-name>
        <bbb-recording-tags />
        <bbb-recording-description />
        <bbb-origin-tag>moodle-mod_bigbluebuttonbn (2019101003)</bbb-origin-tag>
        <bbb-origin-server-common-name />
        <bbb-context-label>A20</bbb-context-label>
        <bbb-origin>Moodle</bbb-origin>
        <bbb-context>A20 Einführungsphase</bbb-context>
</metadata>
"""

soup = bs(data, "xml")
print(soup.find('bbb-context-name').contents)
# Gibt : ['A20 Einführungsphase']

Gruß

Arnaud

Leider überfordert mich das jetzt total. Wo bekomme ich denn meine Metdaten her? Ich verstehe es ja leider gar nicht. freue mich zwar, dass mir versucht wird zu helfen, aber das verstehe ich gar nicht.
Das ist nur ein Beispiel, wie ich generell auf Metadaten zugreifen kann, oder? Aber ich weiß ja nicht wo und wie die Metadaten übertragen werden. :frowning:

Hallo Thomas,

ändere mal
moodle = meeting.find(„bbb-context-name“)
zu
moodle = meeting.find(„bbb-context-name“).text.encode('utf-8')

Vielleicht ist das schon die Lösung.

leider nicht:
AttributeError: ‚NoneType‘ object has no attribute ‚text‘

Dennoch vielen Dank!

Dann mal
meeting.find(„metadata“).find(„bbb-context-name“).text.encode('utf-8')

Nachtrag:
Das könnte zu einem Fehler führen, wenn ein Raum nicht aus Moodle heraus erstellt wurde. Also besser

try:
    moodle = meeting.find(„metadata“).find(„bbb-context-name“).text.encode('utf-8')
except AttributeError as error:
    moodle = "-"
except Exception as error:
    moodle = ""
    print(error)
1 Like

Hallo, ich sehe gerade dieser Beitrag wurde nicht abgesendet. immer noch hier in der Vorschau :frowning:

@dominik leider nicht. Ist ja Wochenende und nur ich bin über Moodle drinnen. Da habe ich drauf geachtet.

Evtl. hast du oder wer anderes noch eine Idee. Folgendes funktioniert leider nicht:

Viele Grüße und vielen Dank
Thomas

ich hab in meinem Monitor nun auch die Moodle-Infos mit drinne. Aber ist halt wieder was anderes…

Hallo
Ja, das habe ich schon gesehen und finde ich nicht schlecht. Aber ich finde meins hat auch Vorteile. So sehe ich mehr Infos auf einen Blick
Wäre daher noch an einer Möglich interessiert, denn Moodle-Raum-Namen und einer Python Variable abzulegen
Vielen Dank

Hallo hmt,

Habe ich etwas verpasst, oder sprichst Du von der Version 1.0.13?
VG Andre

ja, 1.0.13. Die drei kleinen Punkte neben den Raumstatistiken.

Diesen Beitrag sehe ich jetzt erst. Tatsächlich ist der untergegangen! Das war die Lösung! Danke @dominik !!!