DevilXD / TwitchDropsMiner

An app that allows you to AFK mine timed Twitch drops, with automatic drop claiming and channel switching.
MIT License
1.67k stars 162 forks source link

No mining progress is being made #462

Closed 204065248 closed 4 months ago

204065248 commented 5 months ago

I want to drop treasure in Arena Breakout game, but it doesn't work properly

Jniklas2 commented 5 months ago

it doesn't work properly

Isn't helpful. And for me it works really good (only problem is the vm itself, but that isn't caused by this tool)

Luckz commented 5 months ago

EDIT

There is a working fork: https://github.com/Windows200000/TwitchDropsMiner-updated

Migration instructions below: https://github.com/DevilXD/TwitchDropsMiner/issues/462#issuecomment-2145800594


For me there was no progress counted for Party Animals (ended now), and there is none for Halo Infinite. GUI shows progress as if it was working: image

Whereas https://www.twitch.tv/drops/inventory shows nada.

maistaTV commented 5 months ago

Same. Miner is showing progress while my inventory is not.

image

image Progress was made due to watching for real.

Taktich commented 5 months ago

Having the same problem. Something must have changed on Twitch's side?

gibbed commented 5 months ago

Same issue here, there's been no progress at all today through the miner but progress does happen when watching normally. Had assumed it was related to #301 but I guess this is a more widespread issue.

coodrag commented 5 months ago

It is twitch problem, not software problem. Simulated watching is not accepted by twitch now.

204065248 commented 5 months ago

Is there no way to solve it?

stripedew commented 5 months ago

+1 to this issue, been happening for a few days now actually. Not only did the app not count towards any drops, it also somehow messed with the drops inventory and now real viewing doesn't seem to register accurately. Works fine with a different account on the same device, so I'm guessing Twitch have added some server-side checks that prohibit drops on flagged accounts.

Valentin-Metz commented 5 months ago

This is a real issue and not related to accounts. The miner does currently not contribute to drop progress (watching normally on the same account still does).

2024-05-10 12:41:57: Progress: 55/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:41:57: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 55/240)
2024-05-10 12:42:57: CALL: No drop update from the websocket received
2024-05-10 12:42:57: Progress: 56/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:42:57: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 56/240)
2024-05-10 12:43:02: CALL: militantmeat33 stays OFFLINE
2024-05-10 12:43:35: CALL: kettletoro stays OFFLINE
2024-05-10 12:43:43: CALL: Channel update from websocket: MrPokke
2024-05-10 12:43:56: CALL: No drop update from the websocket received
2024-05-10 12:43:56: Progress: 57/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:43:56: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 57/240)
2024-05-10 12:44:56: CALL: No drop update from the websocket received
2024-05-10 12:44:56: Progress: 58/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:44:56: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 58/240)
2024-05-10 12:45:43: INFO: MrPokke status has been updated (🎁: ❌ -> ❌)
2024-05-10 12:45:56: CALL: No drop update from the websocket received
2024-05-10 12:45:56: Progress: 59/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:45:56: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 59/240)
2024-05-10 12:46:48: Earned points for watching:  10, total: 180
2024-05-10 12:46:56: CALL: No drop update from the websocket received
2024-05-10 12:46:56: Progress: 60/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:46:56: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 60/240)
2024-05-10 12:47:55: CALL: No drop update from the websocket received
2024-05-10 12:47:55: Progress: 61/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:47:55: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 61/240)
2024-05-10 12:47:59: CALL: Maintenance task requests a reload
2024-05-10 12:48:02: INFO: Ryvandal goes OFFLINE
2024-05-10 12:48:03: CALL: Channel update from websocket: Ryvandal
2024-05-10 12:48:05: CALL: Maintenance task waiting until: 13:18:05 (Points)
2024-05-10 12:48:05: INFO: Websocket[5] stopped.
2024-05-10 12:48:05: INFO: Websocket[4] stopped.
2024-05-10 12:48:05: INFO: Websocket[3] stopped.
2024-05-10 12:48:05: INFO: Websocket[2] stopped.
2024-05-10 12:48:05: INFO: Websocket[1] stopped.
2024-05-10 12:48:07: INFO: Websocket[1] connecting...
2024-05-10 12:48:07: INFO: Websocket[2] connecting...
2024-05-10 12:48:07: INFO: Websocket[3] connecting...
2024-05-10 12:48:07: INFO: Websocket[4] connecting...
2024-05-10 12:48:07: INFO: Websocket[5] connecting...
2024-05-10 12:48:08: INFO: Websocket[5] connected.
2024-05-10 12:48:08: INFO: Websocket[2] connected.
2024-05-10 12:48:08: INFO: Websocket[3] connected.
2024-05-10 12:48:08: INFO: Websocket[1] connected.
2024-05-10 12:48:08: INFO: Websocket[4] connected.
2024-05-10 12:48:16: CALL: No drop update from the websocket received
2024-05-10 12:48:16: Progress: 1/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:48:16: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 1/240)
2024-05-10 12:49:16: CALL: No drop update from the websocket received
2024-05-10 12:49:16: Progress: 2/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:49:16: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 2/240)
2024-05-10 12:50:15: CALL: No drop update from the websocket received
2024-05-10 12:50:15: Progress: 3/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:50:15: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 3/240)
2024-05-10 12:50:38: CALL: Channel update from websocket: bhobbsie, game changed: Marbles on Stream -> Magic: The Gathering
2024-05-10 12:51:15: CALL: No drop update from the websocket received
2024-05-10 12:51:15: Progress: 4/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:51:15: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 4/240)
2024-05-10 12:52:09: Earned points for watching:  10, total: 190
2024-05-10 12:52:15: CALL: No drop update from the websocket received
2024-05-10 12:52:15: Progress: 5/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:52:15: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 5/240)
2024-05-10 12:52:38: INFO: bhobbsie status has been updated (🎁: ✔ -> ❌)
2024-05-10 12:53:15: CALL: No drop update from the websocket received
2024-05-10 12:53:15: Progress: 6/240 - Campaign(Rise Online, ROW - Twitch Drop 31, 0/1)
2024-05-10 12:53:15: CALL: Drop progress from active search: ROW - Twitch Drop 31 (Rise Online, 6/240)
2024-05-10 12:53:17: INFO: qcrixus_ goes OFFLINE
iceynano commented 5 months ago

