twitch2tuner icon indicating copy to clipboard operation
twitch2tuner copied to clipboard

Issue when getting followed channels

Open Kperroch opened this issue 2 years ago • 23 comments

image

I have those issues when the server launch. All the parameters seems to be fine as it can find user object. Any Idea of how to solve ?

Kperroch avatar Feb 24 '23 14:02 Kperroch

Hey @Kperroch, I just retested and verified that, with a good Client ID and Client Secret, the API still behaves properly.

I see these suggestions from the Twitch API library.

image

Could the problem be number 3? These are often the same, but not always. The actual ID should be in the URL of your page.

EDIT: Actually, this part seems to indicate that the user lookup was successful, but that the user doesn't follow any channels. Is that true?

image

micahmo avatar Feb 24 '23 15:02 micahmo

Is the issue the account follow more than 10 other channels and as if the Client ID was incorrect the Api couldn't bi able to retrieve the user

EDIT : I think the log display 0 channel because of the issue above where it is saying : "The resource you tried to access was not valid"

Kperroch avatar Feb 24 '23 15:02 Kperroch

I think the log display 0 channel because of the issue above

Hmm, you may be right. It's hard to tell because every call goes through UseTwitchApi.

I just pushed a new version with a tiny bit of extra logging to see exactly which API call is failing. Can you try it?

micahmo avatar Feb 24 '23 16:02 micahmo

Just updated with latest version still the same issue no more logs image

Kperroch avatar Feb 24 '23 18:02 Kperroch

Thank you! I do see the thing I added which is the method being invoked. In both cases, it's RetrieveChannels that's failing. But that's not as helpful as I was hoping. I did add a tiny bit more logging and published a new image, if you want to try again, but I'm not sure it'll help.

It's not clear to me what's going on here, as this works for me and others. Is the username that you put in TWITCH_USERNAME the same as the one under which you created the Client Secret and ID?

Any chance you'd want to DM me your username for me to try on my system? If not I totally understand.

Sorry about this!

micahmo avatar Feb 24 '23 18:02 micahmo

Just sent you an email

Kperroch avatar Feb 24 '23 20:02 Kperroch

Hey there! It seems like I have exactly the same issue.

