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'> </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