+1. The server may count by requesting frequency of ts files?

woctezuma commented 5 months ago

Same issue.

notNSANE commented 5 months ago

It is twitch problem, not software problem. Simulated watching is not accepted by twitch now.

Source?

As commented before, it seems Twitch might have flagged accounts. I'm getting 1-2% progress for 1 hour of real watching, which makes drops basically impossible - that is, having a channel open, with sound. Emoting just in case, too. I've been having this issue since months ago, though. TDW fixed that.

Windows200000 commented 5 months ago

I have also not been getting progress towards any drops in the past days

notNSANE commented 5 months ago

for reference, I just started real watching for drops on another account (and browser) and it started progressing normally. Dang, now I need to move all the twitch connections I made to another account -_-

Windows200000 commented 5 months ago

for reference, I just started real watching for drops on another account (and browser) and it started progressing normally. Dang, now I need to move all the twitch connections I made to another account -_-

My manual progress seems to be fine, tho, are you sure you closed TDM before trying to manually watch?

kumoshiraori commented 5 months ago

Same. Miner is showing progress while my inventory is not.

image

image Progress was made due to watching for real.

+1 same problem for me

Majaura commented 5 months ago

I think I'm also having this issue, and like NotNSANE said, I'm not even able to earn them by regularly watching...

woctezuma commented 5 months ago

I think I'm also having this issue, and like NotNSANE said, I'm not even able to earn them by regularly watching...

You need to watch LIVE streams. I know, it can be surprising if you have not followed the news about Twitch Drops! 😄

I have tried this stream for Hellcard:

And it works for me:

Picture

notNSANE commented 5 months ago

Of course we are watching live streams... I am using twitch drops since they were released.

On Sun, 12 May 2024, 04:59 Wok, @.***> wrote:

I think I'm also having this issue, and like NotNSANE said, I'm not even able to earn them by regularly watching...

You need to watch LIVE streams. I know, it can be surprising if you have not followed the news about Twitch Drops! 😄

— Reply to this email directly, view it on GitHub https://github.com/DevilXD/TwitchDropsMiner/issues/462#issuecomment-2106156859, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABWUUB2PVUMELCUADOZEDUDZB4ONLAVCNFSM6AAAAABHOYZU2KVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMBWGE2TMOBVHE . You are receiving this because you are subscribed to this thread.Message ID: @.***>

Majaura commented 5 months ago

