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
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)
|
|
|