This commit is contained in:
Reetta S
2021-07-21 19:29:37 +03:00
7 changed files with 163 additions and 23 deletions
+9 -3
View File
@@ -1,6 +1,7 @@
from flask import Flask
from flask import Flask, render_template
import json
app = Flask(__name__)
from flask import render_template
@app.route("/")
def index():
@@ -19,4 +20,9 @@ def mukaan():
#ajankohtaista
@app.route("/ajankohtaista")
def ajankohtaista():
return "Somet"
try:
file = open("instagram_media.json", "r")
media = json.loads(file.read())
except FileNotFoundError:
return render_template("index.html")
return render_template('ajankohtaista.html', media=media)
+37
View File
@@ -0,0 +1,37 @@
[
{
"caption": "Yksi orkesteri, monta kanavaa monella tapaa. \ud83e\udd2a\ud83e\udd73 #socialmedia #linkedinfacebookinstagramtinder #sossuorkesteri #orkesteriel\u00e4m\u00e4\u00e4 #orkesteri #osakuntael\u00e4m\u00e4\u00e4 #sossupossut",
"media_type": "IMAGE",
"media_url": "https://scontent-hel3-1.cdninstagram.com/v/t51.2885-15/82291796_102038894653177_5608773873439235697_n.jpg?_nc_cat=100&ccb=1-3&_nc_sid=8ae9d6&_nc_ohc=22t0NrAwpusAX9PyQww&_nc_ht=scontent-hel3-1.cdninstagram.com&oh=a6a26e558c9fbb92e06cf5170e3b2414&oe=60BD8D48",
"permalink": "https://www.instagram.com/p/B7_GtJLhk6b/",
"timestamp": "2020-01-31T13:39:15+0000",
"id": "17982402277289339"
},
{
"caption": "Hei!\n\nOon SOSSun varapuheenjohtaja Shotti. Itse olen vasta toista vuotta SOSSussa ja orkesteriin l\u00f6ysin tieni er\u00e4ill\u00e4 sitseill\u00e4 saadusta vinkist\u00e4.\n\nKuten ylisuuresta viulusta kuvassa n\u00e4kyy, niin soitan alttoviulua. Minullakin on pitk\u00e4 tausta klassisen musiikin parissa, mik\u00e4 tekee SOSSun soittamasta musiikista raikkaan uuden tuntuista. Toisinaan niit\u00e4 klassisia biisej\u00e4kin tulee toki soitettua SOSSussakin eli huoleti voi olla identiteetin katoamisen pelosta \ud83d\ude04. Parasta SOSSussa on varmaan sen erilaisuus opiskelusta. Kun tulee treeneihin on mahdollisuus pit\u00e4\u00e4 taukoa opiskelusta, vaikka sekin kyll\u00e4kin on hauskaa \ud83d\ude0a. Fun (weird) fact: Soitin ennen yliopistomaailmaan p\u00e4\u00e4sy\u00e4 my\u00f6s klassista kitaraa, eli tied\u00e4n kynsien huollosta ehk\u00e4 v\u00e4h\u00e4n liikaakin... kuvassa n\u00e4kyy surun hetki kun huomasin halkeaman kynness\u00e4 \ud83d\ude14\n\n#SOSSututuksi #SOSSuorkesteri #orkesteriel\u00e4m\u00e4\u00e4 #alttoviulu #alttoviulisti #viola #opiskelijael\u00e4m\u00e4\u00e4 #vinnil\u00e4himp\u00e4n\u00e4taivasta #savolainenosakunta #kitara #funfact #varapuheenjohtaja #vpj #hallitus",
"media_type": "CAROUSEL_ALBUM",
"media_url": "https://scontent-hel3-1.cdninstagram.com/v/t51.2885-15/83921049_681248062614623_7120580720180709745_n.jpg?_nc_cat=109&ccb=1-3&_nc_sid=8ae9d6&_nc_ohc=aF7WPRMEOl8AX_mKw8z&_nc_ht=scontent-hel3-1.cdninstagram.com&oh=fa3b771b4479ce5f59fb2de37a75d667&oe=60BBE4F4",
"permalink": "https://www.instagram.com/p/B8bW0ohBCUt/",
"timestamp": "2020-02-11T12:58:49+0000",
"children": {
"data": [
{
"id": "17850513892847553"
},
{
"id": "17859043432737974"
}
]
},
"id": "17861558749697334"
},
{
"caption": "Liike ei pys\u00e4hdy edes lavan takana: KELA viihdytt\u00e4\u00e4 my\u00f6s b\u00e4kk\u00e4rill\u00e4! \ud83d\udc83\ud83d\udd7a\ud83c\udf89 #sossuorkesteri #puhallus2019",
"media_type": "VIDEO",
"media_url": "https://video-hel3-1.cdninstagram.com/v/t50.2886-16/71939763_128182238558157_5605873915362639211_n.mp4?_nc_cat=100&vs=17856549352550903_700774502&_nc_vs=HBksFQAYJEdMTzJTUVROdDh2QWxIUUFBR3Q5MGZTZkVNeE5ia1lMQUFBRhUAAsgBABUAGCRHQ1k2U0FUS1kzeC1JWGdBQVBjQUhwZVhrSk1lYmtZTEFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMRUAACbugY%2BC%2B5u4PxUCKAJDMywXQDBmZmZmZmYYEmRhc2hfYmFzZWxpbmVfMV92MREAdeoHAA%3D%3D&ccb=1-3&_nc_sid=59939d&efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjQ4MC5mZWVkIn0%3D&_nc_ohc=WfwDHhbLMzkAX8g38Yc&_nc_ht=video-hel3-1.cdninstagram.com&oh=490586e89eb6038a1458b53ddfc10ffb&oe=60BD2D38&_nc_rid=3864063f2f",
"permalink": "https://www.instagram.com/p/B2wTg0vgov6/",
"thumbnail_url": "https://scontent-hel3-1.cdninstagram.com/v/t51.2885-15/70860567_165948617909144_4180991442688459468_n.jpg?_nc_cat=104&ccb=1-3&_nc_sid=8ae9d6&_nc_ohc=nSfKnPhy9qoAX8hBaYR&_nc_oc=AQkFWxTIwNxxQ0lEgGiAkT4qjN3a4pPUO6ne_LoXmch1AV4kC_RuZMpycQGLRrvTNJtMMCIGBxFUxbv_i86TsICi&_nc_ht=scontent-hel3-1.cdninstagram.com&oh=64cc7bdbdbd0945d00d00ea8617e897d&oe=60BCB15C",
"timestamp": "2019-09-23T13:06:27+0000",
"id": "17864507065493158"
}
]
+51
View File
@@ -0,0 +1,51 @@
import json, time, requests
def read_data_from_file(filename):
with open(filename, "r") as file:
return json.loads(file.read())
def write_data_to_file(filename, data):
with open(filename, "w") as file:
file.write(json.dumps(data, indent=4))
try:
secrets = read_data_from_file("secrets.json")
except FileNotFoundError:
secrets = {"user_id": "", "access_token": "", "last_refresh": 0}
write_data_to_file("secrets.json", secrets)
def call(url, payload):
""" Calls the instagram Basic Display API with the given url and payload.
Returns the response body as a dict.
Raises HTTPError if the HTTP response code is 4XX or 5XX. """
# append access token to payload
payload |= {"access_token": secrets["access_token"]}
response = requests.get("https://graph.instagram.com" + url, params=payload)
response.raise_for_status()
return response.json()
def refresh_instagram_access_token():
""" Refreshes the long-lived access token of the instagram account. The access token
will expire in 60 days if not refreshed. A refresh is possible when at least 24 hours
have passed since the previous one. """
response_body = call("/refresh_access_token", {"grant_type": "ig_refresh_token"})
expiration_date = time.time() + response_body["expires_in"]
expiration_date = time.strftime("%Y.%m.%d %H:%M", time.gmtime(expiration_date))
secrets["last_refresh"] = time.time()
print(f"Instagram access token refreshed. Expires on {expiration_date}")
write_data_to_file("secrets.json", secrets)
def fetch_instagram_media():
""" Fetches the most recent media of the instagram user. """
print("Fetching instagram media.")
fields = ",".join([
"caption", "media_type", "media_url", "permalink",
"thumbnail_url", "timestamp", "children"
])
response_body = call("/{:s}/media".format(secrets["user_id"]), {"fields": fields})
media = response_body["data"]
write_data_to_file("instagram_media.json", media)
if __name__ == "__main__":
refresh_instagram_access_token()
fetch_instagram_media()
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