Yeah, I don't understand what you mean about "have to watch live streams"...the hell do you think we're watching? Netflix streams? Also I'm wrong about not being able to earn drops regularly, I can still do it...but yeah as it stands, I think the program isn't currently working as of maybe 3 days ago. I hope that helps. I'm doing everything the same way as always, and updated to the newest build as well.

Windows200000 commented 5 months ago

Yeah, I don't understand what you mean about "have to watch live streams"...the hell do you think we're watching? Netflix streams?

When you go to an offline channel, twitch starts automatically playing a past stream, if fully recorded. I assume that. Tho I don't know, having TDM open while trying to manually watch might also cause issues.

Can we please keep the conversation civil without insulting each other? This is GitHub, not a TikTok comment section.

woctezuma commented 5 months ago

I am using twitch drops since they were released.

That is what I imagined. As far as I can tell, there has been changes this year. See this tweet in January: https://twitter.com/TwitchSupport/status/1748075440562954551

So if you have been using Twitch Drops since they were released, and then switched at some point to the Miner script without visiting Twitch ever again, then you might not know about these recent changes.

Anyway, as mentioned by @Windows200000, the issue is likely to come from the fact that you had the Miner script running in the background while you were watching the streams.

Yeah, I don't understand what you mean about "have to watch live streams"...the hell do you think we're watching? Netflix streams? Also I'm wrong about not being able to earn drops regularly, I can still do it.

I am glad that you could solve your previous issue with getting drops by watching streams without using the script.

I think the program isn't currently working as of maybe 3 days ago. I hope that helps. I'm doing everything the same way as always, and updated to the newest build as well.

This is a known issue, as reported 3 days ago indeed, and the Miner script has not been updated in the past 2 weeks, so this bug is due to a change on Twitch's side, and possibly related to the aforementioned changes in Twitch's policy against "abusing Drops campaigns". As you can see here, it affects at least another similar script as well: https://github.com/rdavydov/Twitch-Channel-Points-Miner-v2/issues/522

In the meantime, until the Miner script is updated (or worse, that we get more info from Twitch that they would be less lenient with accounts using such scripts), I would stick to watching streams for drops.

notNSANE commented 5 months ago

have you ever read the tweet? those changes are for STREAMERS, not viewers, since they were streaming static images or rebroadcasts. And that has NOTHING to do with Twitch Drops Miner.

Regardless, TDM always picks up the streamer with most views, which is a partner streamer in most cases and never streams rebroadcasts.

On Sun, 12 May 2024, 06:17 Wok, @.***> wrote:

I am using twitch drops since they were released.

That is exactly what I imagined. As far as I can tell, there has been changes this year. See: https://twitter.com/TwitchSupport/status/1748075440562954551

So if you have been using Twitch Drops since they were released, and then switched at some point to the Miner script without visiting Twitch ever again, then you might not know about these recent changes.

Yeah, I don't understand what you mean about "have to watch live streams"...the hell do you think we're watching? Netflix streams? Also I'm wrong about not being able to earn drops regularly, I can still do it.

I am glad that you could solve your previous issue with getting drops by watching streams without using the script. I imagine this is totally coincidental. 😆

— Reply to this email directly, view it on GitHub https://github.com/DevilXD/TwitchDropsMiner/issues/462#issuecomment-2106180052, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABWUUB3P77T54SQJV3JNDXDZB4XQ7AVCNFSM6AAAAABHOYZU2KVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMBWGE4DAMBVGI . You are receiving this because you are subscribed to this thread.Message ID: @.***>

woctezuma commented 5 months ago

have you ever read the tweet? those changes are for STREAMERS, not viewers, since they were streaming static images or rebroadcasts.

Well, that has to do with viewers, because rebroadcasts do not work anymore.


And that has NOTHING to do with Twitch Drops Miner.

Exactly. That was a reply to the user who could not get drops the regular way.

I'm not even able to earn them by regularly watching...

Fortunately, the same user then managed to fix their issue with regular streams, though they don't mention how.

Also I'm wrong about not being able to earn drops regularly, I can still do it.

Anyway, now that the topic about accounts being unable to get Twitch Drops the regular way has been debunked, we can close this off-topic talk. The solution to this issue will remain a mystery. 🤣 It could be closing the Miner script, or... watching live streams.

FomaDima commented 5 months ago

