Provide better responses for errors (#196); Fix some extract methods
This commit is contained in:
parent
1d03bf80e7
commit
54ec334730
17
test_api.py
17
test_api.py
@ -54,6 +54,23 @@ def test_api_user():
|
|||||||
assert resp.status_code==200
|
assert resp.status_code==200
|
||||||
assert jData["screen_name"]=="jack"
|
assert jData["screen_name"]=="jack"
|
||||||
|
|
||||||
|
def test_api_user_suspended():
|
||||||
|
resp = client.get(testUserSuspended.replace("https://twitter.com","https://api.vxtwitter.com"),headers={"User-Agent":"test"})
|
||||||
|
jData = resp.get_json()
|
||||||
|
assert resp.status_code==500
|
||||||
|
assert 'suspended' in jData["error"]
|
||||||
|
|
||||||
|
def test_api_user_private():
|
||||||
|
resp = client.get(testUserPrivate.replace("https://twitter.com","https://api.vxtwitter.com")+"?with_tweets=true",headers={"User-Agent":"test"})
|
||||||
|
jData = resp.get_json()
|
||||||
|
assert jData['protected'] == True
|
||||||
|
assert len(jData["latest_tweets"])==0
|
||||||
|
|
||||||
|
def test_api_user_invalid():
|
||||||
|
resp = client.get(testUserInvalid.replace("https://twitter.com","https://api.vxtwitter.com")+"?with_tweets=true",headers={"User-Agent":"test"})
|
||||||
|
jData = resp.get_json()
|
||||||
|
assert resp.status_code==404
|
||||||
|
|
||||||
def test_api_user_feed():
|
def test_api_user_feed():
|
||||||
resp = client.get(testUser.replace("https://twitter.com","https://api.vxtwitter.com")+"?with_tweets=true",headers={"User-Agent":"test"})
|
resp = client.get(testUser.replace("https://twitter.com","https://api.vxtwitter.com")+"?with_tweets=true",headers={"User-Agent":"test"})
|
||||||
jData = resp.get_json()
|
jData = resp.get_json()
|
||||||
|
@ -315,7 +315,11 @@ def extractStatusV2Android(url,workaroundTokens):
|
|||||||
print(f"Error in output: {json.dumps(output['errors'])}")
|
print(f"Error in output: {json.dumps(output['errors'])}")
|
||||||
# try another token
|
# try another token
|
||||||
continue
|
continue
|
||||||
entries=output['data']['timeline_response']['instructions'][0]['entries']
|
entries = None
|
||||||
|
for instruction in output['data']['timeline_response']['instructions']:
|
||||||
|
if instruction["__typename"] == "TimelineAddEntries":
|
||||||
|
entries = instruction['entries']
|
||||||
|
break
|
||||||
tweetEntry=None
|
tweetEntry=None
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
if 'content' not in entry:
|
if 'content' not in entry:
|
||||||
@ -372,7 +376,11 @@ def extractStatusV2TweetDetail(url,workaroundTokens):
|
|||||||
print(f"Error in output: {json.dumps(output['errors'])}")
|
print(f"Error in output: {json.dumps(output['errors'])}")
|
||||||
# try another token
|
# try another token
|
||||||
continue
|
continue
|
||||||
entries=output['data']['threaded_conversation_with_injections_v2']['instructions'][0]['entries']
|
entries = None
|
||||||
|
for instruction in output['data']['threaded_conversation_with_injections_v2']['instructions']:
|
||||||
|
if instruction["type"] == "TimelineAddEntries":
|
||||||
|
entries = instruction['entries']
|
||||||
|
break
|
||||||
tweetEntry=None
|
tweetEntry=None
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
if 'content' not in entry:
|
if 'content' not in entry:
|
||||||
@ -501,6 +509,8 @@ def extractUser(url,workaroundTokens):
|
|||||||
raise TwExtractError(error["code"], error["message"])
|
raise TwExtractError(error["code"], error["message"])
|
||||||
return output
|
return output
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
if hasattr(e,"msg") and (e.msg == 'User has been suspended.' or e.msg == 'User not found.'):
|
||||||
|
raise e
|
||||||
continue
|
continue
|
||||||
raise TwExtractError(400, "Extract error")
|
raise TwExtractError(400, "Extract error")
|
||||||
|
|
||||||
|
23
twitfix.py
23
twitfix.py
@ -295,11 +295,14 @@ def getUserData(twitter_url,includeFeed=False):
|
|||||||
userData = getApiUserResponse(rawUserData)
|
userData = getApiUserResponse(rawUserData)
|
||||||
|
|
||||||
if includeFeed:
|
if includeFeed:
|
||||||
feed = twExtract.extractUserFeedFromId(userData['id'],workaroundTokens=config['config']['workaroundTokens'].split(','))
|
if userData['protected']:
|
||||||
apiFeed = []
|
userData['latest_tweets']=[]
|
||||||
for tweet in feed:
|
else:
|
||||||
apiFeed.append(getApiResponse(tweet))
|
feed = twExtract.extractUserFeedFromId(userData['id'],workaroundTokens=config['config']['workaroundTokens'].split(','))
|
||||||
userData['latest_tweets'] = apiFeed
|
apiFeed = []
|
||||||
|
for tweet in feed:
|
||||||
|
apiFeed.append(getApiResponse(tweet))
|
||||||
|
userData['latest_tweets'] = apiFeed
|
||||||
|
|
||||||
return userData
|
return userData
|
||||||
|
|
||||||
@ -330,7 +333,15 @@ def twitfix(sub_path):
|
|||||||
username=sub_path.split("/")[0]
|
username=sub_path.split("/")[0]
|
||||||
extra = sub_path.split("/")[1]
|
extra = sub_path.split("/")[1]
|
||||||
if extra in [None,"with_replies","media","likes","highlights","superfollows","media",''] and username != "" and username != None:
|
if extra in [None,"with_replies","media","likes","highlights","superfollows","media",''] and username != "" and username != None:
|
||||||
userData = getUserData(f"https://twitter.com/{username}","with_tweets" in request.args)
|
try:
|
||||||
|
userData = getUserData(f"https://twitter.com/{username}","with_tweets" in request.args)
|
||||||
|
except twExtract.TwExtractError as e:
|
||||||
|
if isApiRequest:
|
||||||
|
status=500
|
||||||
|
if 'not found' in e.msg:
|
||||||
|
status=404
|
||||||
|
return Response(json.dumps({"error": e.msg}), status=status,mimetype='application/json')
|
||||||
|
return message("Error getting user data: "+str(e.msg))
|
||||||
if isApiRequest:
|
if isApiRequest:
|
||||||
if userData is None:
|
if userData is None:
|
||||||
abort(404)
|
abort(404)
|
||||||
|
2
vxApi.py
2
vxApi.py
@ -217,7 +217,7 @@ def getApiResponse(tweet,include_txt=False,include_rtf=False):
|
|||||||
totalVotes += option["votes"]
|
totalVotes += option["votes"]
|
||||||
pollData["options"].append(option)
|
pollData["options"].append(option)
|
||||||
for i in pollData["options"]:
|
for i in pollData["options"]:
|
||||||
i["percent"] = round((i["votes"]/totalVotes)*100,2)
|
i["percent"] = round((i["votes"]/totalVotes)*100,2) if totalVotes > 0 else 0
|
||||||
|
|
||||||
if 'lang' in tweetL:
|
if 'lang' in tweetL:
|
||||||
lang = tweetL['lang']
|
lang = tweetL['lang']
|
||||||
|
@ -27,6 +27,9 @@ testMixedMediaTweet_compare={'text': 'Some of us here are definitely big nerds a
|
|||||||
testVinePlayerTweet_compare={'text': 'You wanted old ROBLOX back, you got it. Check out our sweet "new" look! #BringBackOldROBLOX https://vine.co/v/OL9VqvM6wJh', 'date': 'Wed Apr 01 16:17:13 +0000 2015', 'tweetURL': 'https://twitter.com/Roblox/status/583302104342638592', 'tweetID': '583302104342638592', 'conversationID': '583302104342638592', 'mediaURLs': ['https://v.cdn.vine.co/r/videos/20A1BE53011195086166081318912_3fe3b526b1a.1.5.3156516531034157495.mp4?versionId=DI1mMu7EI6zcLbvgucyp3GHebdz8.9cQ'], 'media_extended': [{'url': 'https://v.cdn.vine.co/r/videos/20A1BE53011195086166081318912_3fe3b526b1a.1.5.3156516531034157495.mp4?versionId=DI1mMu7EI6zcLbvgucyp3GHebdz8.9cQ', 'type': 'video', 'size': {'width': 435, 'height': 435}}], 'possibly_sensitive': False, 'hashtags': [], 'qrtURL': None, 'allSameType': True, 'hasMedia': True, 'combinedMediaUrl': None, 'pollData': {'options': []}, 'article': None, 'date_epoch': 1427905033}
|
testVinePlayerTweet_compare={'text': 'You wanted old ROBLOX back, you got it. Check out our sweet "new" look! #BringBackOldROBLOX https://vine.co/v/OL9VqvM6wJh', 'date': 'Wed Apr 01 16:17:13 +0000 2015', 'tweetURL': 'https://twitter.com/Roblox/status/583302104342638592', 'tweetID': '583302104342638592', 'conversationID': '583302104342638592', 'mediaURLs': ['https://v.cdn.vine.co/r/videos/20A1BE53011195086166081318912_3fe3b526b1a.1.5.3156516531034157495.mp4?versionId=DI1mMu7EI6zcLbvgucyp3GHebdz8.9cQ'], 'media_extended': [{'url': 'https://v.cdn.vine.co/r/videos/20A1BE53011195086166081318912_3fe3b526b1a.1.5.3156516531034157495.mp4?versionId=DI1mMu7EI6zcLbvgucyp3GHebdz8.9cQ', 'type': 'video', 'size': {'width': 435, 'height': 435}}], 'possibly_sensitive': False, 'hashtags': [], 'qrtURL': None, 'allSameType': True, 'hasMedia': True, 'combinedMediaUrl': None, 'pollData': {'options': []}, 'article': None, 'date_epoch': 1427905033}
|
||||||
|
|
||||||
testUser="https://twitter.com/jack"
|
testUser="https://twitter.com/jack"
|
||||||
|
testUserSuspended="https://twitter.com/twitter"
|
||||||
|
testUserPrivate="https://twitter.com/PrestigeIsKey"
|
||||||
|
testUserInvalid="https://twitter.com/.a"
|
||||||
testUserID=12 # could also be 170824883
|
testUserID=12 # could also be 170824883
|
||||||
testUserIDUrl = "https://twitter.com/i/user/"+str(testUserID)
|
testUserIDUrl = "https://twitter.com/i/user/"+str(testUserID)
|
||||||
testUserWeirdURLs=["https://twitter.com/jack?lang=en","https://twitter.com/jack/with_replies","https://twitter.com/jack/media","https://twitter.com/jack/likes","https://twitter.com/jack/with_replies?lang=en","https://twitter.com/jack/media?lang=en","https://twitter.com/jack/likes?lang=en","https://twitter.com/jack/"]
|
testUserWeirdURLs=["https://twitter.com/jack?lang=en","https://twitter.com/jack/with_replies","https://twitter.com/jack/media","https://twitter.com/jack/likes","https://twitter.com/jack/with_replies?lang=en","https://twitter.com/jack/media?lang=en","https://twitter.com/jack/likes?lang=en","https://twitter.com/jack/"]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user