R.I.P. Nitter 🪦😭 (...unless?) #919

Closed
opened 2023-06-30 15:32:26 -04:00 by devgaucho · 477 comments
devgaucho commented 2023-06-30 15:32:26 -04:00 (Migrated from github.com)
https://techcrunch.com/2023/06/30/twitter-now-requires-an-account-to-view-tweets/ the nitter crawler will need to be recreated...
animegrafmays commented 2023-06-30 15:34:58 -04:00 (Migrated from github.com)

it was working this morning but it appears nitter is now broken. viewing any profile results in the following error being thrown

An error has occured in one of your routes.

Detail: jsony.nim(45) parseHook
asyncfutures.nim(389) read
asyncfutures.nim(389) read
asyncfutures.nim(389) read
asyncfutures.nim(389) read
asyncfutures.nim(389) read
asyncfutures.nim(389) read
Expected { but end reached. At offset: 0
it was working this morning but it appears nitter is now broken. viewing any profile results in the following error being thrown ``` An error has occured in one of your routes. Detail: jsony.nim(45) parseHook asyncfutures.nim(389) read asyncfutures.nim(389) read asyncfutures.nim(389) read asyncfutures.nim(389) read asyncfutures.nim(389) read asyncfutures.nim(389) read Expected { but end reached. At offset: 0 ```
thechesu commented 2023-06-30 15:45:15 -04:00 (Migrated from github.com)

Libreddit gone tomorrow.

Wonder how long Invidious and FreeTube will last?

Libreddit gone tomorrow. Wonder how long Invidious and FreeTube will last?
cyberseihis commented 2023-06-30 15:46:09 -04:00 (Migrated from github.com)

It's so over

It's so over
devgaucho commented 2023-06-30 15:47:02 -04:00 (Migrated from github.com)

the twitter rank has already dropped 6 places from yesterday to today 🤦‍♂️ https://ciscorank.com/s/twitter.com
https://i.imgur.com/e5U9Kox.png

the twitter rank has already dropped 6 places from yesterday to today 🤦‍♂️ https://ciscorank.com/s/twitter.com [![https://i.imgur.com/e5U9Kox.png](https://i.imgur.com/e5U9Kox.png)](https://ciscorank.com/s/twitter.com)
ericpa06 commented 2023-06-30 15:51:09 -04:00 (Migrated from github.com)

Libreddit gone tomorrow.

Wonder how long Invidious and FreeTube will last?

At least reddit still has the old.reddit.com. Which is a pretty descent front-end (as long as you don't care with privacy), with twitter, you are pretty much forced to use that horrible garbage interface. But yeah, this data rush pretty much will make all platforms to garden walled themselves.

> Libreddit gone tomorrow. > > Wonder how long Invidious and FreeTube will last? At least reddit still has the old.reddit.com. Which is a pretty descent front-end (as long as you don't care with privacy), with twitter, you are pretty much forced to use that horrible garbage interface. But yeah, this data rush pretty much will make all platforms to garden walled themselves.
sunlightspectre commented 2023-06-30 15:55:53 -04:00 (Migrated from github.com)

There are plenty of people who only engage in the modern internet through front-ends; myself being one of them. I have no interest in registering for sites; it took me ages to register a proper git.

One wonders what will happen when these self-inflicted stab-wounds deplete 'profit' rather then generate it?..
Removing access isn't going to make people want to use a site more.
And it certainly won't inflate user numbers, which I'd imagine is the end goal.

C'est la vie.

I'm glad I got to experience the internet as it was.

There are plenty of people who only engage in the modern internet through front-ends; myself being one of them. I have no interest in registering for sites; it took me ages to register a proper git. One wonders what will happen when these self-inflicted stab-wounds deplete 'profit' rather then generate it?.. Removing access isn't going to make people want to use a site _more._ And it certainly won't inflate user numbers, which I'd imagine is the end goal. C'est la vie. I'm glad I got to experience the internet as it was.
animegrafmays commented 2023-06-30 15:59:12 -04:00 (Migrated from github.com)

thoughts?


a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452

thoughts? [ ![a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452](https://github.com/zedeus/nitter/assets/71434691/4e190dba-3c5a-4acb-99ba-2e897fa69cbc) ](url)
codybrom commented 2023-06-30 16:01:57 -04:00 (Migrated from github.com)

No chance in hell this is temporary unless it affects ad revenue

No chance in hell this is temporary unless it affects ad revenue
orbea commented 2023-06-30 16:03:01 -04:00 (Migrated from github.com)

Maybe people will be smart enough to stop using proprietary garbage finally...

Maybe people will be smart enough to stop using proprietary garbage finally...
ericpa06 commented 2023-06-30 16:03:37 -04:00 (Migrated from github.com)

"Temporary emergency" measure that will always be in place forever.

_"Temporary emergency"_ measure that will always be in place forever.
DuplicantWood commented 2023-06-30 16:10:39 -04:00 (Migrated from github.com)
This fork is working https://github.com/PrivacyDevel/nitter/
roryyamm commented 2023-06-30 16:24:28 -04:00 (Migrated from github.com)

This fork is working

https://github.com/PrivacyDevel/nitter/

But privacydev.net isn't.

> This fork is working > > https://github.com/PrivacyDevel/nitter/ But privacydev.net isn't.
animegrafmays commented 2023-06-30 16:32:26 -04:00 (Migrated from github.com)

I can confirm after building that fork that it also has the same issue

ERROR jsony.nim(45)            parseHook
asyncfutures.nim(389)    read
redpool.nim(68)          getUserIdIter
asyncfutures.nim(389)    read
asyncfutures.nim(389)    read
asyncfutures.nim(389)    read
asyncfutures.nim(389)    read
asyncfutures.nim(389)    read
Expected { but end reached. At offset: 0
404 Not Found:  --- url: https://api.twitter.com/graphql/gkjsKepM6gl_HmFWoWKfgg/SearchTimeline?variables=%7B%22rawQuery%22%3A%22include%3Anativeretweets+%5C%22%23RoshamboCoin%5C%22%22%2C%22count%22%3A20%2C%22product%22%3A%22Latest%22%2C%22withDownvotePerspective%22%3Afalse%2C%22withReactionsMetadata%22%3Afalse%2C%22withReactionsPerspective%22%3Afalse%7D&features=%7B%22blue_business_profile_image_shape_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Afalse%2C%22highlights_tweets_tab_ui_enabled%22%3Afalse%2C%22interactive_text_enabled%22%3Afalse%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Afalse%2C%22longform_notetweets_richtext_consumption_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Afalse%2C%22responsive_web_edit_tweet_api_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Afalse%2C%22responsive_web_text_conversations_enabled%22%3Afalse%2C%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue%2C%22rweb_lists_timeline_redesign_enabled%22%3Atrue%2C%22spaces_2022_h2_clipping%22%3Atrue%2C%22spaces_2022_h2_spaces_communities%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Afalse%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse%2C%22tweetypie_unmention_optimization_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22vibe_api_enabled%22%3Afalse%2C%22view_counts_everywhere_api_enabled%22%3Afalse%7D
I can confirm after building that fork that it also has the same issue ``` ERROR jsony.nim(45) parseHook asyncfutures.nim(389) read redpool.nim(68) getUserIdIter asyncfutures.nim(389) read asyncfutures.nim(389) read asyncfutures.nim(389) read asyncfutures.nim(389) read asyncfutures.nim(389) read Expected { but end reached. At offset: 0 404 Not Found: --- url: https://api.twitter.com/graphql/gkjsKepM6gl_HmFWoWKfgg/SearchTimeline?variables=%7B%22rawQuery%22%3A%22include%3Anativeretweets+%5C%22%23RoshamboCoin%5C%22%22%2C%22count%22%3A20%2C%22product%22%3A%22Latest%22%2C%22withDownvotePerspective%22%3Afalse%2C%22withReactionsMetadata%22%3Afalse%2C%22withReactionsPerspective%22%3Afalse%7D&features=%7B%22blue_business_profile_image_shape_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Afalse%2C%22highlights_tweets_tab_ui_enabled%22%3Afalse%2C%22interactive_text_enabled%22%3Afalse%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Afalse%2C%22longform_notetweets_richtext_consumption_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Afalse%2C%22responsive_web_edit_tweet_api_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Afalse%2C%22responsive_web_text_conversations_enabled%22%3Afalse%2C%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue%2C%22rweb_lists_timeline_redesign_enabled%22%3Atrue%2C%22spaces_2022_h2_clipping%22%3Atrue%2C%22spaces_2022_h2_spaces_communities%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Afalse%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse%2C%22tweetypie_unmention_optimization_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22vibe_api_enabled%22%3Afalse%2C%22view_counts_everywhere_api_enabled%22%3Afalse%7D ```
eylles commented 2023-06-30 16:34:13 -04:00 (Migrated from github.com)

This fork is working
https://github.com/PrivacyDevel/nitter/

But privacydev.net isn't.

That instance is always pegged from the sheer volume of traffic alone.

> > This fork is working > > https://github.com/PrivacyDevel/nitter/ > > But privacydev.net isn't. That instance is always pegged from the sheer volume of traffic alone.
tghe-retford commented 2023-06-30 16:36:21 -04:00 (Migrated from github.com)

thoughts?

"There is nothing more permanent than a temporary measure". Either now or in the future.

> thoughts? "There is nothing more permanent than a temporary measure". Either now or in the future.
KOLANICH commented 2023-06-30 16:48:54 -04:00 (Migrated from github.com)

https://github.com/miguelfreitas/twister-core
https://github.com/szelok/twister-android

It's time to admit: providing an alternative frontend to Twitter was an idea determined to fail. What should have been done, is mirroring the content of Twitter into Twister automatically, this way having more content in twister than in twitter and creating incentives for users to join twister instead of twitter.

https://github.com/miguelfreitas/twister-core https://github.com/szelok/twister-android It's time to admit: providing an alternative frontend to Twitter was an idea determined to fail. What should have been done, is mirroring the content of Twitter into Twister automatically, this way having more content in twister than in twitter and creating incentives for users to join twister instead of twitter.
bugzillus commented 2023-06-30 16:59:53 -04:00 (Migrated from github.com)

Nitter.net returns the following "Jester route exception" which seems quite unusual for the twitter gateway not being accessible:

"An error has occured in one of your routes.

Detail: /home/ubuntu/nitter/src/nitter.nim(61) nitter
/home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) getGraphUserNimAsyncContinue
/home/ubuntu/nitter/src/api.nim(13) getGraphUserIter
/home/ubuntu/nitter/src/experimental/parser/graphql.nim(7) parseGraphUser
/home/ubuntu/.nimble/pkgs/jsony-#ea811be/jsony.nim(590) fromJson
/home/ubuntu/.nimble/pkgs/jsony-#ea811be/jsony.nim(45) parseHook
[[reraised from:
/home/ubuntu/nitter/src/nitter.nim(61) nitter
/home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) getCachedUserNimAsyncContinue
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) getCachedUserIter
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read
]]
[[reraised from:
/home/ubuntu/nitter/src/nitter.nim(61) nitter
/home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) fetchProfileNimAsyncContinue
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) fetchProfileIter
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read
]]
[[reraised from:
/home/ubuntu/nitter/src/nitter.nim(61) nitter
/home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) showTimelineNimAsyncContinue
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) showTimelineIter
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read
]]
[[reraised from:
/home/ubuntu/nitter/src/nitter.nim(61) nitter
/home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) matchNimAsyncContinue
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) matchIter
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read
]]
[[reraised from:
/home/ubuntu/nitter/src/nitter.nim(61) nitter
/home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) dispatchNimAsyncContinue
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) dispatchIter
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read
]]
[[reraised from:
/home/ubuntu/nitter/src/nitter.nim(61) nitter
/home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) handleRequestSlowNimAsyncContinue
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) handleRequestSlowIter
/home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read
]]
Expected { but end reached. At offset: 0"

Thanks anyway for providing and maintaining Nitter.

Nitter.net returns the following "Jester route exception" which seems quite unusual for the twitter gateway not being accessible: "An error has occured in one of your routes. Detail: /home/ubuntu/nitter/src/nitter.nim(61) nitter /home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) getGraphUserNimAsyncContinue /home/ubuntu/nitter/src/api.nim(13) getGraphUserIter /home/ubuntu/nitter/src/experimental/parser/graphql.nim(7) parseGraphUser /home/ubuntu/.nimble/pkgs/jsony-#ea811be/jsony.nim(590) fromJson /home/ubuntu/.nimble/pkgs/jsony-#ea811be/jsony.nim(45) parseHook [[reraised from: /home/ubuntu/nitter/src/nitter.nim(61) nitter /home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) getCachedUserNimAsyncContinue /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) getCachedUserIter /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read ]] [[reraised from: /home/ubuntu/nitter/src/nitter.nim(61) nitter /home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) fetchProfileNimAsyncContinue /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) fetchProfileIter /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read ]] [[reraised from: /home/ubuntu/nitter/src/nitter.nim(61) nitter /home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) showTimelineNimAsyncContinue /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) showTimelineIter /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read ]] [[reraised from: /home/ubuntu/nitter/src/nitter.nim(61) nitter /home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) matchNimAsyncContinue /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) matchIter /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read ]] [[reraised from: /home/ubuntu/nitter/src/nitter.nim(61) nitter /home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) dispatchNimAsyncContinue /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) dispatchIter /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read ]] [[reraised from: /home/ubuntu/nitter/src/nitter.nim(61) nitter /home/ubuntu/.nimble/pkgs/jester-#baca3f/jester.nim(511) serve /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1956) runForever /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1653) poll /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(1394) runOnce /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncdispatch.nim(234) processPendingCallbacks /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(28) handleRequestSlowNimAsyncContinue /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncmacro.nim(131) handleRequestSlowIter /home/ubuntu/.choosenim/toolchains/nim-1.6.10/lib/pure/asyncfutures.nim(389) read ]] Expected { but end reached. At offset: 0" Thanks anyway for providing and maintaining Nitter.
HEPOSHEIKKI commented 2023-06-30 17:04:25 -04:00 (Migrated from github.com)

This is a sad year for social media.

Cheers lads, was a wild ride.

This is a sad year for social media. Cheers lads, was a wild ride.
notune commented 2023-06-30 17:04:35 -04:00 (Migrated from github.com)

Couldn't we use accounts to scrape the data (one per instance)? As far as I know this was already done for NSFW-content so maybe it could be applied to all content now

Couldn't we use accounts to scrape the data (one per instance)? As far as I know this was already done for NSFW-content so maybe it could be applied to all content now
hyzchip commented 2023-06-30 17:08:31 -04:00 (Migrated from github.com)

There is one instance that is still functional:
https://tweet.whateveritworks.org
Partly functional, anyway...individual tweets are displayed, but profiles produce a 502 error.

There is one instance that is still functional: https://tweet.whateveritworks.org Partly functional, anyway...individual tweets are displayed, but profiles produce a 502 error.
pozirk commented 2023-06-30 17:09:50 -04:00 (Migrated from github.com)

Well, big thanks to @zedeus for nitter, have been enjoying it for some time.
Hope it can be fixed, but... it was going downhill for some time already.
Around a month ago twitter stopped working with disabled cookies, now this.

Well, big thanks to @zedeus for nitter, have been enjoying it for some time. Hope it can be fixed, but... it was going downhill for some time already. Around a month ago twitter stopped working with disabled cookies, now this.
NovemberOrWhatever commented 2023-06-30 17:16:01 -04:00 (Migrated from github.com)

Okay, well, to Mastodon I guess. It's a shame they're killing this. I don't think there are many here who will respond to this by going back to regular Twitter. I'm now just done with Twitter for good I suppose. Thanks to everyone who tried their best.

Okay, well, to Mastodon I guess. It's a shame they're killing this. I don't think there are many here who will respond to this by going back to regular Twitter. I'm now just done with Twitter for good I suppose. Thanks to everyone who tried their best.
AlyoshaVasilieva commented 2023-06-30 17:23:05 -04:00 (Migrated from github.com)

Couldn't we use accounts to scrape the data (one per instance)? As far as I know this was already done for NSFW-content so maybe it could be applied to all content now

Almost certainly yes, but 1) this requires registering burner accounts, possibly with some regularity as I suspect they'll get banned, and 2) the accounts will need to be linked to phone numbers because Twitter requires this if your account looks suspicious at all.

I don't think this is all that hard but it adds extra cost on top of running a server and it's annoying.

> Couldn't we use accounts to scrape the data (one per instance)? As far as I know this was already done for NSFW-content so maybe it could be applied to all content now Almost certainly yes, but 1) this requires registering burner accounts, possibly with some regularity as I suspect they'll get banned, and 2) the accounts will need to be linked to phone numbers because Twitter requires this if your account looks suspicious at all. I don't think this is all *that* hard but it adds extra cost on top of running a server and it's annoying.
oelmekki commented 2023-06-30 17:48:45 -04:00 (Migrated from github.com)

Thanks Nitter devs, you have been heroes of privacy, for a while. :)

I don't think this will affect me much, because I have not been interested in Twitter's content for a while. This network has been slowly and painfully dying since Musk bought it (and even before that, it became mostly a trolling platform for political people to hate each others), so whatever. Most of my social feeds go through Mastodon and Lemmy, nowadays, anyway. This is the end of an era, what comes next is exciting!

Thanks Nitter devs, you have been heroes of privacy, for a while. :) I don't think this will affect me much, because I have not been interested in Twitter's content for a while. This network has been slowly and painfully dying since Musk bought it (and even before that, it became mostly a trolling platform for political people to hate each others), so whatever. Most of my social feeds go through Mastodon and Lemmy, nowadays, anyway. This is the end of an era, what comes next is exciting!
nukeop commented 2023-06-30 18:02:16 -04:00 (Migrated from github.com)

Glad to see all sorts of "social" media dying 😍

Glad to see all sorts of "social" media dying 😍
stemid commented 2023-06-30 18:02:46 -04:00 (Migrated from github.com)
Can you scrape the embedded tweet instead? https://platform.twitter.com/embed/Tweet.html?id=1674865731136020505
soapingtime commented 2023-06-30 18:11:17 -04:00 (Migrated from github.com)

i don't particularly know how nitter scrapes, but i'm able to see tweets and profiles in my browser by setting the useragent to "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

i don't particularly know how nitter scrapes, but i'm able to see tweets and profiles in my browser by setting the useragent to "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Trit34 commented 2023-06-30 18:20:50 -04:00 (Migrated from github.com)

i don't particularly know how nitter scrapes, but i'm able to see tweets and profiles in my browser by setting the useragent to "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Someone has reported that this trick does not work anymore. Fun fact: it was the same trick that was used to get the pre-Polymer UI back on YouTube, when it was still available.

I don’t know how long this “temporary” measure will last, nor if it will be temporary at all. In the worse scenario, it was a real pleasure to use Nitter, @zedeus ! Let’s stay tuned, but until facts get me wrong, I consider both Nitter and Twitter are dead from now on.

Thank you!

(Now, if you want to do a Nitter clone for Mastodon, to be able to browse it without JS needed, I won’t say no to this)

> i don't particularly know how nitter scrapes, but i'm able to see tweets and profiles in my browser by setting the useragent to "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" Someone has reported that this trick does not work anymore. Fun fact: it was the same trick that was used to get the pre-Polymer UI back on YouTube, when it was still available. I don’t know how long this “temporary” measure will last, nor if it will be temporary at all. In the worse scenario, it was a real pleasure to use Nitter, @zedeus ! Let’s stay tuned, but until facts get me wrong, I consider both Nitter *and* Twitter are dead from now on. Thank you! (Now, if you want to do a Nitter clone for Mastodon, to be able to browse it without JS needed, I won’t say no to this)
notune commented 2023-06-30 18:24:03 -04:00 (Migrated from github.com)

Can you scrape the embedded tweet instead?

https://platform.twitter.com/embed/Tweet.html?id=1674865731136020505

This could definitely work. Problem is that we still have to get the tweets from a specific user.

> Can you scrape the embedded tweet instead? > > https://platform.twitter.com/embed/Tweet.html?id=1674865731136020505 This could definitely work. Problem is that we still have to get the tweets from a specific user.
fREAST commented 2023-06-30 18:38:31 -04:00 (Migrated from github.com)

Can you scrape the embedded tweet instead?
https://platform.twitter.com/embed/Tweet.html?id=1674865731136020505

This could definitely work. Problem is that we still have to get the tweets from a specific user.

Could possibly scrape this for user timeline, although it only has the last couple of tweets.
https://syndication.twitter.com/srv/timeline-profile/screen-name/TwitterDev?showReplies=true

> > Can you scrape the embedded tweet instead? > > https://platform.twitter.com/embed/Tweet.html?id=1674865731136020505 > > This could definitely work. Problem is that we still have to get the tweets from a specific user. Could possibly scrape this for user timeline, although it only has the last couple of tweets. https://syndication.twitter.com/srv/timeline-profile/screen-name/TwitterDev?showReplies=true
ghost commented 2023-06-30 18:39:19 -04:00 (Migrated from github.com)

note the Android app still works without login, which means the "anonymous flow" is still possible:

https://github.com/4cq2/mech/tree/main/twitter

note the Android app still works without login, which means the "anonymous flow" is still possible: https://github.com/4cq2/mech/tree/main/twitter
dvikan commented 2023-06-30 18:44:13 -04:00 (Migrated from github.com)

im having success scraping the embedded timeline as suggested by @fREAST

https://rss-bridge.org/bridge01/?action=display&bridge=TwitterBridge&context=By+username&u=DailyCaller&format=Html (1 hour cache)

[0] code for the temp fix: github.com/dvikan/rss-bridge@c4a82ee3ba

im having success scraping the embedded timeline as suggested by @fREAST https://rss-bridge.org/bridge01/?action=display&bridge=TwitterBridge&context=By+username&u=DailyCaller&format=Html (1 hour cache) [0] code for the temp fix: https://github.com/dvikan/rss-bridge/commit/c4a82ee3baf832cca6068634cfd1a97b104afeb9
githubtefo commented 2023-06-30 18:57:48 -04:00 (Migrated from github.com)

thoughts?

a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452

Is this true? I can't check because I don't have a twitter account hehe

> thoughts? > > [ ](url)![a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452](https://github.com/zedeus/nitter/assets/71434691/4e190dba-3c5a-4acb-99ba-2e897fa69cbc) Is this true? I can't check because I don't have a twitter account hehe
devgaucho commented 2023-06-30 18:58:40 -04:00 (Migrated from github.com)

thoughts?
a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452

Is this true? I can't check because I don't have a_ twitter _account hehe

true https://platform.twitter.com/embed/Tweet.html?id=1674865731136020505

> > thoughts? > > [ ](url)![a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452](https://user-images.githubusercontent.com/71434691/250187597-4e190dba-3c5a-4acb-99ba-2e897fa69cbc.jpeg) > > Is this true? I can't check because I don't have a_ twitter _account hehe true https://platform.twitter.com/embed/Tweet.html?id=1674865731136020505
nukeop commented 2023-06-30 19:03:31 -04:00 (Migrated from github.com)

You can in fact live without Twitter, you should give it a try

You can in fact live without Twitter, you should give it a try
tuxpizza commented 2023-06-30 19:14:13 -04:00 (Migrated from github.com)

Libreddit gone tomorrow.

Wonder how long Invidious and FreeTube will last?

Libreddit isn't using the Reddit API. it's scraping via public information. Unless Reddit decides to lock you out unless you're logged in, Libreddit will continue to work

> Libreddit gone tomorrow. > > Wonder how long Invidious and FreeTube will last? Libreddit isn't using the Reddit API. it's scraping via public information. Unless Reddit decides to lock you out unless you're logged in, Libreddit will continue to work
mn-pal-m commented 2023-06-30 19:14:37 -04:00 (Migrated from github.com)

You can in fact live without Twitter, you should give it a try

Absolutely! in fact this is what i do daily.

However, there are still certain things that i need to use twitter for in my work, such as inspecting certain tweets from services that i use. Or just watching around friends that did not made the move just yet.

That's not to mention that, for nitter in particular, you can easily use a twitter account as an RSS feed for brands and services that don't have any other ways of communication.

Yes, a life without twitter is possible. Which is what Nitter mostly stands out for. Refraining from using twitter as a main tool and instead as an assistive thing.

> You can in fact live without Twitter, you should give it a try Absolutely! in fact this is what i do daily. However, there are still certain things that i need to use twitter for in my work, such as inspecting certain tweets from services that i use. Or just watching around friends that did not made the move just yet. That's not to mention that, for nitter in particular, you can easily use a twitter account as an RSS feed for brands and services that don't have any other ways of communication. Yes, a life without twitter *is* possible. Which is what Nitter mostly stands out for. Refraining from using twitter as a main tool and instead as an assistive thing.
orbea commented 2023-06-30 19:17:40 -04:00 (Migrated from github.com)

You can in fact live without Twitter, you should give it a try

This would be easier if people stopped using twitter to share current news which the MSM is entirely incapable of reporting on accurately.

> You can in fact live without Twitter, you should give it a try This would be easier if people stopped using twitter to share current news which the MSM is entirely incapable of reporting on accurately.
nukeop commented 2023-06-30 19:18:11 -04:00 (Migrated from github.com)

You can live without all that stuff too. Stop reading news

You can live without all that stuff too. Stop reading news
mn-pal-m commented 2023-06-30 19:18:46 -04:00 (Migrated from github.com)

Libreddit gone tomorrow.
Wonder how long Invidious and FreeTube will last?

Libreddit isn't using the Reddit API. it's scraping via public information. Unless Reddit decides to lock you out unless you're logged in, Libreddit will continue to work

@tuxpizza False. So much, that even the current maintainer is fearful of Libreddit's Future at the moment

> > Libreddit gone tomorrow. > > Wonder how long Invidious and FreeTube will last? > > Libreddit isn't using the Reddit API. it's scraping via public information. Unless Reddit decides to lock you out unless you're logged in, Libreddit will continue to work @tuxpizza False. So much, that [even the current maintainer is fearful of Libreddit's Future at the moment](https://github.com/libreddit/libreddit/issues/785#issuecomment-1514809796)
orbea commented 2023-06-30 19:19:10 -04:00 (Migrated from github.com)

You can live without all that stuff too. Stop reading news

"Ignorance is bliss" (If only bad things went away when you didn't know about them)

> You can live without all that stuff too. Stop reading news "Ignorance is bliss" (If only bad things went away when you didn't know about them)
nukeop commented 2023-06-30 19:27:51 -04:00 (Migrated from github.com)

You know less when you read the news though

You know less when you read the news though
garoto commented 2023-06-30 19:31:59 -04:00 (Migrated from github.com)

Can you stop with the lecturing? It's asinine.

Can you stop with the lecturing? It's asinine.
tuxpizza commented 2023-06-30 19:35:00 -04:00 (Migrated from github.com)

Libreddit gone tomorrow.
Wonder how long Invidious and FreeTube will last?

Libreddit isn't using the Reddit API. it's scraping via public information. Unless Reddit decides to lock you out unless you're logged in, Libreddit will continue to work

@tuxpizza False. So much, that even the current maintainer is fearful of Libreddit's Future at the moment

Ahh I guess I was mistaken. I thought it was similar to Nitter but they are using the API but with an "Anonymous" endpoint. I'm betting on Reddit removing that aswell. Sucks.

> > > Libreddit gone tomorrow. > > > Wonder how long Invidious and FreeTube will last? > > > > > > Libreddit isn't using the Reddit API. it's scraping via public information. Unless Reddit decides to lock you out unless you're logged in, Libreddit will continue to work > > @tuxpizza False. So much, that [even the current maintainer is fearful of Libreddit's Future at the moment](https://github.com/libreddit/libreddit/issues/785#issuecomment-1514809796) Ahh I guess I was mistaken. I thought it was similar to Nitter but they are using the API but with an "Anonymous" endpoint. I'm betting on Reddit removing that aswell. Sucks.
thansk commented 2023-06-30 19:37:51 -04:00 (Migrated from github.com)

You know less when you read the news though

How can I mark this as spam/off-topic? The report button is missing from the three dots.

> You know less when you read the news though How can I mark this as spam/off-topic? The report button is missing from the three dots.
nukeop commented 2023-06-30 19:52:34 -04:00 (Migrated from github.com)

How can I mark this as spam/off-topic? The report button is missing from the three dots.

That's because this isn't reddit

> How can I mark this as spam/off-topic? The report button is missing from the three dots. That's because this isn't reddit
cristeigabriela commented 2023-06-30 20:04:14 -04:00 (Migrated from github.com)

thoughts?

a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452

IT'S DA SCRAAAAPEEEERZ

> thoughts? > > [ ](url)![a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452](https://github.com/zedeus/nitter/assets/71434691/4e190dba-3c5a-4acb-99ba-2e897fa69cbc) IT'S DA SCRAAAAPEEEERZ
unseenlarks commented 2023-06-30 20:09:31 -04:00 (Migrated from github.com)

The privacydev fork does work, but in an extremely limited manner. only tweet search works, and only if the xCsrfToken and cookieHeader settings are configured. both values are request headers when you're logged into twitter.

using it for multi-account feeds also works* in a limited manner, when not receiving instance limited/bad gateway errors of course. :/

*edit: seems it's no longer the case.

thank you to everyone developing + working on nitter all this time.

> The [privacydev fork](https://github.com/PrivacyDevel/nitter) **does work**, but in an extremely limited manner. only tweet search works, and only if the xCsrfToken and cookieHeader settings are configured. both values are request headers when you're logged into twitter. using it for multi-account feeds also works* in a limited manner, when not receiving instance limited/bad gateway errors of course. :/ *edit: seems it's no longer the case. thank you to everyone developing + working on nitter all this time.
devgaucho commented 2023-06-30 20:47:27 -04:00 (Migrated from github.com)

why is everyone crying? all you have to do is make an account (and log it into the instance) now

accounts can be deleted and have limited access, which increases the complexity of the code

> why is everyone crying? all you have to do is make an account (and log it into the instance) now accounts can be deleted and have limited access, which increases the complexity of the code
orbea commented 2023-06-30 20:49:25 -04:00 (Migrated from github.com)

why is everyone crying? all you have to do is make an account (and log it into the instance) now

Requires a phone number with tor and having an account at all reduces anonymity.

> why is everyone crying? all you have to do is make an account (and log it into the instance) now Requires a phone number with tor and having an account at all reduces anonymity.
orbea commented 2023-06-30 20:55:07 -04:00 (Migrated from github.com)

why is everyone crying? all you have to do is make an account (and log it into the instance) now

Requires a phone number with tor and having an account at all reduces anonymity.

phone numbers are cheap

Is it possible to have an anonymous phone number?

> > > why is everyone crying? all you have to do is make an account (and log it into the instance) now > > > > > > Requires a phone number with tor and having an account at all reduces anonymity. > > phone numbers are cheap Is it possible to have an anonymous phone number?
Thespikedballofdoom commented 2023-06-30 21:00:12 -04:00 (Migrated from github.com)

Obviously a borderline illegal phone account spamming implementation isn't likely, but thanks for nitter so much zedeus!

Obviously a borderline illegal phone account spamming implementation isn't likely, but thanks for nitter so much zedeus!
devgaucho commented 2023-06-30 21:03:58 -04:00 (Migrated from github.com)

why is everyone crying? all you have to do is make an account (and log it into the instance) now

accounts can be deleted and have limited access, which increases the complexity of the code

yes accounts will deleted after they figure out what the account name is... how, exactly?

a simple bot detection script can check the xCsrfToken used in the search form of any nitter instance

after that the account is banned by twitter and the bot is taken offline

changing ip is easy and cheap, but creating verified accounts in an automated way is complex and costly

virtual sms number companies usually reuse the same number and each number can be used to create only 10 different twitter accounts

after any suspicious activity the account is blocked and the only way to unblock it is with a new confirmation of the phone number

the access volume of a bot also tends to be higher than a regular user, this draws attention in the same way that logged in users are often blocked after any suspicious activity

> > > why is everyone crying? all you have to do is make an account (and log it into the instance) now > > > > > > accounts can be deleted and have limited access, which increases the complexity of the code > > yes accounts will deleted after they figure out what the account name is... how, exactly? a simple bot detection script can check the xCsrfToken used in the search form of any nitter instance after that the account is banned by twitter and the bot is taken offline changing ip is easy and cheap, but creating verified accounts in an automated way is complex and costly virtual sms number companies usually reuse the same number and each number can be used to create only 10 different twitter accounts after any suspicious activity the account is blocked and the only way to unblock it is with a new confirmation of the phone number the access volume of a bot also tends to be higher than a regular user, this draws attention in the same way that logged in users are often blocked after any suspicious activity
markcellus commented 2023-06-30 21:06:41 -04:00 (Migrated from github.com)

On the smspva.com website:

We do not store numbers longer than 24 hours. If you need to receive SMS for a long time - use the Rental service.

You would need the phone number longer than 24 hours. Basically the lifetime of an account. And thats IF your account isnt flagged for "suspicious activity", which is likely the case for new social media accounts. All new accounts usually have to pass some sort of cleared actions in a certain order over a significant amount of time before your account would be considered "real".

On the smspva.com website: > We do not store numbers longer than 24 hours. If you need to receive SMS for a long time - use the Rental service. You would need the phone number longer than 24 hours. Basically the lifetime of an account. And thats IF your account isnt flagged for "suspicious activity", which is likely the case for new social media accounts. All new accounts usually have to pass some sort of cleared actions in a certain order over a significant amount of time before your account would be considered "real".
fanfare commented 2023-06-30 21:08:11 -04:00 (Migrated from github.com)

archive.is still works. perhaps they have a pool of logged-in accounts for scraping purposes

archive.is still works. perhaps they have a pool of logged-in accounts for scraping purposes
orbea commented 2023-06-30 21:08:49 -04:00 (Migrated from github.com)

smspva.com

I get this when trying to sign up with tor.

Sorry, you cannot register on our website. It was noticed that your e-mail address was used to send spam. If you have never been involved in spam, then your IP-address was previously used by spammers. Ask your internet provider to change your IP-address, and you will be able to register on our website.

Does this also require a payment method which reduce anonymity again....

> smspva.com I get this when trying to sign up with tor. > Sorry, you cannot register on our website. It was noticed that your e-mail address was used to send spam. If you have never been involved in spam, then your IP-address was previously used by spammers. Ask your internet provider to change your IP-address, and you will be able to register on our website. Does this also require a payment method which reduce anonymity again....
markcellus commented 2023-06-30 21:10:36 -04:00 (Migrated from github.com)

why would you need it for the lifetime of an account?

Lol you must be new to scraping. Just because you verify your account with an sms once doesnt mean they wont ask again. :)

> why would you need it for the lifetime of an account? Lol you must be new to scraping. Just because you verify your account with an sms once doesnt mean they wont ask again. :)
devgaucho commented 2023-06-30 21:16:39 -04:00 (Migrated from github.com)

why would you need it for the lifetime of an account?

Lol you must be new to scraping. Just because you verify your account with an sms once doesnt mean they wont ask again. :)

yes, and with the same number 🙃

> > why would you need it for the lifetime of an account? > > Lol you must be new to scraping. Just because you verify your account with an sms once doesnt mean they wont ask again. :) yes, and with the same number 🙃
YJSoft commented 2023-06-30 21:20:44 -04:00 (Migrated from github.com)

In conclusion...

  1. Twitter disabled anonymous access of data
  2. Using accounts also highly likely not works because Twitter will suspend account if its behavior is suspicious(Public instances like nitter.net will become suspended within hour I guess?)
  3. Tricking as bots also not works(as reported)
  4. Scrapping from embedded tweet/timeline might work

About 2(using accounts)
Since this change is intented for blocking access of scrappers, If some random account(verified or not) access lots of tweets/account in short time, they might decide that account is scrapping tweets and require re-verify of phone number, captcha, etc. No one knows since It's 100% up to twitter(or elon)

In conclusion... 1. Twitter disabled anonymous access of data 2. Using accounts also highly likely not works because Twitter will suspend account if its behavior is suspicious(Public instances like nitter.net will become suspended within hour I guess?) 3. Tricking as bots also not works(as reported) 4. Scrapping from embedded tweet/timeline might work About 2(using accounts) Since this change is intented for blocking access of scrappers, If some random account(verified or not) access lots of tweets/account in short time, they might decide that account is scrapping tweets and require re-verify of phone number, captcha, etc. No one knows since It's 100% up to twitter(or elon)
devgaucho commented 2023-06-30 21:25:09 -04:00 (Migrated from github.com)

why would you need it for the lifetime of an account?

Lol you must be new to scraping. Just because you verify your account with an sms once doesnt mean they wont ask again. :)

actually i'm quite experienced, this has never happened to me once. maybe don't be so cocky? they ask again I switch accounts

yes, the most logical way is for nitter to support login data or cookies like youtube-dl and yt-dlp do

in any case nitter will have to be rewritten to support these features

> > > why would you need it for the lifetime of an account? > > > > > > Lol you must be new to scraping. Just because you verify your account with an sms once doesnt mean they wont ask again. :) > > actually i'm quite experienced, this has never happened to me once. maybe don't be so cocky? they ask again I switch accounts yes, the most logical way is for nitter to support login data or cookies like youtube-dl and yt-dlp do in any case nitter will have to be rewritten to support these features
AlyoshaVasilieva commented 2023-06-30 21:34:26 -04:00 (Migrated from github.com)

I'll note here that the Twitter rate-limit currently seems to be set incredibly low. I'm getting 429 errors browsing my timeline totally normally on my real account.

I'll note here that the Twitter rate-limit currently seems to be set *incredibly* low. I'm getting 429 errors browsing my timeline totally normally on my real account.
AlyoshaVasilieva commented 2023-06-30 21:52:17 -04:00 (Migrated from github.com)

No, residential, accessing using browser without proxy/VPN. According to headers sent by Twitter the rate-limit is currently 50 requests to the TweetDetail endpoint per 15 minutes. Loading a tweet or loading more replies to a tweet both hit it.

No, residential, accessing using browser without proxy/VPN. According to headers sent by Twitter the rate-limit is currently 50 requests to the TweetDetail endpoint per 15 minutes. Loading a tweet or loading more replies to a tweet both hit it.
OIRNOIR commented 2023-06-30 21:56:08 -04:00 (Migrated from github.com)

https://platform.twitter.com/embed/Tweet.html?id=1674942336583757825 Elon says it will be unlocked soon, I really hope so.

https://platform.twitter.com/embed/Tweet.html?id=1674942336583757825 Elon says it will be unlocked soon, I really hope so.
unseenlarks commented 2023-06-30 22:22:14 -04:00 (Migrated from github.com)

https://platform.twitter.com/embed/Tweet.html?id=1674942336583757825 Elon says it will be unlocked soon, I really hope so.

thank you for the update. alternatives like bird.makeup, nitter, et al. are so important to have. thank you again to all developers.

> https://platform.twitter.com/embed/Tweet.html?id=1674942336583757825 Elon says it will be unlocked soon, I really hope so. thank you for the update. alternatives like bird.makeup, nitter, et al. are so important to have. thank you again to all developers.
rupakhetibinit commented 2023-07-01 00:41:34 -04:00 (Migrated from github.com)

thoughts?

a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452

temporary measure, just like the special 3 day military operation in ukraine.

> thoughts? > > [ ](url)![a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452](https://github.com/zedeus/nitter/assets/71434691/4e190dba-3c5a-4acb-99ba-2e897fa69cbc) temporary measure, just like the special 3 day military operation in ukraine.
Philippe734 commented 2023-07-01 06:10:06 -04:00 (Migrated from github.com)

Use this amazing nitter service since the beginning. It was so easy to read tweet, it was my daily reads. Without it, I wouldn't have read so much on twitter and I wouldn't have accumulated so much knowledge. Nitter will miss a lot for me.

Use this amazing nitter service since the beginning. It was so easy to read tweet, it was my daily reads. Without it, I wouldn't have read so much on twitter and I wouldn't have accumulated so much knowledge. Nitter will miss a lot for me.
longyap commented 2023-07-01 06:46:06 -04:00 (Migrated from github.com)

its so over bros

its so over bros
Nitrousoxide commented 2023-07-01 08:17:48 -04:00 (Migrated from github.com)

thoughts?
a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452

temporary measure, just like the special 3 day military operation in ukraine.

Doing it hours before the end of the month after Musk has had a history of not paying contractors/suppliers screams that a major host for twitter is shutting them off at the start of July and "oh shit we have to turn stuff off or we'll not be able to keep the site up"

> > thoughts? > > [ ](url)![a02ae1feb7da5958bf7ae451012fad1ab34a974910511745bdcf80f674b8d452](https://user-images.githubusercontent.com/71434691/250187597-4e190dba-3c5a-4acb-99ba-2e897fa69cbc.jpeg) > > temporary measure, just like the special 3 day military operation in ukraine. Doing it hours before the end of the month after Musk has had a history of not paying contractors/suppliers screams that a major host for twitter is shutting them off at the start of July and "oh shit we have to turn stuff off or we'll not be able to keep the site up"
stjdm commented 2023-07-01 08:32:00 -04:00 (Migrated from github.com)

@Nitrousoxide
There might be something in there. Just as of now Twitter web is also down.

> @Nitrousoxide There might be something in there. Just as of now Twitter web is also down.
D-VR commented 2023-07-01 08:55:11 -04:00 (Migrated from github.com)

@Nitrousoxide There might be something in there. Just as of now Twitter web is also down.

not just Twitter Web. iOS App also hit.

"rate limit exceeded" since +20 minutes, can't refresh timelines any longer

I think at this point it can be said that Twitter is too unstable to build any kind of software for it.

Even the people who are paying 10k's $ per month for api access get a completely unreliable and buggy service, and 0 support by Twitter.

for you enjoyment:
Everything is fine

And developers shelling out for Twitter's Enterprise API Plan, which starts at $42,000 per month, are experiencing sudden outages and disappointing service considering the money they're paying.

"Everything used to work fine before we started paying half a million per year," shared one developer in a private Twitter developer group chat shared with Mashable.

> > > > @Nitrousoxide There might be something in there. Just as of now Twitter web is also down. not just Twitter Web. iOS App also hit. "rate limit exceeded" since +20 minutes, can't refresh timelines any longer I think at this point it can be said that Twitter is too unstable to build any kind of software for it. Even the people who are paying 10k's $ per month for api access get a completely unreliable and buggy service, and 0 support by Twitter. for you enjoyment: [Everything is fine](https://mashable.com/article/twitter-api-elon-musk-developer-issues-apps) >And developers shelling out for Twitter's Enterprise API Plan, which starts at $42,000 per month, are experiencing sudden outages and disappointing service considering the money they're paying. > > "Everything used to work fine before we started paying half a million per year," shared one developer in a private Twitter developer group chat shared with Mashable.
UmBottesWillen commented 2023-07-01 09:17:52 -04:00 (Migrated from github.com)

note the Android app still works without login, which means the "anonymous flow" is still possible:

https://github.com/4cq2/mech/tree/main/twitter

Or it means that the android app by default tracks as if you were logged in.

> note the Android app still works without login, which means the "anonymous flow" is still possible: > > https://github.com/4cq2/mech/tree/main/twitter Or it means that the android app by default tracks as if you were logged in.
michaelkaufman commented 2023-07-01 09:26:35 -04:00 (Migrated from github.com)

Libreddit gone tomorrow.
Wonder how long Invidious and FreeTube will last?

At least reddit still has the old.reddit.com. Which is a pretty descent front-end (as long as you don't care with privacy), with twitter, you are pretty much forced to use that horrible garbage interface. But yeah, this data rush pretty much will make all platforms to garden walled themselves.

What do you mean when you say "as long as you dont care about privacy" with regards to old.reddit?

> > Libreddit gone tomorrow. > > Wonder how long Invidious and FreeTube will last? > > At least reddit still has the old.reddit.com. Which is a pretty descent front-end (as long as you don't care with privacy), with twitter, you are pretty much forced to use that horrible garbage interface. But yeah, this data rush pretty much will make all platforms to garden walled themselves. What do you mean when you say "as long as you dont care about privacy" with regards to old.reddit?
BANKA2017 commented 2023-07-01 09:34:49 -04:00 (Migrated from github.com)

note the Android app still works without login, which means the "anonymous flow" is still possible:
https://github.com/4cq2/mech/tree/main/twitter

Or it means that the android app by default tracks as if you were logged in.

The principle of Android app anonymous browsing is to register a hidden account with _LO_ prefix screen_name when it is opened for the first time.

And ONLY replacing the bearer token and endpoints will NOT solve the problem.

> > note the Android app still works without login, which means the "anonymous flow" is still possible: > > https://github.com/4cq2/mech/tree/main/twitter > > Or it means that the android app by default tracks as if you were logged in. The principle of Android app anonymous browsing is to register a hidden account with `_LO_` prefix `screen_name` when it is opened for the first time. And **ONLY** replacing the bearer token and endpoints will **NOT** solve the problem.
kloczek commented 2023-07-01 09:38:55 -04:00 (Migrated from github.com)

Is it any other way to browse accounts which I'm blocked without create another account? (which is IMO stupid) 🤔

Is it any other way to browse accounts which I'm blocked without create another account? (which is IMO stupid) 🤔
Azzurite commented 2023-07-01 10:08:10 -04:00 (Migrated from github.com)

Is it any other way to browse accounts which I'm blocked without create another account? (which is IMO stupid) 🤔

I wrote myself this script: https://greasyfork.org/en/scripts/469910-twitter-com-to-embed

It rewrites pages to their embed widget URL, which doesn't need login. The relevant URLs to use yourself are

  • For user feeds: https://syndication.twitter.com/srv/timeline-profile/screen-name/USER (replace USER)
  • For tweet links: https://platform.twitter.com/embed/Tweet.html?id=TWEET_ID (replace TWEET_ID with the number of a tweet URL)

Those could potentially be used to fix Nitter as well?

> Is it any other way to browse accounts which I'm blocked without create another account? (which is IMO stupid) 🤔 I wrote myself this script: https://greasyfork.org/en/scripts/469910-twitter-com-to-embed It rewrites pages to their embed widget URL, which doesn't need login. The relevant URLs to use yourself are * For user feeds: `https://syndication.twitter.com/srv/timeline-profile/screen-name/USER` (replace USER) * For tweet links: `https://platform.twitter.com/embed/Tweet.html?id=TWEET_ID` (replace TWEET_ID with the number of a tweet URL) Those could potentially be used to fix Nitter as well?
michaeldvinci commented 2023-07-01 10:09:18 -04:00 (Migrated from github.com)

Can confirm, the above is working well for both tweets and tweets > user feed

Can confirm, the above is working well for both tweets and tweets > user feed
ghost commented 2023-07-01 10:33:43 -04:00 (Migrated from github.com)

User feeds with the above method don't seem to be working for me, all just show "Nothing to see here yet".

User feeds with the above method don't seem to be working for me, all just show "Nothing to see here yet".
XxTriviumxX commented 2023-07-01 11:18:06 -04:00 (Migrated from github.com)

For those who use rss feeds. When you go to https://rss.app/rss-feed/create-twitter-rss-feed and enter a twitter page URL you want to follow, you can get its content. You simply need to copy the URL and put it in your bookmarks. If you actually pay for the service, you can get the real rss feed though. I only follow 2 people, so its viable for me.

For those who use rss feeds. When you go to https://rss.app/rss-feed/create-twitter-rss-feed and enter a twitter page URL you want to follow, you can get its content. You simply need to copy the URL and put it in your bookmarks. If you actually pay for the service, you can get the real rss feed though. I only follow 2 people, so its viable for me.
ghost commented 2023-07-01 13:07:16 -04:00 (Migrated from github.com)

changing ip is easy and cheap, but creating verified accounts in an automated way is complex and costly

Maybe try to use ipfs to scrape in the user end and store some pieces of content on the nitter webpage, like

https://github.com/meehow/2read
> changing ip is easy and cheap, but creating verified accounts in an automated way is complex and costly Maybe try to use ipfs to scrape in the user end and store some pieces of content on the nitter webpage, like ``` https://github.com/meehow/2read ```
yingziwu commented 2023-07-01 13:40:43 -04:00 (Migrated from github.com)
![image](https://github.com/zedeus/nitter/assets/22741471/ccb87a73-88b6-484c-b4a5-d8e9bb9db569) https://twitter.com/elonmusk/status/1675187969420828672
notune commented 2023-07-01 13:58:07 -04:00 (Migrated from github.com)
@yingziwu use this link instead https://platform.twitter.com/embed/Tweet.html?id=1675187969420828672
sunlightspectre commented 2023-07-01 14:02:52 -04:00 (Migrated from github.com)

image https://twitter.com/elonmusk/status/1675187969420828672

I don't have much more to contribute here, but people wonder how I've lived so long?

My desire (and track record) of outliving everyone I have a grudge with, serious or petty.
Cannot recommend it enough.

Really now... I have to imagine that 6000 tweets could be used up loading more/hitting the back button if you're in an area of particularly high engagement (politics, meteorology/local news, active hobby discussions).
And in addition, paying users barely getting anything more than the quote-un-quote freeloaders that were quote-un-quote 'data' 'pillaging...'

This man really is sui generis.

> ![image](https://user-images.githubusercontent.com/22741471/250297253-ccb87a73-88b6-484c-b4a5-d8e9bb9db569.png) https://twitter.com/elonmusk/status/1675187969420828672 I don't have much more to contribute here, but people wonder how I've lived so long? My desire (and track record) of outliving everyone I have a grudge with, serious or petty. Cannot recommend it enough. Really now... I have to imagine that 6000 tweets could be used up loading more/hitting the back button if you're in an area of particularly high engagement (politics, meteorology/local news, active hobby discussions). And in addition, paying users barely getting anything more than the quote-un-quote freeloaders that were quote-un-quote 'data' 'pillaging...' This man really is sui generis.
thechesu commented 2023-07-01 14:10:59 -04:00 (Migrated from github.com)

That script works great thanks.

With those restrictions from Musk, I can see a mass exodus from Twitter.

That script works great thanks. With those restrictions from Musk, I can see a mass exodus from Twitter.
fanfare commented 2023-07-01 14:27:51 -04:00 (Migrated from github.com)

reading the comments/replies to musk's announcement was enough to hit 600 posts, my account is now frozen after about 5 minutes

reading the comments/replies to musk's announcement was enough to hit 600 posts, my account is now frozen after about 5 minutes
devgaucho commented 2023-07-01 14:30:55 -04:00 (Migrated from github.com)

ler os comentários/respostas ao anúncio de musk foi suficiente para atingir 600 postagens, minha conta agora está congelada após cerca de 5 minutos

this is a nightmare for any person with ADHD 😱

> ler os comentários/respostas ao anúncio de musk foi suficiente para atingir 600 postagens, minha conta agora está congelada após cerca de 5 minutos this is a nightmare for any person with ADHD 😱
garoto commented 2023-07-01 14:38:45 -04:00 (Migrated from github.com)

I guess advertisers pulling out from the platform was more catastrophic than what was implied in the couple interviews with him I've watched. "Running out of money" to pay necessary infrastructure looks like a believable scenario to me at this point since, well, 2023 mega-corps and ad agencies aren't really on-board with current twitter management and its "controversial" policies.

But on the flip side, instagram seems to be doing just fine sitting behind an authentication wall, so what do I know.

I guess advertisers pulling out from the platform was more catastrophic than what was implied in the couple interviews with him I've watched. "Running out of money" to pay necessary infrastructure looks like a believable scenario to me at this point since, well, 2023 mega-corps and ad agencies aren't really on-board with current twitter management and its "controversial" policies. But on the flip side, instagram seems to be doing just fine sitting behind an authentication wall, so what do I know.
edurur commented 2023-07-01 15:04:33 -04:00 (Migrated from github.com)

FYI TweetDeck works without any "significant" problems.

FYI TweetDeck works without any "significant" problems.
animegrafmays commented 2023-07-01 15:23:50 -04:00 (Migrated from github.com)

FYI TweetDeck works without any "significant" problems.

users on my fedi instance confirming that it does in fact have a rate limit. i wonder if it's 300/600/6000 per app (website, tweetdeck, phone app) or what

> FYI TweetDeck works without any "significant" problems. users on my fedi instance confirming that it does in fact have a rate limit. i wonder if it's 300/600/6000 per app (website, tweetdeck, phone app) or what
allanf181 commented 2023-07-01 15:25:31 -04:00 (Migrated from github.com)

FYI TweetDeck works without any "significant" problems.

I tried to like a tweet but it didn't work, but they load

> FYI TweetDeck works without any "significant" problems. I tried to like a tweet but it didn't work, but they load
unseenlarks commented 2023-07-01 15:41:27 -04:00 (Migrated from github.com)
Musk has posted again... https://platform.twitter.com/embed/Tweet.html?id=1675214274627530754
edurur commented 2023-07-01 15:48:55 -04:00 (Migrated from github.com)

users on my fedi instance confirming that it does in fact have a rate limit. i wonder if it's 300/600/6000 per app (website, tweetdeck, phone app) or what

I do have 7 accounts on my TweetDeck maybe I have 600*7 tweet loading limit, can’t really confirm.

I tried to like a tweet but it didn't work, but they load

Yep, I can’t like either.

> users on my fedi instance confirming that it does in fact have a rate limit. i wonder if it's 300/600/6000 per app (website, tweetdeck, phone app) or what I do have 7 accounts on my TweetDeck maybe I have 600*7 tweet loading limit, can’t really confirm. > I tried to like a tweet but it didn't work, but they load Yep, I can’t like either.
D-VR commented 2023-07-01 15:50:16 -04:00 (Migrated from github.com)

Musk has posted again...

https://platform.twitter.com/embed/Tweet.html?id=1675214274627530754

why does he even bother, that change doesn't do anything to address the problem

the site is completely unusable now for any kind of regular user.

Bots can still post freely.

> Musk has posted again... > > > > https://platform.twitter.com/embed/Tweet.html?id=1675214274627530754 why does he even bother, that change doesn't do anything to address the problem the site is completely unusable now for any kind of regular user. Bots can still post freely.
ghost commented 2023-07-01 15:53:53 -04:00 (Migrated from github.com)

why does he even bother, that change doesn't do anything to address the problem

I think, it is a campaign to promote twitter premium and to stop AI learning.

> why does he even bother, that change doesn't do anything to address the problem I think, it is a campaign to promote twitter premium and to stop AI learning.
zedeus commented 2023-07-01 16:06:53 -04:00 (Migrated from github.com)

If this doesn't get reversed within the next couple of weeks I'll switch to using embeds as an emergency measure, but for now I'm just going to wait it out.

I appreciate the support everyone, it's amazing to see how many people use my little pet project. Nitter isn't going down without a fight.

If this doesn't get reversed within the next couple of weeks I'll switch to using embeds as an emergency measure, but for now I'm just going to wait it out. I appreciate the support everyone, it's amazing to see how many people use my little pet project. Nitter isn't going down without a fight.
AlexCSDev commented 2023-07-01 16:28:13 -04:00 (Migrated from github.com)

Apparently older ios client is exempt from those limits? Maybe it's possible to figure out something from that?

https://www.reddit.com/r/jailbreak/comments/14o1v64/tutorial_no_new_twitter_updates_rate_limits_with/

Apparently older ios client is exempt from those limits? Maybe it's possible to figure out something from that? https://www.reddit.com/r/jailbreak/comments/14o1v64/tutorial_no_new_twitter_updates_rate_limits_with/
notune commented 2023-07-01 16:29:11 -04:00 (Migrated from github.com)

This might actually really be temporary. According to this guy, the code that was pushed to block non-users actually caused Twitter to DDoS itself: https://sfba.social/@sysop408/110639435788921057

This might actually really be temporary. According to this guy, the code that was pushed to block non-users actually caused Twitter to DDoS itself: https://sfba.social/@sysop408/110639435788921057
nukeop commented 2023-07-01 16:54:10 -04:00 (Migrated from github.com)

This might actually really be temporary. According to this guy, the code that was pushed to block non-users actually caused Twitter to DDoS itself: https://sfba.social/@sysop408/110639435788921057

This guy doesn't know what he's talking about.

> This might actually really be temporary. According to this guy, the code that was pushed to block non-users actually caused Twitter to DDoS itself: https://sfba.social/@sysop408/110639435788921057 This guy doesn't know what he's talking about.
Extravi commented 2023-07-01 17:57:15 -04:00 (Migrated from github.com)

rip nitter

rip nitter
yo8z6gv commented 2023-07-01 17:59:18 -04:00 (Migrated from github.com)

In fact, Twitter does not work at all:

  1. trying to restore the password, it asks for a login, and if it is also unknown, it is impossible to restore the account.
  2. an attempt to register an account simply closes the window. no mail letters, etc. come to the email. authorization with such a login does not find it in the system
  3. Trying to register by phone number, it does not accept the phone number. They say they enter arbitrary characters.

Clicking on the links to Twitter opens the window "sign in to Twitter". Thus, this social network has turned into something like the Chinese social networks where they require wechat or something like that, only in the case of Twitter just nothing works.

In fact, Twitter does not work at all: 1. trying to restore the password, it asks for a login, and if it is also unknown, it is impossible to restore the account. 2. an attempt to register an account simply closes the window. no mail letters, etc. come to the email. authorization with such a login does not find it in the system 3. Trying to register by phone number, it does not accept the phone number. They say they enter arbitrary characters. Clicking on the links to Twitter opens the window "sign in to Twitter". Thus, this social network has turned into something like the Chinese social networks where they require wechat or something like that, only in the case of Twitter just nothing works.
PancakesArchitect commented 2023-07-01 18:21:24 -04:00 (Migrated from github.com)

This issue could also be called "R.I.P Twitter".

This issue could also be called "R.I.P Twitter".
unseenlarks commented 2023-07-01 18:47:46 -04:00 (Migrated from github.com)
and Musk has posted again. https://platform.twitter.com/embed/Tweet.html?id=1675260424109928449
Tourfaint commented 2023-07-01 18:50:33 -04:00 (Migrated from github.com)

and Musk has posted again.

I don't wanna post offtopic but i just loaded this tweet in normal twitter and loading the replies made me hit the new limit. This is comedy gold.

> and Musk has posted again. I don't wanna post offtopic but i just loaded this tweet in normal twitter and loading the replies made me hit the new limit. This is comedy gold.
segamaniac101 commented 2023-07-01 19:22:26 -04:00 (Migrated from github.com)

Maybe not of any use, but this extension is helping tweets load on chromium based browsers for logged in users. Perhaps this extension's source code could lead a clue? https://github.com/dimdenGD/OldTwitter

Maybe not of any use, but this extension is helping tweets load on chromium based browsers for logged in users. Perhaps this extension's source code could lead a clue? https://github.com/dimdenGD/OldTwitter
0xAB51NTH commented 2023-07-01 19:55:31 -04:00 (Migrated from github.com)

I don't see it mentioned but tweetdeck for some reason lets you to view posts and comment when above the limit, you cant see profiles and their contents tho, only your feed.

I don't see it mentioned but tweetdeck for some reason lets you to view posts and comment when above the limit, you cant see profiles and their contents tho, only your feed.
devgaucho commented 2023-07-01 22:05:01 -04:00 (Migrated from github.com)

data from the last 48 hours from https://ciscorank.com/

https://i.imgur.com/BNavT4c.png

https://i.imgur.com/1gTba7q.png

https://i.imgur.com/uaQrUz0.png

data from the last 48 hours from https://ciscorank.com/ [![https://i.imgur.com/BNavT4c.png](https://i.imgur.com/BNavT4c.png)](https://ciscorank.com/s/twitter.com) [![https://i.imgur.com/1gTba7q.png](https://i.imgur.com/1gTba7q.png)](https://ciscorank.com/s/syndication.twitter.com) [![https://i.imgur.com/uaQrUz0.png](https://i.imgur.com/uaQrUz0.png)](https://ciscorank.com/s/nitter.net)
G2G2G2G commented 2023-07-01 22:54:20 -04:00 (Migrated from github.com)

@0xAB51NTH since github has no rate limit you can ctrl+f tweetdeck and see it was mentioned many times... only a few posts above yours

@0xAB51NTH since github has no rate limit you can ctrl+f tweetdeck and see it was mentioned many times... only a few posts above yours
mthmcalixto commented 2023-07-01 23:00:14 -04:00 (Migrated from github.com)

I found an alternative in a post on the internet:

https://syndication.twitter.com/srv/timeline-profile/screen-name/[name]

If he wanted to hide the data, I think he made a mistake!

I found an alternative in a post on the internet: https://syndication.twitter.com/srv/timeline-profile/screen-name/[name] If he wanted to hide the data, I think he made a mistake!
YJSoft commented 2023-07-01 23:02:35 -04:00 (Migrated from github.com)

@mthmcalixto

If this doesn't get reversed within the next couple of weeks I'll switch to using embeds as an emergency measure, but for now I'm just going to wait it out.

I appreciate the support everyone, it's amazing to see how many people use my little pet project. Nitter isn't going down without a fight.

Also using syndication addr is already discussed here several times...

@mthmcalixto > If this doesn't get reversed within the next couple of weeks I'll switch to using embeds as an emergency measure, but for now I'm just going to wait it out. > > I appreciate the support everyone, it's amazing to see how many people use my little pet project. Nitter isn't going down without a fight. Also using syndication addr is already discussed here several times...
mthmcalixto commented 2023-07-01 23:03:42 -04:00 (Migrated from github.com)

@mthmcalixto

If this doesn't get reversed within the next couple of weeks I'll switch to using embeds as an emergency measure, but for now I'm just going to wait it out.
I appreciate the support everyone, it's amazing to see how many people use my little pet project. Nitter isn't going down without a fight.

Also using syndication addr is already discussed here several times...

Any fork that takes the data?

> @mthmcalixto > > > If this doesn't get reversed within the next couple of weeks I'll switch to using embeds as an emergency measure, but for now I'm just going to wait it out. > > I appreciate the support everyone, it's amazing to see how many people use my little pet project. Nitter isn't going down without a fight. > > Also using syndication addr is already discussed here several times... Any fork that takes the data?
Jerroder commented 2023-07-02 06:40:45 -04:00 (Migrated from github.com)

It seems like there's still a way to see tweets without an account.

When posting a Twitter link on discord, there used to be a preview but it stopped working as soon as they made the change, I guess discord crawler is considered as "not logged in". However, when posting a link preceded with "vx" (i.e. https://vxtwitter.com/status/xxxx), there's still a preview. I'm not sure how they achieved that though.

It seems like there's still a way to see tweets without an account. When posting a Twitter link on discord, there used to be a preview but it stopped working as soon as they made the change, I guess discord crawler is considered as "not logged in". However, when posting a link preceded with "vx" (i.e. https://vxtwitter.com/status/xxxx), there's still a preview. I'm not sure how they achieved that though.
Write commented 2023-07-02 11:31:54 -04:00 (Migrated from github.com)

I found an alternative in a post on the internet:

https://syndication.twitter.com/srv/timeline-profile/screen-name/[name]

If he wanted to hide the data, I think he made a mistake!

This... this is beautiful 🥹

#!/usr/bin/python3

import requests
import re
import urllib

url  = "https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk"

with urllib.request.urlopen(url) as response:
    encoding = response.info().get_param('charset', 'utf8')
    html = response.read().decode(encoding)
    result = re.search('script id="__NEXT_DATA__" type="application\/json">([^>]*)<\/script>', html)[1]

    print(result)

Returns

{
  "props": {
    "pageProps": {
      "contextProvider": {
        "features": {},
        "scribeData": {
          "client_version": null,
          "dnt": false,
          "widget_id": "embed-0",
          "widget_origin": "",
          "widget_frame": "",
          "widget_partner": "",
          "widget_site_screen_name": "",
          "widget_site_user_id": "",
          "widget_creator_screen_name": "",
          "widget_creator_user_id": "",
          "widget_iframe_version": "bb06567:1687853948269",
          "widget_data_source": "screen-name:elonmusk",
          "session_id": ""
        },
        "messengerContext": {
          "embedId": "embed-0"
        },
        "hasResults": true,
        "lang": "en",
        "theme": "light"
      },
      "lang": "en",
      "maxHeight": null,
      "showHeader": true,
      "hideBorder": false,
      "hideFooter": false,
      "hideScrollBar": false,
      "transparent": false,
      "timeline": {
        "entries": [
          {
            "type": "tweet",
            "entry_id": "tweet-1675390796718014464",
            "sort_index": "1675390796718014464",
            "content": {
              "tweet": {
                "id": 0,
                "location": "",
                "conversation_id_str": "1675187969420828672",
                "created_at": "Sun Jul 02 06:27:47 +0000 2023",
                "display_text_range": [
                  0,
                  73
                ],
                "entities": {
                  "user_mentions": [],
                  "urls": [],
                  "hashtags": [],
                  "symbols": [],
                  "media": []
                },
                "favorite_count": 35676,
                "favorited": false,
                "full_text": "In yet another exercise in irony, this post achieved a record view count!",
                "id_str": "1675390796718014464",
                "in_reply_to_name": "elonmusk",
                "in_reply_to_screen_name": "elonmusk",
                "in_reply_to_status_id_str": "1675187969420828672",
                "in_reply_to_user_id_str": "44196397",
                "lang": "en",
                "permalink": "/elonmusk/status/1675390796718014464",
                "possibly_sensitive": false,
                "quote_count": 6310,
                "reply_count": 7417,
                "retweet_count": 3055,
                "retweeted": false,
                "text": "In yet another exercise in irony, this post achieved a record view count!",
                "user": {
                  "blocking": false,
                  "created_at": "Tue Jun 02 20:12:29 +0000 2009",
                  "default_profile": false,
                  "default_profile_image": false,
                  "description": "",
                  "entities": {
                    "description": {
                      "urls": []
                    },
                    "url": {}
                  },
                  "fast_followers_count": 0,
                  "favourites_count": 26835,
                  "follow_request_sent": false,
                  "followed_by": false,
                  "followers_count": 146178794,
                  "following": false,
                  "friends_count": 341,
                  "has_custom_timelines": false,
                  "highlightedLabel": {
                    "badge": {
                      "url": "https://pbs.twimg.com/profile_images/1488548719062654976/u6qfBBkF_bigger.jpg"
                    },
                    "description": "Twitter",
                    "userLabelType": "BusinessLabel",
                    "userLabelDisplayType": "Badge"
                  },
                  "id": 0,
                  "id_str": "44196397",
                  "is_translator": false,
                  "listed_count": 125551,
                  "location": "",
                  "media_count": 1605,
                  "name": "Elon Musk",
                  "normal_followers_count": 146178794,
                  "notifications": false,
                  "profile_banner_url": "https://pbs.twimg.com/profile_banners/44196397/1576183471",
                  "profile_image_url_https": "https://pbs.twimg.com/profile_images/1590968738358079488/IY9Gx6Ok_normal.jpg",
                  "protected": false,
                  "screen_name": "elonmusk",
                  "show_all_inline_media": false,
                  "statuses_count": 27556,
                  "time_zone": "",
                  "translator_type": "none",
                  "url": "",
                  "utc_offset": 0,
                  "verified": false,
                  "withheld_in_countries": [],
                  "withheld_scope": "",
                  "is_blue_verified": true
                }
              }
            }
          },
          {
            "type": "tweet",
            "entry_id": "tweet-1675365001836593154",
            "sort_index": "1675365001836593154",
            "content": {
              "tweet": {
                "id": 0,
                "location": "",
                "conversation_id_str": "1675365001836593154",
                "created_at": "Sun Jul 02 04:45:17 +0000 2023",
                "display_text_range": [
                  0,
                  89
                ],
                "entities": {
[...]

Actual full result : https://bin.socialspill.com/ariruqiq.json

> I found an alternative in a post on the internet: > > [https://syndication.twitter.com/srv/timeline-profile/screen-name/[name]](https://syndication.twitter.com/srv/timeline-profile/screen-name/%5Bname%5D) > > If he wanted to hide the data, I think he made a mistake! This... this is beautiful 🥹 ```python #!/usr/bin/python3 import requests import re import urllib url = "https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk" with urllib.request.urlopen(url) as response: encoding = response.info().get_param('charset', 'utf8') html = response.read().decode(encoding) result = re.search('script id="__NEXT_DATA__" type="application\/json">([^>]*)<\/script>', html)[1] print(result) ``` Returns ```json { "props": { "pageProps": { "contextProvider": { "features": {}, "scribeData": { "client_version": null, "dnt": false, "widget_id": "embed-0", "widget_origin": "", "widget_frame": "", "widget_partner": "", "widget_site_screen_name": "", "widget_site_user_id": "", "widget_creator_screen_name": "", "widget_creator_user_id": "", "widget_iframe_version": "bb06567:1687853948269", "widget_data_source": "screen-name:elonmusk", "session_id": "" }, "messengerContext": { "embedId": "embed-0" }, "hasResults": true, "lang": "en", "theme": "light" }, "lang": "en", "maxHeight": null, "showHeader": true, "hideBorder": false, "hideFooter": false, "hideScrollBar": false, "transparent": false, "timeline": { "entries": [ { "type": "tweet", "entry_id": "tweet-1675390796718014464", "sort_index": "1675390796718014464", "content": { "tweet": { "id": 0, "location": "", "conversation_id_str": "1675187969420828672", "created_at": "Sun Jul 02 06:27:47 +0000 2023", "display_text_range": [ 0, 73 ], "entities": { "user_mentions": [], "urls": [], "hashtags": [], "symbols": [], "media": [] }, "favorite_count": 35676, "favorited": false, "full_text": "In yet another exercise in irony, this post achieved a record view count!", "id_str": "1675390796718014464", "in_reply_to_name": "elonmusk", "in_reply_to_screen_name": "elonmusk", "in_reply_to_status_id_str": "1675187969420828672", "in_reply_to_user_id_str": "44196397", "lang": "en", "permalink": "/elonmusk/status/1675390796718014464", "possibly_sensitive": false, "quote_count": 6310, "reply_count": 7417, "retweet_count": 3055, "retweeted": false, "text": "In yet another exercise in irony, this post achieved a record view count!", "user": { "blocking": false, "created_at": "Tue Jun 02 20:12:29 +0000 2009", "default_profile": false, "default_profile_image": false, "description": "", "entities": { "description": { "urls": [] }, "url": {} }, "fast_followers_count": 0, "favourites_count": 26835, "follow_request_sent": false, "followed_by": false, "followers_count": 146178794, "following": false, "friends_count": 341, "has_custom_timelines": false, "highlightedLabel": { "badge": { "url": "https://pbs.twimg.com/profile_images/1488548719062654976/u6qfBBkF_bigger.jpg" }, "description": "Twitter", "userLabelType": "BusinessLabel", "userLabelDisplayType": "Badge" }, "id": 0, "id_str": "44196397", "is_translator": false, "listed_count": 125551, "location": "", "media_count": 1605, "name": "Elon Musk", "normal_followers_count": 146178794, "notifications": false, "profile_banner_url": "https://pbs.twimg.com/profile_banners/44196397/1576183471", "profile_image_url_https": "https://pbs.twimg.com/profile_images/1590968738358079488/IY9Gx6Ok_normal.jpg", "protected": false, "screen_name": "elonmusk", "show_all_inline_media": false, "statuses_count": 27556, "time_zone": "", "translator_type": "none", "url": "", "utc_offset": 0, "verified": false, "withheld_in_countries": [], "withheld_scope": "", "is_blue_verified": true } } } }, { "type": "tweet", "entry_id": "tweet-1675365001836593154", "sort_index": "1675365001836593154", "content": { "tweet": { "id": 0, "location": "", "conversation_id_str": "1675365001836593154", "created_at": "Sun Jul 02 04:45:17 +0000 2023", "display_text_range": [ 0, 89 ], "entities": { [...] ``` Actual full result : https://bin.socialspill.com/ariruqiq.json
maddsua commented 2023-07-02 11:45:15 -04:00 (Migrated from github.com)

The Musk strikes again. I'm genuinely surprised that Tesla and SpaceX are still afloat with such a moron of a CEO.
At this point I start thinking that creating not so sophisticated Twitter alternative and deploying it to the cheapest DO droplet would be a viable business plan.
I dunno, it's just frustration at this point. A whatever-billion-dollar company can't pay for it's hosting, bruh.

The Musk strikes again. I'm genuinely surprised that Tesla and SpaceX are still afloat with such a moron of a CEO. At this point I start thinking that creating not so sophisticated Twitter alternative and deploying it to the cheapest DO droplet would be a viable business plan. I dunno, it's just frustration at this point. A whatever-billion-dollar company can't pay for it's hosting, bruh.
maddsua commented 2023-07-02 11:53:26 -04:00 (Migrated from github.com)

i don't particularly know how nitter scrapes, but i'm able to see tweets and profiles in my browser by setting the useragent to "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Actually I tried that half an hour ago and it didn't work either. But somehow, Google is still able to get new tweets to the news feed. Sus.

> i don't particularly know how nitter scrapes, but i'm able to see tweets and profiles in my browser by setting the useragent to "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" Actually I tried that half an hour ago and it didn't work either. But somehow, Google is still able to get new tweets to the news feed. Sus.
User123698745 commented 2023-07-02 11:59:16 -04:00 (Migrated from github.com)
> I found an alternative in a post on the internet: > > [https://syndication.twitter.com/srv/timeline-profile/screen-name/[name]](https://syndication.twitter.com/srv/timeline-profile/screen-name/%5Bname%5D) > > If he wanted to hide the data, I think he made a mistake! That url is used in the embedded widgets, which continue to work (for now). **Tweet** Documentation: https://developer.twitter.com/en/docs/twitter-for-websites/embedded-tweets/overview Example: https://platform.twitter.com/embed/Tweet.html?id=463440424141459456 **Profile Timeline** Documentation: https://developer.twitter.com/en/docs/twitter-for-websites/timelines/guides/profile-timeline Example: https://syndication.twitter.com/srv/timeline-profile/screen-name/TwitterDev **List Timeline** Documentation: https://developer.twitter.com/en/docs/twitter-for-websites/timelines/guides/list-timeline Example: https://syndication.twitter.com/srv/timeline-list/screen-name/TwitterDev/slug/national-parks
YoelRodriru commented 2023-07-02 12:06:14 -04:00 (Migrated from github.com)

The Musk strikes again. I'm genuinely surprised that Tesla and SpaceX are still afloat with such a moron of a CEO. At this point I start thinking that creating not so sophisticated Twitter alternative and deploying it to the cheapest DO droplet would be a viable business plan. I dunno, it's just frustration at this point. A whatever-billion-dollar company can't pay for it's hosting, bruh.

Tesla is on its way

> The Musk strikes again. I'm genuinely surprised that Tesla and SpaceX are still afloat with such a moron of a CEO. At this point I start thinking that creating not so sophisticated Twitter alternative and deploying it to the cheapest DO droplet would be a viable business plan. I dunno, it's just frustration at this point. A whatever-billion-dollar company can't pay for it's hosting, bruh. Tesla is on its way
canbringyouback commented 2023-07-02 12:12:13 -04:00 (Migrated from github.com)

The Musk strikes again. I'm genuinely surprised that Tesla and SpaceX are still afloat with such a moron of a CEO.

There are competent people (executives etc.)between him and day-to-day operation of those two companies. With Twitter it seem he is shouting into senior engineers's ears.

> The Musk strikes again. I'm genuinely surprised that Tesla and SpaceX are still afloat with such a moron of a CEO. > There are competent people (executives etc.)between him and day-to-day operation of those two companies. With Twitter it seem he is shouting into senior engineers's ears.
unixfox commented 2023-07-02 12:56:48 -04:00 (Migrated from github.com)

i don't particularly know how nitter scrapes, but i'm able to see tweets and profiles in my browser by setting the useragent to "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Actually I tried that half an hour ago and it didn't work either. But somehow, Google is still able to get new tweets to the news feed. Sus.

Twitter can also just allow the traffic only from the well known IPs of google bot. It's publicly listed

> > i don't particularly know how nitter scrapes, but i'm able to see tweets and profiles in my browser by setting the useragent to "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" > > Actually I tried that half an hour ago and it didn't work either. But somehow, Google is still able to get new tweets to the news feed. Sus. Twitter can also just allow the traffic only from the well known IPs of google bot. It's publicly listed
maddsua commented 2023-07-02 13:05:11 -04:00 (Migrated from github.com)

i don't particularly know how nitter scrapes, but i'm able to see tweets and profiles in my browser by setting the useragent to "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Actually I tried that half an hour ago and it didn't work either. But somehow, Google is still able to get new tweets to the news feed. Sus.

Twitter can also just allow the traffic only from the well known IPs of google bot. It's publicly listed

I mean... It's totally an option for them

> > > i don't particularly know how nitter scrapes, but i'm able to see tweets and profiles in my browser by setting the useragent to "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" > > > > > > Actually I tried that half an hour ago and it didn't work either. But somehow, Google is still able to get new tweets to the news feed. Sus. > > Twitter can also just allow the traffic only from the well known IPs of google bot. It's publicly listed I mean... It's totally an option for them
ImTheDeveloper commented 2023-07-02 13:12:36 -04:00 (Migrated from github.com)

NEXT_DATA

Yep! got it working like this also.
image

Grab the content of the script tag, do some decoding and return it as JSON response to my request...
image

Dirty prototype in node-red you can import in to visually see whats going on:

[{"id":"6e6bc092885be623","type":"json","z":"f6f2187d.f17ca8","name":"","property":"payload","action":"","pretty":false,"x":1070,"y":340,"wires":[["8b176c7d37cb03ea","fc591f610fe3a4e1"]]},{"id":"7e5d901ca520f39b","type":"function","z":"f6f2187d.f17ca8","name":"function 1","func":"const parsedPayload = msg.payload\nconst firstPayload = parsedPayload[0];\nconst decodedPayload = he.decode(firstPayload);\nmsg.payload = decodedPayload\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"he","module":"he"}],"x":900,"y":340,"wires":[["6e6bc092885be623"]]},{"id":"8b176c7d37cb03ea","type":"debug","z":"f6f2187d.f17ca8","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1240,"y":340,"wires":[]},{"id":"fc591f610fe3a4e1","type":"http response","z":"f6f2187d.f17ca8","name":"","statusCode":"","headers":{},"x":1170,"y":440,"wires":[]},{"id":"081c3f47b9f93a7b","type":"html","z":"f6f2187d.f17ca8","name":"","property":"payload","outproperty":"payload","tag":"script#__NEXT_DATA__","ret":"html","as":"single","x":690,"y":340,"wires":[["7e5d901ca520f39b"]]},{"id":"87fa9b636188d38b","type":"http request","z":"f6f2187d.f17ca8","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://syndication.twitter.com/srv/timeline-profile/screen-name/{{{req.params.user}}}","tls":"","persist":true,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":430,"y":340,"wires":[["081c3f47b9f93a7b"]]},{"id":"10385e3c19480452","type":"inject","z":"f6f2187d.f17ca8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":340,"wires":[["87fa9b636188d38b"]]},{"id":"fd695068b87f4dc5","type":"http in","z":"f6f2187d.f17ca8","name":"","url":"/twitter/:user","method":"get","upload":false,"swaggerDoc":"","x":240,"y":440,"wires":[["87fa9b636188d38b"]]}]
> __NEXT_DATA__ Yep! got it working like this also. ![image](https://github.com/zedeus/nitter/assets/1431348/333a7b1d-5350-490c-8df7-797c11fcadc5) Grab the content of the script tag, do some decoding and return it as JSON response to my request... ![image](https://github.com/zedeus/nitter/assets/1431348/ac2883b2-38c4-49fa-bc05-a30c5df87069) Dirty prototype in node-red you can import in to visually see whats going on: ``` [{"id":"6e6bc092885be623","type":"json","z":"f6f2187d.f17ca8","name":"","property":"payload","action":"","pretty":false,"x":1070,"y":340,"wires":[["8b176c7d37cb03ea","fc591f610fe3a4e1"]]},{"id":"7e5d901ca520f39b","type":"function","z":"f6f2187d.f17ca8","name":"function 1","func":"const parsedPayload = msg.payload\nconst firstPayload = parsedPayload[0];\nconst decodedPayload = he.decode(firstPayload);\nmsg.payload = decodedPayload\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"he","module":"he"}],"x":900,"y":340,"wires":[["6e6bc092885be623"]]},{"id":"8b176c7d37cb03ea","type":"debug","z":"f6f2187d.f17ca8","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1240,"y":340,"wires":[]},{"id":"fc591f610fe3a4e1","type":"http response","z":"f6f2187d.f17ca8","name":"","statusCode":"","headers":{},"x":1170,"y":440,"wires":[]},{"id":"081c3f47b9f93a7b","type":"html","z":"f6f2187d.f17ca8","name":"","property":"payload","outproperty":"payload","tag":"script#__NEXT_DATA__","ret":"html","as":"single","x":690,"y":340,"wires":[["7e5d901ca520f39b"]]},{"id":"87fa9b636188d38b","type":"http request","z":"f6f2187d.f17ca8","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://syndication.twitter.com/srv/timeline-profile/screen-name/{{{req.params.user}}}","tls":"","persist":true,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":430,"y":340,"wires":[["081c3f47b9f93a7b"]]},{"id":"10385e3c19480452","type":"inject","z":"f6f2187d.f17ca8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":340,"wires":[["87fa9b636188d38b"]]},{"id":"fd695068b87f4dc5","type":"http in","z":"f6f2187d.f17ca8","name":"","url":"/twitter/:user","method":"get","upload":false,"swaggerDoc":"","x":240,"y":440,"wires":[["87fa9b636188d38b"]]}] ```
holdit commented 2023-07-02 14:28:03 -04:00 (Migrated from github.com)

Google needs to start applying their own rules to these big sites.

If the average site displays different content to Google and to users, it gets penalised/removed from search results. They must do the same thing to Twitter and Reddit. Hit them where it hurts.

Google needs to start applying their own rules to these big sites. If the average site displays different content to Google and to users, it gets penalised/removed from search results. They must do the same thing to Twitter and Reddit. Hit them where it hurts.
Jerroder commented 2023-07-02 14:38:25 -04:00 (Migrated from github.com)

They must do the same thing to Twitter and Reddit. Hit them where it hurts.

They were crying because subreddit blackouts made search results worse, that's surely never gonna happen.

> They must do the same thing to Twitter and Reddit. Hit them where it hurts. They were crying because subreddit blackouts made search results worse, that's surely never gonna happen.
mthmcalixto commented 2023-07-02 17:33:43 -04:00 (Migrated from github.com)

I found an alternative in a post on the internet:

https://syndication.twitter.com/srv/timeline-profile/screen-name/[name]

If he wanted to hide the data, I think he made a mistake!

I think one of the staff or Elon is reading our comments lol

Screenshot_12

> I found an alternative in a post on the internet: > > [https://syndication.twitter.com/srv/timeline-profile/screen-name/[name]](https://syndication.twitter.com/srv/timeline-profile/screen-name/%5Bname%5D) > > If he wanted to hide the data, I think he made a mistake! I think one of the staff or Elon is reading our comments lol ![Screenshot_12](https://github.com/zedeus/nitter/assets/121470728/ae861f08-9cc2-4e07-a373-1dda9c059e1f)
frepke commented 2023-07-02 17:36:38 -04:00 (Migrated from github.com)

bird.makeup still working

bird.makeup still working
nukeop commented 2023-07-02 18:08:31 -04:00 (Migrated from github.com)

It is trivial to completely defeat scrapers with no funding that power nitter. Nitter operates entirely at Twitter's pleasure.

It is trivial to completely defeat scrapers with no funding that power nitter. Nitter operates entirely at Twitter's pleasure.
nerra0pos commented 2023-07-02 19:21:57 -04:00 (Migrated from github.com)

I found an alternative in a post on the internet:

https://syndication.twitter.com/srv/timeline-profile/screen-name/[name]

If he wanted to hide the data, I think he made a mistake!

Now appears to be gone as well. Not working anymore.

> I found an alternative in a post on the internet: > > [https://syndication.twitter.com/srv/timeline-profile/screen-name/[name]](https://syndication.twitter.com/srv/timeline-profile/screen-name/%5Bname%5D) > > If he wanted to hide the data, I think he made a mistake! Now appears to be gone as well. Not working anymore.
FoxBlocks commented 2023-07-02 19:26:24 -04:00 (Migrated from github.com)

Now appears to be gone as well. Not working anymore.

It started working again for me just now.
EDIT: It stopped again. It fluctuates :\

> Now appears to be gone as well. Not working anymore. It started working again for me just now. EDIT: It stopped again. It fluctuates :\
IvanTrendafilov commented 2023-07-02 19:30:53 -04:00 (Migrated from github.com)

That particular endpoint seems to be appearing / disappearing in the last few hours. I'm guessing someone's actively working to remove it.

That particular endpoint seems to be appearing / disappearing in the last few hours. I'm guessing someone's actively working to remove it.
Write commented 2023-07-02 20:00:26 -04:00 (Migrated from github.com)

RIP syndication 🪽

RIP syndication 🪽
devgaucho commented 2023-07-02 20:44:22 -04:00 (Migrated from github.com)

I found an alternative in a post on the internet:
https://syndication.twitter.com/srv/timeline-profile/screen-name/[name]
If he wanted to hide the data, I think he made a mistake!

This... this is beautiful 🥹

#!/usr/bin/python3

import requests
import re
import urllib

url  = "https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk"

with urllib.request.urlopen(url) as response:
    encoding = response.info().get_param('charset', 'utf8')
    html = response.read().decode(encoding)
    result = re.search('script id="__NEXT_DATA__" type="application\/json">([^>]*)<\/script>', html)[1]

    print(result)

Returns

{
  "props": {
    "pageProps": {
      "contextProvider": {
        "features": {},
        "scribeData": {
          "client_version": null,
          "dnt": false,
          "widget_id": "embed-0",
          "widget_origin": "",
          "widget_frame": "",
          "widget_partner": "",
          "widget_site_screen_name": "",
          "widget_site_user_id": "",
          "widget_creator_screen_name": "",
          "widget_creator_user_id": "",
          "widget_iframe_version": "bb06567:1687853948269",
          "widget_data_source": "screen-name:elonmusk",
          "session_id": ""
        },
        "messengerContext": {
          "embedId": "embed-0"
        },
        "hasResults": true,
        "lang": "en",
        "theme": "light"
      },
      "lang": "en",
      "maxHeight": null,
      "showHeader": true,
      "hideBorder": false,
      "hideFooter": false,
      "hideScrollBar": false,
      "transparent": false,
      "timeline": {
        "entries": [
          {
            "type": "tweet",
            "entry_id": "tweet-1675390796718014464",
            "sort_index": "1675390796718014464",
            "content": {
              "tweet": {
                "id": 0,
                "location": "",
                "conversation_id_str": "1675187969420828672",
                "created_at": "Sun Jul 02 06:27:47 +0000 2023",
                "display_text_range": [
                  0,
                  73
                ],
                "entities": {
                  "user_mentions": [],
                  "urls": [],
                  "hashtags": [],
                  "symbols": [],
                  "media": []
                },
                "favorite_count": 35676,
                "favorited": false,
                "full_text": "In yet another exercise in irony, this post achieved a record view count!",
                "id_str": "1675390796718014464",
                "in_reply_to_name": "elonmusk",
                "in_reply_to_screen_name": "elonmusk",
                "in_reply_to_status_id_str": "1675187969420828672",
                "in_reply_to_user_id_str": "44196397",
                "lang": "en",
                "permalink": "/elonmusk/status/1675390796718014464",
                "possibly_sensitive": false,
                "quote_count": 6310,
                "reply_count": 7417,
                "retweet_count": 3055,
                "retweeted": false,
                "text": "In yet another exercise in irony, this post achieved a record view count!",
                "user": {
                  "blocking": false,
                  "created_at": "Tue Jun 02 20:12:29 +0000 2009",
                  "default_profile": false,
                  "default_profile_image": false,
                  "description": "",
                  "entities": {
                    "description": {
                      "urls": []
                    },
                    "url": {}
                  },
                  "fast_followers_count": 0,
                  "favourites_count": 26835,
                  "follow_request_sent": false,
                  "followed_by": false,
                  "followers_count": 146178794,
                  "following": false,
                  "friends_count": 341,
                  "has_custom_timelines": false,
                  "highlightedLabel": {
                    "badge": {
                      "url": "https://pbs.twimg.com/profile_images/1488548719062654976/u6qfBBkF_bigger.jpg"
                    },
                    "description": "Twitter",
                    "userLabelType": "BusinessLabel",
                    "userLabelDisplayType": "Badge"
                  },
                  "id": 0,
                  "id_str": "44196397",
                  "is_translator": false,
                  "listed_count": 125551,
                  "location": "",
                  "media_count": 1605,
                  "name": "Elon Musk",
                  "normal_followers_count": 146178794,
                  "notifications": false,
                  "profile_banner_url": "https://pbs.twimg.com/profile_banners/44196397/1576183471",
                  "profile_image_url_https": "https://pbs.twimg.com/profile_images/1590968738358079488/IY9Gx6Ok_normal.jpg",
                  "protected": false,
                  "screen_name": "elonmusk",
                  "show_all_inline_media": false,
                  "statuses_count": 27556,
                  "time_zone": "",
                  "translator_type": "none",
                  "url": "",
                  "utc_offset": 0,
                  "verified": false,
                  "withheld_in_countries": [],
                  "withheld_scope": "",
                  "is_blue_verified": true
                }
              }
            }
          },
          {
            "type": "tweet",
            "entry_id": "tweet-1675365001836593154",
            "sort_index": "1675365001836593154",
            "content": {
              "tweet": {
                "id": 0,
                "location": "",
                "conversation_id_str": "1675365001836593154",
                "created_at": "Sun Jul 02 04:45:17 +0000 2023",
                "display_text_range": [
                  0,
                  89
                ],
                "entities": {
[...]

Actual full result : https://bin.socialspill.com/ariruqiq.json

guilty? 🤦‍♂️

> > I found an alternative in a post on the internet: > > [https://syndication.twitter.com/srv/timeline-profile/screen-name/[name]](https://syndication.twitter.com/srv/timeline-profile/screen-name/%5Bname%5D) > > If he wanted to hide the data, I think he made a mistake! > > This... this is beautiful 🥹 > > ```python > #!/usr/bin/python3 > > import requests > import re > import urllib > > url = "https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk" > > with urllib.request.urlopen(url) as response: > encoding = response.info().get_param('charset', 'utf8') > html = response.read().decode(encoding) > result = re.search('script id="__NEXT_DATA__" type="application\/json">([^>]*)<\/script>', html)[1] > > print(result) > ``` > > Returns > > ```json > { > "props": { > "pageProps": { > "contextProvider": { > "features": {}, > "scribeData": { > "client_version": null, > "dnt": false, > "widget_id": "embed-0", > "widget_origin": "", > "widget_frame": "", > "widget_partner": "", > "widget_site_screen_name": "", > "widget_site_user_id": "", > "widget_creator_screen_name": "", > "widget_creator_user_id": "", > "widget_iframe_version": "bb06567:1687853948269", > "widget_data_source": "screen-name:elonmusk", > "session_id": "" > }, > "messengerContext": { > "embedId": "embed-0" > }, > "hasResults": true, > "lang": "en", > "theme": "light" > }, > "lang": "en", > "maxHeight": null, > "showHeader": true, > "hideBorder": false, > "hideFooter": false, > "hideScrollBar": false, > "transparent": false, > "timeline": { > "entries": [ > { > "type": "tweet", > "entry_id": "tweet-1675390796718014464", > "sort_index": "1675390796718014464", > "content": { > "tweet": { > "id": 0, > "location": "", > "conversation_id_str": "1675187969420828672", > "created_at": "Sun Jul 02 06:27:47 +0000 2023", > "display_text_range": [ > 0, > 73 > ], > "entities": { > "user_mentions": [], > "urls": [], > "hashtags": [], > "symbols": [], > "media": [] > }, > "favorite_count": 35676, > "favorited": false, > "full_text": "In yet another exercise in irony, this post achieved a record view count!", > "id_str": "1675390796718014464", > "in_reply_to_name": "elonmusk", > "in_reply_to_screen_name": "elonmusk", > "in_reply_to_status_id_str": "1675187969420828672", > "in_reply_to_user_id_str": "44196397", > "lang": "en", > "permalink": "/elonmusk/status/1675390796718014464", > "possibly_sensitive": false, > "quote_count": 6310, > "reply_count": 7417, > "retweet_count": 3055, > "retweeted": false, > "text": "In yet another exercise in irony, this post achieved a record view count!", > "user": { > "blocking": false, > "created_at": "Tue Jun 02 20:12:29 +0000 2009", > "default_profile": false, > "default_profile_image": false, > "description": "", > "entities": { > "description": { > "urls": [] > }, > "url": {} > }, > "fast_followers_count": 0, > "favourites_count": 26835, > "follow_request_sent": false, > "followed_by": false, > "followers_count": 146178794, > "following": false, > "friends_count": 341, > "has_custom_timelines": false, > "highlightedLabel": { > "badge": { > "url": "https://pbs.twimg.com/profile_images/1488548719062654976/u6qfBBkF_bigger.jpg" > }, > "description": "Twitter", > "userLabelType": "BusinessLabel", > "userLabelDisplayType": "Badge" > }, > "id": 0, > "id_str": "44196397", > "is_translator": false, > "listed_count": 125551, > "location": "", > "media_count": 1605, > "name": "Elon Musk", > "normal_followers_count": 146178794, > "notifications": false, > "profile_banner_url": "https://pbs.twimg.com/profile_banners/44196397/1576183471", > "profile_image_url_https": "https://pbs.twimg.com/profile_images/1590968738358079488/IY9Gx6Ok_normal.jpg", > "protected": false, > "screen_name": "elonmusk", > "show_all_inline_media": false, > "statuses_count": 27556, > "time_zone": "", > "translator_type": "none", > "url": "", > "utc_offset": 0, > "verified": false, > "withheld_in_countries": [], > "withheld_scope": "", > "is_blue_verified": true > } > } > } > }, > { > "type": "tweet", > "entry_id": "tweet-1675365001836593154", > "sort_index": "1675365001836593154", > "content": { > "tweet": { > "id": 0, > "location": "", > "conversation_id_str": "1675365001836593154", > "created_at": "Sun Jul 02 04:45:17 +0000 2023", > "display_text_range": [ > 0, > 89 > ], > "entities": { > [...] > ``` > > Actual full result : https://bin.socialspill.com/ariruqiq.json guilty? 🤦‍♂️
GhbSmwc commented 2023-07-02 21:12:55 -04:00 (Migrated from github.com)

@sunlightspectre

One wonders what will happen when these self-inflicted stab-wounds deplete 'profit' rather then generate it?.. Removing access isn't going to make people want to use a site more. And it certainly won't inflate user numbers, which I'd imagine is the end goal.

C'est la vie.

I'm glad I got to experience the internet as it was.

Totally agreed. Login-walling even to a public post (set public by the user) is the most stupidest move I ever seen. Because it is no longer public, this won't be visible to search engine indexing/crawling. This means any user searching for X won't be seeing any twitter posts on, say google search results. Tweeters will now have a hard time gaining an audience, especially artists.

@sunlightspectre > One wonders what will happen when these self-inflicted stab-wounds deplete 'profit' rather then generate it?.. Removing access isn't going to make people want to use a site _more._ And it certainly won't inflate user numbers, which I'd imagine is the end goal. > > C'est la vie. > > I'm glad I got to experience the internet as it was. Totally agreed. Login-walling even to a public post (set public by the user) is the most stupidest move I ever seen. Because it is no longer public, this won't be visible to search engine indexing/crawling. This means any user searching for X won't be seeing any twitter posts on, say google search results. Tweeters will now have a hard time gaining an audience, especially artists.
devgaucho commented 2023-07-02 21:23:51 -04:00 (Migrated from github.com)

@sunlightspectre

One wonders what will happen when these self-inflicted stab-wounds deplete 'profit' rather then generate it?.. Removing access isn't going to make people want to use a site more. And it certainly won't inflate user numbers, which I'd imagine is the end goal.
C'est la vie.
I'm glad I got to experience the internet as it was.

Totally agreed. Login-walling even to a public post (set public by the user) is the most stupidest move I ever seen. Because it is no longer public, this won't be visible to search engine indexing/crawling. This means any user searching for X won't be seeing any twitter posts on, say google search results. Tweeters will now have a hard time gaining an audience, especially artists.

googlebot have free pass to twitter

> @sunlightspectre > > > One wonders what will happen when these self-inflicted stab-wounds deplete 'profit' rather then generate it?.. Removing access isn't going to make people want to use a site _more._ And it certainly won't inflate user numbers, which I'd imagine is the end goal. > > C'est la vie. > > I'm glad I got to experience the internet as it was. > > Totally agreed. Login-walling even to a public post (set public by the user) is the most stupidest move I ever seen. Because it is no longer public, this won't be visible to search engine indexing/crawling. This means any user searching for X won't be seeing any twitter posts on, say google search results. Tweeters will now have a hard time gaining an audience, especially artists. googlebot have free pass to twitter
GhbSmwc commented 2023-07-02 21:30:35 -04:00 (Migrated from github.com)

@devgaucho can that be used to bypass login walls as well as archiving?

@devgaucho can that be used to bypass login walls as well as archiving?
RoonMoonlight commented 2023-07-02 21:49:24 -04:00 (Migrated from github.com)

Guys the syndication.twitter.com embed method works again

Guys the syndication.twitter.com embed method works again
Write commented 2023-07-02 21:56:51 -04:00 (Migrated from github.com)

Guys the syndication.twitter.com embed method works again

Thanks for the information.!

> Guys the syndication.twitter.com embed method works again Thanks for the information.!
Tourfaint commented 2023-07-02 22:28:22 -04:00 (Migrated from github.com)

List Timeline Documentation: https://developer.twitter.com/en/docs/twitter-for-websites/timelines/guides/list-timeline Example: https://syndication.twitter.com/srv/timeline-list/screen-name/TwitterDev/slug/national-parks

This is probably a dumb question, but what if a list has a space in the name? I can't get my list to show up this way. I tried a dash (-) an underscore and a regular space/ %20 and it all shows up as the list not existing. Not really sure about the rules about case sensitivity as well. Is there a maybe a way to extract the proper list name and user name from the lists' ID?

> **List Timeline** Documentation: https://developer.twitter.com/en/docs/twitter-for-websites/timelines/guides/list-timeline Example: https://syndication.twitter.com/srv/timeline-list/screen-name/TwitterDev/slug/national-parks This is probably a dumb question, but what if a list has a space in the name? I can't get my list to show up this way. I tried a dash (-) an underscore and a regular space/ %20 and it all shows up as the list not existing. Not really sure about the rules about case sensitivity as well. Is there a maybe a way to extract the proper list name and user name from the lists' ID?
Write commented 2023-07-02 22:31:48 -04:00 (Migrated from github.com)

List Timeline Documentation: https://developer.twitter.com/en/docs/twitter-for-websites/timelines/guides/list-timeline Example: https://syndication.twitter.com/srv/timeline-list/screen-name/TwitterDev/slug/national-parks

This is probably a dumb question, but what if a list has a space in the name? I can't get my list to show up this way. I tried a dash (-) an underscore and a regular space/ %20 and it all shows up as the list not existing. Not really sure about the rules about case sensitivity as well.

When you hover go into a list on the website, there's an ID showing, simply replace the id instead of trying to find a working list-name. You of course have to match the screen-name associated to that list.

> > **List Timeline** Documentation: https://developer.twitter.com/en/docs/twitter-for-websites/timelines/guides/list-timeline Example: https://syndication.twitter.com/srv/timeline-list/screen-name/TwitterDev/slug/national-parks > > This is probably a dumb question, but what if a list has a space in the name? I can't get my list to show up this way. I tried a dash (-) an underscore and a regular space/ %20 and it all shows up as the list not existing. Not really sure about the rules about case sensitivity as well. When you hover go into a list on the website, there's an ID showing, simply replace the id instead of trying to find a working list-name. You of course have to match the screen-name associated to that list.
Tourfaint commented 2023-07-02 22:35:36 -04:00 (Migrated from github.com)

simply replace the id instead of trying to find a working list-name.

Are you sure? I tried it with the example national parks links, where the list id shows up as 715919216927322112 (i assume this is the id, am i correct? The lists url is https://twitter.com/i/lists/715919216927322112 so i assume the number is the id) but
https://syndication.twitter.com/srv/timeline-list/screen-name/TwitterDev/slug/715919216927322112
doesn't embed the list.
I'm pretty sure im being an idiot here, but i don't get it.
EDIT: Ok i just tried it on a random list instead of the national-parks one used in example and copying the ID does work, thank you so much <3

>simply replace the id instead of trying to find a working list-name. Are you sure? I tried it with the example national parks links, where the list id shows up as 715919216927322112 (i assume this is the id, am i correct? The lists url is https://twitter.com/i/lists/715919216927322112 so i assume the number is the id) but https://syndication.twitter.com/srv/timeline-list/screen-name/TwitterDev/slug/715919216927322112 doesn't embed the list. I'm pretty sure im being an idiot here, but i don't get it. EDIT: Ok i just tried it on a random list instead of the national-parks one used in example and copying the ID does work, thank you so much <3
Write commented 2023-07-02 22:36:21 -04:00 (Migrated from github.com)

Yup it doesn't work for this one but I tried for one of my list and it weirdly it works

Yup it doesn't work for this one but I tried for one of my list and it weirdly it works
Write commented 2023-07-02 22:38:56 -04:00 (Migrated from github.com)

Screenshot du 2023-07-03 à 04 38 19

For example I clicked on this list on the website : and then created this link : https://syndication.twitter.com/srv/timeline-list/screen-name/JeandronMathieu/slug/1434116675968831497
And it works. But I agree, sometimes it doesn't. Not sure why.

![Screenshot du 2023-07-03 à 04 38 19](https://github.com/zedeus/nitter/assets/541722/27138e9c-78fe-45d6-bdbe-c1985999f26a) For example I clicked on this list on the website : and then created this link : https://syndication.twitter.com/srv/timeline-list/screen-name/JeandronMathieu/slug/1434116675968831497 And it works. But I agree, sometimes it doesn't. Not sure why.
Tourfaint commented 2023-07-02 22:38:57 -04:00 (Migrated from github.com)

Tried in on a different list and it worked just as you said, sorry for being dumb, thank you Write. Weird it doesn't work for the list used in the example, though
Edit: Aand it's broken again, it loads the list correctly (as in, it reads the list name and author) but doesn't load the tweets, as if the list was empty. Elon must be playin whack a mole with us.

Tried in on a different list and it worked just as you said, sorry for being dumb, thank you Write. Weird it doesn't work for the list used in the example, though Edit: Aand it's broken again, it loads the list correctly (as in, it reads the list name and author) but doesn't load the tweets, as if the list was empty. Elon must be playin whack a mole with us.
Write commented 2023-07-02 22:43:12 -04:00 (Migrated from github.com)

Also it seems you can quite easily get your embeded link with the use of this page : https://publish.twitter.com/?query=https%3A%2F%2Ftwitter.com%2Fi%2Flists%2F1434116675968831497&widget=Timeline and just pasting your list url.

Also it seems you can quite easily get your embeded link with the use of this page : https://publish.twitter.com/?query=https%3A%2F%2Ftwitter.com%2Fi%2Flists%2F1434116675968831497&widget=Timeline and just pasting your list url.
nitsvga commented 2023-07-02 22:59:37 -04:00 (Migrated from github.com)
https://cdn.discordapp.com/attachments/874455648883052544/1125145584798548119/image.png
Write commented 2023-07-02 23:01:14 -04:00 (Migrated from github.com)
> https://cdn.discordapp.com/attachments/874455648883052544/1125145584798548119/image.png "Parse HTML with regex" I feel attacked
TempUser13 commented 2023-07-03 02:15:36 -04:00 (Migrated from github.com)

Has anyone built a tool to get an rss from a syndication link?

Has anyone built a tool to get an rss from a syndication link?
Mynacol commented 2023-07-03 02:31:18 -04:00 (Migrated from github.com)

Has anyone built a tool to get an rss from a syndication link?

@TempUser13 dvikan has linked to rss-bridge in this issue 🙈
https://github.com/zedeus/nitter/issues/919#issuecomment-1615253896

> Has anyone built a tool to get an rss from a syndication link? @TempUser13 dvikan has linked to rss-bridge in this issue 🙈 https://github.com/zedeus/nitter/issues/919#issuecomment-1615253896
ontheair81 commented 2023-07-03 03:22:03 -04:00 (Migrated from github.com)

Has anyone built a tool to get an rss from a syndication link?

@TempUser13 dvikan has linked to rss-bridge in this issue see_no_evil #919 (comment)

Looks like this instance (rss-bridge.org) is modified to be able to parse the syndication (git.twitter-fix-2.be59a1e).
I am running my own instance of rss-bridge with latest docker image (git.master.d8bc015). This is not working for syndication (yet).

> > Has anyone built a tool to get an rss from a syndication link? > > @TempUser13 dvikan has linked to rss-bridge in this issue see_no_evil [#919 (comment)](https://github.com/zedeus/nitter/issues/919#issuecomment-1615253896) Looks like this instance (rss-bridge.org) is modified to be able to parse the syndication (git.twitter-fix-2.be59a1e). I am running my own instance of rss-bridge with latest docker image (git.master.d8bc015). This is not working for syndication (yet).
dvikan commented 2023-07-03 03:44:46 -04:00 (Migrated from github.com)

Looks like this instance (rss-bridge.org) is modified to be able to parse the syndication (git.twitter-fix-2.be59a1e). I am running my own instance of rss-bridge with latest docker image (git.master.d8bc015). This is not working for syndication (yet).

the twitter issues might resolve itself by its own so im waiting a bit before merging to master.

do you want it merged asap?

> Looks like this instance (rss-bridge.org) is modified to be able to parse the syndication (git.twitter-fix-2.be59a1e). I am running my own instance of rss-bridge with latest docker image (git.master.d8bc015). This is not working for syndication (yet). the twitter issues might resolve itself by its own so im waiting a bit before merging to master. do you want it merged asap?
ontheair81 commented 2023-07-03 04:05:46 -04:00 (Migrated from github.com)

do you want it merged asap?

Thanks for offering, but I am not in a hurry. I switched a few of my RSS subscriptions now to rss-bridge.org instead of my own instance.

Having this fix merged would just be of interest for me, if also media content would be available via syndication, which seems not to be the case. Most of my subscriptions contain media, so this workaround will not work for me, regardless if it is on your or my instance.

the twitter issues might resolve itself by its own [...]

Fingers crossed!

> do you want it merged asap? Thanks for offering, but I am not in a hurry. I switched a few of my RSS subscriptions now to rss-bridge.org instead of my own instance. Having this fix merged would just be of interest for me, if also media content would be available via syndication, which seems not to be the case. Most of my subscriptions contain media, so this workaround will not work for me, regardless if it is on your or my instance. > the twitter issues might resolve itself by its own [...] Fingers crossed!
aleksusklim commented 2023-07-03 04:45:12 -04:00 (Migrated from github.com)

I wonder, will guys from https://github.com/DIYgod/RSSHub/issues/12732 switch to syndication too?
I used their instance for more than a year already. Currently some of feeds are working (probably cached), others are not.

I wonder, will guys from https://github.com/DIYgod/RSSHub/issues/12732 switch to syndication too? I used their instance for more than a year already. Currently some of feeds are working (probably cached), others are not.
edel79 commented 2023-07-03 07:23:08 -04:00 (Migrated from github.com)

OK so this is a source for the tweets. But you have to deal with that, know how to use it and how to integrate it to Nitter. And if the whole Nitter community use that source, not sure it will be working for a long time... due to a massive traffic increase.

OK so this is a source for the tweets. But you have to deal with that, know how to use it and how to integrate it to Nitter. And if the whole Nitter community use that source, not sure it will be working for a long time... due to a massive traffic increase.
x1ca3 commented 2023-07-03 08:24:32 -04:00 (Migrated from github.com)

you can add "showReplies" parameter to the syndication endpoint and will show the user tweet replies also
https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true

then to get more info about a tweet with just the tweet id you can use
https://syndication.twitter.com/tweet-result?id=1675214274627530754

you can add "showReplies" parameter to the syndication endpoint and will show the user tweet replies also https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true then to get more info about a tweet with just the tweet id you can use https://syndication.twitter.com/tweet-result?id=1675214274627530754
maddsua commented 2023-07-03 09:53:31 -04:00 (Migrated from github.com)

https://cdn.discordapp.com/attachments/874455648883052544/1125145584798548119/image.png

"Parse HTML with regex" I feel attacked

Sometimes that's not even a bad option 😉

> > https://cdn.discordapp.com/attachments/874455648883052544/1125145584798548119/image.png > > "Parse HTML with regex" I feel attacked Sometimes that's not even a bad option 😉
pozirk commented 2023-07-03 10:45:17 -04:00 (Migrated from github.com)

Looks like this instance (rss-bridge.org) is modified to be able to parse the syndication (git.twitter-fix-2.be59a1e). I am running my own instance of rss-bridge with latest docker image (git.master.d8bc015). This is not working for syndication (yet).

the twitter issues might resolve itself by its own so im waiting a bit before merging to master.

do you want it merged asap?

Syndication sometimes works, sometimes doesn't.
Right now, it is not working.
twitter_synd

> > Looks like this instance (rss-bridge.org) is modified to be able to parse the syndication (git.twitter-fix-2.be59a1e). I am running my own instance of rss-bridge with latest docker image (git.master.d8bc015). This is not working for syndication (yet). > > the twitter issues might resolve itself by its own so im waiting a bit before merging to master. > > do you want it merged asap? Syndication sometimes works, sometimes doesn't. Right now, it is not working. ![twitter_synd](https://github.com/zedeus/nitter/assets/1659590/4711a72e-b497-4e8b-91ad-ccaead2c527c)
saqib-ahmed commented 2023-07-03 11:35:05 -04:00 (Migrated from github.com)

Looks like this instance (rss-bridge.org) is modified to be able to parse the syndication (git.twitter-fix-2.be59a1e). I am running my own instance of rss-bridge with latest docker image (git.master.d8bc015). This is not working for syndication (yet).

the twitter issues might resolve itself by its own so im waiting a bit before merging to master.
do you want it merged asap?

Syndication sometimes works, sometimes doesn't. Right now, it is not working. twitter_synd

I'm getting this same issue. Thought my IP is blocked as I've been checking this link a lot, but VPN didn't help either. They seem to be on guard with this syndication thing.

> > > Looks like this instance (rss-bridge.org) is modified to be able to parse the syndication (git.twitter-fix-2.be59a1e). I am running my own instance of rss-bridge with latest docker image (git.master.d8bc015). This is not working for syndication (yet). > > > > > > the twitter issues might resolve itself by its own so im waiting a bit before merging to master. > > do you want it merged asap? > > Syndication sometimes works, sometimes doesn't. Right now, it is not working. ![twitter_synd](https://user-images.githubusercontent.com/1659590/250589429-4711a72e-b497-4e8b-91ad-ccaead2c527c.jpg) I'm getting this same issue. Thought my IP is blocked as I've been checking this link a lot, but VPN didn't help either. They seem to be on guard with this syndication thing.
maddsua commented 2023-07-03 11:38:13 -04:00 (Migrated from github.com)

Looks like this instance (rss-bridge.org) is modified to be able to parse the syndication (git.twitter-fix-2.be59a1e). I am running my own instance of rss-bridge with latest docker image (git.master.d8bc015). This is not working for syndication (yet).

the twitter issues might resolve itself by its own so im waiting a bit before merging to master.
do you want it merged asap?

Syndication sometimes works, sometimes doesn't. Right now, it is not working. twitter_synd

I'm getting this same issue. Thought my IP is blocked as I've been checking this link a lot, but VPN didn't help either. They seem to be on guard with this syndication thing.

Twitter employees are reading this thread for sure, this is when openness actually backfires

> > > > Looks like this instance (rss-bridge.org) is modified to be able to parse the syndication (git.twitter-fix-2.be59a1e). I am running my own instance of rss-bridge with latest docker image (git.master.d8bc015). This is not working for syndication (yet). > > > > > > > > > the twitter issues might resolve itself by its own so im waiting a bit before merging to master. > > > do you want it merged asap? > > > > > > Syndication sometimes works, sometimes doesn't. Right now, it is not working. ![twitter_synd](https://user-images.githubusercontent.com/1659590/250589429-4711a72e-b497-4e8b-91ad-ccaead2c527c.jpg) > > I'm getting this same issue. Thought my IP is blocked as I've been checking this link a lot, but VPN didn't help either. They seem to be on guard with this syndication thing. Twitter employees are reading this thread for sure, this is when openness actually backfires
maddsua commented 2023-07-03 11:42:33 -04:00 (Migrated from github.com)

I guess at this point the only actual solution is to create *a lot of* accounts for readonly bots and deploy a load balancer so you guys wont rail the Twitter's potato servers

I guess at this point the only actual solution is to create \*a lot of\* accounts for readonly bots and deploy a load balancer so you guys wont rail the Twitter's potato servers
JacobKfromIRC commented 2023-07-03 12:04:04 -04:00 (Migrated from github.com)
> https://cdn.discordapp.com/attachments/874455648883052544/1125145584798548119/image.png Do Nitter instances pay for captcha solvers?
FoxBlocks commented 2023-07-03 12:49:34 -04:00 (Migrated from github.com)

I think the coward privated his account, too.
EDIT: Nevermind. The reason I don't see anything is because posts are hidden, but the syndication page itself is not.
image

I think the coward privated his account, too. EDIT: Nevermind. The reason I don't see anything is because posts are hidden, but the syndication page itself is not. ![image](https://github.com/zedeus/nitter/assets/31682461/0beed70b-de3c-499f-a5f1-bc81d87f3564)
andrigamerita commented 2023-07-03 12:55:42 -04:00 (Migrated from github.com)

I think Nitter can be saved...
Look at this browser extension that - while its advertised feature is to bring back the old Twitter UI - due to the "secret APIs" it uses, which seem to be something GraphQL-related similar to Nitter's internal API (I only skimmed trough the source code, haven't really read it), it can bypass rate limits: https://github.com/dimdenGD/OldTwitter.

As said by the developer (on Twitter), it needs an active login session. I tried logging into Twitter.com, installing the extension, and I think I've scrolled far more than the free 1000 posts I would be allowed to, so I'd say this works. If we can look at the extension source, we can maybe see what needs to be fixed in Nitter's source to make it work again (apart from requiring the instance admin to login with their own Twitter account on the Nitter server)

I think Nitter can be saved... Look at this browser extension that - while its advertised feature is to bring back the old Twitter UI - due to the "secret APIs" it uses, which seem to be something GraphQL-related similar to Nitter's internal API (I only skimmed trough the source code, haven't really read it), it can bypass rate limits: <https://github.com/dimdenGD/OldTwitter>. As said by the developer (on Twitter), it needs an active login session. I tried logging into Twitter.com, installing the extension, and I think I've scrolled far more than the free 1000 posts I would be allowed to, so I'd say this works. If we can look at the extension source, we can maybe see what needs to be fixed in Nitter's source to make it work again (apart from requiring the instance admin to login with their own Twitter account on the Nitter server)
pozirk commented 2023-07-03 13:25:01 -04:00 (Migrated from github.com)

I'm sure they can see where the traffic goes and just block it, like they are doing with syndication now.
So any trick or loophole will be closed as soon as too many people start using it.

I'm sure they can see where the traffic goes and just block it, like they are doing with syndication now. So any trick or loophole will be closed as soon as too many people start using it.
YJSoft commented 2023-07-03 13:25:52 -04:00 (Migrated from github.com)

OldTwitter uses Twitter API 1.1 used by old TweetDeck. It's not secret at all and can be blocked like embed tweet

OldTwitter uses Twitter API 1.1 used by old TweetDeck. It's not secret at all and can be blocked like embed tweet
TempUser13 commented 2023-07-03 13:27:44 -04:00 (Migrated from github.com)

Has anyone built a tool to get an rss from a syndication link?

@TempUser13 dvikan has linked to rss-bridge in this issue 🙈 [#919 (comment)](https://github.com/zedeus/nitter/issues/919#issuecomment-1615253896

doesn't seem to work but thanks for the reply, ill try to selfhost with the specific commit, nvm syndication is broken i didn't see

> > Has anyone built a tool to get an rss from a syndication link? > > @TempUser13 dvikan has linked to rss-bridge in this issue 🙈 [#919 (comment)](https://github.com/zedeus/nitter/issues/919#issuecomment-1615253896 doesn't seem to work but thanks for the reply, ill try to selfhost with the specific commit, nvm syndication is broken i didn't see
ScamCast commented 2023-07-03 14:09:17 -04:00 (Migrated from github.com)

Their crappy official API changes ruined my small project that checked 1 persons timeline every hour. Now I can't even check it at all.

image

image

The official API is completely useless at the free tier.
Wanted to use Nitter as a backup option, but looks like Twitter screwed that up too.
Hopefully they fallback on their changes.

Their crappy official API changes ruined my small project that checked 1 persons timeline every hour. Now I can't even check it at all. ![image](https://github.com/zedeus/nitter/assets/56202326/44a0a39b-e169-4302-b020-a9c4f585d844) ![image](https://github.com/zedeus/nitter/assets/56202326/56ed588d-5c85-4d18-8a79-acf46fbe56f6) The official API is completely useless at the free tier. Wanted to use Nitter as a backup option, but looks like Twitter screwed that up too. Hopefully they fallback on their changes.
devgaucho commented 2023-07-03 14:35:55 -04:00 (Migrated from github.com)

@devgaucho can that be used to bypass login walls as well as archiving?

good question, besides GoogleBot the twitter robots.txt still allows access from Slurp, Yandex, msnbot and bingbot

is it possible that it doesn't do ip verification on all these bots

but robots.txt seems to be outdated since it is still allowing bots access to /search?q=%23

https://imgur.com/8Bs8fhh.png

> @devgaucho can that be used to bypass login walls as well as archiving? good question, besides GoogleBot the twitter robots.txt still allows access from Slurp, Yandex, msnbot and bingbot is it possible that it doesn't do ip verification on all these bots but robots.txt seems to be outdated since it is still allowing bots access to /search?q=%23 ![https://imgur.com/8Bs8fhh.png](https://imgur.com/8Bs8fhh.png)
Write commented 2023-07-03 15:02:33 -04:00 (Migrated from github.com)

Does anyone know how bird.makeup still manage to work correctly ? According to it's author it has 40% failure rate but that's still more than enough. https://sr.ht/~cloutier/bird.makeup/

His Twoot : https://social.librem.one/@vincent/110645408061048325

Does anyone know how bird.makeup still manage to work correctly ? According to it's author it has 40% failure rate but that's still more than enough. https://sr.ht/~cloutier/bird.makeup/ His Twoot : https://social.librem.one/@vincent/110645408061048325
devgaucho commented 2023-07-03 15:17:45 -04:00 (Migrated from github.com)

Does anyone know how bird.makeup still manage to work correctly ? According to it's author it has 40% failure rate but that's still more than enough. https://sr.ht/~cloutier/bird.makeup/

His Twoot : https://social.librem.one/@vincent/110645408061048325

probably he uses twitter's api and makes a local cache to avoid repeating requests

even so he seems to be suffering with the platform's instability

> Does anyone know how bird.makeup still manage to work correctly ? According to it's author it has 40% failure rate but that's still more than enough. https://sr.ht/~cloutier/bird.makeup/ > > His Twoot : https://social.librem.one/@vincent/110645408061048325 probably he uses twitter's api and makes a local cache to avoid repeating requests even so he seems to be suffering with the platform's instability
devgaucho commented 2023-07-03 15:21:22 -04:00 (Migrated from github.com)

Does anyone know how bird.makeup still manage to work correctly ? According to it's author it has 40% failure rate but that's still more than enough. https://sr.ht/~cloutier/bird.makeup/
His Twoot : https://social.librem.one/@vincent/110645408061048325

probably he uses twitter's paid_ api _and makes a local cache to avoid repeating requests

even so he seems to be suffering with the platform's instability

confirmated.

https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/TwitterUserService.cs
https://imgur.com/m0SDEUC.png

https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/CachedTwitterService.cs
https://imgur.com/h3d1cXo.png

> > Does anyone know how bird.makeup still manage to work correctly ? According to it's author it has 40% failure rate but that's still more than enough. https://sr.ht/~cloutier/bird.makeup/ > > His Twoot : https://social.librem.one/@vincent/110645408061048325 > > probably he uses _twitter_'s paid_ api _and makes a local cache to avoid repeating requests > > even so he seems to be suffering with the platform's instability confirmated. https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/TwitterUserService.cs ![https://imgur.com/m0SDEUC.png](https://imgur.com/m0SDEUC.png) https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/CachedTwitterService.cs ![https://imgur.com/h3d1cXo.png](https://imgur.com/h3d1cXo.png)
Write commented 2023-07-03 15:36:43 -04:00 (Migrated from github.com)

Does anyone know how bird.makeup still manage to work correctly ? According to it's author it has 40% failure rate but that's still more than enough. https://sr.ht/~cloutier/bird.makeup/
His Twoot : https://social.librem.one/@vincent/110645408061048325

probably he uses twitter's paid_ api _and makes a local cache to avoid repeating requests
even so he seems to be suffering with the platform's instability

confirmated.

But that doesn't make any sense, you can selfhost it, there's no way he just share publicly his paid apikey .. ?

In his documentation you don't have to fill any apikey https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/VARIABLES.md

He seems to use some sort of API 1.1 and / GraphQL combo : git.sr.ht/~cloutier/bird.makeup@612637fdc7

EDIT : Nevermind he seems to use some sort of API Key indeed, as you can see in the function private async Task<string> GenerateBearerToken() in src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs

> > > Does anyone know how bird.makeup still manage to work correctly ? According to it's author it has 40% failure rate but that's still more than enough. https://sr.ht/~cloutier/bird.makeup/ > > > His Twoot : https://social.librem.one/@vincent/110645408061048325 > > > > > > probably he uses _twitter_'s paid_ api _and makes a local cache to avoid repeating requests > > even so he seems to be suffering with the platform's instability > > confirmated. > But that doesn't make any sense, you can selfhost it, there's no way he just share publicly his paid apikey .. ? In his documentation you don't have to fill any apikey https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/VARIABLES.md He seems to use some sort of API 1.1 and / GraphQL combo : https://git.sr.ht/~cloutier/bird.makeup/commit/612637fdc7f667d2e491117ea84cd2e60b5c85e6 EDIT : Nevermind he seems to use some sort of API Key indeed, as you can see in the function `private async Task<string> GenerateBearerToken()` in `src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs`
Write commented 2023-07-03 15:52:00 -04:00 (Migrated from github.com)

Ok this seems interesting, he seems he is able to get a Bearer tokens using built-in tokens from APPS as seens here
Screenshot du 2023-07-03 à 21 50 59

https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs#L36

He then picks one randomly and send a post request in GenerateBearerToken() which correctly returns a Bearer Tokens

You can try yourself with curl : curl -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"

You can then activate your fresh access_token :

curl -X POST -H "Authorization: Bearer your_access_token" "https://api.twitter.com/1.1/guest/activate.json"

This will return you a guest_token.

You can then access graphql endpoints :

curl -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \
-H "x-guest-token: 1675958319943393280" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D"

where x-guest-token is the token returned when you activated your Bearer.

You can get the user numeric ID from previous request, from twitter name : for elonmusk :

curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \
-H "x-guest-token: 1675958319943393280" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" \
| jq -r '.data.user.result.rest_id'

Then get all his timeline :

curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \
-H "x-guest-token: 1675958319943393280" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com" "https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies?variables=%7B%22userId%22%3A%2244196397%22,%22count%22%3A40,%22includePromotedContent%22%3Atrue,%22withCommunity%22%3Atrue,%22withSuperFollowsUserFields%22%3Atrue,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Atrue,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D" \
| jq

You have to replace the userID between the two "%22" tags. Here the user id (of elonmusk) is : 44196397

Which returns All his Tweets and Replies (too long):

https://bin.socialspill.com/ixomusor.json

To access detail of a specific tweet the url is :

https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail?variables=%7B%22focalTweetId%22%3A% + statusId + %22,%22with_rux_injections%22%3Atrue,%22includePromotedContent%22%3Afalse,%22withCommunity%22%3Afalse,%22withQuickPromoteEligibilityTweetFields%22%3Afalse,%22withBirdwatchNotes%22%3Afalse,%22withSuperFollowsUserFields%22%3Afalse,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Afalse,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Atrue%7D
Ok this seems interesting, he seems he is able to get a Bearer tokens using built-in tokens from APPS as seens here ![Screenshot du 2023-07-03 à 21 50 59](https://github.com/zedeus/nitter/assets/541722/3c53442c-843c-42ad-93d9-b1146b2545a9) https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs#L36 He then picks one randomly and send a post request in GenerateBearerToken() which correctly returns a Bearer Tokens You can try yourself with curl : `curl -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"` You can then activate your fresh access_token : `curl -X POST -H "Authorization: Bearer your_access_token" "https://api.twitter.com/1.1/guest/activate.json"` This will return you a guest_token. You can then access graphql endpoints : ```bash curl -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \ -H "x-guest-token: 1675958319943393280" \ -H "x-twitter-active-user: yes" \ -H "Referer: https://twitter.com/" \ "https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" ``` where x-guest-token is the token returned when you activated your Bearer. You can get the user numeric ID from previous request, from twitter name : for elonmusk : ```bash curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \ -H "x-guest-token: 1675958319943393280" \ -H "x-twitter-active-user: yes" \ -H "Referer: https://twitter.com/" \ "https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" \ | jq -r '.data.user.result.rest_id' ``` Then get all his timeline : ```bash curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \ -H "x-guest-token: 1675958319943393280" \ -H "x-twitter-active-user: yes" \ -H "Referer: https://twitter.com" "https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies?variables=%7B%22userId%22%3A%2244196397%22,%22count%22%3A40,%22includePromotedContent%22%3Atrue,%22withCommunity%22%3Atrue,%22withSuperFollowsUserFields%22%3Atrue,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Atrue,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D" \ | jq ``` You have to replace the userID between the two "%22" tags. Here the user id (of elonmusk) is : 44196397 Which returns All his Tweets and Replies (too long): https://bin.socialspill.com/ixomusor.json To access detail of a specific tweet the url is : ``` https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail?variables=%7B%22focalTweetId%22%3A% + statusId + %22,%22with_rux_injections%22%3Atrue,%22includePromotedContent%22%3Afalse,%22withCommunity%22%3Afalse,%22withQuickPromoteEligibilityTweetFields%22%3Afalse,%22withBirdwatchNotes%22%3Afalse,%22withSuperFollowsUserFields%22%3Afalse,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Afalse,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Atrue%7D ```
SuperSonicHub1 commented 2023-07-03 15:57:04 -04:00 (Migrated from github.com)

Wow, this is a great find! So, can we just implement a Twitter API client and re-implement Nitter's fetching layer?

Wow, this is a great find! So, can we just implement a Twitter API client and re-implement Nitter's fetching layer?
Write commented 2023-07-03 16:23:32 -04:00 (Migrated from github.com)

Updated my post, :) (btw, get rekt elon)

Updated my post, :) (btw, get rekt elon)
SuperSonicHub1 commented 2023-07-03 16:47:27 -04:00 (Migrated from github.com)

I guess the next step would be finding all the endpoints we can access to. I know the folks at Libreddit were able to do something similar by rummaging through a decompiled version of the Reddit Android client.

I guess the next step would be finding all the endpoints we can access to. I know the folks at Libreddit were able to do something similar by rummaging through a decompiled version of the Reddit Android client.
mthmcalixto commented 2023-07-03 16:48:18 -04:00 (Migrated from github.com)
@Write https://github.com/zedeus/nitter/issues/919#issuecomment-1619067142 Is this not limited?
Write commented 2023-07-03 16:49:46 -04:00 (Migrated from github.com)

@Write #919 (comment) Is this not limited?

Well guessing that there is, hence why birds makeup has 40% failure rate and rotate between keys. Gonna let you try :)

> @Write [#919 (comment)](https://github.com/zedeus/nitter/issues/919#issuecomment-1619067142) Is this not limited? Well guessing that there is, hence why birds makeup has 40% failure rate and rotate between keys. Gonna let you try :)
ghost commented 2023-07-03 17:02:09 -04:00 (Migrated from github.com)

@Write #919 (comment) Is this not limited?

It seems the Bearer Token is the same for all, so the first step can be skipped. But the guest_token is different for all.
So probably only this one can get limited. Maybe it is simple to just recreate a new one each few calls.
One limitation, according to tests with curl, is that each second or third curl answer is slow (~ 2 to 3 seconds).

> @Write [#919 (comment)](https://github.com/zedeus/nitter/issues/919#issuecomment-1619067142) Is this not limited? It seems the Bearer Token is the same for all, so the first step can be skipped. But the `guest_token` is different for all. So probably only this one can get limited. Maybe it is simple to just recreate a new one each few calls. One limitation, according to tests with curl, is that each second or third curl answer is slow (~ 2 to 3 seconds).
Write commented 2023-07-03 17:03:31 -04:00 (Migrated from github.com)

@Write #919 (comment) Is this not limited?

It seems the Bearer Token is the same for all, so the first step can be skipped. But the guest_token is different for all. So probably only this one can get limited. Maybe it is simple to just recreate a new one each few calls. One limitation, according to tests with curl, is that each 2 or 3 curl answers are slow (~ 2 to 3 seconds).

You gonna have to make your own tests. I just showed an example as how bird.makeup works. I don't know anything more, sorry. For me the Bearer returned is definitely different based on which credential I use.

> > @Write [#919 (comment)](https://github.com/zedeus/nitter/issues/919#issuecomment-1619067142) Is this not limited? > > It seems the Bearer Token is the same for all, so the first step can be skipped. But the `guest_token` is different for all. So probably only this one can get limited. Maybe it is simple to just recreate a new one each few calls. One limitation, according to tests with curl, is that each 2 or 3 curl answers are slow (~ 2 to 3 seconds). You gonna have to make your own tests. I just showed an example as how bird.makeup works. I don't know anything more, sorry. For me the Bearer returned is definitely different based on which credential I use.
ghost commented 2023-07-03 17:05:48 -04:00 (Migrated from github.com)

@Write #919 (comment) Is this not limited?

It seems the Bearer Token is the same for all, so the first step can be skipped. But the guest_token is different for all. So probably only this one can get limited. Maybe it is simple to just recreate a new one each few calls. One limitation, according to tests with curl, is that each 2 or 3 curl answers are slow (~ 2 to 3 seconds).

You gonna have to make your own tests. I just showed an example as how bird.makeup works. I don't know anything more, sorry. For me the Bearer returned is definitely different based on which credential I use.

Yes, it is based on the credentials. But since they are constant, I got the same Bearer as you have shown above. All others probably, too.

> > > @Write [#919 (comment)](https://github.com/zedeus/nitter/issues/919#issuecomment-1619067142) Is this not limited? > > > > > > It seems the Bearer Token is the same for all, so the first step can be skipped. But the `guest_token` is different for all. So probably only this one can get limited. Maybe it is simple to just recreate a new one each few calls. One limitation, according to tests with curl, is that each 2 or 3 curl answers are slow (~ 2 to 3 seconds). > > You gonna have to make your own tests. I just showed an example as how bird.makeup works. I don't know anything more, sorry. For me the Bearer returned is definitely different based on which credential I use. Yes, it is based on the credentials. But since they are constant, I got the same Bearer as you have shown above. All others probably, too.
Write commented 2023-07-03 17:06:33 -04:00 (Migrated from github.com)

@Write #919 (comment) Is this not limited?

It seems the Bearer Token is the same for all, so the first step can be skipped. But the guest_token is different for all. So probably only this one can get limited. Maybe it is simple to just recreate a new one each few calls. One limitation, according to tests with curl, is that each 2 or 3 curl answers are slow (~ 2 to 3 seconds).

You gonna have to make your own tests. I just showed an example as how bird.makeup works. I don't know anything more, sorry. For me the Bearer returned is definitely different based on which credential I use.

Yes, it is based on the credentials. But since they are constant, I got the same Bearer as you have shown above. All others probably, too.

There's a possibility they change about some times. I don't know.

> > > > @Write [#919 (comment)](https://github.com/zedeus/nitter/issues/919#issuecomment-1619067142) Is this not limited? > > > > > > > > > It seems the Bearer Token is the same for all, so the first step can be skipped. But the `guest_token` is different for all. So probably only this one can get limited. Maybe it is simple to just recreate a new one each few calls. One limitation, according to tests with curl, is that each 2 or 3 curl answers are slow (~ 2 to 3 seconds). > > > > > > You gonna have to make your own tests. I just showed an example as how bird.makeup works. I don't know anything more, sorry. For me the Bearer returned is definitely different based on which credential I use. > > Yes, it is based on the credentials. But since they are constant, I got the same Bearer as you have shown above. All others probably, too. There's a possibility they change about some times. I don't know.
ghost commented 2023-07-03 17:22:59 -04:00 (Migrated from github.com)

I don't know why everyone is so positive about the makeup bird. It has failed for me ever since I tried it first a couple of days ago. No matter which IP or browser (agent) I use, I always get:

Error.
An error occurred while processing your request.

Yeah, this app does not work. But you can try the curl codes above and it works. There is also not much room for twitter to prevent this without blocking their own official apps or force users to install new versions.
The problem with the code above is that it is less legal than the previous approach that was easier to get from the browser, I think. But not sure.

> I don't know why everyone is so positive about the makeup bird. It has failed for me ever since I tried it first a couple of days ago. No matter which IP or browser (agent) I use, I always get: > > ``` > Error. > An error occurred while processing your request. > ``` Yeah, this app does not work. But you can try the curl codes above and it works. There is also not much room for twitter to prevent this without blocking their own official apps or force users to install new versions. The problem with the code above is that it is less legal than the previous approach that was easier to get from the browser, I think. But not sure.
SuperSonicHub1 commented 2023-07-03 17:54:17 -04:00 (Migrated from github.com)

My goal to find all possible endpoints is starting to go well; just found my first API endpoint:

curl -s -X GET \
-H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \
-H "x-guest-token: 1675958319943393280" -H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com" \
"https://api.twitter.com/graphql/0c8QtPl8cRsze0fPzS6_zg/TwitterBlueMarketingPage?features=%7B%22subscriptions_annual_subscription_signup_enabled%22%3A%20true%7D"
{"data":{"blue_marketing_page_config":{"card":{"badge":{"text":""},"imageUrl":"https://abs.twimg.com/responsive-web/client-web/verification-card-v2@3x.8ebee01a.png","description":"","title":"Blue subscribers with a verified phone number will get a blue checkmark once approved."},"products":[{"buckets":{"title":"","buckets":[{"imageUrl":"https://abs.twimg.com/responsive-web/client-web/purple-present@3x.5f4d564a.png","description":"Edit Tweet, 1080p video uploads, Reader, custom navigation, Bookmark Folders, Top Articles and more.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"All the existing Blue features","clientEventInfo":{"component":"feature_bucket","element":"existing_blue_features"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/upranked-replies-feature@3x.68f97c89.png","description":"Tweets from Twitter Blue subscribers will be prioritized in replies, mentions, and search — helping to fight scams and spam.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"Prioritized ranking in conversations and search","clientEventInfo":{"component":"feature_bucket","element":"reply_upranking"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/less-ads-feature@3x.98d5a999.png","description":"See approximately twice as many Tweets between ads in your For You and Following timelines.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"See half the ads","clientEventInfo":{"component":"feature_bucket","element":"less_ads"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/longer-video-feature-v3@3x.6c6c531a.png","description":"You’ll finally be able to post longer videos to Twitter.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"Post longer videos","clientEventInfo":{"component":"feature_bucket","element":"longer_video"},"features":[]},{"imageUrl":"https://abs.twimg.com/responsive-web/client-web/early-access-feature@3x.9d1ba0a9.png","description":"Get early access to select new features with Twitter Blue Labs.","learnMoreText":"Learn more","learnMoreTitle":"Get early access","learnMoreDescription":"Twitter Blue subscribers get early access to new features like these through Twitter Blue Labs.","title":"Get early access","clientEventInfo":{"component":"feature_bucket","element":"early_access"},"features":[{"icon":"WriteStroke","description":"Edit a Tweet up to 5 times within 30 minutes.","title":"Edit Tweet"},{"icon":"AccountNft","description":"Show your personal flair and set your profile picture to an NFT you own.","title":"NFT Profile Pictures"},{"icon":"CameraVideoStroke","description":"Share your favorite moments with 1080p (Full HD) video.","title":"1080p video uploads"}]}]},"productCategory":"BlueVerified","title":"Blue"}],"feature_buckets":{"title":"","buckets":[{"imageUrl":"https://abs.twimg.com/responsive-web/client-web/purple-present@3x.5f4d564a.png","description":"Edit Tweet, 1080p video uploads, Reader, custom navigation, Bookmark Folders, Top Articles and more.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"All the existing Blue features","clientEventInfo":{"component":"feature_bucket","element":"existing_blue_features"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/upranked-replies-feature@3x.68f97c89.png","description":"Tweets from Twitter Blue subscribers will be prioritized in replies, mentions, and search — helping to fight scams and spam.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"Prioritized ranking in conversations and search","clientEventInfo":{"component":"feature_bucket","element":"reply_upranking"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/less-ads-feature@3x.98d5a999.png","description":"See approximately twice as many Tweets between ads in your For You and Following timelines.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"See half the ads","clientEventInfo":{"component":"feature_bucket","element":"less_ads"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/longer-video-feature-v3@3x.6c6c531a.png","description":"You’ll finally be able to post longer videos to Twitter.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"Post longer videos","clientEventInfo":{"component":"feature_bucket","element":"longer_video"},"features":[]},{"imageUrl":"https://abs.twimg.com/responsive-web/client-web/early-access-feature@3x.9d1ba0a9.png","description":"Get early access to select new features with Twitter Blue Labs.","learnMoreText":"Learn more","learnMoreTitle":"Get early access","learnMoreDescription":"Twitter Blue subscribers get early access to new features like these through Twitter Blue Labs.","title":"Get early access","clientEventInfo":{"component":"feature_bucket","element":"early_access"},"features":[{"icon":"WriteStroke","description":"Edit a Tweet up to 5 times within 30 minutes.","title":"Edit Tweet"},{"icon":"AccountNft","description":"Show your personal flair and set your profile picture to an NFT you own.","title":"NFT Profile Pictures"},{"icon":"CameraVideoStroke","description":"Share your favorite moments with 1080p (Full HD) video.","title":"1080p video uploads"}]}]},"button":{"detailText":"Limited time offer: {{PRICE}}/{{PERIOD}}","disclaimerText":"By clicking Subscribe, you agree to our @#!. Subscriptions auto-renew until canceled, as described in the Terms. Cancel anytime. A verified phone number is required to subscribe. If you've subscribed on another platform, manage your subscription through that platform.","disclaimerUrl":"https://legal.twitter.com/purchaser-terms","disclaimerUrlText":"Purchaser Terms of Service"}}}}
My goal to find all possible endpoints is starting to go well; just found my first API endpoint: ```bash curl -s -X GET \ -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \ -H "x-guest-token: 1675958319943393280" -H "x-twitter-active-user: yes" \ -H "Referer: https://twitter.com" \ "https://api.twitter.com/graphql/0c8QtPl8cRsze0fPzS6_zg/TwitterBlueMarketingPage?features=%7B%22subscriptions_annual_subscription_signup_enabled%22%3A%20true%7D" ``` ```json {"data":{"blue_marketing_page_config":{"card":{"badge":{"text":""},"imageUrl":"https://abs.twimg.com/responsive-web/client-web/verification-card-v2@3x.8ebee01a.png","description":"","title":"Blue subscribers with a verified phone number will get a blue checkmark once approved."},"products":[{"buckets":{"title":"","buckets":[{"imageUrl":"https://abs.twimg.com/responsive-web/client-web/purple-present@3x.5f4d564a.png","description":"Edit Tweet, 1080p video uploads, Reader, custom navigation, Bookmark Folders, Top Articles and more.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"All the existing Blue features","clientEventInfo":{"component":"feature_bucket","element":"existing_blue_features"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/upranked-replies-feature@3x.68f97c89.png","description":"Tweets from Twitter Blue subscribers will be prioritized in replies, mentions, and search — helping to fight scams and spam.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"Prioritized ranking in conversations and search","clientEventInfo":{"component":"feature_bucket","element":"reply_upranking"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/less-ads-feature@3x.98d5a999.png","description":"See approximately twice as many Tweets between ads in your For You and Following timelines.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"See half the ads","clientEventInfo":{"component":"feature_bucket","element":"less_ads"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/longer-video-feature-v3@3x.6c6c531a.png","description":"You’ll finally be able to post longer videos to Twitter.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"Post longer videos","clientEventInfo":{"component":"feature_bucket","element":"longer_video"},"features":[]},{"imageUrl":"https://abs.twimg.com/responsive-web/client-web/early-access-feature@3x.9d1ba0a9.png","description":"Get early access to select new features with Twitter Blue Labs.","learnMoreText":"Learn more","learnMoreTitle":"Get early access","learnMoreDescription":"Twitter Blue subscribers get early access to new features like these through Twitter Blue Labs.","title":"Get early access","clientEventInfo":{"component":"feature_bucket","element":"early_access"},"features":[{"icon":"WriteStroke","description":"Edit a Tweet up to 5 times within 30 minutes.","title":"Edit Tweet"},{"icon":"AccountNft","description":"Show your personal flair and set your profile picture to an NFT you own.","title":"NFT Profile Pictures"},{"icon":"CameraVideoStroke","description":"Share your favorite moments with 1080p (Full HD) video.","title":"1080p video uploads"}]}]},"productCategory":"BlueVerified","title":"Blue"}],"feature_buckets":{"title":"","buckets":[{"imageUrl":"https://abs.twimg.com/responsive-web/client-web/purple-present@3x.5f4d564a.png","description":"Edit Tweet, 1080p video uploads, Reader, custom navigation, Bookmark Folders, Top Articles and more.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"All the existing Blue features","clientEventInfo":{"component":"feature_bucket","element":"existing_blue_features"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/upranked-replies-feature@3x.68f97c89.png","description":"Tweets from Twitter Blue subscribers will be prioritized in replies, mentions, and search — helping to fight scams and spam.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"Prioritized ranking in conversations and search","clientEventInfo":{"component":"feature_bucket","element":"reply_upranking"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/less-ads-feature@3x.98d5a999.png","description":"See approximately twice as many Tweets between ads in your For You and Following timelines.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"See half the ads","clientEventInfo":{"component":"feature_bucket","element":"less_ads"},"features":[]},{"badge":"NEW","imageUrl":"https://abs.twimg.com/responsive-web/client-web/longer-video-feature-v3@3x.6c6c531a.png","description":"You’ll finally be able to post longer videos to Twitter.","learnMoreText":"","learnMoreTitle":"","learnMoreDescription":"","title":"Post longer videos","clientEventInfo":{"component":"feature_bucket","element":"longer_video"},"features":[]},{"imageUrl":"https://abs.twimg.com/responsive-web/client-web/early-access-feature@3x.9d1ba0a9.png","description":"Get early access to select new features with Twitter Blue Labs.","learnMoreText":"Learn more","learnMoreTitle":"Get early access","learnMoreDescription":"Twitter Blue subscribers get early access to new features like these through Twitter Blue Labs.","title":"Get early access","clientEventInfo":{"component":"feature_bucket","element":"early_access"},"features":[{"icon":"WriteStroke","description":"Edit a Tweet up to 5 times within 30 minutes.","title":"Edit Tweet"},{"icon":"AccountNft","description":"Show your personal flair and set your profile picture to an NFT you own.","title":"NFT Profile Pictures"},{"icon":"CameraVideoStroke","description":"Share your favorite moments with 1080p (Full HD) video.","title":"1080p video uploads"}]}]},"button":{"detailText":"Limited time offer: {{PRICE}}/{{PERIOD}}","disclaimerText":"By clicking Subscribe, you agree to our @#!. Subscriptions auto-renew until canceled, as described in the Terms. Cancel anytime. A verified phone number is required to subscribe. If you've subscribed on another platform, manage your subscription through that platform.","disclaimerUrl":"https://legal.twitter.com/purchaser-terms","disclaimerUrlText":"Purchaser Terms of Service"}}}} ```
SuperSonicHub1 commented 2023-07-03 18:36:16 -04:00 (Migrated from github.com)

Here's all the operations I was able to extract from a decomp (using JADX) of the Twitter APK (version 9.95.0-release.0): operations.txt
It would seem that the Android and web clients use different queries, as I was unable to find any @Write mentioned.

It looks like Twitter's Android app makes use of Apollo, so there's a chance we may be able to fully extract all info about the schema from it; it will just require some reverse engineering.

Here's all the operations I was able to extract from a decomp (using JADX) of the [Twitter APK](https://apkpure.com/twitter/com.twitter.android) (version `9.95.0-release.0`): [operations.txt](https://github.com/zedeus/nitter/files/11941693/operations.txt) It would seem that the Android and web clients use different queries, as I was unable to find any @Write mentioned. It looks like Twitter's Android app makes use of [Apollo](https://www.apollographql.com/docs/kotlin/), so there's a chance we may be able to fully extract all info about the schema from it; it will just require some reverse engineering.
devgaucho commented 2023-07-03 18:44:34 -04:00 (Migrated from github.com)

Does anyone know how bird.makeup still manage to work correctly ? According to it's author it has 40% failure rate but that's still more than enough. https://sr.ht/~cloutier/bird.makeup/
His Twoot : https://social.librem.one/@vincent/110645408061048325

probably he uses twitter's paid__ api __and makes a local cache to avoid repeating requests
even so he seems to be suffering with the platform's instability

confirmated.

But that doesn't make any sense, you can selfhost it, there's no way he just share publicly his paid apikey .. ?

In his documentation you don't have to fill any apikey https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/VARIABLES.md

He seems to use some sort of_ API 1.1 and / GraphQL _combo : https://git.sr.ht/~cloutier/bird.makeup/commit/612637fdc7f667d2e491117ea84cd2e60b5c85e6

EDIT : Nevermind he seems to use some sort of_ API _Key indeed, as you can see in the function private_ async _Task<_string_> GenerateBearerToken() in _src_/BirdsiteLive._Twitter_/Tools/TwitterAuthenticationInitializer.cs

this is a hard coded persistent graphql query:

https://imgur.com/lsRr5CP.png

> > > > Does anyone know how bird.makeup still manage to work correctly ? According to it's author it has 40% failure rate but that's still more than enough. https://sr.ht/~cloutier/bird.makeup/ > > > > His Twoot : https://social.librem.one/@vincent/110645408061048325 > > > > > > > > > probably he uses __twitter__'s paid__ api __and makes a local cache to avoid repeating requests > > > even so he seems to be suffering with the platform's instability > > > > > > confirmated. > > But that doesn't make any sense, you can selfhost it, there's no way he just share publicly his paid apikey .. ? > > In his documentation you don't have to fill any apikey [https://_git_.sr.ht/~cloutier/bird.makeup/tree/master/item/VARIABLES.md](https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/VARIABLES.md) > > He seems to use some sort of_ API _1.1 and /_ GraphQL _combo : [https://_git_.sr.ht/~cloutier/bird.makeup/_commit_/612637fdc7f667d2e491117ea84cd2e60b5c85e6](https://git.sr.ht/~cloutier/bird.makeup/commit/612637fdc7f667d2e491117ea84cd2e60b5c85e6) > > EDIT : Nevermind he seems to use some sort of_ API _Key indeed, as you can see in the function `private_ async _Task<_string_> GenerateBearerToken()` in `_src_/BirdsiteLive._Twitter_/Tools/TwitterAuthenticationInitializer.cs` this is a hard coded persistent graphql query: ![https://imgur.com/lsRr5CP.png](https://imgur.com/lsRr5CP.png)
SuperSonicHub1 commented 2023-07-03 18:57:15 -04:00 (Migrated from github.com)

Here's how you can get Elon Musk's profile info using the Android API:

$ curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" -H "x-guest-token: 1675958319943393280" -H "x-twitter-active-user: yes" -H "Referer: https://twitter.com" "https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery?features=%7B%22blue_business_profile_image_shape_enabled%22%3A%20false%2C%20%22verified_phone_label_enabled%22%3A%20false%2C%20%22super_follow_user_api_enabled%22%3A%20false%2C%20%22super_follow_badge_privacy_enabled%22%3A%20false%2C%20%22subscriptions_verification_info_enabled%22%3A%20false%2C%20%22creator_subscriptions_subscription_count_enabled%22%3A%20false%2C%20%22super_follow_exclusive_tweet_notifications_enabled%22%3A%20false%7D&variables=%7B%22user_id%22%3A%20%2244196397%22%2C%20%22rest_id%22%3A%20%2244196397%22%7D"
{"data":{"user_result":{"result":{"__typename":"User","rest_id":"44196397","has_nft_avatar":false,"is_blue_verified":true,"affiliates_highlighted_label":{"label":{"url":{"urlType":"DeepLink","url":"https://twitter.com/Twitter"},"badge":{"url":"https://pbs.twimg.com/profile_images/1488548719062654976/u6qfBBkF_bigger.jpg"},"userLabelType":"BusinessLabel","userLabelDisplayType":"Badge","description":"Twitter"}},"legacy":{"advertiser_account_service_levels":["analytics"],"advertiser_account_type":"promotable_user","analytics_type":"enabled","created_at":"Tue Jun 02 20:12:29 +0000 2009","description":"","entities":{"description":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[]}},"fast_followers_count":0,"favourites_count":26922,"followers_count":146412716,"friends_count":342,"geo_enabled":false,"has_custom_timelines":true,"has_extended_profile":true,"id_str":"44196397","is_translator":false,"location":"","media_count":1605,"name":"Elon Musk","normal_followers_count":146412716,"pinned_tweet_ids_str":[],"profile_background_color":"C0DEED","profile_banner_url":"https://pbs.twimg.com/profile_banners/44196397/1576183471","profile_image_url_https":"https://pbs.twimg.com/profile_images/1590968738358079488/IY9Gx6Ok_normal.jpg","profile_interstitial_type":"","profile_link_color":"0084B4","protected":false,"screen_name":"elonmusk","statuses_count":27575,"translator_type_enum":"None","verified":false,"withheld_in_countries":[]},"business_account":{}}}}}
Here's how you can get Elon Musk's profile info using the Android API: ```shell $ curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" -H "x-guest-token: 1675958319943393280" -H "x-twitter-active-user: yes" -H "Referer: https://twitter.com" "https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery?features=%7B%22blue_business_profile_image_shape_enabled%22%3A%20false%2C%20%22verified_phone_label_enabled%22%3A%20false%2C%20%22super_follow_user_api_enabled%22%3A%20false%2C%20%22super_follow_badge_privacy_enabled%22%3A%20false%2C%20%22subscriptions_verification_info_enabled%22%3A%20false%2C%20%22creator_subscriptions_subscription_count_enabled%22%3A%20false%2C%20%22super_follow_exclusive_tweet_notifications_enabled%22%3A%20false%7D&variables=%7B%22user_id%22%3A%20%2244196397%22%2C%20%22rest_id%22%3A%20%2244196397%22%7D" ``` ```json {"data":{"user_result":{"result":{"__typename":"User","rest_id":"44196397","has_nft_avatar":false,"is_blue_verified":true,"affiliates_highlighted_label":{"label":{"url":{"urlType":"DeepLink","url":"https://twitter.com/Twitter"},"badge":{"url":"https://pbs.twimg.com/profile_images/1488548719062654976/u6qfBBkF_bigger.jpg"},"userLabelType":"BusinessLabel","userLabelDisplayType":"Badge","description":"Twitter"}},"legacy":{"advertiser_account_service_levels":["analytics"],"advertiser_account_type":"promotable_user","analytics_type":"enabled","created_at":"Tue Jun 02 20:12:29 +0000 2009","description":"","entities":{"description":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[]}},"fast_followers_count":0,"favourites_count":26922,"followers_count":146412716,"friends_count":342,"geo_enabled":false,"has_custom_timelines":true,"has_extended_profile":true,"id_str":"44196397","is_translator":false,"location":"","media_count":1605,"name":"Elon Musk","normal_followers_count":146412716,"pinned_tweet_ids_str":[],"profile_background_color":"C0DEED","profile_banner_url":"https://pbs.twimg.com/profile_banners/44196397/1576183471","profile_image_url_https":"https://pbs.twimg.com/profile_images/1590968738358079488/IY9Gx6Ok_normal.jpg","profile_interstitial_type":"","profile_link_color":"0084B4","protected":false,"screen_name":"elonmusk","statuses_count":27575,"translator_type_enum":"None","verified":false,"withheld_in_countries":[]},"business_account":{}}}}} ```
mthmcalixto commented 2023-07-03 19:18:58 -04:00 (Migrated from github.com)

Here's how you can get Elon Musk's profile info using the Android API:

$ curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" -H "x-guest-token: 1675958319943393280" -H "x-twitter-active-user: yes" -H "Referer: https://twitter.com" "https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery?features=%7B%22blue_business_profile_image_shape_enabled%22%3A%20false%2C%20%22verified_phone_label_enabled%22%3A%20false%2C%20%22super_follow_user_api_enabled%22%3A%20false%2C%20%22super_follow_badge_privacy_enabled%22%3A%20false%2C%20%22subscriptions_verification_info_enabled%22%3A%20false%2C%20%22creator_subscriptions_subscription_count_enabled%22%3A%20false%2C%20%22super_follow_exclusive_tweet_notifications_enabled%22%3A%20false%7D&variables=%7B%22user_id%22%3A%20%2244196397%22%2C%20%22rest_id%22%3A%20%2244196397%22%7D"
{"data":{"user_result":{"result":{"__typename":"User","rest_id":"44196397","has_nft_avatar":false,"is_blue_verified":true,"affiliates_highlighted_label":{"label":{"url":{"urlType":"DeepLink","url":"https://twitter.com/Twitter"},"badge":{"url":"https://pbs.twimg.com/profile_images/1488548719062654976/u6qfBBkF_bigger.jpg"},"userLabelType":"BusinessLabel","userLabelDisplayType":"Badge","description":"Twitter"}},"legacy":{"advertiser_account_service_levels":["analytics"],"advertiser_account_type":"promotable_user","analytics_type":"enabled","created_at":"Tue Jun 02 20:12:29 +0000 2009","description":"","entities":{"description":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[]}},"fast_followers_count":0,"favourites_count":26922,"followers_count":146412716,"friends_count":342,"geo_enabled":false,"has_custom_timelines":true,"has_extended_profile":true,"id_str":"44196397","is_translator":false,"location":"","media_count":1605,"name":"Elon Musk","normal_followers_count":146412716,"pinned_tweet_ids_str":[],"profile_background_color":"C0DEED","profile_banner_url":"https://pbs.twimg.com/profile_banners/44196397/1576183471","profile_image_url_https":"https://pbs.twimg.com/profile_images/1590968738358079488/IY9Gx6Ok_normal.jpg","profile_interstitial_type":"","profile_link_color":"0084B4","protected":false,"screen_name":"elonmusk","statuses_count":27575,"translator_type_enum":"None","verified":false,"withheld_in_countries":[]},"business_account":{}}}}}

It stops working fast.

> Here's how you can get Elon Musk's profile info using the Android API: > > ```shell > $ curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" -H "x-guest-token: 1675958319943393280" -H "x-twitter-active-user: yes" -H "Referer: https://twitter.com" "https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery?features=%7B%22blue_business_profile_image_shape_enabled%22%3A%20false%2C%20%22verified_phone_label_enabled%22%3A%20false%2C%20%22super_follow_user_api_enabled%22%3A%20false%2C%20%22super_follow_badge_privacy_enabled%22%3A%20false%2C%20%22subscriptions_verification_info_enabled%22%3A%20false%2C%20%22creator_subscriptions_subscription_count_enabled%22%3A%20false%2C%20%22super_follow_exclusive_tweet_notifications_enabled%22%3A%20false%7D&variables=%7B%22user_id%22%3A%20%2244196397%22%2C%20%22rest_id%22%3A%20%2244196397%22%7D" > ``` > > ```json > {"data":{"user_result":{"result":{"__typename":"User","rest_id":"44196397","has_nft_avatar":false,"is_blue_verified":true,"affiliates_highlighted_label":{"label":{"url":{"urlType":"DeepLink","url":"https://twitter.com/Twitter"},"badge":{"url":"https://pbs.twimg.com/profile_images/1488548719062654976/u6qfBBkF_bigger.jpg"},"userLabelType":"BusinessLabel","userLabelDisplayType":"Badge","description":"Twitter"}},"legacy":{"advertiser_account_service_levels":["analytics"],"advertiser_account_type":"promotable_user","analytics_type":"enabled","created_at":"Tue Jun 02 20:12:29 +0000 2009","description":"","entities":{"description":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[]}},"fast_followers_count":0,"favourites_count":26922,"followers_count":146412716,"friends_count":342,"geo_enabled":false,"has_custom_timelines":true,"has_extended_profile":true,"id_str":"44196397","is_translator":false,"location":"","media_count":1605,"name":"Elon Musk","normal_followers_count":146412716,"pinned_tweet_ids_str":[],"profile_background_color":"C0DEED","profile_banner_url":"https://pbs.twimg.com/profile_banners/44196397/1576183471","profile_image_url_https":"https://pbs.twimg.com/profile_images/1590968738358079488/IY9Gx6Ok_normal.jpg","profile_interstitial_type":"","profile_link_color":"0084B4","protected":false,"screen_name":"elonmusk","statuses_count":27575,"translator_type_enum":"None","verified":false,"withheld_in_countries":[]},"business_account":{}}}}} > ``` It stops working fast.
Write commented 2023-07-03 19:40:27 -04:00 (Migrated from github.com)

Here's how you can get Elon Musk's profile info using the Android API:

$ curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" -H "x-guest-token: 1675958319943393280" -H "x-twitter-active-user: yes" -H "Referer: https://twitter.com" "https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery?features=%7B%22blue_business_profile_image_shape_enabled%22%3A%20false%2C%20%22verified_phone_label_enabled%22%3A%20false%2C%20%22super_follow_user_api_enabled%22%3A%20false%2C%20%22super_follow_badge_privacy_enabled%22%3A%20false%2C%20%22subscriptions_verification_info_enabled%22%3A%20false%2C%20%22creator_subscriptions_subscription_count_enabled%22%3A%20false%2C%20%22super_follow_exclusive_tweet_notifications_enabled%22%3A%20false%7D&variables=%7B%22user_id%22%3A%20%2244196397%22%2C%20%22rest_id%22%3A%20%2244196397%22%7D"
{"data":{"user_result":{"result":{"__typename":"User","rest_id":"44196397","has_nft_avatar":false,"is_blue_verified":true,"affiliates_highlighted_label":{"label":{"url":{"urlType":"DeepLink","url":"https://twitter.com/Twitter"},"badge":{"url":"https://pbs.twimg.com/profile_images/1488548719062654976/u6qfBBkF_bigger.jpg"},"userLabelType":"BusinessLabel","userLabelDisplayType":"Badge","description":"Twitter"}},"legacy":{"advertiser_account_service_levels":["analytics"],"advertiser_account_type":"promotable_user","analytics_type":"enabled","created_at":"Tue Jun 02 20:12:29 +0000 2009","description":"","entities":{"description":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[]}},"fast_followers_count":0,"favourites_count":26922,"followers_count":146412716,"friends_count":342,"geo_enabled":false,"has_custom_timelines":true,"has_extended_profile":true,"id_str":"44196397","is_translator":false,"location":"","media_count":1605,"name":"Elon Musk","normal_followers_count":146412716,"pinned_tweet_ids_str":[],"profile_background_color":"C0DEED","profile_banner_url":"https://pbs.twimg.com/profile_banners/44196397/1576183471","profile_image_url_https":"https://pbs.twimg.com/profile_images/1590968738358079488/IY9Gx6Ok_normal.jpg","profile_interstitial_type":"","profile_link_color":"0084B4","protected":false,"screen_name":"elonmusk","statuses_count":27575,"translator_type_enum":"None","verified":false,"withheld_in_countries":[]},"business_account":{}}}}}

It stops working fast.

That's expected and normal you just have to refresh your guest_token.

> > Here's how you can get Elon Musk's profile info using the Android API: > > ```shell > > $ curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" -H "x-guest-token: 1675958319943393280" -H "x-twitter-active-user: yes" -H "Referer: https://twitter.com" "https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery?features=%7B%22blue_business_profile_image_shape_enabled%22%3A%20false%2C%20%22verified_phone_label_enabled%22%3A%20false%2C%20%22super_follow_user_api_enabled%22%3A%20false%2C%20%22super_follow_badge_privacy_enabled%22%3A%20false%2C%20%22subscriptions_verification_info_enabled%22%3A%20false%2C%20%22creator_subscriptions_subscription_count_enabled%22%3A%20false%2C%20%22super_follow_exclusive_tweet_notifications_enabled%22%3A%20false%7D&variables=%7B%22user_id%22%3A%20%2244196397%22%2C%20%22rest_id%22%3A%20%2244196397%22%7D" > > ``` > > > > > > > > > > > > > > > > > > > > > > > > ```json > > {"data":{"user_result":{"result":{"__typename":"User","rest_id":"44196397","has_nft_avatar":false,"is_blue_verified":true,"affiliates_highlighted_label":{"label":{"url":{"urlType":"DeepLink","url":"https://twitter.com/Twitter"},"badge":{"url":"https://pbs.twimg.com/profile_images/1488548719062654976/u6qfBBkF_bigger.jpg"},"userLabelType":"BusinessLabel","userLabelDisplayType":"Badge","description":"Twitter"}},"legacy":{"advertiser_account_service_levels":["analytics"],"advertiser_account_type":"promotable_user","analytics_type":"enabled","created_at":"Tue Jun 02 20:12:29 +0000 2009","description":"","entities":{"description":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[]}},"fast_followers_count":0,"favourites_count":26922,"followers_count":146412716,"friends_count":342,"geo_enabled":false,"has_custom_timelines":true,"has_extended_profile":true,"id_str":"44196397","is_translator":false,"location":"","media_count":1605,"name":"Elon Musk","normal_followers_count":146412716,"pinned_tweet_ids_str":[],"profile_background_color":"C0DEED","profile_banner_url":"https://pbs.twimg.com/profile_banners/44196397/1576183471","profile_image_url_https":"https://pbs.twimg.com/profile_images/1590968738358079488/IY9Gx6Ok_normal.jpg","profile_interstitial_type":"","profile_link_color":"0084B4","protected":false,"screen_name":"elonmusk","statuses_count":27575,"translator_type_enum":"None","verified":false,"withheld_in_countries":[]},"business_account":{}}}}} > > ``` > > It stops working fast. That's expected and normal you just have to refresh your guest_token.
polhdez commented 2023-07-03 19:43:34 -04:00 (Migrated from github.com)

Ok this seems interesting, he seems he is able to get a Bearer tokens using built-in tokens from APPS as seens here Screenshot du 2023-07-03 à 21 50 59

https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs#L36

He then picks one randomly and send a post request in GenerateBearerToken() which correctly returns a Bearer Tokens

You can try yourself with curl : curl -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"

You can then activate your fresh access_token :

curl -X POST -H "Authorization: Bearer your_access_token" "https://api.twitter.com/1.1/guest/activate.json"

This will return you a guest_token.

You can then access graphql endpoints :

curl -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \
-H "x-guest-token: 1675958319943393280" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D"

where x-guest-token is the token returned when you activated your Bearer.

You can get the user numeric ID from previous request, from twitter name : for elonmusk :

curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \
-H "x-guest-token: 1675958319943393280" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" \
| jq -r '.data.user.result.rest_id'

Then get all his timeline :

curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \
-H "x-guest-token: 1675958319943393280" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com" "https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies?variables=%7B%22userId%22%3A%2244196397%22,%22count%22%3A40,%22includePromotedContent%22%3Atrue,%22withCommunity%22%3Atrue,%22withSuperFollowsUserFields%22%3Atrue,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Atrue,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D" \
| jq

You have to replace the userID between the two "%22" tags. Here the user id (of elonmusk) is : 44196397

Which returns All his Tweets and Replies (too long):

https://bin.socialspill.com/ixomusor.json

To access detail of a specific tweet the url is :

https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail?variables=%7B%22focalTweetId%22%3A% + statusId + %22,%22with_rux_injections%22%3Atrue,%22includePromotedContent%22%3Afalse,%22withCommunity%22%3Afalse,%22withQuickPromoteEligibilityTweetFields%22%3Afalse,%22withBirdwatchNotes%22%3Afalse,%22withSuperFollowsUserFields%22%3Afalse,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Afalse,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Atrue%7D

Poor man's nitter:

#!/bin/sh

[ -z "$1" ] && echo "USAGE: $(basename $0) username_to_search" && exit

USERNAME=$1

echo "Searching..."

ACCESS_TOKEN=$(curl -s -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck" | jq .access_token | cut -d '"' -f 2)

GUEST_TOKEN=$(curl -s -X POST -H "Authorization: Bearer $ACCESS_TOKEN" "https://api.twitter.com/1.1/guest/activate.json" | jq .guest_token | cut -d '"' -f 2)

USER_ID=$(curl -s -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \
-H "x-guest-token: $GUEST_TOKEN" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22$USERNAME%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" \
| jq -r '.data.user.result.rest_id')

curl -s -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \
-H "x-guest-token: $GUEST_TOKEN" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com" "https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies?variables=%7B%22userId%22%3A%22$USER_ID%22,%22count%22%3A40,%22includePromotedContent%22%3Atrue,%22withCommunity%22%3Atrue,%22withSuperFollowsUserFields%22%3Atrue,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Atrue,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D" \
| jq '..|.full_text?|select(length>0)'
> Ok this seems interesting, he seems he is able to get a Bearer tokens using built-in tokens from APPS as seens here ![Screenshot du 2023-07-03 à 21 50 59](https://user-images.githubusercontent.com/541722/250650033-3c53442c-843c-42ad-93d9-b1146b2545a9.png) > > https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs#L36 > > He then picks one randomly and send a post request in GenerateBearerToken() which correctly returns a Bearer Tokens > > You can try yourself with curl : `curl -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"` > > You can then activate your fresh access_token : > > `curl -X POST -H "Authorization: Bearer your_access_token" "https://api.twitter.com/1.1/guest/activate.json"` > > This will return you a guest_token. > > You can then access graphql endpoints : > > ```shell > curl -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \ > -H "x-guest-token: 1675958319943393280" \ > -H "x-twitter-active-user: yes" \ > -H "Referer: https://twitter.com/" \ > "https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" > ``` > > where x-guest-token is the token returned when you activated your Bearer. > > You can get the user numeric ID from previous request, from twitter name : for elonmusk : > > ```shell > curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \ > -H "x-guest-token: 1675958319943393280" \ > -H "x-twitter-active-user: yes" \ > -H "Referer: https://twitter.com/" \ > "https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" \ > | jq -r '.data.user.result.rest_id' > ``` > > Then get all his timeline : > > ```shell > curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \ > -H "x-guest-token: 1675958319943393280" \ > -H "x-twitter-active-user: yes" \ > -H "Referer: https://twitter.com" "https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies?variables=%7B%22userId%22%3A%2244196397%22,%22count%22%3A40,%22includePromotedContent%22%3Atrue,%22withCommunity%22%3Atrue,%22withSuperFollowsUserFields%22%3Atrue,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Atrue,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D" \ > | jq > ``` > > You have to replace the userID between the two "%22" tags. Here the user id (of elonmusk) is : 44196397 > > Which returns All his Tweets and Replies (too long): > > https://bin.socialspill.com/ixomusor.json > > To access detail of a specific tweet the url is : > > ``` > https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail?variables=%7B%22focalTweetId%22%3A% + statusId + %22,%22with_rux_injections%22%3Atrue,%22includePromotedContent%22%3Afalse,%22withCommunity%22%3Afalse,%22withQuickPromoteEligibilityTweetFields%22%3Afalse,%22withBirdwatchNotes%22%3Afalse,%22withSuperFollowsUserFields%22%3Afalse,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Afalse,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Atrue%7D > ``` Poor man's nitter: ```sh #!/bin/sh [ -z "$1" ] && echo "USAGE: $(basename $0) username_to_search" && exit USERNAME=$1 echo "Searching..." ACCESS_TOKEN=$(curl -s -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck" | jq .access_token | cut -d '"' -f 2) GUEST_TOKEN=$(curl -s -X POST -H "Authorization: Bearer $ACCESS_TOKEN" "https://api.twitter.com/1.1/guest/activate.json" | jq .guest_token | cut -d '"' -f 2) USER_ID=$(curl -s -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "x-guest-token: $GUEST_TOKEN" \ -H "x-twitter-active-user: yes" \ -H "Referer: https://twitter.com/" \ "https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22$USERNAME%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" \ | jq -r '.data.user.result.rest_id') curl -s -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "x-guest-token: $GUEST_TOKEN" \ -H "x-twitter-active-user: yes" \ -H "Referer: https://twitter.com" "https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies?variables=%7B%22userId%22%3A%22$USER_ID%22,%22count%22%3A40,%22includePromotedContent%22%3Atrue,%22withCommunity%22%3Atrue,%22withSuperFollowsUserFields%22%3Atrue,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Atrue,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D" \ | jq '..|.full_text?|select(length>0)' ```
Write commented 2023-07-03 19:44:12 -04:00 (Migrated from github.com)

Poor man's nitter:

🤣

poor_man_nitter.sh

> Poor man's nitter: 🤣 poor_man_nitter.sh
polhdez commented 2023-07-03 19:45:25 -04:00 (Migrated from github.com)

Poor man's nitter:

rofl

muskie shows up
Screenshot from 2023-07-04 01-44-33

> > Poor man's nitter: > > rofl muskie shows up ![Screenshot from 2023-07-04 01-44-33](https://github.com/zedeus/nitter/assets/18359265/a814fff7-f675-4843-abc8-169f95cb1910)
Write commented 2023-07-03 19:45:54 -04:00 (Migrated from github.com)

Love your poor_man_nitter.sh
Screenshot du 2023-07-04 à 01 45 31

Love your poor_man_nitter.sh ![Screenshot du 2023-07-04 à 01 45 31](https://github.com/zedeus/nitter/assets/541722/1e7436b9-d11d-4c58-9e67-c0804a3b9363)
ultrajae commented 2023-07-03 19:52:33 -04:00 (Migrated from github.com)

Damn . SO syndication isn't working- there's no working way for the plebs to read a TL is there (other than these shell scripts you wizards are toying with now) .. correct?
(no rss-bridge either)

Damn . SO syndication isn't working- there's no working way for the plebs to read a TL is there (other than these shell scripts you wizards are toying with now) .. correct? (no rss-bridge either)
githubtefo commented 2023-07-03 19:55:15 -04:00 (Migrated from github.com)

poor_man_nitter.sh

hahaha
what if @ElonMusk monetizes scrapping for ChatGPT+ providing an improved API instead of chasing users?

UPDATE: apologizes for the off topic - won't bother you again.

> poor_man_nitter.sh hahaha what if @ElonMusk monetizes scrapping for ChatGPT+ providing an improved API instead of chasing users? UPDATE: apologizes for the off topic - won't bother you again.
Write commented 2023-07-03 19:57:36 -04:00 (Migrated from github.com)

Damn . SO syndication isn't working- there's no working way for the plebs to read a TL is there (other than these shell scripts you wizards are toying with now) .. correct? (no rss-bridge either)

Not that I found

> Damn . SO syndication isn't working- there's no working way for the plebs to read a TL is there (other than these shell scripts you wizards are toying with now) .. correct? (no rss-bridge either) Not that I found
Write commented 2023-07-03 19:58:33 -04:00 (Migrated from github.com)

@polkaulfield have you find a way to get only tweets without replies ? or at least that it returns more tweets, because for example, for elon we can't see any of his tweet because of all his replies

@polkaulfield have you find a way to get only tweets without replies ? or at least that it returns more tweets, because for example, for elon we can't see any of his tweet because of all his replies
polhdez commented 2023-07-03 20:03:26 -04:00 (Migrated from github.com)

Idk, ill take a look tomorrow. I just automated your commands and parsed the output for the laughs. Amazing work finding this API :D

Idk, ill take a look tomorrow. I just automated your commands and parsed the output for the laughs. Amazing work finding this API :D
Write commented 2023-07-03 20:11:10 -04:00 (Migrated from github.com)

I tried the rIIwMe1ObkGh_ByBtTCtRQ/UserTweets to no avail.

It always returns The following features cannot be null: [then it list all features].

Not sure what / if I did something wrong.

curl -s -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \
-H "x-guest-token: $GUEST_TOKEN" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com" "https://twitter.com/i/api/graphql/rIIwMe1ObkGh_ByBtTCtRQ/UserTweets?variables=%7B%22userId%22%3A%22$USER_ID%22,%22count%22%3A20,%22includePromotedContent%22%3Atrue,%22withQuickPromoteEligibilityTweetFields%22%3Atrue,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D%26features%3D%7B%22rweb_lists_timeline_redesign_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Afalse,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue,%22longform_notetweets_rich_text_read_enabled%22%3Atrue,%22longform_notetweets_inline_media_enabled%22%3Atrue,%22responsive_web_media_download_video_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D%26fieldToggles%3D%7B%22withArticleRichContentState%22%3Afalse%7D" 
I tried the rIIwMe1ObkGh_ByBtTCtRQ/UserTweets to no avail. It always returns The following features cannot be null: [then it list all features]. Not sure what / if I did something wrong. ```bash curl -s -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "x-guest-token: $GUEST_TOKEN" \ -H "x-twitter-active-user: yes" \ -H "Referer: https://twitter.com" "https://twitter.com/i/api/graphql/rIIwMe1ObkGh_ByBtTCtRQ/UserTweets?variables=%7B%22userId%22%3A%22$USER_ID%22,%22count%22%3A20,%22includePromotedContent%22%3Atrue,%22withQuickPromoteEligibilityTweetFields%22%3Atrue,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D%26features%3D%7B%22rweb_lists_timeline_redesign_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Afalse,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue,%22longform_notetweets_rich_text_read_enabled%22%3Atrue,%22longform_notetweets_inline_media_enabled%22%3Atrue,%22responsive_web_media_download_video_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D%26fieldToggles%3D%7B%22withArticleRichContentState%22%3Afalse%7D" ```
ScamCast commented 2023-07-03 20:38:51 -04:00 (Migrated from github.com)

Eliminating x-guest-token header has been working for me

Edit: Added authenticate(), TweetDetail()

import requests, json
from pprint import pprint as pp

headers = {
    "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR",
    "x-guest-token": "",
    "x-twitter-active-user": "yes",
    "Referer": "https://twitter.com",
    "user-agent": "",
}

def authenticate():
    resp1 = requests.post("https://api.twitter.com/oauth2/token", params={"grant_type": "client_credentials"}, auth=("CjulERsDeqhhjSme66ECg", "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck")).json()
    headers["Authorization"] = f"Bearer {resp1['access_token']}"
    resp2 = requests.post("https://api.twitter.com/1.1/guest/activate.json", headers=headers).json()
    headers["x-guest-token"] = resp2["guest_token"]
    return {"access_token": resp1['access_token'], "guest_token": resp2["guest_token"]}


def UserByScreenName(username):
    return requests.get("https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName", headers=headers, params={
        "features": json.dumps({
            "hidden_profile_likes_enabled": False,
            "responsive_web_graphql_exclude_directive_enabled": True,
            "verified_phone_label_enabled": False,
            "subscriptions_verification_info_verified_since_enabled": True,
            "highlights_tweets_tab_ui_enabled": True,
            "creator_subscriptions_tweet_preview_api_enabled": True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False,
            "responsive_web_graphql_timeline_navigation_enabled": True
        }),
        "variables": json.dumps({
            "screen_name": username,
            "withSafetyModeUserFields": True
        })
    }).json()

def UserResultByIdQuery(userId):
    return requests.get("https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery", headers=headers, params={
        "features": json.dumps({
            "blue_business_profile_image_shape_enabled": False,
            "verified_phone_label_enabled": False,
            "super_follow_user_api_enabled": False,
            "super_follow_badge_privacy_enabled": False,
            "subscriptions_verification_info_enabled": False,
            "creator_subscriptions_subscription_count_enabled": False,
            "super_follow_exclusive_tweet_notifications_enabled": False
        }),
        "variables": json.dumps({
            "user_id": f"{userId}",
            "rest_id": f"{userId}"
        })
    }).json()

def UserTweetsAndReplies(userId):
    return requests.get("https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies", headers=headers, params={
        "features": json.dumps({
            "responsive_web_twitter_blue_verified_badge_is_enabled": True,
            "responsive_web_graphql_exclude_directive_enabled": True,
            "verified_phone_label_enabled": False,
            "responsive_web_graphql_timeline_navigation_enabled": True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False,
            "tweetypie_unmention_optimization_enabled": True,
            "vibe_api_enabled": True,
            "responsive_web_edit_tweet_api_enabled": True,
            "graphql_is_translatable_rweb_tweet_is_translatable_enabled": True,
            "view_counts_everywhere_api_enabled": True,
            "longform_notetweets_consumption_enabled": True,
            "tweet_awards_web_tipping_enabled": False,
            "freedom_of_speech_not_reach_fetch_enabled": False,
            "standardized_nudges_misinfo": True,
            "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False,
            "interactive_text_enabled": True,
            "responsive_web_text_conversations_enabled": False,
            "longform_notetweets_richtext_consumption_enabled": False,
            "responsive_web_enhance_cards_enabled":False
        }),
        "variables": json.dumps({
            "userId": f"{user_id}",
            "count": 40,
            "includePromotedContent": True,
            "withCommunity": True,
            "withSuperFollowsUserFields": True,
            "withDownvotePerspective": False,
            "withReactionsMetadata": False,
            "withReactionsPerspective": False,
            "withSuperFollowsTweetFields": True,
            "withVoice": True,
            "withV2Timeline":True
        })
    }).json()

def TweetDetail(tweetId):
    return requests.get("https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail", headers=headers, params={
        "features": json.dumps({
            "rweb_lists_timeline_redesign_enabled": True,
            "creator_subscriptions_tweet_preview_api_enabled": True,
            "responsive_web_twitter_article_tweet_consumption_enabled": False,
            "longform_notetweets_rich_text_read_enabled": True,
            "longform_notetweets_inline_media_enabled": True,
            "responsive_web_media_download_video_enabled": True,
            "responsive_web_enhance_cards_enabled": True,
            "responsive_web_twitter_blue_verified_badge_is_enabled":True,
            "responsive_web_graphql_exclude_directive_enabled":True,
            "verified_phone_label_enabled":False,
            "responsive_web_graphql_timeline_navigation_enabled":True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled":False,
            "tweetypie_unmention_optimization_enabled":True,
            "vibe_api_enabled":True,
            "responsive_web_edit_tweet_api_enabled":True,
            "graphql_is_translatable_rweb_tweet_is_translatable_enabled":False,
            "view_counts_everywhere_api_enabled":True,
            "longform_notetweets_consumption_enabled":True,
            "tweet_awards_web_tipping_enabled":False,
            "freedom_of_speech_not_reach_fetch_enabled":False,
            "standardized_nudges_misinfo":True,
            "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled":False,
            "interactive_text_enabled":True,
            "responsive_web_text_conversations_enabled":False,
            "longform_notetweets_richtext_consumption_enabled":False,
            "responsive_web_enhance_cards_enabled":True
            
        }),
        "variables": json.dumps({
            "focalTweetId":tweetId,
            "with_rux_injections":True,
            "includePromotedContent":False,
            "withCommunity":False,
            "withQuickPromoteEligibilityTweetFields":False,
            "withBirdwatchNotes":False,
            "withSuperFollowsUserFields":False,
            "withDownvotePerspective":False,
            "withReactionsMetadata":False,
            "withReactionsPerspective":False,
            "withSuperFollowsTweetFields":False,
            "withVoice":True,
            "withV2Timeline":True
        }),
        "fieldToggles": json.dumps({
            "withArticleRichContentState": False
        })
    }).json()



test_username = 'elonmusk'
test_tweet_id = 1675390796718014464

authenticate()

user_id = UserByScreenName(test_username)['data']['user']['result']['rest_id']
tweets = UserTweetsAndReplies(user_id)['data']['user']['result']['timeline_v2']['timeline']['instructions'][1]['entries']
tweet_thread = TweetDetail(test_tweet_id)['data']['threaded_conversation_with_injections_v2']['instructions'][0]['entries']

pp(tweet_thread)
Eliminating x-guest-token header has been working for me Edit: Added authenticate(), TweetDetail() ```python import requests, json from pprint import pprint as pp headers = { "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR", "x-guest-token": "", "x-twitter-active-user": "yes", "Referer": "https://twitter.com", "user-agent": "", } def authenticate(): resp1 = requests.post("https://api.twitter.com/oauth2/token", params={"grant_type": "client_credentials"}, auth=("CjulERsDeqhhjSme66ECg", "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck")).json() headers["Authorization"] = f"Bearer {resp1['access_token']}" resp2 = requests.post("https://api.twitter.com/1.1/guest/activate.json", headers=headers).json() headers["x-guest-token"] = resp2["guest_token"] return {"access_token": resp1['access_token'], "guest_token": resp2["guest_token"]} def UserByScreenName(username): return requests.get("https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName", headers=headers, params={ "features": json.dumps({ "hidden_profile_likes_enabled": False, "responsive_web_graphql_exclude_directive_enabled": True, "verified_phone_label_enabled": False, "subscriptions_verification_info_verified_since_enabled": True, "highlights_tweets_tab_ui_enabled": True, "creator_subscriptions_tweet_preview_api_enabled": True, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False, "responsive_web_graphql_timeline_navigation_enabled": True }), "variables": json.dumps({ "screen_name": username, "withSafetyModeUserFields": True }) }).json() def UserResultByIdQuery(userId): return requests.get("https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery", headers=headers, params={ "features": json.dumps({ "blue_business_profile_image_shape_enabled": False, "verified_phone_label_enabled": False, "super_follow_user_api_enabled": False, "super_follow_badge_privacy_enabled": False, "subscriptions_verification_info_enabled": False, "creator_subscriptions_subscription_count_enabled": False, "super_follow_exclusive_tweet_notifications_enabled": False }), "variables": json.dumps({ "user_id": f"{userId}", "rest_id": f"{userId}" }) }).json() def UserTweetsAndReplies(userId): return requests.get("https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies", headers=headers, params={ "features": json.dumps({ "responsive_web_twitter_blue_verified_badge_is_enabled": True, "responsive_web_graphql_exclude_directive_enabled": True, "verified_phone_label_enabled": False, "responsive_web_graphql_timeline_navigation_enabled": True, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False, "tweetypie_unmention_optimization_enabled": True, "vibe_api_enabled": True, "responsive_web_edit_tweet_api_enabled": True, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": True, "view_counts_everywhere_api_enabled": True, "longform_notetweets_consumption_enabled": True, "tweet_awards_web_tipping_enabled": False, "freedom_of_speech_not_reach_fetch_enabled": False, "standardized_nudges_misinfo": True, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False, "interactive_text_enabled": True, "responsive_web_text_conversations_enabled": False, "longform_notetweets_richtext_consumption_enabled": False, "responsive_web_enhance_cards_enabled":False }), "variables": json.dumps({ "userId": f"{user_id}", "count": 40, "includePromotedContent": True, "withCommunity": True, "withSuperFollowsUserFields": True, "withDownvotePerspective": False, "withReactionsMetadata": False, "withReactionsPerspective": False, "withSuperFollowsTweetFields": True, "withVoice": True, "withV2Timeline":True }) }).json() def TweetDetail(tweetId): return requests.get("https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail", headers=headers, params={ "features": json.dumps({ "rweb_lists_timeline_redesign_enabled": True, "creator_subscriptions_tweet_preview_api_enabled": True, "responsive_web_twitter_article_tweet_consumption_enabled": False, "longform_notetweets_rich_text_read_enabled": True, "longform_notetweets_inline_media_enabled": True, "responsive_web_media_download_video_enabled": True, "responsive_web_enhance_cards_enabled": True, "responsive_web_twitter_blue_verified_badge_is_enabled":True, "responsive_web_graphql_exclude_directive_enabled":True, "verified_phone_label_enabled":False, "responsive_web_graphql_timeline_navigation_enabled":True, "responsive_web_graphql_skip_user_profile_image_extensions_enabled":False, "tweetypie_unmention_optimization_enabled":True, "vibe_api_enabled":True, "responsive_web_edit_tweet_api_enabled":True, "graphql_is_translatable_rweb_tweet_is_translatable_enabled":False, "view_counts_everywhere_api_enabled":True, "longform_notetweets_consumption_enabled":True, "tweet_awards_web_tipping_enabled":False, "freedom_of_speech_not_reach_fetch_enabled":False, "standardized_nudges_misinfo":True, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled":False, "interactive_text_enabled":True, "responsive_web_text_conversations_enabled":False, "longform_notetweets_richtext_consumption_enabled":False, "responsive_web_enhance_cards_enabled":True }), "variables": json.dumps({ "focalTweetId":tweetId, "with_rux_injections":True, "includePromotedContent":False, "withCommunity":False, "withQuickPromoteEligibilityTweetFields":False, "withBirdwatchNotes":False, "withSuperFollowsUserFields":False, "withDownvotePerspective":False, "withReactionsMetadata":False, "withReactionsPerspective":False, "withSuperFollowsTweetFields":False, "withVoice":True, "withV2Timeline":True }), "fieldToggles": json.dumps({ "withArticleRichContentState": False }) }).json() test_username = 'elonmusk' test_tweet_id = 1675390796718014464 authenticate() user_id = UserByScreenName(test_username)['data']['user']['result']['rest_id'] tweets = UserTweetsAndReplies(user_id)['data']['user']['result']['timeline_v2']['timeline']['instructions'][1]['entries'] tweet_thread = TweetDetail(test_tweet_id)['data']['threaded_conversation_with_injections_v2']['instructions'][0]['entries'] pp(tweet_thread) ```
AlexCSDev commented 2023-07-03 20:42:50 -04:00 (Migrated from github.com)

Has anyone figured out any graphql endpoint for retrieving tweets by id? I have a list of like several thousand tweets I'd like to get asap with as little manual work as possible.

Has anyone figured out any graphql endpoint for retrieving tweets by id? I have a list of like several thousand tweets I'd like to get asap with as little manual work as possible.
diehard88 commented 2023-07-03 20:47:03 -04:00 (Migrated from github.com)

@devgaucho a la putcha, tchê.

@devgaucho a la putcha, tchê.
diehard88 commented 2023-07-03 20:47:38 -04:00 (Migrated from github.com)

@rupakhetibinit thoughts and prayers

@rupakhetibinit thoughts and prayers
diehard88 commented 2023-07-03 20:50:56 -04:00 (Migrated from github.com)

@animegrafmays thoughts and prayers

@animegrafmays thoughts and prayers
signalharbor27 commented 2023-07-03 20:55:22 -04:00 (Migrated from github.com)

Has anyone figured out any graphql endpoint for retrieving tweets by id? I have a list of like several thousand tweets I'd like to get asap with as little manual work as possible.

Syndication API still works for that:

import requests

id = "1675187969420828672"
url = f"https://cdn.syndication.twimg.com/tweet-result?id={id}"

r = requests.get(url)

data = r.json()

print(data["text"])
> Has anyone figured out any graphql endpoint for retrieving tweets by id? I have a list of like several thousand tweets I'd like to get asap with as little manual work as possible. Syndication API still works for that: ``` import requests id = "1675187969420828672" url = f"https://cdn.syndication.twimg.com/tweet-result?id={id}" r = requests.get(url) data = r.json() print(data["text"]) ```
Write commented 2023-07-03 21:09:23 -04:00 (Migrated from github.com)

Has anyone figured out any graphql endpoint for retrieving tweets by id? I have a list of like several thousand tweets I'd like to get asap with as little manual work as possible.

https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail?variables=%7B%22focalTweetId%22%3A% + statusId + %22,%22with_rux_injections%22%3Atrue,%22includePromotedContent%22%3Afalse,%22withCommunity%22%3Afalse,%22withQuickPromoteEligibilityTweetFields%22%3Afalse,%22withBirdwatchNotes%22%3Afalse,%22withSuperFollowsUserFields%22%3Afalse,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Afalse,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Atrue%7D

> Has anyone figured out any graphql endpoint for retrieving tweets by id? I have a list of like several thousand tweets I'd like to get asap with as little manual work as possible. `https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail?variables=%7B%22focalTweetId%22%3A% + statusId + %22,%22with_rux_injections%22%3Atrue,%22includePromotedContent%22%3Afalse,%22withCommunity%22%3Afalse,%22withQuickPromoteEligibilityTweetFields%22%3Afalse,%22withBirdwatchNotes%22%3Afalse,%22withSuperFollowsUserFields%22%3Afalse,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Afalse,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Atrue%7D`
worstperson commented 2023-07-03 21:29:50 -04:00 (Migrated from github.com)

This works for me for UserTweets

#!/bin/sh

[ -z "$1" ] && echo "USAGE: $(basename $0) username_to_search" && exit

USERNAME=$1

echo "Searching..."

ACCESS_TOKEN=$(curl -s -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck" | jq .access_token | cut -d '"' -f 2)

GUEST_TOKEN=$(curl -s -X POST -H "Authorization: Bearer $ACCESS_TOKEN" "https://api.twitter.com/1.1/guest/activate.json" | jq .guest_token | cut -d '"' -f 2)

USER_ID=$(curl -s -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \
-H "x-guest-token: $GUEST_TOKEN" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22$USERNAME%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" \
| jq -r '.data.user.result.rest_id')

curl -s -o tweets.txt -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \
-H "x-guest-token: $GUEST_TOKEN" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/rCpYpqplOq3UJ2p6Oxy3tw/UserTweets?variables=%7B%22userId%22%3A%22$USER_ID%22,%22count%22%3A10,%22includePromotedContent%22%3Atrue,%22withQuickPromoteEligibilityTweetFields%22%3Atrue,%22withSuperFollowsUserFields%22%3Atrue,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Afalse,%22withV2Timeline%22%3Afalse%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Afalse,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22freedom_of_speech_not_reach_appeal_label_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D"

I dumped json to file tweets.txt rather than parse. Got it from here before they switched to using user's auth tokens:
https://github.com/Spicadox/auto-twitter-space/blob/master/index.py

This works for me for UserTweets ``` #!/bin/sh [ -z "$1" ] && echo "USAGE: $(basename $0) username_to_search" && exit USERNAME=$1 echo "Searching..." ACCESS_TOKEN=$(curl -s -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck" | jq .access_token | cut -d '"' -f 2) GUEST_TOKEN=$(curl -s -X POST -H "Authorization: Bearer $ACCESS_TOKEN" "https://api.twitter.com/1.1/guest/activate.json" | jq .guest_token | cut -d '"' -f 2) USER_ID=$(curl -s -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "x-guest-token: $GUEST_TOKEN" \ -H "x-twitter-active-user: yes" \ -H "Referer: https://twitter.com/" \ "https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22$USERNAME%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" \ | jq -r '.data.user.result.rest_id') curl -s -o tweets.txt -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "x-guest-token: $GUEST_TOKEN" \ -H "x-twitter-active-user: yes" \ -H "Referer: https://twitter.com/" \ "https://api.twitter.com/graphql/rCpYpqplOq3UJ2p6Oxy3tw/UserTweets?variables=%7B%22userId%22%3A%22$USER_ID%22,%22count%22%3A10,%22includePromotedContent%22%3Atrue,%22withQuickPromoteEligibilityTweetFields%22%3Atrue,%22withSuperFollowsUserFields%22%3Atrue,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Afalse,%22withV2Timeline%22%3Afalse%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Afalse,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22freedom_of_speech_not_reach_appeal_label_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D" ``` I dumped json to file tweets.txt rather than parse. Got it from here before they switched to using user's auth tokens: https://github.com/Spicadox/auto-twitter-space/blob/master/index.py
ScamCast commented 2023-07-03 21:47:45 -04:00 (Migrated from github.com)
Updated: https://github.com/zedeus/nitter/issues/919#issuecomment-1619298877
Write commented 2023-07-03 21:48:40 -04:00 (Migrated from github.com)

Updated: #919 (comment)

Loving your poor_man_nitter.py

> Updated: [#919 (comment)](https://github.com/zedeus/nitter/issues/919#issuecomment-1619298877) Loving your poor_man_nitter.py
Write commented 2023-07-03 21:50:57 -04:00 (Migrated from github.com)

Working for me thanks a lot.

This works for me for UserTweets

#!/bin/sh

[ -z "$1" ] && echo "USAGE: $(basename $0) username_to_search" && exit

USERNAME=$1

echo "Searching..."

ACCESS_TOKEN=$(curl -s -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck" | jq .access_token | cut -d '"' -f 2)

GUEST_TOKEN=$(curl -s -X POST -H "Authorization: Bearer $ACCESS_TOKEN" "https://api.twitter.com/1.1/guest/activate.json" | jq .guest_token | cut -d '"' -f 2)

USER_ID=$(curl -s -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \
-H "x-guest-token: $GUEST_TOKEN" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22$USERNAME%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" \
| jq -r '.data.user.result.rest_id')

curl -s -o tweets.txt -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \
-H "x-guest-token: $GUEST_TOKEN" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/rCpYpqplOq3UJ2p6Oxy3tw/UserTweets?variables=%7B%22userId%22%3A%22$USER_ID%22,%22count%22%3A10,%22includePromotedContent%22%3Atrue,%22withQuickPromoteEligibilityTweetFields%22%3Atrue,%22withSuperFollowsUserFields%22%3Atrue,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Afalse,%22withV2Timeline%22%3Afalse%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Afalse,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22freedom_of_speech_not_reach_appeal_label_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D"

I dumped json to file tweets.txt rather than parse. Got it from here before they switched to using user's auth tokens: https://github.com/Spicadox/auto-twitter-space/blob/master/index.py

Working thanks a lot !

@ScamCast you should add this one :D

> Working for me thanks a lot. > This works for me for UserTweets > > ``` > #!/bin/sh > > [ -z "$1" ] && echo "USAGE: $(basename $0) username_to_search" && exit > > USERNAME=$1 > > echo "Searching..." > > ACCESS_TOKEN=$(curl -s -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck" | jq .access_token | cut -d '"' -f 2) > > GUEST_TOKEN=$(curl -s -X POST -H "Authorization: Bearer $ACCESS_TOKEN" "https://api.twitter.com/1.1/guest/activate.json" | jq .guest_token | cut -d '"' -f 2) > > USER_ID=$(curl -s -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \ > -H "x-guest-token: $GUEST_TOKEN" \ > -H "x-twitter-active-user: yes" \ > -H "Referer: https://twitter.com/" \ > "https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22$USERNAME%22%2C%22withSafetyModeUserFields%22%3Atrue%7D&features=%7B%22hidden_profile_likes_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D" \ > | jq -r '.data.user.result.rest_id') > > curl -s -o tweets.txt -X GET -H "Authorization: Bearer $ACCESS_TOKEN" \ > -H "x-guest-token: $GUEST_TOKEN" \ > -H "x-twitter-active-user: yes" \ > -H "Referer: https://twitter.com/" \ > "https://api.twitter.com/graphql/rCpYpqplOq3UJ2p6Oxy3tw/UserTweets?variables=%7B%22userId%22%3A%22$USER_ID%22,%22count%22%3A10,%22includePromotedContent%22%3Atrue,%22withQuickPromoteEligibilityTweetFields%22%3Atrue,%22withSuperFollowsUserFields%22%3Atrue,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Afalse,%22withV2Timeline%22%3Afalse%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Afalse,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22freedom_of_speech_not_reach_appeal_label_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Afalse%7D" > ``` > > I dumped json to file tweets.txt rather than parse. Got it from here before they switched to using user's auth tokens: https://github.com/Spicadox/auto-twitter-space/blob/master/index.py Working thanks a lot ! @ScamCast you should add this one :D
Write commented 2023-07-03 22:10:50 -04:00 (Migrated from github.com)

btw guys, just changing the bearer const. is enough to make nitter work 100%

Here : github.com/zedeus/nitter@dcf73354ff/src/consts.nim (L5C21-L5C21)
(Just figured there's all grapheQL endpoints here too)

Proof : https://nitter.socialspill.com/

I really don't think this method (which comes from bird.makeup) will hold long time.

[guys, don't even try to scrape this instance, please, I will shutdown it soon anyway]

EDIT : Well it already stopped working, 🤡 not sure if it's nitter not refreshing guest_tokens or something else

I dont' know enough about nitter guys, it stopped working even though it's not my ip that is limited since poor_man_nitter with the same Bearer tokens still work. So... No idea.
All graphql returns 404 not found on nitter

btw guys, just changing the bearer const. is enough to make nitter work 100% Here : https://github.com/zedeus/nitter/blob/dcf73354ff173c0407c62f84ea3bb90a130303c1/src/consts.nim#L5C21-L5C21 _(Just figured there's all grapheQL endpoints here too)_ ~~Proof : https://nitter.socialspill.com/~~ I really don't think this method (which comes from bird.makeup) will hold long time. **[guys, don't even try to scrape this instance, please, I will shutdown it soon anyway]** EDIT : Well it already stopped working, 🤡 not sure if it's nitter not refreshing guest_tokens or something else I dont' know enough about nitter guys, it stopped working even though it's not my ip that is limited since poor_man_nitter with the same Bearer tokens still work. So... No idea. All graphql returns 404 not found on nitter
mthmcalixto commented 2023-07-03 23:25:22 -04:00 (Migrated from github.com)

btw guys, just changing the bearer const. is enough to make nitter work 100%

Here : github.com/zedeus/nitter@dcf73354ff/src/consts.nim (L5C21-L5C21) (Just figured there's all grapheQL endpoints here too)

Proof : https://nitter.socialspill.com/

I really don't think this method (which comes from bird.makeup) will hold long time.

[guys, don't even try to scrape this instance, please, I will shutdown it soon anyway]

EDIT : Well it already stopped working, 🤡 not sure if it's nitter not refreshing guest_tokens or something else

I dont' know enough about nitter guys, it stopped working even though it's not my ip that is limited since poor_man_nitter with the same Bearer tokens still work. So... No idea. All graphql returns 404 not found on nitter

It just stopped, it doesn't work.

> btw guys, just changing the bearer const. is enough to make nitter work 100% > > Here : https://github.com/zedeus/nitter/blob/dcf73354ff173c0407c62f84ea3bb90a130303c1/src/consts.nim#L5C21-L5C21 _(Just figured there's all grapheQL endpoints here too)_ > > ~Proof : https://nitter.socialspill.com/~ > > I really don't think this method (which comes from bird.makeup) will hold long time. > > **[guys, don't even try to scrape this instance, please, I will shutdown it soon anyway]** > > EDIT : Well it already stopped working, 🤡 not sure if it's nitter not refreshing guest_tokens or something else > > I dont' know enough about nitter guys, it stopped working even though it's not my ip that is limited since poor_man_nitter with the same Bearer tokens still work. So... No idea. All graphql returns 404 not found on nitter It just stopped, it doesn't work.
Write commented 2023-07-04 00:05:15 -04:00 (Migrated from github.com)

btw guys, just changing the bearer const. is enough to make nitter work 100%
Here : github.com/zedeus/nitter@dcf73354ff/src/consts.nim (L5C21-L5C21) (Just figured there's all grapheQL endpoints here too)
Proof : https://nitter.socialspill.com/
I really don't think this method (which comes from bird.makeup) will hold long time.
[guys, don't even try to scrape this instance, please, I will shutdown it soon anyway]
EDIT : Well it already stopped working, 🤡 not sure if it's nitter not refreshing guest_tokens or something else
I dont' know enough about nitter guys, it stopped working even though it's not my ip that is limited since poor_man_nitter with the same Bearer tokens still work. So... No idea. All graphql returns 404 not found on nitter

It just stopped, it doesn't work.

Yeah, I know, I edited my message. But it worked for a while. And I really have no idea why it doesn't work anymore since with the same ip / bearer it still work just fine with the poor_man_nitter script

> > btw guys, just changing the bearer const. is enough to make nitter work 100% > > Here : https://github.com/zedeus/nitter/blob/dcf73354ff173c0407c62f84ea3bb90a130303c1/src/consts.nim#L5C21-L5C21 _(Just figured there's all grapheQL endpoints here too)_ > > ~Proof : https://nitter.socialspill.com/~ > > I really don't think this method (which comes from bird.makeup) will hold long time. > > **[guys, don't even try to scrape this instance, please, I will shutdown it soon anyway]** > > EDIT : Well it already stopped working, 🤡 not sure if it's nitter not refreshing guest_tokens or something else > > I dont' know enough about nitter guys, it stopped working even though it's not my ip that is limited since poor_man_nitter with the same Bearer tokens still work. So... No idea. All graphql returns 404 not found on nitter > > It just stopped, it doesn't work. Yeah, I know, I edited my message. But it worked for a while. And I really have no idea why it doesn't work anymore since with the same ip / bearer it still work just fine with the poor_man_nitter script
unseenlarks commented 2023-07-04 00:33:49 -04:00 (Migrated from github.com)

the strange thing is (well, strange to me, a simple end user; i'm sure the rest of you lot will understand) it didn't just stop... it went from displaying all tweets, to just pinned ones, to 502 errors for any additional accounts looked up (the previously looked up still displayed pinned tweets only, even after reloading in a private browser window), then 503 errors for all.

thank you kindly @Write for this latest effort.

the strange thing is (well, strange to me, a simple end user; i'm sure the rest of you lot will understand) it didn't just stop... it went from displaying all tweets, to just pinned ones, to 502 errors for any additional accounts looked up (the previously looked up still displayed pinned tweets only, even after reloading in a private browser window), then 503 errors for all. thank you kindly @Write for this latest effort.
Write commented 2023-07-04 00:44:04 -04:00 (Migrated from github.com)

Pretty sure we need all endpoints compatible with this Bearer / APps for it to work properly. For now

For now we have some working, such as pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies.

We would need all of them that are compatible with this Bearer / Apps to make it work and replace all the one ntiter currently use : github.com/zedeus/nitter@dcf73354ff/src/consts.nim (L5C21-L5C21)

For example one of the most important is SearchTimeline, which we haven't found one yet compatible with this specific Bearer.

Pretty sure we need all endpoints compatible with this Bearer / APps for it to work properly. For now For now we have some working, such as pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies. We would need all of them that are compatible with this Bearer / Apps to make it work and replace all the one ntiter currently use : https://github.com/zedeus/nitter/blob/dcf73354ff173c0407c62f84ea3bb90a130303c1/src/consts.nim#L5C21-L5C21 For example one of the most important is SearchTimeline, which we haven't found one yet compatible with this specific Bearer.
ScamCast commented 2023-07-04 01:12:07 -04:00 (Migrated from github.com)

Inspecting all the requests that the Twitter Android app is making inside an emulator. Getting lots of useful stuff.

image

Twitter uses some funky domain for their app API.
https://na.albtls.t.co/graphql/3JNH4e9dq1BifLxAa3UMWg/UserWithProfileTweetsQueryV2

image

Inspecting all the requests that the Twitter Android app is making inside an emulator. Getting lots of useful stuff. ![image](https://github.com/zedeus/nitter/assets/56202326/f515d27f-55a9-4757-ac36-9929fef617e9) Twitter uses some funky domain for their app API. `https://na.albtls.t.co/graphql/3JNH4e9dq1BifLxAa3UMWg/UserWithProfileTweetsQueryV2` ![image](https://github.com/zedeus/nitter/assets/56202326/e6534a28-941c-4257-8d3d-ec487f91a865)
rohitrsm83 commented 2023-07-04 02:41:11 -04:00 (Migrated from github.com)

Greetings,

I am no way a coder/developer but have been using Nitter for a while and sad to see the recent developments. While looking for solutions, I came across this (I remember using it some years ago). Wonder how it works and if it may be of any help at all:

https://tweettunnel.com/maxabrahms

We can see the tweets, albeit in limited forms and clicking on links does take us to Twitter (and no, I didn't sign in).

My 2 pennies.

Best

Greetings, I am no way a coder/developer but have been using Nitter for a while and sad to see the recent developments. While looking for solutions, I came across this (I remember using it some years ago). Wonder how it works and if it may be of any help at all: https://tweettunnel.com/maxabrahms We can see the tweets, albeit in limited forms and clicking on links does take us to Twitter (and no, I didn't sign in). My 2 pennies. Best
alexvong243f commented 2023-07-04 02:54:55 -04:00 (Migrated from github.com)

im having success scraping the embedded timeline as suggested by @fREAST

https://rss-bridge.org/bridge01/?action=display&bridge=TwitterBridge&context=By+username&u=DailyCaller&format=Html (1 hour cache)

[0] code for the temp fix: dvikan/rss-bridge@c4a82ee

Just in case someone don't know about this: RSS-Bridge (official instance and other public instances) also supports generating rss feeds from other sources, e.g. public telegram channels. It's not the 1st time twitter breaks 3rd party program, so I'd assume it's not the last. Some organisations have telegram channels in addition to twitter accounts, e.g. some news sites.

It is sad that things turn out this way. I avoid tiktok, facebook and related services due to their gross privacy violations and not wanting to support their unethical behaviour. Now others are having accessibility issues.

> im having success scraping the embedded timeline as suggested by @fREAST > > https://rss-bridge.org/bridge01/?action=display&bridge=TwitterBridge&context=By+username&u=DailyCaller&format=Html (1 hour cache) > > [0] code for the temp fix: [dvikan/rss-bridge@c4a82ee](https://github.com/dvikan/rss-bridge/commit/c4a82ee3baf832cca6068634cfd1a97b104afeb9) Just in case someone don't know about this: [RSS-Bridge](https://github.com/dvikan/rss-bridge) ([official instance](https://rss-bridge.org/bridge01) and [other public instances](https://rss-bridge.github.io/rss-bridge/General/Public_Hosts.html)) also supports generating rss feeds from other sources, e.g. public telegram channels. It's not the 1st time twitter breaks 3rd party program, so I'd assume it's not the last. Some organisations have telegram channels in addition to twitter accounts, e.g. some news sites. It is sad that things turn out this way. I avoid tiktok, facebook and related services due to their gross privacy violations and not wanting to support their unethical behaviour. Now others are having accessibility issues.
Melanpan commented 2023-07-04 04:15:27 -04:00 (Migrated from github.com)

Been using my own local Nitter instance to generate a combined RSS feed of users I want to follow, because fuck using the cluster fuck that's Twitter and their algos.

Anyway, ever since Musk-chan put up the login wall and limits, it stopped working. But very rarely, it will still work and let through a couple of tweets. 4 hours ago, one of my rss feeds suddenly contained 14 new tweets that were made today.

It's interesting behavior but briefly looking over the ~500MB logs didn't make me any wiser. Other than seeing a whole lot of 404s for "UserByScreenName" and ratelimit errors for "https://api.twitter.com/2/timeline/profile/"

Been using my own local Nitter instance to generate a combined RSS feed of users I want to follow, because fuck using the cluster fuck that's Twitter and their algos. Anyway, ever since Musk-chan put up the login wall and limits, it stopped working. But very rarely, it will still work and let through a couple of tweets. 4 hours ago, one of my rss feeds suddenly contained 14 new tweets that were made today. It's interesting behavior but briefly looking over the ~500MB logs didn't make me any wiser. Other than seeing a whole lot of 404s for "UserByScreenName" and ratelimit errors for "https://api.twitter.com/2/timeline/profile/"
polhdez commented 2023-07-04 05:01:36 -04:00 (Migrated from github.com)

SearchTimeline

Pretty sure we need all endpoints compatible with this Bearer / APps for it to work properly. For now

For now we have some working, such as pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies.

We would need all of them that are compatible with this Bearer / Apps to make it work and replace all the one ntiter currently use : github.com/zedeus/nitter@dcf73354ff/src/consts.nim (L5C21-L5C21)

For example one of the most important is SearchTimeline, which we haven't found one yet compatible with this specific Bearer.

Try this one:
G8jKRx5LiyrRDs5FcsUjsw/SearchTimeline

> SearchTimeline > Pretty sure we need all endpoints compatible with this Bearer / APps for it to work properly. For now > > For now we have some working, such as pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies. > > We would need all of them that are compatible with this Bearer / Apps to make it work and replace all the one ntiter currently use : https://github.com/zedeus/nitter/blob/dcf73354ff173c0407c62f84ea3bb90a130303c1/src/consts.nim#L5C21-L5C21 > > For example one of the most important is SearchTimeline, which we haven't found one yet compatible with this specific Bearer. Try this one: G8jKRx5LiyrRDs5FcsUjsw/SearchTimeline
polhdez commented 2023-07-04 05:15:20 -04:00 (Migrated from github.com)
@Write @ScamCast I found a ton of GraphQL endpoints in the android app. Worth looking: https://gist.github.com/polkaulfield/8c84087fafa476e86f768ad25ec44f7b https://gist.github.com/polkaulfield/adfd371a5157c2fb4b334244b29e094a
ghost commented 2023-07-04 05:17:41 -04:00 (Migrated from github.com)

@Write I found a ton of GraphQL endpoints in the android app. Worth looking: https://gist.github.com/polkaulfield/8c84087fafa476e86f768ad25ec44f7b https://gist.github.com/polkaulfield/adfd371a5157c2fb4b334244b29e094a

Have you tested them? The the Android Bearer does not work and the endpoints are device-dependent. The Mac Bearer works.

Inserting the above constants in the nitter source code makes only the user search work, for me.

> @Write I found a ton of GraphQL endpoints in the android app. Worth looking: https://gist.github.com/polkaulfield/8c84087fafa476e86f768ad25ec44f7b https://gist.github.com/polkaulfield/adfd371a5157c2fb4b334244b29e094a Have you tested them? The the Android Bearer does *not* work and the endpoints are device-dependent. The Mac Bearer works. Inserting the above constants in the nitter source code makes only the user search work, for me.
ScamCast commented 2023-07-04 05:18:23 -04:00 (Migrated from github.com)

Was able to find all these from the Android App. Have all their parameters too.

/graphql/IrbvwBFgqiH56L_CJII-7w/ArticleNudgeDomains
/graphql/xVEzTKg_mLTHubK5ayL0HA/AudioSpaceById
/graphql/FIFngkXiu0mzOdbG9qU_MA/BookmarkTimelineV2
/graphql/vm1ta0KYSj1FAwq6T4ffIQ/CarouselImmersiveVideoExploreMixerTimeline
/graphql/xmOcX9TQM1ehLo0EXRWZCA/CommunitiesMembership
/graphql/83h5UyHZ9wEKBVzALX8R_g/ConversationTimelineV2
/graphql/L4cVwybuGrRMhK3ngEJfYw/CreateRetweet
/graphql/b5FipP_f9ATR0AK26CmI1Q/CreateTweet
/graphql/r1IaAd_GIEunlPjVWVlD_w/DeleteRetweet
/graphql/kZyJ4Q1TNsZNByfrGX7Huw/DeleteTweet
/graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet
/graphql/lFi3xnx0auUUnyG4YwpCNw/GetUserClaims
/graphql/b5iDiSI383CiKnpSEzNHhA/HomeTimeline
/graphql/LBazRYwWLieONU-2qh_OHg/ListByIdQuery
/graphql/BbGLL1ZfMibdFNWlk7a0Pw/ListTimeline
/graphql/SLuxVIfuHyvMY5i6X0LEYw/ModeratedTimeline
/graphql/GCyWhVy_JrieSGYS1wOXjw/PinnedListsPut
/graphql/G8jKRx5LiyrRDs5FcsUjsw/SearchTimeline
/graphql/93WcusqmDycQFW9cKo-omg/TrustedFriendsListQueryMembersByRestId
/graphql/Kybeu8_QPBRgVqOo-NpjsQ/TrustedFriendsListQueryRecommendedMembersByRestId
/graphql/LaVEkyIlCyXrD_QXqWkdYA/TrustedFriendsListsQuery
/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail
/graphql/ZYKSe-w7KEslx3JhSIk5LA/UnfavoriteTweet
/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName
/graphql/d_AOVAjuTk4qD3QWf-1tAA/UserProfileModulesQuery
/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery
/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies
/graphql/3JNH4e9dq1BifLxAa3UMWg/UserWithProfileTweetsQueryV2
/graphql/1Giswwqz4Ycw_admXVSVEQ/ViewerClaimsQuery
/graphql/971aiUI0d5D5gDFa9HIq6g/ViewerPinnedLists
/graphql/7Y7BnzBIuXcnn6LDO4H-uQ/ViewerUserQuery

Taking a long time to put them in a readable format. 😪

image

Was able to find all these from the Android App. Have all their parameters too. ``` /graphql/IrbvwBFgqiH56L_CJII-7w/ArticleNudgeDomains /graphql/xVEzTKg_mLTHubK5ayL0HA/AudioSpaceById /graphql/FIFngkXiu0mzOdbG9qU_MA/BookmarkTimelineV2 /graphql/vm1ta0KYSj1FAwq6T4ffIQ/CarouselImmersiveVideoExploreMixerTimeline /graphql/xmOcX9TQM1ehLo0EXRWZCA/CommunitiesMembership /graphql/83h5UyHZ9wEKBVzALX8R_g/ConversationTimelineV2 /graphql/L4cVwybuGrRMhK3ngEJfYw/CreateRetweet /graphql/b5FipP_f9ATR0AK26CmI1Q/CreateTweet /graphql/r1IaAd_GIEunlPjVWVlD_w/DeleteRetweet /graphql/kZyJ4Q1TNsZNByfrGX7Huw/DeleteTweet /graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet /graphql/lFi3xnx0auUUnyG4YwpCNw/GetUserClaims /graphql/b5iDiSI383CiKnpSEzNHhA/HomeTimeline /graphql/LBazRYwWLieONU-2qh_OHg/ListByIdQuery /graphql/BbGLL1ZfMibdFNWlk7a0Pw/ListTimeline /graphql/SLuxVIfuHyvMY5i6X0LEYw/ModeratedTimeline /graphql/GCyWhVy_JrieSGYS1wOXjw/PinnedListsPut /graphql/G8jKRx5LiyrRDs5FcsUjsw/SearchTimeline /graphql/93WcusqmDycQFW9cKo-omg/TrustedFriendsListQueryMembersByRestId /graphql/Kybeu8_QPBRgVqOo-NpjsQ/TrustedFriendsListQueryRecommendedMembersByRestId /graphql/LaVEkyIlCyXrD_QXqWkdYA/TrustedFriendsListsQuery /graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail /graphql/ZYKSe-w7KEslx3JhSIk5LA/UnfavoriteTweet /graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName /graphql/d_AOVAjuTk4qD3QWf-1tAA/UserProfileModulesQuery /graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery /graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies /graphql/3JNH4e9dq1BifLxAa3UMWg/UserWithProfileTweetsQueryV2 /graphql/1Giswwqz4Ycw_admXVSVEQ/ViewerClaimsQuery /graphql/971aiUI0d5D5gDFa9HIq6g/ViewerPinnedLists /graphql/7Y7BnzBIuXcnn6LDO4H-uQ/ViewerUserQuery ``` Taking a long time to put them in a readable format. 😪 ![image](https://github.com/zedeus/nitter/assets/56202326/dcd9e7a0-d7f3-4fc9-92da-011586ea2341)
polhdez commented 2023-07-04 05:20:05 -04:00 (Migrated from github.com)

Can you connect using the guest token? I found a ton of hardcoded endpoints too inside the app.

Can you connect using the guest token? I found a ton of hardcoded endpoints too inside the app.
polhdez commented 2023-07-04 05:24:06 -04:00 (Migrated from github.com)

@Write I found a ton of GraphQL endpoints in the android app. Worth looking: https://gist.github.com/polkaulfield/8c84087fafa476e86f768ad25ec44f7b https://gist.github.com/polkaulfield/adfd371a5157c2fb4b334244b29e094a

Have you tested them? The the Android Bearer does not work and the endpoints are device-dependent. The Mac Bearer works.

Inserting the above constants in the nitter source code makes only the user search work, for me.

Didn't test, but that's what i found looking for com.twitter.graphql.GraphQlOperationRegistry

> > @Write I found a ton of GraphQL endpoints in the android app. Worth looking: https://gist.github.com/polkaulfield/8c84087fafa476e86f768ad25ec44f7b https://gist.github.com/polkaulfield/adfd371a5157c2fb4b334244b29e094a > > Have you tested them? The the Android Bearer does _not_ work and the endpoints are device-dependent. The Mac Bearer works. > > Inserting the above constants in the nitter source code makes only the user search work, for me. Didn't test, but that's what i found looking for `com.twitter.graphql.GraphQlOperationRegistry`
ScamCast commented 2023-07-04 05:34:37 -04:00 (Migrated from github.com)

@Write @ScamCast I found a ton of GraphQL endpoints in the android app. Worth looking: https://gist.github.com/polkaulfield/8c84087fafa476e86f768ad25ec44f7b https://gist.github.com/polkaulfield/adfd371a5157c2fb4b334244b29e094a

Nice! I just went through and parsed them all out

https://gist.github.com/ScamCast/2e40befbd1b61c4a80cda2745d4df1f4

> @Write @ScamCast I found a ton of GraphQL endpoints in the android app. Worth looking: https://gist.github.com/polkaulfield/8c84087fafa476e86f768ad25ec44f7b https://gist.github.com/polkaulfield/adfd371a5157c2fb4b334244b29e094a Nice! I just went through and parsed them all out https://gist.github.com/ScamCast/2e40befbd1b61c4a80cda2745d4df1f4
nospace-here commented 2023-07-04 06:33:46 -04:00 (Migrated from github.com)

Could OldTwitter be used as reference?

Could [OldTwitter](https://github.com/dimdenGD/OldTwitter) be used as reference?
12joan commented 2023-07-04 07:02:37 -04:00 (Migrated from github.com)

Ok this seems interesting [...]
(Comment)

I've hacked together an Express server that fetches recent tweets using this approach and produces a JSON or RSS feed. PRs very much welcome 😄

https://github.com/12joan/twitter-client

> Ok this seems interesting [...] > [(Comment)](https://github.com/zedeus/nitter/issues/919#issuecomment-1619067142) I've hacked together an Express server that fetches recent tweets using this approach and produces a JSON or RSS feed. PRs very much welcome 😄 https://github.com/12joan/twitter-client
ghost commented 2023-07-04 09:09:27 -04:00 (Migrated from github.com)

please take a look at #925. it rotates bearer tokens through a list of hardcoded ones. it would be good to add the macos one if anybody has it.

i found that with the session cookies of a random user the instance mostly works (#830 is needed for that). if there is a rate limit refreshing a couple of times usually gets you a different bearer token and resets them

please take a look at #925. it rotates bearer tokens through a list of hardcoded ones. it would be good to add the macos one if anybody has it. i found that with the session cookies of a random user the instance mostly works (#830 is needed for that). if there is a rate limit refreshing a couple of times usually gets you a different bearer token and resets them
Write commented 2023-07-04 09:24:18 -04:00 (Migrated from github.com)

Hello everyone, nice works of you guys while I was asleep, so cool to see such a community.

please take a look at #925. it rotates bearer tokens through a list of hardcoded ones. it would be good to add the macos one if anybody has it.

i found that with the session cookies of a random user the instance mostly works (#830 is needed for that). if there is a rate limit refreshing a couple of times usually gets you a different bearer token and resets them

Well, the creator of bird.makeup seems to have one available :

https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs#L36

Just do

curl -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "3rJOl1ODzm9yZy63FACdg:5jPoQ5kQvMJFDYRNE8bQ4rHuds4xJqhvgNJM4awaE8" to get the macOS bearer

AAAAAAAAAAAAAAAAAAAAAIWCCAAAAAAA2C25AxqI%2BYCS7pdfJKRH8Xh19zA%3D8vpDZzPHaEJhd20MKVWp3UR38YoPpuTX7UD2cVYo3YNikubuxd

You could also add the iPad and iPhone one as I see thoses are missing

I personally tried multiples SearchTimeline endpoint you guys posted but it always returns

{"errors":[{"code":126,"message":"Logged out."}]} for me

Hello everyone, nice works of you guys while I was asleep, so cool to see such a community. > please take a look at #925. it rotates bearer tokens through a list of hardcoded ones. it would be good to add the macos one if anybody has it. > > i found that with the session cookies of a random user the instance mostly works (#830 is needed for that). if there is a rate limit refreshing a couple of times usually gets you a different bearer token and resets them Well, the creator of bird.makeup seems to have one available : https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs#L36 Just do `curl -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "3rJOl1ODzm9yZy63FACdg:5jPoQ5kQvMJFDYRNE8bQ4rHuds4xJqhvgNJM4awaE8"` to get the macOS bearer AAAAAAAAAAAAAAAAAAAAAIWCCAAAAAAA2C25AxqI%2BYCS7pdfJKRH8Xh19zA%3D8vpDZzPHaEJhd20MKVWp3UR38YoPpuTX7UD2cVYo3YNikubuxd You could also add the iPad and iPhone one as I see thoses are missing I personally tried multiples SearchTimeline endpoint you guys posted but it always returns `{"errors":[{"code":126,"message":"Logged out."}]}` for me
Write commented 2023-07-04 09:43:22 -04:00 (Migrated from github.com)

I'm giving up here guys, I don't have the faith to remove SSL Pinning of iOS app and finding all the endpoints for all platforms.

Good luck everyone and thank you ❤️

I'm giving up here guys, I don't have the faith to remove SSL Pinning of iOS app and finding all the endpoints for all platforms. Good luck everyone and thank you ❤️
avasilic commented 2023-07-04 12:56:16 -04:00 (Migrated from github.com)

Curious as to what @zedeus thinks of all this

Curious as to what @zedeus thinks of all this
coda101 commented 2023-07-04 13:13:47 -04:00 (Migrated from github.com)

Greetings,

I am no way a coder/developer but have been using Nitter for a while and sad to see the recent developments. While looking for solutions, I came across this (I remember using it some years ago). Wonder how it works and if it may be of any help at all:

https://tweettunnel.com/maxabrahms

We can see the tweets, albeit in limited forms and clicking on links does take us to Twitter (and no, I didn't sign in).

My 2 pennies.

Best

Not sure what this is about, do be cautious

image

> Greetings, > > I am no way a coder/developer but have been using Nitter for a while and sad to see the recent developments. While looking for solutions, I came across this (I remember using it some years ago). Wonder how it works and if it may be of any help at all: > > https://tweettunnel.com/maxabrahms > > We can see the tweets, albeit in limited forms and clicking on links does take us to Twitter (and no, I didn't sign in). > > My 2 pennies. > > Best Not sure what this is about, do be cautious ![image](https://github.com/zedeus/nitter/assets/126429288/1d41fcf5-b70a-4f23-aa05-495b36ca3923)
Apachez- commented 2023-07-04 14:36:31 -04:00 (Migrated from github.com)

@coda101

Seems like tweettunnel.com is using ads which bcloudhost.com is part of.

Ghostery will block these two attempts when visiting tweettunnel.com:

httpx://www.bcloudhost.com/9c88e091a401e3c00259b11fe2e91264/invoke.js

httpx://likenesscollecting.com/be501a9bff1a8da595943ddced3825ed/invoke.js

Checking both tweettunnel.com and bcloudhost.com through PaloAlto urlfiltering (https://urlfiltering.paloaltonetworks.com/query/) brings following result:

URL: tweettunnel.com
Category: Social Networking
Description: User communities and sites where users interact with each other, post messages, pictures, or otherwise communicate with groups of people. Does not include blogs or personal sites.
Example Sites: www.facebook.com, www.twitter.com, www.linkedin.com
Category: Low Risk
Description: Sites that are not medium or high risk are considered low risk. These sites have displayed benign activity for a minimum of 90 days. The low risk category includes both sites that have a history of only benign activity, and sites found to be malicious in the past, but that have displayed benign activity for at least 90 days.
Example Sites: www.google.com, www.schwab.com, www.amazon.com

URL: www.bcloudhost.com
Category: Grayware
Description: Web content that does not pose a direct security threat but that display other intrusive behavior and tempt the end user to grant remote access or perform other unauthorized actions. Grayware includes illegal activities, criminal activities, rogueware, adware, and other unwanted or unsolicited applications, such as embedded crypto miners, clickjacking or hijackers that change the elements of the browser. Typosquatting domains that do not exhibit maliciousness and are not owned by the targeted domain will be categorized as grayware.
Example Sites:
`

Easiest way to block access to www.bcloudhost.com and bcloudhost.com without involving a browser extension is to modify your /etc/hosts file (similar exists in windows too) and point both domains to either 0.0.0.0 or 127.0.0.1 or 192.0.2.1 or some other non existent IP-address (as in your browser will not get anything bad from it).

Edit: Made all domains non-clickable.

@coda101 Seems like `tweettunnel.com` is using ads which `bcloudhost.com` is part of. Ghostery will block these two attempts when visiting `tweettunnel.com`: `httpx://www.bcloudhost.com/9c88e091a401e3c00259b11fe2e91264/invoke.js` `httpx://likenesscollecting.com/be501a9bff1a8da595943ddced3825ed/invoke.js` Checking both `tweettunnel.com` and `bcloudhost.com` through PaloAlto urlfiltering (`https://urlfiltering.paloaltonetworks.com/query/`) brings following result: URL: `tweettunnel.com` Category: Social Networking Description: User communities and sites where users interact with each other, post messages, pictures, or otherwise communicate with groups of people. Does not include blogs or personal sites. Example Sites: `www.facebook.com`, `www.twitter.com`, `www.linkedin.com` Category: Low Risk Description: Sites that are not medium or high risk are considered low risk. These sites have displayed benign activity for a minimum of 90 days. The low risk category includes both sites that have a history of only benign activity, and sites found to be malicious in the past, but that have displayed benign activity for at least 90 days. Example Sites: `www.google.com`, `www.schwab.com`, `www.amazon.com` URL: `www.bcloudhost.com` Category: Grayware Description: Web content that does not pose a direct security threat but that display other intrusive behavior and tempt the end user to grant remote access or perform other unauthorized actions. Grayware includes illegal activities, criminal activities, rogueware, adware, and other unwanted or unsolicited applications, such as embedded crypto miners, clickjacking or hijackers that change the elements of the browser. Typosquatting domains that do not exhibit maliciousness and are not owned by the targeted domain will be categorized as grayware. Example Sites: ` Easiest way to block access to `www.bcloudhost.com` and `bcloudhost.com` without involving a browser extension is to modify your /etc/hosts file (similar exists in windows too) and point both domains to either 0.0.0.0 or 127.0.0.1 or 192.0.2.1 or some other non existent IP-address (as in your browser will not get anything bad from it). Edit: Made all domains non-clickable.
Apachez- commented 2023-07-04 14:57:19 -04:00 (Migrated from github.com)

When/If nitter resolves the current issue, is it nitter.net who will get the first commits or do there exist some devsite who is public which runs the latest code?

When/If nitter resolves the current issue, is it `nitter.net` who will get the first commits or do there exist some devsite who is public which runs the latest code?
EthanC commented 2023-07-04 15:03:52 -04:00 (Migrated from github.com)

I've hacked together an Express server that fetches recent tweets using this approach and produces a JSON or RSS feed. PRs very much welcome 😄

https://github.com/12joan/twitter-client

@12joan Any chance you're publicly hosting this? Sounds like we need to test for rate limits 😉

> I've hacked together an Express server that fetches recent tweets using this approach and produces a JSON or RSS feed. PRs very much welcome 😄 > > https://github.com/12joan/twitter-client @12joan Any chance you're publicly hosting this? Sounds like we need to test for rate limits 😉
Rongronggg9 commented 2023-07-04 15:16:02 -04:00 (Migrated from github.com)

Special thanks to @Write's information. I've made the Twitter route of RSSHub works again. It always re-authenticates to get a new session after being rate-limited. It should work well unless this approach or the server IP is banned - the latter may occur on the public demo, deploy a personal instance to get rid of it.

https://rsshub.app/twitter/user/elonmusk
https://rsshub.app/twitter/user/elonmusk/excludeReplies=1
https://rsshub.app/twitter/media/bugcat_capoo_tw
https://rsshub.app/twitter/keyword/RSSHub

I personally tried multiples SearchTimeline endpoint you guys posted but it always returns {"errors":[{"code":126,"message":"Logged out."}]} for me

@Write What surprises me is that the keyword route implementing search failed to work in my local tests (403 Forbidden), but it turned out to work well on RSSHub's public demo - I didn't change anything of the route except credentials. It seems that https://twitter.com/i/api/2/search/adaptive.json works in specific conditions which are currently unclear, after being authenticated with your approach.

github.com/DIYgod/RSSHub@7e45fe12e9/lib/v2/twitter/web-api/twitter-api.js (L106-L114)

Special thanks to @Write's [information](https://github.com/zedeus/nitter/issues/919#issuecomment-1619067142). I've made the Twitter route of RSSHub works again. It always re-authenticates to get a new session after being rate-limited. It should work well unless this approach or the server IP is banned - the latter may occur on the public demo, deploy a personal instance to get rid of it. * https://github.com/DIYgod/RSSHub/pull/12754 https://rsshub.app/twitter/user/elonmusk https://rsshub.app/twitter/user/elonmusk/excludeReplies=1 https://rsshub.app/twitter/media/bugcat_capoo_tw https://rsshub.app/twitter/keyword/RSSHub > I personally tried multiples SearchTimeline endpoint you guys posted but it always returns `{"errors":[{"code":126,"message":"Logged out."}]}` for me @Write What surprises me is that the `keyword` route implementing search failed to work in my local tests (403 Forbidden), but it turned out to work well on RSSHub's public demo - I didn't change anything of the route except credentials. It seems that `https://twitter.com/i/api/2/search/adaptive.json` works in specific conditions which are currently unclear, after being authenticated with your approach. https://github.com/DIYgod/RSSHub/blob/7e45fe12e959b13458f48c7893f0bb92440a1fe0/lib/v2/twitter/web-api/twitter-api.js#L106-L114
GhbSmwc commented 2023-07-04 16:41:59 -04:00 (Migrated from github.com)

Anyone making a tool I can save to the wayback machine (WBM)? Complete with the proxy's html featuring links to the original resolution of images and gifs (because I saved only those so far), as well as the tweets? I'm still waiting of when the WBM is able to bypass this.

Saving twitter pages directly now results in "Unverified web crawlers are not allowed" rather than a 404, and according to this: https://twitter.com/kevinmarks/status/1676140926077468672 also blocks googlebot.
image

Anyone making a tool I can save to the wayback machine (WBM)? Complete with the proxy's html featuring links to the original resolution of images and gifs (because I saved only those so far), as well as the tweets? I'm still waiting of when the WBM is able to bypass this. Saving twitter pages directly now results in "Unverified web crawlers are not allowed" rather than a 404, and according to this: https://twitter.com/kevinmarks/status/1676140926077468672 also blocks googlebot. ![image](https://github.com/zedeus/nitter/assets/13095760/f546c271-2be9-40ab-8916-74f50ec9adfc)
devgaucho commented 2023-07-04 16:53:17 -04:00 (Migrated from github.com)

Special thanks to @Write's information. I've made the Twitter route of RSSHub works again. It always re-authenticates to get a new session after being rate-limited. It should work well unless this approach or the server IP is banned - the latter may occur on the public demo, deploy a personal instance to get rid of it.

https://rsshub.app/twitter/user/elonmusk https://rsshub.app/twitter/user/elonmusk/excludeReplies=1 https://rsshub.app/twitter/media/bugcat_capoo_tw https://rsshub.app/twitter/keyword/RSSHub

I personally tried multiples SearchTimeline endpoint you guys posted but it always returns {"errors":[{"code":126,"message":"Logged out."}]} for me

@Write What surprises me is that the keyword route implementing search failed to work in my local tests (403 Forbidden), but it turned out to work well on RSSHub's public demo - I didn't change anything of the route except credentials. It seems that https://twitter.com/i/api/2/search/adaptive.json works in specific conditions which are currently unclear, after being authenticated with your approach.

github.com/DIYgod/RSSHub@7e45fe12e9/lib/v2/twitter/web-api/twitter-api.js (L106-L114)

nice work @Rongronggg9 👏, can read tweets by user id?

> Special thanks to @Write's [information](https://github.com/zedeus/nitter/issues/919#issuecomment-1619067142). I've made the Twitter route of RSSHub works again. It always re-authenticates to get a new session after being rate-limited. It should work well unless this approach or the server IP is banned - the latter may occur on the public demo, deploy a personal instance to get rid of it. > > * [fix(route/twitter): Web API authentication DIYgod/RSSHub#12754](https://github.com/DIYgod/RSSHub/pull/12754) > > https://rsshub.app/twitter/user/elonmusk https://rsshub.app/twitter/user/elonmusk/excludeReplies=1 https://rsshub.app/twitter/media/bugcat_capoo_tw https://rsshub.app/twitter/keyword/RSSHub > > > I personally tried multiples SearchTimeline endpoint you guys posted but it always returns `{"errors":[{"code":126,"message":"Logged out."}]}` for me > > @Write What surprises me is that the `keyword` route implementing search failed to work in my local tests (403 Forbidden), but it turned out to work well on RSSHub's public demo - I didn't change anything of the route except credentials. It seems that `https://twitter.com/i/api/2/search/adaptive.json` works in specific conditions which are currently unclear, after being authenticated with your approach. > > https://github.com/DIYgod/RSSHub/blob/7e45fe12e959b13458f48c7893f0bb92440a1fe0/lib/v2/twitter/web-api/twitter-api.js#L106-L114 nice work @Rongronggg9 👏, can read tweets by user id?
GhbSmwc commented 2023-07-04 16:58:26 -04:00 (Migrated from github.com)

@devgaucho how do I access older tweets so that I can save them to the WBM? It looks like it only listed the most recent X tweets rather than extending to the first existing tweet. I have a bunch of tweet URLs and how do I make rsshub view a specific tweet?

@devgaucho how do I access older tweets so that I can save them to the WBM? It looks like it only listed the most recent X tweets rather than extending to the first existing tweet. I have a bunch of tweet URLs and how do I make rsshub view a specific tweet?
ghost commented 2023-07-04 17:07:19 -04:00 (Migrated from github.com)

What surprises me is that the keyword route implementing search failed to work in my local tests (403 Forbidden), but it turned out to work well on RSSHub's public demo

I don't think it works on the demo server right now. anything other than RSSHub keyword does not work for me. I found some keywords like "nitter" that work, but I think SearchTimeline with session cookie works more reliably

I found that oauth credentials sent to /oauth/token always return the same bearer token, so i opted to hardcode them in #925

in that PR, everything but search works unauthenticated (if you refresh often enough and hit the right bearer token) -- the rest can be made to work by adding a cookie header in config. it seems that per-user rate limits get reset if one resets guest-token, even if the cookie is the same

> What surprises me is that the keyword route implementing search failed to work in my local tests (403 Forbidden), but it turned out to work well on RSSHub's public demo I don't think it works on the demo server right now. ~anything other than `RSSHub` keyword does not work for me.~ I found some keywords like "nitter" that work, but I think SearchTimeline with session cookie works more reliably I found that oauth credentials sent to /oauth/token always return the same bearer token, so i opted to hardcode them in #925 in that PR, everything but search works unauthenticated (if you refresh often enough and hit the right bearer token) -- the rest can be made to work by adding a cookie header in config. it seems that per-user rate limits get reset if one resets guest-token, even if the cookie is the same
devgaucho commented 2023-07-04 17:27:17 -04:00 (Migrated from github.com)

@devgaucho how do I access older tweets so that I can save them to the WBM? It looks like it only listed the most recent X tweets rather than extending to the first existing tweet. I have a bunch of tweet URLs and how do I make rsshub view a specific tweet?

embed url https://web.archive.org/web/20230704212606/https://platform.twitter.com/embed/Tweet.html?id=1675260424109928449

https://i.imgur.com/wCnTXr9.png

> @devgaucho how do I access older tweets so that I can save them to the WBM? It looks like it only listed the most recent X tweets rather than extending to the first existing tweet. I have a bunch of tweet URLs and how do I make rsshub view a specific tweet? embed url https://web.archive.org/web/20230704212606/https://platform.twitter.com/embed/Tweet.html?id=1675260424109928449 ![https://i.imgur.com/wCnTXr9.png](https://i.imgur.com/wCnTXr9.png)
Rongronggg9 commented 2023-07-04 17:43:19 -04:00 (Migrated from github.com)

I don't think it works on the demo server right now. anything other than RSSHub keyword does not work for me. I found some keywords like "nitter" that work

The demo is behind a load balancer, so each request may be processed by a different server. Still, I am quite unclear about the conditions to make it work.

> I don't think it works on the demo server right now. ~anything other than `RSSHub` keyword does not work for me.~ I found some keywords like "nitter" that work The demo is behind a load balancer, so each request may be processed by a different server. Still, I am quite unclear about the conditions to make it work.
GhbSmwc commented 2023-07-04 17:45:01 -04:00 (Migrated from github.com)

@devgaucho

@devgaucho how do I access older tweets so that I can save them to the WBM? It looks like it only listed the most recent X tweets rather than extending to the first existing tweet. I have a bunch of tweet URLs and how do I make rsshub view a specific tweet?

embed url https://web.archive.org/web/20230704212606/https://platform.twitter.com/embed/Tweet.html?id=1675260424109928449

https://i.imgur.com/wCnTXr9.png

Thanks

@devgaucho > > @devgaucho how do I access older tweets so that I can save them to the WBM? It looks like it only listed the most recent X tweets rather than extending to the first existing tweet. I have a bunch of tweet URLs and how do I make rsshub view a specific tweet? > > embed url https://web.archive.org/web/20230704212606/https://platform.twitter.com/embed/Tweet.html?id=1675260424109928449 > > ![https://i.imgur.com/wCnTXr9.png](https://camo.githubusercontent.com/6f11ddf8087476144198c1cbd232bb75912c25077a1a7240b22d89e398811cc9/68747470733a2f2f692e696d6775722e636f6d2f77436e545872392e706e67) Thanks
Write commented 2023-07-04 21:37:42 -04:00 (Migrated from github.com)

Special thanks to @Write's information. I've made the Twitter route of RSSHub works again. It always re-authenticates to get a new session after being rate-limited. It should work well unless this approach or the server IP is banned - the latter may occur on the public demo, deploy a personal instance to get rid of it.

* [fix(route/twitter): Web API authentication DIYgod/RSSHub#12754](https://github.com/DIYgod/RSSHub/pull/12754)

https://rsshub.app/twitter/user/elonmusk https://rsshub.app/twitter/user/elonmusk/excludeReplies=1 https://rsshub.app/twitter/media/bugcat_capoo_tw https://rsshub.app/twitter/keyword/RSSHub

I personally tried multiples SearchTimeline endpoint you guys posted but it always returns {"errors":[{"code":126,"message":"Logged out."}]} for me

@Write What surprises me is that the keyword route implementing search failed to work in my local tests (403 Forbidden), but it turned out to work well on RSSHub's public demo - I didn't change anything of the route except credentials. It seems that https://twitter.com/i/api/2/search/adaptive.json works in specific conditions which are currently unclear, after being authenticated with your approach.

github.com/DIYgod/RSSHub@7e45fe12e9/lib/v2/twitter/web-api/twitter-api.js (L106-L114)

Awesome work !

Can you enlighten me on the differences between the /i/api/2/search/adaptive.json endpoint and the (for example) G8jKRx5LiyrRDs5FcsUjsw/SearchTimeline endpoint ? Can you provide a CURL example of usage with /i/api/2/search/adaptive.json ?

Also your issue seems kinda related to the one I had when I replaced the Bearer in a Nitter instance, worked perfectly for some times and then only 404 without me being able to understand what was wrong since I used the same Bearer / IP. Anyway.

Also it seems that your /excludeReplies=1 endpoint only shows one tweet for elonmusk, certainly because you're filtering entries from /UserTweetsAndReplies or something like that, but @worstperson (https://github.com/zedeus/nitter/issues/919#issuecomment-1619332131) actually made /UserTweets endpoint works and you can get last 20 tweets without any replies :

Screenshot du 2023-07-05 à 03 43 20

> > Special thanks to @Write's [information](https://github.com/zedeus/nitter/issues/919#issuecomment-1619067142). I've made the Twitter route of RSSHub works again. It always re-authenticates to get a new session after being rate-limited. It should work well unless this approach or the server IP is banned - the latter may occur on the public demo, deploy a personal instance to get rid of it. > > * [fix(route/twitter): Web API authentication DIYgod/RSSHub#12754](https://github.com/DIYgod/RSSHub/pull/12754) > > > https://rsshub.app/twitter/user/elonmusk https://rsshub.app/twitter/user/elonmusk/excludeReplies=1 https://rsshub.app/twitter/media/bugcat_capoo_tw https://rsshub.app/twitter/keyword/RSSHub > > > I personally tried multiples SearchTimeline endpoint you guys posted but it always returns `{"errors":[{"code":126,"message":"Logged out."}]}` for me > > @Write What surprises me is that the `keyword` route implementing search failed to work in my local tests (403 Forbidden), but it turned out to work well on RSSHub's public demo - I didn't change anything of the route except credentials. It seems that `https://twitter.com/i/api/2/search/adaptive.json` works in specific conditions which are currently unclear, after being authenticated with your approach. > > https://github.com/DIYgod/RSSHub/blob/7e45fe12e959b13458f48c7893f0bb92440a1fe0/lib/v2/twitter/web-api/twitter-api.js#L106-L114 Awesome work ! Can you enlighten me on the differences between the /i/api/2/search/adaptive.json endpoint and the (for example) G8jKRx5LiyrRDs5FcsUjsw/SearchTimeline endpoint ? Can you provide a CURL example of usage with /i/api/2/search/adaptive.json ? Also your issue seems kinda related to the one I had when I replaced the Bearer in a Nitter instance, worked perfectly for some times and then only 404 without me being able to understand what was wrong since I used the same Bearer / IP. Anyway. Also it seems that your /excludeReplies=1 endpoint only shows one tweet for elonmusk, certainly because you're filtering entries from /UserTweetsAndReplies or something like that, but @worstperson (https://github.com/zedeus/nitter/issues/919#issuecomment-1619332131) actually made /UserTweets endpoint works and you can get last 20 tweets without any replies : ![Screenshot du 2023-07-05 à 03 43 20](https://github.com/zedeus/nitter/assets/541722/0d8dc1f5-388a-4067-bb6c-2c315d1050a4)
Write commented 2023-07-04 22:09:55 -04:00 (Migrated from github.com)

I've updated @ScamCast's awesome poor_man_nitter.py to add UserTweets endpoint.

import requests, json
from pprint import pprint as pp

headers = {
    "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR",
    "x-guest-token": "",
    "x-twitter-active-user": "yes",
    "Referer": "https://twitter.com",
    "user-agent": "",
}

def authenticate():
    resp1 = requests.post("https://api.twitter.com/oauth2/token", params={"grant_type": "client_credentials"}, auth=("CjulERsDeqhhjSme66ECg", "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck")).json()
    headers["Authorization"] = f"Bearer {resp1['access_token']}"
    resp2 = requests.post("https://api.twitter.com/1.1/guest/activate.json", headers=headers).json()
    headers["x-guest-token"] = resp2["guest_token"]
    return {"access_token": resp1['access_token'], "guest_token": resp2["guest_token"]}


def UserByScreenName(username):
    return requests.get("https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName", headers=headers, params={
        "features": json.dumps({
            "hidden_profile_likes_enabled": False,
            "responsive_web_graphql_exclude_directive_enabled": True,
            "verified_phone_label_enabled": False,
            "subscriptions_verification_info_verified_since_enabled": True,
            "highlights_tweets_tab_ui_enabled": True,
            "creator_subscriptions_tweet_preview_api_enabled": True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False,
            "responsive_web_graphql_timeline_navigation_enabled": True
        }),
        "variables": json.dumps({
            "screen_name": username,
            "withSafetyModeUserFields": True
        })
    }).json()

def UserResultByIdQuery(userId):
    return requests.get("https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery", headers=headers, params={
        "features": json.dumps({
            "blue_business_profile_image_shape_enabled": False,
            "verified_phone_label_enabled": False,
            "super_follow_user_api_enabled": False,
            "super_follow_badge_privacy_enabled": False,
            "subscriptions_verification_info_enabled": False,
            "creator_subscriptions_subscription_count_enabled": False,
            "super_follow_exclusive_tweet_notifications_enabled": False
        }),
        "variables": json.dumps({
            "user_id": f"{userId}",
            "rest_id": f"{userId}"
        })
    }).json()

def UserTweetsAndReplies(userId):
    return requests.get("https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies", headers=headers, params={
        "features": json.dumps({
            "responsive_web_twitter_blue_verified_badge_is_enabled": True,
            "responsive_web_graphql_exclude_directive_enabled": True,
            "verified_phone_label_enabled": False,
            "responsive_web_graphql_timeline_navigation_enabled": True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False,
            "tweetypie_unmention_optimization_enabled": True,
            "vibe_api_enabled": True,
            "responsive_web_edit_tweet_api_enabled": True,
            "graphql_is_translatable_rweb_tweet_is_translatable_enabled": True,
            "view_counts_everywhere_api_enabled": True,
            "longform_notetweets_consumption_enabled": True,
            "tweet_awards_web_tipping_enabled": False,
            "freedom_of_speech_not_reach_fetch_enabled": False,
            "standardized_nudges_misinfo": True,
            "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False,
            "interactive_text_enabled": True,
            "responsive_web_text_conversations_enabled": False,
            "longform_notetweets_richtext_consumption_enabled": False,
            "responsive_web_enhance_cards_enabled":False
        }),
        "variables": json.dumps({
            "userId": f"{user_id}",
            "count": 40,
            "includePromotedContent": True,
            "withCommunity": True,
            "withSuperFollowsUserFields": True,
            "withDownvotePerspective": False,
            "withReactionsMetadata": False,
            "withReactionsPerspective": False,
            "withSuperFollowsTweetFields": True,
            "withVoice": True,
            "withV2Timeline":True
        })
    }).json()

def UserTweets(userId):
    return requests.get("https://api.twitter.com/graphql/rCpYpqplOq3UJ2p6Oxy3tw/UserTweets", headers=headers, params={
        "features": json.dumps({
            "responsive_web_twitter_blue_verified_badge_is_enabled": True,
            "responsive_web_graphql_exclude_directive_enabled": False,
            "verified_phone_label_enabled": False,
            "responsive_web_graphql_timeline_navigation_enabled": True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False,
            "tweetypie_unmention_optimization_enabled": True,
            "vibe_api_enabled": True,
            "responsive_web_edit_tweet_api_enabled": True,
            "graphql_is_translatable_rweb_tweet_is_translatable_enabled": True,
            "view_counts_everywhere_api_enabled": True,
            "longform_notetweets_consumption_enabled": True,
            "freedom_of_speech_not_reach_appeal_label_enabled": False,
            "tweet_awards_web_tipping_enabled": False,
            "freedom_of_speech_not_reach_fetch_enabled": False,
            "standardized_nudges_misinfo": True,
            "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False,
            "interactive_text_enabled": True,
            "responsive_web_text_conversations_enabled": False,
            "longform_notetweets_richtext_consumption_enabled": False,
            "responsive_web_enhance_cards_enabled": False
        }),
        "variables": json.dumps({
            "userId": f"{user_id}",
            "count": 40,
            "includePromotedContent": True,
            "withQuickPromoteEligibilityTweetFields": True,
            "withSuperFollowsUserFields": True,
            "withDownvotePerspective": False,
            "withReactionsMetadata": False,
            "withReactionsPerspective": False,
            "withSuperFollowsTweetFields": False,
            "withVoice": False,
            "withV2Timeline": False
        })
    }).json()

def TweetDetail(tweetId):
    return requests.get("https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail", headers=headers, params={
        "features": json.dumps({
            "rweb_lists_timeline_redesign_enabled": True,
            "creator_subscriptions_tweet_preview_api_enabled": True,
            "responsive_web_twitter_article_tweet_consumption_enabled": False,
            "longform_notetweets_rich_text_read_enabled": True,
            "longform_notetweets_inline_media_enabled": True,
            "responsive_web_media_download_video_enabled": True,
            "responsive_web_enhance_cards_enabled": True,
            "responsive_web_twitter_blue_verified_badge_is_enabled": True,
            "responsive_web_graphql_exclude_directive_enabled": True,
            "verified_phone_label_enabled": False,
            "responsive_web_graphql_timeline_navigation_enabled": True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False,
            "tweetypie_unmention_optimization_enabled": True,
            "vibe_api_enabled": True,
            "responsive_web_edit_tweet_api_enabled": True,
            "graphql_is_translatable_rweb_tweet_is_translatable_enabled": False,
            "view_counts_everywhere_api_enabled": True,
            "longform_notetweets_consumption_enabled": True,
            "tweet_awards_web_tipping_enabled": False,
            "freedom_of_speech_not_reach_fetch_enabled": False,
            "standardized_nudges_misinfo": True,
            "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False,
            "interactive_text_enabled": True,
            "responsive_web_text_conversations_enabled": False,
            "longform_notetweets_richtext_consumption_enabled": False
        }),
        "variables": json.dumps({
            "focalTweetId": tweetId,
            "with_rux_injections": True,
            "includePromotedContent": False,
            "withCommunity": False,
            "withQuickPromoteEligibilityTweetFields": False,
            "withBirdwatchNotes": False,
            "withSuperFollowsUserFields": False,
            "withDownvotePerspective": False,
            "withReactionsMetadata": False,
            "withReactionsPerspective": False,
            "withSuperFollowsTweetFields": False,
            "withVoice": True,
            "withV2Timeline": True
        }),
        "fieldToggles": json.dumps({
            "withArticleRichContentState": False
        })
    }).json()


test_username = 'elonmusk'
test_tweet_id = 1675390796718014464

authenticate()

user_id = UserByScreenName(test_username)['data']['user']['result']['rest_id']
tweetsAndReplies = UserTweetsAndReplies(user_id)['data']['user']['result']['timeline_v2']['timeline']['instructions'][1]['entries']
tweets = UserTweets(user_id)['data']['user']['result']['timeline']['timeline']['instructions'][1]['entries']
tweet_thread = TweetDetail(test_tweet_id)['data']['threaded_conversation_with_injections_v2']['instructions'][0]['entries']

print(json.dumps(tweets))
#pp(tweet_thread)

what's funny is, if "withV2Timeline": False, then the API does respect the "count": 40, variable !
I set it to false only for the endpoint I added (/UserTweets). I don't really see any downside to it for now.
Executing above code like so :

./poor_man_nitter.py | jq '..|.full_text?|select(length>0)'

Returns magnificiently 40 latest tweets just fine (as it's the default set in the python file), NOT cropped or anything.

Screenshot du 2023-07-05 à 04 09 45

I tried to change "count:" variable to an arbitrary high number in UserTweets and can get UP to 155 latest tweets.

I've updated @ScamCast's awesome poor_man_nitter.py to add UserTweets endpoint. ```python import requests, json from pprint import pprint as pp headers = { "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR", "x-guest-token": "", "x-twitter-active-user": "yes", "Referer": "https://twitter.com", "user-agent": "", } def authenticate(): resp1 = requests.post("https://api.twitter.com/oauth2/token", params={"grant_type": "client_credentials"}, auth=("CjulERsDeqhhjSme66ECg", "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck")).json() headers["Authorization"] = f"Bearer {resp1['access_token']}" resp2 = requests.post("https://api.twitter.com/1.1/guest/activate.json", headers=headers).json() headers["x-guest-token"] = resp2["guest_token"] return {"access_token": resp1['access_token'], "guest_token": resp2["guest_token"]} def UserByScreenName(username): return requests.get("https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName", headers=headers, params={ "features": json.dumps({ "hidden_profile_likes_enabled": False, "responsive_web_graphql_exclude_directive_enabled": True, "verified_phone_label_enabled": False, "subscriptions_verification_info_verified_since_enabled": True, "highlights_tweets_tab_ui_enabled": True, "creator_subscriptions_tweet_preview_api_enabled": True, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False, "responsive_web_graphql_timeline_navigation_enabled": True }), "variables": json.dumps({ "screen_name": username, "withSafetyModeUserFields": True }) }).json() def UserResultByIdQuery(userId): return requests.get("https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery", headers=headers, params={ "features": json.dumps({ "blue_business_profile_image_shape_enabled": False, "verified_phone_label_enabled": False, "super_follow_user_api_enabled": False, "super_follow_badge_privacy_enabled": False, "subscriptions_verification_info_enabled": False, "creator_subscriptions_subscription_count_enabled": False, "super_follow_exclusive_tweet_notifications_enabled": False }), "variables": json.dumps({ "user_id": f"{userId}", "rest_id": f"{userId}" }) }).json() def UserTweetsAndReplies(userId): return requests.get("https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies", headers=headers, params={ "features": json.dumps({ "responsive_web_twitter_blue_verified_badge_is_enabled": True, "responsive_web_graphql_exclude_directive_enabled": True, "verified_phone_label_enabled": False, "responsive_web_graphql_timeline_navigation_enabled": True, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False, "tweetypie_unmention_optimization_enabled": True, "vibe_api_enabled": True, "responsive_web_edit_tweet_api_enabled": True, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": True, "view_counts_everywhere_api_enabled": True, "longform_notetweets_consumption_enabled": True, "tweet_awards_web_tipping_enabled": False, "freedom_of_speech_not_reach_fetch_enabled": False, "standardized_nudges_misinfo": True, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False, "interactive_text_enabled": True, "responsive_web_text_conversations_enabled": False, "longform_notetweets_richtext_consumption_enabled": False, "responsive_web_enhance_cards_enabled":False }), "variables": json.dumps({ "userId": f"{user_id}", "count": 40, "includePromotedContent": True, "withCommunity": True, "withSuperFollowsUserFields": True, "withDownvotePerspective": False, "withReactionsMetadata": False, "withReactionsPerspective": False, "withSuperFollowsTweetFields": True, "withVoice": True, "withV2Timeline":True }) }).json() def UserTweets(userId): return requests.get("https://api.twitter.com/graphql/rCpYpqplOq3UJ2p6Oxy3tw/UserTweets", headers=headers, params={ "features": json.dumps({ "responsive_web_twitter_blue_verified_badge_is_enabled": True, "responsive_web_graphql_exclude_directive_enabled": False, "verified_phone_label_enabled": False, "responsive_web_graphql_timeline_navigation_enabled": True, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False, "tweetypie_unmention_optimization_enabled": True, "vibe_api_enabled": True, "responsive_web_edit_tweet_api_enabled": True, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": True, "view_counts_everywhere_api_enabled": True, "longform_notetweets_consumption_enabled": True, "freedom_of_speech_not_reach_appeal_label_enabled": False, "tweet_awards_web_tipping_enabled": False, "freedom_of_speech_not_reach_fetch_enabled": False, "standardized_nudges_misinfo": True, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False, "interactive_text_enabled": True, "responsive_web_text_conversations_enabled": False, "longform_notetweets_richtext_consumption_enabled": False, "responsive_web_enhance_cards_enabled": False }), "variables": json.dumps({ "userId": f"{user_id}", "count": 40, "includePromotedContent": True, "withQuickPromoteEligibilityTweetFields": True, "withSuperFollowsUserFields": True, "withDownvotePerspective": False, "withReactionsMetadata": False, "withReactionsPerspective": False, "withSuperFollowsTweetFields": False, "withVoice": False, "withV2Timeline": False }) }).json() def TweetDetail(tweetId): return requests.get("https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail", headers=headers, params={ "features": json.dumps({ "rweb_lists_timeline_redesign_enabled": True, "creator_subscriptions_tweet_preview_api_enabled": True, "responsive_web_twitter_article_tweet_consumption_enabled": False, "longform_notetweets_rich_text_read_enabled": True, "longform_notetweets_inline_media_enabled": True, "responsive_web_media_download_video_enabled": True, "responsive_web_enhance_cards_enabled": True, "responsive_web_twitter_blue_verified_badge_is_enabled": True, "responsive_web_graphql_exclude_directive_enabled": True, "verified_phone_label_enabled": False, "responsive_web_graphql_timeline_navigation_enabled": True, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False, "tweetypie_unmention_optimization_enabled": True, "vibe_api_enabled": True, "responsive_web_edit_tweet_api_enabled": True, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": False, "view_counts_everywhere_api_enabled": True, "longform_notetweets_consumption_enabled": True, "tweet_awards_web_tipping_enabled": False, "freedom_of_speech_not_reach_fetch_enabled": False, "standardized_nudges_misinfo": True, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False, "interactive_text_enabled": True, "responsive_web_text_conversations_enabled": False, "longform_notetweets_richtext_consumption_enabled": False }), "variables": json.dumps({ "focalTweetId": tweetId, "with_rux_injections": True, "includePromotedContent": False, "withCommunity": False, "withQuickPromoteEligibilityTweetFields": False, "withBirdwatchNotes": False, "withSuperFollowsUserFields": False, "withDownvotePerspective": False, "withReactionsMetadata": False, "withReactionsPerspective": False, "withSuperFollowsTweetFields": False, "withVoice": True, "withV2Timeline": True }), "fieldToggles": json.dumps({ "withArticleRichContentState": False }) }).json() test_username = 'elonmusk' test_tweet_id = 1675390796718014464 authenticate() user_id = UserByScreenName(test_username)['data']['user']['result']['rest_id'] tweetsAndReplies = UserTweetsAndReplies(user_id)['data']['user']['result']['timeline_v2']['timeline']['instructions'][1]['entries'] tweets = UserTweets(user_id)['data']['user']['result']['timeline']['timeline']['instructions'][1]['entries'] tweet_thread = TweetDetail(test_tweet_id)['data']['threaded_conversation_with_injections_v2']['instructions'][0]['entries'] print(json.dumps(tweets)) #pp(tweet_thread) ``` what's funny is, if "withV2Timeline": False, then the API does respect the "count": 40, variable ! I set it to false only for the endpoint I added (/UserTweets). I don't really see any downside to it for now. Executing above code like so : `./poor_man_nitter.py | jq '..|.full_text?|select(length>0)'` Returns magnificiently 40 latest tweets just fine (as it's the default set in the python file), NOT cropped or anything. ![Screenshot du 2023-07-05 à 04 09 45](https://github.com/zedeus/nitter/assets/541722/dcad0319-f30d-4168-85ae-326098fa94f6) I tried to change "count:" variable to an arbitrary high number in UserTweets and can get UP to 155 latest tweets.
ScamCast commented 2023-07-04 23:30:52 -04:00 (Migrated from github.com)

@Write
I've updated @ScamCast's awesome poor_man_nitter.py to add UserTweets endpoint.

I was working on a full python module. Should be able to release it tomorrow.

> @Write > I've updated @ScamCast's awesome poor_man_nitter.py to add UserTweets endpoint. I was working on a full python module. Should be able to release it tomorrow.
Write commented 2023-07-04 23:32:34 -04:00 (Migrated from github.com)

I've updated @ScamCast's awesome poor_man_nitter.py to add UserTweets endpoint.

I was working on a full python module. Should be able to release it tomorrow.

Never too late :)

> > I've updated @ScamCast's awesome poor_man_nitter.py to add UserTweets endpoint. > > I was working on a full python module. Should be able to release it tomorrow. Never too late :)
Write commented 2023-07-05 00:04:40 -04:00 (Migrated from github.com)

Has someone made any endpoint work with an other "auth" than the iPad one ?

        private readonly (string, string)[] _apiKeys = new[]
        {
            ("IQKbtAYlXLripLGPWd0HUA", "GgDYlkSvaPxGxC4X8liwpUoqKwwr3lCADbz8A7ADU"), // iPhone
            ("3nVuSoBZnx6U4vzUxf5w", "Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys"), // Android
            ("CjulERsDeqhhjSme66ECg", "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"), // iPad
            ("3rJOl1ODzm9yZy63FACdg", "5jPoQ5kQvMJFDYRNE8bQ4rHuds4xJqhvgNJM4awaE8"), // Mac
        };
Has someone made any endpoint work with an other "auth" than the iPad one ? ```bash private readonly (string, string)[] _apiKeys = new[] { ("IQKbtAYlXLripLGPWd0HUA", "GgDYlkSvaPxGxC4X8liwpUoqKwwr3lCADbz8A7ADU"), // iPhone ("3nVuSoBZnx6U4vzUxf5w", "Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys"), // Android ("CjulERsDeqhhjSme66ECg", "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"), // iPad ("3rJOl1ODzm9yZy63FACdg", "5jPoQ5kQvMJFDYRNE8bQ4rHuds4xJqhvgNJM4awaE8"), // Mac }; ```
mosajjal commented 2023-07-05 00:08:38 -04:00 (Migrated from github.com)

during the rate limit time, I never saw the rate limit error on my iPad and Android phone. Tweetdeck and the web client immediately died. Also leads me to believe that the rate limit is not based on username otherwise my tweetdeck being open would've affected my iPad's Twitter which it didn't.

during the rate limit time, I never saw the rate limit error on my iPad and Android phone. Tweetdeck and the web client immediately died. Also leads me to believe that the rate limit is not based on username otherwise my tweetdeck being open would've affected my iPad's Twitter which it didn't.
BANKA2017 commented 2023-07-05 00:14:59 -04:00 (Migrated from github.com)

In my latest commit, I used the consumer_token and consumer_token_secret from the Android client, but after I got the bearer token, I further got the open account. it is not clear what is the difference between the open account and the bearer token.

Except for the SearchTimeline endpoint that needs to be re-adapted, other endpoints can be used directly, endpoints used for the community has became login required.

In my [latest commit](https://github.com/BANKA2017/twitter-monitor/commit/42f2b798eb295f9c36d7f50452e3e72892ad3549#diff-f4109986a21760321435214c65381808df2e7d49af9601b3f0fbab41ad19ed72), I used the `consumer_token` and `consumer_token_secret` from the Android client, but after I got the bearer token, I further got the open account. it is not clear what is the difference between the open account and the bearer token. Except for the `SearchTimeline` endpoint that needs to be re-adapted, other endpoints can be used directly, endpoints used for the community has became login required.
Rongronggg9 commented 2023-07-05 02:44:16 -04:00 (Migrated from github.com)

Can you enlighten me on the differences between the /i/api/2/search/adaptive.json endpoint and the (for example) G8jKRx5LiyrRDs5FcsUjsw/SearchTimeline endpoint ? Can you provide a CURL example of usage with /i/api/2/search/adaptive.json ?

Sorry, I made a mistake. In fact, the public demo is behind a load balancer and some nodes are configured with developer API keys. So in some cases, the search result is returned by dev API. See also: https://github.com/DIYgod/RSSHub/pull/12754#issuecomment-1621087622

Also your issue seems kinda related to the one I had when I replaced the Bearer in a Nitter instance, worked perfectly for some times and then only 404 without me being able to understand what was wrong since I used the same Bearer / IP. Anyway.

I am not sure if Nitter will get a new session automatically after receiving an empty 404, that may help. Your IP may still be banned after requesting a lot. The public demo of RSSHub and my instance still work pretty well though.

Also it seems that your /excludeReplies=1 endpoint only shows one tweet for elonmusk, certainly because you're filtering entries from /UserTweetsAndReplies or something like that

Nope. It uses the /UserTweets endpoint and does not apply a filter. It is probably because the load balancer leads you to a node configured with dev API as I've said below. Try /excludeReplies=1&forceWebApi=1. There may be some bug while fetching elonmusk's tweet, try other accounts.
But for me, it is interesting to know that the v1 API is still functioning. AFAIK new API keys have no v1 API access and are applied unusable rate limits. But it seems that existing API keys with v1 API access have not been revoked?

> Can you enlighten me on the differences between the /i/api/2/search/adaptive.json endpoint and the (for example) G8jKRx5LiyrRDs5FcsUjsw/SearchTimeline endpoint ? Can you provide a CURL example of usage with /i/api/2/search/adaptive.json ? Sorry, I made a mistake. In fact, the public demo is behind a load balancer and some nodes are configured with developer API keys. So in some cases, the search result is returned by dev API. See also: https://github.com/DIYgod/RSSHub/pull/12754#issuecomment-1621087622 > Also your issue seems kinda related to the one I had when I replaced the Bearer in a Nitter instance, worked perfectly for some times and then only 404 without me being able to understand what was wrong since I used the same Bearer / IP. Anyway. I am not sure if Nitter will get a new session automatically after receiving an empty 404, that may help. Your IP may still be banned after requesting a lot. The public demo of RSSHub and my instance still work pretty well though. > Also it seems that your /excludeReplies=1 endpoint only shows one tweet for elonmusk, certainly because you're filtering entries from /UserTweetsAndReplies or something like that Nope. It uses the `/UserTweets` endpoint and does not apply a filter. It is probably because the load balancer leads you to a node configured with dev API as I've said below. Try `/excludeReplies=1&forceWebApi=1`. There may be some bug while fetching elonmusk's tweet, try other accounts. But for me, it is interesting to know that the v1 API is still functioning. AFAIK new API keys have no v1 API access and are applied unusable rate limits. But it seems that existing API keys with v1 API access have not been revoked?
edel79 commented 2023-07-05 03:12:25 -04:00 (Migrated from github.com)

Thanks to every contributors for the work made !
Can someone say how far we are to make nitter work again ?

Thanks to every contributors for the work made ! Can someone say how far we are to make nitter work again ?
rohitrsm83 commented 2023-07-05 05:25:47 -04:00 (Migrated from github.com)

@coda101

Seems like tweettunnel.com is using ads which bcloudhost.com is part of.

Ghostery will block these two attempts when visiting tweettunnel.com:

httpx://www.bcloudhost.com/9c88e091a401e3c00259b11fe2e91264/invoke.js

httpx://likenesscollecting.com/be501a9bff1a8da595943ddced3825ed/invoke.js

Checking both tweettunnel.com and bcloudhost.com through PaloAlto urlfiltering (https://urlfiltering.paloaltonetworks.com/query/) brings following result:

Edit: Made all domains non-clickable.

I didn't understand much but thank you for the help and warning about fishy stuff.

> @coda101 > > Seems like `tweettunnel.com` is using ads which `bcloudhost.com` is part of. > > Ghostery will block these two attempts when visiting `tweettunnel.com`: > > `httpx://www.bcloudhost.com/9c88e091a401e3c00259b11fe2e91264/invoke.js` > > `httpx://likenesscollecting.com/be501a9bff1a8da595943ddced3825ed/invoke.js` > > Checking both `tweettunnel.com` and `bcloudhost.com` through PaloAlto urlfiltering (`https://urlfiltering.paloaltonetworks.com/query/`) brings following result: > > Edit: Made all domains non-clickable. I didn't understand much but thank you for the help and warning about fishy stuff.
BANKA2017 commented 2023-07-05 06:56:33 -04:00 (Migrated from github.com)

I found that the rate limit of using the existing UserTweetsAndReplies / UserTweets / TweetDetail endpoint directly will become very low (50 times per 15 minutes), updating to the v2 endpoint used by the application will increase the rate limit UserWithProfileTweetsQueryV2 /
UserWithProfileTweetsAndRepliesQueryV2 / ConversationTimelineV2 (500 times per 15 minutes), but the search endpoint did not change it's rate limit.

I found that the rate limit of using the existing `UserTweetsAndReplies` / `UserTweets` / `TweetDetail` endpoint directly will become very low (50 times per 15 minutes), updating to the v2 endpoint used by the application will increase the rate limit `UserWithProfileTweetsQueryV2` / `UserWithProfileTweetsAndRepliesQueryV2` / `ConversationTimelineV2` (500 times per 15 minutes), but the search endpoint did not change it's rate limit.
AlyoshaVasilieva commented 2023-07-05 06:57:08 -04:00 (Migrated from github.com)

Tweets can be viewed when logged out again. Website uses the /2ICDjqPd81tulZcYrtpTuQ/TweetResultByRestId endpoint instead of /NmCeCgkVlsRGS1cAwqtgmw/TweetDetail. Replies can't be viewed, only the requested tweet. Rate-limit is 50 tweets per 15 minutes, but it's using guest tokens so token refreshing should work.

Tweets can be viewed when logged out again. Website uses the `/2ICDjqPd81tulZcYrtpTuQ/TweetResultByRestId` endpoint instead of `/NmCeCgkVlsRGS1cAwqtgmw/TweetDetail`. Replies can't be viewed, only the requested tweet. Rate-limit is 50 tweets per 15 minutes, but it's using guest tokens so token refreshing should work.
maddsua commented 2023-07-05 08:26:34 -04:00 (Migrated from github.com)

the twitter rank has already dropped 6 places from yesterday to today 🤦‍♂️ https://ciscorank.com/s/twitter.com https://i.imgur.com/e5U9Kox.png

Dropped by nearly 50 places by today. Good job Elon-guy, keep playing stupid games

image

> the twitter rank has already dropped 6 places from yesterday to today 🤦‍♂️ https://ciscorank.com/s/twitter.com [![https://i.imgur.com/e5U9Kox.png](https://camo.githubusercontent.com/5b1877f5b25e75822114fc0e9ee78bdd1b1a1bfe91b1577624fb433eed0903dd/68747470733a2f2f692e696d6775722e636f6d2f653555394b6f782e706e67)](https://ciscorank.com/s/twitter.com) Dropped by nearly 50 places by today. Good job Elon-guy, keep playing stupid games ![image](https://github.com/zedeus/nitter/assets/102395937/0971fc4b-82c0-48a9-a22b-ada6b0868b52)
ghost commented 2023-07-05 08:39:44 -04:00 (Migrated from github.com)

things are changing

you can now view individual tweets without an account: https://twitter.com/elonmusk/status/1675390796718014464

the individual tweets are without replies

you can even view the users account if you click their username within an already opened tweet

but they will not have a feed

if you try to go to a users account directly it will hit you with the login page

because of the above it appears nitter is slightly less broken

instead of an error you can view accounts but they are feedless: https://nitter.net/elonmusk

things are changing you can now view individual tweets without an account: https://twitter.com/elonmusk/status/1675390796718014464 the individual tweets are without replies you can even view the users account if you click their username within an already opened tweet but they will not have a feed if you try to go to a users account directly it will hit you with the login page because of the above it appears nitter is slightly less broken instead of an error you can view accounts but they are feedless: https://nitter.net/elonmusk
ghost commented 2023-07-05 08:58:24 -04:00 (Migrated from github.com)

things are changing

you can now view individual tweets without an account: https://twitter.com/elonmusk/status/1675390796718014464

the individual tweets are without replies

you can even view the users account if you click their username within an already opened tweet

but they will not have a feed

if you try to go to a users account directly it will hit you with the login page

because of the above it appears nitter is slightly less broken

instead of an error you can view accounts but they are feedless: https://nitter.net/elonmusk

adding to this:

you can now view twitter feeds if you are using the googlebot useragent
"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
elon

> things are changing > > you can now view individual tweets without an account: https://twitter.com/elonmusk/status/1675390796718014464 > > the individual tweets are without replies > > you can even view the users account if you click their username within an already opened tweet > > but they will not have a feed > > if you try to go to a users account directly it will hit you with the login page > > because of the above it appears nitter is slightly less broken > > instead of an error you can view accounts but they are feedless: https://nitter.net/elonmusk adding to this: you can now view twitter feeds if you are using the googlebot useragent "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" ![elon](https://github.com/zedeus/nitter/assets/138683961/8de7aaf0-4563-4a01-a8a6-2ca22f1f5e8e)
TDavLinguist commented 2023-07-05 09:24:17 -04:00 (Migrated from github.com)

you can now view twitter feeds if you are using the googlebot useragent "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Just to note, you can see the last few recent posts on the feed, but you can't scroll and can't see comments. Still better than nothing.

> you can now view twitter feeds if you are using the googlebot useragent "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" Just to note, you can see the last few recent posts on the feed, but you can't scroll and can't see comments. Still better than nothing.
buxy-xyz commented 2023-07-05 15:40:51 -04:00 (Migrated from github.com)

you can now view twitter feeds if you are using the googlebot useragent "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Just to note, you can see the last few recent posts on the feed, but you can't scroll and can't see comments. Still better than nothing.

they fully undo'd the login-only change by now.

> > you can now view twitter feeds if you are using the googlebot useragent "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" > > Just to note, you can see the last few recent posts on the feed, but you can't scroll and can't see comments. Still better than nothing. they fully undo'd the login-only change by now.
edel79 commented 2023-07-05 15:49:18 -04:00 (Migrated from github.com)

But Nitter still doesn't work apparently.

But Nitter still doesn't work apparently.
erikcas commented 2023-07-05 16:09:12 -04:00 (Migrated from github.com)

Not fully undone. Watch a tweet on https://twitter.com/"user"/status/"tweet_id" while not logged in works fine. Anything else (user timelines, search) still is redirecting to login dialog.

Not fully undone. Watch a tweet on https://twitter.com/"user"/status/"tweet_id" while not logged in works fine. Anything else (user timelines, search) still is redirecting to login dialog.
devgaucho commented 2023-07-05 16:15:35 -04:00 (Migrated from github.com)
syndication is still down https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true ![https://i.imgur.com/p8GTZIf.png](https://i.imgur.com/p8GTZIf.png)
devgaucho commented 2023-07-05 16:19:23 -04:00 (Migrated from github.com)

things are changing

you can now view individual tweets without an account: https://twitter.com/elonmusk/status/1675390796718014464

the individual tweets are without replies

you can even view the users account if you click their username within an already opened tweet

but they will not have a feed

if you try to go to a users account directly it will hit you with the login page

because of the above it appears nitter is slightly less broken

instead of an error you can view accounts but they are feedless: https://nitter.net/elonmusk

this is a good signal 🙏

> things are changing > > you can now view individual tweets without an account: [https://_twitter_.com/elonmusk/status/1675390796718014464](https://twitter.com/elonmusk/status/1675390796718014464) > > the individual tweets are without replies > > you can even view the users account if you click their username within an already opened tweet > > but they will not have a feed > > if you try to go to a users account directly it will hit you with the login page > > because of the above it appears nitter is slightly less broken > > instead of an error you can view accounts but they are feedless: https://nitter.net/elonmusk this is a good signal 🙏
ghost commented 2023-07-05 18:04:06 -04:00 (Migrated from github.com)

this is a good signal

I'm rather more pessimistic, I think they are gauging how much they can squeeze without getting hurt. They may be satisfied with this or little more, which would be pretty terrible for instances that don't use api (all except privacydev?).

> this is a good signal I'm rather more pessimistic, I think they are gauging how much they can squeeze without getting hurt. They may be satisfied with this or little more, which would be pretty terrible for instances that don't use api (all except privacydev?).
eylles commented 2023-07-05 21:48:41 -04:00 (Migrated from github.com)

except for profiles

image

except for profiles ![image](https://github.com/zedeus/nitter/assets/33670677/6914b50e-80a1-492a-a594-817c8b256500)
amano-kenji commented 2023-07-05 23:58:21 -04:00 (Migrated from github.com)

I'm still unable to read profiles or fetch RSS feeds on nitter.

I'm still unable to read profiles or fetch RSS feeds on nitter.
eldepor commented 2023-07-06 00:37:21 -04:00 (Migrated from github.com)

Removing the woke disease from social media cupolas has its consecuences. Musk is now paying for it.

Removing the woke disease from social media cupolas has its consecuences. Musk is now paying for it.
ultrajae commented 2023-07-06 00:40:22 -04:00 (Migrated from github.com)

I'm seeing TLs again on instances..

edit
Meh. Maybe it was just timing. Not working.. Rate limits..

I'm seeing TLs again on instances.. edit Meh. Maybe it was just timing. Not working.. Rate limits..
devgaucho commented 2023-07-06 00:55:44 -04:00 (Migrated from github.com)

except for profiles

image

zuck show your magick stick to musk, now he has a new, even bigger problem to face

https://imgur.com/2P8pnVw.png

> except for profiles > > ![image](https://user-images.githubusercontent.com/33670677/251319746-6914b50e-80a1-492a-a594-817c8b256500.png) zuck show your [magick stick](https://www.threads.net/@zuck) to musk, now he has a new, even bigger problem to face ![https://imgur.com/2P8pnVw.png](https://imgur.com/2P8pnVw.png)
nicfab commented 2023-07-06 00:55:49 -04:00 (Migrated from github.com)

Sorry, I join now the discussion.
What modifications are needed to make Nitter work?

Sorry, I join now the discussion. What modifications are needed to make Nitter work?
devgaucho commented 2023-07-06 00:57:01 -04:00 (Migrated from github.com)

Sorry, I join now the discussion. What modifications are needed to make Nitter work?

bypass or integrate the authentication to the crawler

> Sorry, I join now the discussion. What modifications are needed to make Nitter work? bypass or integrate the authentication to the crawler
nicfab commented 2023-07-06 00:58:38 -04:00 (Migrated from github.com)

Sorry, I join now the discussion. What modifications are needed to make Nitter work?

bypass or integrate the authentication to the crawler

Tks. What kind of interventions are on the code?

> > Sorry, I join now the discussion. What modifications are needed to make Nitter work? > > bypass or integrate the authentication to the crawler Tks. What kind of interventions are on the code?
devgaucho commented 2023-07-06 01:02:13 -04:00 (Migrated from github.com)

Tks. What kind of interventions are on the code?

the code needs to be rewritten to incorporate authentication cookies generated somehow

some hackers are already using mobile app visitor authentication code to do this

I think simulating the native twitter web authentication is the safest way to make a crawler with long-term support

> Tks. What kind of interventions are on the code? the code needs to be rewritten to incorporate authentication cookies generated somehow some hackers are already using mobile app visitor authentication code to do this I think simulating the native twitter web authentication is the safest way to make a crawler with long-term support
devgaucho commented 2023-07-06 01:05:15 -04:00 (Migrated from github.com)

the simple cookie incorporation works at youtube-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab

the simple cookie incorporation works at youtube-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab
nicfab commented 2023-07-06 01:08:18 -04:00 (Migrated from github.com)

the simple cookie incorporation works at youtube-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab

Is there any intervention on the code you can show me?

> the simple cookie incorporation works at youtube-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab Is there any intervention on the code you can show me?
devgaucho commented 2023-07-06 01:23:41 -04:00 (Migrated from github.com)

the simple cookie incorporation works at youtube-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab

Is there any intervention on the code you can show me?

not, @zedeus is waiting before act in nitter, but tweet tunnel and rss hub are already working

> > the simple cookie incorporation works at _youtube_-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab > > Is there any intervention on the code you can show me? not, @zedeus is waiting before act in [nitter](https://nitter.net/elonmusk), but [tweet tunnel](https://tweettunnel.com/elonmusk) and [rss hub](https://rsshub.app/twitter/user/elonmusk) are already working
erikcas commented 2023-07-06 01:54:35 -04:00 (Migrated from github.com)

the simple cookie incorporation works at youtube-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab

Is there any intervention on the code you can show me?

not, @zedeus is waiting before act in nitter, but tweet tunner and rss hub are already working

Tweettunnel is, rsshub seems to only show paying users

> > > the simple cookie incorporation works at _youtube_-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab > > > > > > Is there any intervention on the code you can show me? > > not, @zedeus is waiting before act in [nitter](https://nitter.net/elonmusk), but [tweet tunner](https://tweettunnel.com/elonmusk) and [rss hub](https://rsshub.app/twitter/user/elonmusk) are already working Tweettunnel is, rsshub seems to only show paying users
devgaucho commented 2023-07-06 03:12:34 -04:00 (Migrated from github.com)

the simple cookie incorporation works at youtube-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab

Is there any intervention on the code you can show me?

not, @zedeus is waiting before act in nitter, but tweet tunner and rss hub are already working

Tweettunnel is, rsshub seems to only show paying users

rsshub was actually only showing the profiles anyway

but they are getting tweets from non-paying users too

> > > > the simple cookie incorporation works at __youtube__-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab > > > > > > > > > Is there any intervention on the code you can show me? > > > > > > not, @zedeus is waiting before act in [nitter](https://nitter.net/elonmusk), but [tweet tunner](https://tweettunnel.com/elonmusk) and [rss hub](https://rsshub.app/twitter/user/elonmusk) are already working > > Tweettunnel is, rsshub seems to only show paying users rsshub was actually only showing the profiles anyway but they are getting tweets from non-paying users too
Write commented 2023-07-06 03:13:21 -04:00 (Migrated from github.com)

FYI twscraper seems to also be a tool that is able to rotate between accounts.

FYI [twscraper](https://github.com/vladkens/twscrape) seems to also be a tool that is able to rotate between accounts.
devgaucho commented 2023-07-06 03:18:22 -04:00 (Migrated from github.com)

FYI twscraper seems to also be a tool that is able to rotate between accounts.

that's the right way 👍

> FYI [twscraper](https://github.com/vladkens/twscrape) seems to also be a tool that is able to rotate between accounts. that's the right way 👍
erikcas commented 2023-07-06 03:23:20 -04:00 (Migrated from github.com)

the simple cookie incorporation works at youtube-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab

Is there any intervention on the code you can show me?

not, @zedeus is waiting before act in nitter, but tweet tunner and rss hub are already working

Tweettunnel is, rsshub seems to only show paying users

rsshub was actually only showing the profiles anyway

but they are getting tweets from non-paying users too

lol, didn't know

> > > > > the simple cookie incorporation works at **youtube**-dl and yt-dlp, but for public nitter instances a cookies rotation with many different accounts credentiais is need @nicfab > > > > > > > > > > > > Is there any intervention on the code you can show me? > > > > > > > > > not, @zedeus is waiting before act in [nitter](https://nitter.net/elonmusk), but [tweet tunner](https://tweettunnel.com/elonmusk) and [rss hub](https://rsshub.app/twitter/user/elonmusk) are already working > > > > > > Tweettunnel is, rsshub seems to only show paying users > > rsshub was actually only showing the profiles anyway > > but they are getting tweets from non-paying users too lol, didn't know
Jerroder commented 2023-07-06 06:12:58 -04:00 (Migrated from github.com)

It seems like we won't need that after all, they removed it. Strangely Nitter still isn't working though.

It seems like we won't need that after all, they [removed it](https://techcrunch.com/2023/07/05/twitter-silently-removes-login-requirement-for-viewing-tweets/). Strangely Nitter still isn't working though.
Pakbon commented 2023-07-06 06:25:04 -04:00 (Migrated from github.com)

It seems like we won't need that after all, they removed it. Strangely Nitter still isn't working though.

Twitter gave back the ability to see individual tweets without logging in. However you still can't see whole threads, or all tweets for one account.

> It seems like we won't need that after all, they [removed it](https://techcrunch.com/2023/07/05/twitter-silently-removes-login-requirement-for-viewing-tweets/). Strangely Nitter still isn't working though. Twitter gave back the ability to see individual tweets without logging in. However you still can't see whole threads, or all tweets for one account.
m1gicturtl commented 2023-07-06 08:07:08 -04:00 (Migrated from github.com)

I found that the rate limit of using the existing UserTweetsAndReplies / UserTweets / TweetDetail endpoint directly will become very low (50 times per 15 minutes), updating to the v2 endpoint used by the application will increase the rate limit UserWithProfileTweetsQueryV2 / UserWithProfileTweetsAndRepliesQueryV2 / ConversationTimelineV2 (500 times per 15 minutes), but the search endpoint did not change it's rate limit.

Any idea how to make the count parameter stick on UserWithProfileTweetsQueryV2? On UserTweets you can do "withV2Timeline": false but it doesnt work on this endpoint

> I found that the rate limit of using the existing `UserTweetsAndReplies` / `UserTweets` / `TweetDetail` endpoint directly will become very low (50 times per 15 minutes), updating to the v2 endpoint used by the application will increase the rate limit `UserWithProfileTweetsQueryV2` / `UserWithProfileTweetsAndRepliesQueryV2` / `ConversationTimelineV2` (500 times per 15 minutes), but the search endpoint did not change it's rate limit. Any idea how to make the `count` parameter stick on `UserWithProfileTweetsQueryV2`? On `UserTweets` you can do `"withV2Timeline": false` but it doesnt work on this endpoint
NTchrist commented 2023-07-06 12:00:03 -04:00 (Migrated from github.com)

It's probably still worth exploring/implementing as many contingencies as possible. Just like some alternatives frontends for reddit using their private api, it makes it so twitter can't break nitter without breaking their own functionality. Mutually assured destruction

It's probably still worth exploring/implementing as many contingencies as possible. Just like some alternatives frontends for reddit using their private api, it makes it so twitter can't break nitter without breaking their own functionality. Mutually assured destruction
TeusLollo commented 2023-07-06 12:00:13 -04:00 (Migrated from github.com)

I'm betting, personally, that this will be over in about 3 days and you'll be able to view whole accounts. So might not be worth all the effort to work around this

Maybe so, but I would still keep those efforts in a separate branch, just in case they should ever be needed.

Or they could eventually be patched-in, as an "emergency" sort of back-end, should this happen again (Assuming the Twitter API isn't going to be completely blocked-off in the future).

> I'm betting, personally, that this will be over in about 3 days and you'll be able to view whole accounts. So might not be worth all the effort to work around this Maybe so, but I would still keep those efforts in a separate branch, just in case they should ever be needed. Or they could eventually be patched-in, as an "emergency" sort of back-end, should this happen again (Assuming the Twitter API isn't going to be completely blocked-off in the future).
devgaucho commented 2023-07-06 13:36:00 -04:00 (Migrated from github.com)

It's probably still worth exploring/implementing as many contingencies as possible. Just like some alternatives frontends for reddit using their private api, it makes it so_ twitter _can't break nitter without breaking their own functionality. Mutually assured destruction

Si vis pacem, para bellum https://i.imgur.com/LFXxYTm.png

> It's probably still worth exploring/implementing as many contingencies as possible. Just like some alternatives frontends for reddit using their private _api_, it makes it so_ twitter _can't break nitter without breaking their own functionality. Mutually assured destruction [Si vis pacem, para bellum](https://en.wikipedia.org/wiki/Si_vis_pacem,_para_bellum) [![https://i.imgur.com/LFXxYTm.png](https://i.imgur.com/QQ04nIN.png)](https://en.wikipedia.org/wiki/Si_vis_pacem,_para_bellum)
Zitronella commented 2023-07-06 14:22:23 -04:00 (Migrated from github.com)

This intance seems to work also for hashtags (maybe only for this moment?)
https://nitter.x86-64-unknown-linux-gnu.zip/search?f=tweets&q=%23riptwitter&since=&until=&near=
Screenshot 2023-07-06 at 20-05-16 Search (#riptwitter)

This intance seems to work also for hashtags (maybe only for this moment?) https://nitter.x86-64-unknown-linux-gnu.zip/search?f=tweets&q=%23riptwitter&since=&until=&near= ![Screenshot 2023-07-06 at 20-05-16 Search (#riptwitter)](https://github.com/zedeus/nitter/assets/14326582/12ac9f74-fac4-42fb-89dd-74c288d6daf5)
markcellus commented 2023-07-06 14:32:23 -04:00 (Migrated from github.com)

It's probably still worth exploring/implementing as many contingencies as possible. Just like some alternatives frontends for reddit using their private api, it makes it so twitter can't break nitter without breaking their own functionality. Mutually assured destruction

I've been thinking more about how to prevent companies from doing this sort of thing: making content publically available, then putting everything behind an account wall after gaining enough users. LinkedIn did it, Instagram did it, Facebook did it, etc.

Even having decentralized frontends isn't really promising, if these companies will just keep changing their backends. When we update the code, they can keep changing it. It's how bibliogram ended up dying. That was also decentralized like nitter but just for instagram but the original author closed it down because it became too much to keep up with.

The only real way to do this is to create accounts with different IPs and devices and make the companies think they're real accounts (e.g. let them age, add a phone number, verify via email, hell--even set up 2FA) and start sharing these accounts in a distributed database or in some centralized repository. the data for accounts can be encrypted with keys that only we have so companies cant see what accounts they are. That way, it would be virtually impossible for companies to stop. If people are interested in this idea, I don't mind starting another thread to discuss more.

> It's probably still worth exploring/implementing as many contingencies as possible. Just like some alternatives frontends for reddit using their private api, it makes it so twitter can't break nitter without breaking their own functionality. Mutually assured destruction I've been thinking more about how to prevent companies from doing this sort of thing: making content publically available, then putting everything behind an account wall after gaining enough users. LinkedIn did it, Instagram did it, Facebook did it, etc. Even having decentralized frontends isn't really promising, if these companies will just keep changing their backends. When we update the code, they can keep changing it. It's how [bibliogram ended up dying](https://bibliogram.art/). That was also decentralized like nitter but just for instagram but the original author closed it down because it became too much to keep up with. The only real way to do this is to create accounts with different IPs and devices and make the companies think they're real accounts (e.g. let them age, add a phone number, verify via email, hell--even set up 2FA) and start sharing these accounts in a distributed database or in some centralized repository. the data for accounts can be encrypted with keys that only we have so companies cant see what accounts they are. That way, it would be virtually impossible for companies to stop. If people are interested in this idea, I don't mind starting another thread to discuss more.
Apachez- commented 2023-07-06 14:38:53 -04:00 (Migrated from github.com)

Just lets hope this isnt the next level of escalation: https://commsrisk.com/ukraine-police-raid-simbox-farms-spreading-russian-propaganda-via-1-5-million-fake-internet-accounts/

But instead of a propaganda farm its just a nitter cluster to bypass the moody behaviour of the Twitter CEO.

Just lets hope this isnt the next level of escalation: `https://commsrisk.com/ukraine-police-raid-simbox-farms-spreading-russian-propaganda-via-1-5-million-fake-internet-accounts/` But instead of a propaganda farm its just a nitter cluster to bypass the moody behaviour of the Twitter CEO.
ghost commented 2023-07-06 15:16:05 -04:00 (Migrated from github.com)

This intance seems to work also for hashtags (maybe only for this moment?)
https://nitter.x86-64-unknown-linux-gnu.zip/search?f=tweets&q=%23riptwitter&since=&until=&near=

it's my instance. it uses #925 and #830 on a burner twitter account. i've used it extensively over the past week and it has worked fine so far. some spurious rate limits, but they disappear on refresh (since that triggers token rotation)

> This intance seems to work also for hashtags (maybe only for this moment?) > [https://nitter.x86-64-unknown-linux-gnu.zip/search?f=tweets&q=%23riptwitter&since=&until=&near=](https://github.com/zedeus/nitter/issues/url) it's my instance. it uses #925 and #830 on a burner twitter account. i've used it extensively over the past week and it has worked fine so far. some spurious rate limits, but they disappear on refresh (since that triggers token rotation)
edel79 commented 2023-07-06 15:20:02 -04:00 (Migrated from github.com)

So this means Nitter can work again with current situation. Let's hope main code will soon integrate these fixs.

So this means Nitter can work again with current situation. Let's hope main code will soon integrate these fixs.
ghost commented 2023-07-06 15:22:51 -04:00 (Migrated from github.com)

those patches require you to register a twitter account to set up the instance. i think it's the best solution so far, but it's really not great.

i think a true zero-config solution would use Android's reverse engineered APIs, aka "guest accounts". this would require a working oauth2 implementation for nimlang, or at least the request signing part. and it's a lot of work to implement.

it's smarter to sit this out as zedeus does

those patches require you to register a twitter account to set up the instance. i think it's the best solution so far, but it's really not great. i think a true zero-config solution would use Android's reverse engineered APIs, aka "guest accounts". this would require a working oauth2 implementation for nimlang, or at least the request signing part. and it's a lot of work to implement. it's smarter to sit this out as zedeus does
a7maadf commented 2023-07-06 19:08:30 -04:00 (Migrated from github.com)
https://alternativeto.net/news/2023/7/twitter-quietly-removes-log-in-requirement-for-viewing-tweets/ hmmm
Write commented 2023-07-06 19:36:15 -04:00 (Migrated from github.com)

This intance seems to work also for hashtags (maybe only for this moment?)
https://nitter.x86-64-unknown-linux-gnu.zip/search?f=tweets&q=%23riptwitter&since=&until=&near=

it's my instance. it uses #925 and #830 on a burner twitter account. i've used it extensively over the past week and it has worked fine so far. some spurious rate limits, but they disappear on refresh (since that triggers token rotation)

thanks a lot for your work!

I just spinned up an instance with #925 and #830 to see how well it holds : https://nitter.socialspill.com/

EDIT : Well I seriously down't know. It stopped working after a few minutes only. 🤷 Only 404 errors

> > This intance seems to work also for hashtags (maybe only for this moment?) > > [https://nitter.x86-64-unknown-linux-gnu.zip/search?f=tweets&q=%23riptwitter&since=&until=&near=](https://github.com/zedeus/nitter/issues/url) > > it's my instance. it uses #925 and #830 on a burner twitter account. i've used it extensively over the past week and it has worked fine so far. some spurious rate limits, but they disappear on refresh (since that triggers token rotation) thanks a lot for your work! I just spinned up an instance with #925 and #830 to see how well it holds : https://nitter.socialspill.com/ EDIT : Well I seriously down't know. It stopped working after a few minutes only. 🤷 Only 404 errors
ghost commented 2023-07-06 19:53:36 -04:00 (Migrated from github.com)

EDIT : Well I seriously down't know. It stopped working after a few minutes only. 🤷 Only 404 errors

refresh a couple of times? it should fix itself after that. make sure you got the cookies and csrf config right (only ct0 and auth_token)

> EDIT : Well I seriously down't know. It stopped working after a few minutes only. 🤷 Only 404 errors refresh a couple of times? it should fix itself after that. make sure you got the cookies and csrf config right (only ct0 and auth_token)
Write commented 2023-07-06 19:57:18 -04:00 (Migrated from github.com)

EDIT : Well I seriously down't know. It stopped working after a few minutes only. 🤷 Only 404 errors

refresh a couple of times? it should fix itself after that. make sure you got the cookies and csrf config right (only ct0 and auth_token)

Well yes, I just checked again the website and nitter.conf does contains the right cookieHeader with correctly filled ct0 and auth_token. I also filled xCsrfToken but the value seems to be the same as ct0 value. I just built the docker container after pulling branch, I kinda don't get it. I can refresh / reboot / delete the image & container and rebuild the image, and it stays at 404 answer from twitter.

> > EDIT : Well I seriously down't know. It stopped working after a few minutes only. 🤷 Only 404 errors > > refresh a couple of times? it should fix itself after that. make sure you got the cookies and csrf config right (only ct0 and auth_token) Well yes, I just checked again the website and nitter.conf does contains the right cookieHeader with correctly filled ct0 and auth_token. I also filled xCsrfToken but the value seems to be the same as ct0 value. I just built the docker container after pulling branch, I kinda don't get it. I can refresh / reboot / delete the image & container and rebuild the image, and it stays at 404 answer from twitter.
ghost commented 2023-07-06 19:58:33 -04:00 (Migrated from github.com)

which url/path/view are we talking about? i cannot access the instance at all at the moment.

which url/path/view are we talking about? i cannot access the instance at all at the moment.
Write commented 2023-07-06 19:59:24 -04:00 (Migrated from github.com)

which url are we talking about? i cannot access the instance at all at the moment.

Sorry, I was rebuilding the image yet again just to "see" if I missed something. It works for now. Will see how much time.

It already struggles again, for example on your instance you can load

https://nitter.x86-64-unknown-linux-gnu.zip/search?f=users&q=%23riptwitter

and then click 'Users' tab multiple time, or just CTRL+R / F5, really (which makes the URL load each time), and it works everytime. whereas on mine :

https://nitter.socialspill.com/search?f=users&q=%23riptwitter

If you do the same thing, 50% of the time you get blank results.

EDIT : Well 75% failure rate now 💀

> which url are we talking about? i cannot access the instance at all at the moment. Sorry, I was rebuilding the image yet again just to "see" if I missed something. It works for now. Will see how much time. It already struggles again, for example on your instance you can load https://nitter.x86-64-unknown-linux-gnu.zip/search?f=users&q=%23riptwitter and then click 'Users' tab multiple time, or just CTRL+R / F5, really (which makes the URL load each time), and it works everytime. whereas on mine : https://nitter.socialspill.com/search?f=users&q=%23riptwitter If you do the same thing, 50% of the time you get blank results. EDIT : Well 75% failure rate now 💀
ghost commented 2023-07-06 20:05:55 -04:00 (Migrated from github.com)

If you do the same thing 50% of the time you get blank result for now.

nah, I also have this on my instance (there's just a caching proxy in front of it). it is probably because there are some bad tokens added in #925 that don't actually work. haven't spent the time figuring out which one it is, would need to A/B test it. my guess is that the ipad token is the most stable one

> If you do the same thing 50% of the time you get blank result for now. nah, I also have this on my instance (there's just a caching proxy in front of it). it is probably because there are some bad tokens added in #925 that don't actually work. haven't spent the time figuring out which one it is, would need to A/B test it. my guess is that the ipad token is the most stable one
Write commented 2023-07-06 20:12:02 -04:00 (Migrated from github.com)

If you do the same thing 50% of the time you get blank result for now.

nah, I also have this on my instance (there's just a caching proxy in front of it). it is probably because there are some bad tokens added in #925 that don't actually work. haven't spent the time figuring out which one it is, would need to A/B test it. my guess is that the ipad token is the most stable one

ok thanks.

All I can say is that when I tried all the ApiKey / endpoints, only the iPad one worked for me with this script :

(haven't checked nitter's endpoints with it)

I've updated @ScamCast's awesome poor_man_nitter.py to add UserTweets endpoint.

import requests, json
from pprint import pprint as pp

headers = {
    "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR",
    "x-guest-token": "",
    "x-twitter-active-user": "yes",
    "Referer": "https://twitter.com",
    "user-agent": "",
}

def authenticate():
    resp1 = requests.post("https://api.twitter.com/oauth2/token", params={"grant_type": "client_credentials"}, auth=("CjulERsDeqhhjSme66ECg", "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck")).json()
    headers["Authorization"] = f"Bearer {resp1['access_token']}"
    resp2 = requests.post("https://api.twitter.com/1.1/guest/activate.json", headers=headers).json()
    headers["x-guest-token"] = resp2["guest_token"]
    return {"access_token": resp1['access_token'], "guest_token": resp2["guest_token"]}


def UserByScreenName(username):
    return requests.get("https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName", headers=headers, params={
        "features": json.dumps({
            "hidden_profile_likes_enabled": False,
            "responsive_web_graphql_exclude_directive_enabled": True,
            "verified_phone_label_enabled": False,
            "subscriptions_verification_info_verified_since_enabled": True,
            "highlights_tweets_tab_ui_enabled": True,
            "creator_subscriptions_tweet_preview_api_enabled": True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False,
            "responsive_web_graphql_timeline_navigation_enabled": True
        }),
        "variables": json.dumps({
            "screen_name": username,
            "withSafetyModeUserFields": True
        })
    }).json()

def UserResultByIdQuery(userId):
    return requests.get("https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery", headers=headers, params={
        "features": json.dumps({
            "blue_business_profile_image_shape_enabled": False,
            "verified_phone_label_enabled": False,
            "super_follow_user_api_enabled": False,
            "super_follow_badge_privacy_enabled": False,
            "subscriptions_verification_info_enabled": False,
            "creator_subscriptions_subscription_count_enabled": False,
            "super_follow_exclusive_tweet_notifications_enabled": False
        }),
        "variables": json.dumps({
            "user_id": f"{userId}",
            "rest_id": f"{userId}"
        })
    }).json()

def UserTweetsAndReplies(userId):
    return requests.get("https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies", headers=headers, params={
        "features": json.dumps({
            "responsive_web_twitter_blue_verified_badge_is_enabled": True,
            "responsive_web_graphql_exclude_directive_enabled": True,
            "verified_phone_label_enabled": False,
            "responsive_web_graphql_timeline_navigation_enabled": True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False,
            "tweetypie_unmention_optimization_enabled": True,
            "vibe_api_enabled": True,
            "responsive_web_edit_tweet_api_enabled": True,
            "graphql_is_translatable_rweb_tweet_is_translatable_enabled": True,
            "view_counts_everywhere_api_enabled": True,
            "longform_notetweets_consumption_enabled": True,
            "tweet_awards_web_tipping_enabled": False,
            "freedom_of_speech_not_reach_fetch_enabled": False,
            "standardized_nudges_misinfo": True,
            "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False,
            "interactive_text_enabled": True,
            "responsive_web_text_conversations_enabled": False,
            "longform_notetweets_richtext_consumption_enabled": False,
            "responsive_web_enhance_cards_enabled":False
        }),
        "variables": json.dumps({
            "userId": f"{user_id}",
            "count": 40,
            "includePromotedContent": True,
            "withCommunity": True,
            "withSuperFollowsUserFields": True,
            "withDownvotePerspective": False,
            "withReactionsMetadata": False,
            "withReactionsPerspective": False,
            "withSuperFollowsTweetFields": True,
            "withVoice": True,
            "withV2Timeline":True
        })
    }).json()

def UserTweets(userId):
    return requests.get("https://api.twitter.com/graphql/rCpYpqplOq3UJ2p6Oxy3tw/UserTweets", headers=headers, params={
        "features": json.dumps({
            "responsive_web_twitter_blue_verified_badge_is_enabled": True,
            "responsive_web_graphql_exclude_directive_enabled": False,
            "verified_phone_label_enabled": False,
            "responsive_web_graphql_timeline_navigation_enabled": True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False,
            "tweetypie_unmention_optimization_enabled": True,
            "vibe_api_enabled": True,
            "responsive_web_edit_tweet_api_enabled": True,
            "graphql_is_translatable_rweb_tweet_is_translatable_enabled": True,
            "view_counts_everywhere_api_enabled": True,
            "longform_notetweets_consumption_enabled": True,
            "freedom_of_speech_not_reach_appeal_label_enabled": False,
            "tweet_awards_web_tipping_enabled": False,
            "freedom_of_speech_not_reach_fetch_enabled": False,
            "standardized_nudges_misinfo": True,
            "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False,
            "interactive_text_enabled": True,
            "responsive_web_text_conversations_enabled": False,
            "longform_notetweets_richtext_consumption_enabled": False,
            "responsive_web_enhance_cards_enabled": False
        }),
        "variables": json.dumps({
            "userId": f"{user_id}",
            "count": 40,
            "includePromotedContent": True,
            "withQuickPromoteEligibilityTweetFields": True,
            "withSuperFollowsUserFields": True,
            "withDownvotePerspective": False,
            "withReactionsMetadata": False,
            "withReactionsPerspective": False,
            "withSuperFollowsTweetFields": False,
            "withVoice": False,
            "withV2Timeline": False
        })
    }).json()

def TweetDetail(tweetId):
    return requests.get("https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail", headers=headers, params={
        "features": json.dumps({
            "rweb_lists_timeline_redesign_enabled": True,
            "creator_subscriptions_tweet_preview_api_enabled": True,
            "responsive_web_twitter_article_tweet_consumption_enabled": False,
            "longform_notetweets_rich_text_read_enabled": True,
            "longform_notetweets_inline_media_enabled": True,
            "responsive_web_media_download_video_enabled": True,
            "responsive_web_enhance_cards_enabled": True,
            "responsive_web_twitter_blue_verified_badge_is_enabled": True,
            "responsive_web_graphql_exclude_directive_enabled": True,
            "verified_phone_label_enabled": False,
            "responsive_web_graphql_timeline_navigation_enabled": True,
            "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False,
            "tweetypie_unmention_optimization_enabled": True,
            "vibe_api_enabled": True,
            "responsive_web_edit_tweet_api_enabled": True,
            "graphql_is_translatable_rweb_tweet_is_translatable_enabled": False,
            "view_counts_everywhere_api_enabled": True,
            "longform_notetweets_consumption_enabled": True,
            "tweet_awards_web_tipping_enabled": False,
            "freedom_of_speech_not_reach_fetch_enabled": False,
            "standardized_nudges_misinfo": True,
            "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False,
            "interactive_text_enabled": True,
            "responsive_web_text_conversations_enabled": False,
            "longform_notetweets_richtext_consumption_enabled": False
        }),
        "variables": json.dumps({
            "focalTweetId": tweetId,
            "with_rux_injections": True,
            "includePromotedContent": False,
            "withCommunity": False,
            "withQuickPromoteEligibilityTweetFields": False,
            "withBirdwatchNotes": False,
            "withSuperFollowsUserFields": False,
            "withDownvotePerspective": False,
            "withReactionsMetadata": False,
            "withReactionsPerspective": False,
            "withSuperFollowsTweetFields": False,
            "withVoice": True,
            "withV2Timeline": True
        }),
        "fieldToggles": json.dumps({
            "withArticleRichContentState": False
        })
    }).json()


test_username = 'elonmusk'
test_tweet_id = 1675390796718014464

authenticate()

user_id = UserByScreenName(test_username)['data']['user']['result']['rest_id']
tweetsAndReplies = UserTweetsAndReplies(user_id)['data']['user']['result']['timeline_v2']['timeline']['instructions'][1]['entries']
tweets = UserTweets(user_id)['data']['user']['result']['timeline']['timeline']['instructions'][1]['entries']
tweet_thread = TweetDetail(test_tweet_id)['data']['threaded_conversation_with_injections_v2']['instructions'][0]['entries']

print(json.dumps(tweets))
#pp(tweet_thread)

what's funny is, if "withV2Timeline": False, then the API does respect the "count": 40, variable ! I set it to false only for the endpoint I added (/UserTweets). I don't really see any downside to it for now. Executing above code like so :

./poor_man_nitter.py | jq '..|.full_text?|select(length>0)'

Returns magnificiently 40 latest tweets just fine (as it's the default set in the python file), NOT cropped or anything.

Screenshot du 2023-07-05 à 04 09 45

I tried to change "count:" variable to an arbitrary high number in UserTweets and can get UP to 155 latest tweets.

> > If you do the same thing 50% of the time you get blank result for now. > > nah, I also have this on my instance (there's just a caching proxy in front of it). it is probably because there are some bad tokens added in #925 that don't actually work. haven't spent the time figuring out which one it is, would need to A/B test it. my guess is that the ipad token is the most stable one ok thanks. All I can say is that when I tried all the ApiKey / endpoints, only the iPad one worked for me with this script : (haven't checked nitter's endpoints with it) > I've updated @ScamCast's awesome poor_man_nitter.py to add UserTweets endpoint. > > ```python > import requests, json > from pprint import pprint as pp > > headers = { > "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR", > "x-guest-token": "", > "x-twitter-active-user": "yes", > "Referer": "https://twitter.com", > "user-agent": "", > } > > def authenticate(): > resp1 = requests.post("https://api.twitter.com/oauth2/token", params={"grant_type": "client_credentials"}, auth=("CjulERsDeqhhjSme66ECg", "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck")).json() > headers["Authorization"] = f"Bearer {resp1['access_token']}" > resp2 = requests.post("https://api.twitter.com/1.1/guest/activate.json", headers=headers).json() > headers["x-guest-token"] = resp2["guest_token"] > return {"access_token": resp1['access_token'], "guest_token": resp2["guest_token"]} > > > def UserByScreenName(username): > return requests.get("https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName", headers=headers, params={ > "features": json.dumps({ > "hidden_profile_likes_enabled": False, > "responsive_web_graphql_exclude_directive_enabled": True, > "verified_phone_label_enabled": False, > "subscriptions_verification_info_verified_since_enabled": True, > "highlights_tweets_tab_ui_enabled": True, > "creator_subscriptions_tweet_preview_api_enabled": True, > "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False, > "responsive_web_graphql_timeline_navigation_enabled": True > }), > "variables": json.dumps({ > "screen_name": username, > "withSafetyModeUserFields": True > }) > }).json() > > def UserResultByIdQuery(userId): > return requests.get("https://api.twitter.com/graphql/oPppcargziU1uDQHAUmH-A/UserResultByIdQuery", headers=headers, params={ > "features": json.dumps({ > "blue_business_profile_image_shape_enabled": False, > "verified_phone_label_enabled": False, > "super_follow_user_api_enabled": False, > "super_follow_badge_privacy_enabled": False, > "subscriptions_verification_info_enabled": False, > "creator_subscriptions_subscription_count_enabled": False, > "super_follow_exclusive_tweet_notifications_enabled": False > }), > "variables": json.dumps({ > "user_id": f"{userId}", > "rest_id": f"{userId}" > }) > }).json() > > def UserTweetsAndReplies(userId): > return requests.get("https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies", headers=headers, params={ > "features": json.dumps({ > "responsive_web_twitter_blue_verified_badge_is_enabled": True, > "responsive_web_graphql_exclude_directive_enabled": True, > "verified_phone_label_enabled": False, > "responsive_web_graphql_timeline_navigation_enabled": True, > "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False, > "tweetypie_unmention_optimization_enabled": True, > "vibe_api_enabled": True, > "responsive_web_edit_tweet_api_enabled": True, > "graphql_is_translatable_rweb_tweet_is_translatable_enabled": True, > "view_counts_everywhere_api_enabled": True, > "longform_notetweets_consumption_enabled": True, > "tweet_awards_web_tipping_enabled": False, > "freedom_of_speech_not_reach_fetch_enabled": False, > "standardized_nudges_misinfo": True, > "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False, > "interactive_text_enabled": True, > "responsive_web_text_conversations_enabled": False, > "longform_notetweets_richtext_consumption_enabled": False, > "responsive_web_enhance_cards_enabled":False > }), > "variables": json.dumps({ > "userId": f"{user_id}", > "count": 40, > "includePromotedContent": True, > "withCommunity": True, > "withSuperFollowsUserFields": True, > "withDownvotePerspective": False, > "withReactionsMetadata": False, > "withReactionsPerspective": False, > "withSuperFollowsTweetFields": True, > "withVoice": True, > "withV2Timeline":True > }) > }).json() > > def UserTweets(userId): > return requests.get("https://api.twitter.com/graphql/rCpYpqplOq3UJ2p6Oxy3tw/UserTweets", headers=headers, params={ > "features": json.dumps({ > "responsive_web_twitter_blue_verified_badge_is_enabled": True, > "responsive_web_graphql_exclude_directive_enabled": False, > "verified_phone_label_enabled": False, > "responsive_web_graphql_timeline_navigation_enabled": True, > "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False, > "tweetypie_unmention_optimization_enabled": True, > "vibe_api_enabled": True, > "responsive_web_edit_tweet_api_enabled": True, > "graphql_is_translatable_rweb_tweet_is_translatable_enabled": True, > "view_counts_everywhere_api_enabled": True, > "longform_notetweets_consumption_enabled": True, > "freedom_of_speech_not_reach_appeal_label_enabled": False, > "tweet_awards_web_tipping_enabled": False, > "freedom_of_speech_not_reach_fetch_enabled": False, > "standardized_nudges_misinfo": True, > "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False, > "interactive_text_enabled": True, > "responsive_web_text_conversations_enabled": False, > "longform_notetweets_richtext_consumption_enabled": False, > "responsive_web_enhance_cards_enabled": False > }), > "variables": json.dumps({ > "userId": f"{user_id}", > "count": 40, > "includePromotedContent": True, > "withQuickPromoteEligibilityTweetFields": True, > "withSuperFollowsUserFields": True, > "withDownvotePerspective": False, > "withReactionsMetadata": False, > "withReactionsPerspective": False, > "withSuperFollowsTweetFields": False, > "withVoice": False, > "withV2Timeline": False > }) > }).json() > > def TweetDetail(tweetId): > return requests.get("https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail", headers=headers, params={ > "features": json.dumps({ > "rweb_lists_timeline_redesign_enabled": True, > "creator_subscriptions_tweet_preview_api_enabled": True, > "responsive_web_twitter_article_tweet_consumption_enabled": False, > "longform_notetweets_rich_text_read_enabled": True, > "longform_notetweets_inline_media_enabled": True, > "responsive_web_media_download_video_enabled": True, > "responsive_web_enhance_cards_enabled": True, > "responsive_web_twitter_blue_verified_badge_is_enabled": True, > "responsive_web_graphql_exclude_directive_enabled": True, > "verified_phone_label_enabled": False, > "responsive_web_graphql_timeline_navigation_enabled": True, > "responsive_web_graphql_skip_user_profile_image_extensions_enabled": False, > "tweetypie_unmention_optimization_enabled": True, > "vibe_api_enabled": True, > "responsive_web_edit_tweet_api_enabled": True, > "graphql_is_translatable_rweb_tweet_is_translatable_enabled": False, > "view_counts_everywhere_api_enabled": True, > "longform_notetweets_consumption_enabled": True, > "tweet_awards_web_tipping_enabled": False, > "freedom_of_speech_not_reach_fetch_enabled": False, > "standardized_nudges_misinfo": True, > "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": False, > "interactive_text_enabled": True, > "responsive_web_text_conversations_enabled": False, > "longform_notetweets_richtext_consumption_enabled": False > }), > "variables": json.dumps({ > "focalTweetId": tweetId, > "with_rux_injections": True, > "includePromotedContent": False, > "withCommunity": False, > "withQuickPromoteEligibilityTweetFields": False, > "withBirdwatchNotes": False, > "withSuperFollowsUserFields": False, > "withDownvotePerspective": False, > "withReactionsMetadata": False, > "withReactionsPerspective": False, > "withSuperFollowsTweetFields": False, > "withVoice": True, > "withV2Timeline": True > }), > "fieldToggles": json.dumps({ > "withArticleRichContentState": False > }) > }).json() > > > test_username = 'elonmusk' > test_tweet_id = 1675390796718014464 > > authenticate() > > user_id = UserByScreenName(test_username)['data']['user']['result']['rest_id'] > tweetsAndReplies = UserTweetsAndReplies(user_id)['data']['user']['result']['timeline_v2']['timeline']['instructions'][1]['entries'] > tweets = UserTweets(user_id)['data']['user']['result']['timeline']['timeline']['instructions'][1]['entries'] > tweet_thread = TweetDetail(test_tweet_id)['data']['threaded_conversation_with_injections_v2']['instructions'][0]['entries'] > > print(json.dumps(tweets)) > #pp(tweet_thread) > ``` > > what's funny is, if "withV2Timeline": False, then the API does respect the "count": 40, variable ! I set it to false only for the endpoint I added (/UserTweets). I don't really see any downside to it for now. Executing above code like so : > > `./poor_man_nitter.py | jq '..|.full_text?|select(length>0)'` > > Returns magnificiently 40 latest tweets just fine (as it's the default set in the python file), NOT cropped or anything. > > ![Screenshot du 2023-07-05 à 04 09 45](https://user-images.githubusercontent.com/541722/251018450-dcad0319-f30d-4168-85ae-326098fa94f6.png) > > I tried to change "count:" variable to an arbitrary high number in UserTweets and can get UP to 155 latest tweets.
Write commented 2023-07-06 20:49:28 -04:00 (Migrated from github.com)

Well it's down : You can see it only shows empty pages. Twitters returns only 404

Well it's down : You can see it only shows empty pages. Twitters returns only 404
ThallesP commented 2023-07-06 21:02:21 -04:00 (Migrated from github.com)

twitter implemented authentication in their apps.
they're definitely watching this issue.
image

twitter implemented authentication in their apps. they're definitely watching this issue. ![image](https://github.com/zedeus/nitter/assets/76017384/7cb8e719-7808-4661-8f78-90521d70821c)
ThallesP commented 2023-07-06 21:17:21 -04:00 (Migrated from github.com)

Wait, you could view Twitter logged out through their app?

It was mentioned previously, and the endpoints gathered so far is from the mobile side (which aren't working anymore).

> Wait, you could view Twitter logged out through their app? It was mentioned previously, and the endpoints gathered so far is from the mobile side (which aren't working anymore).
ghost commented 2023-07-06 21:18:15 -04:00 (Migrated from github.com)

there was an update to android yesterday, but at least the old android apk still works (Twitter_9.95.0-release.0_Apkpure.apk)

there was an update to android yesterday, but at least the old android apk still works (`Twitter_9.95.0-release.0_Apkpure.apk`)
ghost commented 2023-07-06 21:18:37 -04:00 (Migrated from github.com)

Well it's down : You can see it only shows empty pages. Twitters returns only 404

yep it's busted. was a fun 48 hours or so

> Well it's down : You can see it only shows empty pages. Twitters returns only 404 yep it's busted. was a fun 48 hours or so
ghost commented 2023-07-06 21:21:19 -04:00 (Migrated from github.com)

yes to be clear i am saying the old android apk i still have still allows me to view profiles and search tweets without an account

  1. google above filename
  2. download apk
  3. optionally, use apk-mitm to get rid of ssl verification
  4. use mitmproxy
  5. good luck reversing
yes to be clear i am saying the old android apk i still have still allows me to view profiles and search tweets without an account 1. google above filename 2. download apk 3. optionally, use apk-mitm to get rid of ssl verification 4. use mitmproxy 5. good luck reversing
mthmcalixto commented 2023-07-06 22:20:43 -04:00 (Migrated from github.com)

twitter implemented authentication in their apps.
they're definitely watching this issue.

Yes hahaha

> twitter implemented authentication in their apps. > they're definitely watching this issue. Yes hahaha
canbringyouback commented 2023-07-06 22:25:37 -04:00 (Migrated from github.com)

I baffled with space karen logic here ,if there is no way for soon-to-be user to view what are on twitter how it suppose to survive, this is not a porn site?

I baffled with space karen logic here ,if there is no way for soon-to-be user to view what are on twitter how it suppose to survive, this is not a porn site?
Apachez- commented 2023-07-06 23:55:20 -04:00 (Migrated from github.com)

I baffled with space karen logic here ,if there is no way for soon-to-be user to view what are on twitter how it suppose to survive, this is not a porn site?

Probably a way to manipulate the stock market with a hit and run (even if TWTR is delisted since 27 oct last year such numbers can have a value for a potential new owner or against competitors)?

"Look we have 250 billion users!" even if there are only ~8 billion people on this world and give or take about 60% of them use internet on a daily basis.

The 250 billion would come from burner accounts now needed but the investors wouldnt care about facts when they see a fast way to earn money.

> I baffled with space karen logic here ,if there is no way for soon-to-be user to view what are on twitter how it suppose to survive, this is not a porn site? Probably a way to manipulate the stock market with a hit and run (even if TWTR is delisted since 27 oct last year such numbers can have a value for a potential new owner or against competitors)? "Look we have 250 billion users!" even if there are only ~8 billion people on this world and give or take about 60% of them use internet on a daily basis. The 250 billion would come from burner accounts now needed but the investors wouldnt care about facts when they see a fast way to earn money.
Apachez- commented 2023-07-07 00:06:54 -04:00 (Migrated from github.com)

Question is what really happend at Twitter when their CEO had a bad weekend and went mayhem (but for this perhaps a separate thread should be created)?

If there were some massive AI scraping going on then why not just temporarily block or throttle those IP-addresses and call it a day?

Thats what I do when I see Google, Bing, Yandex and the others from time to time misbehave during their indexes of sites I host.

If next level of throttling is needed then give official Nitter instances their own API access (token key + IP-addresses in combo) where the official Nitter instances have a throttle on their own towards the enduser (as in whats normal for a Nitter user (based on IP-address/cookies) to consume in terms of requests/day and then add a margin to that to not get throttled unnecessary).

Using caches at Nitter would also lower the volume of requests towards Twitter if thats the issue now when they canceled (and signed a new contract a few months later?) their hostingcontract with Google Cloud according to: https://www.techradar.com/pro/twitter-has-apparently-started-paying-for-google-cloud-again

Question is what really happend at Twitter when their CEO had a bad weekend and went mayhem (but for this perhaps a separate thread should be created)? If there were some massive AI scraping going on then why not just temporarily block or throttle those IP-addresses and call it a day? Thats what I do when I see Google, Bing, Yandex and the others from time to time misbehave during their indexes of sites I host. If next level of throttling is needed then give official Nitter instances their own API access (token key + IP-addresses in combo) where the official Nitter instances have a throttle on their own towards the enduser (as in whats normal for a Nitter user (based on IP-address/cookies) to consume in terms of requests/day and then add a margin to that to not get throttled unnecessary). Using caches at Nitter would also lower the volume of requests towards Twitter if thats the issue now when they canceled (and signed a new contract a few months later?) their hostingcontract with Google Cloud according to: `https://www.techradar.com/pro/twitter-has-apparently-started-paying-for-google-cloud-again`
olwe1 commented 2023-07-07 05:45:39 -04:00 (Migrated from github.com)

Sad 😢 but maybe it's time to spend more time to build on an open decentralized protocol like nostr

Sad :cry: but maybe it's time to spend more time to build on an open decentralized protocol like [nostr](https://nostr.com/)
edel79 commented 2023-07-07 05:50:04 -04:00 (Migrated from github.com)

There is already ActivityPub. And the problem is, that 90-95% of people on Twitter will still use it. Why ? Because of the large amount of users on that network. On any other network, they will never have half the audience they have on Twitter.
So Nitter or other ways to scrap Twitter content will remain usefull for a while.

There is already ActivityPub. And the problem is, that 90-95% of people on Twitter will still use it. Why ? Because of the large amount of users on that network. On any other network, they will never have half the audience they have on Twitter. So Nitter or other ways to scrap Twitter content will remain usefull for a while.
ppaaccoo commented 2023-07-07 06:12:02 -04:00 (Migrated from github.com)

I feel like I might be shooting myself in the foot with this, but https://tweettunnel.com/ is still working (more or less).

Anyway, I just wanted to thank Zedeus for his work on this project. It has been ridiculously useful to me over the last year. Thanks to Nitter, I've been able to maintain my main source of information on certain very niche topics without supporting Twitter's bad practices. Shame on me for waiting for the platform to go down before thanking you for your efforts. Better late than never. Cheers mate.

I feel like I might be shooting myself in the foot with this, but https://tweettunnel.com/ is still working (more or less). Anyway, I just wanted to thank Zedeus for his work on this project. It has been ridiculously useful to me over the last year. Thanks to Nitter, I've been able to maintain my main source of information on certain very niche topics without supporting Twitter's bad practices. Shame on me for waiting for the platform to go down before thanking you for your efforts. Better late than never. Cheers mate.
tadcrazio commented 2023-07-07 09:07:06 -04:00 (Migrated from github.com)

there was an update to android yesterday, but at least the old android apk still works (Twitter_9.95.0-release.0_Apkpure.apk)

That's pretty cool and will keep this in my back pocket, but not being able to see comments, or add people to a following list without logging in still stinks. For me, I've been following the fritter evolution from fritter, to quacker to squacker and gives you the ability to browse twitter like that old app, and hopefully again one day in the future, actually have a feed for users you follow.

> there was an update to android yesterday, but at least the old android apk still works (`Twitter_9.95.0-release.0_Apkpure.apk`) That's pretty cool and will keep this in my back pocket, but not being able to see comments, or add people to a following list without logging in still stinks. For me, I've been following the fritter evolution from fritter, to quacker to [squacker](https://github.com/j-fbriere/squawker) and gives you the ability to browse twitter like that old app, and hopefully again one day in the future, actually have a feed for users you follow.
FoxBlocks commented 2023-07-07 15:36:50 -04:00 (Migrated from github.com)

I just spinned up an instance with https://github.com/zedeus/nitter/pull/925 and https://github.com/zedeus/nitter/pull/830 to see how well it holds : https://nitter.socialspill.com/

As far as I know, you're the second person to ever make an instance using PrivacyDevel's NSFW workaround. I've been waiting for someone else to use it. Thanks so much for making that happen!

> I just spinned up an instance with https://github.com/zedeus/nitter/pull/925 and https://github.com/zedeus/nitter/pull/830 to see how well it holds : https://nitter.socialspill.com/ As far as I know, you're the second person to ever make an instance using PrivacyDevel's NSFW workaround. I've been waiting for someone else to use it. Thanks so much for making that happen!
ThallesP commented 2023-07-07 15:42:01 -04:00 (Migrated from github.com)

there was an update to android yesterday, but at least the old android apk still works (Twitter_9.95.0-release.0_Apkpure.apk)

this is not working.
you probably have a cache on your device that still allows it.

> there was an update to android yesterday, but at least the old android apk still works (`Twitter_9.95.0-release.0_Apkpure.apk`) this is not working. you probably have a cache on your device that still allows it.
ghost commented 2023-07-07 16:09:09 -04:00 (Migrated from github.com)

it definitely still works on a hard-reset android device. 9.96 does not work, 9.95 does.

it definitely still works on a hard-reset android device. 9.96 does not work, 9.95 does.
frepke commented 2023-07-07 17:16:07 -04:00 (Migrated from github.com)

Sportsbots for Mastodon is still working.

Sportsbots for Mastodon is still working.
Write commented 2023-07-07 17:18:51 -04:00 (Migrated from github.com)

I just spinned up an instance with #925 and #830 to see how well it holds : https://nitter.socialspill.com/

As far as I know, you're the second person to ever make an instance using PrivacyDevel's NSFW workaround. I've been waiting for someone else to use it. Thanks so much for making that happen!

Well you're welcome but as you can see it's not working 🤷

> > I just spinned up an instance with #925 and #830 to see how well it holds : https://nitter.socialspill.com/ > > As far as I know, you're the second person to ever make an instance using PrivacyDevel's NSFW workaround. I've been waiting for someone else to use it. Thanks so much for making that happen! > Well you're welcome but as you can see it's not working 🤷
ghost commented 2023-07-07 17:26:14 -04:00 (Migrated from github.com)

i wonder, have you made any modifications such as adding/removing bearer tokens? I tried out removing the ipad token and it broke a lot of stuff. on the other hand, using only the ipad token breaks tweet search, as far as i can tell. made some updates to the #925 recently

i wonder, have you made any modifications such as adding/removing bearer tokens? I tried out removing the ipad token and it broke a lot of stuff. on the other hand, using only the ipad token breaks tweet search, as far as i can tell. made some updates to the #925 recently
Write commented 2023-07-07 18:05:40 -04:00 (Migrated from github.com)

i wonder, have you made any modifications such as adding/removing bearer tokens? I tried out removing the ipad token and it broke a lot of stuff. on the other hand, using only the ipad token breaks tweet search, as far as i can tell. made some updates to the #925 recently

Nop didn't made any change to the Bearer.
Maybe that's because I tried to pull and manually merge both #925 and #830 ?

I deleted everything and directly cloned https://github.com/drpepper66666/nitter/tree/twitter-token-rotation now, building the docker image right now, will see how it goes.

> i wonder, have you made any modifications such as adding/removing bearer tokens? I tried out removing the ipad token and it broke a lot of stuff. on the other hand, using only the ipad token breaks tweet search, as far as i can tell. made some updates to the #925 recently Nop didn't made any change to the Bearer. Maybe that's because I tried to pull and manually merge both #925 and #830 ? I deleted everything and directly cloned https://github.com/drpepper66666/nitter/tree/twitter-token-rotation now, building the docker image right now, will see how it goes.
ghost commented 2023-07-07 18:07:14 -04:00 (Migrated from github.com)

the login cookies are unfortunately still a requirement, but starting a new branch sounds good

the login cookies are unfortunately still a requirement, but starting a new branch sounds good
ghost commented 2023-07-07 18:07:40 -04:00 (Migrated from github.com)

maybe @PrivacyDevel has the time to maintain a proper fork of this with everything merged together

maybe @PrivacyDevel has the time to maintain a proper fork of this with everything merged together
Write commented 2023-07-07 18:08:33 -04:00 (Migrated from github.com)

the login cookies are unfortunately still a requirement, but starting a new branch sounds good

If I clone your https://github.com/drpepper66666/nitter/tree/twitter-token-rotation it's not enough right ? I have to add #830 changes then

> the login cookies are unfortunately still a requirement, but starting a new branch sounds good If I clone your https://github.com/drpepper66666/nitter/tree/twitter-token-rotation it's not enough right ? I have to add #830 changes then
Vizonex commented 2023-07-07 21:41:31 -04:00 (Migrated from github.com)

I've seen this from all ends and I seem to be the guy who comes up with solutions but after seeing fixtwitter and TweetTunnel gave me an idea. Knowing that tweet-tunnel is going to start experiencing heavy ai traffic and to help lighten their burden and recover all the tweets made from before 6/30/2023. What if we asked TweetTunnel to host a part of their database through a torrent and then that way some of their traffic will be lightened because that has seemed to be the original problem in the first place from the main site. This way we will be able to preserve and recover what may have been lost or is currently lost due to these new changes by musk. this way all we will have to now request is the media from fixtwitter and then problem solved for all past tweets. I don't have a solution for future tweets but that seems to be the best idea I have for old ones...

I've seen this from all ends and I seem to be the guy who comes up with solutions but after seeing __fixtwitter__ and __TweetTunnel__ gave me an idea. Knowing that tweet-tunnel is going to start experiencing heavy ai traffic and to help lighten their burden and recover all the tweets made from before 6/30/2023. What if we asked TweetTunnel to host a part of their database through a torrent and then that way some of their traffic will be lightened because that has seemed to be the original problem in the first place from the main site. This way we will be able to preserve and recover what may have been lost or is currently lost due to these new changes by musk. this way all we will have to now request is the media from fixtwitter and then problem solved for all past tweets. I don't have a solution for future tweets but that seems to be the best idea I have for old ones...
dhdurgee commented 2023-07-07 22:16:05 -04:00 (Migrated from github.com)

I have been using https://nitter.net for months since twitter got annoying about asking me to login before being able to see more than a handful of tweets. I refuse to create a login as I don't want them tracking me and I only use twitter to keep an eye on a handful of people.

Needless to say I have been unable to do so since the recent change. I have been keeping an eye on this and have seen some progress from errors, to users not found to most recently at https://nitter.net/MarkDavis showing everything except the tweets.

Will it soon be possible to see the tweets as well? I hope so, as my alternative is to convince the people I follow there to post elsewhere as well or in place of twitter.

I have been using https://nitter.net for months since twitter got annoying about asking me to login before being able to see more than a handful of tweets. I refuse to create a login as I don't want them tracking me and I only use twitter to keep an eye on a handful of people. Needless to say I have been unable to do so since the recent change. I have been keeping an eye on this and have seen some progress from errors, to users not found to most recently at https://nitter.net/MarkDavis showing everything except the tweets. Will it soon be possible to see the tweets as well? I hope so, as my alternative is to convince the people I follow there to post elsewhere as well or in place of twitter.
yo-train-ch commented 2023-07-07 23:57:34 -04:00 (Migrated from github.com)

Nitter was very important place to me.
I was given a lot of detail information by it.
I'm very sad...

Nitter was very important place to me. I was given a lot of detail information by it. I'm very sad...
devgaucho commented 2023-07-08 00:12:27 -04:00 (Migrated from github.com)

I have been using https://nitter.net for months since_ twitter got annoying about asking me to login before being able to see more than a handful of tweets. I refuse to create a login as I don't want them tracking me and I only use twitter _to keep an eye on a handful of people.

Needless to say I have been unable to do so since the recent change. I have been keeping an eye on this and have seen some progress from errors, to users not found to most recently at https://nitter.net/MarkDavis showing everything except the tweets.

Will it soon be possible to see the tweets as well? I hope so, as my alternative is to convince the people I follow there to post elsewhere as well or in place of twitter.

I've been thinking the same thing, but instead of torrenting I would use ipfs which allows you to share the tweets individually via http

twitter's data is gigantic, in the order of petabytes, someone could create a kind of decentralized scihub to share the scraped tweets

> I have been using https://nitter.net for months since_ twitter _got annoying about asking me to login before being able to see more than a handful of tweets. I refuse to create a login as I don't want them tracking me and I only use_ twitter _to keep an eye on a handful of people. > > Needless to say I have been unable to do so since the recent change. I have been keeping an eye on this and have seen some progress from errors, to users not found to most recently at https://nitter.net/MarkDavis showing everything except the tweets. > > Will it soon be possible to see the tweets as well? I hope so, as my alternative is to convince the people I follow there to post elsewhere as well or in place of _twitter_. I've been thinking the same thing, but instead of torrenting I would use ipfs which allows you to share the tweets individually via http twitter's data is gigantic, in the order of petabytes, someone could create a kind of decentralized scihub to share the scraped tweets
devgaucho commented 2023-07-08 00:17:43 -04:00 (Migrated from github.com)

the individual tweets shared throught a ipfs collaborative network can be indexed using a central website with a free api open source

but this is just a dream 🥺

the individual tweets shared throught a ipfs collaborative network can be indexed using a central website with a free api open source but this is just a dream 🥺
ghost commented 2023-07-08 08:24:44 -04:00 (Migrated from github.com)

twitter's data is gigantic, in the order of petabytes

Then exclude videos and compress all other things

https://github.com/typio/entreepy
https://github.com/libjxl/libjxl
> twitter's data is gigantic, in the order of petabytes Then exclude videos and compress all other things ``` https://github.com/typio/entreepy https://github.com/libjxl/libjxl ```
devgaucho commented 2023-07-08 13:32:04 -04:00 (Migrated from github.com)

twitter's data is gigantic, in the order of petabytes

Then exclude videos and compress all other things

https://_github.com_/typio/entreepy
https://_github.com_/libjxl/libjxl

is 1.5 zib only for the status messages

a recent tweet id 			= 1677708916807835651
1677708916807835651*(280 chars*4 bytes)	= 1879033986824775929120 b
1879033986824775929120/1024		= 1834994127758570243.28125 kibit
1834994127758570243.28125/1024		= 1791986452889228.753204345703125 mebit
1791986452889228.753204345703125/1024	= 1749986770399.63745430111885070801 gibit
1749986770399.63745430111885070801/1024	= 1708971455.46839595146593637764 tibit
1708971455.46839595146593637764/1024	= 1668917.43698085542135345349 pibit
1668917.43698085542135345349/1024	= 1629.80218455161662241548 eibit
1629.80218455161662241548/1024		= 1.59160369585118810783 zib

https://imgur.com/Kwlyuj7.png

> > _twitter_'s data is gigantic, in the order of petabytes > > Then exclude videos and compress all other things > > ``` > https://_github.com_/typio/entreepy > https://_github.com_/libjxl/libjxl > ``` is 1.5 zib only for the status messages ``` a recent tweet id = 1677708916807835651 1677708916807835651*(280 chars*4 bytes) = 1879033986824775929120 b 1879033986824775929120/1024 = 1834994127758570243.28125 kibit 1834994127758570243.28125/1024 = 1791986452889228.753204345703125 mebit 1791986452889228.753204345703125/1024 = 1749986770399.63745430111885070801 gibit 1749986770399.63745430111885070801/1024 = 1708971455.46839595146593637764 tibit 1708971455.46839595146593637764/1024 = 1668917.43698085542135345349 pibit 1668917.43698085542135345349/1024 = 1629.80218455161662241548 eibit 1629.80218455161662241548/1024 = 1.59160369585118810783 zib ``` [![https://imgur.com/Kwlyuj7.png](https://imgur.com/Kwlyuj7.png)](https://www.dataunitconverter.com/byte-to-zebibyte/1879033986824775929120)
12joan commented 2023-07-08 14:45:24 -04:00 (Migrated from github.com)

a recent tweet id = 1677708916807835651

That many Tweets would mean an average of

1677708916807835651 / 8,000,000,000 = 209,713,615

...Tweets per human currently alive on Earth, which seems excessive to me. Is it possible that the majority of Tweet IDs are unused?

Not trying to weigh in on whether this is a feasible idea or not, just curious about the numbers. 🙂

Edit: Tweet IDs have been timestamp-based since 2010.

> `a recent tweet id = 1677708916807835651` That many Tweets would mean an average of ``` 1677708916807835651 / 8,000,000,000 = 209,713,615 ``` ...Tweets per human currently alive on Earth, which seems excessive to me. Is it possible that the majority of Tweet IDs are unused? Not trying to weigh in on whether this is a feasible idea or not, just curious about the numbers. 🙂 Edit: [Tweet IDs have been timestamp-based since 2010.](https://techcrunch.com/2010/10/12/twitter-snowflake/)
Sanix-Darker commented 2023-07-08 14:49:57 -04:00 (Migrated from github.com)

Libreddit gone tomorrow.

Wonder how long Invidious and FreeTube will last?

sad to say @thechesu
atm I start to think that any app that rely on a third party service is a no go most of the time !

> Libreddit gone tomorrow. > > Wonder how long Invidious and FreeTube will last? sad to say @thechesu atm I start to think that any app that rely on a third party service is a no go most of the time !
signalhunter commented 2023-07-08 14:54:03 -04:00 (Migrated from github.com)

@devgaucho Your calculations are extremely flawed.

Tweet IDs are not (directly) sequential, and I can assure you that there is no way that a quintillion tweets has ever been made. These are Snowflake IDs, with a timestamp + machine/worker ID component.

You also have to consider that most tweets are nowhere near the (relatively new) 280 character limit; the old limit was 140 characters.

A quick Google search will tell us that:

  • an average tweet is around 28 characters (dubious?)
  • and there are 500 million tweets being made per day (2013 figure, very outdated)

Some quick and very inaccurate calculation with our new figures, without accounting for UTF-8/emojis, t.co links, images/videos, time of day, growth rate, spikes during disasters/sports/viral events, spam, database/indexing overhead, other data fields, replication, and everything in between:

500,000,000 * 28 bytes = 14 GB (seems a bit suspicious, let's multiply this by 2.5 for fun)
14 GB * 2.5 = 35 GB of tweets per day
35 GB * 365 days = 12,775 GB (12.7 TB) of tweets per year
12.7 TB * 17 years = 215.9 TB of tweets over Twitter's lifespan (since 2006)

I think that my calculations are way too low (for uncompressed, unindexed text)... if anyone wants to waste some time calculate a more accurate number, feel free!

@devgaucho Your calculations are extremely flawed. Tweet IDs are not (directly) sequential, and I can assure you that there is no way that a *quintillion* tweets has ever been made. These are [Snowflake IDs](https://en.wikipedia.org/wiki/Snowflake_ID), with a timestamp + machine/worker ID component. You also have to consider that most tweets are nowhere near the (relatively new) 280 character limit; the old limit was 140 characters. A quick Google search will tell us that: - an average tweet is around 28 characters (dubious?) - and there are 500 million tweets being made per day (2013 figure, very outdated) Some quick and **very** inaccurate calculation with our new figures, without accounting for UTF-8/emojis, t.co links, images/videos, time of day, growth rate, spikes during disasters/sports/viral events, spam, database/indexing overhead, other data fields, replication, and everything in between: ``` 500,000,000 * 28 bytes = 14 GB (seems a bit suspicious, let's multiply this by 2.5 for fun) 14 GB * 2.5 = 35 GB of tweets per day 35 GB * 365 days = 12,775 GB (12.7 TB) of tweets per year 12.7 TB * 17 years = 215.9 TB of tweets over Twitter's lifespan (since 2006) ``` I think that my calculations are way too low (for uncompressed, unindexed text)... if anyone wants to waste some time calculate a more accurate number, feel free!
Sanix-Darker commented 2023-07-08 14:56:45 -04:00 (Migrated from github.com)

This fork is working

https://github.com/PrivacyDevel/nitter/

But privacydev.net isn't.

That instance is always pegged from the sheer volume of traffic alone.

Screenshot from 2023-07-08 20-53-54

> > > This fork is working > > > > > > https://github.com/PrivacyDevel/nitter/ > > > > But privacydev.net isn't. > > That instance is always pegged from the sheer volume of traffic alone. ![Screenshot from 2023-07-08 20-53-54](https://github.com/zedeus/nitter/assets/22576758/131abcc4-358c-4d8d-a3ac-a31554fec3ac)
devgaucho commented 2023-07-08 18:26:13 -04:00 (Migrated from github.com)

a recent tweet id = 1677708916807835651

That many Tweets would mean an average of

1677708916807835651 / 8,000,000,000 = 209,713,615

...Tweets per human currently alive on Earth, which seems excessive to me. Is it possible that the majority of Tweet IDs are unused?

Not trying to weigh in on whether this is a feasible idea or not, just curious about the numbers. slightly_smiling_face

Edit: Tweet IDs have been timestamp-based since 2010.

yes, great new: not all tweets were created by humans obviously 🤖👈

the number is correct, the tweet numerber is a interger with auto-increment

this is the oldest teet available (number 20)
https://imgur.com/nrSDs9h.png

> > `a recent tweet id = 1677708916807835651` > > That many Tweets would mean an average of > > ``` > 1677708916807835651 / 8,000,000,000 = 209,713,615 > ``` > > ...Tweets per human currently alive on Earth, which seems excessive to me. Is it possible that the majority of Tweet IDs are unused? > > Not trying to weigh in on whether this is a feasible idea or not, just curious about the numbers. slightly_smiling_face > > Edit: [Tweet IDs have been timestamp-based since 2010.](https://techcrunch.com/2010/10/12/twitter-snowflake/) yes, great new: not all tweets were created by humans obviously 🤖👈 the number is correct, the tweet numerber is a interger with auto-increment this is the oldest teet available (number 20) ![https://imgur.com/nrSDs9h.png](https://imgur.com/nrSDs9h.png)
devgaucho commented 2023-07-08 18:39:53 -04:00 (Migrated from github.com)

Your calculations are extremely flawed.

Tweet IDs are not (directly) sequential, and I can assure you that there is no way that a quintillion tweets has ever been made. These are Snowflake IDs, with a timestamp + machine/worker ID component.

You also have to consider that most tweets are nowhere near the (relatively new) 280 character limit; the old limit was 140 characters.

A quick Google search will tell us that:

  • an average tweet is around 28 characters (dubious?)
  • and there are 500 million tweets being made per day (2013 figure, very outdated)

Some quick and very inaccurate calculation with our new figures, without accounting for UTF-8/emojis, t.co links, images/videos, time of day, growth rate, spikes during disasters/sports/viral events, spam, database/indexing overhead, other data fields, replication, and everything in between:

can you assure me how, voices in your head? wishfull thinking?

it's not timestamp, they are sequential numbers

yes, the oldest tweet is the id 20, if you don't believe me check for yourself here 👉 https://twitter.com/jack/status/20

https://imgur.com/nrSDs9h.png

for timestamps you would have to use microtime as the volume of new tweets exceeds the barrier of tweets per second easily

i put 280 to normalize as an intermediate number, i know well that there are millions of tweets with less than 140 characters and others with more than 280

as nobody knows how much exactly musk intends to expand the maximum tweet size and they are only accessible for verified counting so 🤷‍♂️

280 characters is currently the minimum for storing all tweets posted by unverified accounts until musk decided to increase the limit to who knows how many characters, so yes, I defend this value as the basis regardless of the actual value

in case you missed it I took into account the multibyte characters, so I multiplied 280*4 🙃 easy like cheese

your calculation is much more rough and inaccurate than mine because it takes into account numbers that you don't have at your disposal, obviously it is much better to estimate upwards than downwards

this is classic occam's razor case:

"Plurality is not to be posited without necessity"

if you want to go ahead looking for horns on horse's heads or microtime on integer numbers with auto-increment go ahead 🦄

> Your calculations are extremely flawed. > > Tweet IDs are not (directly) sequential, and I can assure you that there is no way that a _quintillion_ tweets has ever been made. These are [Snowflake IDs](https://en.wikipedia.org/wiki/Snowflake_ID), with a timestamp + machine/worker ID component. > > You also have to consider that most tweets are nowhere near the (relatively new) 280 character limit; the old limit was 140 characters. > > A quick Google search will tell us that: > > * an average tweet is around 28 characters (dubious?) > * and there are 500 million tweets being made per day (2013 figure, very outdated) > > Some quick and **very** inaccurate calculation with our new figures, without accounting for UTF-8/emojis, t.co links, images/videos, time of day, growth rate, spikes during disasters/sports/viral events, spam, database/indexing overhead, other data fields, replication, and everything in between: can you assure me how, voices in your head? [wishfull thinking](https://en.wikipedia.org/wiki/Wishful_thinking)? it's not timestamp, they are sequential numbers yes, the oldest tweet is the id 20, if you don't believe me check for yourself here 👉 https://twitter.com/jack/status/20 [![https://imgur.com/nrSDs9h.png](https://imgur.com/nrSDs9h.png)](https://twitter.com/jack/status/20) for timestamps you would have to use microtime as the volume of new tweets exceeds the barrier of tweets per second easily i put 280 to normalize as an intermediate number, i know well that there are millions of tweets with less than 140 characters and others with more than 280 as nobody knows how much exactly musk intends to expand the maximum tweet size and they are only accessible for verified counting so 🤷‍♂️ 280 characters is currently the minimum for storing all tweets posted by unverified accounts until musk decided to increase the limit to who knows how many characters, so yes, I defend this value as the basis regardless of the actual value in case you missed it I took into account the multibyte characters, so I multiplied 280*4 🙃 easy like cheese your calculation is much more rough and inaccurate than mine because it takes into account numbers that you don't have at your disposal, obviously it is much better to estimate upwards than downwards this is classic [occam's razor](https://en.wikipedia.org/wiki/Occam's_razor) case: > "Plurality is not to be posited without necessity" if you want to go ahead looking for horns on horse's heads or microtime on integer numbers with auto-increment go ahead 🦄
zedeus commented 2023-07-08 18:56:14 -04:00 (Migrated from github.com)

@devgaucho They are not "auto-incremented" IDs, they are autogenerated Snowflake IDs just like @signalhunter explained. He linked to the wiki page, and here's Twitter's own page explaining it: https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake

we settled on a composition of: timestamp, worker number and sequence number

@devgaucho They are not "auto-incremented" IDs, they are autogenerated Snowflake IDs just like @signalhunter explained. He linked to the wiki page, and here's Twitter's own page explaining it: https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake > we settled on a composition of: timestamp, worker number and sequence number
devgaucho commented 2023-07-08 19:29:53 -04:00 (Migrated from github.com)

@devgaucho They are not "auto-incremented" IDs, they are autogenerated Snowflake IDs just like @signalhunter explained. He linked to the wiki page, and here's Twitter's own page explaining it: https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake

we settled on a composition of: timestamp, worker number and sequence number

half-truth, I was right about the auto-incremented ids from 2006 to 2010 🤡👍

looking at the snowflake format description with the same recent tweet:

1677708916807835651	= 0001011101001000011010110101111011110110110101100010000000000011 (64 bits)
time part		= 000101110100100001101011010111101111011011 (41 bits + 1 bit for signed integers)
configure machine id	=                                           0101100010 (10 bits)
sequence number		=						      000000000011 (12 bits)

this make sense, sorry @signalhunter and @zedeus 🙏

> @devgaucho They are not "auto-incremented" IDs, they are autogenerated Snowflake IDs just like @signalhunter explained. He linked to the wiki page, and here's Twitter's own page explaining it: https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake > > > we settled on a composition of: timestamp, worker number and sequence number half-truth, I was right about the auto-incremented ids from 2006 to 2010 🤡👍 looking at the [snowflake format description](https://github.com/twitter/snowflake/releases/tag/snowflake-2010) with the same recent tweet: ``` 1677708916807835651 = 0001011101001000011010110101111011110110110101100010000000000011 (64 bits) time part = 000101110100100001101011010111101111011011 (41 bits + 1 bit for signed integers) configure machine id = 0101100010 (10 bits) sequence number = 000000000011 (12 bits) ``` this make sense, sorry @signalhunter and @zedeus 🙏
amano-kenji commented 2023-07-08 20:55:23 -04:00 (Migrated from github.com)

If we just let big tech do whatever they want, eventually we will lose access.

The long-term solution is to establish media campaigns against big tech's trespass into our personal lives by requiring login. Society-wide surveillance is trespass into our personal lives.

The reason that we care about privacy at all is that trespass is wrong.

If we just let big tech do whatever they want, eventually we will lose access. The long-term solution is to establish media campaigns against big tech's trespass into our personal lives by requiring login. Society-wide surveillance is trespass into our personal lives. The reason that we care about privacy at all is that trespass is wrong.
BartTerpstra commented 2023-07-09 08:32:07 -04:00 (Migrated from github.com)

It's part of a wider strategy popular among corporations, where they act as middle men between buyers and sellers and squeeze both.
Monopsony from the persepective of suppliers, oligarchy from the perspective of consumers.
It does not violate anti-trust laws because the chicago-school interpretation of anti-trust is now dominant, which requires clear consumer harm, rather than uncompetitive behavior.

It's part of a wider strategy popular among corporations, where they act as middle men between buyers and sellers and squeeze both. Monopsony from the persepective of suppliers, oligarchy from the perspective of consumers. It does not violate anti-trust laws because the chicago-school interpretation of anti-trust is now dominant, which requires clear consumer harm, rather than uncompetitive behavior.
orbea commented 2023-07-09 10:24:23 -04:00 (Migrated from github.com)

The long-term solution is to establish media campaigns against big tech's trespass into our personal lives by requiring login. Society-wide surveillance is trespass into our personal lives.

The best solution is to stop using proprietary social media platforms and invest in a free decentralized platform that can't be easily censored or monopolized. IRC is still an example of this...

Unless users want to take their activity elsewhere the escalation ladder of censorship and social manipulation will only continue.

> The long-term solution is to establish media campaigns against big tech's trespass into our personal lives by requiring login. Society-wide surveillance is trespass into our personal lives. The best solution is to stop using proprietary social media platforms and invest in a free decentralized platform that can't be easily censored or monopolized. IRC is still an example of this... Unless users want to take their activity elsewhere the escalation ladder of censorship and social manipulation will only continue.
ceptonit commented 2023-07-09 11:25:13 -04:00 (Migrated from github.com)

Not to play devil advocate here, but it's probably time to let twitter go.
The move to require an account makes good sense from a business stand point. It is mainly to twart off AI scrappers and letting them have access to all Twitter's data for free while on top of that adding server costs.
Imagine a future where you don't even need to go on any website anymore because whichever AI you're using has access to everything?
Example: Hey ChatGPT/Bard, "Show me all today's tweets from Elon Musk".
With that, you don't need to go on Twitter anymore and that's bad as it kills their revenue. And this is just Twitter as an example, but it can be applied to any websites, especially news outlets.
The fact that once again, most of the internet can be centralized to whatever AI you're using is alarming. Google is probably the most at risk here if they don't quickly polish their own AI. Any AI will basically replace your search engine.
As time goes on, we can probably expect more and more public information become private (walled off behind accounts) to fend off the AI leeches.

Account required is just a logical business move. It's not some vendetta to force people into making an account. If some people don't have a Twitter account by now (I'm one of them), then it's a firm decision and they probably won't make one now either. And even if some do, it's a drop in the bucket.
Maybe if AI wasn't around, Elon would have still made the move, who knows?

What we can learn from this is to not use any free or paid centralized service anymore where the user is the product.
We can give Twitter a little credit as in, they are so big today because they're the ones who came up with the whole Tweet concept/idea, they were the 1st and it got mass adoption.
If Mastodon or any decentralized equivalent were there before Twitter, maybe Mastodon would have been the one to be mass adopted.

Remember that Twitter is a convenience, not a necessity. If Elon decides to make Twitter $5/month for everyone tomorrow, would you continue to use Twitter? Probably not. Then it's not a necessity.

I'll be moving to ActivityPub/Nostr, whichever ends up harnessing most users, instead of playing cat and mouse with Elon.
This won't take care of the AI problem, but at least, it puts the users back in control of their own data.

I wish Nitter and Twitter the best. Big thanks to Zeus and all the other Nitter contributors.
I hope you can still find a way to access Twitter publicly.

Not to play devil advocate here, but it's probably time to let twitter go. The move to require an account makes good sense from a business stand point. It is mainly to twart off AI scrappers and letting them have access to all Twitter's data for free while on top of that adding server costs. Imagine a future where you don't even need to go on any website anymore because whichever AI you're using has access to everything? Example: Hey ChatGPT/Bard, "Show me all today's tweets from Elon Musk". With that, you don't need to go on Twitter anymore and that's bad as it kills their revenue. And this is just Twitter as an example, but it can be applied to any websites, especially news outlets. The fact that once again, most of the internet can be centralized to whatever AI you're using is alarming. Google is probably the most at risk here if they don't quickly polish their own AI. Any AI will basically replace your search engine. As time goes on, we can probably expect more and more public information become private (walled off behind accounts) to fend off the AI leeches. Account required is just a logical business move. It's not some vendetta to force people into making an account. If some people don't have a Twitter account by now (I'm one of them), then it's a firm decision and they probably won't make one now either. And even if some do, it's a drop in the bucket. Maybe if AI wasn't around, Elon would have still made the move, who knows? What we can learn from this is to not use any free or paid centralized service anymore where the user is the product. We can give Twitter a little credit as in, they are so big today because they're the ones who came up with the whole Tweet concept/idea, they were the 1st and it got mass adoption. If Mastodon or any decentralized equivalent were there before Twitter, maybe Mastodon would have been the one to be mass adopted. Remember that Twitter is a convenience, not a necessity. If Elon decides to make Twitter $5/month for everyone tomorrow, would you continue to use Twitter? Probably not. Then it's not a necessity. I'll be moving to ActivityPub/Nostr, whichever ends up harnessing most users, instead of playing cat and mouse with Elon. This won't take care of the AI problem, but at least, it puts the users back in control of their own data. I wish Nitter and Twitter the best. Big thanks to Zeus and all the other Nitter contributors. I hope you can still find a way to access Twitter publicly.
12joan commented 2023-07-09 11:28:35 -04:00 (Migrated from github.com)

Imagine a future where you don't even need to go on any website anymore because whichever AI you're using has access to everything?

This isn't even close to how faddish generative ML tools like GPT process information.

> Imagine a future where you don't even need to go on any website anymore because whichever AI you're using has access to everything? This isn't even close to how faddish generative ML tools like GPT process information.
tghe-retford commented 2023-07-09 11:42:01 -04:00 (Migrated from github.com)

What we can learn from this is to not use any free or paid centralized service anymore where the user is the product.

We can stop using them but politicians, Government agencies, news outlets and businesses have replaced their public information front-end communications increasingly with Twitter exclusively. For example, politicians communicating directly with their constituents, weather alerts, local news and information, public transport information and service updates plus increasingly customer service representatives and service outages.

These are not trivial or non-essential uses for social media, they actively prevent people being disenfranchised from their democratically elected representatives and society. And these groups are not simply going to use decentralised social networks or give up the cost-effective solution of passing the costs of hosting and maintenance to Twitter. In the same way YouTube content creators are not going to give up the free hosting and bandwidth of their content.

> What we can learn from this is to not use any free or paid centralized service anymore where the user is the product. We can stop using them but politicians, Government agencies, news outlets and businesses have replaced their public information front-end communications increasingly with Twitter exclusively. For example, politicians communicating directly with their constituents, weather alerts, local news and information, public transport information and service updates plus increasingly customer service representatives and service outages. These are not trivial or non-essential uses for social media, they actively prevent people being disenfranchised from their democratically elected representatives and society. And these groups are not simply going to use decentralised social networks or give up the cost-effective solution of passing the costs of hosting and maintenance to Twitter. In the same way YouTube content creators are not going to give up the free hosting and bandwidth of their content.
ceptonit commented 2023-07-09 12:00:57 -04:00 (Migrated from github.com)

What we can learn from this is to not use any free or paid centralized service anymore where the user is the product.

We can stop using them but politicians, Government agencies, news outlets and businesses have replaced their public information front-end communications increasingly with Twitter exclusively. For example, politicians communicating directly with their constituents, weather alerts, local news and information, public transport information and service updates plus increasingly customer service representatives and service outages.

These are not trivial or non-essential uses for social media, they actively prevent people being disenfranchised from their democratically elected representatives and society. And these groups are not simply going to use decentralised social networks or give up the cost-effective solution of passing the costs of hosting and maintenance to Twitter. In the same way YouTube content creators are not going to give up the free hosting and bandwidth of their content.

I totally agree with you. I'm not expecting the whole Twitter user base to migrate overnight, or even migrate at all.
But I think it's not too far-fetched to speculate Twitter might go under at some point. And if it did, even though the government seems to heavily rely on it as you pointed out, they will probably not bail Twitter out.
They could get bought up by a competitor, but not sure how it would fare with the FTC.
If Twitter truly goes under, the user base will have to find another place. Hopefully not Thread 👀
But the decentralized alternatives are currently free. Server instances costs are on the shoulders of their administrator.
If they become too much, the admin of an instance could just close registration and users could then register on another instance.
I can't really predict how well ActivityPub/Nostr instances would hold up with a sudden influx of a massive user base such as Twitter's, but to re-itterate: users do not bare the hosting/bandwidth costs on decentralized services either.

> > What we can learn from this is to not use any free or paid centralized service anymore where the user is the product. > > We can stop using them but politicians, Government agencies, news outlets and businesses have replaced their public information front-end communications increasingly with Twitter exclusively. For example, politicians communicating directly with their constituents, weather alerts, local news and information, public transport information and service updates plus increasingly customer service representatives and service outages. > > These are not trivial or non-essential uses for social media, they actively prevent people being disenfranchised from their democratically elected representatives and society. And these groups are not simply going to use decentralised social networks or give up the cost-effective solution of passing the costs of hosting and maintenance to Twitter. In the same way YouTube content creators are not going to give up the free hosting and bandwidth of their content. I totally agree with you. I'm not expecting the whole Twitter user base to migrate overnight, or even migrate at all. But I think it's not too far-fetched to speculate Twitter might go under at some point. And if it did, even though the government seems to heavily rely on it as you pointed out, they will probably not bail Twitter out. They could get bought up by a competitor, but not sure how it would fare with the FTC. If Twitter truly goes under, the user base will have to find another place. Hopefully not Thread :eyes: But the decentralized alternatives are currently free. Server instances costs are on the shoulders of their administrator. If they become too much, the admin of an instance could just close registration and users could then register on another instance. I can't really predict how well ActivityPub/Nostr instances would hold up with a sudden influx of a massive user base such as Twitter's, but to re-itterate: users do not bare the hosting/bandwidth costs on decentralized services either.
BartTerpstra commented 2023-07-09 12:04:39 -04:00 (Migrated from github.com)

According to some political theorists, platforms such as Twitter should be held in collective ownership, either by employees, users or by governments.
Never too late to start caring about this stuff in the "real world".

According to some political theorists, platforms such as Twitter should be held in collective ownership, either by employees, users or by governments. Never too late to start caring about this stuff in the "real world".
zedeus commented 2023-07-09 13:10:57 -04:00 (Migrated from github.com)

I have a set of fixes that restores all functionality, including search. It should be ready later today, unless it's too unstable.

I have a set of fixes that restores all functionality, including search. It should be ready later today, unless it's too unstable.
IceAsteroid commented 2023-07-09 13:49:38 -04:00 (Migrated from github.com)

Never trust proprietary softwore or services, they will soon, or later, always become like this. We, as the user, are useless if we have no interest for them, that's naturally as a company. Don't cry, boys. It's always been like this.

Never trust proprietary softwore or services, they will soon, or later, always become like this. We, as the user, are useless if we have no interest for them, that's naturally as a company. Don't cry, boys. It's always been like this.
IceAsteroid commented 2023-07-09 14:01:30 -04:00 (Migrated from github.com)

Funny enough for someone to be a masochist who wants to receive whatever the shxt is given away from those whoever control the services. Then, shut up and directly use twitter, why'd you go here? I know this is not the place talking about this. But I know, there must be lots of people who want to say shxt about this change of twitter.

Funny enough for someone to be a masochist who wants to receive whatever the shxt is given away from those whoever control the services. Then, shut up and directly use twitter, why'd you go here? I know this is not the place talking about this. But I know, there must be lots of people who want to say shxt about this change of twitter.
IceAsteroid commented 2023-07-09 14:06:18 -04:00 (Migrated from github.com)

@stopmotio You're right. I should talk this on other forums instead

@stopmotio You're right. I should talk this on other forums instead
zedeus commented 2023-07-09 14:37:41 -04:00 (Migrated from github.com)

@stopmotio Different bearer token, new endpoints, and tweaked parser code to accommodate for the minor changes in JSON structure

@stopmotio Different bearer token, new endpoints, and tweaked parser code to accommodate for the minor changes in JSON structure
ghost commented 2023-07-09 15:47:29 -04:00 (Migrated from github.com)

Regarding the GoogleBot method: Twitter is actively changing the HTML output. I implemented a full parser that worked perfect and today it is partly broken because Twitter changed the meta tag from start tag without end tag to self-closing tag.
Also, it seems that they limited the number of Tweets from 12 to 8 and changed some urls from absolute url https://.../sufix to relative url /suffix.

Regarding the GoogleBot method: Twitter is actively changing the HTML output. I implemented a full parser that worked perfect and today it is partly broken because Twitter changed the `meta` tag from start tag **without** end tag to self-closing tag. Also, it seems that they limited the number of Tweets from 12 to 8 and changed some urls from absolute url `https://.../sufix` to relative url `/suffix`.
amano-kenji commented 2023-07-09 20:18:48 -04:00 (Migrated from github.com)

It does not violate anti-trust laws because the chicago-school interpretation of anti-trust is now dominant, which requires clear consumer harm, rather than uncompetitive behavior.

It is government regulations that create and enable big tech in the first place. Without government regulations, youtube would not have access to cheaper servers and cheaper internet lines. Without government regulations, amazon.com cannot stay huge. The only reason that amazon.com has huge competitive edges over small retail stores is government regulations that squeeze small retail stores and help amazon.com grow.

(Big) government creates and maintains big media, big tech, big police/military state, big education, and everything bloated.

Big tech and big media, in turn, help the government by promoting government regulations that squeeze independent businesses.

It is a giant web that depends on each other and reinforces each other.

Nitter is a band-aid that might stop working eventually unless people address the worldwide web of power.

> It does not violate anti-trust laws because the chicago-school interpretation of anti-trust is now dominant, which requires clear consumer harm, rather than uncompetitive behavior. It is government regulations that create and enable big tech in the first place. Without government regulations, youtube would not have access to cheaper servers and cheaper internet lines. Without government regulations, amazon.com cannot stay huge. The only reason that amazon.com has huge competitive edges over small retail stores is government regulations that squeeze small retail stores and help amazon.com grow. (Big) government creates and maintains big media, big tech, big police/military state, big education, and everything bloated. Big tech and big media, in turn, help the government by promoting government regulations that squeeze independent businesses. It is a giant web that depends on each other and reinforces each other. Nitter is a band-aid that might stop working eventually unless people address the worldwide web of power.
zedeus commented 2023-07-09 21:30:11 -04:00 (Migrated from github.com)

We're back for now. https://nitter.net is up and running with an experimental patch that provides all previous functionality, except search (I have a potential fix, needs more research), without suffering from the awful rate limits imposed on the previous endpoints.

The code is on a separate branch: https://github.com/zedeus/nitter/pull/927

We're back for now. https://nitter.net is up and running with an experimental patch that provides all previous functionality, except search (I have a potential fix, needs more research), without suffering from the awful rate limits imposed on the previous endpoints. The code is on a separate branch: https://github.com/zedeus/nitter/pull/927
level323 commented 2023-07-09 21:40:25 -04:00 (Migrated from github.com)

Wow! Excellent! Thankyou! However, the RSS url's don't seem to be working.
For example:
https://nitter.net/AlessioUrban/with_replies --> WORKS
but
https://nitter.net/AlessioUrban/with_replies/rss --> "NOT FOUND"

Is this expected behaviour at this stage?

Wow! Excellent! Thankyou! However, the RSS url's don't seem to be working. For example: https://nitter.net/AlessioUrban/with_replies --> WORKS but https://nitter.net/AlessioUrban/with_replies/rss --> "NOT FOUND" Is this expected behaviour at this stage?
Darmug commented 2023-07-09 21:41:11 -04:00 (Migrated from github.com)

IMG_1484
Confirmation that Nitter’s working again from someone who’s been lurking here since day 1 and doesn’t know how to code.

![IMG_1484](https://github.com/zedeus/nitter/assets/138917294/dbc0b9af-16b4-4a2c-8841-2ca882d83e1a) Confirmation that Nitter’s working again from someone who’s been lurking here since day 1 and doesn’t know how to code.
zedeus commented 2023-07-09 21:54:13 -04:00 (Migrated from github.com)

@level323 Yes, I disabled RSS for the time being to reduce load.

@level323 Yes, I disabled RSS for the time being to reduce load.
level323 commented 2023-07-09 22:09:36 -04:00 (Migrated from github.com)

@level323 Yes, I disabled RSS for the time being to reduce load.

Fair enough. Thankyou again for your efforts.

AUD 30.00 donation just made via librepay as a gesture of thanks for your work and in the hope that RSS capability is back up soon.

> @level323 Yes, I disabled RSS for the time being to reduce load. Fair enough. Thankyou again for your efforts. AUD 30.00 donation just made via librepay as a gesture of thanks for your work and in the hope that RSS capability is back up soon.
Snyret commented 2023-07-09 22:16:59 -04:00 (Migrated from github.com)

Thanks for the (relatively) quick solve!

Will the age restricted tweets also come back?

Thanks for the (relatively) quick solve! Will the age restricted tweets also come back?
moom0o commented 2023-07-09 22:41:21 -04:00 (Migrated from github.com)

Thanks! https://nitter.moomoo.me has also updated.

Thanks! https://nitter.moomoo.me has also updated.
rohitrsm83 commented 2023-07-09 23:35:23 -04:00 (Migrated from github.com)

It works! Many thanks!

It works! Many thanks!
moom0o commented 2023-07-10 00:22:41 -04:00 (Migrated from github.com)

I've checked all the instances and updated the wiki to show which instances have updated. I also removed instances that don't have a dns record anymore. Please update the wiki once you've updated your instance!

I've checked all the instances and updated the wiki to show which instances have updated. I also removed instances that don't have a dns record anymore. Please update the wiki once you've updated your instance!
ontheair81 commented 2023-07-10 00:46:41 -04:00 (Migrated from github.com)

Will the age restricted tweets also come back?

I guess you can use the PrivacyDevel-fork for that.
Yesterday I created an instance with that (on Docker) and it worked well. But then my instance became rate limited now.

I guess the recent changes from here have to be included in the PrivacyDevel-fork.

A big "thank you" to all the people helping to solve this issue!

> Will the age restricted tweets also come back? I guess you can use the PrivacyDevel-fork for that. Yesterday I created an instance with that (on Docker) and it worked well. But then my instance became rate limited now. I guess the recent changes from here have to be included in the PrivacyDevel-fork. A big "thank you" to all the people helping to solve this issue!
edel79 commented 2023-07-10 00:51:28 -04:00 (Migrated from github.com)

@zedeus and all the other contribs, thanks a lot for your work :)
Any idea on when the RSS wiil be back ? Is it rather a matter of hours, days ou weeks ?

@zedeus and all the other contribs, thanks a lot for your work :) Any idea on when the RSS wiil be back ? Is it rather a matter of hours, days ou weeks ?
woj-tek commented 2023-07-10 01:33:46 -04:00 (Migrated from github.com)

Is the RSS disabling a matter of nitter.net or it's hardcoded?

Is there a sort of nightly docker image (latest-devel or somesuch) that has the fix?

Is the RSS disabling a matter of nitter.net or it's hardcoded? Is there a sort of nightly docker image (latest-devel or somesuch) that has the fix?
12joan commented 2023-07-10 02:43:08 -04:00 (Migrated from github.com)

I'm glad to hear Nitter's functionality is restored! 😄

For those asking about RSS, we're seeing some good results over at 12joan/twitter-client. PRs welcome if you find any edge cases that don't work correctly.

I'm glad to hear Nitter's functionality is restored! 😄 For those asking about RSS, we're seeing some good results over at [12joan/twitter-client](https://github.com/12joan/twitter-client). PRs welcome if you find any edge cases that don't work correctly.
AlyoshaVasilieva commented 2023-07-10 02:47:04 -04:00 (Migrated from github.com)

Is there a sort of nightly docker image (latest-devel or somesuch) that has the fix?

@woj-tek you should be able to tell Docker to build https://github.com/zedeus/nitter.git#elon-fix instead of using the image to get the PR.

>Is there a sort of nightly docker image (latest-devel or somesuch) that has the fix? @woj-tek you should be able to tell Docker to build `https://github.com/zedeus/nitter.git#elon-fix` instead of using the image to get the PR.
zedeus commented 2023-07-10 03:00:36 -04:00 (Migrated from github.com)

@level323 thank you for the support!

@Snyret "sensitive tweets" access will not be restored beyond @PrivacyDevel's experimental account PR for the time being. I haven't made any decisions yet, so far it seems a bit risky and unstable.

@moom0o thank you! With over a hundred public instances it's quite tedious to update it, I really should start working on an instance site à la Searx/Peertube/Invidious.

@edel79 RSS works perfectly fine, I even made it so the new replies page with reply threads only includes tweets from the account rather than all the ones being replied to. I chose to disable it using the configuration file for nitter.net while everything is being tested in production. I'd like to see it run smoothly for another day or two before opening the floodgates again.

@woj-tek it's just nitter.net, see here: https://github.com/zedeus/nitter/blob/master/nitter.example.conf#L25

@level323 thank you for the support! @Snyret "sensitive tweets" access will not be restored beyond @PrivacyDevel's experimental account PR for the time being. I haven't made any decisions yet, so far it seems a bit risky and unstable. @moom0o thank you! With over a hundred public instances it's quite tedious to update it, I really should start working on an instance site à la Searx/Peertube/Invidious. @edel79 RSS works perfectly fine, I even made it so the new replies page with reply threads only includes tweets from the account rather than all the ones being replied to. I chose to disable it using the configuration file for nitter.net while everything is being tested in production. I'd like to see it run smoothly for another day or two before opening the floodgates again. @woj-tek it's just nitter.net, see here: https://github.com/zedeus/nitter/blob/master/nitter.example.conf#L25
NicoBerlo commented 2023-07-10 03:02:51 -04:00 (Migrated from github.com)

@zedeus thanks for the great work, it works again !!
One little thing, it seems that you added a more-replies-thread class which didn't exist before.
Any way to remove those and see replies not elipsed ?
thanks !

@zedeus thanks for the great work, it works again !! One little thing, it seems that you added a more-replies-thread class which didn't exist before. Any way to remove those and see replies not elipsed ? thanks !
zedeus commented 2023-07-10 03:22:52 -04:00 (Migrated from github.com)

@zoubidabida with the new endpoints used Twitter includes these "reply threads" or "conversations", I'm simply parsing and rendering them. When a reply thread, or "conversation" has more than 3 tweets in it Twitter doesn't include them, so I need to display the "more replies" link similar to how Twitter does it.

@zoubidabida with the new endpoints used Twitter includes these "reply threads" or "conversations", I'm simply parsing and rendering them. When a reply thread, or "conversation" has more than 3 tweets in it Twitter doesn't include them, so I need to display the "more replies" link similar to how Twitter does it.
lukeprofits commented 2023-07-10 03:48:29 -04:00 (Migrated from github.com)

Had a random thought and I figured I'd leave it here.

If scraping Twitter isn't easy anymore, what if someone made a chrome extension that people could install, and then the chrome extension passively scrapes tweets and forwards them on to some sort of Nitter API. Then Nitter could serve tweets from it's own database, and rate limiting wouldn't be an issue because you'd be just getting passed data for free from people who installed this extension.

You could even keep track of who reported the most new content and give them points for bragging rights, or do some sort of points/crypto incentive. Like the points/coins can be used to buy ads on Nitter, and the people who scrape new content are rewarded in these points (so they have an incentive to install the extension and not just rely on volenteers)

Anyway, just some thoughts.

Had a random thought and I figured I'd leave it here. If scraping Twitter isn't easy anymore, what if someone made a chrome extension that people could install, and then the chrome extension passively scrapes tweets and forwards them on to some sort of Nitter API. Then Nitter could serve tweets from it's own database, and rate limiting wouldn't be an issue because you'd be just getting passed data for free from people who installed this extension. You could even keep track of who reported the most new content and give them points for bragging rights, or do some sort of points/crypto incentive. Like the points/coins can be used to buy ads on Nitter, and the people who scrape new content are rewarded in these points (so they have an incentive to install the extension and not just rely on volenteers) Anyway, just some thoughts.
saqib-ahmed commented 2023-07-10 03:55:19 -04:00 (Migrated from github.com)

Had a random thought and I figured I'd leave it here.

If scraping Twitter isn't easy anymore, what if someone made a chrome extension that people could install, and then the chrome extension passively scrapes tweets and forwards them on to some sort of Nitter API. Then Nitter could serve tweets from it's own database, and rate limiting wouldn't be an issue because you'd be just getting passed data for free from people who installed this extension.

You could even keep track of who reported the most new content and give them points for bragging rights, or do some sort of points/crypto incentive. Like the points/coins can be used to buy ads on Nitter, and the people who scrape new content are rewarded in these points (so they have an incentive to install the extension and not just rely on volenteers)

Anyway, just some thoughts.

That is a good idea. We are already using this method for one of our applications. We need a lot of tweets for different purposes. We have a data entry team that uses this extension and sends the tweets to the server. This same idea can be extrapolated to be used with Nitter (it needs to be thought through if the extension is going to be public without any auth). I'll be more than happy to open-source my extension (although it's very basic at the moment; just reads tweets, but can be easily updated to incorporate all the other data).

Screenshot 2023-07-10 at 12 51 37 PM
> Had a random thought and I figured I'd leave it here. > > If scraping Twitter isn't easy anymore, what if someone made a chrome extension that people could install, and then the chrome extension passively scrapes tweets and forwards them on to some sort of Nitter API. Then Nitter could serve tweets from it's own database, and rate limiting wouldn't be an issue because you'd be just getting passed data for free from people who installed this extension. > > You could even keep track of who reported the most new content and give them points for bragging rights, or do some sort of points/crypto incentive. Like the points/coins can be used to buy ads on Nitter, and the people who scrape new content are rewarded in these points (so they have an incentive to install the extension and not just rely on volenteers) > > Anyway, just some thoughts. That is a good idea. We are already using this method for one of our applications. We need a lot of tweets for different purposes. We have a data entry team that uses this extension and sends the tweets to the server. This same idea can be extrapolated to be used with Nitter (it needs to be thought through if the extension is going to be public without any auth). I'll be more than happy to open-source my extension (although it's very basic at the moment; just reads tweets, but can be easily updated to incorporate all the other data). <img width="999" alt="Screenshot 2023-07-10 at 12 51 37 PM" src="https://github.com/zedeus/nitter/assets/16355181/2d0e396d-ba76-4e80-a377-47844bf531f1">
ghost commented 2023-07-10 03:55:37 -04:00 (Migrated from github.com)

@lukeprofits
There are quite a few problems with this approach.

  1. When Nitter can't scrape and parse, how can the Chrome extension do it? The code that nitter requires is now in the chrome extension required. The same problem is now in a different place. Rate limits are probably not too difficult to fix for Nitter.
  2. Twitter or some other instance can feed this database with incorrect "Tweets"
  3. The service will miss most contents and would download the content by itself, which is what Nitter currently does, thus it's not a big help
@lukeprofits There are quite a few problems with this approach. 1. When Nitter can't scrape and parse, how can the Chrome extension do it? The code that nitter requires is now in the chrome extension required. The same problem is now in a different place. Rate limits are probably not too difficult to fix for Nitter. 2. Twitter or some other instance can feed this database with incorrect "Tweets" 3. The service will miss most contents and would download the content by itself, which is what Nitter currently does, thus it's not a big help
jimbobben commented 2023-07-10 03:56:18 -04:00 (Migrated from github.com)

is there any way to view a locked account on nitter, when I have access to it with my twitter account?

is there any way to view a locked account on nitter, when I have access to it with my twitter account?
saqib-ahmed commented 2023-07-10 03:58:21 -04:00 (Migrated from github.com)

@lukeprofits There are quite a few problems with this approach.

  1. When Nitter can't scrape and parse, how can the Chrome extension do it? The code that nitter requires is now in the chrome extension required. The same problem is now in a different place. Rate limits are probably not too difficult to fix for Nitter.
  2. Twitter or some other instance can feed this database with incorrect "Tweets"
  3. The service will miss most contents and would download the content by itself, which is what Nitter currently does, thus it's not a big help

Point 2 is a major setback.

> @lukeprofits There are quite a few problems with this approach. > > 1. When Nitter can't scrape and parse, how can the Chrome extension do it? The code that nitter requires is now in the chrome extension required. The same problem is now in a different place. Rate limits are probably not too difficult to fix for Nitter. > 2. Twitter or some other instance can feed this database with incorrect "Tweets" > 3. The service will miss most contents and would download the content by itself, which is what Nitter currently does, thus it's not a big help Point 2 is a major setback.
Trit34 commented 2023-07-10 03:58:31 -04:00 (Migrated from github.com)

is there any way to view a locked account on nitter, when I have access to it with my twitter account?

Set up your own instance with the cookie data of your Twitter account?

> is there any way to view a locked account on nitter, when I have access to it with my twitter account? Set up your own instance with the cookie data of your Twitter account?
zedeus commented 2023-07-10 04:05:55 -04:00 (Migrated from github.com)

@saqib-ahmed @gfpj the problem with point 2 is indeed authenticity. How do we know a tweet is authentic and not manipulated, or entirely fake? How do we prevent garbage data? I'm not sure, maybe a verification system that requests clients to independently request and verify data, but that opens another can of worms (e.g. the same problem as Bitcoin's 51% attack where enough bad actors verify incorrect data maliciously). This just turns into distributed systems security 101, which is not an easy problem to solve. I would've loved to set up a distributed cache for all instances to use and contribute to, but it's infinitely easier said than done.

@saqib-ahmed @gfpj the problem with point 2 is indeed authenticity. How do we know a tweet is authentic and not manipulated, or entirely fake? How do we prevent garbage data? I'm not sure, maybe a verification system that requests clients to independently request and verify data, but that opens another can of worms (e.g. the same problem as Bitcoin's 51% attack where enough bad actors verify incorrect data maliciously). This just turns into distributed systems security 101, which is not an easy problem to solve. I would've loved to set up a distributed cache for all instances to use and contribute to, but it's infinitely easier said than done.
zedeus commented 2023-07-10 04:17:32 -04:00 (Migrated from github.com)

Here's the attack I was thinking about that makes this a very difficult problem to solve: https://en.wikipedia.org/wiki/Sybil_attack

Here's the attack I was thinking about that makes this a very difficult problem to solve: https://en.wikipedia.org/wiki/Sybil_attack
aleksusklim commented 2023-07-10 04:32:39 -04:00 (Migrated from github.com)

If we assume that viewing of any individual tweet will NOT be blocked for guests (by using any available API such as preview embedding), then the only valuable information – is the list of tweets ID, with respect to author account.

So, nodes should transfer only the list of pairs (tweet_id,user_id), but not tweet contents itself. Then, any caching server could download those tweets on its own from Twitter.
The reason to send user_id is for simplicity of handling the protocol and storage (like {user1:[id1,id2],user2:[id3]}) so we can get both the author and the date of each tweet (since the date is a part of id).

UPD: probably, quote, retweet and reply fields might be useful also. Or not, depending on available info in single-tweet guest downloads.

If we assume that viewing of any individual tweet will NOT be blocked for guests (by using any available API such as preview embedding), then the only valuable information – is the list of tweets ID, with respect to author account. So, nodes should transfer only the list of pairs (tweet_id,user_id), but not tweet contents itself. Then, any caching server could download those tweets on its own from Twitter. The reason to send user_id is for simplicity of handling the protocol and storage (like `{user1:[id1,id2],user2:[id3]}`) so we can get both the author and the date of each tweet (since the date is a part of id). UPD: probably, quote, retweet and reply fields might be useful also. Or not, depending on available info in single-tweet guest downloads.
lukeprofits commented 2023-07-10 04:45:53 -04:00 (Migrated from github.com)

@lukeprofits There are quite a few problems with this approach.

  1. When Nitter can't scrape and parse, how can the Chrome extension do it? The code that nitter requires is now in the chrome extension required. The same problem is now in a different place. Rate limits are probably not too difficult to fix for Nitter.
  2. Twitter or some other instance can feed this database with incorrect "Tweets"
  3. The service will miss most contents and would download the content by itself, which is what Nitter currently does, thus it's not a big help

I don't think any are unsolvable.

  1. If the user is logged in and using Twitter, they will be served tweets. These are not hard to scrape. (the idea is incentivise Twitter users to "share" the tweet info with us without us having to sign in, so that people can use Nitter without Nitter needing to scrape.)

  2. They would have to send the tweet ID, and what it said. Since people would be reporting everything they view, it would be easy to confirm that what one person reported is accurate. If the ID and text match, and you've had x number of reports, it'd be very likely to be correct. Also, if you catch a user reporting BS, then they can just not be considered a trustworthy source. This would work well (at least for decently popular accounts.)

  3. It would miss small obscure content, but if you 100k+ real followers, pretty likely that this would get most of everything.

> @lukeprofits There are quite a few problems with this approach. > > 1. When Nitter can't scrape and parse, how can the Chrome extension do it? The code that nitter requires is now in the chrome extension required. The same problem is now in a different place. Rate limits are probably not too difficult to fix for Nitter. > 2. Twitter or some other instance can feed this database with incorrect "Tweets" > 3. The service will miss most contents and would download the content by itself, which is what Nitter currently does, thus it's not a big help I don't think any are unsolvable. 1. If the user is logged in and using Twitter, they will be served tweets. These are not hard to scrape. (the idea is incentivise Twitter users to "share" the tweet info with us without us having to sign in, so that people can use Nitter without Nitter needing to scrape.) 2. They would have to send the tweet ID, and what it said. Since people would be reporting everything they view, it would be easy to confirm that what one person reported is accurate. If the ID and text match, and you've had x number of reports, it'd be very likely to be correct. Also, if you catch a user reporting BS, then they can just not be considered a trustworthy source. This would work well (at least for decently popular accounts.) 3. It would miss small obscure content, but if you 100k+ real followers, pretty likely that this would get most of everything.
jlund commented 2023-07-10 04:48:05 -04:00 (Migrated from github.com)
All six of the "Unofficial Bird" servers have been updated and are now running the #927 branch too: https://unofficialbird.com https://canada.unofficialbird.com https://india.unofficialbird.com https://nederland.unofficialbird.com https://singapore.unofficialbird.com https://uk.unofficialbird.com
ghost commented 2023-07-10 04:59:39 -04:00 (Migrated from github.com)

So, nodes should transfer only the list of pairs (tweet_id,user_id), but not tweet contents itself

They would have to send the tweet ID, and what it said

tweet_id and user_id can be changed by twitter, better generate a cid of each post

https://docs.ipfs.tech/concepts/content-addressing/#what-is-a-cid
https://github.com/BLAKE3-team/BLAKE3
> So, nodes should transfer only the list of pairs (tweet_id,user_id), but not tweet contents itself > They would have to send the tweet ID, and what it said tweet_id and user_id can be changed by twitter, better generate a cid of each post ``` https://docs.ipfs.tech/concepts/content-addressing/#what-is-a-cid https://github.com/BLAKE3-team/BLAKE3 ```
edel79 commented 2023-07-10 05:02:02 -04:00 (Migrated from github.com)

[nitter.lacontrevoie.fr] is also up to date now.

[nitter.lacontrevoie.fr] is also up to date now.
aleksusklim commented 2023-07-10 05:05:04 -04:00 (Migrated from github.com)

tweet_id and user_id can be changed by twitter

I knew about changing of display name of a user, and inability to use ID of the user in search queries: https://github.com/mikf/gallery-dl/issues/2624#issuecomment-1140021564 – which creates mess, but partially solvable by tracking renamings of each user (by their id which is permanent. Right?)

I never heard of tweets changing their ID. Can you elaborate?

> tweet_id and user_id can be changed by twitter I knew about changing of display name of a user, and inability to use ID of the user in search queries: https://github.com/mikf/gallery-dl/issues/2624#issuecomment-1140021564 – which creates mess, but partially solvable by tracking renamings of each user (by their id which is permanent. Right?) I never heard of tweets changing their ID. Can you elaborate?
unixfox commented 2023-07-10 05:14:06 -04:00 (Migrated from github.com)

@moom0o

Thanks! nitter.moomoo.me has also updated.

Don't update the wiki by saying that all the instances are outdated if the fix has not even landed into the main branch...
You can do it once the fix in the main branch and that most maintainers can easily update to the latest fix.

@moom0o > Thanks! [nitter.moomoo.me](https://nitter.moomoo.me) has also updated. Don't update the wiki by saying that all the instances are outdated if the fix has not even landed into the main branch... You can do it once the fix in the main branch and that most maintainers can easily update to the latest fix.
AndyHee commented 2023-07-10 05:25:10 -04:00 (Migrated from github.com)

How to build this branch: elon-fix ?

How to build this branch: `elon-fix` ?
zedeus commented 2023-07-10 05:25:18 -04:00 (Migrated from github.com)

It seems stable enough, I'll just merge it now and push search if I get it working. Anything is better than the current state where nothing works.

It seems stable enough, I'll just merge it now and push search if I get it working. Anything is better than the current state where nothing works.
Apachez- commented 2023-07-10 05:35:35 -04:00 (Migrated from github.com)

@zedeus + rest of the community: keep up the great work! :-)

@zedeus + rest of the community: keep up the great work! :-)
ghost commented 2023-07-10 06:08:06 -04:00 (Migrated from github.com)

@aleksusklim If @zedeus decide to create a giant base of tweets between the instances, then twitter can make a change and destroy all base to prevent nitter be strong.

@aleksusklim If @zedeus decide to create a giant base of tweets between the instances, then twitter can make a change and destroy all base to prevent nitter be strong.
Write commented 2023-07-10 06:15:44 -04:00 (Migrated from github.com)

Thanks zedeus and the community for the great work,
I've updated too : https://nitter.socialspill.com

Thanks zedeus and the community for the great work, I've updated too : https://nitter.socialspill.com
aleksusklim commented 2023-07-10 07:01:36 -04:00 (Migrated from github.com)

twitter can push up a change

What change? Destroying tweet_id and invalidating all of existing /status/ID links that were posted anywhere ever?

> twitter can push up a change What change? Destroying tweet_id and invalidating all of existing /status/ID links that were posted anywhere ever?
micro-80 commented 2023-07-10 07:57:04 -04:00 (Migrated from github.com)

Thanks so much for these changes - my local nitter instance is back to normal and getting RSS feeds :)

Thanks so much for these changes - my local nitter instance is back to normal and getting RSS feeds :)
pbaykalov commented 2023-07-10 10:50:54 -04:00 (Migrated from github.com)

Twitter or some other instance can feed this database with incorrect "Tweets"

In a perfect scenario supplied content could be verified using TLS.

https://tlsnotary.org/

> > Twitter or some other instance can feed this database with incorrect "Tweets" In a perfect scenario supplied content could be verified using TLS. https://tlsnotary.org/
12joan commented 2023-07-10 10:58:53 -04:00 (Migrated from github.com)

Twitter or some other instance can feed this database with incorrect "Tweets"

In a perfect scenario supplied content could be verified using TLS.

https://tlsnotary.org/

This wouldn't solve the problem. Nothing short of an external Nitter-controlled server spying on and validating Twitter's SSL handshake from the client's perspective would prove that the data is genuine—way too complicated to be worth considering, if it's even possible. It certainly can't be done from JS. Correction: I took a look at that link, and it looks like they actually managed to make this work. https://github.com/tlsnotary/PageSigner

> > > > > Twitter or some other instance can feed this database with incorrect "Tweets" > > In a perfect scenario supplied content could be verified using TLS. > > https://tlsnotary.org/ ~~This wouldn't solve the problem. Nothing short of an external Nitter-controlled server spying on and validating Twitter's SSL handshake from the client's perspective would prove that the data is genuine—way too complicated to be worth considering, if it's even possible. It certainly can't be done from JS.~~ Correction: I took a look at that link, and it looks like they actually managed to make this work. https://github.com/tlsnotary/PageSigner
12joan commented 2023-07-10 13:11:14 -04:00 (Migrated from github.com)

but maybe be done without extension

The normal web sandbox (without extension privileges) can't interfere with or spy on the TLS process. I'm still not entirely sure how they managed it even with an extension; it looks like a custom TLS implementation running on an extension-controlled TCP socket.

If we're going to continue discussing distributed Tweet exfiltration, I think we should do so in a separate thread so that we're not spamming people who are here to hear news about Nitter. 🙂

> but maybe be done without extension The normal web sandbox (without extension privileges) can't interfere with or spy on the TLS process. I'm still not entirely sure how they managed it even with an extension; it looks like a [custom TLS implementation](https://github.com/tlsnotary/PageSigner/blob/master/core/TLS.js) running on an extension-controlled TCP socket. If we're going to continue discussing distributed Tweet exfiltration, I think we should do so in a separate thread so that we're not spamming people who are here to hear news about Nitter. 🙂
MrBoombastic commented 2023-07-10 13:13:15 -04:00 (Migrated from github.com)

Isn't that extension just parsing HTML document? Why bother with TLS?

Isn't that extension just parsing HTML document? Why bother with TLS?
12joan commented 2023-07-10 13:20:16 -04:00 (Migrated from github.com)

@MrBoombastic It's using a secret sharing technique with a trusted third-party server to cryptographically prove that the data originated from the HTTPS server the user claims it originated from. Way beyond the level of cryptography most developers (including myself) are familiar with.

New thread to avoid spamming this one

@MrBoombastic It's using a secret sharing technique with a trusted third-party server to cryptographically prove that the data originated from the HTTPS server the user claims it originated from. _Way_ beyond the level of cryptography most developers (including myself) are familiar with. [**New thread to avoid spamming this one**](https://github.com/zedeus/nitter/issues/931)
MrBoombastic commented 2023-07-10 13:29:26 -04:00 (Migrated from github.com)

Are we talking about @saqib-ahmed's extension? He didn't say anything about cryptography. Assuming that "data entry team" means people, who can be really trusted - the extension can be sending Tweets as is, without verifying anything.

Are we talking about @saqib-ahmed's extension? He didn't say anything about cryptography. Assuming that "data entry team" means people, who can be really trusted - the extension can be sending Tweets as is, without verifying anything.
jcmag commented 2023-07-10 13:44:18 -04:00 (Migrated from github.com)

Ok this seems interesting, he seems he is able to get a Bearer tokens using built-in tokens from APPS as seens here Screenshot du 2023-07-03 à 21 50 59

https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs#L36

He then picks one randomly and send a post request in GenerateBearerToken() which correctly returns a Bearer Tokens

You can try yourself with curl : curl -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"

You can then activate your fresh access_token :

curl -X POST -H "Authorization: Bearer your_access_token" "https://api.twitter.com/1.1/guest/activate.json"

This will return you a guest_token.

You can then access graphql endpoints :

curl -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \
-H "x-guest-token: 1675958319943393280" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A.....

where x-guest-token is the token returned when you activated your Bearer.

You can get the user numeric ID from previous request, from twitter name : for elonmusk :

curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \
-H "x-guest-token: 1675958319943393280" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com/" \
"https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2......
| jq -r '.data.user.result.rest_id'

Then get all his timeline :

curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \
-H "x-guest-token: 1675958319943393280" \
-H "x-twitter-active-user: yes" \
-H "Referer: https://twitter.com" "https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies?variables=%7B%22userId%22%3A%2244196397%22,..... \
| jq

You have to replace the userID between the two "%22" tags. Here the user id (of elonmusk) is : 44196397

Which returns All his Tweets and Replies (too long):

https://bin.socialspill.com/ixomusor.json

To access detail of a specific tweet the url is :

https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail?variables=%7B%22focalTweetId%22%3A% + statusId + %22,%22with_rux_injections%22%3Atrue,....

do you know a graphql endpoint to retrieve a user's "following" data?

> Ok this seems interesting, he seems he is able to get a Bearer tokens using built-in tokens from APPS as seens here ![Screenshot du 2023-07-03 à 21 50 59](https://user-images.githubusercontent.com/541722/250650033-3c53442c-843c-42ad-93d9-b1146b2545a9.png) > > https://git.sr.ht/~cloutier/bird.makeup/tree/master/item/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs#L36 > > He then picks one randomly and send a post request in GenerateBearerToken() which correctly returns a Bearer Tokens > > You can try yourself with curl : `curl -X POST "https://api.twitter.com/oauth2/token?grant_type=client_credentials" -u "CjulERsDeqhhjSme66ECg:IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"` > > You can then activate your fresh access_token : > > `curl -X POST -H "Authorization: Bearer your_access_token" "https://api.twitter.com/1.1/guest/activate.json"` > > This will return you a guest_token. > > You can then access graphql endpoints : > > ```shell > curl -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \ > -H "x-guest-token: 1675958319943393280" \ > -H "x-twitter-active-user: yes" \ > -H "Referer: https://twitter.com/" \ > "https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A..... > ``` > > where x-guest-token is the token returned when you activated your Bearer. > > You can get the user numeric ID from previous request, from twitter name : for elonmusk : > > ```shell > curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \ > -H "x-guest-token: 1675958319943393280" \ > -H "x-twitter-active-user: yes" \ > -H "Referer: https://twitter.com/" \ > "https://api.twitter.com/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2...... > | jq -r '.data.user.result.rest_id' > ``` > > Then get all his timeline : > > ```shell > curl -s -X GET -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR" \ > -H "x-guest-token: 1675958319943393280" \ > -H "x-twitter-active-user: yes" \ > -H "Referer: https://twitter.com" "https://api.twitter.com/graphql/pNl8WjKAvaegIoVH--FuoQ/UserTweetsAndReplies?variables=%7B%22userId%22%3A%2244196397%22,..... \ > | jq > ``` > > You have to replace the userID between the two "%22" tags. Here the user id (of elonmusk) is : 44196397 > > Which returns All his Tweets and Replies (too long): > > https://bin.socialspill.com/ixomusor.json > > To access detail of a specific tweet the url is : > > ``` > https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail?variables=%7B%22focalTweetId%22%3A% + statusId + %22,%22with_rux_injections%22%3Atrue,.... > ``` do you know a graphql endpoint to retrieve a user's "following" data?
ghost commented 2023-07-11 00:56:52 -04:00 (Migrated from github.com)

@saqib-ahmed @gfpj the problem with point 2 is indeed authenticity. How do we know a tweet is authentic and not manipulated, or entirely fake? How do we prevent garbage data? I'm not sure, maybe a verification system that requests clients to independently request and verify data, but that opens another can of worms (e.g. the same problem as Bitcoin's 51% attack where enough bad actors verify incorrect data maliciously). This just turns into distributed systems security 101, which is not an easy problem to solve. I would've loved to set up a distributed cache for all instances to use and contribute to, but it's infinitely easier said than done.

First order solution is a reputation system: tag each database submission with a "submitter ID" of the Nitter instance submitting the Tweet. Allow other instances, or users, to flag garbage data. Then instances can decide which "submitter IDs" to trust.

(not discussed here -- how to ensure submitters don't cheat and spoof IDs)

Then one can do a 2nd order reputation system, where people assess others' moderation decisions.

Finally we provide overall security by allowing users to "vote with their feet" and choose the Nitter instances which provide the highest quality data. The system is designed so that malicious instances and database flooding don't compromise the performance of legitimate instances.

Sure we could also do some kind of crazy proof of work blockchain solution, but simply letting people choose which Nitter instances to trust is probably enough.

> @saqib-ahmed @gfpj the problem with point 2 is indeed authenticity. How do we know a tweet is authentic and not manipulated, or entirely fake? How do we prevent garbage data? I'm not sure, maybe a verification system that requests clients to independently request and verify data, but that opens another can of worms (e.g. the same problem as Bitcoin's 51% attack where enough bad actors verify incorrect data maliciously). This just turns into distributed systems security 101, which is not an easy problem to solve. I would've loved to set up a distributed cache for all instances to use and contribute to, but it's infinitely easier said than done. First order solution is a reputation system: tag each database submission with a "submitter ID" of the Nitter instance submitting the Tweet. Allow other instances, or users, to flag garbage data. Then instances can decide which "submitter IDs" to trust. (not discussed here -- how to ensure submitters don't cheat and spoof IDs) Then one can do a 2nd order reputation system, where people assess others' moderation decisions. Finally we provide overall security by allowing users to "vote with their feet" and choose the Nitter instances which provide the highest quality data. The system is designed so that malicious instances and database flooding don't compromise the performance of legitimate instances. Sure we could also do some kind of crazy proof of work blockchain solution, but simply letting people choose which Nitter instances to trust is probably enough.
aleksusklim commented 2023-07-11 01:38:47 -04:00 (Migrated from github.com)

Allow other instances, or users, to flag garbage data.

Without direct access to Twitter, the server instance cannot proof anything it its own. At least, Twitter can hire malicious nodes that will DDoS such caching server by flooding it with anonymous fake contributions. The scale might be so large that nobody could check or flag all of them manually.

Otherwise, WITH a direct access to Twitter (at least for individual tweets by id/link) – the server instance could trivially check each contribution (without re-checking already confirmed tweets; and banning IPs of clients who are trying to give many fake tweet_id in attempt to make the server hit other Twitter limits)

I don't believe Twitter will ever make its links (and thus, tweet_id) non-functional.

> Allow other instances, or users, to flag garbage data. Without direct access to Twitter, the server instance cannot proof anything it its own. At least, Twitter can hire malicious nodes that will DDoS such caching server by flooding it with anonymous fake contributions. The scale might be so large that nobody could check or flag all of them manually. Otherwise, WITH a direct access to Twitter (at least for individual tweets by id/link) – the server instance could trivially check each contribution (without re-checking already confirmed tweets; and banning IPs of clients who are trying to give many fake tweet_id in attempt to make the server hit other Twitter limits) I don't believe Twitter will ever make its links (and thus, tweet_id) non-functional.
ghost commented 2023-07-11 02:04:54 -04:00 (Migrated from github.com)

Otherwise, WITH a direct access to Twitter (at least for individual tweets by id/link) – the server instance could trivially check each contribution (without re-checking already confirmed tweets

I literally figured this out independently and was coming here to edit my post to reflect this!

If it's not possible to check every Tweet in the database (it probably isn't) then it is probably enough to:

  • randomly check a sample of contributions from each source, and
  • allow users to flag bad tweets, then check the flagged tweets and (if erroneous) go through and check more contributions from that source before banning that source
> Otherwise, WITH a direct access to Twitter (at least for individual tweets by id/link) – the server instance could trivially check each contribution (without re-checking already confirmed tweets I literally figured this out independently and was coming here to edit my post to reflect this! If it's not possible to check every Tweet in the database (it probably isn't) then it is probably enough to: - randomly check a sample of contributions from each source, and - allow users to flag bad tweets, then check the flagged tweets and (if erroneous) go through and check more contributions from that source before banning that source
aleksusklim commented 2023-07-11 02:42:18 -04:00 (Migrated from github.com)

allow users to flag bad tweets, then check the flagged tweets and (if erroneous) go through and check more contributions from that source before banning that source

It breaks down, will you allow anonymous contributions or not. Currently it feels like they should be anonymous, just posted to some public endpoint. If you'll make this available only to "logged into Nitter" users – then nobody would do this, because "hell, I'll rather login into Twitter and just stay there! Why do I need to authenticate on some questionable scrapper, spying me on what tweets I look?"

Also, I don't see how an ordinary user surfing Nitter can check, "is the tweet valid or not?", because if I have an access to Twitter – then I probably don't need Nitter altogether.

please move it to 931

Nope, I don't care much, and won't actually do anything for Nitter project.

> allow users to flag bad tweets, then check the flagged tweets and (if erroneous) go through and check more contributions from that source before banning that source It breaks down, will you allow anonymous contributions or not. Currently it feels like they should be anonymous, just posted to some public endpoint. If you'll make this available only to "logged into Nitter" users – then nobody would do this, because "hell, I'll rather login into Twitter and just stay there! Why do I need to authenticate on some questionable scrapper, spying me on what tweets I look?" Also, I don't see how an ordinary user surfing Nitter can check, "is the tweet valid or not?", because if I have an access to Twitter – then I probably don't need Nitter altogether. > please move it to 931 Nope, I don't care much, and won't actually do anything for Nitter project.
zedeus commented 2023-07-11 03:05:15 -04:00 (Migrated from github.com)

@icy-ux @aleksusklim please move it to #931

@icy-ux @aleksusklim please move it to #931
vulet commented 2023-07-11 06:08:59 -04:00 (Migrated from github.com)

Thank you for the continued work on this great project!

Thank you for the continued work on this great project!
sawtoothpuma commented 2023-07-11 09:05:19 -04:00 (Migrated from github.com)

Glad it's working again, but when will searching for tweets be available again?

Glad it's working again, but when will searching for tweets be available again?
zedeus commented 2023-07-11 09:27:50 -04:00 (Migrated from github.com)

@sawtoothpuma Within a few days if it works properly.

@sawtoothpuma Within a few days if it works properly.
sawtoothpuma commented 2023-07-11 09:53:18 -04:00 (Migrated from github.com)

@zedeus Good to hear. Thank you.

@zedeus Good to hear. Thank you.
zedeus commented 2023-07-11 21:53:06 -04:00 (Migrated from github.com)

I've just pushed search to master, meaning all previous functionality is now working again. Let's hope things remain this way.

I've just pushed search to master, meaning all previous functionality is now working again. Let's hope things remain this way.
level323 commented 2023-07-11 22:19:13 -04:00 (Migrated from github.com)

I've just pushed search to master, meaning all previous functionality is now working again. Let's hope things remain this way.

But no RSS on the nitter.net instance yet :-(

Any estimates on when RSS is coming back to nitter.net?

> I've just pushed search to master, meaning all previous functionality is now working again. Let's hope things remain this way. But no RSS on the nitter.net instance yet :-( Any estimates on when RSS is coming back to nitter.net?
zedeus commented 2023-07-11 22:22:57 -04:00 (Migrated from github.com)

There's a strange memory leak that causes fairly rapid and steady memory usage growth, and enabling RSS would significantly exacerbate that. Once I figure it out I'll enable it again.

There's a strange memory leak that causes fairly rapid and steady memory usage growth, and enabling RSS would significantly exacerbate that. Once I figure it out I'll enable it again.
Write commented 2023-07-11 22:26:23 -04:00 (Migrated from github.com)

I've just pushed search to master, meaning all previous functionality is now working again. Let's hope things remain this way.

Thanks a lot.

https://nitter.socialspill.com/ up and running with search.

> I've just pushed search to master, meaning all previous functionality is now working again. Let's hope things remain this way. Thanks a lot. https://nitter.socialspill.com/ up and running with search.
jlund commented 2023-07-11 22:37:37 -04:00 (Migrated from github.com)

Search is back on *.unofficialbird.com too.

Search is back on *.unofficialbird.com too.
level323 commented 2023-07-12 01:03:09 -04:00 (Migrated from github.com)

There's a strange memory leak that causes fairly rapid and steady memory usage growth, and enabling RSS would significantly exacerbate that. Once I figure it out I'll enable it again.

Many thanks!

> There's a strange memory leak that causes fairly rapid and steady memory usage growth, and enabling RSS would significantly exacerbate that. Once I figure it out I'll enable it again. Many thanks!
Trit34 commented 2023-07-12 05:39:27 -04:00 (Migrated from github.com)

Thank you for fixing search, but it seems that we can’t (on my favorite instance, at least) search for tweets posted before 1st July. Well, it’s still better than nothing, I guess.

Thank you for fixing search, but it seems that we can’t (on my favorite instance, at least) search for tweets posted before 1st July. Well, it’s still better than nothing, I guess.
Write commented 2023-07-12 07:29:24 -04:00 (Migrated from github.com)

I've just pushed search to master, meaning all previous functionality is now working again. Let's hope things remain this way.

Thanks a lot.

https://nitter.socialspill.com/ up and running with search.

Images are working again. (Had some issue with an AdGuard list wrongly blocking stuffs : https://github.com/blocklistproject/Lists/issues/1028)

> > I've just pushed search to master, meaning all previous functionality is now working again. Let's hope things remain this way. > > Thanks a lot. > > https://nitter.socialspill.com/ up and running with search. Images are working again. (Had some issue with an AdGuard list wrongly blocking stuffs : https://github.com/blocklistproject/Lists/issues/1028)
ghost commented 2023-07-12 07:39:11 -04:00 (Migrated from github.com)

Thank you for your work zedeus! https://nitter.x86-64-unknown-linux-gnu.zip/ now runs off of stock master branch, with RSS feeds enabled. Let's see when it goes out of memory.

Thank you for your work zedeus! https://nitter.x86-64-unknown-linux-gnu.zip/ now runs off of stock master branch, with RSS feeds enabled. Let's see when it goes out of memory.
tadcrazio commented 2023-07-12 09:04:12 -04:00 (Migrated from github.com)

Thanks Zed! With I tend to use nitter for a feed for many different sources, and i noticed I cannot get all my feeds to show at once it generates a "No items found" but if i remove some accounts it shows them all. last night I thought i had 12 working, today 19, but the moment i add 1 more to it then it fails.

I just tried using the top 20 twitter handles it worked. Top 25 it did not.

Is there a limitation in place for this, or is tied to the memory leak?

Thanks Zed! With I tend to use nitter for a feed for many different sources, and i noticed I cannot get all my feeds to show at once it generates a "No items found" but if i remove some accounts it shows them all. last night I thought i had 12 working, today 19, but the moment i add 1 more to it then it fails. I just tried using the top 20 twitter handles it worked. Top 25 it did not. Is there a limitation in place for this, or is tied to the memory leak?
InklingGirl commented 2023-07-12 14:10:59 -04:00 (Migrated from github.com)

Is there any instance w/ RSS support back yet?

Is there any instance w/ RSS support back yet?
Write commented 2023-07-12 15:32:23 -04:00 (Migrated from github.com)

Is there any instance w/ RSS support back yet?

Thank you for your work zedeus! https://nitter.x86-64-unknown-linux-gnu.zip/ now runs off of stock master branch, with RSS feeds enabled. Let's see when it goes out of memory.

> Is there any instance w/ RSS support back yet? > Thank you for your work zedeus! https://nitter.x86-64-unknown-linux-gnu.zip/ now runs off of stock master branch, with RSS feeds enabled. Let's see when it goes out of memory.
mthmcalixto commented 2023-07-12 21:01:59 -04:00 (Migrated from github.com)

There we go again! 🚀🚀

There we go again! 🚀🚀
roryyamm commented 2023-07-12 22:53:53 -04:00 (Migrated from github.com)

Will this support NSFW or is support for that not in the cards anymore?

Will this support NSFW or is support for that not in the cards anymore?
Trit34 commented 2023-07-13 04:15:40 -04:00 (Migrated from github.com)

Is there any instance w/ RSS support back yet?

https://ntr.nah.re/ always had RSS enabled.

Will this support NSFW or is support for that not in the cards anymore?

Only if you log in your T account into the instance config, as PrivacyDev did on his.

> Is there any instance w/ RSS support back yet? https://ntr.nah.re/ always had RSS enabled. > Will this support NSFW or is support for that not in the cards anymore? Only if you log in your T account into the instance config, as PrivacyDev did on his.
Trit34 commented 2023-07-14 04:50:29 -04:00 (Migrated from github.com)

Any chance for search to give results older that the beginning of July, or must we forget about that because of the API changes?

Any chance for search to give results older that the beginning of July, or must we forget about that because of the API changes?
BANKA2017 commented 2023-07-14 06:08:50 -04:00 (Migrated from github.com)

Any chance for search to give results older that the beginning of July

Use the bearer token for TweetDeck Preview to replace the token for legacy TweetDeck (now).

> Any chance for search to give results older that the beginning of July Use the bearer token for **TweetDeck Preview** to replace the token for **legacy TweetDeck** (now).
ghost commented 2023-07-14 09:31:32 -04:00 (Migrated from github.com)

It seems, the old tokens work again, at least with Fritter app it works again since today, without updating the app.
So it was exactly blocked for 14 days.

It seems, the old tokens work again, at least with Fritter app it works again since today, without updating the app. So it was exactly blocked for 14 days.
Daviljoe193 commented 2023-07-14 10:55:57 -04:00 (Migrated from github.com)

It seems, the old tokens work again, at least with Fritter app it works again since today, without updating the app. So it was exactly blocked for 14 days.

Same for me too. I have an old instance of Nitter running that I forgot to update ages ago (Used it for RSS), and it just a little bit ago it started spitting out a whole ton of new stuff. I guess it's all back to normal, now?

> It seems, the old tokens work again, at least with Fritter app it works again since today, without updating the app. So it was exactly blocked for 14 days. Same for me too. I have an old instance of Nitter running that I forgot to update ages ago (Used it for RSS), and it just a little bit ago it started spitting out a whole ton of new stuff. I guess it's all back to normal, now?
zedeus commented 2023-07-14 13:02:09 -04:00 (Migrated from github.com)

The web-based stuff works again, but is still significantly limited compared to the way Nitter does things now. The work was thankfully not in vain.

The web-based stuff works again, but is still significantly limited compared to the way Nitter does things now. The work was thankfully not in vain.
ArchivingToolsForWBM commented 2023-07-15 10:14:03 -04:00 (Migrated from github.com)

Uhh, https://nitter.privacydev.net/ is no longer getting through the age restricted wall. Did twitter upped their system?

Uhh, https://nitter.privacydev.net/ is no longer getting through the age restricted wall. Did twitter upped their system?
ArchivingToolsForWBM commented 2023-07-15 10:40:33 -04:00 (Migrated from github.com)

@stopmotio
Did twitter voluntarily did that, or COPPA or any law actually prohibit bypassing age restrict wall?

I really hate that they rather age-restrict all the user's post when not all of them are NSFW.

@stopmotio Did twitter voluntarily did that, or COPPA or any law actually prohibit bypassing age restrict wall? I really hate that they rather age-restrict all the user's post when not all of them are NSFW.
ArchivingToolsForWBM commented 2023-07-15 10:52:39 -04:00 (Migrated from github.com)

@stopmotio is there another instance that still gets around it though? This list of nitter instances no longer works: https://github.com/xnaas/nitter-instances (404)

As a side note, yes, I completely despise any form of mandatory age verification. Login walls to just view content on a website or to download a file is already annoying enough. Having the internet needing your personal identifying information like an airport is excessive and potentially dangerous.

@stopmotio is there another instance that still gets around it though? This list of nitter instances no longer works: https://github.com/xnaas/nitter-instances (404) As a side note, yes, I completely despise any form of mandatory age verification. Login walls to just view content on a website or to download a file is already annoying enough. Having the internet needing your personal identifying information like an airport is excessive and potentially dangerous.
jimbobben commented 2023-07-17 07:34:28 -04:00 (Migrated from github.com)

is there any way to view a locked account on nitter, when I have access to it with my twitter account?

Set up your own instance with the cookie data of your Twitter account?

how do I do this?

> > is there any way to view a locked account on nitter, when I have access to it with my twitter account? > > Set up your own instance with the cookie data of your Twitter account? how do I do this?
devgaucho commented 2023-07-20 18:57:39 -04:00 (Migrated from github.com)

down again @zedeus 😒

https://imgur.com/YdQu1LO.png

down again @zedeus 😒 ![https://imgur.com/YdQu1LO.png](https://imgur.com/YdQu1LO.png)
devgaucho commented 2023-07-20 19:22:35 -04:00 (Migrated from github.com)

the problem is in reading the tweets of the profiles, the search continues to work normally in the version 2023.07.14-f881226 @zedeus

the problem is in reading the tweets of the profiles, the search continues to work normally in the version [2023.07.14-f881226](https://github.com/zedeus/nitter/commit/f881226) @zedeus
alexvong243f commented 2023-07-21 00:53:18 -04:00 (Migrated from github.com)

As a workaround, you can switch to the "Tweets & Replies" tab https://nitter.1d4.us/Twitter/with_replies

https://nitter.1d4.us/Twitter/with_replies/rss also works

------- Original Message -------
On Thursday, July 20th, 2023 at 11:15 PM, stopmotio - notifications at github.com @.***> wrote:

Nitter.1d4.us is also down :(

—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you commented.

As a workaround, you can switch to the "Tweets & Replies" tab https://nitter.1d4.us/Twitter/with_replies https://nitter.1d4.us/Twitter/with_replies/rss also works ------- Original Message ------- On Thursday, July 20th, 2023 at 11:15 PM, stopmotio - notifications at github.com ***@***.***> wrote: > Nitter.1d4.us is also down :( > > — > Reply to this email directly, view it on GitHub, or unsubscribe. > You are receiving this because you commented.
Trit34 commented 2023-07-21 04:01:17 -04:00 (Migrated from github.com)

No “No items found” on ntr.nah.re, but RSS feeds are down for the “Tweets” tab (showing only a few years old tweets). Reported in #953, #961 and #962.

No “No items found” on ntr.nah.re, but RSS feeds are down for the “Tweets” tab (showing only a few years old tweets). Reported in #953, #961 and #962.
MaxosHadj commented 2023-07-21 05:51:40 -04:00 (Migrated from github.com)

image

![image](https://github.com/zedeus/nitter/assets/82805662/f4a46360-57a2-4bf9-9a30-6b69ce7f05ee)
MainasuK commented 2023-07-21 06:36:06 -04:00 (Migrated from github.com)
[Deprecation of the /1.1/guest/activate/ endpoint in the Twitter API](https://twittercommunity.com/t/deprecation-of-the-1-1-guest-activate-endpoint-in-the-twitter-api/200591) This is bad news.
dnunezs commented 2023-07-21 09:24:17 -04:00 (Migrated from github.com)

Hi @Write, do you know if there is a function similar to these that you have created to search for hashtags?
Thanks!!

Hi @Write, do you know if there is a function similar to [these that you have created](https://github.com/zedeus/nitter/issues/919#issuecomment-1620918391) to search for hashtags? Thanks!!
edel79 commented 2023-07-21 10:32:26 -04:00 (Migrated from github.com)

Interresting to know why the "tweets and responses" still work. If someone knows...

Interresting to know why the "tweets and responses" still work. If someone knows...
ghost commented 2023-07-21 11:32:47 -04:00 (Migrated from github.com)

The googlebot method was updated today (?). It now returns ~100 tweets, but the order seems to need sorting now.

The googlebot method was updated today (?). It now returns ~100 tweets, but the order seems to need sorting now.
User123698745 commented 2023-07-21 11:57:55 -04:00 (Migrated from github.com)

The googlebot method was updated today (?). It now returns ~100 tweets, but the order seems to need sorting now.

Yes, but now its not chronologically. It looks like it only returns the 100 most popular tweets, e.g. the Fall Guys account almost only displays tweets from 2020 (when it released) and nothing from this year even though they tweet every day.

> The googlebot method was updated today (?). It now returns ~100 tweets, but the order seems to need sorting now. Yes, but now its not chronologically. It looks like it only returns the 100 most popular tweets, e.g. the [Fall Guys account](https://twitter.com/FallGuysGame) almost only displays tweets from 2020 (when it released) and nothing from this year even though they tweet every day.
ghost commented 2023-07-21 12:11:04 -04:00 (Migrated from github.com)

The googlebot method was updated today (?). It now returns ~100 tweets, but the order seems to need sorting now.

Yes, but now its not chronologically. It looks like it only returns the 100 most popular tweets, e.g. the Fall Guys account almost only displays tweets from 2020 (when it released) and nothing from this year even though they tweet every day.

Yes, that was also my first guess. So, maybe new tweets are not shown anymore, assuming the user has already made at least 100 tweets :(

Update: it's even worse. Many Twitter accounts look like they have 0 tweets with the new googlebot method update.
So, it's not really usable anymore.

> > The googlebot method was updated today (?). It now returns ~100 tweets, but the order seems to need sorting now. > > Yes, but now its not chronologically. It looks like it only returns the 100 most popular tweets, e.g. the [Fall Guys account](https://twitter.com/FallGuysGame) almost only displays tweets from 2020 (when it released) and nothing from this year even though they tweet every day. Yes, that was also my first guess. So, maybe new tweets are not shown anymore, assuming the user has already made at least 100 tweets :( Update: it's even worse. Many Twitter accounts look like they have 0 tweets with the new googlebot method update. So, it's not really usable anymore.
edel79 commented 2023-07-21 14:12:32 -04:00 (Migrated from github.com)

Since requests for tweets including replies still works, would it be possible to use it and filter (exclude) replies when rendering the html content of the "tweets" page ?

Since requests for tweets including replies still works, would it be possible to use it and filter (exclude) replies when rendering the html content of the "tweets" page ?
zedeus commented 2023-07-21 14:34:41 -04:00 (Migrated from github.com)

@edel79 kinda, but it could return 0 non-reply tweets for accounts like Elon that reply a lot. Not really a feasible option. I fixed it by using an older endpoint.

@edel79 kinda, but it could return 0 non-reply tweets for accounts like Elon that reply a lot. Not really a feasible option. I fixed it by using an older endpoint.
edel79 commented 2023-07-21 15:40:33 -04:00 (Migrated from github.com)

Someone to update once again this list with today's fix ? https://github.com/zedeus/nitter/wiki/Instances

For now all the 6 public instances I use are not upadated with today's patch.

Someone to update once again this list with today's fix ? https://github.com/zedeus/nitter/wiki/Instances For now all the 6 public instances I use are not upadated with today's patch.
Write commented 2023-07-21 18:15:03 -04:00 (Migrated from github.com)

Hello everyone,

Just updated my instance to latest commit : https://nitter.socialspill.com/

I've just enabled RSS, but I may disable it anytime since it seems there's a memory leak issue.

Hello everyone, Just updated my instance to latest commit : https://nitter.socialspill.com/ I've just enabled RSS, but I may disable it anytime since it seems there's a memory leak issue.
Hokkaidosm commented 2023-07-21 22:27:04 -04:00 (Migrated from github.com)

I have updated my instance (which I don't disclose much because I use it internally) to the latest version (2023.07.22-72d8f35), and it seems that tweets that are too old are not showing up in the "Tweets" tab.

For example, for this account (which appears to have ceased operations at the end of January 2022), pinned tweets are shown, but tweets from the end of January 2022 are not. However, they do appear in the "Tweets & Replies" tab.

A search does not seem to find this tweet.

I have updated [my instance](https://nitter.hokkaidosm.net/) (which I don't disclose much because I use it internally) to the latest version ([2023.07.22-72d8f35](https://github.com/zedeus/nitter/commit/72d8f35)), and it seems that tweets that are too old are not showing up in the "Tweets" tab. For example, for [this account](https://nitter.hokkaidosm.net/precure_wakupr) (which appears to have ceased operations at the end of January 2022), pinned tweets are shown, but [tweets from the end of January 2022](https://nitter.hokkaidosm.net/precure_wakupr/status/1488090617230290945#m) are not. However, they do appear in the ["Tweets & Replies" tab](https://nitter.hokkaidosm.net/precure_wakupr/with_replies). A [search](https://nitter.hokkaidosm.net/search?f=tweets&q=from%3Aprecure_wakupr&since=&until=&near=) does not seem to find this tweet.
tio-trom commented 2023-07-22 09:59:27 -04:00 (Migrated from github.com)

Hello everyone,

Just updated my instance to latest commit : https://nitter.socialspill.com/

I've just enabled RSS, but I may disable it anytime since it seems there's a memory leak issue.

I am using the 2023.07.22 version and the RSS does not work. Like test here https://bird.trom.tf/TROMSITE/rss I get User Not Found... Do I have to activate it manually from config somewhere?

EDIT: Eh maybe it works now...weird

> Hello everyone, > > Just updated my instance to latest commit : https://nitter.socialspill.com/ > > I've just enabled RSS, but I may disable it anytime since it seems there's a memory leak issue. I am using the 2023.07.22 version and the RSS does not work. Like test here https://bird.trom.tf/TROMSITE/rss I get User Not Found... Do I have to activate it manually from config somewhere? EDIT: Eh maybe it works now...weird
ghost commented 2023-07-23 04:54:20 -04:00 (Migrated from github.com)

The syndication api works again for timelines:
https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true
It shows the latest ~20 tweets and/or replies

Note: showReplies=false will now switch to "most popular tweets" like the googlebot method and will also ship out ~100 tweets.
Parsing the json can be done by searching for the first { from start and the first } from end.

Update (15 Aug 2023): showReplies=true does not work anymore.

The syndication api works again for timelines: <https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true> It shows the latest ~20 tweets and/or replies Note: `showReplies=false` will now switch to "most popular tweets" like the googlebot method and will also ship out ~100 tweets. Parsing the json can be done by searching for the first `{` from start and the first `}` from end. Update (15 Aug 2023): `showReplies=true` does not work anymore.
joopdo commented 2023-07-25 02:35:08 -04:00 (Migrated from github.com)

RSS feeds stopped working for me for a few days, also with latest images.

https://<NITTERURL>/<USERNAME>/rss

But this works:
https://<NITTERURL>/<USERNAME>/with_replies/rss

Just sharing for those who read by RSS as a temp 'fix'.

RSS feeds stopped working for me for a few days, also with latest images. `https://<NITTERURL>/<USERNAME>/rss` But this works: `https://<NITTERURL>/<USERNAME>/with_replies/rss` Just sharing for those who read by RSS as a temp 'fix'.
IngwiePhoenix commented 2023-07-25 20:01:15 -04:00 (Migrated from github.com)

Oh, I wondered if the RSS problem was just me. I get 403'd.

# curl -L nitter.net/Melleefresh/with_replies/rss
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.22.1</center>
</body>
</html>

Was about to set up a couple of RSS-to-Nostr bridges with rsslay before moving away from Twit- ... i mean X.

Any idea why it is broken or if it will be fixed?

Oh, I wondered if the RSS problem was just me. I get 403'd. ``` # curl -L nitter.net/Melleefresh/with_replies/rss <html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.22.1</center> </body> </html> ``` Was about to set up a couple of RSS-to-Nostr bridges with rsslay before moving away from Twit- ... i mean X. Any idea why it is broken or if it will be fixed?
joopdo commented 2023-07-25 20:09:27 -04:00 (Migrated from github.com)

Any idea why it is broken or if it will be fixed?

That instance is unstable from time to time, I'd recommend finding a different one or setting one up for yourself.

> Any idea why it is broken or if it will be fixed? That instance is unstable from time to time, I'd recommend finding a different one or setting one up for yourself.
zedeus commented 2023-07-26 06:50:37 -04:00 (Migrated from github.com)

It's not broken nor unstable, I disabled it to curb scrapers. It'll be enabled again at some point in the future, for now please use another instance.

It's not broken nor unstable, I disabled it to curb scrapers. It'll be enabled again at some point in the future, for now please use another instance.
12joan commented 2023-07-26 09:21:03 -04:00 (Migrated from github.com)

I'll once again recommend 12joan/twitter-client if you need a quick Twitter-to-RSS solution until things settle down. It's a little easier to self-host than Nitter if you're using Docker, no configuration required. A few of us have been using it for a couple of weeks now without incident.

I'll once again recommend [12joan/twitter-client](https://github.com/12joan/twitter-client#deployment-with-docker) if you need a quick Twitter-to-RSS solution until things settle down. It's a little easier to self-host than Nitter if you're using Docker, no configuration required. A few of us have been using it for a couple of weeks now without incident.
ArchivingToolsForWBM commented 2023-07-26 09:39:03 -04:00 (Migrated from github.com)

I noticed that sensitive content flagged by the user (not age restricted) results in a "this page doesn't exist", and is flagged as age restricted on https://nitter.privacydev.net/

Example:
https://twitter.com/canaaaaamin1003/status/1671702937272467459
https://nitter.privacydev.net/canaaaaamin1003/status/1671702937272467459

Logged out:
image
Logged in:
image
Nitter:
image

I noticed that sensitive content flagged by the user (not age restricted) results in a "this page doesn't exist", and is flagged as age restricted on https://nitter.privacydev.net/ Example: https://twitter.com/canaaaaamin1003/status/1671702937272467459 https://nitter.privacydev.net/canaaaaamin1003/status/1671702937272467459 Logged out: ![image](https://github.com/zedeus/nitter/assets/89951208/626c6990-1500-4287-a602-26e1fbe6fc5c) Logged in: ![image](https://github.com/zedeus/nitter/assets/89951208/926e11cc-3843-4f17-9059-deda79bf6e51) Nitter: ![image](https://github.com/zedeus/nitter/assets/89951208/e4d4db4f-b13b-4b70-a18c-a6240e8756c1)
Trit34 commented 2023-07-28 04:03:50 -04:00 (Migrated from github.com)

Today, on the instance I use (ntr.nah.re), “Tweets” tab and RSS feeds work fine again. Until the next break…

Today, on the instance I use (ntr.nah.re), “Tweets” tab and RSS feeds work fine again. Until the next break…
Metabot24 commented 2023-07-31 17:18:43 -04:00 (Migrated from github.com)

This instance works but sensitive content is still restricted. Has there been a solution found for that yet?

> This instance works but sensitive content is still restricted. Has there been a solution found for that yet?
Trit34 commented 2023-08-15 04:27:16 -04:00 (Migrated from github.com)
Well, it broke again… https://github.com/zedeus/nitter/issues/983
devgaucho commented 2023-08-16 18:35:24 -04:00 (Migrated from github.com)

the search for this fork still worked intermittently at commit 813a71e until 10:00pm on August 16, 2023

sometimes it returns nothing and the rss feed returns an error 502 (internal error), but eventually it works

from what I saw they use a proxy system with cache because old searches are updated, but new searches return as 404

the search [for this fork](https://github.com/PrivacyDevel/nitter) still worked intermittently at [commit 813a71e](https://github.com/PrivacyDevel/nitter/tree/813a71e4d33aab8a3847857444921a61b37117db) until 10:00pm on August 16, 2023 sometimes it returns nothing and the rss feed returns an error 502 (internal error), but eventually it works from what I saw they use a proxy system with cache because old searches are updated, but new searches return as 404
devgaucho commented 2023-08-16 21:21:16 -04:00 (Migrated from github.com)
game over? https://twitter.com/nima_owji/status/1691850092385370483 ![https://i.imgur.com/fEKHeMH.png](https://i.imgur.com/fEKHeMH.png)
devgaucho commented 2023-08-16 21:28:28 -04:00 (Migrated from github.com)

Says it's optional and Blue-only for now. We're safe.

I hope https://twitter.com/xDaily/status/1691859235951583630

https://imgur.com/eAOUcQ3.png

via dailydot

> Says it's optional and Blue-only for now. We're safe. I hope https://twitter.com/xDaily/status/1691859235951583630 ![https://imgur.com/eAOUcQ3.png](https://imgur.com/eAOUcQ3.png) via [dailydot](https://www.dailydot.com/debug/twitter-id-verification/)
erikcas commented 2023-08-17 03:59:22 -04:00 (Migrated from github.com)

the search for this fork still worked intermittently at commit 813a71e until 10:00pm on August 16, 2023

sometimes it returns nothing and the rss feed returns an error 502 (internal error), but eventually it works

from what I saw they use a proxy system with cache because old searches are updated, but new searches return as 404

They use a login based alternative?

See commit d5689f2

> the search [for this fork](https://github.com/PrivacyDevel/nitter) still worked intermittently at [commit 813a71e](https://github.com/PrivacyDevel/nitter/tree/813a71e4d33aab8a3847857444921a61b37117db) until 10:00pm on August 16, 2023 > > sometimes it returns nothing and the rss feed returns an error 502 (internal error), but eventually it works > > from what I saw they use a proxy system with cache because old searches are updated, but new searches return as 404 They use a login based alternative? See commit d5689f2
devgaucho commented 2023-08-17 06:28:00 -04:00 (Migrated from github.com)

musk magick formula = less captcha and more subscription

https://imgur.com/pB89XVj.png

https://twitter.com/elonmusk/status/1691969296543711471

musk magick formula = less captcha and more subscription ![https://imgur.com/pB89XVj.png](https://imgur.com/pB89XVj.png) https://twitter.com/elonmusk/status/1691969296543711471
devgaucho commented 2023-08-17 06:34:37 -04:00 (Migrated from github.com)

the search for this fork still worked intermittently at commit 813a71e until 10:00pm on August 16, 2023
sometimes it returns nothing and the rss feed returns an error 502 (internal error), but eventually it works
from what I saw they use a proxy system with cache because old searches are updated, but new searches return as 404

They use a login based alternative?

See commit d5689f2

probably. from what I noticed they use a cache in the search system, the current lag is more than 10 hours

> > the search [for this fork](https://github.com/PrivacyDevel/nitter) still worked intermittently at [commit 813a71e](https://github.com/PrivacyDevel/nitter/tree/813a71e4d33aab8a3847857444921a61b37117db) until 10:00pm on August 16, 2023 > > sometimes it returns nothing and the rss feed returns an error 502 (internal error), but eventually it works > > from what I saw they use a proxy system with cache because old searches are updated, but new searches return as 404 > > They use a login based alternative? > > See commit [d5689f2](https://github.com/zedeus/nitter/commit/d5689f2253d761dd72723868742fdc3211c850bd) probably. from what I noticed they use a cache in the search system, the current lag is more than 10 hours
devgaucho commented 2023-08-17 06:37:39 -04:00 (Migrated from github.com)

the search for this fork still worked intermittently at commit 813a71e until 10:00pm on August 16, 2023
sometimes it returns nothing and the rss feed returns an error 502 (internal error), but eventually it works
from what I saw they use a proxy system with cache because old searches are updated, but new searches return as 404

They use a login based alternative?
See commit d5689f2

probably. from what I noticed they use a cache in the search system, the current lag is more than 10 hours

the cache prioritizes some profiles, the most accessed I assume

https://imgur.com/gATHxP2.png

> > > the search [for this fork](https://github.com/PrivacyDevel/nitter) still worked intermittently at [commit 813a71e](https://github.com/PrivacyDevel/nitter/tree/813a71e4d33aab8a3847857444921a61b37117db) until 10:00pm on August 16, 2023 > > > sometimes it returns nothing and the rss feed returns an error 502 (internal error), but eventually it works > > > from what I saw they use a proxy system with cache because old searches are updated, but new searches return as 404 > > > > > > They use a login based alternative? > > See commit [d5689f2](https://github.com/zedeus/nitter/commit/d5689f2253d761dd72723868742fdc3211c850bd) > > probably. from what I noticed they use a cache in the search system, the current lag is more than 10 hours the cache prioritizes some profiles, the most accessed I assume ![https://imgur.com/gATHxP2.png](https://imgur.com/gATHxP2.png)
devgaucho commented 2023-08-17 06:41:53 -04:00 (Migrated from github.com)

in July 21 they exchanged the endpoint of the profiles for the endpoint of the search system, I believe that this is the main source of the tweets that feed the profiles, so they simplify by focusing efforts on only one endpoint

https://imgur.com/n8TLon4.png

in July 21 they exchanged the endpoint of the profiles for the endpoint of the search system, I believe that this is the main source of the tweets that feed the profiles, so they simplify by focusing efforts on only one endpoint ![https://imgur.com/n8TLon4.png](https://imgur.com/n8TLon4.png)
devgaucho commented 2023-08-17 06:45:39 -04:00 (Migrated from github.com)

as some delay but stil works

https://imgur.com/HREtJA5.png

as some delay but stil works ![https://imgur.com/HREtJA5.png](https://imgur.com/HREtJA5.png)
veilm commented 2023-08-17 09:51:01 -04:00 (Migrated from github.com)

as some delay but stil works

Which accounts are working for you besides "jack" and "elonmusk"?
I tried a few from https://en.wikipedia.org/wiki/List_of_most-followed_Twitter_accounts (like BarackObama, justinbieber, Cristiano, rihanna, YouTube) and all of them showed the same "An error has occured in one of your routes." page. All of them are visible without an account on twitter.com.

Or is this a result of the 10-hour cache delay you mentioned?

> as some delay but stil works Which accounts are working for you besides "jack" and "elonmusk"? I tried a few from https://en.wikipedia.org/wiki/List_of_most-followed_Twitter_accounts (like BarackObama, justinbieber, Cristiano, rihanna, YouTube) and all of them showed the same "An error has occured in one of your routes." page. All of them are visible without an account on twitter.com. Or is this a result of the 10-hour cache delay you mentioned?
devgaucho commented 2023-08-17 10:33:30 -04:00 (Migrated from github.com)

as some delay but stil works

Which accounts are working for you besides "jack" and "elonmusk"? I tried a few from https://en.wikipedia.org/wiki/List_of_most-followed_Twitter_accounts (like BarackObama, justinbieber, Cristiano, rihanna, YouTube) and all of them showed the same "An error has occured in one of your routes." page. All of them are visible without an account on twitter.com.

Or is this a result of the 10-hour cache delay you mentioned?

my personal account is accessible thourght the search box with a 2 hours delay

> > as some delay but stil works > > Which accounts are working for you besides "jack" and "elonmusk"? I tried a few from https://en.wikipedia.org/wiki/List_of_most-followed_Twitter_accounts (like BarackObama, justinbieber, Cristiano, rihanna, YouTube) and all of them showed the same "An error has occured in one of your routes." page. All of them are visible without an account on twitter.com. > > Or is this a result of the 10-hour cache delay you mentioned? my personal account is accessible thourght the search box with a 2 hours delay
devgaucho commented 2023-08-17 10:35:57 -04:00 (Migrated from github.com)

as some delay but stil works

Which accounts are working for you besides "jack" and "elonmusk"? I tried a few from https://en.wikipedia.org/wiki/List_of_most-followed_Twitter_accounts (like BarackObama, justinbieber, Cristiano, rihanna, YouTube) and all of them showed the same "An error has occured in one of your routes." page. All of them are visible without an account on twitter.com.

Or is this a result of the 10-hour cache delay you mentioned?

the cache is local, should prioritize the most accessed sites in the instance in case

> > as some delay but stil works > > Which accounts are working for you besides "jack" and "elonmusk"? I tried a few from https://en.wikipedia.org/wiki/List_of_most-followed_Twitter_accounts (like BarackObama, justinbieber, Cristiano, rihanna, YouTube) and all of them showed the same "An error has occured in one of your routes." page. All of them are visible without an account on twitter.com. > > Or is this a result of the 10-hour cache delay you mentioned? the cache is local, should prioritize the most accessed sites in the instance in case
coda101 commented 2023-08-17 15:58:55 -04:00 (Migrated from github.com)

All of them are visible without an account on twitter.com.

The ones I checked all had a mix of random new and old tweets almost like "highlights".

>All of them are visible without an account on twitter.com. The ones I checked all had a mix of random new and old tweets almost like "highlights".
unseenlarks commented 2023-08-17 16:11:36 -04:00 (Migrated from github.com)

apparently, tweets with more likes are being shown first (when viewing a profile when logged out).

https://9to5google.com/2023/08/16/twitter-profile-sort-like-counts-logged-out/

apparently, tweets with more likes are being shown first (when viewing a profile when logged out). https://9to5google.com/2023/08/16/twitter-profile-sort-like-counts-logged-out/
zedeus commented 2023-08-18 18:43:00 -04:00 (Migrated from github.com)

Superseded by #983

Superseded by #983
rohitrsm83 commented 2023-08-21 10:08:30 -04:00 (Migrated from github.com)

Hi,

For now the only instance that seems to be working is nitter.net. I usually use unofficialbird but that one--and many others--report the jester route exception error.

Hi, For now the only instance that seems to be working is nitter.net. I usually use unofficialbird but that one--and many others--report the jester route exception error.
zedeus commented 2023-08-21 10:45:30 -04:00 (Migrated from github.com)

@rohitrsm83 the conversation continues here: #983

@rohitrsm83 the conversation continues here: #983
rohitrsm83 commented 2023-08-21 12:55:47 -04:00 (Migrated from github.com)

@rohitrsm83 the conversation continues here: #983

Thx

> @rohitrsm83 the conversation continues here: #983 Thx
This discussion has been locked. Commenting is limited to contributors.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
PAS/nitter#919
No description provided.