Have you tried to contact the authors of this project or a neighboring one? Were there any comments from them? or with those who understand programming?

if everything is that bad. Then let's think about what to replace it with. and how to use it...

For my support, I was offered to fix a bug in the drop progression. But I use this purely for myself and can’t check it, sorry (I don’t have any extra money at the moment) Well, since they offered to fix it, it means there is a solution... Or they want to deceive me, I don’t know. (sorry, a translator was used)

GoesInCircles commented 5 months ago

if everything is that bad. Then let's think about what to replace it with. and how to use it...

I fallback to my previous solution: automatic twitch drops addon and keeping tab open on background, muted@160p

Windows200000 commented 5 months ago

Have you tried to contact the authors of this project or a neighboring one? Were there any comments from them? or with those who understand programming?

if everything is that bad. Then let's think about what to replace it with. and how to use it...

For my support, I was offered to fix a bug in the drop progression. But I use this purely for myself and can’t check it, sorry (I don’t have any extra money at the moment) Well, since they offered to fix it, it means there is a solution... Or they want to deceive me, I don’t know. (sorry, a translator was used)

Is there anything suggesting "it's bad"? Apart for some unfounded speculation, all we know is twitch changed something which broke this bot. That is not anything uncommon for 3rd party access to APIs in general, nor TDM specifically. I could try and look into it, but by the time I'd learn the twitch API etc. someone already familiar will probably look at it and find a solution.

Windows200000 commented 5 months ago

Well, i couldn't leave it alone. The request now looks like this:

event: 'minute-watched', 
    properties: {
      app_session_id: '<REDACTED>',
      app_version: '<REDACTED>',
      batch_time: 1715542327,
      client_time: 1715542326.626,
      device_id: '<REDACTED>',
      domain: 'www.twitch.tv',
      host: 'www.twitch.tv',
      platform: 'web',
      preferred_language: 'en-US',
      referrer_host: 'www.google.com',
      referrer_url: 'https://www.google.com/',
      received_language: 'en',
      tab_session_id: '<REDACTED>',
      url: 'https://www.twitch.tv/firewall154?referrer=raid',
      benchmark_server_id: '<REDACTED>',
      bornuser: false,
      browser: '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
      browser_family: 'chrome',
      browser_version: '124.0',
      collapse_right: false,
      collapse_left: true,
      localstorage_device_id: '<REDACTED>',
      location: 'channel',
      page_session_id: '<REDACTED>',
      referrer: 'https://www.google.com/',
      referrer_domain: 'www.google.com',
      session_device_id: '<REDACTED>',
      theme: 'dark',
      viewport_height: 1064,
      viewport_width: 1831,
      channel: 'firewall154',
      channel_id: '183249570',
      is_following: false,
      is_live: true,
      language: 'en',
      game: 'Rocket League',
      category_id: '30921',
      audio_codec: 'mp4a.40.2',
      average_bitrate: 6426550,
      backend: 'mediaplayer',
      broadcast_id: '<REDACTED>',
      buffer_empty_count: 2,
      buffered_position: 8482.042678,
      build_dist_id: 'npm',
      catch_up_mode: 'speedup',
      cluster: 'ams02',
      core_version: '1.28.0-rc.2',
      current_bitrate: 6907235,
      current_fps: 57,
      decoded_frames: 3607,
      dropped_frames: 2,
      estimated_bandwidth: 961132590,
      gap_skip_count: 0,
      gap_skip_duration: 0,
      hidden: false,
      hls_latency_broadcaster: 5324,
      hls_latency_ingest: 5398,
      initial_buffer_duration: 1000,
      live: true,
      low_latency: true,
      manifest_cluster: 'fra05',
      manifest_node: 'video-weaver.fra05',
      manifest_node_type: 'weaver_cluster',
      mcaps_powerefficient: true,
      mcaps_smooth: true,
      mcaps_supported: true,
      minutes_logged: 142,
      mobile_connection_type: 'unknown',
      muted: false,
      node: 'video-edge-d55360.ams02',
      origin_dc: 'iad06',
      os_name: 'Windows',
      os_version: 'NT 10.0',
      play_session_id: '<REDACTED>',
      playback_rate: 1,
      player: 'site',
      player_position: 8477.335095,
      player_state: 'Playing',
      protocol: 'HLS',
      quality: '900p60 (source)',
      rendered_frames: 3605,
      seconds_offset: 19.921824,
      serving_id: '<REDACTED>',
      sink_buffer_size: 4.6649041175842285,
      sink_type: 'mse-worker',
      stream_format: 'chunked',
      time: 1715542326.625,
      transcode_mode: 'cbr_v1',
      transcoder_type: '2023-Transcode-QS-V1',
      transport_download_bytes: 48190604,
      transport_download_duration: 57075,
      transport_first_byte_latency: 1793,
      transport_segment_duration: 59982,
      transport_segments: 30,
      user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
      vid_display_height: 191,
      vid_display_width: 340,
      vid_height: 900,
      vid_width: 1600,
      video_buffer_size: 4.707583,
      video_codec: 'avc1.64002A',
      video_decoder_name: 'MediaSource',
      video_session_id: '<REDACTED>',
      volume: 0.67,
      battery_percent: 1,
      gpu_supported: false,
      gpu_unsupported_reason: 'WebGPU adapter unavailable',
      gpu_architecture: '',
      gpu_description: '',
      gpu_device: '',
      gpu_vendor: '',
      is_pbyp: false,
      guest_star_session_id: null,
      guests_pushed_to_obs: null,
      squad_stream_id: null,
      squad_stream_session_id: null,
      squad_stream_presentation_id: null,
      is_mod: false,
      time_spent_hidden: 2040949,
      consent_comscore_ok: false,
      content_classification_label_set: '[]',
      app_fullscreen: false,
      autoplayed: true,
      backend_version: '1.28.0-rc.2',
      broadcaster_software: 'unknown_rtmp',
      chat_visible: true,
      chat_visibility_status: 'visible',
      content_mode: 'live',
      game_id: '30921',
      host_channel: null,
      host_channel_id: null,
      is_ad_playing: false,
      logged_in: true,
      login: '<REDACTED>',
      mse_support: true,
      partner: true,
      playback_gated: false,
      player_size_mode: 'default',
      staff: false,
      subscriber: false,
      turbo: false,
      user_id: <REDACTED>,
      viewer_exemption_reason: null,
      benchmark_session_id: '<REDACTED>',
      client_build_id: '<REDACTED>',
      distinct_id: '<REDACTED>',
      client_app: 'twilight'
    }
  }

