You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

196 lines
7.9 KiB

# Testa om det finns en giltig access token och skapa den om den inte finns,
# spara till access_token.json
import json
from datetime import datetime, timedelta
from pprint import pprint
from time import time
from urllib.request import Request, urlopen
import requests
# API documentation: https://actapublica.docs.apiary.io/#reference/0/search-results-of-users-agents/post
class ActaPublica:
def __init__(self, client_id=False, client_key=False):
if not client_id:
client_id = input("Client ID:")
client_key: input("Client key:")
self.token = self.get_token(client_id, client_key)
self.params = self.reset_params()
self.headers = {
"Content-Type": "application/json",
"Accept": "application/json",
"Authorization": f"Bearer {self.token}",
}
self.menu()
def menu(self):
# What to search for.
print(
"""
Vad vill du söka efter? Vill du göra en snabb sökning skriv bara sökorden.
1. Personnummer
A. Jag är klar, sök i Acta Publica.
B. Inget, avsluta programmet.
"""
)
user_input = input(">> ").strip()
if user_input == "A":
self.search()
elif user_input == "B":
print("Avslutar")
exit()
elif user_input == "1":
self.add_pnr()
else:
self.quick_search(user_input)
# TODO Add more alternatives, and parameters like where to search etc.
# # Where to search
# user_input = input('>> ')
# print('''
# Var vill du söka?
# 1. Domstolar
# ''')
# if user_input == '':
# pass # Search everywhere.
# elif user_input == '1':
def search(self):
"""Do a search in Acta Publica."""
request = Request(
"https://api.arkivet.actapublica.se/search",
data=bytes(json.dumps(self.params), encoding="utf-8"),
headers=self.headers,
)
r = urlopen(request).read() # Comes in bytes. #* Change to .json()?
self.search_result = json.loads(r) # Data as a dict.
def quick_search(self, query):
"""Do a quick search."""
self.reset_params()
self.params["query"] = str(query)
self.search()
def view_result(self):
for result in self.search_result:
pprint(result, "\n---\n")
def download_documents(self):
for i in range(0, len(self.search_result["hits"])):
url = self.search_result["hits"][i]["document_download_link"]
filnamn = self.search_result["hits"][i]["filename"]
pdf = requests.get(url, allow_redirects=True)
with open(filnamn, "wb") as f:
f.write(pdf.content)
def add_pnr(self, condition="OR"):
user_input = input("Personnummer: ")
if "csv" in user_input:
with open(user_input) as csv:
l = [i.strip() for i in csv]
else:
l = user_input.split(",")
# Remove spaces.
l = [i.strip() for i in l]
self.params["personnummer"] = {"condition": condition, "values": [l]}
def new_token(client_id, client_key):
"""
Get an access token from Acta Publica.
"""
values = {
"grant_type": "client_credentials",
"client_id": client_id,
"client_secret": client_key,
"scope": "document.view,document.list,agent.detail,agent.list,document.download",
}
headers = {"Content-Type": "application/json", "accept": "application/json"}
request = Request(
"https://api.arkivet.actapublica.se/authorize",
data=bytes(json.dumps(values), encoding="utf-8"),
headers=headers,
)
r = urlopen(request).read()
parsed_json = json.loads(r.decode("utf8"))
parsed_json["tid"] = str(datetime.now())
with open("access_token.json", "w") as f:
json.dump(parsed_json, f)
return parsed_json
# This is a Python function that generates an access token for Acta Publica's API. It takes two parameters: `client_id` and `client_key`, which are used to authenticate the request. The function returns a dictionary containing the access token and other relevant information.
# Here is a breakdown of the code:
# 1. The function starts by defining a dictionary called `values`. This dictionary will contain the parameters needed to generate the access token.
# 2. The function then defines a dictionary called `headers`. This dictionary will contain the headers needed for the HTTP request.
# 3. The function then creates an instance of the `Request` class from the `urllib.request` module. This object represents the HTTP request that will be sent to Acta Publica's API.
# 4. The function then sets the `data` parameter of the `Request` object to a JSON-encoded string containing the parameters needed to generate the access token.
# 5. The function then sets the `headers` parameter of the `Request` object to a dictionary containing the headers needed for the HTTP request.
# 6. The function then sends the HTTP request to Acta Publica's API using the `urlopen` function from the `urllib.request` module. This function returns an instance of the `Response` class, which represents the response received from Acta Publica's API.
# 7. The function then reads the contents of the response using the `read()` method and stores them in a variable called `r`.
# 8. The function then decodes the contents of the response from UTF-8 encoding using the `decode()` method and stores them in a variable called `parsed_json`.
# 9. The function then extracts the access token from the response and stores it in a variable called `access_token`.
# 10. The function then updates the dictionary `parsed_json` with the access token and other relevant information.
# 11. The function then writes the updated dictionary to a JSON file called `access_token.json` using the `dump()` method from the `json` module.
# 12. The function then returns the updated dictionary containing the access token and other relevant information.
def get_token(self, client_id, client_key):
"""Look for access token and create one if not local available."""
try:
with open("access_token.json") as f:
token_data = json.load(f)
token = token_data["access_token"]
valid = timedelta(seconds=token_data["expires_in"])
skapad = datetime.fromisoformat(token_data["tid"])
expires = skapad + valid
if (skapad + valid) - datetime.now() > timedelta(seconds=3600):
print(
"\nAccess token {} giltig till {} {}".format(
token[:5] + "...",
datetime.date(skapad + valid),
str(datetime.time(skapad + valid))[:5],
)
)
else:
token = self.new_token(client_id, client_key)["access_token"]
print(
"\nAccess token {} skapad {}".format(
token[:5] + "...", datetime.now()
)
)
except FileNotFoundError:
token = self.new_token(client_id, client_key)["access_token"]
print(
"\nAccess token {} skapad {}".format(token[:5] + "...", datetime.now())
)
return token
def reset_params(self):
"""Reset parameters."""
parametrar = {
"size": "1000",
"start_date": "01-01-2001 00:00:00",
"end_date": time.strftime("%d-%m-%Y %H:%M:%S"),
"sort": "",
}
if __name__ == "__main__":
ap = ActaPublica()
while True:
ap.menu()
pprint(ap.search_result)