def lastPost(groupname):
    group = findGroup(groupname)
    memberdict = {}
    allmemdict = {}
    nopostlist = []
    messagelist = list(group.messages.list().autopage())

    for member in group.members:
        allmemdict[member.user_id] = member.name

    for message in messagelist:
        if message.user_id not in memberdict.keys():
            memberdict[message.user_id] = {
                "name": message.name,
                "date": message.created_at
            }

    print("Most recent message per member:")
    sorted_memberdict = sorted(memberdict.items(),
                               key=lambda x: x[1]["name"],
                               reverse=True)
    for index in sorted_memberdict:
        print(f"{index[1]['name']} - {index[1]['date'].strftime('%m-%d-%Y')}")

    for key, val in allmemdict.items():
        if key not in memberdict.keys():
            nopostlist.append(val)

    print(
        f"\n{len(nopostlist)} members that haven't posted in {group.name}:\n{nopostlist}"
    )
def messInMonth(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    memberdict = {}
    monthlist = [6, 7, 8]

    for member in group.members:
        memberdict[member.user_id] = {"name": member.name, "mess": 0}

    for message in messagelist:
        # print(message.created_at.month)
        if message.created_at.month in monthlist and message.created_at.year == datetime.today(
        ).year:
            try:
                memberdict[message.user_id]["mess"] += 1
            except:
                pass

    sorted_memberdict = sorted(memberdict.items(),
                               key=lambda x: x[1]["mess"],
                               reverse=True)

    for index in sorted_memberdict:
        if index[10]["mess"] > 0:
            print(f'{index[1]["name"]} - {index[1]["mess"]}')
def consecPosts(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    memberdict = {}

    for member in group.members:
        memberdict[member.user_id] = {
            "name": member.name,
            "curr": 0,
            "high": 0,
            "currlist": [],
            "highlist": []
        }

    for message in messagelist:
        for key, val in memberdict.items():
            if message.user_id == key:
                val["curr"] += 1
                try:
                    val["currlist"].append(message.text)
                except:
                    val["currlist"].append("A message")
                if val["curr"] > val["high"]:
                    val["high"] = val["curr"]
                    val["highlist"] = val["currlist"]
            else:
                val["curr"] = 0
                val["currlist"] = []

    for val in memberdict.values():
        if val['high'] > 1:
            print(f"{val['name']} : {val['high']}")
            print(f"{val['highlist']}\n\n")
Example #4
0
def pullGroup(groupname):
    group = findGroup(groupname)
    folderpath = f".\\Offline\\{group.name}"
    messagelist = list(group.messages.list().autopage())
    memberdata = []
    messagedata = []

    # Create offline folder if needed
    if not os.path.exists(folderpath):
        os.makedirs(folderpath)

    # Write members.csv
    for member in group.members:
        memberdata.append([member.user_id, member.name])

    memberframe = pd.DataFrame(memberdata, columns=["user_id", "name"])
    memberframe.to_csv(f"{folderpath}\\members.csv")

    # Write messages.csv
    for message in messagelist:
        messagedata.append([
            message.created_at, message.name, message.text,
            message.favorited_by
        ])

    messageframe = pd.DataFrame(
        messagedata, columns=["created_at", "name", "text", "favorited_by"])
    messageframe.to_csv(f"{folderpath}\\messages.csv")
Example #5
0
def likeStats(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    memberdict = {}
    memberlist = list(group.members)

    path = f"./Groups/{group.name}"
    if not os.path.exists(path):
        os.makedirs(path)

    for outer in memberlist:
        memberdict[outer.user_id] = {}
        for inner in memberlist:
            memberdict[outer.user_id][inner.user_id] = 0

    for message in messagelist:
        if len(message.favorited_by) > 0:
            for index in message.favorited_by:
                try:
                    memberdict[message.user_id][index] += 1
                except:
                    # print(message.data)
                    pass

    with open(path + "/ExtendedLikeStats.txt", "w") as writer:
        for key, val in memberdict.items():
            writer.write(f"{findMember(group, key).name}\n")
            for ikey, ival in val.items():
                if ival > 0:
                    writer.write(f"\tLiked {findMember(group, ikey).name} - {ival}\n")
            writer.write("\n\n")
Example #6
0
def likeStreak(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    memberdict = {}

    for member in group.members:
        memberdict[member.user_id] = {"name" : member.name, "totallikes" : 0, "currstreak" : 0, "beststreak" : 0}

    for message in messagelist:
        for key, val in memberdict.items():
            if key in message.favorited_by:
                val["currstreak"] += 1
                val["totallikes"] += 1
            # While this is technically innacurate, it may be more "applicable"
            # because users usually don't like their own messages
            elif message.user_id == key:
                pass
            else:
                if val["currstreak"] > val["beststreak"]:
                    val["beststreak"] = val["currstreak"]
                val["currstreak"] = 0

    print("Like Stats:")
    for val in memberdict.values():
        if val["beststreak"] > 0:
            print(f"{val['name']}\n\tBest Streak - {val['beststreak']}\n\tTotal Likes - {val['totallikes']}\n")
Example #7
0
def printPandas(groupname):
    group = findGroup(groupname)
    folderpath = f".\\Offline\\{group.name}"
    memberframe = pd.read_csv(f"{folderpath}\\members.csv", index_col=0)
    messageframe = pd.read_csv(f"{folderpath}\\messages.csv", index_col=0)

    print(memberframe)
    print(messageframe)
def mutedChat(groupname):
    group = findGroup(groupname)
    muted = 0

    for member in group.members:
        if member.muted:
            muted += 1

    print(f"{muted} members have {group.name} muted")
def eventsAttended(groupname, sincedate):
    import pytz
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    if sincedate:
        sincedate = datetime.strptime(sincedate, '%m/%d/%Y')
        sincedate = pytz.UTC.localize(sincedate)
    else:
        sincedate = datetime.strptime("01/01/1999")

    memberdict = {}
    eventlist = []
    for member in group.members:
        memberdict[member.nickname] = {
            "name": member.name,
            "attended": 0,
            "idlist": []
        }

    for message in messagelist:
        if message.created_at > sincedate:
            try:
                # Don't count duplicate "going" responses
                if message.data["event"][
                        "type"] == "calendar.event.user.going" and message.data[
                            "event"]["data"]["event"]["id"] not in memberdict[
                                message.data["event"]["data"]["user"]
                                ["nickname"]]["idlist"]:
                    memberdict[message.data["event"]["data"]["user"]
                               ["nickname"]]["attended"] += 1
                    memberdict[message.data["event"]["data"]["user"][
                        "nickname"]]["idlist"].append(
                            message.data["event"]["data"]["event"]["id"])
            except:
                pass

            try:
                if message.data["event"][
                        "type"] == "calendar.event.user.going" and message.data[
                            "event"]["data"]["event"]["name"] not in eventlist:
                    eventlist.append(
                        message.data["event"]["data"]["event"]["name"])
            except:
                pass

    # {k: v for k, v in sorted(memberdict.items(), key=lambda item: item[1]["attended"])}
    sortedmemberdict = dict(
        sorted(memberdict.items(),
               key=lambda item: item[1]["attended"],
               reverse=True))

    print(f"Events attended since {sincedate}")
    for key, val in sortedmemberdict.items():
        if val['attended'] > 0:
            print(f"{val['name']} attended {val['attended']}")
    print(eventlist)
Example #10
0
def liker(groupname, reqlikes):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())

    if reqlikes == "all":
        reqlikes = len(messagelist)
    else:
        reqlikes = int(reqlikes)

    for num in range(reqlikes):
        messagelist[num].like()
def memberStats(groupname, membername):
    group = findGroup(groupname)
    member = findMember(group, membername)
    messagelist = list(group.messages.list().autopage())
    messagesposted = 0
    likes = 0
    counter = 0
    receivedlikes = 0
    totallikes = 0
    found = False

    for message in messagelist:
        counter += 1
        totallikes += len(message.favorited_by)
        # Figure out when member joined/was added
        if message.system and not found:
            # Check to see if the users were added
            if message.event["type"] == "membership.announce.added":
                # Iterate the added_users list
                for index in range(len(message.event['data']['added_users'])):
                    if str(message.event['data']['added_users'][index]
                           ['id']) == str(member.user_id):
                        print(
                            f"Added by {message.event['data']['adder_user']['nickname']} on {convertCreatedAt(message)}"
                        )
                        found = True
            # Check to see if the user joined
            elif message.event["type"] == "membership.announce.joined":
                if str(message.event['data']['user']['id']) == str(
                        member.user_id):
                    print(
                        f"Joined {group.name} on {convertCreatedAt(message)}")
                    found = True
        # Count messages posted
        if message.user_id == member.user_id:
            messagesposted += 1
        # Count likes
        if member.user_id in message.favorited_by:
            likes += 1
        # Count number of likes received
        if message.user_id == member.user_id:
            receivedlikes += len(message.favorited_by)

    # Print results
    print(
        f"Posted {messagesposted} out of {counter} ({round(messagesposted/counter*100,2)}%) messages"
    )
    print(
        f"Liked {likes} out of {counter} ({round(likes/counter*100,2)}%) messages"
    )
    print(
        f"Received {receivedlikes} out of {totallikes} ({round(receivedlikes/totallikes*100,2)}%) likes"
    )
def averMessPerMonth(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    memberdict = {}
    details = ""
    counter = 0

    path = f"./Groups/{group.name}"

    # Instantiate the memberdict member objects with counters at 0
    for member in group.members:
        memberdict[member.user_id] = {
            "messcount": 0,
            "firstmessdate": "",
            "aver": 1,
            "diffmonths": 1
        }

    # For each message, increase message.user_id value by 1 and total counter by 1.
    for message in messagelist:
        try:
            memberdict[message.user_id]["messcount"] += 1
            memberdict[message.user_id]["firstmessdate"] = message.created_at
            counter += 1
        except:
            pass

    for x, y in memberdict.items():
        if not y["messcount"] == 0:
            diffmonths = (datetime.today().year - y["firstmessdate"].year
                          ) * 12 + (datetime.today().month -
                                    y["firstmessdate"].month)
            if diffmonths == 0:
                diffmonths = 1
            y["aver"] = round(y["messcount"] / diffmonths)
            y["diffmonths"] = diffmonths

    sorted_memberdict = sorted(memberdict.items(),
                               key=lambda x: x[1]["aver"],
                               reverse=True)
    for i in sorted_memberdict:
        membername = findMember(group, i[0]).name
        # print(f"{membername} - Average Messages/Month: {i[1]['aver']}")
        details = details + membername + "\n\tMessages Sent - " + str(
            i[1]['messcount']) + "\n\tMembership in Months - " + str(
                i[1]['diffmonths']
            ) + "\n\tAverage Messages per Month - " + str(i[1]['aver']) + "\n"

    with open(f"{path}/AverPostsPerMonth.txt", "w") as writer:
        writer.write(
            f"--- Average Posts per Month for {group.name} out of {len(group.members)} members and {counter} posts as of {datetime.now().strftime('%m/%d/%Y')} ---\n"
        )
        writer.write(details)
def backupMems(groupname):
    group = findGroup(groupname)
    memberlist = []

    for member in group.members:
        memberlist.append(member.name)

    memberlist.sort()

    path = f"./Groups/{group.name}/"
    with open(f"{path}members.txt", "w") as writer:
        for index in memberlist:
            writer.write(f"{index}\n")
Example #14
0
def numLikesGiven(groupname):
    group = findGroup(groupname)
    totalposts = 0

    path = f"./Groups/{group.name}"
    if not os.path.exists(path):
        os.makedirs(path)

    print("Filling memberdict...")
    memberdict = {}
    for member in group.members:
        memberdict[member.user_id] = {"name" : member.name, "likesgiven" : 0, "posts" : 0}

    print("Filling messagelist...")
    messagelist = list(group.messages.list().autopage())

    print("Filling likes...")
    for message in messagelist:
        # Add one to the total posts
        totalposts += 1
        try:
            # Add one to the relevant member's total posts
            memberdict[message.user_id]["posts"] += 1
        except KeyError:
            pass
        except Exception as e:
            print(f"Error occurred {e}")

        for messagelike in message.favorited_by:
            try:
                # Add a like to each member in the favorited_by list
                memberdict[messagelike]["likesgiven"] += 1
            except KeyError:
                pass
            except Exception as e:
                print(f"Error occurred {e}")

    # Sort by number of likes given
    print("Sorting memberdict...")
    sorted_memberdict = sorted(memberdict.items(), key=lambda x: x[1]["likesgiven"], reverse=True)

    print(f"Writing results to {path}/percentagelikes.txt...")
    with open(path + "/percentagelikes.txt", "w") as writer:
        writer.write(f"Percentage of likes given of messages not posted by member in {group.name}...\n")
        for entry in sorted_memberdict:
            name = entry[1]["name"]
            likedmessages = entry[1]["likesgiven"]
            posts = entry[1]["posts"]
            otherposts = totalposts - posts
            writer.write(f"{name} liked {round(likedmessages/otherposts*100,2)}% of {otherposts} messages\n")
Example #15
0
def fullDownPics(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    urlmemdict = {}

    if not os.path.exists(f"./Groups/{group.name}/Pictures"):
        os.makedirs(f"./Groups/{group.name}/Pictures")

    for member in group.members:
        urlmemdict[member.user_id] = {"name": member.name, "urllist": []}

    for message in messagelist:
        try:
            if len(message.attachments) > 0:
                if (message.attachments[0].type) == "image":
                    urlmemdict[message.user_id]["urllist"].append(
                        message.attachments[0].url)
        except Exception as e:
            print(f"Exception {e}\n{message.data}")

    for val in urlmemdict.values():
        num = 1
        for index in val["urllist"]:
            if "png" in index:
                ext = ".png"
            elif "gif" in index:
                ext = ".gif"
            elif "jpeg" in index:
                ext = ".jpeg"
            else:
                ext = ".txt"

            with open(
                    f"./Groups/{group.name}/Pictures/{val['name']}_{num}{ext}",
                    "wb") as handle:
                try:
                    response = requests.get(index, stream=True)
                    if not response.ok:
                        print(response)
                    for block in response.iter_content(1024):
                        if not block:
                            break
                        handle.write(block)
                except Exception as e:
                    print(f"Error on {val['name']}_{num}{ext}: {e}")
                    pass
            num += 1
Example #16
0
def numLikes(groupname):
    group = findGroup(groupname)
    likefloor = 3

    print("Filling messagelist...")
    messagelist = list(group.messages.list().autopage())

    path = f"./Groups/{group.name}"
    if not os.path.exists(path):
        os.makedirs(path)

    print("Creating memberdict...")
    memberdict = {}
    for member in group.members:
        memberdict[member.user_id] = {"name" : member.name, "likedmessages" : 0, "messages" : 0}

    print("Counting likes...")
    for message in messagelist:
        try:
            memberdict[message.user_id]["messages"] += 1
            if len(message.favorited_by) >= likefloor:
                memberdict[message.user_id]["likedmessages"] += 1
        except:
            pass

    print("Sorting memberdict...")
    sorted_memberdict = sorted(memberdict.items(), key=lambda x: x[1]["likedmessages"], reverse=True)

    likedict = {}
    for entry in sorted_memberdict:
        try:
            likedict[entry[1]["name"]] = round(entry[1]["likedmessages"]/entry[1]["messages"]*100,2)
        except:
            print(f"{entry[1]['name']} had a division issue")
            pass

    print("Sorting likedict...")
    sorted_likedict = sorted(likedict.items(), key=lambda x: x[1], reverse=True)

    print("Writing results...")
    num = 1
    with open(f"{path}/MoreLikes.txt", "w") as writer:
        writer.write(f"\nPosts that got {likefloor}+ likes\n")
        for entry in sorted_likedict:
            writer.write(f"{num}. {entry[0]}: {entry[1]}% of {memberdict[findMember(group, entry[0]).user_id]['messages']} posts\n")
            num += 1
Example #17
0
def stealthLikeOthers(groupname, choice):
    group = findGroup(groupname)
    likeddict = {}
    # Defines whether we are going to only like or only unlike in the beginning. Those changes will be reversed in the second half
    if choice.lower() == "like":
        like = True
    else:
        like = False

    print("Filling messagelist...")
    messagelist = list(group.messages.list().autopage())

    print("Liking/Unliking messages...")
    for message in messagelist:
        # Store message in likeddict only if we liked it already...
        if myuser.id in message.favorited_by:
            likeddict[message.created_at] = message
            # Try to unlike the message if like is False since we know that we originally liked it
            if like == False:
                try:
                    message.unlike()
                except Exception as e:
                    print(f"Encountered error in the unlike: {e}")
        # If we didn't like it already but like is True, try to like it
        elif like:
            try:
                message.like()
            except Exception as e:
                print(f"Encountered error in the like: {e}")

    print("Undoing changes now...")
    for message in messagelist:
        if myuser.id in message.favorited_by:
            # If we had originally liked the message and and like is False, it means we unliked it. Try to like it again
            if message.created_at in likeddict.keys() and like == False:
                try:
                    message.like()
                except Exception as e:
                    print(f"Encountered error in the reverse like: {e}")
        # If we didn't originally like the message, but like is true, it means we liked it. Now we need to unlike it
        elif like:
            try:
                message.unlike()
            except Exception as e:
                print(f"Encountered error in the reverse unlike: {e}")
def usersLeft(groupname, date):
    import pytz
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    sincedate = datetime.strptime(date, '%m/%d/%Y')
    sincedate = pytz.UTC.localize(sincedate)
    usersleft = 0

    for message in messagelist:
        if message.created_at > sincedate:
            try:
                if message.data["event"][
                        "type"] == "membership.notifications.exited":
                    usersleft += 1
            except:
                pass

    print(f"{usersleft} users left since {sincedate.strftime('%m/%d/%Y')}")
def commonWords(groupname, num):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    num = int(num)
    memberdict = {}
    wordlist = []

    print("Filling memberdict...")
    for member in group.members:
        memberdict[member.user_id] = {}

    print("Searching messages...")
    # This can be optimized...
    for message in messagelist:
        for member in memberdict.items():
            if message.user_id == member[0]:
                try:
                    wordlist = message.text.split(" ")
                    for word in wordlist:
                        word = word.lower()
                        if word in member[1].keys():
                            member[1][word] += 1
                        elif len(word) > num or word in exceptionlist:
                            member[1][word] = 1
                except:
                    pass

    print(f"Writing results to {path}/commonwords.txt...")
    with open(path + "/commonwords.txt", "w") as writer:
        writer.write(f"--- Words greater than {num} letters ---")
        for member in memberdict.items():
            writer.write(
                f"\n{findMember(group, member[0]).name}'s most common words - \n"
            )
            sorted_list = sorted(member[1].items(),
                                 key=lambda x: x[1],
                                 reverse=True)
            for x in range(10):
                try:
                    writer.write(sorted_list[x][0] + " - " +
                                 str(sorted_list[x][1]) + "\n")
                except:
                    pass
        writer.write("\n")
def scopedSharedGroups(sourcegroupname):
    sourcegroup = findGroup(sourcegroupname)
    memberdict = {}

    for member in sourcegroup.members:
        memberdict[member.user_id] = {"name": member.name, "shared": 0}

    for group in grouplist:
        for member in group.members:
            if member.user_id in memberdict.keys():
                memberdict[member.user_id]["shared"] += 1

    sorted_memberdict = sorted(memberdict.items(),
                               key=lambda x: x[1]["shared"],
                               reverse=True)
    print(f"Shared groups with source group: {sourcegroup.name}")
    for index in sorted_memberdict:
        if index[1]['shared'] > 1 and index[1]['name'] != myuser['name']:
            print(f"{index[1]['name']} - {index[1]['shared']}")
Example #21
0
def percentImagePost(groupname):
    group = findGroup(groupname)
    userdict = {}
    total = 0

    print("Reading file...")
    with open(f".\\Images\\Images_{group.name}.csv", "r") as reader:
        lines = reader.readlines()

    print("Creating user dictionary and counting images...")
    for line in lines:
        splitline = line.strip().split(",")
        if splitline[1] not in userdict.keys():
            userdict[splitline[1]] = 1
        else:
            userdict[splitline[1]] += 1

    for value in userdict.values():
        total += value

    print("Sorting list...")
    sorted_userdict = sorted(userdict.items(),
                             key=lambda x: x[1],
                             reverse=True)

    print("Writing file...")
    with open(f".\\Images\\PercentImages_{group.name}.txt", "w") as writer:
        try:
            writer.write("Total images: " + str(total) + "\n\n")
        except:
            print("Error")

        for item in sorted_userdict:
            try:
                writer.write(""
                             f"{findMember(group, item[0]).name} posted\n\t"
                             f"{item[1]} images"
                             f"\n\t{round(item[1]/total*100, 2)}%\n"
                             "")
            except Exception as e:
                print(str(e))
                pass
Example #22
0
def messLikes(groupname, text):
    group = findGroup(groupname)

    print("Filling messagelist...")
    messagelist = list(group.messages.list().autopage())

    print("Searching for text...")
    while text != "0":
        textlist = []
        for message in messagelist:
            try:
                if text.lower() in message.text.lower():
                    textlist.append(message)
            except:
                pass
        if len(textlist) > 0:
            for message in textlist:
                print(f"{convertCreatedAt(message)} - {message.name} - {message.text} - {len(message.favorited_by)} likes")
        else:
            print("No message found with that text")
        text = input("Enter new text or 0 to exit: ")
Example #23
0
def downProfilePics(groupname):
    group = findGroup(groupname)
    memberdict = {}

    if not os.path.exists(f"./Groups/{group.name}/ProfilePics"):
        os.mkdir(f"./Groups/{group.name}/ProfilePics")

    for member in group.members:
        try:
            if "png" in member.image_url:
                ext = ".png"
            elif "jpeg" in member.image_url:
                ext = ".jpeg"
            else:
                ext = ".old"
        except:
            print(f"Unable to capture URL: {member.data}")
            ext = ".old"
        memberdict[member.user_id] = {
            "name": member.name,
            "url": member.image_url,
            "ext": ext
        }

    # Code inside with statement used from Stack Overflow answer on downloading images using requests
    for val in memberdict.values():
        with open(
                f"./Groups/{group.name}/ProfilePics/{val['name']}{val['ext']}",
                "wb") as handle:
            try:
                response = requests.get(val['url'], stream=True)
                if not response.ok:
                    print(response)
                for block in response.iter_content(1024):
                    if not block:
                        break
                    handle.write(block)
            except Exception as e:
                print("Error: " + str(e))
                pass
def dateJoined(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    joineddict = {}

    for message in messagelist:
        try:
            if message.data["event"]["type"] == "membership.announce.added":
                for member in message.data["event"]["data"]["added_users"]:
                    joineddict[member["nickname"]] = convertCreatedAt(message)

            elif message.data["event"]["type"] == "membership.announce.joined":
                joineddict[message.data['event']['data']['user']
                           ['nickname']] = convertCreatedAt(message)
        except:
            pass

    sortedjoineddict = dict(
        sorted(joineddict.items(), key=lambda item: item[1]))

    for key, val in sortedjoineddict.items():
        print(f"{val} - {key}")
Example #25
0
def mostLikedMessages(groupname, nummessages):
    group = findGroup(groupname)
    nummessages = int(nummessages)
    mostlikeddict = {}

    path = f"./Groups/{group.name}"
    if not os.path.exists(path):
        os.makedirs(path)

    print("Filling messagelist...")
    messagelist = group.messages.list().autopage()
    for message in messagelist:
        mostlikeddict[message.text] = {"numfavorites" : len(message.favorited_by), "sendername" : message.name, "timestamp" : convertCreatedAt(message)}

    print("Sorting by number of likes...")
    sorted_mostlikeddict = sorted(mostlikeddict.items(), key=lambda x: x[1]["numfavorites"], reverse=True)

    # path = f".\\MostLikes\\MostLikes_{group.name}.txt"
    print(f"Writing top {nummessages} messages to {path}/mostlikes.txt...")
    with open(path + "/mostlikes.txt", "w") as writer:
        for num in range(nummessages):
            likes = sorted_mostlikeddict[num][1]["numfavorites"]
            time = sorted_mostlikeddict[num][1]["timestamp"]
            name = sorted_mostlikeddict[num][1]["sendername"]
            text = sorted_mostlikeddict[num][0]

            try:
                writer.write(f"{likes} likes: {time} - {name} - {text}\n\n" )
            except:
                writer.write(f"{likes} likes: {time} - {name} - ")
                if text != None:
                    for character in text:
                        try:
                            writer.write(character)
                        except:
                            pass
                writer.write("\n\n")
def longestMess(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    longestmesslen = 0
    longestmesslist = []

    for message in messagelist:
        try:
            # Create a new list if the message is longer than the length of the previous list messages
            if len(str(message.text)) > longestmesslen:
                longestmesslist = [message]
                longestmesslen = len(str(message.text))
            # Otherwise, append the same length message to the current list
            elif len(str(message.text)) == longestmesslen:
                longestmesslist.append(message)
        except Exception as e:
            print(f"Exception occurred: {e}")
            pass

    for longestmess in longestmesslist:
        print(
            f"{convertCreatedAt(longestmess)} - {longestmess.name} - {longestmess.text}\n"
        )
    print(f"Length: {longestmesslen}")
Example #27
0
def noLikes(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())

    path = f"./Groups/{group.name}"
    if not os.path.exists(path):
        os.makedirs(path)

    memberdict = {}
    for member in group.members:
        memberdict[member.user_id] = {"name" : member.name, "liked" : False}

    for message in messagelist:
        for id in message.favorited_by:
            try:
                memberdict[id]["liked"] = True
            except:
                pass

    with open(path + "/nolikes.txt", "w") as writer:
        print(f"Writing to {path}/nolikes.txt...")
        for key, val in memberdict.items():
            if not val["liked"]:
                writer.write(f"{val['name']}\n")
def dateUserAdded(groupname):
    # Attributes of a message reading "x added y to the group"
    # {'attachments': [], 'avatar_url': None, 'created_at': datenum, 'favorited_by': ['numid', 'numid'], 'group_id': 'numid', 'id': 'numid', 'name': 'GroupMe', 'sender_id': 'system', 'sender_type': 'system', 'source_guid': 'redacted', 'system': True, 'text': 'x added y to the group.', 'user_id': 'system', 'event': {'type': 'membership.announce.added', 'data': {'added_users': [{'id': numid, 'nickname': 'y'}], 'adder_user': {'id': numid, 'nickname': 'x'}}}, 'platform': 'gm'}
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    currmemlist = []

    # Add current member ids to list
    for member in group.members:
        currmemlist.append(str(member.user_id))
    print(f"Total Members - {len(currmemlist)}")

    # Print list chronologically
    num = len(messagelist) - 1
    while num >= 0:
        message = messagelist[num]
        # Check to see if it's a system message
        if message.system:
            # Check to see if the users were added
            if message.event["type"] == "membership.announce.added":
                # Iterate the added_users list
                for index in range(len(message.event['data']['added_users'])):
                    # Only print if the user is still in the group
                    if str(message.event['data']['added_users'][index]
                           ['id']) in currmemlist:
                        print(
                            f"{convertCreatedAt(message)} - {message.event['data']['added_users'][index]['nickname']}"
                        )
            # Check to see if the user joined
            elif message.event["type"] == "membership.announce.joined":
                # Only print if user is still in the group
                if str(message.event['data']['user']['id']) in currmemlist:
                    print(
                        f"{convertCreatedAt(message)} - {message.event['data']['user']['nickname']}"
                    )
        num -= 1
def allMemberPercentPosts(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())
    memberdict = {}
    details = ""
    counter = 0

    # Instantiate the memberdict member objects with counters at 0
    for member in group.members:
        memberdict[member.user_id] = 0

    # For each message, increase message.user_id value by 1 and total counter by 1.
    try:
        for message in messagelist:
            memberdict[message.user_id] += 1
            counter += 1
    except:
        pass

    sorted_memberdict = sorted(memberdict.items(),
                               key=lambda x: x[1],
                               reverse=True)
    for i in sorted_memberdict:
        try:
            membername = findMember(group, i[0]).name
            details = details + membername + " - " + str(
                round(i[1] / counter * 100, 2)) + "%\n"
        except:
            pass
    details = details + "\nTotal posts - " + str(counter)

    with open("PercentagePosts.txt", "a+") as writer:
        writer.write(
            f"\n\n--- Percentage of Total Posts for {groupname} out of {len(group.members)} members and {counter} posts ---\n"
        )
        writer.write(details)
Example #30
0
def aveLikesReceived(groupname):
    group = findGroup(groupname)
    messagelist = list(group.messages.list().autopage())

    path = f"./Groups/{group.name}"
    if not os.path.exists(path):
        os.makedirs(path)

    memberdict = {}
    for member in group.members:
        memberdict[member.user_id] = {"name" : member.name, "messages" : 0, "likes" : 0}

    for message in messagelist:
        try:
            memberdict[message.user_id]["messages"] += 1
            memberdict[message.user_id]["likes"] += len(message.favorited_by)
        except KeyError:
            pass

    avelikedict = {}
    for key, val in memberdict.items():
        try:
            average = round(val["likes"]/val["messages"])
        except:
            average = 0
        avelikedict[val["name"]] = {"average" : average, "messages" : memberdict[key]["messages"], "likes" : memberdict[key]["likes"]}

    sorted_avelikedict = sorted(avelikedict.items(), key=lambda x: x[1]["average"], reverse=True)

    with open(f"{path}/averageLikes.txt", "w") as writer:
        num = 1
        writer.write(f"Average number of likes received in relation to messages sent\n")
        for index in sorted_avelikedict:
            if index[1]['average'] > 0:
                writer.write(f"{num}. {index[0]} -\n\tLikes Received: {index[1]['likes']}\n\tMessages Sent: {index[1]['messages']}\n\tAverage Likes Received per Message: {index[1]['average']}\n\n")
                num += 1