+20
View File
@@ -83,3 +83,23 @@ p, h3, h2 {
.sticky + .content {
padding-top: 60px;
}
.fit-picture {
height: 196px;
width: 196px;
background: #000000;
object-fit: contain;
}
.social-media-entry {
background-color: #ffffff00;
margin: 10px auto;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
}
a {
text-decoration: none;
color: #000000;
}
+34
View File
@@ -0,0 +1,34 @@
{% extends "layout.html" %}
{% block head %}{{ super() }}{% endblock %}
{% block content %}
{{ super() }}
<div class="centerBox">
{% for entry in media %}
<div class="social-media-entry">
<a href="{{ entry["permalink"] }}"
target="_blank">
<div style="float: left; margin: 0px 10px;">
<img class="fit-picture"
{% if entry["media_type"] == "IMAGE"
or entry["media_type"] == "CAROUSEL_ALBUM" %}
src={{ entry["media_url"] }}
{% elif entry["media_type"] == "VIDEO" %}
src={{ entry["thumbnail_url"] }}
{% endif %}
alt="{{ entry["caption"] }}">
</div>
<div style="text-align: left">
<div>
{{ entry["timestamp"] }}
</div>
<div style="overflow: hidden">
{{ entry["caption"] }}
</div>
</div>
</a>
</div>
{% endfor %}
</div>
{% endblock %}
+12 -20
View File
@@ -29,29 +29,21 @@
<p>sossu.orkesteri@gmail.com</p>
<p> Mannerheimintie 5 A</p>
<p>00100 Helsinki</p>
<br>
<a href="https://www.instagram.com/sossuorkesteri/">
<img src="/static/insta">
</a>
<a href="https://www.facebook.com/SOSSu.orkesteri">
<img src="/static/fb">
</a>
</footer>
<script>
window.onscroll = function() {myFunction()};
<script>
window.onscroll = function() {myFunction()};
var navbar = document.getElementById("navbar");
var sticky = navbar.offsetTop;
var navbar = document.getElementById("navbar");
var sticky = navbar.offsetTop;
function myFunction() {
if (window.pageYOffset >= sticky) {
navbar.classList.add("sticky")
} else {
navbar.classList.remove("sticky");
function myFunction() {
if (window.pageYOffset >= sticky) {
navbar.classList.add("sticky")
} else {
navbar.classList.remove("sticky");
}
}
}
</script>
</body>
</script>
</body>
</html>