#!/usr/bin/env python3
from urllib.error import HTTPError
from urllib.request import urlopen, Request
import logging
# from requests_oauthlib import OAuth1Session
from datetime import datetime
import sys
import json
bearer = None
def _format_date(dt):
"""convert a datetime into an RFC 822 formatted date
Input date must be in GMT.
Stolen from PyRSS2Gen.
"""
# Looks like:
# Sat, 07 Sep 2002 00:00:01 GMT
# Can't use strftime because that's locale dependent
#
# Isn't there a standard way to do this for Python? The
# rfc822 and email.Utils modules assume a timestamp. The
# following is based on the rfc822 module.
return "%s, %02d %s %04d %02d:%02d:%02d GMT" % (
["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][dt.weekday()],
dt.day,
[
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
][dt.month - 1],
dt.year,
dt.hour,
dt.minute,
dt.second,
)
def getBearer():
global bearer
if bearer:
return bearer
headers = {
"Authorization": "Basic Zzl1MXI2SFpYTXg0SXU5UGs5VlNvTzFUdzpmeTIyQjN2QVRRNUI2eGthb1BFdFFRUmtuUGQ1WGZBbnBKVG5hc0ZRa3NyUm5qaVNsaw==",
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
}
data = b"grant_type=client_credentials"
url = "https://api.twitter.com/oauth2/token"
res = urlopen(Request(url, headers=headers, data=data, method="POST"))
response = json.loads(res.read().decode("UTF-8"))
bearer = response["access_token"]
return bearer
def unshorten_urls(title, description, urls):
for url in urls:
shorted_url = url["url"]
long_url = url["expanded_url"]
if "images" in url:
img = url["images"][0]["url"]
long_url_html = ''
else:
long_url_html = '' + long_url + ""
description = description.replace(shorted_url, long_url_html)
title = title.replace(shorted_url, long_url)
return title, description
def twitter(user):
# 500.000 Tweets per month
# API KEY = g9u1r6HZXMx4Iu9Pk9VSoO1Tw
# API SECRET KEY = fy22B3vATQ5B6xkaoPEtQQRknPd5XfAnpJTnasFQksrRnjiSlk
headers = {"authorization": "Bearer " + getBearer()}
# Recent = last 7 days
url = (
"https://api.twitter.com/2/tweets/search/recent?query=from:"
+ user
+ "&tweet.fields=created_at,author_id,lang,source,public_metrics,entities&expansions=referenced_tweets.id,attachments.media_keys&media.fields=url"
)
try:
res = urlopen(Request(url, headers=headers))
response = json.loads(res.read().decode("UTF-8"))
except Exception as exc:
logging.error('Request to twitter failed.', exc_info=exc)
return None
if not response["meta"]["result_count"]:
return []
for tweet in response["data"]:
title = tweet["text"]
description = tweet["text"]
link = "https://twitter.com/" + user + "/status/" + str(tweet["id"])
# Check included tweets
if (
"referenced_tweets" in tweet
and len(tweet["referenced_tweets"]) == 1
and tweet["referenced_tweets"][0]["type"] == "retweeted"
):
rt_info = title[: title.index(":") + 2]
ref_id = tweet["referenced_tweets"][0]["id"]
ref_tweet = next(
t for t in response["includes"]["tweets"] if t["id"] == ref_id
)
title = rt_info + ref_tweet["text"]
description = rt_info + ref_tweet["text"]
title, description = unshorten_urls(
title, description, ref_tweet.get("entities", {}).get("urls", [])
)
title, description = unshorten_urls(
title, description, tweet.get("entities", {}).get("urls", [])
)
# Attach media
enclosures = []
medias = tweet.get('attachments', {}).get('media_keys', [])
for media in medias:
ref_media = next(
t for t in response["includes"]["media"] if t["media_key"] == media
)
if 'url' not in ref_media: continue
if ref_media.get('type', '') == 'photo':
description += "
"
else:
enclosures.append(ref_media['url'])
# Append Retweets etc
description += "
"
description += str(tweet["public_metrics"]["retweet_count"]) + " Retweets, "
description += str(tweet["public_metrics"]["like_count"]) + " Likes, "
description += str(tweet["public_metrics"]["reply_count"]) + " Replies, "
description += str(tweet["public_metrics"]["quote_count"]) + " Quotes"
description += "
"
description += "Source: " + tweet["source"]
date = datetime.strptime(tweet["created_at"], "%Y-%m-%dT%H:%M:%S.%fZ")
yield title, description, link, date, enclosures
def main(channel):
print(
"""
Twitter: """
+ channel
+ """
https://twitter.com/"""
+ channel
+ """
The latest entries of the twitter account of """
+ channel
+ """
"""
+ _format_date(datetime.now())
+ """"""
)
for title, description, link, date, enclosures in twitter(channel):
print(" - ")
print(" ")
print(" " + link + "")
print(" ")
print(" " + _format_date(date) + "")
for enclosure in enclosures:
print(' ')
print("
")
print(" ")
print("")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage:", sys.argv[0], "")
sys.exit(1)
main(sys.argv[1])
# twitter('rheinbahn_intim')
# twitter('realDonaldTrump')