styler2go avatar Feb 24 '23 20:02 styler2go

 21:14:42.637 INF >> [UseTwitchApi] Attempting to retrieve new access token using client credentials flow.
 21:14:44.111 INF >> [RetrieveAccessToken] Successfully got new access token and was able to retrieve user { user data here}.
 21:14:44.546 INF >> [RetrieveChannels] Found that user xyz follows 0 channels:
 21:14:44.546 WRN >> [UpdateChannels] Got empty response when querying user follows
 21:14:44.546 ERR >> [TwitchApiManager] Encountered an error invoking method GetUsersFollowsAsync on the Twitch API: TwitchLib.Api.Core.Exceptions.BadResourceException: The resource you tried to access was not valid.
   at TwitchLib.Api.Core.HttpCallHandlers.TwitchHttpClient.HandleWebException(HttpResponseMessage errorResp)
   at TwitchLib.Api.Core.HttpCallHandlers.TwitchHttpClient.GeneralRequest(String url, String method, String payload, ApiVersion api, String clientId, String accessToken)
   at TwitchLib.Api.Core.ApiBase.<>c__DisplayClass16_0`1.<TwitchGetGenericAsync>b__1()
   at System.Threading.Tasks.Task`1.InnerInvoke()
   at System.Threading.Tasks.Task.<>c.<.cctor>b__277_0(Object obj)
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
   at TwitchLib.Api.Core.ApiBase.<>c__DisplayClass16_0`1.<<TwitchGetGenericAsync>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at twitch2tuner.TwitchApiManager.UseTwitchApi[T](Func`2 action, String method, Boolean tryRefreshToken) in /src/twitch2tuner/TwitchApiManager.cs:line 46
 21:14:44.737 WRN >> [UpdateChannels] Trying to update channels' statuses, but no channels were found.
 21:14:44.743 INF >> [StartServer] Starting server on http://+:22708
 21:14:44.735 ERR >> [TwitchApiManager] Encountered an error invoking method GetUsersAsync on the Twitch API: TwitchLib.Api.Core.Exceptions.BadRequestException: Your request failed because either:
 1. Your ClientID was invalid/not set.
 2. Your refresh token was invalid.
 3. You requested a username when the server was expecting a user ID.
   at TwitchLib.Api.Core.HttpCallHandlers.TwitchHttpClient.HandleWebException(HttpResponseMessage errorResp)
   at TwitchLib.Api.Core.HttpCallHandlers.TwitchHttpClient.GeneralRequest(String url, String method, String payload, ApiVersion api, String clientId, String accessToken)
   at TwitchLib.Api.Core.ApiBase.<>c__DisplayClass16_0`1.<TwitchGetGenericAsync>b__1()
   at System.Threading.Tasks.Task`1.InnerInvoke()
   at System.Threading.Tasks.Task.<>c.<.cctor>b__277_0(Object obj)
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
   at TwitchLib.Api.Core.ApiBase.<>c__DisplayClass16_0`1.<<TwitchGetGenericAsync>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at twitch2tuner.TwitchApiManager.UseTwitchApi[T](Func`2 action, String method, Boolean tryRefreshToken) in /src/twitch2tuner/TwitchApiManager.cs:line 46
 21:14:44.755 INF >> [WebServer] Running HTTPListener: Unosquare HTTP Listener
 21:14:44.757 INF >> [WebServer] Web server prefix 'http://+:22708/' added.
 21:14:44.818 INF >> [WebServer] Started HTTP Listener
 21:14:44.826 INF >> [StartServer] Server is started and ready to receive connections.

styler2go avatar Feb 24 '23 21:02 styler2go

Just sent you an email

@Kperroch Thanks! With your username, I was able to discover a different bug. (When converting Follows to Users, I was hitting a limit of 100 per request).

However your and @styler2go's problem is clearly before that, when first looking up the Follows, which works fine for me.

Would either of you be willing to run direct Twitch API commands? These work on PowerShell for Windows (I can write them for bash if needed).

First, use your Client ID and Client Secret to retrieve an AccessToken.

(iwr -method post "https://id.twitch.tv/oauth2/token?client_id=YOURCLIENTID&client_secret=YOURCLIENTSECRET&grant_type=client_credentials&scope=user:read:subscriptions").Content

You should get a response like this.

{"access_token":"YOURACCESSTOKEN","expires_in":5203151,"scope":["user:read:subscriptions"],"token_type":"bearer"}

Then make a request like this to get your user's ID.

(iwr -method get https://api.twitch.tv/helix/users?login=YOURUSERNAME -header @{"client-id" = "YOURCLIENTID"; "Authorization" = "Bearer YOURACCESSTOKEN" }).Content

Finally, using the id from that output, make a request to get your follows.

(iwr -method get https://api.twitch.tv/helix/users/follows?from_id=YOURID -header @{"client-id" = "YOURCLIENTID"; "Authorization" = "Bearer YOURACCESSTOKEN" }).Content

That would help me understand if this is a problem with Twitch's API or my application. Thanks!

micahmo avatar Feb 24 '23 21:02 micahmo

Response from this, after a while, is:

Invoke-WebRequest: {"error":"Not Found","status":404,"message":""}

Seems like the API is not working?

styler2go avatar Feb 24 '23 21:02 styler2go

Response from this

Which command was that the response to? The first one?

micahmo avatar Feb 24 '23 22:02 micahmo

Oh sorry it's the last one. Every other request ran through quickly and successfully

styler2go avatar Feb 24 '23 22:02 styler2go

@micahmo Did you make a change regarding the issue of the limit of 100 ? :)

Kperroch avatar Feb 24 '23 22:02 Kperroch

Oh sorry it's the last one. Every other request ran through quickly and successfully

@styler2go Wow, very interesting! Seems like it's related to the Twitch API and/or the application you created in their dev console. But there aren't really a lot of options. Maybe there's a new restriction which old apps are not subject to. I could try making a new one myself.

Did you make a change regarding the issue of the limit of 100 ? :)

