import requests from bs4 import BeautifulSoup import mechanize import time import datetime import traceback import json import http.client with open("config.json", "r") as fp: config = json.load(fp) USERNAME = config["username"] PASSWORD = config["password"] WEBHOOK_URL = config["webhook"] LOGOUT = config["logout"] BROWSER = mechanize.Browser() BROWSER.set_handle_robots(False) def login(): login_url = "https://www.giantswd.org/forum/ucp.php?mode=login" # Login print("Logging in...") BROWSER.open(login_url) BROWSER.select_form(id="login") BROWSER["username"] = USERNAME BROWSER["password"] = PASSWORD BROWSER.submit() def is_logged_in(): global BROWSER response = BROWSER.response() if not response: return False try: return b' '+USERNAME.encode("utf8")+b'' in response.get_data() except http.client.IncompleteRead: BROWSER = mechanize.Browser() return is_logged_in() ignored = ["AmazedBot"] connected = [] def loop(): global connected homepage_url = "https://www.giantswd.org/forum/" logout_url = "https://www.giantswd.org/forum/ucp.php?mode=logout" newposts_url = "https://www.giantswd.org/forum/search.php?search_id=unreadposts" if not is_logged_in(): login() if config["logged_users"]: # Send a webhook when people connect on GWD forums print("Getting connected people...") homepage_resp = BROWSER.open(homepage_url) homepage_html = homepage_resp.get_data() bs = BeautifulSoup(homepage_html, features="html5lib") div_online = bs.find("div", attrs={"class": "online-list"}) div_username_online = div_online.find_all("a", attrs={"class": "username"}) new_users = [] for username_elem in div_username_online: user = username_elem.contents[0] if user not in ignored and user not in connected: new_users.append(user) print("User connected: %s" % user) webhook_data = { "embeds": [ { "title": "A user has logged in on GWD forums!", "description": "**%s** has just logged in" % user, "color": 55039, "author": { "name": "GiantsWD forums" }, "footer": { "text": "" }, "timestamp": datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z' } ] } requests.post(WEBHOOK_URL, json=webhook_data) connected = new_users # Get new posts print("Getting new posts...") has_newposts = False newposts_resp = BROWSER.open(newposts_url) newposts_html = newposts_resp.get_data() bs = BeautifulSoup(newposts_html, features="html5lib") all_newposts = bs.find_all("dl", attrs={"class": "topic_unread"}) for newpost in all_newposts: has_newposts = True newpost_title = newpost.find(class_="topictitle").contents[0] newpost_link = newpost.find(class_="topictitle")["href"] newpost_username = newpost.find(class_="username").contents[0] newpost_link_real = "https://www.giantswd.org/forum/%s" % (newpost_link[2:]) print("%s has created a new post %s (%s)" % (newpost_username, newpost_title, newpost_link_real)) webhook_data = { "embeds": [ { "title": "A new message has been posted!", "description": "**%s** has posted a new message in [**%s**](%s)" % (newpost_username, newpost_title, newpost_link_real), "color": 55039, "author": { "name": "GiantsWD forums" }, "footer": { "text": "" }, "timestamp": datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z' } ] } requests.post(WEBHOOK_URL, json=webhook_data) if has_newposts: # Mark all read print("Mark all read...") a = bs.find("a", class_="mark-read") mark_read_url = a["href"] BROWSER.open(mark_read_url) # Logout if LOGOUT: print("Logout...") BROWSER.open(logout_url) if __name__ == "__main__": while True: try: loop() except: print(datetime.datetime.now()) traceback.print_exc() print("Sleeping...") time.sleep(config["check_seconds"])