FurryCoders / FAAPI

Python library to implement API-like functionality for the FurAffinity.net website.
European Union Public License 1.2
20 stars 6 forks source link

[Bug]: User name not matching #6

Closed Xraydylan closed 1 year ago

Xraydylan commented 1 year ago

Version

3.9.2

What happened?

I have encountered a strange bug.

A username is not properly returned by the api.

For the username "ashwolves5" a user object can be created with.

user = api.user("ashwolves5")

However, the returned user name from the user object is not matching. user.name returns only "shwolves5", which obviously causes and error when this name string is uses to creae another user object with the api.

How to reproduce the bug?

(As described)

Relevant log output

No response

Xraydylan commented 1 year ago

After a bit of digging I may have found the issue. In parser.py in the functing parse_user_page, after stripping most user names contain the character "~" (or "!", i don't know if there are different specialcharacters) as first letter. However, this user doesn't. So the operation name: str = u[1:] cuts off the first character.

Xraydylan commented 1 year ago

A similar bug occurs in parse_watchlist too.

MatteoCampinoti94 commented 1 year ago

Thank you for opening the issue!

The error occurs because apparently FA admins do not have a status character in front of their username (~, !, ∞, etc.). Unfortunately, the status character is contained in the same tag as the username (why they didn't use a child span or ::before with attr() is beyond me), so I'll have to add some code to detect admins specifically.

MatteoCampinoti94 commented 1 year ago

Release 3.9.3 is available :)

MatteoCampinoti94 commented 1 year ago

Aaaaand I forgot about the watchlists x3

Xraydylan commented 1 year ago

🤣

Well, I have been working on a little fix in my project as well. Although I have to do a little more than just correcting this but also repair my database if a user has been wrongly saved...

My idea revolves around getting the user name from the URL. Or rather at least the first character of the username. (Since some people have doule of tipple "-" at the start of their username. That gets relevant because I found a slingle "-" to be a status as well...)

So I am getting the URL from the content of the meta tag with property="og:url.

And I have noticed that for the watchlists there is alway a separating space between the status and the username. So I will also edit this in my solution.

Xraydylan commented 1 year ago

But anyways. I will test your solution for the problem and modify if neccessary.

If I find more issues or other bugs... Well, I will be coming again.

MatteoCampinoti94 commented 1 year ago

I like the property:url solution! You should submit a PR so we can integrate it with FAAPI :)

As for watchlists: my solution detects the admin logo, but you’re right, there is a space and it would work much better by simply parsing the link URL and then looking for the status separately.

Xraydylan commented 1 year ago

Oh! And just found another error XD User "marioea".

As I have mentioned they have "-" as status- This gets not detected as well.

user = api.user("marioea")

if user.name gets called it returns only "-marioea", which causes and error if used to create the user object again.

As I have mentioned simply removing any leading "-" would be problemantc since some usernames have "-" amd "--" included at the beginning.

Xraydylan commented 1 year ago

I will try to make a PR and try to make the code look nice 😅 I hope I am up to your standards.

MatteoCampinoti94 commented 1 year ago

I have checked "marioea" but there is no issue with them. The User object correctly parses their name as "marioea" and "-" as status.

api = faapi.FAAPI(cookies)
u = api.user("marioea")
print((u.name, u.status))  # ('marioea', '-')
Xraydylan commented 1 year ago

Hmm then I must have overlooked something there 🤔 But in any case that entire problme has been sovled.