That is a lot more, than TDM sends:

"event": "minute-watched",
                "properties": {
                    "broadcast_id": str(self._stream.broadcast_id),
                    "channel_id": str(self.id),
                    "channel": self._login,
                    "hidden": False,
                    "live": True,
                    "location": "channel",
                    "logged_in": True,
                    "muted": False,
                    "player": "site",
                    "user_id": self._twitch._auth_state.user_id,
                }

The TDM version still returns 204, but it does so even with wrong parameters, which is probably why TDM doesn't detect it when stuff breaks, which also makes the response kinda useless. All the parameters still have the same name.

In chrome debug, the two look like this. TDM: "Request Payload" {"data":"Random_letters_redacted"}

Native: "Form data" data=Random_letters_redacted

Perhaps the most obvious difference is, that TDM sends a JSON, while the site now sends the data as an HTML form. (At least that's what I recognize it as, how it's called doesn't really matter.) Now this still could be a thing that might work, depending on how TDM does the whole thing and what twitch supports etc. Would be nice to get a quick reply from @DevilXD or some other contributors. I now have to go to sleep and will try if changing the format works tomorrow, if I find the time.

DevilXD commented 5 months ago

Hello. Kinda late to this, but I'll try to fix this as soon as I'm able to. Which may take a few days, given I have limited access to a PC now.

That is a lot more, than TDM sends:

TDM has always sent only as much as it was needed to progress drops. If this is not enough now, then the payload should be expanded to include what's needed. Still, most of this information was never needed to keep progressing everything.

Regarding different payload formats, it's kinda been a while ever since I had to touch anything there, so my memory is hazy. I'll need to look into the code to determine if HTML form vs JSON makes any difference. You did the most tedious part though - figuring out the current payload contents. This should speed up designing a new payload that works (assuming it's still possible).

Windows200000 commented 5 months ago

I'll leave it then. Thanks

Hello. Kinda late to this, but I'll try to fix this as soon as I'm able to. Which may take a few days, given I have limited access to a PC now.

I'll leave you to it then. Payload encoding itself is the same. I'll leave the difference between the chrome "copy as fetch" functions here as well, if that becomes useful. Take your time, and thanks for working on this. <3 Site:

"body": "data=Random_letters_redacted",
  "method": "POST"

Current TDM:

"body": "{\"data\":\"Random_letters_redacted\"}",
  "method": "POST"
DevilXD commented 5 months ago

The data parameter to aiohttp's request method automatically converts the passed in dictionary, into an HTML form, per the documentation: https://docs.aiohttp.org/en/stable/client_reference.html#aiohttp.ClientSession.request

JSON is only used to pack up the payload.

RageCarry commented 5 months ago

Well, i couldn't leave it alone. The request now looks like this:

event: 'minute-watched', 
    properties: {
      app_session_id: '<REDACTED>',
      app_version: '<REDACTED>',
      batch_time: 1715542327,
      client_time: 1715542326.626,
      device_id: '<REDACTED>',
      domain: 'www.twitch.tv',
      host: 'www.twitch.tv',
      platform: 'web',
      preferred_language: 'en-US',
      referrer_host: 'www.google.com',
      referrer_url: 'https://www.google.com/',
      received_language: 'en',
      tab_session_id: '<REDACTED>',
      url: 'https://www.twitch.tv/firewall154?referrer=raid',
      benchmark_server_id: '<REDACTED>',
      bornuser: false,
      browser: '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
      browser_family: 'chrome',
      browser_version: '124.0',
      collapse_right: false,
      collapse_left: true,
      localstorage_device_id: '<REDACTED>',
      location: 'channel',
      page_session_id: '<REDACTED>',
      referrer: 'https://www.google.com/',
      referrer_domain: 'www.google.com',
      session_device_id: '<REDACTED>',
      theme: 'dark',
      viewport_height: 1064,
      viewport_width: 1831,
      channel: 'firewall154',
      channel_id: '183249570',
      is_following: false,
      is_live: true,
      language: 'en',
      game: 'Rocket League',
      category_id: '30921',
      audio_codec: 'mp4a.40.2',
      average_bitrate: 6426550,
      backend: 'mediaplayer',
      broadcast_id: '<REDACTED>',
      buffer_empty_count: 2,
      buffered_position: 8482.042678,
      build_dist_id: 'npm',
      catch_up_mode: 'speedup',
      cluster: 'ams02',
      core_version: '1.28.0-rc.2',
      current_bitrate: 6907235,
      current_fps: 57,
      decoded_frames: 3607,
      dropped_frames: 2,
      estimated_bandwidth: 961132590,
      gap_skip_count: 0,
      gap_skip_duration: 0,
      hidden: false,
      hls_latency_broadcaster: 5324,
      hls_latency_ingest: 5398,
      initial_buffer_duration: 1000,
      live: true,
      low_latency: true,
      manifest_cluster: 'fra05',
      manifest_node: 'video-weaver.fra05',
      manifest_node_type: 'weaver_cluster',
      mcaps_powerefficient: true,
      mcaps_smooth: true,
      mcaps_supported: true,
      minutes_logged: 142,
      mobile_connection_type: 'unknown',
      muted: false,
      node: 'video-edge-d55360.ams02',
      origin_dc: 'iad06',
      os_name: 'Windows',
      os_version: 'NT 10.0',
      play_session_id: '<REDACTED>',
      playback_rate: 1,
      player: 'site',
      player_position: 8477.335095,
      player_state: 'Playing',
      protocol: 'HLS',
      quality: '900p60 (source)',
      rendered_frames: 3605,
      seconds_offset: 19.921824,
      serving_id: '<REDACTED>',
      sink_buffer_size: 4.6649041175842285,
      sink_type: 'mse-worker',
      stream_format: 'chunked',
      time: 1715542326.625,
      transcode_mode: 'cbr_v1',
      transcoder_type: '2023-Transcode-QS-V1',
      transport_download_bytes: 48190604,
      transport_download_duration: 57075,
      transport_first_byte_latency: 1793,
      transport_segment_duration: 59982,
      transport_segments: 30,
      user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
      vid_display_height: 191,
      vid_display_width: 340,
      vid_height: 900,
      vid_width: 1600,
      video_buffer_size: 4.707583,
      video_codec: 'avc1.64002A',
      video_decoder_name: 'MediaSource',
      video_session_id: '<REDACTED>',
      volume: 0.67,
      battery_percent: 1,
      gpu_supported: false,
      gpu_unsupported_reason: 'WebGPU adapter unavailable',
      gpu_architecture: '',
      gpu_description: '',
      gpu_device: '',
      gpu_vendor: '',
      is_pbyp: false,
      guest_star_session_id: null,
      guests_pushed_to_obs: null,
      squad_stream_id: null,
      squad_stream_session_id: null,
      squad_stream_presentation_id: null,
      is_mod: false,
      time_spent_hidden: 2040949,
      consent_comscore_ok: false,
      content_classification_label_set: '[]',
      app_fullscreen: false,
      autoplayed: true,
      backend_version: '1.28.0-rc.2',
      broadcaster_software: 'unknown_rtmp',
      chat_visible: true,
      chat_visibility_status: 'visible',
      content_mode: 'live',
      game_id: '30921',
      host_channel: null,
      host_channel_id: null,
      is_ad_playing: false,
      logged_in: true,
      login: '<REDACTED>',
      mse_support: true,
      partner: true,
      playback_gated: false,
      player_size_mode: 'default',
      staff: false,
      subscriber: false,
      turbo: false,
      user_id: <REDACTED>,
      viewer_exemption_reason: null,
      benchmark_session_id: '<REDACTED>',
      client_build_id: '<REDACTED>',
      distinct_id: '<REDACTED>',
      client_app: 'twilight'
  }
  }

That is a lot more, than TDM sends:

"event": "minute-watched",
                "properties": {
                    "broadcast_id": str(self._stream.broadcast_id),
                    "channel_id": str(self.id),
                    "channel": self._login,
                    "hidden": False,
                    "live": True,
                    "location": "channel",
                    "logged_in": True,
                    "muted": False,
                    "player": "site",
                    "user_id": self._twitch._auth_state.user_id,
                }

The TDM version still returns 204, but it does so even with wrong parameters, which is probably why TDM doesn't detect it when stuff breaks, which also makes the response kinda useless. All the parameters still have the same name.

In chrome debug, the two look like this. TDM: "Request Payload" {"data":"Random_letters_redacted"}

Native: "Form data" data=Random_letters_redacted

Perhaps the most obvious difference is, that TDM sends a JSON, while the site now sends the data as an HTML form. (At least that's what I recognize it as, how it's called doesn't really matter.) Now this still could be a thing that might work, depending on how TDM does the whole thing and what twitch supports etc. Would be nice to get a quick reply from @DevilXD or some other contributors. I now have to go to sleep and will try if changing the format works tomorrow, if I find the time.

It was always almost same payload, checked it a few days ago even tried pasting full payload from browser, think it was giving 1-3% progress and stop. https://github.com/robiXxu/base64-json-viewer/tree/96de495017cfe8465e81237159d7680f8393d949

CrazyEden commented 5 months ago

hi there, i think i solved it. to progress twitch drops now have new way. "event": "minute-watched" that we send now depend only on channel points, to increase drop progress we need to WATCH THE STREAM(technically just download the media file).

here is the way how i make it work(it not the optimal way, but it work and require i littlie time to play around to optimize it).

first of all going gql PlaybackAccessToken_Template request(with oauth header), just replace variable "login" image here we recive "value" and "signature"

here we'll get links to different broadcast quality url: https://usher.ttvnw.net/api/channel/hls/ here channel login.m3u8?sig=signature from previous step&token=value from previous step response looks like something like that image here i just picking the last link, with lowest video quality this link will give us some kind a video pagination(idk how to right way name it, so) image and i just make request by one of this links, and thats it

making this requests every 30 seconds(probably can be upon to 60) work good for me image sometimes i have missing 1 or 2 minutes, but drops progress increasing

p.s im afraid of leaking my token or something like that, so i cut some part of every request

Windows200000 commented 5 months ago

p.s im afraid of leaking my token or something like that, so i cut some part of every request

Yeah, the "data" field should not be shared, because it contains the entire request in full, just encoded plain text, including literally everything. edit: to clarify, it is basically just base64 encoded Hello, world! => SGVsbG8sIHdvcmxkIQ==, meaning that even if you just share a part SGVsbG8s, you will be able to just decode it back and get that part of the original string. Hello,

Could you provide the exact code/request, just replacing sensitive data? I could try to implement it for TDM to at least work, tho less efficiently, until DevilXD can take a closer look.

Windows200000 commented 5 months ago

@CrazyEden

CrazyEden commented 5 months ago

Yeah, the "data" field should not be shared, because it contains the entire request in full, just encoded plain text, including literally everything.

here im not using "data" at all, i do not send "old" event "minute-watched", its new requests that no exist in this project

Could you provide the exact code/request, just replacing sensitive data? I could try to implement it for TDM to at least work, tho less efficiently, until DevilXD can take a closer look.

about which one request you need more information? there are only 4 of them

Windows200000 commented 5 months ago

about which one request you need more information? there are only 4 of them

I don't know how you did the requests, but I'm assuming a js script in the console? Just the plain requests you made. (with censored data, similar to what I did)

CrazyEden commented 5 months ago

I'm assuming a js script in the console?

its just chrome devtools, its debugging network request

i have private project where im done this requests, but its kotlin all requests i copied from chrome devtools

Pashovichdjanchik commented 5 months ago

hi there, i think i solved it. to progress twitch drops now have new way. "event": "minute-watched" that we send now depend only on channel points, to increase drop progress we need to WATCH THE STREAM(technically just download the media file).

here is the way how i make it work(it not the optimal way, but it work and require i littlie time to play around to optimize it).

first of all going gql PlaybackAccessToken_Template request(with oauth header), just replace variable "login" image here we recive "value" and "signature"

here we'll get links to different broadcast quality url: https://usher.ttvnw.net/api/channel/hls/ here channel login.m3u8?sig=signature from previous step&token=value from previous step response looks like something like that image here i just picking the last link, with lowest video quality this link will give us some kind a video pagination(idk how to right way name it, so) image and i just make request by one of this links, and thats it

making this requests every 30 seconds(probably can be upon to 60) work good for me image sometimes i have missing 1 or 2 minutes, but drops progress increasing

p.s im afraid of leaking my token or something like that, so i cut some part of every request

Hi, how to get value if it says authorization false image

Windows200000 commented 5 months ago

I'm assuming a js script in the console?

its just chrome devtools, its debugging network request

i have private project where im done this requests, but its kotlin all requests i copied from chrome devtools

Could you just send me that, with sensitive data removed? It would be really helpful to just rewrite it, instead of trying to build all the requests from scratch.

CrazyEden commented 5 months ago

Hi, how to get value if it says authorization false

you already got it) streamPlaybackAccessToken contain value and signature

Pashovichdjanchik commented 5 months ago

Hi, how to get value if it says authorization false

you already got it) streamPlaybackAccessToken contain value and signature

