Das Twitter Intelligence Tool (TWINT) mit Web-Scraping-Technologie kann auch auf einem Raspberry Pi installiert werden.
Mit dem Web Scraper für Twitter, mit dem man Tweets von Usern des Kurznachrichtendienstes einholen kann, ohne dabei vom Twitter API eingeschränkt zu werden läuft unter der MIT-Lizenz (Anleitung Twitter-Intelligence-Tool.pdf). TWINT wurde in Python geschrieben, ist am April 2020 in Version 2.1.20 erschienen. Alle Funktionen gehen aber nicht mehr, weil sich die Twitter API geändert hat. Z.b. wirft ein twint -u programmierung –following diesen Fehler:
CRITICAL:root:twint.feed:Follow:IndexError
Aber einiges geht doch noch. Also mal installieren mit:
pip3 install twint
wenn dann nicht alles geht, hat bei mir geholfen:
1 2 |
sudo apt-get install libatlas-base-dev pip3 install --upgrade -e git+https://github.com/twintproject/twint.git@origin/master#egg=twint |
So ein erster Test, alle Befehle ausgeben mit twint -h …:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
TWINT - An Advanced Twitter Scraping Tool. optional arguments: -h, --help show this help message and exit -u USERNAME, --username USERNAME User's Tweets you want to scrape. -s SEARCH, --search SEARCH Search for Tweets containing this word or phrase. -g GEO, --geo GEO Search for geocoded Tweets. --near NEAR Near a specified city. --location Show user's location (Experimental). -l LANG, --lang LANG Search for Tweets in a specific language. -o OUTPUT, --output OUTPUT Save output to a file. -es ELASTICSEARCH, --elasticsearch ELASTICSEARCH Index to Elasticsearch. --year YEAR Filter Tweets before specified year. --since DATE Filter Tweets sent since date (Example: "2017-12-27 20:30:15" or 2017-12-27). --until DATE Filter Tweets sent until date (Example: "2017-12-27 20:30:15" or 2017-12-27). --email Filter Tweets that might have email addresses --phone Filter Tweets that might have phone numbers --verified Display Tweets only from verified users (Use with -s). --csv Write as .csv file. --tabs Separate CSV fields with tab characters, not commas. --json Write as .json file --hashtags Output hashtags in seperate column. --cashtags Output cashtags in seperate column. --userid USERID Twitter user id. --limit LIMIT Number of Tweets to pull (Increments of 20). --count Display number of Tweets scraped at the end of session. --stats Show number of replies, retweets, and likes. -db DATABASE, --database DATABASE Store Tweets in a sqlite3 database. --to USERNAME Search Tweets to a user. --all USERNAME Search all Tweets associated with a user. --followers Scrape a person's followers. --following Scrape a person's follows --favorites Scrape Tweets a user has liked. --proxy-type PROXY_TYPE Socks5, HTTP, etc. --proxy-host PROXY_HOST Proxy hostname or IP. --proxy-port PROXY_PORT The port of the proxy server. --tor-control-port TOR_CONTROL_PORT If proxy-host is set to tor, this is the control port --tor-control-password TOR_CONTROL_PASSWORD If proxy-host is set to tor, this is the password for the control port --essid [ESSID] Elasticsearch Session ID, use this to differentiate scraping sessions. --userlist USERLIST Userlist from list or file. --retweets Include user's Retweets (Warning: limited). --format FORMAT Custom output format (See wiki for details). --user-full Collect all user information (Use with followers or following only). -tl, --timeline Collects every tweet from a User's Timeline. (Tweets, RTs & Replies) --translate Get tweets translated by Google Translate. --translate-dest TRANSLATE_DEST Translate tweet to language (ISO2). --store-pandas STORE_PANDAS Save Tweets in a DataFrame (Pandas) file. --pandas-type [PANDAS_TYPE] Specify HDF5 or Pickle (HDF5 as default) -it [INDEX_TWEETS], --index-tweets [INDEX_TWEETS] Custom Elasticsearch Index name for Tweets. -if [INDEX_FOLLOW], --index-follow [INDEX_FOLLOW] Custom Elasticsearch Index name for Follows. -iu [INDEX_USERS], --index-users [INDEX_USERS] Custom Elasticsearch Index name for Users. --debug Store information in debug logs --resume TWEET_ID Resume from Tweet ID. --videos Display only Tweets with videos. --images Display only Tweets with images. --media Display Tweets with only images or videos. --replies Display replies to a subject. -pc PANDAS_CLEAN, --pandas-clean PANDAS_CLEAN Automatically clean Pandas dataframe at every scrape. -cq CUSTOM_QUERY, --custom-query CUSTOM_QUERY Custom search query. -pt, --popular-tweets Scrape popular tweets instead of recent ones. -sc, --skip-certs Skip certs verification, useful for SSC. -ho, --hide-output Hide output, no tweets will be displayed. -nr, --native-retweets Filter the results for retweets only. --min-likes MIN_LIKES Filter the tweets by minimum number of likes. --min-retweets MIN_RETWEETS Filter the tweets by minimum number of retweets. --min-replies MIN_REPLIES Filter the tweets by minimum number of replies. --links LINKS Include or exclude tweets containing one o more links. If not specified you will get both tweets that might contain links or not. --source SOURCE Filter the tweets for specific source client. --members-list MEMBERS_LIST Filter the tweets sent by users in a given list. -fr, --filter-retweets Exclude retweets from the results. --backoff-exponent BACKOFF_EXPONENT Specify a exponent for the polynomial backoff in case of errors. --min-wait-time MIN_WAIT_TIME specifiy a minimum wait time in case of scraping limit error. This value will be adjusted by twint if the value provided does not satisfy the limits constraints |
Für Analysen, natürlich nur gegen den eigenen Twitter Account absetzen. Also mal die erste Abfrage an Nutzer programmierung (das bin ich) mit dem Suchbegriff mindmap:
1 |
twint -u programmierung -s mindmap |
Hier das Ergebnis:
1 2 3 4 5 6 |
1453208321893273603 2021-10-27 05:53:57 +0200 <programmierung> #Mindmap: 6 Methods to Make Money with Cryptocurrencies https://t.co/PXKXvki85U 1452333822066970634 2021-10-24 19:59:00 +0200 <programmierung> #crypto #btc #bitcoin #eth #Ethereum #cryptofit #bad #token #projects #pump #dump #hannover #langenhagen #mindmap #signsofbadcryptoprojects from https://t.co/SKegG22Gnm https://t.co/BaJmYdNCe9 1452121162310422532 2021-10-24 05:53:58 +0200 <programmierung> #Mindmap: TOP 8 – Wie schaffe ich es, mich um mich selbst zu kümmern? https://t.co/4y4LKQyurW 1451396403729682435 2021-10-22 05:54:02 +0200 <programmierung> #Mindmap: 7 Anzeichen fehlender Selbstfürsorge https://t.co/gOHmsScGHp 1451018890365001729 2021-10-21 04:53:56 +0200 <programmierung> #Mindmap: JUnit Test https://t.co/Fl11MkX5p0 1450973593085648898 2021-10-21 01:53:57 +0200 <programmierung> #Mindmap: Ganache Blockchain https://t.co/nmpbqFwCmu |
Oder mal eine Abfrage an den User programmierung wir suchen maximal 20 Einträge mit dem Begriff raspberry und speichern das Ergebnis in ein Json Datei:
1 |
twint -u programmierung -s raspberry --limit 20 -o twitter-top-20-raspberry.json --json |
Wir bekommen dann in der json Datei diese Daten:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
1451894525614505990 2021-10-23 14:53:24 +0200 <programmierung> ua-parser-js updates garantieren keine Sicherheit und installiert Krypto-Miner auch auf Raspberry Pi? – allow a remote attacker to obtain sensitive information or take control of the system. https://t.co/C6uNXEiaQE 1439135429303930882 2021-09-18 09:53:18 +0200 <programmierung> WordPress auf Sicherheitslücken überprüfen mit WPScan auf einem Raspberry PI unter Debian – es muss nicht immer Kali sein und “ I Still Have Faith In You“ https://t.co/PAiz6oMPKH 1421635114828713984 2021-08-01 02:53:18 +0200 <programmierung> CA-Zertifikat mit Elliptic Curve Cryptography (ECC) Key auf dem Raspberry Pi für 10 Jahre erzeugen https://t.co/Su3O6g0U4r 1421408785374093317 2021-07-31 11:53:57 +0200 <programmierung> Raspberry Pi Planespotter: Wieviele Flugzeuge wurden so empfangen in HAJ am Freitag? https://t.co/C98uiZSI3k 1421363409447178241 2021-07-31 08:53:39 +0200 <programmierung> Wie können auf einem Raspberry Pi mit apt list alle möglichen Packages updates angezeigt werden? https://t.co/HoWfurI8Mj 1419687307221819401 2021-07-26 17:53:25 +0200 <programmierung> OpenSSL 3.0.0 beta selbst compilieren auf einem Raspberry Pi in ca. 1-2 Stunden https://t.co/sKi6SUpRf9 1419053059162914820 2021-07-24 23:53:08 +0200 <programmierung> OpenSSL nicht nur mit dem Raspberry Pi https://t.co/tJQUjCAO1X 1408514783645732867 2021-06-25 21:57:48 +0200 <programmierung> Wieviele Flugzeuge empfängt der Raspberry Pi bei mir in EDDV (HAJ) im Durchschnitt? > 400 https://t.co/dngURlLaEN 1402716556195504128 2021-06-09 21:57:42 +0200 <programmierung> Auslastung des Rechners (kein Raspberry Pi) bei Brute-Force oder mit anderen Worten 100% https://t.co/A0DPN5Zu2F 1402474902893076481 2021-06-09 05:57:28 +0200 <programmierung> SSH Anmeldung an dem Raspberry Pi ohne Passwort mit Elliptische Kurve – ed25519 Key https://t.co/mC4G8vxPhI 1401170483215753216 2021-06-05 15:34:10 +0200 <programmierung> #tor #darknet #raspberry #raspberrypi https://t.co/LwN3Qp3QRs #crypto aber nicht #btc #bitcoin https://t.co/viHFabh75n 1401161312105807877 2021-06-05 14:57:43 +0200 <programmierung> Kostenlos eine Webseite im Darknet mit Raspberry Pi bereitstellen über Onion Service https://t.co/XaZkr2XeaT 1399938087338319872 2021-06-02 05:57:04 +0200 <programmierung> Video: Raspberry Pi update bzw. upgrade Prozess per BPMN Flow https://t.co/OCS4NwWRiW 1394200412878692354 2021-05-17 09:57:36 +0200 <programmierung> Release 21.05 von rtl_433 für den Raspberry Pi veröffentlicht um Temperatursensoren und Luftruck von Autoreifen (TPMS) uä. zu empfangen https://t.co/uIoBEdqz7d 1383600488264830977 2021-04-18 03:57:17 +0200 <programmierung> Firewall in 10 Minuten einrichen mit UFW (Uncomplicated firewall) nicht nur auf dem Raspberry Pi https://t.co/zDljrH8iSv 1380233382098055173 2021-04-08 20:57:36 +0200 <programmierung> Neue NodeRed Version 1.3.1 veröffentlicht auch für Docker auf dem Raspberry Pi (v6, v7) https://t.co/3H5myeWLDw 1380228628248727562 2021-04-08 20:38:43 +0200 <programmierung> nice new #nodered #docker für den #raspberry pi Version 1.3.1 https://t.co/OLomdE6DvY 1377893011565187073 2021-04-02 09:57:48 +0200 <programmierung> Überwachung und Erkennung mit Raspberry Pi Kamera oder wie Zähle ich die Besucher oder PKWs https://t.co/yy3WeNXD2z 1376958384151347210 2021-03-30 20:03:56 +0200 <programmierung> Ergebnisse der Umfrage oder finde Dubletten auf dem Raspberry Pi mit fdupes https://t.co/JtoS8nn1Sc 1373136666278379521 2021-03-20 05:57:47 +0200 <programmierung> VNC in 4 Schritte mit dem Raspberry Pi https://t.co/CU6I5kDsWs 1372910173984067585 2021-03-19 14:57:47 +0200 <programmierung> In Pandemie wurde für den Raspberry Pi Imager eine neue Version 1.6 veröffentlicht mit hidden Dialog https://t.co/x46bUBdUDw |
Es geht auch eine Abfrage mit Suchbegriffen und einen Ortsbezug, z.B. Langenhagen geht:
1 |
twint -s bitcoin --near Langenhagen |
Da werden dann auch alle Einträge von allen Nutzern angezeigt, und nicht nur für den eigenen Account 😉
Und auch über Python-Scripte kann man alles steuern, z.B. mein kleines suche.py Modul:
1 2 3 4 5 6 7 8 9 10 11 12 |
import twint search = input("Eingabe des Suchbegriff:"); city = input("Eingabe der Stadt:") c = twint.Config() c.Search = search c.Near = city c.Limit = 20 c.Populer_tweets = True twint.run.Search(c) |
Es kann wie folgt gestartet werden: python3 suche.py
Es folgen dann diese Eingabefelder:
Eingabe des Suchbegriff:Blockchain
Eingabe der Stadt:Langenhagen
… Ausgabe des Ergebnis … und weitere Anregungen hier.