habe eine kleine Schnittstelle zur Hugelol (so eine Art Imageboard) API geschrieben.
Bin eigentlich ganz überzeugt von meinem Konzept, vor allem da alles wie gewünscht funktioniert.
Würde aber mal gerne wissen was die Experten zum Design sagen.
Code: Alles auswählen
import urllib.request
import json
class HugelolApi(object):
def __init__(self):
# create the opener
self.opener = urllib.request.build_opener()
self.opener.addheaders = [("User-agent", "Mozilla/5.0")]
#api urls
self.apis = {
"front" : "http://hugelol.com/api/front.php?after={}",
"rising" : "http://hugelol.com/api/rising.php?after={}",
"fresh" : "http://hugelol.com/api/fresh.php?after={}",
"top" : "http://hugelol.com/api/top.php?after={}",
"lol" : "http://hugelol.com/api/lol.php?id={}"
}
# last id from the page being processed
self.lastID = None
# last page visited
self.lastPage = None
self.hasNext = False
def getPosts(self, api, after=""):
"""uses the following apis: front, rising, fresh, top"""
if not api in self.apis:
raise IndexError
url = self.apis[api].format(after)
# proceed request, read and decode
data = self.opener.open(url).read().decode("utf-8", errors="ignore")
# Array is twice json encoded, so it must be decoded twice
jsondata = json.loads(json.loads(data))
posts = list()
for entry in jsondata:
posts.append({
"lol_id" : entry[0],
"lol_time" : entry[1],
"lol_uid" : entry[2],
"lol_username" : entry[3],
"lol_type" : entry[4],
"lol_url" : entry[5],
"lol_title" : entry[6],
"lol_score" : entry[7],
"lol_comments" : entry[8],
"lol_badge" : entry[9]
})
# ID from the last post in "posts" list
self.lastID = posts[-1]["lol_id"]
self.lastPage = api
self.hasNext = True
return posts
def getNext(self):
if self.hasNext:
return self.getPosts(self.lastPage, self.lastID)
def getPost(self, id):
"""uses the "lol" api for receiving data about one single post"""
url = self.apis["lol"].format(id)
# proceed request, read and decode
data = self.opener.open(url).read().decode("utf-8", errors="ignore")
# decode
jsondata = json.loads(data)
post = {
"lol_id" : [0],
"lol_time" : jsondata[1],
"lol_uid" : jsondata[2],
"lol_username" : jsondata[3],
"lol_type" : jsondata[4],
"lol_url" : jsondata[5],
"lol_title" : jsondata[6],
"lol_score" : jsondata[7],
"lol_comments" : jsondata[8],
"lol_badge" : jsondata[9],
"lol_likes" : jsondata[10],
"lol_dislikes" : jsondata[11],
"lol_repost_of" : jsondata[12],
"lol_next" : jsondata[13],
"lol_prev" : jsondata[14],
"lol_link" : jsondata[15],
"lol_source" : jsondata[16],
"lol_deleted" : jsondata[17]
}
return post