its value?) Shouldn't it be some kind of set of numbers and letters?)

CrazyEden commented 5 months ago

Could you just send me that, with sensitive data removed? It would be really helpful to just rewrite it, instead of trying to build all the requests from scratch.

sry, no, there kind of messy so many classes, files and it will take a long time for me to cut my data

CrazyEden commented 5 months ago

Hi, how to get value if it says authorization false

you already got it) streamPlaybackAccessToken contain value and signature

its value?) Shouldn't it be some kind of set of numbers and letters?)

yeah, its value, json

CrazyEden commented 5 months ago

what to do?

probably you truing use old sig with new token or old token with new sig. they are irreplaceable if you send new request to fetch new token and sig, they can only be used with each other(from the same response)

giask11 commented 5 months ago

@CrazyEden i suggest you temporarily remove the new way mentioned above. Because I have been warned by twitch

they asked me to delete all my comments and code. i think they're watching us

Windows200000 commented 5 months ago

Does anyone know how the hashes in constants.py are made?

Pashovichdjanchik commented 5 months ago

what to do?

probably you truing use old sig with new token or old token with new sig. they are irreplaceable if you send new request to fetch new token and sig, they can only be used with each other(from the same response)

image i get this, but progress not working

CrazyEden commented 5 months ago

@giask11 thanks I'll know

Does anyone know how the hashes in constants.py are made?

its some kind of combination of type request and version, its static for the same type requests

i get this, but progress not working

now send request by one of this(or couple) link and it should work(checked a moment ago)

Windows200000 commented 5 months ago

its some kind of combination of type request and version, its static for the same type requests

Well yeah, but It looks like it needs it. I've been stuck on this for ages, can't find any info on it anywhere. 19:38:53: DEBUG: GQL Response: {'errors': [{'message': 'PersistedQueryNotFound'}], 'extensions': {'durationMilliseconds': 4, 'operationName': 'PlaybackAccessToken_Template', 'requestID': '<censored>'}}