2013-03-02 12:48:31 -08:00
|
|
|
import json
|
2024-04-24 09:50:42 -04:00
|
|
|
|
2013-03-02 12:48:31 -08:00
|
|
|
import requests
|
|
|
|
|
|
|
|
# To add
|
|
|
|
# - Identity Delegation
|
|
|
|
# - Streams (in dev by app.net)
|
|
|
|
# - Filters (in dev by app.net)
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
|
2013-03-02 12:48:31 -08:00
|
|
|
class Appdotnet:
|
2024-04-24 09:43:56 -04:00
|
|
|
"""Once access has been given, you don't have to pass through the
|
2013-03-02 12:48:31 -08:00
|
|
|
client_id, client_secret, redirect_uri, or scope. These are just
|
|
|
|
to get the authentication token.
|
|
|
|
|
|
|
|
Once authenticated, you can initialise appdotnet with only the
|
|
|
|
access token: ie
|
|
|
|
|
|
|
|
api = Appdotnet(access_token='<insert token here>')
|
2024-04-24 09:43:56 -04:00
|
|
|
"""
|
2013-03-02 12:48:31 -08:00
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
def __init__(self, client_id=None, client_secret=None, redirect_uri=None, scope=None, access_token=None):
|
|
|
|
# for server authentication flow
|
2013-03-02 12:48:31 -08:00
|
|
|
self.client_id = client_id
|
|
|
|
self.client_secret = client_secret
|
|
|
|
self.redirect_uri = redirect_uri
|
|
|
|
self.scope = scope
|
|
|
|
|
|
|
|
self.access_token = access_token
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
self.api_anchor = "alpha.app.net" # for when the versions change
|
|
|
|
# anchors currently different
|
2013-03-02 12:48:31 -08:00
|
|
|
self.public_api_anchor = "alpha-api.app.net"
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
# scopes provided by app.net API
|
|
|
|
self.allowed_scopes = ["stream", "email", "write_post", "follow", "messages", "export"]
|
2013-03-02 12:48:31 -08:00
|
|
|
|
|
|
|
def generateAuthUrl(self):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = (
|
|
|
|
"https://"
|
|
|
|
+ self.api_anchor
|
|
|
|
+ "/oauth/authenticate?client_id="
|
|
|
|
+ self.client_id
|
|
|
|
+ "&response_type=code&adnview=appstore&redirect_uri="
|
|
|
|
+ self.redirect_uri
|
|
|
|
+ "&scope="
|
|
|
|
)
|
2013-03-02 12:48:31 -08:00
|
|
|
|
|
|
|
for scope in self.scope:
|
|
|
|
if scope in self.allowed_scopes:
|
|
|
|
url += scope + " "
|
|
|
|
|
|
|
|
return url
|
|
|
|
|
|
|
|
def getAuthResponse(self, code):
|
2024-04-24 09:43:56 -04:00
|
|
|
# generate POST request
|
2013-03-02 12:48:31 -08:00
|
|
|
url = "https://alpha.app.net/oauth/access_token"
|
2024-04-24 09:43:56 -04:00
|
|
|
post_data = {
|
|
|
|
"client_id": self.client_id,
|
|
|
|
"client_secret": self.client_secret,
|
|
|
|
"grant_type": "authorization_code",
|
|
|
|
"redirect_uri": self.redirect_uri,
|
|
|
|
"code": code,
|
|
|
|
}
|
2013-03-02 12:48:31 -08:00
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
r = requests.post(url, data=post_data)
|
2013-03-02 12:48:31 -08:00
|
|
|
|
|
|
|
return r.text
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
"""
|
2013-03-02 12:48:31 -08:00
|
|
|
API Calls
|
2024-04-24 09:43:56 -04:00
|
|
|
"""
|
2013-03-02 12:48:31 -08:00
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
# GET REQUESTS
|
2013-03-02 12:48:31 -08:00
|
|
|
def getRequest(self, url, getParameters=None):
|
|
|
|
if not getParameters:
|
|
|
|
getParameters = {}
|
2024-04-24 09:43:56 -04:00
|
|
|
# access token
|
2013-03-02 12:48:31 -08:00
|
|
|
url = url + "?access_token=" + self.access_token
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
# if there are any extra get parameters aside from the access_token, append to the url
|
2013-03-02 12:48:31 -08:00
|
|
|
if getParameters != {}:
|
2020-06-17 06:43:32 -04:00
|
|
|
for key, value in getParameters.items():
|
2024-04-24 09:43:56 -04:00
|
|
|
if not value:
|
|
|
|
continue
|
2020-06-17 06:43:32 -04:00
|
|
|
url = url + "&" + key + "=" + str(value)
|
|
|
|
print(url)
|
2013-03-02 12:48:31 -08:00
|
|
|
r = requests.get(url)
|
|
|
|
if r.status_code == requests.codes.ok:
|
|
|
|
return r.text
|
|
|
|
else:
|
|
|
|
j = json.loads(r.text)
|
2024-04-24 09:43:56 -04:00
|
|
|
resp = {"error_code": r.status_code, "message": j["error"]["message"]}
|
2013-03-02 12:48:31 -08:00
|
|
|
return json.dumps(resp)
|
|
|
|
|
|
|
|
def getUser(self, user_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/users/%s" % (self.public_api_anchor, user_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getUserPosts(self, user_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/users/%s/posts" % (self.public_api_anchor, user_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getUserStars(self, user_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/users/%s/stars" % (self.public_api_anchor, user_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getGlobalStream(self):
|
|
|
|
url = "https://%s/stream/0/posts/stream/global" % self.public_api_anchor
|
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getUserStream(self):
|
|
|
|
url = "https://%s/stream/0/posts/stream" % self.public_api_anchor
|
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getUserMentions(self, user_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/users/%s/mentions" % (self.public_api_anchor, user_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getPost(self, post_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/posts/%s" % (self.public_api_anchor, post_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getReposters(self, post_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/posts/%s/reposters" % (self.public_api_anchor, post_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getStars(self, post_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/posts/%s/stars" % (self.public_api_anchor, post_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getPostReplies(self, post_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/posts/%s/replies" % (self.public_api_anchor, post_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getPostsByTag(self, tag):
|
|
|
|
url = "https://%s/stream/0/posts/tag/%s" % (self.public_api_anchor, tag)
|
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getUserFollowing(self, user_id, since_id=None, before_id=None):
|
|
|
|
url = "https://%s/stream/0/users/%s/following" % (self.public_api_anchor, user_id)
|
2024-04-24 09:43:56 -04:00
|
|
|
return self.getRequest(
|
|
|
|
url,
|
|
|
|
getParameters={
|
|
|
|
"since_id": since_id,
|
|
|
|
"before_id": before_id,
|
|
|
|
},
|
|
|
|
)
|
2013-03-02 12:48:31 -08:00
|
|
|
|
|
|
|
def getUserFollowingIds(self, user_id, since_id=None, before_id=None):
|
|
|
|
url = "https://%s/stream/0/users/%s/following/ids" % (self.public_api_anchor, user_id)
|
2024-04-24 09:43:56 -04:00
|
|
|
return self.getRequest(
|
|
|
|
url,
|
|
|
|
getParameters={
|
|
|
|
"since_id": since_id,
|
|
|
|
"before_id": before_id,
|
|
|
|
},
|
|
|
|
)
|
2013-03-02 12:48:31 -08:00
|
|
|
|
|
|
|
def getUserFollowers(self, user_id):
|
|
|
|
url = "https://%s/stream/0/users/%s/followers" % (self.public_api_anchor, user_id)
|
|
|
|
return self.getRequest(url)
|
|
|
|
|
|
|
|
def getMutedUsers(self):
|
|
|
|
url = "https://%s/stream/0/users/me/muted" % self.public_api_anchor
|
|
|
|
return self.getRequest(url)
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
def searchUsers(self, q):
|
2013-03-02 12:48:31 -08:00
|
|
|
url = "https://%s/stream/0/users/search" % (self.public_api_anchor)
|
2024-04-24 09:43:56 -04:00
|
|
|
return self.getRequest(url, getParameters={"q": q})
|
2013-03-02 12:48:31 -08:00
|
|
|
|
|
|
|
def getCurrentToken(self):
|
|
|
|
url = "https://%s/stream/0/token" % self.public_api_anchor
|
|
|
|
return self.getRequest(url)
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
# POST REQUESTS
|
2013-03-02 12:48:31 -08:00
|
|
|
def postRequest(self, url, data=None, headers=None):
|
|
|
|
if not data:
|
|
|
|
data = {}
|
|
|
|
|
|
|
|
if not headers:
|
|
|
|
headers = {}
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
headers["Authorization"] = "Bearer %s" % self.access_token
|
2013-03-02 12:48:31 -08:00
|
|
|
url = url
|
2024-04-24 09:43:56 -04:00
|
|
|
r = requests.post(url, data=json.dumps(data), headers=headers)
|
2013-03-02 12:48:31 -08:00
|
|
|
if r.status_code == requests.codes.ok:
|
|
|
|
return r.text
|
|
|
|
else:
|
|
|
|
try:
|
|
|
|
j = json.loads(r.text)
|
2024-04-24 09:43:56 -04:00
|
|
|
resp = {"error_code": r.status_code, "message": j["error"]["message"]}
|
2013-03-02 12:48:31 -08:00
|
|
|
return resp
|
2024-04-24 09:43:56 -04:00
|
|
|
except: # generic error
|
2020-06-17 06:43:32 -04:00
|
|
|
print(r.text)
|
2013-03-02 12:48:31 -08:00
|
|
|
return "{'error':'There was an error'}"
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
def followUser(self, user_id):
|
2013-03-02 12:48:31 -08:00
|
|
|
url = "https://%s/stream/0/users/%s/follow" % (self.public_api_anchor, user_id)
|
|
|
|
return self.postRequest(url)
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
def repostPost(self, post_id):
|
2013-03-02 12:48:31 -08:00
|
|
|
url = "https://%s/stream/0/posts/%s/repost" % (self.public_api_anchor, post_id)
|
|
|
|
return self.postRequest(url)
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
def starPost(self, post_id):
|
2013-03-02 12:48:31 -08:00
|
|
|
url = "https://%s/stream/0/posts/%s/star" % (self.public_api_anchor, post_id)
|
|
|
|
return self.postRequest(url)
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
def muteUser(self, user_id):
|
2013-03-02 12:48:31 -08:00
|
|
|
url = "https://%s/stream/0/users/%s/mute" % (self.public_api_anchor, user_id)
|
|
|
|
return self.postRequest(url)
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
# requires: text
|
|
|
|
# optional: reply_to, annotations, links
|
|
|
|
def createPost(self, text, reply_to=None, annotations=None, links=None):
|
2013-03-02 12:48:31 -08:00
|
|
|
url = "https://%s/stream/0/posts" % self.public_api_anchor
|
|
|
|
if annotations != None:
|
|
|
|
url = url + "?include_annotations=1"
|
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
data = {"text": text}
|
2013-03-02 12:48:31 -08:00
|
|
|
if reply_to != None:
|
2024-04-24 09:43:56 -04:00
|
|
|
data["reply_to"] = reply_to
|
2013-03-02 12:48:31 -08:00
|
|
|
if annotations != None:
|
2024-04-24 09:43:56 -04:00
|
|
|
data["annotations"] = annotations
|
2013-03-02 12:48:31 -08:00
|
|
|
if links != None:
|
2024-04-24 09:43:56 -04:00
|
|
|
data["links"] = links
|
2013-03-02 12:48:31 -08:00
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
return self.postRequest(url, data, headers={"content-type": "application/json"})
|
2013-03-02 12:48:31 -08:00
|
|
|
|
2024-04-24 09:43:56 -04:00
|
|
|
# DELETE request
|
2013-03-02 12:48:31 -08:00
|
|
|
def deleteRequest(self, url):
|
|
|
|
url = url + "?access_token=" + self.access_token
|
|
|
|
r = requests.delete(url)
|
|
|
|
if r.status_code == requests.codes.ok:
|
|
|
|
return r.text
|
|
|
|
else:
|
|
|
|
try:
|
|
|
|
j = json.loads(r.text)
|
2024-04-24 09:43:56 -04:00
|
|
|
resp = {"error_code": r.status_code, "message": j["error"]["message"]}
|
2013-03-02 12:48:31 -08:00
|
|
|
return resp
|
2024-04-24 09:43:56 -04:00
|
|
|
except: # generic error
|
2020-06-17 06:43:32 -04:00
|
|
|
print(r.text)
|
2013-03-02 12:48:31 -08:00
|
|
|
return "{'error':'There was an error'}"
|
|
|
|
|
|
|
|
def deletePost(self, post_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/posts/%s" % (self.public_api_anchor, post_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.deleteRequest(url)
|
|
|
|
|
|
|
|
def unrepostPost(self, post_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/posts/%s/repost" % (self.public_api_anchor, post_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.deleteRequest(url)
|
|
|
|
|
|
|
|
def unstarPost(self, post_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/posts/%s/star" % (self.public_api_anchor, post_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.deleteRequest(url)
|
|
|
|
|
|
|
|
def unfollowUser(self, user_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/users/%s/follow" % (self.public_api_anchor, user_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.deleteRequest(url)
|
|
|
|
|
|
|
|
def unmuteUser(self, user_id):
|
2024-04-24 09:43:56 -04:00
|
|
|
url = "https://%s/stream/0/users/%s/mute" % (self.public_api_anchor, user_id)
|
2013-03-02 12:48:31 -08:00
|
|
|
return self.deleteRequest(url)
|