@Kperroch Yes, it is in the latest image now. But I don't think it will help this issue.

micahmo avatar Feb 24 '23 22:02 micahmo

Oh sorry it's the last one. Every other request ran through quickly and successfully

@styler2go Wow, very interesting! Seems like it's related to the Twitch API and/or the application you created in their dev console. But there aren't really a lot of options. Maybe there's a new restriction which old apps are not subject to. I could try making a new one myself.

I used a very old application from my Dev console. Should I try creating a new one?

Top one: Screenshot_2023-02-24-23-17-13-37_f9ee0578fe1cc94de7482bd41accb329

styler2go avatar Feb 24 '23 22:02 styler2go

Something weird is going on. My application is from 2021 and works fine. But I just made a new one, and it returns the same 404 as yours.

micahmo avatar Feb 24 '23 22:02 micahmo

Well dang, I just found this note in the Twitch documentation.

This endpoint is deprecated and will be decommissioned on August 3, 2023. Access to this endpoint is limited to client IDs that have called the endpoint on or before February 17, 2023.

https://dev.twitch.tv/docs/api/reference/#get-users-follows

I will have to work up an alternative! Sorry about that to you both!

micahmo avatar Feb 24 '23 22:02 micahmo

I've just ran through some code and it seems like the twitchlib api will need an update to support this new endpoint:

https://dev.twitch.tv/docs/api/reference/#get-followed-channels

(I'll assume you already know that as you are faster in your own code 😄)

styler2go avatar Feb 24 '23 23:02 styler2go

I submitted an issue on TwitchLib, and they already responded.

https://github.com/TwitchLib/TwitchLib/issues/1112

Even without TwitchLib, I could make a direct HTTP call. The problem is that this data (followers) is being moved behind user-specific authorization. Having a Client Secret and Client ID isn't enough. You'll need to authorize your instance of twitch2tuner to make API calls on your user's behalf. This is actually how I had written twitch2tuner to work back in the day, but then I realized at the time all the data I needed was public, so I just had to authenticate as an app. I'm afraid it might have to go back.

Another possibility is letting you specify the desired channels via configuration (env var). It's obviously not nearly as convenient as detecting everyone you follow, but it doesn't require any API changes.

micahmo avatar Feb 25 '23 04:02 micahmo

I also run in this issue, if i could help tell me 👍 Is there any app/script/docker image to get only twitch xml epg ? I'm looking for this now since some years, and not able to find something working at this moment, it was for emby but emby accept m3u :) but i run liveproxy to restream to my emby but the thing missing here is epg :( .

Do you have any idea @micahmo how i can get xml epg from twitch a script/docker/app, i have some tools to make a matching of channels = epg id / channels name, but i don't know a tool for the scraping / getting info over api .

CyberPoison avatar Feb 26 '23 16:02 CyberPoison

Hi all, I've published a new version which utilizes the new Twitch API endpoint. It's a bit more complicated to set up as it requires a user authentication. You can alternatively specify the channels you want via an env var. I've updated with README with instructions. Let me know if it works.

@CyberPoison Try the new version. It generate an EPG at the /epg.xml endpoint.

micahmo avatar Feb 26 '23 17:02 micahmo

Thanks,

I have tested and it works but it only gets 20 Followed Channels, perhaps i have some like 120 Channels followed, is there something i missed ?

CyberPoison avatar Feb 26 '23 18:02 CyberPoison

@CyberPoison, sorry about that! I failed to account for pagination in the new request. Can you try the latest?

micahmo avatar Feb 26 '23 20:02 micahmo