Source code for agoras.common.utils
# -*- coding: utf-8 -*-
#
# Please refer to AUTHORS.rst for a complete list of Copyright holders.
# Copyright (C) 2022-2026, Agoras Developers.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
agoras.common.utils
===================
This module contains common and low level functions to all modules in agoras.
"""
from urllib.parse import parse_qs, urlencode, urlparse
import requests
from bs4 import BeautifulSoup
[docs]
def add_url_timestamp(url, timestamp):
parsed = urlparse(url)
query = dict(parse_qs(str(parsed.query)))
query['t'] = timestamp
parsed = parsed._replace(query=urlencode(query))
return parsed.geturl()
[docs]
def metatag(tag):
return tag.name == "meta" \
and tag.has_attr("content") \
and (tag.has_attr("property") or tag.has_attr("name"))
[docs]
def find_metatags(url, search):
found = {}
response = requests.get(url, timeout=20)
if response.status_code != 200:
return found
soup = BeautifulSoup(response.content, 'html.parser')
for target in search:
found_meta_tag = soup.find_all(metatag)
if not found_meta_tag:
continue
for meta_tag in found_meta_tag:
prop = meta_tag.get("property", "")
name = meta_tag.get("name", "")
if prop == target or name == target:
found[target] = meta_tag.get("content", "")
return found
[docs]
def parse_metatags(url):
KNOWN_TAGS = [
"og:title",
"og:image",
"og:description",
"twitter:title",
"twitter:image",
"twitter:description",
]
try:
data = find_metatags(url, KNOWN_TAGS)
except Exception:
data = {}
return {
"title": data.get("og:title", data.get("twitter:title", "")),
"image": data.get("og:image", data.get("twitter:image", "")),
"description": data.get("og:description", data.get("twitter:description", "")),
}