From aaadcb9a1d4a1eebe2c3c325533bb64c73907299 Mon Sep 17 00:00:00 2001
From: Rainier Robles <ren@inf.fu-berlin.de>
Date: Thu, 29 Jun 2017 12:59:07 +0200
Subject: [PATCH] =?UTF-8?q?=C3=9Cbungsblatt=207=20Aufgabe=204=20hochgelade?=
 =?UTF-8?q?n?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .DS_Store            | Bin 0 -> 6148 bytes
 ueb07/trumptweets.py |  97 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 97 insertions(+)
 create mode 100644 .DS_Store
 create mode 100644 ueb07/trumptweets.py

diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..00a2ec6a3996c3fcf84d7e361071977b492847f0
GIT binary patch
literal 6148
zcmZQzU|@7AO)+F(5MW?n;9!8zj35RBCIAV8Fop~hRD=y=9@q@ivf!e;ocz3WsLbG}
zKyGJcC}l`xNMbNxKz2VP0|Ns>#ylt8FgQ6sw*bjYNV2*4E-ophCCLm7SF3vGfz_bM
zrr?n+$iQbZQiy_F1U7n<7!85Z5Eu=C(GVC70SZC@TAy%mQ((rZ*3l3c4T0eq0-*9i
z0n)Z-aDdVc5E>-Kz{tP=?gB6}FtETvfDzmeU;xR1w1Q}mRuB!+%D@O>fz1GGWnhGA
zWdwIaK>9#k5)cj6&cFz^8N>%`XJ7=|%)r11(ayjKwHelVVT5RBV1#IAU<BI^bKNLC
z8Umvs01E+T2txo=|GP3Uz_JiTbd($ofzc2c5h1|H;u7rQ1g?~^`xjK#g6h)*s5Gb!
uhE&I(iW#*Lzyujklz=J)RresRAR1g1GcquMwT?CfU?DV0kA?vKLjVA1Q7_p5

literal 0
HcmV?d00001

diff --git a/ueb07/trumptweets.py b/ueb07/trumptweets.py
new file mode 100644
index 0000000..0b513bc
--- /dev/null
+++ b/ueb07/trumptweets.py
@@ -0,0 +1,97 @@
+from __future__ import absolute_import, print_function
+from tweepy.streaming import StreamListener
+from tweepy import OAuthHandler
+from tweepy import Stream
+from bs4 import BeautifulSoup
+import psycopg2 # fuer Zugriff auf Datenbank
+import requests
+import json # damit wir die Tweet Daten lesen und parsen koennen
+import csv # um CSV Datei zu oeffnen und schreiben
+import os.path # um zu ueberpruefen, ob CSV Datei schon existiert
+import time # fuer sleep
+
+class StdOutListener(StreamListener):
+    """ A listener handles tweets that are received from the stream.
+    This is a basic listener that just prints received tweets to stdout.
+    """
+    def on_data(self, data):
+        decoded = json.loads(data) # Ausgabe von Twitter API wird als JSON dargestellt
+        try: # ignoriert alle Retweets
+            isRT = decoded['retweeted_status']
+            print("This was a retweet! Ignored.")
+            pass
+        except KeyError:
+            user_id = decoded['user']['screen_name']
+            text = decoded['text']
+            time = decoded['created_at']
+            tweet_id = decoded['id']
+            hashlist = decoded['entities']['hashtags']
+            hashes = []
+            for entry in hashlist:
+                hashes.append(str(entry['text']))
+            print("User: "+str(user_id))
+            print("Text: "+str(text))
+            print("Posted On: "+str(time))
+            print("ID: "+str(tweet_id))
+            print("Hashtags: "+str(hashes))
+            print("\n")
+            tweetdata = (tweet_id,user_id,text,time,hashes)
+            fwriter.writerow(list(tweetdata)) # schreibt eine neue Zeile in CSV Datei
+            tweet_insertion = """INSERT INTO trumptweets (tweet_id,user_id,text,time,hashes) VALUES (%s, %s, %s, %s, %s)"""
+            cursor.execute(tweet_insertion, tweetdata)
+            conn.commit() # schreibt eine neue Zeile im Datenbank
+            return True        
+
+    def on_error(self, status):
+        print(status)
+        f.close()
+
+### Benutzer wird gefragt, fuer wie viele Sekunden werden Tweets gesammelt/wird Stream geoeffnet
+timeout = 0
+while True:
+    try:
+        while timeout <= 0:
+            timeout = int(input("How long (in seconds) do you want to collect tweets? "))
+            if timeout <= 0:
+                print("Invalid input. Please enter an integer greater than 0!")
+        break
+    except ValueError:
+        print("Invalid input. Please enter an integer greater than 0!")
+
+### Zugriff auf Twitter API
+CONSUMER_KEY = '###'
+CONSUMER_SECRET = '###'
+ACCESS_TOKEN = '###' 
+ACCESS_SECRET = '###'
+
+### Falls CSV Datei existiert, dann werden neue Zeile einfach hinzugefuegt, sonst wird die Datei mit dem entsprechenden Header erzeugt
+if os.path.isfile('trumptweets.csv'):
+    f = open('trumptweets.csv', 'a')
+else:
+    f = open('trumptweets.csv', 'w')
+    head = "TWEET_ID;USER;TEXT;TIMESTAMP;HASHTAGS\n"
+    f.write(head)
+    
+### CSV Writer Objekt erzeugt. Wir nutzen Semikolons als delimiter.
+fwriter = csv.writer(f, delimiter=';')
+
+### Um mit dem Datenbank zu verbinden
+conn_string = "host='agdbs-edu01.imp.fu-berlin.de' port='5432' dbname='trumptweets' user='student' password='password'" #damit koennen wir eine Verbindung mit unserer Datenbank erstellen
+    
+try:
+    #durch conn_string versuchen wir hier eine Verbindung mit unserer Datenbank zu machen
+    conn = psycopg2.connect(conn_string)
+    cursor = conn.cursor()
+except:
+    print ("Not connected!")
+
+listener = StdOutListener()
+auth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
+auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
+stream = Stream(auth, listener)
+stream.filter(track=['@realDonaldTrump'], async=True) # async=True damit wir den Stream schliessen koennen
+time.sleep(timeout) # Prozess beendet nach timeout viele Sekunden
+stream.disconnect()
+cursor.close()
+conn.close()
+print(str(timeout)+" seconds are over. All done.")
\ No newline at end of file
-- 
GitLab