wrote trigger class to filter the tweets/toots before retweeting/boosting

This commit is contained in:
b3yond 2017-06-17 21:35:47 +02:00
parent e631289aff
commit 10b784617e
5 changed files with 104 additions and 55 deletions

10
badlist Normal file
View file

@ -0,0 +1,10 @@
bastard
whore
slut
hure
jude
schwuchtel
fag
faggot
arbeitsplätze

View file

@ -2,6 +2,7 @@
import twitter import twitter
import requests import requests
import trigger
from time import sleep from time import sleep
@ -16,9 +17,10 @@ class Retweetbot(object):
last_mention: the ID of the last tweet which mentioned you last_mention: the ID of the last tweet which mentioned you
""" """
def __init__(self, keypath="appkeys/ticketfrei@twitter.com", def __init__(self, trigger=trigger.Trigger(),
keypath="appkeys/ticketfrei@twitter.com",
historypath="last_mention", historypath="last_mention",
triggerpath="triggerwords", triggerpath="goodlist",
user_id="801098086005243904", user_id="801098086005243904",
screen_name="links_tech"): screen_name="links_tech"):
""" """
@ -39,6 +41,7 @@ class Retweetbot(object):
self.screen_name = screen_name self.screen_name = screen_name
self.last_mention = bot.get_history(self.historypath) self.last_mention = bot.get_history(self.historypath)
self.triggers = bot.get_trigger(self.triggerpath) self.triggers = bot.get_trigger(self.triggerpath)
self.trigger = trigger
def get_api_keys(self, path): def get_api_keys(self, path):
""" """
@ -52,8 +55,13 @@ class Retweetbot(object):
:return: keys: list of these 4 strings. :return: keys: list of these 4 strings.
""" """
with open(path, "r") as f: keys = []
keys = [s.strip() for s in f.readlines()] try:
with open(path, "r") as f:
keys = [s.strip() for s in f.readlines()]
except IOError:
print "[ERROR] You didn't specify Twitter API oAuth keys. Look into the documentation."
exit(-1)
return keys return keys
def get_history(self, path): def get_history(self, path):
@ -72,7 +80,7 @@ class Retweetbot(object):
triggers = [s.strip() for s in f.readlines()] triggers = [s.strip() for s in f.readlines()]
return triggers return triggers
def bridge_mastodon(self, status): def format_mastodon(self, status):
""" """
Bridge your Retweets to mastodon. Bridge your Retweets to mastodon.
:todo vmann: add all the mastodon API magic. :todo vmann: add all the mastodon API magic.
@ -89,42 +97,25 @@ class Retweetbot(object):
:return: list of Status objects :return: list of Status objects
""" """
done = False while 1:
mentions = []
while not done:
try: try:
mentions = self.api.GetMentions(since_id=self.last_mention) mentions = self.api.GetMentions(since_id=self.last_mention)
done = True return mentions
except requests.exceptions.ConnectionError: except requests.exceptions.ConnectionError:
print("[ERROR] Bad Connection.") print("[ERROR] Bad Connection.")
sleep(10) sleep(10)
return mentions
def trigger_rt(self, status):
"""
Checks if the text of a tweet matches the relevant trigger words.
:param status: A given tweet
:return: if it should be retweeted
"""
for triggerword in self.triggers:
if status.text.lower().find(triggerword):
return True
return False
def retweet(self, status): def retweet(self, status):
""" """
Retweets a given tweet. Retweets a given tweet.
:param status: A tweet object. :param status: A tweet object.
:return: toot: string of the tweet, to toot on mastodon.
""" """
done = False while 1:
while not done:
try: try:
self.api.PostRetweet(status.id) self.api.PostRetweet(status.id)
self.bridge_mastodon(status) return self.format_mastodon(status)
done = True
# Hopefully we got rid of this error. If not, try to uncomment these lines. # Hopefully we got rid of this error. If not, try to uncomment these lines.
# except twitter.error.TwitterError: # except twitter.error.TwitterError:
# print("[ERROR] probably you already retweeted this tweet.") # print("[ERROR] probably you already retweeted this tweet.")
@ -133,23 +124,47 @@ class Retweetbot(object):
print("[ERROR] Bad Connection.") print("[ERROR] Bad Connection.")
sleep(10) sleep(10)
def flow(self): def tweet(self, post):
""" The flow of crawling mentions and retweeting them.""" """
Tweet a post.
:param post: String with the text to tweet.
"""
while 1:
try:
self.api.PostUpdate(status=post)
return
except requests.exceptions.ConnectionError:
print("[ERROR] Bad Connection.")
sleep(10)
def flow(self, to_tweet=()):
""" The flow of crawling mentions and retweeting them.
:param to_tweet: list of strings to tweet
:return list of retweeted tweets, to toot on mastodon
"""
# Tweet the toots the Retootbot gives to us
for post in to_tweet:
self.tweet(post)
# Store all mentions in a list of Status Objects # Store all mentions in a list of Status Objects
mentions = self.crawl_mentions() mentions = self.crawl_mentions()
mastodon = []
for status in mentions: for status in mentions:
# Is the Text of the Tweet in the triggerlist? # Is the Text of the Tweet in the triggerlist?
should_retweet = self.trigger_rt(status) should_retweet = self.trigger.check_string(status.text)
# Retweet status # Retweet status
if should_retweet: if should_retweet:
self.retweet(status) mastodon.append(self.retweet(status))
# save the id so it doesn't get crawled again # save the id so it doesn't get crawled again
self.last_mention = status.id self.last_mention = status.id
print self.last_mention print self.last_mention
return mastodon
def shutdown(self): def shutdown(self):
""" If something breaks, it shuts down the bot and messages the owner. """ """ If something breaks, it shuts down the bot and messages the owner. """

48
trigger.py Normal file
View file

@ -0,0 +1,48 @@
#!/usr/bin/env python
class Trigger(object):
"""
This class provides a filter to test a string against.
"""
def __init__(self, goodlistpath="goodlist", badlistpath="badlist"):
self.goodlistpath = goodlistpath
with open(goodlistpath, "r+") as f:
self.goodlist = [s.strip() for s in f.readlines()]
self.badlistpath = badlistpath
with open(badlistpath, "r+") as f:
self.badlist = [s.strip() for s in f.readlines()]
def check_string(self, string):
"""
checks if a string contains no bad words and at least 1 good word.
:param string: A given string. Tweet or Toot, cleaned from html.
:return: If the string passes the test
"""
for triggerword in self.goodlist:
if string.lower().find(triggerword):
for triggerword in self.badlist:
if string.lower().find(triggerword):
return False
return True
return False
def update_list(self, word, whichlist):
"""
:param word: a string of a word which should be appended to one of the lists
:param boolean whichlist: 0 : goodlist, 1 : badlist.
"""
if whichlist:
path = self.goodlistpath
else:
path = self.badlistpath
with open(path, "w") as f:
old = f.readlines()
old.append(word)
f.writelines(old)
if __name__ == "main":
pass

View file

@ -1,24 +0,0 @@
kontrolle
ticketfrei
konti
db
zivil
sicherheit
uniform
station
bus
bahn
tram
linie
nuernberg
nbg
nürnberg
s1
s2
s3
u1
u2
u3
s4
u21
u11