looks like X/twitter(?) broke something again #983

Closed
opened 2023-08-15 03:14:49 -04:00 by animegrafmays · 697 comments
animegrafmays commented 2023-08-15 03:14:49 -04:00 (Migrated from github.com)
[ ![8493b396fd05f26fe681a6abe9a849dc983d091fd4472a53dc3aa72547b030c4](https://github.com/zedeus/nitter/assets/71434691/2b770a6e-0792-4512-9b1a-1b79b228e371) ](url)
ghost commented 2023-08-15 04:05:18 -04:00 (Migrated from github.com)

Also, the syndication api for showReplies=true does not work anymore:
https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true
but showReplies=false still works, showing the tweets ordered by like count...
https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false

Also, the syndication api for `showReplies=true` does not work anymore: <https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true> but `showReplies=false` still works, showing the tweets ordered by like count... <https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false>
beingnajib commented 2023-08-15 04:32:58 -04:00 (Migrated from github.com)

Yes, it is not working now. I hope the Nitter people fix this soon.

Yes, it is not working now. I hope the Nitter people fix this soon.
paulamei commented 2023-08-15 05:15:04 -04:00 (Migrated from github.com)

Is there a online/CLI tool converting
https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk
to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step.

Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step.
nerra0pos commented 2023-08-15 05:20:23 -04:00 (Migrated from github.com)

Also, the syndication api for showReplies=true does not work anymore: https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true but showReplies=false still works, showing the tweets ordered by like count... https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false

Not really. showReplies=false shows years-old content when not logged in.

> Also, the syndication api for `showReplies=true` does not work anymore: https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true but `showReplies=false` still works, showing the tweets ordered by like count... https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false Not really. showReplies=false shows years-old content when not logged in.
iceFbr commented 2023-08-15 05:41:09 -04:00 (Migrated from github.com)

Down again...

Down again...
Dheatly23 commented 2023-08-15 08:32:52 -04:00 (Migrated from github.com)

Also, the syndication api for showReplies=true does not work anymore: https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true but showReplies=false still works, showing the tweets ordered by like count... https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false

Not really. showReplies=false shows years-old content when not logged in.

That's because in that specific example, those tweets were years ago. Look again at the like count, notice anything?

> > Also, the syndication api for `showReplies=true` does not work anymore: https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true but `showReplies=false` still works, showing the tweets ordered by like count... https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false > > Not really. showReplies=false shows years-old content when not logged in. That's because in that specific example, those tweets were years ago. Look again at the like count, notice anything?
ghost commented 2023-08-15 09:19:43 -04:00 (Migrated from github.com)

Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step.

We can just search for the first { from begin and first } from end and then parse as json.
If a user has not so many tweets (500-1000) then the chance is quite good that also newer tweets are within the most popular 100.
But of course it's not a very good solution. At least, nitter should have it as a backup when nothing else works, this method can be used.

> Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step. We can just search for the first `{` from begin and first `}` from end and then parse as json. If a user has not so many tweets (500-1000) then the chance is quite good that also newer tweets are within the most popular 100. But of course it's not a very good solution. At least, nitter should have it as a backup when nothing else works, this method can be used.
Write commented 2023-08-15 09:33:35 -04:00 (Migrated from github.com)

Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step.

We can just search for the first { from begin and first } from end and then parse as json. If a user has not so many tweets (500-1000) then the chance is quite good that also newer tweets are within the most popular 100. But of course it's not a very good solution. At least, nitter should have it as a backup when nothing else works, this method can be used.

Indeed

#!/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)
> > Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step. > > We can just search for the first `{` from begin and first `}` from end and then parse as json. If a user has not so many tweets (500-1000) then the chance is quite good that also newer tweets are within the most popular 100. But of course it's not a very good solution. At least, nitter should have it as a backup when nothing else works, this method can be used. Indeed ```python3 #!/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) ```
paulamei commented 2023-08-15 10:20:14 -04:00 (Migrated from github.com)

Indeed

Interesting, but this doesn't return RSS with 'item', 'pubDate' etc. tags. Maybe a script using https://github.com/lkiesow/python-feedgen would do the job?

> Indeed Interesting, but this doesn't return RSS with 'item', 'pubDate' etc. tags. Maybe a script using https://github.com/lkiesow/python-feedgen would do the job?
Write commented 2023-08-15 10:24:27 -04:00 (Migrated from github.com)

Indeed

Interesting, but this doesn't return RSS with 'item', 'pubDate' etc. tags. Maybe a script using https://github.com/lkiesow/python-feedgen would do the job?

Not sure I understand ? It expose far more informations than needed and it does expose the date and all

Here's an example for one tweet only :

 {
            "type": "tweet",
            "entry_id": "tweet-1519480761749016577",
            "sort_index": "1691455400412446720",
            "content": {
              "tweet": {
                "id": 0,
                "location": "",
                "conversation_id_str": "1519480761749016577",
                "created_at": "Thu Apr 28 00:56:58 +0000 2022",
                "display_text_range": [
                  0,
                  52
                ],
                "entities": {
                  "user_mentions": [],
                  "urls": [],
                  "hashtags": [],
                  "symbols": [],
                  "media": []
                },
                "favorite_count": 4600599,
                "favorited": false,
                "full_text": "Next I’m buying Coca-Cola to put the cocaine back in",
                "id_str": "1519480761749016577",
                "lang": "en",
                "permalink": "/elonmusk/status/1519480761749016577",
                "possibly_sensitive": false,
                "quote_count": 171975,
                "reply_count": 187438,
                "retweet_count": 649833,
                "retweeted": false,
                "text": "Next I’m buying Coca-Cola to put the cocaine back in",
                "user": {
                  "blocking": false,
                  "created_at": "Tue Jun 02 20:12:29 +0000 2009",
                  "default_profile": false,
                  "default_profile_image": false,
                  "description": "Blades of Glory",
                  "entities": {
                    "description": {
                      "urls": []
                    },
                    "url": {}
                  },
                  "fast_followers_count": 0,
                  "favourites_count": 30569,
                  "follow_request_sent": false,
                  "followed_by": false,
                  "followers_count": 153112066,
                  "following": false,
                  "friends_count": 410,
                  "has_custom_timelines": false,
                  "highlightedLabel": {
                    "badge": {
                      "url": "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_bigger.jpg"
                    },
                    "description": "X",
                    "userLabelType": "BusinessLabel",
                    "userLabelDisplayType": "Badge"
                  },
                  "id": 0,
                  "id_str": "44196397",
                  "is_translator": false,
                  "listed_count": 126597,
                  "location": "𝕏Ð",
                  "media_count": 1659,
                  "name": "Elon Musk",
                  "normal_followers_count": 153112066,
                  "notifications": false,
                  "profile_banner_url": "https://pbs.twimg.com/profile_banners/44196397/1690621312",
                  "profile_image_url_https": "https://pbs.twimg.com/profile_images/1683325380441128960/yRsRRjGO_normal.jpg",
                  "protected": false,
                  "screen_name": "elonmusk",
                  "show_all_inline_media": false,
                  "statuses_count": 29441,
                  "time_zone": "",
                  "translator_type": "none",
                  "url": "",
                  "utc_offset": 0,
                  "verified": false,
                  "withheld_in_countries": [],
                  "withheld_scope": "",
                  "is_blue_verified": true
                }
              }
            }
          },

EDIT : Maybe you meant a directly usable solution for an end user, and of course it's not, the snippet need to be adapted by a dev.

> > Indeed > > Interesting, but this doesn't return RSS with 'item', 'pubDate' etc. tags. Maybe a script using https://github.com/lkiesow/python-feedgen would do the job? Not sure I understand ? It expose far more informations than needed and it does expose the date and all Here's an example for one tweet only : ```json { "type": "tweet", "entry_id": "tweet-1519480761749016577", "sort_index": "1691455400412446720", "content": { "tweet": { "id": 0, "location": "", "conversation_id_str": "1519480761749016577", "created_at": "Thu Apr 28 00:56:58 +0000 2022", "display_text_range": [ 0, 52 ], "entities": { "user_mentions": [], "urls": [], "hashtags": [], "symbols": [], "media": [] }, "favorite_count": 4600599, "favorited": false, "full_text": "Next I’m buying Coca-Cola to put the cocaine back in", "id_str": "1519480761749016577", "lang": "en", "permalink": "/elonmusk/status/1519480761749016577", "possibly_sensitive": false, "quote_count": 171975, "reply_count": 187438, "retweet_count": 649833, "retweeted": false, "text": "Next I’m buying Coca-Cola to put the cocaine back in", "user": { "blocking": false, "created_at": "Tue Jun 02 20:12:29 +0000 2009", "default_profile": false, "default_profile_image": false, "description": "Blades of Glory", "entities": { "description": { "urls": [] }, "url": {} }, "fast_followers_count": 0, "favourites_count": 30569, "follow_request_sent": false, "followed_by": false, "followers_count": 153112066, "following": false, "friends_count": 410, "has_custom_timelines": false, "highlightedLabel": { "badge": { "url": "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_bigger.jpg" }, "description": "X", "userLabelType": "BusinessLabel", "userLabelDisplayType": "Badge" }, "id": 0, "id_str": "44196397", "is_translator": false, "listed_count": 126597, "location": "𝕏Ð", "media_count": 1659, "name": "Elon Musk", "normal_followers_count": 153112066, "notifications": false, "profile_banner_url": "https://pbs.twimg.com/profile_banners/44196397/1690621312", "profile_image_url_https": "https://pbs.twimg.com/profile_images/1683325380441128960/yRsRRjGO_normal.jpg", "protected": false, "screen_name": "elonmusk", "show_all_inline_media": false, "statuses_count": 29441, "time_zone": "", "translator_type": "none", "url": "", "utc_offset": 0, "verified": false, "withheld_in_countries": [], "withheld_scope": "", "is_blue_verified": true } } } }, ``` EDIT : Maybe you meant a directly usable solution for an end user, and of course it's not, the snippet need to be adapted by a dev.
paulamei commented 2023-08-15 10:30:01 -04:00 (Migrated from github.com)

Indeed

Interesting, but this doesn't return RSS with 'item', 'pubDate' etc. tags. Maybe a script using https://github.com/lkiesow/python-feedgen would do the job?

Not sure I understand ? It expose far more informations than needed and it does expose the date and all

Ok, thank you, I'll try this.

> > > Indeed > > > > > > Interesting, but this doesn't return RSS with 'item', 'pubDate' etc. tags. Maybe a script using https://github.com/lkiesow/python-feedgen would do the job? > > Not sure I understand ? It expose far more informations than needed and it does expose the date and all Ok, thank you, I'll try this.
jcmag commented 2023-08-15 10:36:04 -04:00 (Migrated from github.com)

Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step.

calling the syndication URL without being logged in twitter doesn't retrieve the most recent tweets. If I call this url in postman, I retrieve 100 tweets from 10/19/2018 to 07/31/2023; no tweets from august...

> Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step. calling the syndication URL without being logged in twitter doesn't retrieve the most recent tweets. If I call this url in postman, I retrieve 100 tweets from 10/19/2018 to 07/31/2023; no tweets from august...
null-routed commented 2023-08-15 10:56:29 -04:00 (Migrated from github.com)

Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step.

calling the syndication URL without being logged in twitter doesn't retrieve the most recent tweets. If I call this url in postman, I retrieve 100 tweets from 10/19/2018 to 07/31/2023; no tweets from august...

It retrieves the tweets with the highest like count from that user, which doesnt sound good if your goal is retrieving the most recent tweets, as there's no guarantee new tweets will make it to the top 100 tweets from that user. And even if they did, it might take a considerable amount of time

> > Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step. > > calling the syndication URL without being logged in twitter doesn't retrieve the most recent tweets. If I call this url in postman, I retrieve 100 tweets from 10/19/2018 to 07/31/2023; no tweets from august... It retrieves the tweets with the highest like count from that user, which doesnt sound good if your goal is retrieving the most recent tweets, as there's no guarantee new tweets will make it to the top 100 tweets from that user. And even if they did, it might take a considerable amount of time
yuv418 commented 2023-08-15 10:59:54 -04:00 (Migrated from github.com)

I've noticed that for smaller accounts that have less than 100 tweets, that syndication URL does not load any tweets.

I've noticed that for smaller accounts that have less than 100 tweets, that syndication URL does not load any tweets.
nerra0pos commented 2023-08-15 11:00:43 -04:00 (Migrated from github.com)

Also, the syndication api for showReplies=true does not work anymore: https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true but showReplies=false still works, showing the tweets ordered by like count... https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false

Not really. showReplies=false shows years-old content when not logged in.

That's because in that specific example, those tweets were years ago. Look again at the like count, notice anything?

No. That is the case for all big accounts. I am interested in the most recent Tweets and this approach will lead to nothing.

> > > Also, the syndication api for `showReplies=true` does not work anymore: https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true but `showReplies=false` still works, showing the tweets ordered by like count... https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false > > > > > > Not really. showReplies=false shows years-old content when not logged in. > > That's because in that specific example, those tweets were years ago. Look again at the like count, notice anything? No. That is the case for all big accounts. I am interested in the most recent Tweets and this approach will lead to nothing.
kpopdev commented 2023-08-15 11:12:14 -04:00 (Migrated from github.com)

Indeed

Interesting, but this doesn't return RSS with 'item', 'pubDate' etc. tags. Maybe a script using https://github.com/lkiesow/python-feedgen would do the job?

Not sure I understand ? It expose far more informations than needed and it does expose the date and all

Here's an example for one tweet only :

 {
            "type": "tweet",
            "entry_id": "tweet-1519480761749016577",
            "sort_index": "1691455400412446720",
            "content": {
              "tweet": {
                "id": 0,
                "location": "",
                "conversation_id_str": "1519480761749016577",
                "created_at": "Thu Apr 28 00:56:58 +0000 2022",
                "display_text_range": [
                  0,
                  52
                ],
                "entities": {
                  "user_mentions": [],
                  "urls": [],
                  "hashtags": [],
                  "symbols": [],
                  "media": []
                },
                "favorite_count": 4600599,
                "favorited": false,
                "full_text": "Next I’m buying Coca-Cola to put the cocaine back in",
                "id_str": "1519480761749016577",
                "lang": "en",
                "permalink": "/elonmusk/status/1519480761749016577",
                "possibly_sensitive": false,
                "quote_count": 171975,
                "reply_count": 187438,
                "retweet_count": 649833,
                "retweeted": false,
                "text": "Next I’m buying Coca-Cola to put the cocaine back in",
                "user": {
                  "blocking": false,
                  "created_at": "Tue Jun 02 20:12:29 +0000 2009",
                  "default_profile": false,
                  "default_profile_image": false,
                  "description": "Blades of Glory",
                  "entities": {
                    "description": {
                      "urls": []
                    },
                    "url": {}
                  },
                  "fast_followers_count": 0,
                  "favourites_count": 30569,
                  "follow_request_sent": false,
                  "followed_by": false,
                  "followers_count": 153112066,
                  "following": false,
                  "friends_count": 410,
                  "has_custom_timelines": false,
                  "highlightedLabel": {
                    "badge": {
                      "url": "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_bigger.jpg"
                    },
                    "description": "X",
                    "userLabelType": "BusinessLabel",
                    "userLabelDisplayType": "Badge"
                  },
                  "id": 0,
                  "id_str": "44196397",
                  "is_translator": false,
                  "listed_count": 126597,
                  "location": "𝕏Ð",
                  "media_count": 1659,
                  "name": "Elon Musk",
                  "normal_followers_count": 153112066,
                  "notifications": false,
                  "profile_banner_url": "https://pbs.twimg.com/profile_banners/44196397/1690621312",
                  "profile_image_url_https": "https://pbs.twimg.com/profile_images/1683325380441128960/yRsRRjGO_normal.jpg",
                  "protected": false,
                  "screen_name": "elonmusk",
                  "show_all_inline_media": false,
                  "statuses_count": 29441,
                  "time_zone": "",
                  "translator_type": "none",
                  "url": "",
                  "utc_offset": 0,
                  "verified": false,
                  "withheld_in_countries": [],
                  "withheld_scope": "",
                  "is_blue_verified": true
                }
              }
            }
          },

EDIT : Maybe you meant a directly usable solution for an end user, and of course it's not, the snippet need to be adapted by a dev.

im using this for my bot and it working fine with cookies and headers.

> > > Indeed > > > > > > Interesting, but this doesn't return RSS with 'item', 'pubDate' etc. tags. Maybe a script using https://github.com/lkiesow/python-feedgen would do the job? > > Not sure I understand ? It expose far more informations than needed and it does expose the date and all > > Here's an example for one tweet only : > > ```json > { > "type": "tweet", > "entry_id": "tweet-1519480761749016577", > "sort_index": "1691455400412446720", > "content": { > "tweet": { > "id": 0, > "location": "", > "conversation_id_str": "1519480761749016577", > "created_at": "Thu Apr 28 00:56:58 +0000 2022", > "display_text_range": [ > 0, > 52 > ], > "entities": { > "user_mentions": [], > "urls": [], > "hashtags": [], > "symbols": [], > "media": [] > }, > "favorite_count": 4600599, > "favorited": false, > "full_text": "Next I’m buying Coca-Cola to put the cocaine back in", > "id_str": "1519480761749016577", > "lang": "en", > "permalink": "/elonmusk/status/1519480761749016577", > "possibly_sensitive": false, > "quote_count": 171975, > "reply_count": 187438, > "retweet_count": 649833, > "retweeted": false, > "text": "Next I’m buying Coca-Cola to put the cocaine back in", > "user": { > "blocking": false, > "created_at": "Tue Jun 02 20:12:29 +0000 2009", > "default_profile": false, > "default_profile_image": false, > "description": "Blades of Glory", > "entities": { > "description": { > "urls": [] > }, > "url": {} > }, > "fast_followers_count": 0, > "favourites_count": 30569, > "follow_request_sent": false, > "followed_by": false, > "followers_count": 153112066, > "following": false, > "friends_count": 410, > "has_custom_timelines": false, > "highlightedLabel": { > "badge": { > "url": "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_bigger.jpg" > }, > "description": "X", > "userLabelType": "BusinessLabel", > "userLabelDisplayType": "Badge" > }, > "id": 0, > "id_str": "44196397", > "is_translator": false, > "listed_count": 126597, > "location": "𝕏Ð", > "media_count": 1659, > "name": "Elon Musk", > "normal_followers_count": 153112066, > "notifications": false, > "profile_banner_url": "https://pbs.twimg.com/profile_banners/44196397/1690621312", > "profile_image_url_https": "https://pbs.twimg.com/profile_images/1683325380441128960/yRsRRjGO_normal.jpg", > "protected": false, > "screen_name": "elonmusk", > "show_all_inline_media": false, > "statuses_count": 29441, > "time_zone": "", > "translator_type": "none", > "url": "", > "utc_offset": 0, > "verified": false, > "withheld_in_countries": [], > "withheld_scope": "", > "is_blue_verified": true > } > } > } > }, > ``` > > EDIT : Maybe you meant a directly usable solution for an end user, and of course it's not, the snippet need to be adapted by a dev. im using this for my bot and it working fine with cookies and headers.
intuser commented 2023-08-15 11:18:37 -04:00 (Migrated from github.com)

Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step.

calling the syndication URL without being logged in twitter doesn't retrieve the most recent tweets. If I call this url in postman, I retrieve 100 tweets from 10/19/2018 to 07/31/2023; no tweets from august...

Yes. And there is at least one tweet from August with more likes (>807K) than some older tweets which are included (e.g. <680K).

> > Is there a online/CLI tool converting https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk to RSS feed? Then we could individually download the HTML from a logged in profile and do the conversion in a second step. > > calling the syndication URL without being logged in twitter doesn't retrieve the most recent tweets. If I call this url in postman, I retrieve 100 tweets from 10/19/2018 to 07/31/2023; no tweets from august... Yes. And there is at least one tweet from August with more likes (>807K) than some older tweets which are included (e.g. <680K).
Mr-Freewan commented 2023-08-15 11:20:43 -04:00 (Migrated from github.com)

is there any forecast for solving this problem?

is there any forecast for solving this problem?
ghost commented 2023-08-15 11:41:27 -04:00 (Migrated from github.com)

Looks like https://nitter.privacydev.net/ is working

Looks like https://nitter.privacydev.net/ is working
zedeus commented 2023-08-15 11:46:54 -04:00 (Migrated from github.com)

That one is a fork which uses account credentials. See #830

That one is a fork which uses account credentials. See #830
ghost commented 2023-08-15 11:49:03 -04:00 (Migrated from github.com)

I am aware but couldn't nitter implement a system that aurora uses with lots of accounts that rotate per user?

I am aware but couldn't nitter implement a system that aurora uses with lots of accounts that rotate per user?
ghost commented 2023-08-15 12:07:52 -04:00 (Migrated from github.com)

I am aware but couldn't nitter implement a system that aurora uses with lots of accounts that rotate per user?

That's hard to maintain and simple for twitter to ban by just filtering "if number of accounts per IP > SOME_CONSTANT: ban all of them"

> I am aware but couldn't nitter implement a system that aurora uses with lots of accounts that rotate per user? That's hard to maintain and simple for twitter to ban by just filtering "if number of accounts per IP > SOME_CONSTANT: ban all of them"
ghost commented 2023-08-15 12:35:47 -04:00 (Migrated from github.com)

Looks like https://nitter.privacydev.net/ is working

User feeds not working on this

> Looks like https://nitter.privacydev.net/ is working User feeds not working on this
dawnerd commented 2023-08-15 12:39:26 -04:00 (Migrated from github.com)

I switched to the privacydevel fork, credentials in but its still 404ing the same endpoint upstream is having problems with

I switched to the privacydevel fork, credentials in but its still 404ing the same endpoint upstream is having problems with
intuser commented 2023-08-15 12:57:46 -04:00 (Migrated from github.com)

Strange. privacydev (without credentials) works more or less for @elonmusk, but not for other users like for instance @barackobama.

Strange. privacydev (without credentials) works more or less for @elonmusk, but not for other users like for instance @barackobama.
ghost commented 2023-08-15 13:42:43 -04:00 (Migrated from github.com)

It could be cached tbf

It could be cached tbf
ultrajae commented 2023-08-15 14:22:57 -04:00 (Migrated from github.com)

Also, the syndication api for showReplies=true does not work anymore: https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true but showReplies=false still works, showing the tweets ordered by like count... https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false

Not logged in, pulling a TL in the normal fashion (eg. twitter.com/elonmusk) supplies results like this as well.

Has this always (recently, since all the major upheavals) been the case?

> Also, the syndication api for `showReplies=true` does not work anymore: https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true but `showReplies=false` still works, showing the tweets ordered by like count... https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false Not logged in, pulling a TL in the normal fashion (eg. twitter.com/elonmusk) supplies results like this as well. Has this always (recently, since all the major upheavals) been the case?
intuser commented 2023-08-15 14:33:40 -04:00 (Migrated from github.com)

No. With a browser specific user agent up to a few days twitter/username would just show the profile and one tweet. Using "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" and coming from a tweet of the user the correct and fresh timeline was shown.

No. With a browser specific user agent up to a few days twitter/username would just show the profile and one tweet. Using "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" _and_ coming from a tweet of the user the correct and fresh timeline was shown.
ghost commented 2023-08-15 15:12:27 -04:00 (Migrated from github.com)

They patched it 😢

They patched it 😢
ghost commented 2023-08-15 15:35:53 -04:00 (Migrated from github.com)

Also, the syndication api for showReplies=true does not work anymore: https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true but showReplies=false still works, showing the tweets ordered by like count... https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false

Not logged in, pulling a TL in the normal fashion (eg. twitter.com/elonmusk) supplies results like this as well.

Has this always (recently, since all the major upheavals) been the case?

Yes. They switched the same time on the main page and the syndication api with showReplies=false to show the top 100 tweets. First, they changed the googlebot method from show the latest 20 tweets to the top 100. That was in the time, where twitter was completely locked without account and only googlebot method worked. When they found it a good solution to break scraping, they switched the other two to do the same. But since today, also showReplies=true does not work anymore.
Additionally, they removed timeline support completely on the "embed page". Thus, we can expect that timelines on the syndication api will go away completely within the next days or weeks (also top 100).

I assume, within the next 3 months, scraping without an account will not be possible anymore, besides top tweets. The top tweet method is a quite good solution for twitter: "normal users" without an account think Twitter is working perfectly fine, scrapers can't scrape anymore. Account-havers are not realizing any differences.

> > Also, the syndication api for `showReplies=true` does not work anymore: https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=true but `showReplies=false` still works, showing the tweets ordered by like count... https://syndication.twitter.com/srv/timeline-profile/screen-name/elonmusk?showReplies=false > > Not logged in, pulling a TL in the normal fashion (eg. twitter.com/elonmusk) supplies results like this as well. > > Has this always (recently, since all the major upheavals) been the case? Yes. They switched the same time on the main page and the syndication api with `showReplies=false` to show the top 100 tweets. First, they changed the googlebot method from show the latest 20 tweets to the top 100. That was in the time, where twitter was completely locked without account and only googlebot method worked. When they found it a good solution to break scraping, they switched the other two to do the same. But since today, also `showReplies=true` does not work anymore. Additionally, they removed timeline support completely on the "[embed page](https://publish.twitter.com/)". Thus, we can expect that timelines on the syndication api will go away completely within the next days or weeks (also top 100). I assume, within the next 3 months, scraping without an account will not be possible anymore, besides top tweets. The top tweet method is a quite good solution for twitter: "normal users" without an account think Twitter is working perfectly fine, scrapers can't scrape anymore. Account-havers are not realizing any differences.
WineAunt commented 2023-08-15 22:30:13 -04:00 (Migrated from github.com)

8493b396fd05f26fe681a6abe9a849dc983d091fd4472a53dc3aa72547b030c4

Same thing for I. On every device. I don't trust this Epstein and Nicole Junkermann affiliated Musk one bit.

> [ ](url)![8493b396fd05f26fe681a6abe9a849dc983d091fd4472a53dc3aa72547b030c4](https://github.com/zedeus/nitter/assets/71434691/2b770a6e-0792-4512-9b1a-1b79b228e371) Same thing for I. On every device. I don't trust this Epstein and Nicole Junkermann affiliated Musk one bit.
notherenorthere commented 2023-08-15 23:59:50 -04:00 (Migrated from github.com)

First of all thank you for everything that's been done so far sedeus and every one who's been helping and testing, I wish I could. So sorry to post this if it's irrelevant, but just found it and figured maybe it's related? TweetDeck is officially becoming a paid service

First of all thank you for everything that's been done so far sedeus and every one who's been helping and testing, I wish I could. So sorry to post this if it's irrelevant, but just found it and figured maybe it's related? [TweetDeck is officially becoming a paid service](https://www.theverge.com/2023/8/15/23833707/tweetdeck-xpro-paid-service-x-premium-twitter)
Apachez- commented 2023-08-16 00:45:51 -04:00 (Migrated from github.com)

While nitter is getting fixed I tried to visit the regular twitter url but noticed that the list of tweets isnt sorted by date anylonger but seems to be random and plenty of very old posts shows up?

It seems to be somewhat sorted based on number of likes (but scrolling down I see that the sorting is somewhat sloppy): https://twitter.com/elonmusk

Is this just me or did the sorting order break the other day aswell?

While nitter is getting fixed I tried to visit the regular twitter url but noticed that the list of tweets isnt sorted by date anylonger but seems to be random and plenty of very old posts shows up? It seems to be somewhat sorted based on number of likes (but scrolling down I see that the sorting is somewhat sloppy): https://twitter.com/elonmusk Is this just me or did the sorting order break the other day aswell?
Bismanpal-Singh commented 2023-08-16 01:53:11 -04:00 (Migrated from github.com)

I found this alternative https://twstalker.com which seems to be working , can it be used to scrape data as well like nitter was used before?

I found this alternative https://twstalker.com which seems to be working , can it be used to scrape data as well like nitter was used before?
ghost commented 2023-08-16 06:40:20 -04:00 (Migrated from github.com)

Working Nitter Instances (As of posting):
https://tweet.whateveritworks.org/ (Rate Limited as of 16/8 14:54)
https://nitter.privacydev.net/

These instances currently only support tweet searching

Working Nitter Instances (As of posting): https://tweet.whateveritworks.org/ (Rate Limited as of 16/8 14:54) https://nitter.privacydev.net/ **These instances currently only support tweet searching**
zedeus commented 2023-08-16 07:18:02 -04:00 (Migrated from github.com)

@Bismanpal-Singh No idea how that one works, it's a strange shady closed-source site I thought at first it was all cached, but it has new tweets too. Might just be a huge account pool, or maybe they reverse engineered the guest account thing, dunno.

@Bismanpal-Singh No idea how that one works, it's a strange shady closed-source site I thought at first it was all cached, but it has new tweets too. Might just be a huge account pool, or maybe they reverse engineered the guest account thing, dunno.
Bismanpal-Singh commented 2023-08-16 07:21:44 -04:00 (Migrated from github.com)

@Bismanpal-Singh No idea how that one works, it's a strange shady closed-source site I thought at first it was all cached, but it has new tweets too. Might just be a huge account pool, or maybe they reverse engineered the guest account thing, dunno.

Fine , gonna be cautious of it for now , any idea till when we'll get nitter back up and running?

> @Bismanpal-Singh No idea how that one works, it's a strange shady closed-source site I thought at first it was all cached, but it has new tweets too. Might just be a huge account pool, or maybe they reverse engineered the guest account thing, dunno. Fine , gonna be cautious of it for now , any idea till when we'll get nitter back up and running?
zedeus commented 2023-08-16 07:22:37 -04:00 (Migrated from github.com)

Nope, I don't have much hope and the only solution left is complex.

Nope, I don't have much hope and the only solution left is complex.
vulet commented 2023-08-16 07:23:26 -04:00 (Migrated from github.com)

@Bismanpal-Singh No idea how that one works, it's a strange shady closed-source site I thought at first it was all cached, but it has new tweets too. Might just be a huge account pool, or maybe they reverse engineered the guest account thing, dunno.

Shouldn't they be open-source as of GPL licensing?

> @Bismanpal-Singh No idea how that one works, it's a strange shady closed-source site I thought at first it was all cached, but it has new tweets too. Might just be a huge account pool, or maybe they reverse engineered the guest account thing, dunno. Shouldn't they be open-source as of GPL licensing?
Bismanpal-Singh commented 2023-08-16 07:24:52 -04:00 (Migrated from github.com)

Nope, I don't have much hope and the only solution left is complex.

All the best, hoping everything works out soon!

> Nope, I don't have much hope and the only solution left is complex. All the best, hoping everything works out soon!
intuser commented 2023-08-16 07:45:34 -04:00 (Migrated from github.com)

Working Nitter Instances (As of posting): https://tweet.whateveritworks.org/ https://nitter.privacydev.net

These instances currently only support tweet searching

Don't know why, but https://tweet.whateveritworks.org/ works much better. https://nitter.privacydev.net returns many empty results, "Load more" returns nothing and many tweets found cannot be accessed.

> Working Nitter Instances (As of posting): https://tweet.whateveritworks.org/ https://nitter.privacydev.net > > **These instances currently only support tweet searching** Don't know why, but https://tweet.whateveritworks.org/ works much better. https://nitter.privacydev.net returns many empty results, "Load more" returns nothing and many tweets found cannot be accessed.
intuser commented 2023-08-16 08:05:25 -04:00 (Migrated from github.com)

@vulet Why do you think that https://twstalker.com uses the GPL?

@vulet Why do you think that https://twstalker.com uses the GPL?
vulet commented 2023-08-16 09:13:43 -04:00 (Migrated from github.com)

@vulet Why do you think that https://twstalker.com uses the GPL?

Sorry that one doesn't look like Nitter, I didn't mean that one.

> @vulet Why do you think that https://twstalker.com uses the GPL? Sorry that one doesn't look like Nitter, I didn't mean that one.
ghost commented 2023-08-16 09:57:29 -04:00 (Migrated from github.com)

Nitter is working but in limited capacity, tweet searching and user searching works but profile viewing doesn't

Nitter is working but in limited capacity, tweet searching and user searching works but profile viewing doesn't
ghost commented 2023-08-16 10:06:39 -04:00 (Migrated from github.com)

Nitter works fully now, tweets are loading but requires a couple refreshes of the page. All nitter needs is a auto refresh system to keep fetching tweets when an error occurs.

Nitter works fully now, tweets are loading but requires a couple refreshes of the page. All nitter needs is a auto refresh system to keep fetching tweets when an error occurs.
ghost commented 2023-08-16 10:09:12 -04:00 (Migrated from github.com)

still not working for profile viewing here
image

still not working for profile viewing here ![image](https://github.com/zedeus/nitter/assets/140849101/bacf1f7d-7607-449d-bd87-f804db310d1c)
chbrown1293 commented 2023-08-16 10:14:35 -04:00 (Migrated from github.com)

I can load profiles and tweets with multiple refreshes as well.

I can load profiles and tweets with multiple refreshes as well.
intuser commented 2023-08-16 10:24:46 -04:00 (Migrated from github.com)

Can anybody indicate some instances which are working? The only one I found is https://tweet.whateveritworks.org and that's rate limited a the moment.

Can anybody indicate some instances which are working? The only one I found is https://tweet.whateveritworks.org and that's rate limited a the moment.
ghost commented 2023-08-16 10:41:40 -04:00 (Migrated from github.com)

Some shorter search queries work randomly each ~8th time. Longer queries don't seem to work...

Some shorter search queries work randomly each ~8th time. Longer queries don't seem to work...
ozanbayram commented 2023-08-16 11:10:13 -04:00 (Migrated from github.com)

I just need to twitter user's latest tweet without delay.
I used https://syndication.twitter.com/srv/timeline-profile/screen-name/XXX?showReplies=true but doesnt work anymore. https://twstalker.com/ has delay. Is there any advice?

I just need to twitter user's latest tweet without delay. I used `https://syndication.twitter.com/srv/timeline-profile/screen-name/XXX?showReplies=true` but doesnt work anymore. https://twstalker.com/ has delay. Is there any advice?
ghost commented 2023-08-16 11:29:28 -04:00 (Migrated from github.com)

Sadly not, unless you use the official twitter app without an account

Sadly not, unless you use the official twitter app without an account
dhdurgee commented 2023-08-16 11:43:58 -04:00 (Migrated from github.com)

Still not working here:

`https://nitter.net/MarkDavis/with_replies

An error has occured in one of your routes.

Detail: fatal.nim(53) sysFatal
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
packedjson.nim(294, 19) false unexpected end of object`

Dave

Still not working here: `https://nitter.net/MarkDavis/with_replies An error has occured in one of your routes. Detail: fatal.nim(53) sysFatal asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read packedjson.nim(294, 19) `false` unexpected end of object` Dave
dawnerd commented 2023-08-16 11:45:02 -04:00 (Migrated from github.com)

yeah looks like its completely dead again

yeah looks like its completely dead again
ghost commented 2023-08-16 11:48:20 -04:00 (Migrated from github.com)

Sadly it is

Sadly it is
veilm commented 2023-08-16 11:48:33 -04:00 (Migrated from github.com)

Regarding the idea of users submitting their own account credentials that Nitter will use for scraping, how likely is it that the user could get banned? Is there any way for Twitter to distinguish between somebody actually using the official Twitter web app and Nitter making raw queries to a reverse-engineered API?

As previously mentioned, Twitter can check for the number of accounts associated with a given IP, but that shouldn't be a problem with self-hosting. Rate limiting shouldn't be a large problem for RSS, since you can just have your RSS feeds update less frequently.

Regarding the idea of users submitting their own account credentials that Nitter will use for scraping, how likely is it that the user could get banned? Is there any way for Twitter to distinguish between somebody actually using the official Twitter web app and Nitter making raw queries to a reverse-engineered API? As previously mentioned, Twitter can check for the number of accounts associated with a given IP, but that shouldn't be a problem with self-hosting. Rate limiting shouldn't be a large problem for RSS, since you can just have your RSS feeds update less frequently.
ghost commented 2023-08-16 11:58:17 -04:00 (Migrated from github.com)

This is risky, twitter can and will ban regular people for using their account as a scraper

This is risky, twitter can and will ban regular people for using their account as a scraper
intuser commented 2023-08-16 12:20:38 -04:00 (Migrated from github.com)

Can somebody explain: Using https://nitter.privacydev.net I mostly end up on an instance which calls itself (upper left corner) "nitter (SFW-BACKUP)". Then nothing works. (The kind of "error" changes: Mostly I get "502 Bad Gateway". Sometimes "Tweet not found" or "No items found".)

A few times the instance calls itself "nitter (O2)". Then there is some chance that I can do a search and visit the tweets found. (Only some chance, because often it moves back to "nitter (SFW-BACKUP".)

Can somebody explain: Using https://nitter.privacydev.net I mostly end up on an instance which calls itself (upper left corner) "nitter (SFW-BACKUP)". Then nothing works. (The kind of "error" changes: Mostly I get "502 Bad Gateway". Sometimes "Tweet not found" or "No items found".) A few times the instance calls itself "nitter (O2)". Then there is _some_ chance that I can do a search and visit the tweets found. (Only some chance, because often it moves back to "nitter (SFW-BACKUP".)
undefined-folder commented 2023-08-16 12:45:00 -04:00 (Migrated from github.com)

It suddenly worked for a bit then broke again soon after, as my feed reader was briefly able to update my feeds.

This is risky, twitter can and will ban regular people for using their account as a scraper

Well, the good news is that even if your Twitter account is permanently suspended at least you can still plug your token into the PrivacyDevel fork. That worked just fine for me, because nitter only needs to view tweets. The rate limiting shenanigans made me go back to upstream without a token though anyway.
(My account was flagged for looking like a bot because I hardly used it in favor of nitter, I wasn't causing trouble grr)

It suddenly worked for a bit then broke again soon after, as my feed reader was briefly able to update my feeds. > This is risky, twitter can and will ban regular people for using their account as a scraper Well, the good news is that even if your Twitter account is permanently suspended at least you can still plug your token into the PrivacyDevel fork. That worked just fine for me, because nitter only needs to view tweets. The rate limiting shenanigans made me go back to upstream without a token though anyway. (My account was flagged for looking like a bot because I hardly used it in favor of nitter, I wasn't causing trouble grr)
ghost commented 2023-08-16 13:42:55 -04:00 (Migrated from github.com)

I think that Twstalker only loads the first image or video in a post, so you'd still have to click through to the tweet to view the full content. So it's not optimal

I think that Twstalker only loads the first image or video in a post, so you'd still have to click through to the tweet to view the full content. So it's not optimal
Apachez- commented 2023-08-16 14:43:58 -04:00 (Migrated from github.com)

I think that Twstalker only loads the first image or video in a post, so you'd still have to click through to the tweet to view the full content. So it's not optimal

Still better than:

An error has occured in one of your routes.
Detail: fatal.nim(53) sysFatal
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
packedjson.nim(294, 19) `false` unexpected end of object
> I think that Twstalker only loads the first image or video in a post, so you'd still have to click through to the tweet to view the full content. So it's not optimal Still better than: ``` An error has occured in one of your routes. Detail: fatal.nim(53) sysFatal asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read packedjson.nim(294, 19) `false` unexpected end of object ```
null-routed commented 2023-08-16 15:05:25 -04:00 (Migrated from github.com)

Nope, I don't have much hope and the only solution left is complex.

And what would the "only solution left" be, exactly? Can we maybe learn anything from the way TwStalker does things, by any chance?

Probably reverse engineering the OAuth signature which is used by the app to authenticate API calls when used in guest mode. Upon examining the requests sent by the app in this mode, I noticed that the OAuth signature appears to be a straightforward OAuth 1.0a HMAC-SHA1 signature, as the one shown here .

However they are probably using a guest consumer secret / OAuth token secret pair to sign the request which I was not able to find as, unfortunately, my expertise in app reverse engineering is limited. Is anyone aware of ongoing work in this direction or has insights to share on this subject?

> > Nope, I don't have much hope and the only solution left is complex. > > And what would the "only solution left" be, exactly? Can we maybe learn anything from the way TwStalker does things, by any chance? Probably reverse engineering the OAuth signature which is used by the app to authenticate API calls when used in guest mode. Upon examining the requests sent by the app in this mode, I noticed that the OAuth signature appears to be a straightforward OAuth 1.0a HMAC-SHA1 signature, as the one shown [here](https://developer.twitter.com/en/docs/authentication/oauth-1-0a/creating-a-signature) . However they are probably using a guest consumer secret / OAuth token secret pair to sign the request which I was not able to find as, unfortunately, my expertise in app reverse engineering is limited. Is anyone aware of ongoing work in this direction or has insights to share on this subject?
Randomgold0 commented 2023-08-16 15:43:46 -04:00 (Migrated from github.com)

Perhaps this scraper that I randomly found on reddit could be of use?
https://old.reddit.com/r/Twitter/comments/15sohmk/found_a_way_to_scrape_any_twitter_profile_without/

Perhaps this scraper that I randomly found on reddit could be of use? https://old.reddit.com/r/Twitter/comments/15sohmk/found_a_way_to_scrape_any_twitter_profile_without/
ghost commented 2023-08-16 15:47:55 -04:00 (Migrated from github.com)

Perhaps this scraper that I randomly found on reddit could be of use? https://old.reddit.com/r/Twitter/comments/15sohmk/found_a_way_to_scrape_any_twitter_profile_without/

That tool uses https://nitter.poast.org

> Perhaps this scraper that I randomly found on reddit could be of use? https://old.reddit.com/r/Twitter/comments/15sohmk/found_a_way_to_scrape_any_twitter_profile_without/ That tool uses https://nitter.poast.org
ghost commented 2023-08-16 15:58:18 -04:00 (Migrated from github.com)

The twstalker page has 2021 as date on the page, maybe it's an old twitter app api that still works.
I think it is a MAC/Iphone/Ipad version or maybe some old hbbtv app or xbox/ps3 or so.

The twstalker page has 2021 as date on the page, maybe it's an old twitter app api that still works. I think it is a MAC/Iphone/Ipad version or maybe some old hbbtv app or xbox/ps3 or so.
BANKA2017 commented 2023-08-16 16:02:46 -04:00 (Migrated from github.com)

However they are probably using a guest consumer secret / OAuth token secret pair to sign the request which I was not able to find as, unfortunately, my expertise in app reverse engineering is limited. Is anyone aware of ongoing work in this direction or has insights to share on this subject?

* I am not the owner of TwStalker
I wrote a post in my blog but not in English... so

TL;DR

// if node.js          <- do not copy this line
// named package.json  <- do not copy this line
{ "type": "module" }
// Node v18.15.0 / Deno / Bun...

const TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w'
const TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'

const TW_ANDROID_BASIC_TOKEN = `Basic ${btoa(TW_CONSUMER_KEY+':'+TW_CONSUMER_SECRET)}`

const getBearerToken = async () => {
    const tmpTokenResponse = await (await fetch('https://api.twitter.com/oauth2/token', {
        headers: {
            Authorization: TW_ANDROID_BASIC_TOKEN,
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        method: 'post',
        body: 'grant_type=client_credentials'
    })).json()
    return Object.values(tmpTokenResponse).join(" ")
}
// The bearer token is immutable
// Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F
const bearer_token = await getBearerToken()

const guest_token = (await (await fetch("https://api.twitter.com/1.1/guest/activate.json", {
    headers: {
        Authorization: bearer_token
    },
    method: "post"
})).json()).guest_token

const flow_token = (await (await fetch('https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us', {
    headers: {
        Authorization: bearer_token,
        'Content-Type': 'application/json',
        'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)',
        'X-Twitter-API-Version': 5,
        'X-Twitter-Client': 'TwitterAndroid',
        'X-Twitter-Client-Version': '9.95.0-release.0',
        'OS-Version': '28',
        'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)',
        'X-Twitter-Active-User': 'yes',
        'X-Guest-Token': guest_token
    },
    method: 'post',
    body: '{"flow_token":null,"input_flow_data":{"country_code":null,"flow_context":{"start_location":{"location":"splash_screen"}},"requested_variant":null,"target_user_id":0},"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}'
})).json()).flow_token

const subtasks = (await (await fetch('https://api.twitter.com/1.1/onboarding/task.json', {
    headers: {
        Authorization: bearer_token,
        'Content-Type': 'application/json',
        'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)',
        'X-Twitter-API-Version': 5,
        'X-Twitter-Client': 'TwitterAndroid',
        'X-Twitter-Client-Version': '9.95.0-release.0',
        'OS-Version': '28',
        'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)',
        'X-Twitter-Active-User': 'yes',
        'X-Guest-Token': guest_token
    },
    method: 'post',
    body: '{"flow_token":"' + flow_token + '","subtask_inputs":[{"open_link":{"link":"next_link"},"subtask_id":"NextTaskOpenLink"}],"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}'
})).json()).subtasks

const account = subtasks.find(task => task.subtask_id === 'OpenAccount')?.open_account
console.log(account)
// If you get an object like below it is successful
// {
//     "user": {
//         "id": 168862000062124800,
//         "id_str": "168862000062124800",
//         "name": "Open App User",
//         "screen_name": "_LO_08072W00Z6G",
//         "user_type": "Soft"
//     },
//     "next_link": {
//         "link_type": "subtask",
//         "link_id": "next_link",
//         "subtask_id": "OpenAppFlowStartAccountSetupOpenLink"
//     },
//     "oauth_token": "168862000062124800-yOxTZxJc4nKGGJ0lik000069JgJJX",
//     "oauth_token_secret": "PSrSIwXo0000RvWvcwQ0000dLgay0000NbpvSztF6n",
//     "attribution_event": "signup"
// }

Known issues

  • Valid for about 1 month
  • The actual rate limit differs from the header x-rate-limit-limit from response. If you request the same endpoint six or seven times (not more than ten) within a short period of time, you will lose access to all timeline endpoints, which will be restored after a day.
  • The number of guest accounts that each ip can obtain per day is limited, and occasionally there is no limit (I obtained more than 800 guest accounts on 2023-07-20)
> However they are probably using a guest consumer secret / OAuth token secret pair to sign the request which I was not able to find as, unfortunately, my expertise in app reverse engineering is limited. Is anyone aware of ongoing work in this direction or has insights to share on this subject? \* I am not the owner of TwStalker I wrote a [post](https://blog.nest.moe/posts/how-to-crawl-twitter-with-android) in my blog but not in English... so TL;DR ```json // if node.js <- do not copy this line // named package.json <- do not copy this line { "type": "module" } ``` ```javascript // Node v18.15.0 / Deno / Bun... const TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w' const TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys' const TW_ANDROID_BASIC_TOKEN = `Basic ${btoa(TW_CONSUMER_KEY+':'+TW_CONSUMER_SECRET)}` const getBearerToken = async () => { const tmpTokenResponse = await (await fetch('https://api.twitter.com/oauth2/token', { headers: { Authorization: TW_ANDROID_BASIC_TOKEN, 'Content-Type': 'application/x-www-form-urlencoded' }, method: 'post', body: 'grant_type=client_credentials' })).json() return Object.values(tmpTokenResponse).join(" ") } // The bearer token is immutable // Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F const bearer_token = await getBearerToken() const guest_token = (await (await fetch("https://api.twitter.com/1.1/guest/activate.json", { headers: { Authorization: bearer_token }, method: "post" })).json()).guest_token const flow_token = (await (await fetch('https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us', { headers: { Authorization: bearer_token, 'Content-Type': 'application/json', 'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)', 'X-Twitter-API-Version': 5, 'X-Twitter-Client': 'TwitterAndroid', 'X-Twitter-Client-Version': '9.95.0-release.0', 'OS-Version': '28', 'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)', 'X-Twitter-Active-User': 'yes', 'X-Guest-Token': guest_token }, method: 'post', body: '{"flow_token":null,"input_flow_data":{"country_code":null,"flow_context":{"start_location":{"location":"splash_screen"}},"requested_variant":null,"target_user_id":0},"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}' })).json()).flow_token const subtasks = (await (await fetch('https://api.twitter.com/1.1/onboarding/task.json', { headers: { Authorization: bearer_token, 'Content-Type': 'application/json', 'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)', 'X-Twitter-API-Version': 5, 'X-Twitter-Client': 'TwitterAndroid', 'X-Twitter-Client-Version': '9.95.0-release.0', 'OS-Version': '28', 'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)', 'X-Twitter-Active-User': 'yes', 'X-Guest-Token': guest_token }, method: 'post', body: '{"flow_token":"' + flow_token + '","subtask_inputs":[{"open_link":{"link":"next_link"},"subtask_id":"NextTaskOpenLink"}],"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}' })).json()).subtasks const account = subtasks.find(task => task.subtask_id === 'OpenAccount')?.open_account console.log(account) // If you get an object like below it is successful // { // "user": { // "id": 168862000062124800, // "id_str": "168862000062124800", // "name": "Open App User", // "screen_name": "_LO_08072W00Z6G", // "user_type": "Soft" // }, // "next_link": { // "link_type": "subtask", // "link_id": "next_link", // "subtask_id": "OpenAppFlowStartAccountSetupOpenLink" // }, // "oauth_token": "168862000062124800-yOxTZxJc4nKGGJ0lik000069JgJJX", // "oauth_token_secret": "PSrSIwXo0000RvWvcwQ0000dLgay0000NbpvSztF6n", // "attribution_event": "signup" // } ``` ## Known issues - Valid for about 1 month - The actual rate limit differs from the header `x-rate-limit-limit` from response. If you request the same endpoint six or seven times (not more than ten) within a short period of time, you will lose access to all timeline endpoints, which will be restored after a day. - The number of guest accounts that each ip can obtain per day is limited, and occasionally there is no limit (I obtained more than 800 guest accounts on 2023-07-20)
zedeus commented 2023-08-16 16:58:55 -04:00 (Migrated from github.com)

Thanks a lot @BANKA2017, that's extremely valuable! I'm scared this method will break as well after being put into production, but it's totally possible large data mining companies are already using it, and Nitter wouldn't even make a dent. I'll look into implementing this in Nim soon and see where it takes us.

Thanks a lot @BANKA2017, that's extremely valuable! I'm scared this method will break as well after being put into production, but it's totally possible large data mining companies are already using it, and Nitter wouldn't even make a dent. I'll look into implementing this in Nim soon and see where it takes us.
null-routed commented 2023-08-16 17:50:03 -04:00 (Migrated from github.com)

However they are probably using a guest consumer secret / OAuth token secret pair to sign the request which I was not able to find as, unfortunately, my expertise in app reverse engineering is limited. Is anyone aware of ongoing work in this direction or has insights to share on this subject?

* I am not the owner of TwStalker

I wrote a post in my blog but not in English... so

This was exactly what I was missing! Thank you!

However I just noticed that on version 10.2 (iOS) they disabled the option to browse the app without an account, hope this doesn't mean bad news incoming

> > However they are probably using a guest consumer secret / OAuth token secret pair to sign the request which I was not able to find as, unfortunately, my expertise in app reverse engineering is limited. Is anyone aware of ongoing work in this direction or has insights to share on this subject? > > > > \* I am not the owner of TwStalker > > I wrote a [post](https://blog.nest.moe/posts/how-to-crawl-twitter-with-android) in my blog but not in English... so This was exactly what I was missing! Thank you! However I just noticed that on version 10.2 (iOS) they disabled the option to browse the app without an account, hope this doesn't mean bad news incoming
ghost commented 2023-08-16 19:28:46 -04:00 (Migrated from github.com)

Probably reverse engineering the OAuth signature which is used by the app to authenticate API calls when used in guest mode. Upon examining the requests sent by the app in this mode, I noticed that the OAuth signature appears to be a straightforward OAuth 1.0a HMAC-SHA1 signature, as the one shown here .

HMAC-SHA1 is never really "straightforward", as you have to hash:

  1. oauth_consumer_key
  2. oauth_nonce
  3. oauth_signature_method
  4. oauth_timestamp
  5. oauth_token
  6. request method
  7. entire request URL
  8. request query string

I would more describe it as "nightmare fuel". at any rate, here is a Go implementation if it helps:

https://github.com/1268/media/tree/main/twitter

> Probably reverse engineering the OAuth signature which is used by the app to authenticate API calls when used in guest mode. Upon examining the requests sent by the app in this mode, I noticed that the OAuth signature appears to be a straightforward OAuth 1.0a HMAC-SHA1 signature, as the one shown [here](https://developer.twitter.com/en/docs/authentication/oauth-1-0a/creating-a-signature) . HMAC-SHA1 is never really "straightforward", as you have to hash: 1. `oauth_consumer_key` 2. `oauth_nonce` 3. `oauth_signature_method` 4. `oauth_timestamp` 5. `oauth_token` 6. request method 7. entire request URL 8. request query string I would more describe it as "nightmare fuel". at any rate, here is a Go implementation if it helps: https://github.com/1268/media/tree/main/twitter
ghost commented 2023-08-17 00:03:53 -04:00 (Migrated from github.com)

However they are probably using a guest consumer secret / OAuth token secret pair to sign the request which I was not able to find as, unfortunately, my expertise in app reverse engineering is limited. Is anyone aware of ongoing work in this direction or has insights to share on this subject?

  • I am not the owner of TwStalker I wrote a post in my blog but not in English... so

TL;DR

// Node v18.15.0
// yarn add axios
import axios from 'axios'
const TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w'
const TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'

const TW_ANDROID_BASIC_TOKEN = `Basic ${btoa(TW_CONSUMER_KEY+':'+TW_CONSUMER_SECRET)}`

const getBearerToken = async () => {
    const tmpTokenResponse = await axios('https://api.twitter.com/oauth2/token', {
        headers: {
            Authorization: TW_ANDROID_BASIC_TOKEN,
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        method: 'post',
        data: 'grant_type=client_credentials'
    })
    return Object.values(tmpTokenResponse.data).join(" ")
}
// The bearer token is immutable
// Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F
const bearer_token = await getBearerToken()

const guest_token = (await axios("https://api.twitter.com/1.1/guest/activate.json", {
    headers: {
        Authorization: bearer_token
    },
    method: "post"
})).data.guest_token

const flow_token = (await axios('https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us', {
    headers: {
        Authorization: bearer_token,
        'Content-Type': 'application/json',
        'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)',
        'X-Twitter-API-Version': 5,
        'X-Twitter-Client': 'TwitterAndroid',
        'X-Twitter-Client-Version': '9.95.0-release.0',
        'OS-Version': '28',
        'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)',
        'X-Twitter-Active-User': 'yes',
        'X-Guest-Token': guest_token
    },
    method: 'post',
    data: '{"flow_token":null,"input_flow_data":{"country_code":null,"flow_context":{"start_location":{"location":"splash_screen"}},"requested_variant":null,"target_user_id":0},"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}'
})).data.flow_token

const subtasks = (await axios('https://api.twitter.com/1.1/onboarding/task.json', {
    headers: {
        Authorization: bearer_token,
        'Content-Type': 'application/json',
        'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)',
        'X-Twitter-API-Version': 5,
        'X-Twitter-Client': 'TwitterAndroid',
        'X-Twitter-Client-Version': '9.95.0-release.0',
        'OS-Version': '28',
        'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)',
        'X-Twitter-Active-User': 'yes',
        'X-Guest-Token': guest_token
    },
    method: 'post',
    data: '{"flow_token":"' + flow_token + '","subtask_inputs":[{"open_link":{"link":"next_link"},"subtask_id":"NextTaskOpenLink"}],"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}'
})).data.subtasks

const account = subtasks.find(task => task.subtask_id === 'OpenAccount')?.open_account
console.log(account)
// If you get an object like below it is successful
// {
//     "user": {
//         "id": 168862000062124800,
//         "id_str": "168862000062124800",
//         "name": "Open App User",
//         "screen_name": "_LO_08072W00Z6G",
//         "user_type": "Soft"
//     },
//     "next_link": {
//         "link_type": "subtask",
//         "link_id": "next_link",
//         "subtask_id": "OpenAppFlowStartAccountSetupOpenLink"
//     },
//     "oauth_token": "168862000062124800-yOxTZxJc4nKGGJ0lik000069JgJJX",
//     "oauth_token_secret": "PSrSIwXo0000RvWvcwQ0000dLgay0000NbpvSztF6n",
//     "attribution_event": "signup"
// }

Known issues

  • Valid for about 1 month
  • The actual rate limit differs from the header x-rate-limit-limit from response. If you request the same endpoint six or seven times (not more than ten) within a short period of time, you will lose access to all timeline endpoints, which will be restored after a day.
  • The number of guest accounts that each ip can obtain per day is limited, and occasionally there is no limit (I obtained more than 800 guest accounts on 2023-07-20)

Just tried it and It is giving Socket TimeOut Error I don't know why is there anything i should keep in check I am just copying this code into node and executing

> > However they are probably using a guest consumer secret / OAuth token secret pair to sign the request which I was not able to find as, unfortunately, my expertise in app reverse engineering is limited. Is anyone aware of ongoing work in this direction or has insights to share on this subject? > > * I am not the owner of TwStalker I wrote a [post](https://blog.nest.moe/posts/how-to-crawl-twitter-with-android) in my blog but not in English... so > > TL;DR > > ```js > // Node v18.15.0 > // yarn add axios > import axios from 'axios' > const TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w' > const TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys' > > const TW_ANDROID_BASIC_TOKEN = `Basic ${btoa(TW_CONSUMER_KEY+':'+TW_CONSUMER_SECRET)}` > > const getBearerToken = async () => { > const tmpTokenResponse = await axios('https://api.twitter.com/oauth2/token', { > headers: { > Authorization: TW_ANDROID_BASIC_TOKEN, > 'Content-Type': 'application/x-www-form-urlencoded' > }, > method: 'post', > data: 'grant_type=client_credentials' > }) > return Object.values(tmpTokenResponse.data).join(" ") > } > // The bearer token is immutable > // Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F > const bearer_token = await getBearerToken() > > const guest_token = (await axios("https://api.twitter.com/1.1/guest/activate.json", { > headers: { > Authorization: bearer_token > }, > method: "post" > })).data.guest_token > > const flow_token = (await axios('https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us', { > headers: { > Authorization: bearer_token, > 'Content-Type': 'application/json', > 'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)', > 'X-Twitter-API-Version': 5, > 'X-Twitter-Client': 'TwitterAndroid', > 'X-Twitter-Client-Version': '9.95.0-release.0', > 'OS-Version': '28', > 'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)', > 'X-Twitter-Active-User': 'yes', > 'X-Guest-Token': guest_token > }, > method: 'post', > data: '{"flow_token":null,"input_flow_data":{"country_code":null,"flow_context":{"start_location":{"location":"splash_screen"}},"requested_variant":null,"target_user_id":0},"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}' > })).data.flow_token > > const subtasks = (await axios('https://api.twitter.com/1.1/onboarding/task.json', { > headers: { > Authorization: bearer_token, > 'Content-Type': 'application/json', > 'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)', > 'X-Twitter-API-Version': 5, > 'X-Twitter-Client': 'TwitterAndroid', > 'X-Twitter-Client-Version': '9.95.0-release.0', > 'OS-Version': '28', > 'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)', > 'X-Twitter-Active-User': 'yes', > 'X-Guest-Token': guest_token > }, > method: 'post', > data: '{"flow_token":"' + flow_token + '","subtask_inputs":[{"open_link":{"link":"next_link"},"subtask_id":"NextTaskOpenLink"}],"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}' > })).data.subtasks > > const account = subtasks.find(task => task.subtask_id === 'OpenAccount')?.open_account > console.log(account) > // If you get an object like below it is successful > // { > // "user": { > // "id": 168862000062124800, > // "id_str": "168862000062124800", > // "name": "Open App User", > // "screen_name": "_LO_08072W00Z6G", > // "user_type": "Soft" > // }, > // "next_link": { > // "link_type": "subtask", > // "link_id": "next_link", > // "subtask_id": "OpenAppFlowStartAccountSetupOpenLink" > // }, > // "oauth_token": "168862000062124800-yOxTZxJc4nKGGJ0lik000069JgJJX", > // "oauth_token_secret": "PSrSIwXo0000RvWvcwQ0000dLgay0000NbpvSztF6n", > // "attribution_event": "signup" > // } > ``` > > ## Known issues > * Valid for about 1 month > * The actual rate limit differs from the header `x-rate-limit-limit` from response. If you request the same endpoint six or seven times (not more than ten) within a short period of time, you will lose access to all timeline endpoints, which will be restored after a day. > * The number of guest accounts that each ip can obtain per day is limited, and occasionally there is no limit (I obtained more than 800 guest accounts on 2023-07-20) Just tried it and It is giving Socket TimeOut Error I don't know why is there anything i should keep in check I am just copying this code into node and executing
BANKA2017 commented 2023-08-17 03:21:38 -04:00 (Migrated from github.com)

However I just noticed that on version 10.2 (iOS) they disabled the option to browse the app without an account, hope this doesn't mean bad news incoming

I don't have an iPhone, but on the iPad version I always get redirected to the login page, so this might be a feature specific to the Android version.

> However I just noticed that on version 10.2 (iOS) they disabled the option to browse the app without an account, hope this doesn't mean bad news incoming I don't have an iPhone, but on the iPad version I always get redirected to the login page, so this might be a feature specific to the Android version.
ghost commented 2023-08-17 04:06:58 -04:00 (Migrated from github.com)

It still works on Android so this workaround should still work

It still works on Android so this workaround should still work
null-routed commented 2023-08-17 04:09:20 -04:00 (Migrated from github.com)

I don't have an iPhone, but on the iPad version I always get redirected to the login page, so this might be a feature specific to the Android version.

It was possible until version 10.1 on iPhone too, but not anymore since 10.2, but maybe it's just me

> I don't have an iPhone, but on the iPad version I always get redirected to the login page, so this might be a feature specific to the Android version. It was possible until version 10.1 on iPhone too, but not anymore since 10.2, but maybe it's just me
zedeus commented 2023-08-17 20:03:26 -04:00 (Migrated from github.com)

Good news everyone! I conclude that it is possible to easily acquire thousands of guest accounts within just a few minutes by using proxies, and they are all usable from a single IP address without getting rate limited. The rate limits per account work the same way as guest tokens, with a 15 minute window of x requests being allowed. It is therefore 100% feasible to get Nitter back up and running, it just requires a bunch of proxies. I will also develop a service that fetches these continuously, and lets operators request guest accounts for their own instances without having to pay for proxies.

Just to be clear on what a "guest account" is, it's this strange anonymous account old versions of the Android and iOS apps used to make when you opened them for the first time. It doesn't use an email address, a password, or even a customizable username, and they cannot be viewed anywhere or logged into. For all intents and purposes it's essentially a set of temporary credentials API that work for about a month. Is is therefore not equivalent to setting up a bot farm to create fake X/Twitter accounts, and it's not quite the same route as Aurora (the Google Play store that used a very large pool of Google accounts).

Good news everyone! I conclude that it is possible to easily acquire thousands of *guest* accounts within just a few minutes by using proxies, and they are all usable from a single IP address without getting rate limited. The rate limits per account work the same way as guest _tokens_, with a 15 minute window of x requests being allowed. It is therefore 100% feasible to get Nitter back up and running, it just requires a bunch of proxies. I will also develop a service that fetches these continuously, and lets operators request guest accounts for their own instances without having to pay for proxies. Just to be clear on what a "guest account" is, it's this strange anonymous account old versions of the Android and iOS apps used to make when you opened them for the first time. It doesn't use an email address, a password, or even a customizable username, and they cannot be viewed anywhere or logged into. For all intents and purposes it's essentially a set of temporary credentials API that work for about a month. Is is therefore not equivalent to setting up a bot farm to create fake X/Twitter accounts, and it's not quite the same route as Aurora (the Google Play store that used a very large pool of Google accounts).
stop-treachery commented 2023-08-17 22:23:26 -04:00 (Migrated from github.com)

@zedeus I would advise not automating the process of giving instances access to your proxied guest accounts; verifying that someone actually has an instance up and running seems like a good idea to prevent abuse and DoS attacks on the proxy service

@zedeus I would advise not automating the process of giving instances access to your proxied guest accounts; verifying that someone actually has an instance up and running seems like a good idea to prevent abuse and DoS attacks on the proxy service
sclerometer commented 2023-08-18 01:52:27 -04:00 (Migrated from github.com)

@zedeus I would advise not automating the process of giving instances access to your proxied guest accounts; verifying that someone actually has an instance up and running seems like a good idea to prevent abuse and DoS attacks on the proxy service

that would prevent private instances, that are not reachable from the internet.

> @zedeus I would advise not automating the process of giving instances access to your proxied guest accounts; verifying that someone actually has an instance up and running seems like a good idea to prevent abuse and DoS attacks on the proxy service that would prevent private instances, that are not reachable from the internet.
zedeus commented 2023-08-18 05:11:48 -04:00 (Migrated from github.com)

@stop-treachery that's the plan! I'll have it so public instance operators can contact me via email or Matrix with proof that they operate a certain instance, so I can give them API credentials that will identify them and prevent one person from depleting the pool.

@sclerometer it won't prevent private instances, they'll just have to pay for their own proxies or use free ones. Why should I finance private instances?

@stop-treachery that's the plan! I'll have it so _public_ instance operators can contact me via email or Matrix with proof that they operate a certain instance, so I can give them API credentials that will identify them and prevent one person from depleting the pool. @sclerometer it won't prevent private instances, they'll just have to pay for their own proxies or use free ones. Why should I finance private instances?
ghost commented 2023-08-18 05:16:27 -04:00 (Migrated from github.com)

@zedeus is there any instance in public that works now or there isn't any way that we can have nitter instances like before 😭

@zedeus is there any instance in public that works now or there isn't any way that we can have nitter instances like before 😭
dawnerd commented 2023-08-18 05:19:31 -04:00 (Migrated from github.com)

@zedeus possible for private instances to just manually provide account credentials so they don’t need the guest keys? My instance is purely used to grab rss for some bots and I think it would fly under the radar so if that’s an option seems like a good solution for lower volume people.

@zedeus possible for private instances to just manually provide account credentials so they don’t need the guest keys? My instance is purely used to grab rss for some bots and I think it would fly under the radar so if that’s an option seems like a good solution for lower volume people.
ghost commented 2023-08-18 05:26:43 -04:00 (Migrated from github.com)

For my Use Case i make a few requests to the nitter instance in public to just get the latest tweet that's it is there any way i can do it

For my Use Case i make a few requests to the nitter instance in public to just get the latest tweet that's it is there any way i can do it
ghost commented 2023-08-18 05:27:10 -04:00 (Migrated from github.com)

With guest accounts, will +18 content finally return to nitter?

With guest accounts, will +18 content finally return to nitter?
BANKA2017 commented 2023-08-18 05:38:03 -04:00 (Migrated from github.com)

possible for private instances to just manually provide account credentials so they don’t need the guest keys

I think it's possible because both guest account and real account only need to provide oauth token and oauth token secret in the client, but it's much more troublesome than using cookies

will +18 content finally return to nitter

Maybe, it can load tweets those media flagged as sensitive

> possible for private instances to just manually provide account credentials so they don’t need the guest keys I think it's possible because both guest account and real account only need to provide oauth token and oauth token secret in the client, but it's much more troublesome than using cookies > will +18 content finally return to nitter Maybe, it can load tweets those media flagged as sensitive
zedeus commented 2023-08-18 07:05:14 -04:00 (Migrated from github.com)

@dawnerd it would be easier for you to use automatic guest account(s), there's just a weird inconsistent limit to how many you can get per IP per day, hence the need for proxies for bigger instances. If your instance has 1 user and you don't expect to make more than 500 requests every 15 minutes, then you won't even need proxies.

@dawnerd it would be easier for you to use automatic guest account(s), there's just a weird inconsistent limit to how many you can get per IP per day, hence the need for proxies for bigger instances. If your instance has 1 user and you don't expect to make more than 500 requests every 15 minutes, then you won't even need proxies.
ghost commented 2023-08-18 08:20:53 -04:00 (Migrated from github.com)

@zedeus do you know when this will be added to nitter.net?

@zedeus do you know when this will be added to nitter.net?
avasilic commented 2023-08-18 08:37:02 -04:00 (Migrated from github.com)

@ stop-treachery that's the plan! I'll have it so public instance operators can contact me via email or Matrix with proof that they operate a certain instance, so I can give them API credentials that will identify them and prevent one person from depleting the pool.

@ sclerometer it won't prevent private instances, they'll just have to pay for their own proxies or use free ones. Why should I finance private instances?

@zedeus Will you at least tell us where we can find some good proxies when this is implemented?

> @ stop-treachery that's the plan! I'll have it so _public_ instance operators can contact me via email or Matrix with proof that they operate a certain instance, so I can give them API credentials that will identify them and prevent one person from depleting the pool. > > > > @ sclerometer it won't prevent private instances, they'll just have to pay for their own proxies or use free ones. Why should I finance private instances? @zedeus Will you at least tell us where we can find some good proxies when this is implemented?
pilledgirl commented 2023-08-18 09:29:16 -04:00 (Migrated from github.com)

What the hell is a proxy, can someone explain this in simple terms? Will nitter be up again or not?

What the hell is a proxy, can someone explain this in simple terms? Will nitter be up again or not?
TheDanikReal commented 2023-08-18 09:33:30 -04:00 (Migrated from github.com)

What the hell is a proxy, can someone explain this in simple terms? Will nitter be up again or not?

Some people call proxies VPN, proxies on easy words are servers which will make requests to some domain you want to request from their side and redirect output to you

> What the hell is a proxy, can someone explain this in simple terms? Will nitter be up again or not? Some people call proxies VPN, proxies on easy words are servers which will make requests to some domain you want to request from their side and redirect output to you
veilm commented 2023-08-18 09:36:58 -04:00 (Migrated from github.com)

What the hell is a proxy, can someone explain this in simple terms? Will nitter be up again or not?

From what I understand, in the context of Nitter, a proxy would just be a service that takes a request meant for Twitter and routes it through a different server, which has a different IP. That way, one server hosting a Nitter instance can use any IP address out of the list of available proxies for accessing Twitter, instead of only being able to use its own single IP address. The point of this is to bypass blocks that Twitter has on the number of accounts that a single IP can use.

Will nitter be up again or not?

I think it's likely that it will be up again, considering Twitter's current architecture and the supported guest accounts, but it's possible that it will take a while for zedeus to develop the proxy service and for Nitter instance hosts to reach out properly. The official instance, nitter.net, will probably be the first to go back up.

> What the hell is a proxy, can someone explain this in simple terms? Will nitter be up again or not? From what I understand, in the context of Nitter, a proxy would just be a service that takes a request meant for Twitter and routes it through a different server, which has a different IP. That way, one server hosting a Nitter instance can use any IP address out of the list of available proxies for accessing Twitter, instead of only being able to use its own single IP address. The point of this is to bypass blocks that Twitter has on the number of accounts that a single IP can use. > Will nitter be up again or not? I think it's likely that it will be up again, considering Twitter's current architecture and the supported guest accounts, but it's possible that it will take a while for zedeus to develop the proxy service and for Nitter instance hosts to reach out properly. The official instance, nitter.net, will probably be the first to go back up.
sylware commented 2023-08-18 10:17:16 -04:00 (Migrated from github.com)

In my personal case, nitter is an interoperability interface for noscript/basic (x)html browsers. I was interested only in the anonymous access to read the twits of a few people/orgs, because they do their announcements there.

As far as I understand and roughly speaking, we now need a guest account per IP (which is non-sense in an IPv6 world, unless having an accurate tree of worldwide IPv6 prefixes).

Then in my case I would need some fixed IPv4/IPv6 address to create such a guest account probably with a yt-dlp kind of tool, and use that same tool to list the twits from some twitter accounts.

And nitter as a generic noscript/basic (x)html service would want a pool of such guest accounts/IPs (expecting nitter users to be reasonable and to deplete not the caps of guest accounts too quickly).

Don't forget, this is big tech: They want to force you to use their web engines ([blink|geeko]:google,[safari]:apple) and nothing else. Look at what is doing "kick.com": you don't have the "right" web engine (even browser), you cannot even access the site, and more and more big tech web apps (they aren't web sites) are doing the same, enabled by the "tech" of some shaddy companies.

They will force you to run all-the-time changing browser finger printing javascript programs in order to generate all-the-time changing auth credentials during a user session.

Ofc, they know nobody (unless Big Tech itself) will be able to implement a real alternative web engine (for instance coded in plain and simple C) able to handle those permanent javascript challenges.

In my personal case, interoperability tools like nitter can do so much without being official. Digital freedom needs regulation... hardcore big tech regulation for interoperability (for instance for push protocols we have irc, etc).

Well, I think nitter can give its community a try, but bad actors (whatever the reasons) may kill it for good.

In my personal case, nitter is an interoperability interface for noscript/basic (x)html browsers. I was interested only in the anonymous access to read the twits of a few people/orgs, because they do their announcements there. As far as I understand and roughly speaking, we now need a guest account per IP (which is non-sense in an IPv6 world, unless having an accurate tree of worldwide IPv6 prefixes). Then in my case I would need some fixed IPv4/IPv6 address to create such a guest account probably with a yt-dlp kind of tool, and use that same tool to list the twits from some twitter accounts. And nitter as a generic noscript/basic (x)html service would want a pool of such guest accounts/IPs (expecting nitter users to be reasonable and to deplete not the caps of guest accounts too quickly). Don't forget, this is big tech: They *want* to force you to use their web engines ([blink|geeko]:google,[safari]:apple) and nothing else. Look at what is doing "kick.com": you don't have the "right" web engine (even browser), you cannot even access the site, and more and more big tech web apps (they aren't web sites) are doing the same, enabled by the "tech" of some shaddy companies. They will force you to run all-the-time changing browser finger printing javascript programs in order to generate all-the-time changing auth credentials during a user session. Ofc, they know nobody (unless Big Tech itself) will be able to implement a real alternative web engine (for instance coded in plain and simple C) able to handle those permanent javascript challenges. In my personal case, interoperability tools like nitter can do so much without being official. Digital freedom needs regulation... hardcore big tech regulation for interoperability (for instance for push protocols we have irc, etc). Well, I think nitter can give its community a try, but bad actors (whatever the reasons) may kill it for good.
natmey commented 2023-08-18 10:29:24 -04:00 (Migrated from github.com)

it would be easier for you to use automatic guest account(s), there's just a weird inconsistent limit to how many you can get per IP per day, hence the need for proxies for bigger instances. If your instance has 1 user and you don't expect to make more than 500 requests every 15 minutes, then you won't even need proxies.

@zedeus Your desire to not support private instance access to your proxies makes sense to me.

For small private instance users (like myself), will the code to create the automatic guest accounts be included in the nitter codebase, or alternately as a standalone thing?

Aside from donating money to pay for proxies, do you think it will be possible for others to help in this effort by running a proxy and working with you to add it to the pool? This seems like it would be a much more clearly scoped commitment than running a public instance of nitter, in that (I'm guessing) traffic and use would be fairly consistent and predictable.

> it would be easier for you to use automatic guest account(s), there's just a weird inconsistent limit to how many you can get per IP per day, hence the need for proxies for bigger instances. If your instance has 1 user and you don't expect to make more than 500 requests every 15 minutes, then you won't even need proxies. @zedeus Your desire to not support private instance access to your proxies makes sense to me. For small private instance users (like myself), will the code to create the automatic guest accounts be included in the nitter codebase, or alternately as a standalone thing? Aside from donating money to pay for proxies, do you think it will be possible for others to help in this effort by running a proxy and working with you to add it to the pool? This seems like it would be a much more clearly scoped commitment than running a public instance of nitter, in that (I'm guessing) traffic and use would be fairly consistent and predictable.
WOnder93 commented 2023-08-18 10:51:38 -04:00 (Migrated from github.com)

Perhaps instead of a set of proxies it would be easier to request the guest accounts via Tor. That should use a random exit node for each request, yet you would only need to use one proxy on the client side (the address+port of your local Tor daemon). The only problem with that is if too many people use Tor for this, then the exit nodes may gradually hit the daily limit and it wouldn't work all the time. Or if Twitter blocks all known Tor exit nodes outright, that would also be a show stopper.

Perhaps instead of a set of proxies it would be easier to request the guest accounts via [Tor](https://www.torproject.org/). That should use a random exit node for each request, yet you would only need to use one proxy on the client side (the address+port of your local Tor daemon). The only problem with that is if too many people use Tor for this, then the exit nodes may gradually hit the daily limit and it wouldn't work all the time. Or if Twitter blocks all known Tor exit nodes outright, that would also be a show stopper.
zedeus commented 2023-08-18 11:18:00 -04:00 (Migrated from github.com)

So... it works. I'm going to implement it properly and get it live on nitter.net ASAP, then work on the guest account API.

image

@TheHCJ working on it, later today probably.
@net-tech sure, I can include a recommendation in the readme.
@natmey yes. I'll include it in Nitter one way or another, as a fallback if you don't have access to my API.
@WOnder93 that would likely be too slow and unreliable, if it even works at all. The proxy service I use has millions of residential proxies ("ethically sourced" whatever that means), and I doubt I'd get the same with Tor, but I suppose it could be an option.
@gfpj while theoretically possible I don't think that would happen. Besides I'm not creating accounts, I'm not agreeing to any ToS. They're "guest accounts" that get automatically created when you open the Android app for anonymous access. Don't give them good ideas though 😛

So... it works. I'm going to implement it properly and get it live on nitter.net ASAP, then work on the guest account API. ![image](https://github.com/zedeus/nitter/assets/9434921/7857a717-22a3-4ced-9df8-90d320f3be73) @TheHCJ working on it, later today probably. @net-tech sure, I can include a recommendation in the readme. @natmey yes. I'll include it in Nitter one way or another, as a fallback if you don't have access to my API. @WOnder93 that would likely be too slow and unreliable, if it even works at all. The proxy service I use has millions of residential proxies ("ethically sourced" whatever that means), and I doubt I'd get the same with Tor, but I suppose it could be an option. @gfpj while theoretically possible I don't think that would happen. Besides I'm not creating _accounts_, I'm not agreeing to any ToS. They're "guest accounts" that get automatically created when you open the Android app for anonymous access. Don't give them good ideas though :stuck_out_tongue:
zedeus commented 2023-08-18 18:46:20 -04:00 (Migrated from github.com)

nitter.net is officially back, with everything working better than ever before. Search is even back to functioning 100%, no more weird limited results requiring refreshes. Tomorrow I'll work on creating a simple service to acquire and provide guest accounts to public instances, and a simple fallback for small private ones that don't want to deal with proxies. As for now, please use nitter.net to your heart's delight and let's see if it remains stable.

[nitter.net](https://nitter.net) is officially back, with everything working better than ever before. Search is even back to functioning 100%, no more weird limited results requiring refreshes. Tomorrow I'll work on creating a simple service to acquire and provide guest accounts to public instances, and a simple fallback for small private ones that don't want to deal with proxies. As for now, please use nitter.net to your heart's delight and let's see if it remains stable.
veilm commented 2023-08-18 18:54:09 -04:00 (Migrated from github.com)

For those confused about 403s on nitter.net /rss URLs, see https://github.com/zedeus/nitter/issues/937

For those confused about 403s on nitter.net /rss URLs, see https://github.com/zedeus/nitter/issues/937
livreware commented 2023-08-18 19:24:19 -04:00 (Migrated from github.com)

I'd just like to thank zedeus and everyone else working on nitter. Not only have they built some quality software, but also continue to overcome twitter's restrictions in clever ways. Your ingenuity is inspiring! Thank you!

I'd just like to thank zedeus and everyone else working on nitter. Not only have they built some quality software, but also continue to overcome twitter's restrictions in clever ways. Your ingenuity is inspiring! Thank you!
ParamoreFan commented 2023-08-18 19:30:45 -04:00 (Migrated from github.com)

Not all instances are working though. I use unofficialbird.com and it still doesn't work

Not all instances are working though. I use unofficialbird.com and it still doesn't work
zedeus commented 2023-08-18 19:31:15 -04:00 (Migrated from github.com)

Only nitter.net is working, this isn't in master yet nor is there an established path forward for instance operators to get guest accounts yet.

Only nitter.net is working, this isn't in master yet nor is there an established path forward for instance operators to get guest accounts yet.
ParamoreFan commented 2023-08-18 19:33:22 -04:00 (Migrated from github.com)

nitter.net is officially back, with everything working better than ever before. Search is even back to functioning 100%, no more weird limited results requiring refreshes. Tomorrow I'll work on creating a simple service to acquire and provide guest accounts to public instances, and a simple fallback for small private ones that don't want to deal with proxies. As for now, please use nitter.net to your heart's delight and let's see if it remains stable.

Search still requires refreshes for me on nitter.net

> [nitter.net](https://nitter.net) is officially back, with everything working better than ever before. Search is even back to functioning 100%, no more weird limited results requiring refreshes. Tomorrow I'll work on creating a simple service to acquire and provide guest accounts to public instances, and a simple fallback for small private ones that don't want to deal with proxies. As for now, please use nitter.net to your heart's delight and let's see if it remains stable. Search still requires refreshes for me on nitter.net
unseenlarks commented 2023-08-18 19:33:31 -04:00 (Migrated from github.com)

thank you very much, @zedeus.

thank you very much, @zedeus.
zedeus commented 2023-08-18 19:40:54 -04:00 (Migrated from github.com)

@ParamoreFan I'm not seeing that behavior at all. Do you have an example query that makes it happen consistently?

@ParamoreFan I'm not seeing that behavior at all. Do you have an example query that makes it happen consistently?
ParamoreFan commented 2023-08-18 19:44:07 -04:00 (Migrated from github.com)

@ParamoreFan I'm not seeing that behavior at all. Do you have an example query that makes it happen consistently?

Screenshot (1760)

> @ParamoreFan I'm not seeing that behavior at all. Do you have an example query that makes it happen consistently? ![Screenshot (1760)](https://github.com/zedeus/nitter/assets/123844185/2bc413a3-5030-430b-9f1b-198151406539)
zedeus commented 2023-08-18 19:44:40 -04:00 (Migrated from github.com)

That's not nitter.net
image

That's not nitter.net ![image](https://github.com/zedeus/nitter/assets/9434921/7230b879-9ef1-4b1d-9ef8-f32e793a2e78)
ParamoreFan commented 2023-08-18 19:45:33 -04:00 (Migrated from github.com)

That's not nitter.net image

I used Ublock Origin to collapse some elements, so the nitter text on the top left is gone

> That's not nitter.net ![image](https://user-images.githubusercontent.com/9434921/261731448-7230b879-9ef1-4b1d-9ef8-f32e793a2e78.png) I used Ublock Origin to collapse some elements, so the nitter text on the top left is gone
ghost commented 2023-08-18 20:01:30 -04:00 (Migrated from github.com)

Sorry, I don't mean to derail the thread but are rss feeds going to be back ? On nitter.net they seem to be disabled.
https://nitter.net/NASA/rss

Sorry, I don't mean to derail the thread but are rss feeds going to be back ? On nitter.net they seem to be disabled. https://nitter.net/NASA/rss
veilm commented 2023-08-18 20:03:49 -04:00 (Migrated from github.com)

Sorry, I don't mean to detail the thread but are rss feeds going to be back ? On nitter.net they seem to be disabled. https://nitter.net/NASA/rss

RSS feeds are only disabled on the main instance, nitter.net. zedeus has said that they are planned to be back in the future (https://github.com/zedeus/nitter/issues/937). Once other public instances can acquire guest accounts, you'll also be able to use any of them for RSS feeds.

> Sorry, I don't mean to detail the thread but are rss feeds going to be back ? On nitter.net they seem to be disabled. https://nitter.net/NASA/rss RSS feeds are only disabled on the main instance, nitter.net. zedeus has said that they are planned to be back in the future (https://github.com/zedeus/nitter/issues/937). Once other public instances can acquire guest accounts, you'll also be able to use any of them for RSS feeds.
zedeus commented 2023-08-18 20:04:37 -04:00 (Migrated from github.com)

@ParamoreFan The verified icons are also gone. Are you sure this is actually nitter.net? Is something weird going on with your browser? I can't replicate it no matter how many times I refresh.

@ParamoreFan The verified icons are also gone. Are you sure this is actually nitter.net? Is something weird going on with your browser? I can't replicate it no matter how many times I refresh.
veilm commented 2023-08-18 20:14:00 -04:00 (Migrated from github.com)

@ParamoreFan The verified icons are also gone. Are you sure this is actually nitter.net? Is something weird going on with your browser? I can't replicate it no matter how many times I refresh.

I'm not ParamoreFan but I was able to replicate it occasionally:

temp

Around 30 minutes ago, I refreshed around 30 times and only saw it happen once. Around three minutes ago, I saw it happen around 30% of the time for around 50 refreshes. Now, I have refreshed around 15 times without seeing it. So, it seems to be inconsistent.

I have Brave Shields on in the screenshot, but I've been able to replicate it with them on and off, so I don't think they're affecting it.

> @ParamoreFan The verified icons are also gone. Are you sure this is actually nitter.net? Is something weird going on with your browser? I can't replicate it no matter how many times I refresh. I'm not ParamoreFan but I was able to replicate it occasionally: ![temp](https://github.com/zedeus/nitter/assets/57649592/c0b8b5a3-e7c6-49d8-ab72-b896de41e72e) Around 30 minutes ago, I refreshed around 30 times and only saw it happen once. Around three minutes ago, I saw it happen around 30% of the time for around 50 refreshes. Now, I have refreshed around 15 times without seeing it. So, it seems to be inconsistent. I have Brave Shields on in the screenshot, but I've been able to replicate it with them on and off, so I don't think they're affecting it.
R0ci0-V3rd3al commented 2023-08-18 20:16:39 -04:00 (Migrated from github.com)

oh how I tired me have I of elon musk, I can't even enter my twitter account now x.com.. thanks zedeus now it works very well nitter as you fixed it.... nitter.net works in all old browsers with opera 8 with TLS 1.2 on my nokia s40, on android all the browsers where I tried it, the app. The truth is that without your invention of nitter I would not have been able to view twitter I couldn't even see my inaccessible twitter account... thank you very much!! :D

oh how I tired me have I of elon musk, I can't even enter my twitter account now x.com.. thanks zedeus now it works very well nitter as you fixed it.... nitter.net works in all old browsers with opera 8 with TLS 1.2 on my nokia s40, on android all the browsers where I tried it, the app. The truth is that without your invention of nitter I would not have been able to view twitter I couldn't even see my inaccessible twitter account... thank you very much!! :D
zedeus commented 2023-08-18 20:22:21 -04:00 (Migrated from github.com)

@michaelskyba the rate limit for search is only 50, so it's possible but somewhat unlikely that it's already getting hit on all of my 1500 guest accounts. I'm using the same search endpoint and thus small rate limit for user search, but I'm going to replace that tomorrow with another one.

@michaelskyba the rate limit for search is only 50, so it's possible but somewhat unlikely that it's already getting hit on all of my 1500 guest accounts. I'm using the same search endpoint and thus small rate limit for user search, but I'm going to replace that tomorrow with another one.
ParamoreFan commented 2023-08-18 20:31:13 -04:00 (Migrated from github.com)

@ParamoreFan The verified icons are also gone. Are you sure this is actually nitter.net? Is something weird going on with your browser? I can't replicate it no matter how many times I refresh.

I used ublock origin to get rid of verified

> @ParamoreFan The verified icons are also gone. Are you sure this is actually nitter.net? Is something weird going on with your browser? I can't replicate it no matter how many times I refresh. I used ublock origin to get rid of verified
zedeus commented 2023-08-18 20:35:20 -04:00 (Migrated from github.com)

I saw it myself, looking into it.

I saw it myself, looking into it.
intuser commented 2023-08-18 21:24:21 -04:00 (Migrated from github.com)

First: Many thanks. It started out well, but now I get: "Instance has been rate limited."

nitter.net is officially back, with everything working better than ever before. Search is even back to functioning 100%, no more weird limited results requiring refreshes. Tomorrow I'll work on creating a simple service to acquire and provide guest accounts to public instances, and a simple fallback for small private ones that don't want to deal with proxies. As for now, please use nitter.net to your heart's delight and let's see if it remains stable.

First: Many thanks. It started out well, but now I get: "Instance has been rate limited."

First: Many thanks. It started out well, but now I get: "Instance has been rate limited." > [nitter.net](https://nitter.net) is officially back, with everything working better than ever before. Search is even back to functioning 100%, no more weird limited results requiring refreshes. Tomorrow I'll work on creating a simple service to acquire and provide guest accounts to public instances, and a simple fallback for small private ones that don't want to deal with proxies. As for now, please use nitter.net to your heart's delight and let's see if it remains stable. First: Many thanks. It started out well, but now I get: "Instance has been rate limited."
zedeus commented 2023-08-18 21:27:16 -04:00 (Migrated from github.com)

I was swapping out accounts and doing some code changes, it's working again for now.

I was swapping out accounts and doing some code changes, it's working again for now.
intuser commented 2023-08-18 21:28:20 -04:00 (Migrated from github.com)

Yes! And thanks again!

Yes! And thanks again!
2011 commented 2023-08-18 21:37:54 -04:00 (Migrated from github.com)

@zedeus Nitter.net has not worked for me at all for a few weeks (other instances have, subject to the Twitter/X restrictions). Depending on the browser and configuration, I get a blank page with either "This site can’t be reached nitter.net unexpectedly closed the connection" or "This page isn’t working nitter.net didn’t send any data" messages. Does nitter.net block any IP addresses?

@zedeus Nitter.net has not worked for me at all for a few weeks (other instances have, subject to the Twitter/X restrictions). Depending on the browser and configuration, I get a blank page with either "This site can’t be reached nitter.net unexpectedly closed the connection" or "This page isn’t working nitter.net didn’t send any data" messages. Does nitter.net block any IP addresses?
zedeus commented 2023-08-18 21:41:59 -04:00 (Migrated from github.com)

nitter.net blocks over 68k IP ranges owned by hosting companies and businesses, and hundreds of abusive IP addresses. If you want me to check whether your IP address is blocked feel free to send it via email.

nitter.net blocks over 68k IP ranges owned by hosting companies and businesses, and hundreds of abusive IP addresses. If you want me to check whether your IP address is blocked feel free to send it via email.
intuser commented 2023-08-18 23:14:58 -04:00 (Migrated from github.com)

I was swapping out accounts and doing some code changes, it's working again for now.

Hmm. Worked well for some time. Now I get again: "rate limited" or sometimes "no item found".

> I was swapping out accounts and doing some code changes, it's working again for now. Hmm. Worked well for some time. Now I get again: "rate limited" or sometimes "no item found".
notherenorthere commented 2023-08-18 23:42:12 -04:00 (Migrated from github.com)

@zedeus thank you so much!! Two q: is it possible the tweets & replies is broken? I can see timelines when it's just tweets, but it's 'No items found' if I click t&r.
Are gifs supposed to be broken? I'm just super grateful it's back up and running please don't get me wrong, I just don't know if it's my addons or nitter having some issues due to EM breaking everything (regular users were btching on twt some hrs ago about its video feature)

@zedeus thank you so much!! Two q: is it possible the tweets & replies is broken? I can see timelines when it's just tweets, but it's 'No items found' if I click t&r. Are gifs supposed to be broken? I'm just super grateful it's back up and running please don't get me wrong, I just don't know if it's my addons or nitter having some issues due to EM breaking everything (regular users were btching on twt some hrs ago about its video feature)
ultrajae commented 2023-08-19 00:20:21 -04:00 (Migrated from github.com)

@zedeus thank you so much!! Two q: is it possible the tweets & replies is broken? I can see timelines when it's just tweets, but it's 'No items found' if I click t&r.

Same here

> @zedeus thank you so much!! Two q: is it possible the tweets & replies is broken? I can see timelines when it's just tweets, but it's 'No items found' if I click t&r. Same here
Apachez- commented 2023-08-19 02:20:43 -04:00 (Migrated from github.com)

It (nitter.net) worked last night but give or take 20% of the requests ended up with "No items found" where the list of tweets is supposed to be (everything else like profile banner, sideinfo etc incl background picture at profile header seems to be working all the time). Fixed by reloading the page 1-4 times.

Now 100% of the requests ends up with "No items found" at the tweetlist :-(

It (nitter.net) worked last night but give or take 20% of the requests ended up with "No items found" where the list of tweets is supposed to be (everything else like profile banner, sideinfo etc incl background picture at profile header seems to be working all the time). Fixed by reloading the page 1-4 times. Now 100% of the requests ends up with "No items found" at the tweetlist :-(
TempUser13 commented 2023-08-19 03:23:53 -04:00 (Migrated from github.com)

nitter.net blocks over 68k IP ranges owned by hosting companies and businesses, and hundreds of abusive IP addresses. If you want me to check whether your IP address it blocked feel free to send it via email.

Seems like the IP addresses used by Mullvad are blocked too cause I can't connect to your instance.

> nitter.net blocks over 68k IP ranges owned by hosting companies and businesses, and hundreds of abusive IP addresses. If you want me to check whether your IP address it blocked feel free to send it via email. Seems like the IP addresses used by Mullvad are blocked too cause I can't connect to your instance.
beerisgood commented 2023-08-19 04:45:25 -04:00 (Migrated from github.com)

Not related to this issue but may helpful for some guys:

For myself I solved the problem with this Twitter to ActivityPub (e.g. Mastodon) bridge: https://bird.makeup

Not related to this issue but may helpful for some guys: For myself I solved the problem with this Twitter to ActivityPub (e.g. Mastodon) bridge: https://bird.makeup
MoonlessForest commented 2023-08-19 05:07:58 -04:00 (Migrated from github.com)

nitter.net is officially back

Oddly, it doesn't seem to be working for me at all now, it just keeps loading indefinitely.

>nitter.net is officially back Oddly, it doesn't seem to be working for me at all now, it just keeps loading indefinitely.
ghost commented 2023-08-19 05:21:50 -04:00 (Migrated from github.com)

It (nitter.net) worked last night but give or take 20% of the requests ended up with "No items found" where the list of tweets is supposed to be (everything else like profile banner, sideinfo etc incl background picture at profile header seems to be working all the time). Fixed by reloading the page 1-4 times.

Now 100% of the requests ends up with "No items found" at the tweetlist :-(

same for me to

> It (nitter.net) worked last night but give or take 20% of the requests ended up with "No items found" where the list of tweets is supposed to be (everything else like profile banner, sideinfo etc incl background picture at profile header seems to be working all the time). Fixed by reloading the page 1-4 times. > > Now 100% of the requests ends up with "No items found" at the tweetlist :-( same for me to
ghost commented 2023-08-19 05:22:17 -04:00 (Migrated from github.com)

when will the issue will solve?

when will the issue will solve?
veilm commented 2023-08-19 06:00:14 -04:00 (Migrated from github.com)

temp

For me, the page load fines, but I only see this message, regardless of refreshing. https://nitter.net/nearcyan works, though, but not https://nitter.net/nearcyan/with_replies.

![temp](https://github.com/zedeus/nitter/assets/57649592/97a68c58-3f32-4566-8e48-add5b57f5bcc) For me, the page load fines, but I only see this message, regardless of refreshing. https://nitter.net/nearcyan works, though, but not https://nitter.net/nearcyan/with_replies.
Apachez- commented 2023-08-19 06:18:43 -04:00 (Migrated from github.com)

Now tweetlist seems to be working (for the moment) :-)

Or rather the /username works but not /username/with_replies (who still gives "No items found").

Now tweetlist seems to be working (for the moment) :-) Or rather the /username works but not /username/with_replies (who still gives "No items found").
zedeus commented 2023-08-19 07:16:42 -04:00 (Migrated from github.com)

Swapped guest accounts again. Using 37k accounts instead of 800-1500 this time, should help prevent or at the very least delay these rate limits.

Swapped guest accounts again. Using 37k accounts instead of 800-1500 this time, should help prevent or at the very least delay these rate limits.
Apachez- commented 2023-08-19 08:11:21 -04:00 (Migrated from github.com)

Seems to have resolved the previous issue with /username/with_replies not working.

Now both /username and /username/with_replies are fully functional - thanks! :-)

Seems to have resolved the previous issue with /username/with_replies not working. Now both /username and /username/with_replies are fully functional - thanks! :-)
edel79 commented 2023-08-19 08:16:59 -04:00 (Migrated from github.com)

The main Nitter instance must be very busy, being the only functionnal one at this time. I prefer to wait a few more days that the others runs well again than switching to the main.

Any idea when the other main public instances will be able to work again ?

The main Nitter instance must be very busy, being the only functionnal one at this time. I prefer to wait a few more days that the others runs well again than switching to the main. Any idea when the other main public instances will be able to work again ?
zer0fl0w commented 2023-08-19 08:21:25 -04:00 (Migrated from github.com)

great work.

please consider unblocking mullvad ip's like already mentioned here.

thanks.

great work. please consider unblocking mullvad ip's like already mentioned [here](https://github.com/zedeus/nitter/issues/983#issuecomment-1684877862). thanks.
ghost commented 2023-08-19 10:19:24 -04:00 (Migrated from github.com)

nitter.net blocks over 68k IP ranges owned by hosting companies and businesses, and hundreds of abusive IP addresses.

So, blocking VPNs by nitter.net is intentional or coolateral?

> nitter.net blocks over 68k IP ranges owned by hosting companies and businesses, and hundreds of abusive IP addresses. So, blocking VPNs by nitter.net is intentional or coolateral?
zedeus commented 2023-08-19 10:30:26 -04:00 (Migrated from github.com)

Collateral, they tend to use random data centers. Mullvad has a list of IPs but I can't find a list of IP ranges, and I'd rather not throw 700 IPs into an iptables file.

Collateral, they tend to use random data centers. Mullvad has a list of IPs but I can't find a list of IP ranges, and I'd rather not throw 700 IPs into an iptables file.
zer0fl0w commented 2023-08-19 11:18:19 -04:00 (Migrated from github.com)

understandable.

i will try to optain the ip ranges.
could take 2 days. will report back.

understandable. i will try to optain the ip ranges. could take 2 days. will report back.
zedeus commented 2023-08-19 11:48:07 -04:00 (Migrated from github.com)

Please do not scrape nitter.net

Please do not scrape nitter.net
zer0fl0w commented 2023-08-19 11:54:29 -04:00 (Migrated from github.com)

of course not. i asked their support to contribute. they have a good attitude towards inquiries.

of course not. i asked their support to contribute. they have a good attitude towards inquiries.
zedeus commented 2023-08-19 11:56:15 -04:00 (Migrated from github.com)

RSS feeds are cached for 15 minutes, so it makes a big difference in how traffic affects the service.

RSS feeds are cached for 15 minutes, so it makes a big difference in how traffic affects the service.
daspri commented 2023-08-19 12:13:29 -04:00 (Migrated from github.com)

Multiple accounts at once not quite working?

https://nitter.net/AccountableGOP,RonFilipkowski

No items found.

https://nitter.net/AccountableGOP,RonFilipkowski/with_replies

works. Sort of. Not all images/integrated web links show like they do on privacydev.net instance.

Multiple accounts at once not quite working? https://nitter.net/AccountableGOP,RonFilipkowski No items found. https://nitter.net/AccountableGOP,RonFilipkowski/with_replies works. Sort of. Not all images/integrated web links show like they do on privacydev.net instance.
zedeus commented 2023-08-19 12:19:53 -04:00 (Migrated from github.com)

Interesting, I'll look into it

Interesting, I'll look into it
ghost commented 2023-08-19 12:30:42 -04:00 (Migrated from github.com)

I'm just happy that the main instance is working again. Thanks for all the work you put in @zedeus. I have my own instance running on the Docker image, but I will happily wait until the image has been updated.

I'm just happy that the main instance is working again. Thanks for all the work you put in @zedeus. I have my own instance running on the Docker image, but I will happily wait until the image has been updated.
NicoBerlo commented 2023-08-19 12:33:31 -04:00 (Migrated from github.com)

Hi !
Every user I try on my nitter instance returns user not found. I seem to have a different error from other people ?
All I’m trying to do is getting the latest tweets :)

Hi ! Every user I try on my nitter instance returns user not found. I seem to have a different error from other people ? All I’m trying to do is getting the latest tweets :)
veilm commented 2023-08-19 12:37:17 -04:00 (Migrated from github.com)

Hi ! Every user I try on my nitter instance returns user not found. I seem to have a different error from other people ? All I’m trying to do is getting the latest tweets :)

Non-official instances are not expected to be working because the development of the guest account service hasn't been finished yet.

> Hi ! Every user I try on my nitter instance returns user not found. I seem to have a different error from other people ? All I’m trying to do is getting the latest tweets :) Non-official instances are not expected to be working because the development of the guest account service hasn't been finished yet.
NicoBerlo commented 2023-08-19 12:39:03 -04:00 (Migrated from github.com)

Non-official instances are not expected to be working because the development of the guest account service hasn't been finished yet.

Ok thanks !

> > Non-official instances are not expected to be working because the development of the guest account service hasn't been finished yet. Ok thanks !
ImTheDeveloper commented 2023-08-19 12:44:03 -04:00 (Migrated from github.com)

@BANKA2017 when running the onboarding/task.json end-point to get the guest account I'm actually hitting the following:

image

Ever seen it go to here before? Looks as though I'm ending up with OpenWelcomeFlowLink instead OpenAccount being returned.

@BANKA2017 when running the onboarding/task.json end-point to get the guest account I'm actually hitting the following: ![image](https://github.com/zedeus/nitter/assets/1431348/9017377d-3abb-42a0-a90c-876f422037cf) Ever seen it go to here before? Looks as though I'm ending up with OpenWelcomeFlowLink instead OpenAccount being returned.
Thorvarium commented 2023-08-19 13:05:30 -04:00 (Migrated from github.com)
why is the rss path returning forbidden? https://nitter.net/search/rss?f=tweets&q=test&since=&until=&near=
BANKA2017 commented 2023-08-19 13:16:11 -04:00 (Migrated from github.com)

Ever seen it go to here before?

@ImTheDeveloper Yes, there are situations where the response does not contain OpenAccount, and I don’t know the reason for this yet.

> Ever seen it go to here before? @ImTheDeveloper Yes, there are situations where the response does not contain *OpenAccount*, and I don’t know the reason for this yet.
zedeus commented 2023-08-19 13:22:13 -04:00 (Migrated from github.com)

@ImTheDeveloper They use a flow with various steps to handle account creation, guest account creation, logging in, etc. There's a step for verifying your email for example. The app navigates these steps, but I haven't found a way to cancel that flow to return it tho the beginning, except for using a new IP address. If someone could figure out a way to reset the flow that would be wonderful.

@ImTheDeveloper They use a flow with various steps to handle account creation, guest account creation, logging in, etc. There's a step for verifying your email for example. The app navigates these steps, but I haven't found a way to cancel that flow to return it tho the beginning, except for using a new IP address. If someone could figure out a way to reset the flow that would be wonderful.
zedeus commented 2023-08-19 13:23:22 -04:00 (Migrated from github.com)

@Thorvarium it's disabled still. It'll be turned back on when all of this is over and things are stable enough.

@Thorvarium it's disabled still. It'll be turned back on when all of this is over and things are stable enough.
zedeus commented 2023-08-19 16:02:28 -04:00 (Migrated from github.com)

All Mullvad IPs have been added to a whitelist.

All Mullvad IPs have been added to a whitelist.
zer0fl0w commented 2023-08-19 17:52:36 -04:00 (Migrated from github.com)

thanks. that was quick. unfortunately nitter.net still times out.

thanks. that was quick. unfortunately nitter.net still times out.
zedeus commented 2023-08-19 18:48:43 -04:00 (Migrated from github.com)

@zer0fl0w can you shoot me the IP address you're using in an email or on Matrix? I'll look into it

@zer0fl0w can you shoot me the IP address you're using in an email or on Matrix? I'll look into it
ares-osint commented 2023-08-19 19:15:44 -04:00 (Migrated from github.com)

Thank you for your amazing work.
So far the improvement is huge after the blocking event.
I wonder why the Nitter.net instance is retrieving 16 minutes of posts in the search result timeline.
After that the bottom message i've got is "no more..." and there is a lot more tweets after that. The search query is "nasa" in this case.
I don't know if that limited search result is related to an ip problem or the amount of request being fetched on the instance.

Thank you for your amazing work. So far the improvement is huge after the blocking event. I wonder why the Nitter.net instance is retrieving 16 minutes of posts in the search result timeline. After that the bottom message i've got is "no more..." and there is a lot more tweets after that. The search query is "nasa" in this case. I don't know if that limited search result is related to an ip problem or the amount of request being fetched on the instance.
zer0fl0w commented 2023-08-19 20:31:06 -04:00 (Migrated from github.com)

@zedeus done (mail).

@zedeus done (mail).
Apachez- commented 2023-08-19 21:50:56 -04:00 (Migrated from github.com)

Is there some aggressive throttling going on at nitter.net right now?

All of a sudden I got this after 5 windows reloaded:

This site can’t be reached

nitter.net unexpectedly closed the connection.

Try:
* Checking the connection
* Checking the proxy and the firewall

ERR_CONNECTION_CLOSED

Edit: I assume some glitch in the matrix since its working again.

Is there some aggressive throttling going on at nitter.net right now? All of a sudden I got this after 5 windows reloaded: ``` This site can’t be reached nitter.net unexpectedly closed the connection. Try: * Checking the connection * Checking the proxy and the firewall ERR_CONNECTION_CLOSED ``` Edit: I assume some glitch in the matrix since its working again.
Apachez- commented 2023-08-19 22:02:53 -04:00 (Migrated from github.com)

Multiple accounts at once not quite working?

https://nitter.net/AccountableGOP,RonFilipkowski

No items found.

https://nitter.net/AccountableGOP,RonFilipkowski/with_replies

works. Sort of. Not all images/integrated web links show like they do on privacydev.net instance.

Thats a feature I have completely missed.

Where can I read more about how its supposed to be working along with are there any upper limits (except for URI length) for how many accounts can be squeezed into the same request?

Also since it currently doesnt seem to be working - is it expected to return?

> Multiple accounts at once not quite working? > > https://nitter.net/AccountableGOP,RonFilipkowski > > No items found. > > https://nitter.net/AccountableGOP,RonFilipkowski/with_replies > > works. Sort of. Not all images/integrated web links show like they do on privacydev.net instance. Thats a feature I have completely missed. Where can I read more about how its supposed to be working along with are there any upper limits (except for URI length) for how many accounts can be squeezed into the same request? Also since it currently doesnt seem to be working - is it expected to return?
orbea commented 2023-08-19 22:03:52 -04:00 (Migrated from github.com)

@zedeus Is it possible to unblock TOR?

@zedeus Is it possible to unblock TOR?
zedeus commented 2023-08-19 22:14:09 -04:00 (Migrated from github.com)

@Apachez- yes, very aggressive throttling. Did you hit it during normal browsing or are you scraping? If so, please don't.
@orbea it wouldn't be easy and I'd rather not due to the amount of abuse by scrapers. There are many other instances available (at least there will be when things go back to normal), including onion links.

@Apachez- yes, very aggressive throttling. Did you hit it during normal browsing or are you scraping? If so, please don't. @orbea it wouldn't be easy and I'd rather not due to the amount of abuse by scrapers. There are many other instances available (at least there will be when things go back to normal), including onion links.
ImTheDeveloper commented 2023-08-20 02:07:12 -04:00 (Migrated from github.com)

@ImTheDeveloper They use a flow with various steps to handle account creation, guest account creation, logging in, etc. There's a step for verifying your email for example. The app navigates these steps, but I haven't found a way to cancel that flow to return it tho the beginning, except for using a new IP address. If someone could figure out a way to reset the flow that would be wonderful.

Thanks for the info - I've had one actual open account in the last 50 attempts 😂 but at least proven it worked. I'll run through proxy and see if it helps.

I've been doing some digging around GitHub and there's a fair bit of usage of the tasks to automate blocking users and such but the particular OpenWelcomeFlowLink which looks to be a deeplink in android isn't mentioned anywhere. Typical!

> @ImTheDeveloper They use a flow with various steps to handle account creation, guest account creation, logging in, etc. There's a step for verifying your email for example. The app navigates these steps, but I haven't found a way to cancel that flow to return it tho the beginning, except for using a new IP address. If someone could figure out a way to reset the flow that would be wonderful. Thanks for the info - I've had one actual open account in the last 50 attempts 😂 but at least proven it worked. I'll run through proxy and see if it helps. I've been doing some digging around GitHub and there's a fair bit of usage of the tasks to automate blocking users and such but the particular OpenWelcomeFlowLink which looks to be a deeplink in android isn't mentioned anywhere. Typical!
TempUser13 commented 2023-08-20 05:11:49 -04:00 (Migrated from github.com)

Is there an ETA on when/if these fixing changes are going to be pushed to master branch?

Is there an ETA on when/if these fixing changes are going to be pushed to master branch?
zedeus commented 2023-08-20 05:21:48 -04:00 (Migrated from github.com)

@ImTheDeveloper Indeed! I was ripping my hair out playing around with it. I understand how the whole open_link stuff works and how flow navigation is supposed to work, there just seems to be no way to reset this flow. I even tried the logout.json endpoint to no avail.
@TempUser13 Pushing the changes to master isn't enough, instances with more than a couple of users need several guest accounts and large instances will need hundreds if not thousands, which requires some infrastructure so Nitter can acquire them automatically from a service I'm going to run. I have no ETC on this but I'm working on all of it.

@ImTheDeveloper Indeed! I was ripping my hair out playing around with it. I understand how the whole open_link stuff works and how flow navigation is _supposed to work_, there just seems to be no way to reset this flow. I even tried the logout.json endpoint to no avail. @TempUser13 Pushing the changes to master isn't enough, instances with more than a couple of users need several guest accounts and large instances will need hundreds if not thousands, which requires some infrastructure so Nitter can acquire them automatically from a service I'm going to run. I have no ETC on this but I'm working on all of it.
Jerroder commented 2023-08-20 05:35:08 -04:00 (Migrated from github.com)

It may be worth to push these changes for those of us who are running a private instance?

It may be worth to push these changes for those of us who are running a private instance?
TempUser13 commented 2023-08-20 05:42:08 -04:00 (Migrated from github.com)

Would it be possible for an update that let's you use a non guest account for those who wish to self host until you've built out this service for getting guest accounts?

Would it be possible for an update that let's you use a non guest account for those who wish to self host until you've built out this service for getting guest accounts?
zedeus commented 2023-08-20 06:13:13 -04:00 (Migrated from github.com)

@rderensy they're already pushed to another branch, see #985
@TempUser13 see #897

@rderensy they're already pushed to another branch, see #985 @TempUser13 see #897
Dheatly23 commented 2023-08-20 07:28:20 -04:00 (Migrated from github.com)

Thanks again for making Nitter work again. But i got this bug where sometimes a tweet/reply has link in form of https://nitter.net/<user>/status/<id>/photo/1. When i clicked it it just redirects back to the tweet/reply.

Thanks again for making Nitter work again. But i got this bug where sometimes a tweet/reply has link in form of `https://nitter.net/<user>/status/<id>/photo/1`. When i clicked it it just redirects back to the tweet/reply.
zedeus commented 2023-08-20 07:37:48 -04:00 (Migrated from github.com)

@Dheatly23 that's intended, not a bug. Twitter does the same thing, doesn't it? What behavior are you expecting?

@Dheatly23 that's intended, not a bug. Twitter does the same thing, doesn't it? What behavior are you expecting?
yekoc commented 2023-08-20 08:14:10 -04:00 (Migrated from github.com)

If it's the same behavior as I have seen a few times it appears that the tweet contents (usually an embedded image/video) are replaced with the link,and since the link itself just leads back to that same tweet that content is not accessible.
I initially dismissed it as representing an unimplemented feature ala spaces but going back they seem to just be normal tweets.

If it's the same behavior as I have seen a few times it appears that the tweet contents (usually an embedded image/video) are replaced with the link,and since the link itself just leads back to that same tweet that content is not accessible. I initially dismissed it as representing an unimplemented feature ala spaces but going back they seem to just be normal tweets.
Fatmaana commented 2023-08-20 08:21:35 -04:00 (Migrated from github.com)

Every time I post a Twitter tweet, it appears to me that it is not possible to view the tweets of this protected user. Please, what is the solution to this problem?

Every time I post a Twitter tweet, it appears to me that it is not possible to view the tweets of this protected user. Please, what is the solution to this problem?
zedeus commented 2023-08-20 08:24:37 -04:00 (Migrated from github.com)

@Fatmaana protected user? It's impossible to visit those tweets without that user following you, so Nitter could never support that.

@Fatmaana protected user? It's impossible to visit those tweets without that user following you, so Nitter could never support that.
Fatmaana commented 2023-08-20 08:26:54 -04:00 (Migrated from github.com)

هذا التطبيق Twidere for Twitter/Mastodon

هذا التطبيق Twidere for Twitter/Mastodon
12joan commented 2023-08-20 08:32:41 -04:00 (Migrated from github.com)

@Fatmaana Twidere is unrelated to Nitter. I suggest you ask on their GitHub repo if you're having problems with it. This thread is for discussing a specific issue with Nitter.

@Fatmaana Twidere is unrelated to Nitter. I suggest you ask on their [GitHub repo](https://github.com/TwidereProject) if you're having problems with it. This thread is for discussing a specific issue with Nitter.
Fatmaana commented 2023-08-20 08:36:35 -04:00 (Migrated from github.com)

How do I communicate with them

How do I communicate with them
12joan commented 2023-08-20 08:39:33 -04:00 (Migrated from github.com)

Their website says to use their GitHub issues for support.

This really isn't the place to ask about unrelated applications.

(@zedeus This conversation has been resolved, so you can go ahead and mark the exchange as off-topic if you want, to avoid it cluttering the thread. 🙂)

[Their website](https://twidere.com/) says to use their [GitHub issues](https://github.com/TwidereProject/Twidere-Android/issues) for support. This really isn't the place to ask about unrelated applications. (@zedeus This conversation has been [resolved](https://github.com/TwidereProject/Twidere-Android/issues/1467#issuecomment-1685275343), so you can go ahead and mark the exchange as off-topic if you want, to avoid it cluttering the thread. 🙂)
csisoap commented 2023-08-20 09:48:23 -04:00 (Migrated from github.com)

I noticing old 1.1 search endpoint is working with OAuth although it's not working anymore with guest token.
x-rate-limit-limit header on search endpoint is 180, much less than graphql endpoint is 500.

I noticing old 1.1 search endpoint is working with OAuth although it's not working anymore with guest token. `x-rate-limit-limit` header on search endpoint is 180, much less than graphql endpoint is 500.
Dheatly23 commented 2023-08-20 10:04:08 -04:00 (Migrated from github.com)

Thanks @yekoc for confirming my suspicion. I first suspect it was something with GIFs, since i never saw it ever since this update. It looks like this (link) :

image

Thanks @yekoc for confirming my suspicion. I first suspect it was something with GIFs, since i never saw it ever since this update. It looks like this ([link](https://nitter.net/cnviolations/status/1692690255575404923/photo/1)) : ![image](https://github.com/zedeus/nitter/assets/71598333/13a5e067-b916-487b-9d9f-7d5e80c68300)
nerra0pos commented 2023-08-20 11:46:11 -04:00 (Migrated from github.com)

Any ETA for RSS to return for user profiles on nitter.net?

Any ETA for RSS to return for user profiles on nitter.net?
OverflowCat commented 2023-08-20 14:45:20 -04:00 (Migrated from github.com)

I checked this API few hours ago and it was working, but now it is not. Is this downtime temporary or permanent?

I checked this API few hours ago and it was working, but now it is not. Is this downtime temporary or permanent?
veilm commented 2023-08-20 14:53:02 -04:00 (Migrated from github.com)

Any ETA for RSS to return for user profiles on nitter.net?

zedeus has already said in this thread that RSS will be re-enabled after the situation becomes stable. That will only happen after the development of the guest account service is finished, and zedeus has said (also in this thread) that there is no ETA on that, but that they are working on it. Therefore, there is no ETA on RSS feeds returning.

(Edit: Never mind, sorry: I shouldn't have swung)

> Any ETA for RSS to return for user profiles on nitter.net? zedeus has already said in this thread that RSS will be re-enabled after the situation becomes stable. That will only happen after the development of the guest account service is finished, and zedeus has said (also in this thread) that there is no ETA on that, but that they are working on it. Therefore, there is no ETA on RSS feeds returning. (Edit: Never mind, sorry: I shouldn't have swung)
BANKA2017 commented 2023-08-20 15:14:17 -04:00 (Migrated from github.com)

Is this downtime temporary or permanent?

Temporary, and it will recover in a few days.
You can try to change the ip address and do again.

> Is this downtime temporary or permanent? Temporary, and it will recover in a few days. You can try to change the ip address and do again.
Apachez- commented 2023-08-20 19:06:51 -04:00 (Migrated from github.com)

@Apachez- yes, very aggressive throttling. Did you hit it during normal browsing or are you scraping? If so, please don't.

I hit it during normal browsing but perhaps Im doing this inefficient?

Currently I have each user I wish to read their tweets in their own tab (approx 20 tabs in total). I have removed nitter from startup pages in my browser and instead created a html page with javascript that opens up a new tab every 0.5 second (the delay can be altered to make it go even slower between loading each tab).

However when I later refresh tabs I go through them one by one (ctrl+tab) and hit F5 and thats when I hit the throttling the other day.

Would using a multiuser url be more efficient and less demanding on the nitter side of this?

That is instead of having 20 tabs I should do this instead (which would be a single http(s) request towards nitter)?

https://nitter.net/user1,user2,...,user19,user20/with_replies

> @Apachez- yes, very aggressive throttling. Did you hit it during normal browsing or are you scraping? If so, please don't. I hit it during normal browsing but perhaps Im doing this inefficient? Currently I have each user I wish to read their tweets in their own tab (approx 20 tabs in total). I have removed nitter from startup pages in my browser and instead created a html page with javascript that opens up a new tab every 0.5 second (the delay can be altered to make it go even slower between loading each tab). However when I later refresh tabs I go through them one by one (ctrl+tab) and hit F5 and thats when I hit the throttling the other day. Would using a multiuser url be more efficient and less demanding on the nitter side of this? That is instead of having 20 tabs I should do this instead (which would be a single http(s) request towards nitter)? https://nitter.net/user1,user2,...,user19,user20/with_replies
Apachez- commented 2023-08-20 19:11:37 -04:00 (Migrated from github.com)

Yea man that seems like scraping lmao

Scraping when I sit in front of the browser and read the tweets?

Scraping is when you have a bot doing stuff for you which I dont.

> Yea man that seems like scraping lmao Scraping when I sit in front of the browser and read the tweets? Scraping is when you have a bot doing stuff for you which I dont.
Apachez- commented 2023-08-20 19:22:49 -04:00 (Migrated from github.com)

That script is because chromium, chrome and firefox lacks capability of having a "seconds between tab to open on startup" when you use "open these urls on startup".

So I resolved that by using "open about:blank on startup" and then having a html page on my desktop which I doubleclick.

That html-page contains a javascript that with a delay will open the tabs I wish (the twitter accounts I wish to read through nitter along with forums, news pages and what else).

So without this script having all nitter urls as "open on startup" would trigger the throttling at nitter side within 1 second just when I open the browser (since the browser opens ALL these "open url at startup" at once which from nitter point of view looks like a flooding attempt of 20 concurrent requests at once). Using this script the tabs are opened in a more slow pace which works excellent.

The problem I encountered is that when I some time later want to find out if there have been any new tweets I cycle through these tabs pressing ctrl+tab followed by F5 and thats when I recently triggered that 504 error after reloading the 5th tab.

That script is because chromium, chrome and firefox lacks capability of having a "seconds between tab to open on startup" when you use "open these urls on startup". So I resolved that by using "open about:blank on startup" and then having a html page on my desktop which I doubleclick. That html-page contains a javascript that with a delay will open the tabs I wish (the twitter accounts I wish to read through nitter along with forums, news pages and what else). So without this script having all nitter urls as "open on startup" would trigger the throttling at nitter side within 1 second just when I open the browser (since the browser opens ALL these "open url at startup" at once which from nitter point of view looks like a flooding attempt of 20 concurrent requests at once). Using this script the tabs are opened in a more slow pace which works excellent. The problem I encountered is that when I some time later want to find out if there have been any new tweets I cycle through these tabs pressing ctrl+tab followed by F5 and thats when I recently triggered that 504 error after reloading the 5th tab.
TempUser13 commented 2023-08-20 19:23:54 -04:00 (Migrated from github.com)

Didn't realize its this quick to get a 429 self hosted

Didn't realize its this quick to get a 429 self hosted
zedeus commented 2023-08-20 19:56:48 -04:00 (Migrated from github.com)

@Apachez- It's on purpose stuff like that gets throttled. That isn't normal browsing, you're causing more load than 20 users combined. The multi-user timeline feature uses 1 request per load, so it's extremely efficient compared to opening them all separately. It's apparently broken right now but you can switch to tweets & replies to work around it.

@TempUser13 Are you using one or more guest accounts? What kind of load are you doing? (e.g. requests per second)

@Apachez- It's on purpose stuff like that gets throttled. That isn't normal browsing, you're causing more load than 20 users combined. The multi-user timeline feature uses 1 request per load, so it's extremely efficient compared to opening them all separately. It's apparently broken right now but you can switch to tweets & replies to work around it. @TempUser13 Are you using one or more guest accounts? What kind of load are you doing? (e.g. requests per second)
Apachez- commented 2023-08-20 20:04:05 -04:00 (Migrated from github.com)

@zedeus it is normal browsing since you would normally add the users you want to read their tweets in startup of the browser. That is one user per tab (which is why tabs exists to begin with). At least when you use twitter without an account or account to tweetdeck or similar aggregator.

Do there exist some limit of how many users the multiuser supports other than that the url must be shorter than 2048 bytes or how long an url can be nowadays (seems like general recommendation is below 2048 bytes per url while Google Chrome supports 2 megabyte (2097152 bytes) url)?

Edit: I tested the multiuser-feature and it worked like a charm in my case and with the amount of accounts I want to read tweets from - dunno how I have missed that feature for this long :-)

@zedeus it is normal browsing since you would normally add the users you want to read their tweets in startup of the browser. That is one user per tab (which is why tabs exists to begin with). At least when you use twitter without an account or account to tweetdeck or similar aggregator. Do there exist some limit of how many users the multiuser supports other than that the url must be shorter than 2048 bytes or how long an url can be nowadays (seems like general recommendation is below 2048 bytes per url while Google Chrome supports 2 megabyte (2097152 bytes) url)? Edit: I tested the multiuser-feature and it worked like a charm in my case and with the amount of accounts I want to read tweets from - dunno how I have missed that feature for this long :-)
zedeus commented 2023-08-20 20:32:16 -04:00 (Migrated from github.com)

The feature generates a search string that looks similar to "from:user1 OR from:user2" etc. and Twitter limits search quries to 500 characters. If you get above that amount Nitter will tell you, but it's around ~25 accounts per multi-timeline.

The feature generates a search string that looks similar to "from:user1 OR from:user2" etc. and Twitter limits search quries to 500 characters. If you get above that amount Nitter will tell you, but it's around ~25 accounts per multi-timeline.
TempUser13 commented 2023-08-20 20:49:19 -04:00 (Migrated from github.com)

@TempUser13 Are you using one or more guest accounts? What kind of load are you doing? (e.g. requests per second)

Using a non guest account on #897 trying to refresh 323 RSS feeds

> @TempUser13 Are you using one or more guest accounts? What kind of load are you doing? (e.g. requests per second) Using a non guest account on #897 trying to refresh 323 RSS feeds
ImTheDeveloper commented 2023-08-21 01:57:50 -04:00 (Migrated from github.com)

@ImTheDeveloper Indeed! I was ripping my hair out playing around with it. I understand how the whole open_link stuff works and how flow navigation is supposed to work, there just seems to be no way to reset this flow. I even tried the logout.json endpoint to no avail.

I've seen there is an "end_flow" input but it doesn't seem to react at all either.

Also for account creation I can't workout whether there is some fundamental delay in generation of the oauth guest accounts requiring a second call to the open_link to get an account open or whether it's the rotation of IP that does it but you can go through patches of accounts opening right away and sometimes requiring 3+ calls for it to happen. For your mass creation did you just fire off a bunch all at once and take what worked or did you keep retrying? Ive been manually opening up accounts with postman to try and figure out how the flow.json endpoint works as I'll need to do this every month it seems.

> @ImTheDeveloper Indeed! I was ripping my hair out playing around with it. I understand how the whole open_link stuff works and how flow navigation is _supposed to work_, there just seems to be no way to reset this flow. I even tried the logout.json endpoint to no avail. I've seen there is an "end_flow" input but it doesn't seem to react at all either. Also for account creation I can't workout whether there is some fundamental delay in generation of the oauth guest accounts requiring a second call to the open_link to get an account open or whether it's the rotation of IP that does it but you can go through patches of accounts opening right away and sometimes requiring 3+ calls for it to happen. For your mass creation did you just fire off a bunch all at once and take what worked or did you keep retrying? Ive been manually opening up accounts with postman to try and figure out how the flow.json endpoint works as I'll need to do this every month it seems.
guillaumekoto commented 2023-08-21 04:19:30 -04:00 (Migrated from github.com)

A new release of docker container (zedeus/nitter) is scheduled?

A new release of docker container (zedeus/nitter) is scheduled?
zedeus commented 2023-08-21 05:14:50 -04:00 (Migrated from github.com)

@stopmotio nitter.net might be, can't deal with all that traffic. It's not bandwidth, it's now needing more and more guest accounts to keep up with scrapers.

@ImTheDeveloper I have a simple node.js program that gets a guest token, flow token, and then tries to start the welcome flow to get the guest account made. Each step is retried once if it fails, so I've just been running it with 10k proxies, about 100-500 proxies concurrently. I've been able to make 190k accounts so far. I could've made hundreds of thousands already but I haven't smoothed out the process yet, still takes a bit of manual work.

@guillaumekoto Yes, right now the tests are failing because there's no guest account for the test suite, but I'll figure that out asap.

@stopmotio nitter.net might be, can't deal with all that traffic. It's not bandwidth, it's now needing more and more guest accounts to keep up with scrapers. @ImTheDeveloper I have a simple node.js program that gets a guest token, flow token, and then tries to start the welcome flow to get the guest account made. Each step is retried once if it fails, so I've just been running it with 10k proxies, about 100-500 proxies concurrently. I've been able to make 190k accounts so far. I could've made hundreds of thousands already but I haven't smoothed out the process yet, still takes a bit of manual work. @guillaumekoto Yes, right now the tests are failing because there's no guest account for the test suite, but I'll figure that out asap.
zedeus commented 2023-08-21 05:22:56 -04:00 (Migrated from github.com)

@TempUser13 That's way too much for one account to handle. You might be able to do 323 main tweet feeds every 15 minutes, as the rate limit should be 500. If you're getting tweets & replies, media or search feeds, then it's not possible with just one account.

@TempUser13 That's way too much for one account to handle. You might be able to do 323 main tweet feeds every 15 minutes, as the rate limit should be 500. If you're getting tweets & replies, media or search feeds, then it's not possible with just one account.
DrSocket commented 2023-08-21 09:12:34 -04:00 (Migrated from github.com)

@BANKA2017 great work on this, question so I can learn, how do you reverse engineer the android endpoints? do I need to use something like android studio or what do I use? thanks!

@BANKA2017 great work on this, question so I can learn, how do you reverse engineer the android endpoints? do I need to use something like android studio or what do I use? thanks!
BANKA2017 commented 2023-08-21 10:01:42 -04:00 (Migrated from github.com)

@DrSocket I didn't reverse engineer the Android endpoint, I only used Fiddler to capture packets, consumer key and consumer secret are searched from Google.

@DrSocket I didn't reverse engineer the Android endpoint, I only used Fiddler to capture packets, consumer key and consumer secret are searched from Google.
mahthori commented 2023-08-21 10:34:43 -04:00 (Migrated from github.com)

I have received a feed from this instance this morning.
..(https://nitter.moomoo.me). I am no expert, I'm just using the service, what and how did this happen? If all instances are not functioning.

I have received a feed from this instance this morning. ..(https://nitter.moomoo.me). I am no expert, I'm just using the service, what and how did this happen? If all instances are not functioning.
mahthori commented 2023-08-21 10:36:41 -04:00 (Migrated from github.com)

I have received a feed from this instance this morning. ..(https://nitter.moomoo.me). I am no expert, I'm just using the service, what and how did this happen? If all instances are not functioning.

It was for an account with 200K followers. (Gov official account)

> I have received a feed from this instance this morning. ..(https://nitter.moomoo.me). I am no expert, I'm just using the service, what and how did this happen? If all instances are not functioning. It was for an account with 200K followers. (Gov official account)
zedeus commented 2023-08-21 10:46:44 -04:00 (Migrated from github.com)

Huh, https://nitter.moomoo.me/elonmusk/with_replies and the search tab loaded for me once with tweets there, very strange.

Ran some authentication tests and it's just acting weird again where sometimes an endpoint is accessible with a given bearer token (e.g. the iPad one) and sometimes it isn't. This isn't something we can work with unfortunately, but maybe they will roll back the restrictions at some point.

Huh, https://nitter.moomoo.me/elonmusk/with_replies and the search tab loaded for me once with tweets there, very strange. Ran some authentication tests and it's just acting weird again where sometimes an endpoint is accessible with a given bearer token (e.g. the iPad one) and sometimes it isn't. This isn't something we can work with unfortunately, but maybe they will roll back the restrictions at some point.
mahthori commented 2023-08-21 11:10:57 -04:00 (Migrated from github.com)

I am really not sure if it was working the days before, because I have an android app with 15 minutes refresh rate for the feeds (over 30 for me) , and I am checking it every day. This just happened today. and it just sent another feed few minutes ago.

I am really not sure if it was working the days before, because I have an android app with 15 minutes refresh rate for the feeds (over 30 for me) , and I am checking it every day. This just happened today. and it just sent another feed few minutes ago.
mahthori commented 2023-08-21 11:15:50 -04:00 (Migrated from github.com)

I am really not sure if it was working the days before, because I have an android app with 15 minutes refresh rate for the feeds (over 30 for me) , and I am checking it every day. This just happened today. and it just sent another feed few minutes ago.

(With replies)

> I am really not sure if it was working the days before, because I have an android app with 15 minutes refresh rate for the feeds (over 30 for me) , and I am checking it every day. This just happened today. and it just sent another feed few minutes ago. (With replies)
edel79 commented 2023-08-21 12:58:01 -04:00 (Migrated from github.com)

I don’t use the main Nitter instance, and my bots seems to work again since this afternoon.

Envoyé à partir de Outlook pour iOShttps://aka.ms/o0ukef


De : mahthori @.>
Envoyé : Monday, August 21, 2023 5:16:13 PM
À : zedeus/nitter @.
>
Cc : edel79 @.>; Manual @.>
Objet : Re: [zedeus/nitter] looks like X/twitter(?) broke something again (Issue #983)

I am really not sure if it was working the days before, because I have an android app with 15 minutes refresh rate for the feeds (over 30 for me) , and I am checking it every day. This just happened today. and it just sent another feed few minutes ago.

(With replies)

—
Reply to this email directly, view it on GitHubhttps://github.com/zedeus/nitter/issues/983#issuecomment-1686526218, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ALELY26ANLTRCVOCMXD3XKTXWN3T3ANCNFSM6AAAAAA3QWLU6U.
You are receiving this because you are subscribed to this thread.Message ID: @.***>

I don’t use the main Nitter instance, and my bots seems to work again since this afternoon. Envoyé à partir de Outlook pour iOS<https://aka.ms/o0ukef> ________________________________ De : mahthori ***@***.***> Envoyé : Monday, August 21, 2023 5:16:13 PM À : zedeus/nitter ***@***.***> Cc : edel79 ***@***.***>; Manual ***@***.***> Objet : Re: [zedeus/nitter] looks like X/twitter(?) broke something again (Issue #983) I am really not sure if it was working the days before, because I have an android app with 15 minutes refresh rate for the feeds (over 30 for me) , and I am checking it every day. This just happened today. and it just sent another feed few minutes ago. (With replies) — Reply to this email directly, view it on GitHub<https://github.com/zedeus/nitter/issues/983#issuecomment-1686526218>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/ALELY26ANLTRCVOCMXD3XKTXWN3T3ANCNFSM6AAAAAA3QWLU6U>. You are receiving this because you are subscribed to this thread.Message ID: ***@***.***>
Fatmaana commented 2023-08-21 15:48:45 -04:00 (Migrated from github.com)

I don't understand what you mean, can you explain more and if there is a
solution to this problem

في الأحد، ٢٠ أغسطس ٢٠٢٣ ٣:٢٥ م Zed @.***> كتب:

@Fatmaana https://github.com/Fatmaana protected user? It's impossible
to visit those tweets without that user following you, so Nitter could
never support that.

—
Reply to this email directly, view it on GitHub
https://github.com/zedeus/nitter/issues/983#issuecomment-1685271566, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/A6XHC5TCXQLJUJVCATZZBWLXWH6ZZANCNFSM6AAAAAA3QWLU6U
.
You are receiving this because you were mentioned.Message ID:
@.***>

I don't understand what you mean, can you explain more and if there is a solution to this problem في الأحد، ٢٠ أغسطس ٢٠٢٣ ٣:٢٥ م Zed ***@***.***> كتب: > @Fatmaana <https://github.com/Fatmaana> protected user? It's impossible > to visit those tweets without that user following you, so Nitter could > never support that. > > — > Reply to this email directly, view it on GitHub > <https://github.com/zedeus/nitter/issues/983#issuecomment-1685271566>, or > unsubscribe > <https://github.com/notifications/unsubscribe-auth/A6XHC5TCXQLJUJVCATZZBWLXWH6ZZANCNFSM6AAAAAA3QWLU6U> > . > You are receiving this because you were mentioned.Message ID: > ***@***.***> >
OrangeFlavored commented 2023-08-21 19:12:53 -04:00 (Migrated from github.com)

What is the actual rate limit for userTweetsAndReplies? I assume it's a lot lower than the 500/15m quoted earlier for basic tweets but trying to figure out exactly how many guest accounts I should aim for to make things stable if I'm polling this regularly using my local instance. (Up to 15 right now though it's kind of hard to know when I have enough since a lot of the older ones have already been limited and won't be usable again for a while.)

What is the actual rate limit for userTweetsAndReplies? I assume it's a lot lower than the 500/15m quoted earlier for basic tweets but trying to figure out exactly how many guest accounts I should aim for to make things stable if I'm polling this regularly using my local instance. (Up to 15 right now though it's kind of hard to know when I have enough since a lot of the older ones have already been limited and won't be usable again for a while.)
zedeus commented 2023-08-21 19:31:09 -04:00 (Migrated from github.com)

I'm not sure, I haven't done enough testing to test what it really is. As low as 1 request per second is enough to trigger the 24 hour rate limit, but I don't know if it's window-based. I do know that once you hit this strange rate limit, it immediately affects the endpoints for tweets & replies, media, search, and individual tweets (tweetDetail). That is, if you exceed the rate limit for media, you are now also unable to access search, media and individual tweets/threads for 24 hours. The main endpoint used for the main tweets tab is not affected and can't hit the same rate limit from my extensive testing.

I'm not sure, I haven't done enough testing to test what it really is. As low as 1 request per second is enough to trigger the 24 hour rate limit, but I don't know if it's window-based. I do know that once you hit this strange rate limit, it immediately affects the endpoints for tweets & replies, media, search, and individual tweets (tweetDetail). That is, if you exceed the rate limit for media, you are now also unable to access search, media and individual tweets/threads for 24 hours. The main endpoint used for the main tweets tab is not affected and can't hit the same rate limit from my extensive testing.
OrangeFlavored commented 2023-08-21 19:35:45 -04:00 (Migrated from github.com)

In my own testing it seemed like with 5 accounts polling every 30 seconds it was able to keep going for a few hours but got limited eventually. Raised it to 60 seconds for now at least until all the other accounts come off the 24 hour limit again. (All on tweets/replies on a single user profile for a notification thing I'm running.)

In my own testing it seemed like with 5 accounts polling every 30 seconds it was able to keep going for a few hours but got limited eventually. Raised it to 60 seconds for now at least until all the other accounts come off the 24 hour limit again. (All on tweets/replies on a single user profile for a notification thing I'm running.)
0o120 commented 2023-08-22 10:44:01 -04:00 (Migrated from github.com)

Can someone confirm if guest account creation is still working. I am also getting this same response as @BANKA2017

@BANKA2017 when running the onboarding/task.json end-point to get the guest account I'm actually hitting the following:

image

Ever seen it go to here before? Looks as though I'm ending up with OpenWelcomeFlowLink instead OpenAccount being returned.

Can someone confirm if guest account creation is still working. I am also getting this same response as @BANKA2017 > @BANKA2017 when running the onboarding/task.json end-point to get the guest account I'm actually hitting the following: > > ![image](https://user-images.githubusercontent.com/1431348/261809567-9017377d-3abb-42a0-a90c-876f422037cf.png) > > Ever seen it go to here before? Looks as though I'm ending up with OpenWelcomeFlowLink instead OpenAccount being returned.
dawnerd commented 2023-08-22 10:45:49 -04:00 (Migrated from github.com)

Still working here. Seems that happens sometimes though. Guessing if the ip is already used?

Still working here. Seems that happens sometimes though. Guessing if the ip is already used?
ImTheDeveloper commented 2023-08-22 10:56:20 -04:00 (Migrated from github.com)

Sometimes it appears there is a delay in the creation of the account so you need to wait a few seconds/minutes and then it will create if you call the next_link again.

As mentioned it can also be an IP restriction issue, so rotating IP will cause the account to create. For all the fun, it can be a combination of both!

Sometimes it appears there is a delay in the creation of the account so you need to wait a few seconds/minutes and then it will create if you call the next_link again. As mentioned it can also be an IP restriction issue, so rotating IP will cause the account to create. For all the fun, it can be a combination of both!
zedeus commented 2023-08-22 11:29:27 -04:00 (Migrated from github.com)

@OrangeFlavored Any update on your testing?

@OrangeFlavored Any update on your testing?
0o120 commented 2023-08-22 12:04:31 -04:00 (Migrated from github.com)

For anyone wondering how to login with a username\password, this snippet below should be helpful.
I'm using a requests session in Python with the headers based on https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357.

After task1, you pass the "att" response header as a request header to task2.
Username is sent in task2.
Password in task3.
Task4 should give you the final auth. It gave it to me on the first try, but after running the code again, it asked for a confirmation code that was sent to my email, which is sent in task5. If correct code, auth is returned.

	
username = 'xxxxxxxxxxx'
password = 'xxxxxxxxxxx'

authentication = None

task1 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json',
	params={
		'flow_name': 'login',
		'api_version': '1',
		'known_device_token': '',
		'sim_country_code': 'us'
	},
	json={
		"flow_token": None,
		"input_flow_data": {
			"country_code": None,
			"flow_context": {
				"referrer_context": {
					"referral_details": "utm_source=google-play&utm_medium=organic",
					"referrer_url": ""
				},
				"start_location": {
					"location": "deeplink"
				}
			},
			"requested_variant": None,
			"target_user_id": 0
		}
	}
)

self.session.headers['att'] = task1.headers.get('att')
task2 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={
	"flow_token": task1.json().get('flow_token'),
	"subtask_inputs": [{
			"enter_text": {
				"suggestion_id": None,
				"text": username,
				"link": "next_link"
			},
			"subtask_id": "LoginEnterUserIdentifier"
		}
	]
})

task3 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={
	"flow_token": task2.json().get('flow_token'),
	"subtask_inputs": [{
			"enter_password": {
				"password": password,
				"link": "next_link"
			},
			"subtask_id": "LoginEnterPassword"
		}
	],
})

task4 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={
	"flow_token": task3.json().get('flow_token'),
	"subtask_inputs": [{
			"check_logged_in_account": {
				"link": "AccountDuplicationCheck_false"
			},
			"subtask_id": "AccountDuplicationCheck"
		}
	]
}).json()

for t4_subtask in task4.get('subtasks', []):
	if 'open_account' in t4_subtask:
		authentication = t4_subtask['open_account']
		break
	elif 'enter_text' in t4_subtask:
		response_text = t4_subtask['enter_text']['hint_text']
		code = input(f'Requesting {response_text}: ')
		task5 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={
			"flow_token": task4.get('flow_token'),
			"subtask_inputs": [{
				"enter_text": {
					"suggestion_id": None,
					"text": code,
					"link": "next_link"
				},
				"subtask_id": "LoginAcid"
			}]
		}).json()
		for t5_subtask in task5.get('subtasks', []):
			if 'open_account' in t5_subtask:
				authentication = t5_subtask['open_account']


print(authentication)
		
{
	'attribution_event': 'login',
	'known_device_token': 'XXXXXXXXXXXXXXXXXXXXXX',
	'next_link': {
		'link_id': 'next_link',
		'link_type': 'subtask',
		'subtask_id': 'SuccessExit'
	},
	'oauth_token': 'XXXXXXXXXXXXXXXXXXXXXX',
	'oauth_token_secret': 'XXXXXXXXXXXXXXXXXXXXXX',
	'user': {
		'id': 'XXXXXXXXXXXXXXXXXXXXXX',
		'id_str': 'XXXXXXXXXXXXXXXXXXXXXX',
		'name': 'XXXXXXXXXXXXXXXXXXXXXX',
		'screen_name': 'XXXXXXXXXXXXXXXXXXXXXX'
	}
}

For anyone wondering how to login with a username\password, this snippet below should be helpful. I'm using a requests session in Python with the headers based on https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357. After task1, you pass the "att" response header as a request header to task2. Username is sent in task2. Password in task3. Task4 should give you the final auth. It gave it to me on the first try, but after running the code again, it asked for a confirmation code that was sent to my email, which is sent in task5. If correct code, auth is returned. ```python username = 'xxxxxxxxxxx' password = 'xxxxxxxxxxx' authentication = None task1 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', params={ 'flow_name': 'login', 'api_version': '1', 'known_device_token': '', 'sim_country_code': 'us' }, json={ "flow_token": None, "input_flow_data": { "country_code": None, "flow_context": { "referrer_context": { "referral_details": "utm_source=google-play&utm_medium=organic", "referrer_url": "" }, "start_location": { "location": "deeplink" } }, "requested_variant": None, "target_user_id": 0 } } ) self.session.headers['att'] = task1.headers.get('att') task2 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ "flow_token": task1.json().get('flow_token'), "subtask_inputs": [{ "enter_text": { "suggestion_id": None, "text": username, "link": "next_link" }, "subtask_id": "LoginEnterUserIdentifier" } ] }) task3 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ "flow_token": task2.json().get('flow_token'), "subtask_inputs": [{ "enter_password": { "password": password, "link": "next_link" }, "subtask_id": "LoginEnterPassword" } ], }) task4 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ "flow_token": task3.json().get('flow_token'), "subtask_inputs": [{ "check_logged_in_account": { "link": "AccountDuplicationCheck_false" }, "subtask_id": "AccountDuplicationCheck" } ] }).json() for t4_subtask in task4.get('subtasks', []): if 'open_account' in t4_subtask: authentication = t4_subtask['open_account'] break elif 'enter_text' in t4_subtask: response_text = t4_subtask['enter_text']['hint_text'] code = input(f'Requesting {response_text}: ') task5 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ "flow_token": task4.get('flow_token'), "subtask_inputs": [{ "enter_text": { "suggestion_id": None, "text": code, "link": "next_link" }, "subtask_id": "LoginAcid" }] }).json() for t5_subtask in task5.get('subtasks', []): if 'open_account' in t5_subtask: authentication = t5_subtask['open_account'] print(authentication) { 'attribution_event': 'login', 'known_device_token': 'XXXXXXXXXXXXXXXXXXXXXX', 'next_link': { 'link_id': 'next_link', 'link_type': 'subtask', 'subtask_id': 'SuccessExit' }, 'oauth_token': 'XXXXXXXXXXXXXXXXXXXXXX', 'oauth_token_secret': 'XXXXXXXXXXXXXXXXXXXXXX', 'user': { 'id': 'XXXXXXXXXXXXXXXXXXXXXX', 'id_str': 'XXXXXXXXXXXXXXXXXXXXXX', 'name': 'XXXXXXXXXXXXXXXXXXXXXX', 'screen_name': 'XXXXXXXXXXXXXXXXXXXXXX' } } ```
kinoute commented 2023-08-22 12:13:00 -04:00 (Migrated from github.com)

@0o120 Thank you very much for your snippet! I was using @BANKA2017 node code which works great too. Do you have any snippet in Python to use the oauth_token/secret instead of the guest token?

@0o120 Thank you very much for your snippet! I was using @BANKA2017 node code which works great too. Do you have any snippet in Python to use the oauth_token/secret instead of the guest token?
0o120 commented 2023-08-22 12:32:11 -04:00 (Migrated from github.com)

@0o120 Thank you very much for your snippet! I was using @BANKA2017 node code which works great too. Do you have any snippet in Python to use the oauth_token/secret instead of the guest token?

I was doing it this way using requests-oauthlib

from requests_oauthlib import OAuth1

app_key = '3nVuSoBZnx6U4vzUxf5w'
app_secret = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'
oauth_token = authentication.get('oauth_token')
oauth_token_secret = authentication.get('oauth_token_secret')
oauth1 = OAuth1(app_key, app_secret, oauth_token, oauth_token_secret, realm='http://api.twitter.com/', signature_type="AUTH_HEADER", signature_method="HMAC-SHA1")


resp = requests.get('xxxxxxxxx', auth=oauth1)

Just passing it as the auth kwarg in requests.get()

> @0o120 Thank you very much for your snippet! I was using @BANKA2017 node code which works great too. Do you have any snippet in Python to use the oauth_token/secret instead of the guest token? I was doing it this way using [requests-oauthlib](https://pypi.org/project/requests-oauthlib/) ```python from requests_oauthlib import OAuth1 app_key = '3nVuSoBZnx6U4vzUxf5w' app_secret = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys' oauth_token = authentication.get('oauth_token') oauth_token_secret = authentication.get('oauth_token_secret') oauth1 = OAuth1(app_key, app_secret, oauth_token, oauth_token_secret, realm='http://api.twitter.com/', signature_type="AUTH_HEADER", signature_method="HMAC-SHA1") resp = requests.get('xxxxxxxxx', auth=oauth1) ``` Just passing it as the auth kwarg in requests.get()
orbea commented 2023-08-22 15:01:33 -04:00 (Migrated from github.com)

Not sure why, but this specific user doesn't work.

https://nitter.net/Min81937515

An error has occured in one of your routes.

Detail: fatal.nim(53) sysFatal
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
asyncfutures.nim(385) read
packedjson.nim(294, 19) `false` unexpected end of object
Not sure why, but this specific user doesn't work. https://nitter.net/Min81937515 ``` An error has occured in one of your routes. Detail: fatal.nim(53) sysFatal asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read asyncfutures.nim(385) read packedjson.nim(294, 19) `false` unexpected end of object ```
terr72 commented 2023-08-22 15:14:42 -04:00 (Migrated from github.com)

There's still no instance supporting RSS, right?

There's still no instance supporting RSS, right?
OrangeFlavored commented 2023-08-22 15:41:20 -04:00 (Migrated from github.com)

@OrangeFlavored Any update on your testing?

It seemeed like it had been going well for a while, but after many hours eventually the guest accounts started to get limited and now all are as far as I can tell... Was going with like 10 guest accounts~ and a 60 second interval since some of the ones I created weren't usable at the start.

> @OrangeFlavored Any update on your testing? It seemeed like it had been going well for a while, but after many hours eventually the guest accounts started to get limited and now all are as far as I can tell... Was going with like 10 guest accounts~ and a 60 second interval since some of the ones I created weren't usable at the start.
emv33 commented 2023-08-22 18:20:22 -04:00 (Migrated from github.com)

There's still no instance supporting RSS, right?

Nitter html is easy to parse, I am parsing it using residential proxies and it works well. Sometimes I have to retry feeds several times or switch proxies. But it's good enough for my use case.

> There's still no instance supporting RSS, right? Nitter html is easy to parse, I am parsing it using residential proxies and it works well. Sometimes I have to retry feeds several times or switch proxies. But it's good enough for my use case.
zedeus commented 2023-08-22 18:43:49 -04:00 (Migrated from github.com)

@emv33 what instance are you scraping? Please don't scrape any public ones, especially not now that guest accounts are required which easily get rate limited.

@emv33 what instance are you scraping? Please don't scrape any public ones, especially not now that guest accounts are required which easily get rate limited.
zedeus commented 2023-08-22 18:47:32 -04:00 (Migrated from github.com)

@terr72 see here https://status.d420.de/

@terr72 see here https://status.d420.de/
cmj commented 2023-08-22 23:56:58 -04:00 (Migrated from github.com)

There's still no instance supporting RSS, right?

I've been using the 'guest_accounts' branch for a couple days now, using just 3 accounts (could probably get away with just one) for RSS feeds needed for IRC bots. I only use one feed with replies as it seems that will hit the rate limit fast. All direct timeline feeds have been working just fine.

So if you want personal RSS just clone that branch, grab a guest_token using the node.js script mentioned in this thread and save it to guest_accounts.json in base directory.

> There's still no instance supporting RSS, right? I've been using the 'guest_accounts' branch for a couple days now, using just 3 accounts (could probably get away with just one) for RSS feeds needed for IRC bots. I only use one feed with replies as it seems that will hit the rate limit fast. All direct timeline feeds have been working just fine. So if you want personal RSS just clone that branch, grab a guest_token using the node.js script mentioned in this thread and save it to guest_accounts.json in base directory.
yoshimo commented 2023-08-23 01:35:40 -04:00 (Migrated from github.com)

I be able to create a third party x client using this guest branch and using a users credentials instead of a guest account to read and write xeets?

I be able to create a third party x client using this guest branch and using a users credentials instead of a guest account to read and write xeets?
NicoBerlo commented 2023-08-23 02:49:23 -04:00 (Migrated from github.com)

Hi
I’m currently installing the guest account branch. Could you please tell me how to create guest accounts and how to set them up with my instance ?
Thanks !

Hi I’m currently installing the guest account branch. Could you please tell me how to create guest accounts and how to set them up with my instance ? Thanks !
OrangeFlavored commented 2023-08-23 03:27:25 -04:00 (Migrated from github.com)

@zoubidabida The script posted in https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357 can be used to get guest accounts, though you'd only be able to get one using your own IP. I edited it slightly to proxy the request so I could get more:

// Node v18.15.0
// yarn add axios

import axios from 'axios'
import { HttpsProxyAgent } from 'https-proxy-agent';

const TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w';
const TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys';

const TW_ANDROID_BASIC_TOKEN = `Basic ${btoa(TW_CONSUMER_KEY+':'+TW_CONSUMER_SECRET)}`;

const HTTP_PROXY = {host: "", port: ""};

const httpsAgent = new HttpsProxyAgent(HTTP_PROXY);
const axios_proxied = axios.create({httpsAgent});

const getBearerToken = async () => {
    const tmpTokenResponse = await axios_proxied('https://api.twitter.com/oauth2/token', {
        headers: {
            Authorization: TW_ANDROID_BASIC_TOKEN,
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        method: 'post',
        data: 'grant_type=client_credentials',
    })
    return Object.values(tmpTokenResponse.data).join(" ")
};
// The bearer token is immutable
// Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F
const bearer_token = await getBearerToken();

const guest_token = (await axios_proxied("https://api.twitter.com/1.1/guest/activate.json", {
    headers: {
        Authorization: bearer_token
    },
    method: "post"
})).data.guest_token;

const flow_token = (await axios_proxied('https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us', {
    headers: {
        Authorization: bearer_token,
        'Content-Type': 'application/json',
        'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)',
        'X-Twitter-API-Version': 5,
        'X-Twitter-Client': 'TwitterAndroid',
        'X-Twitter-Client-Version': '9.95.0-release.0',
        'OS-Version': '28',
        'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)',
        'X-Twitter-Active-User': 'yes',
        'X-Guest-Token': guest_token
    },
    method: 'post',
    data: '{"flow_token":null,"input_flow_data":{"country_code":null,"flow_context":{"start_location":{"location":"splash_screen"}},"requested_variant":null,"target_user_id":0},"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}'
})).data.flow_token;

const subtasks = (await axios_proxied('https://api.twitter.com/1.1/onboarding/task.json', {
    headers: {
        Authorization: bearer_token,
        'Content-Type': 'application/json',
        'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)',
        'X-Twitter-API-Version': 5,
        'X-Twitter-Client': 'TwitterAndroid',
        'X-Twitter-Client-Version': '9.95.0-release.0',
        'OS-Version': '28',
        'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)',
        'X-Twitter-Active-User': 'yes',
        'X-Guest-Token': guest_token
    },
    method: 'post',
    data: '{"flow_token":"' + flow_token + '","subtask_inputs":[{"open_link":{"link":"next_link"},"subtask_id":"NextTaskOpenLink"}],"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}'
})).data.subtasks;

const account = subtasks.find(task => task.subtask_id === 'OpenAccount')?.open_account;
console.log(account);

// If you get an object like below it is successful
// {
//     "user": {
//         "id": 168862000062124800,
//         "id_str": "168862000062124800",
//         "name": "Open App User",
//         "screen_name": "_LO_08072W00Z6G",
//         "user_type": "Soft"
//     },
//     "next_link": {
//         "link_type": "subtask",
//         "link_id": "next_link",
//         "subtask_id": "OpenAppFlowStartAccountSetupOpenLink"
//     },
//     "oauth_token": "168862000062124800-yOxTZxJc4nKGGJ0lik000069JgJJX",
//     "oauth_token_secret": "PSrSIwXo0000RvWvcwQ0000dLgay0000NbpvSztF6n",
//     "attribution_event": "signup"
// }

Then just copy the returned objects into guest_accounts.json (you may have to modify them to add quotes around the key names since the ones I got back didn't have them) in an array and they should be loaded by nitter.

It's a bit of a hassle finding free proxies that work and haven't been used already for the same purpose, though I managed to get a decent handful of guest accounts with some patience. Obviously you could automate the process more to make it easier though I haven't really bothered yet.

@zoubidabida The script posted in https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357 can be used to get guest accounts, though you'd only be able to get one using your own IP. I edited it slightly to proxy the request so I could get more: ```js // Node v18.15.0 // yarn add axios import axios from 'axios' import { HttpsProxyAgent } from 'https-proxy-agent'; const TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w'; const TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'; const TW_ANDROID_BASIC_TOKEN = `Basic ${btoa(TW_CONSUMER_KEY+':'+TW_CONSUMER_SECRET)}`; const HTTP_PROXY = {host: "", port: ""}; const httpsAgent = new HttpsProxyAgent(HTTP_PROXY); const axios_proxied = axios.create({httpsAgent}); const getBearerToken = async () => { const tmpTokenResponse = await axios_proxied('https://api.twitter.com/oauth2/token', { headers: { Authorization: TW_ANDROID_BASIC_TOKEN, 'Content-Type': 'application/x-www-form-urlencoded' }, method: 'post', data: 'grant_type=client_credentials', }) return Object.values(tmpTokenResponse.data).join(" ") }; // The bearer token is immutable // Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F const bearer_token = await getBearerToken(); const guest_token = (await axios_proxied("https://api.twitter.com/1.1/guest/activate.json", { headers: { Authorization: bearer_token }, method: "post" })).data.guest_token; const flow_token = (await axios_proxied('https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us', { headers: { Authorization: bearer_token, 'Content-Type': 'application/json', 'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)', 'X-Twitter-API-Version': 5, 'X-Twitter-Client': 'TwitterAndroid', 'X-Twitter-Client-Version': '9.95.0-release.0', 'OS-Version': '28', 'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)', 'X-Twitter-Active-User': 'yes', 'X-Guest-Token': guest_token }, method: 'post', data: '{"flow_token":null,"input_flow_data":{"country_code":null,"flow_context":{"start_location":{"location":"splash_screen"}},"requested_variant":null,"target_user_id":0},"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}' })).data.flow_token; const subtasks = (await axios_proxied('https://api.twitter.com/1.1/onboarding/task.json', { headers: { Authorization: bearer_token, 'Content-Type': 'application/json', 'User-Agent': 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)', 'X-Twitter-API-Version': 5, 'X-Twitter-Client': 'TwitterAndroid', 'X-Twitter-Client-Version': '9.95.0-release.0', 'OS-Version': '28', 'System-User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)', 'X-Twitter-Active-User': 'yes', 'X-Guest-Token': guest_token }, method: 'post', data: '{"flow_token":"' + flow_token + '","subtask_inputs":[{"open_link":{"link":"next_link"},"subtask_id":"NextTaskOpenLink"}],"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}' })).data.subtasks; const account = subtasks.find(task => task.subtask_id === 'OpenAccount')?.open_account; console.log(account); // If you get an object like below it is successful // { // "user": { // "id": 168862000062124800, // "id_str": "168862000062124800", // "name": "Open App User", // "screen_name": "_LO_08072W00Z6G", // "user_type": "Soft" // }, // "next_link": { // "link_type": "subtask", // "link_id": "next_link", // "subtask_id": "OpenAppFlowStartAccountSetupOpenLink" // }, // "oauth_token": "168862000062124800-yOxTZxJc4nKGGJ0lik000069JgJJX", // "oauth_token_secret": "PSrSIwXo0000RvWvcwQ0000dLgay0000NbpvSztF6n", // "attribution_event": "signup" // } ``` Then just copy the returned objects into guest_accounts.json (you may have to modify them to add quotes around the key names since the ones I got back didn't have them) in an array and they should be loaded by nitter. It's a bit of a hassle finding free proxies that work and haven't been used already for the same purpose, though I managed to get a decent handful of guest accounts with some patience. Obviously you could automate the process more to make it easier though I haven't really bothered yet.
zedeus commented 2023-08-23 03:31:52 -04:00 (Migrated from github.com)

@OrangeFlavored change the last line to console.log(JSON.stringify(account));

@OrangeFlavored change the last line to `console.log(JSON.stringify(account));`
NicoBerlo commented 2023-08-23 03:36:41 -04:00 (Migrated from github.com)

@OrangeFlavored thanks !
Where do I put the json file once I have it ?

@OrangeFlavored thanks ! Where do I put the json file once I have it ?
OrangeFlavored commented 2023-08-23 03:43:00 -04:00 (Migrated from github.com)

@zoubidabida It should be saved as "guest_accounts.json" in the main nitter folder. You can see an example here of how it would look with 2 accounts though obviously I've redacted the actual credentials. Also I think many of these fields may not be necessary here but it's not like it does much harm leaving them in...

[
    {
        "user": {
            "id": [REMOVED],
            "id_str": [REMOVED],
            "name": [REMOVED],
            "screen_name": [REMOVED],
            "user_type": [REMOVED]
        },
        "next_link": {
            "link_type": [REMOVED],
            "link_id": [REMOVED],
            "subtask_id": [REMOVED]
        },
        "oauth_token": [REMOVED],
        "oauth_token_secret": [REMOVED],
        "attribution_event": [REMOVED]
    },
    {
        "user": {
            "id": [REMOVED],
            "id_str": [REMOVED],
            "name": [REMOVED],
            "screen_name": [REMOVED],
            "user_type": [REMOVED]
        },
        "next_link": {
            "link_type": [REMOVED],
            "link_id": [REMOVED],
            "subtask_id": [REMOVED]
        },
        "oauth_token": [REMOVED],
        "oauth_token_secret": [REMOVED],
        "attribution_event": [REMOVED]
    }
]
@zoubidabida It should be saved as "guest_accounts.json" in the main nitter folder. You can see an example here of how it would look with 2 accounts though obviously I've redacted the actual credentials. Also I think many of these fields may not be necessary here but it's not like it does much harm leaving them in... ```json [ { "user": { "id": [REMOVED], "id_str": [REMOVED], "name": [REMOVED], "screen_name": [REMOVED], "user_type": [REMOVED] }, "next_link": { "link_type": [REMOVED], "link_id": [REMOVED], "subtask_id": [REMOVED] }, "oauth_token": [REMOVED], "oauth_token_secret": [REMOVED], "attribution_event": [REMOVED] }, { "user": { "id": [REMOVED], "id_str": [REMOVED], "name": [REMOVED], "screen_name": [REMOVED], "user_type": [REMOVED] }, "next_link": { "link_type": [REMOVED], "link_id": [REMOVED], "subtask_id": [REMOVED] }, "oauth_token": [REMOVED], "oauth_token_secret": [REMOVED], "attribution_event": [REMOVED] } ] ```
NicoBerlo commented 2023-08-23 03:46:09 -04:00 (Migrated from github.com)

@zoubidabida It should be saved as "guest_accounts.json" in the main nitter folder. You can see an example here of how it would look with 2 accounts though obviously I've redacted the actual credentials. Also I think many of these fields may not be necessary here but it's not like it does much harm leaving them in...

awesome thanks !!

> @zoubidabida It should be saved as "guest_accounts.json" in the main nitter folder. You can see an example here of how it would look with 2 accounts though obviously I've redacted the actual credentials. Also I think many of these fields may not be necessary here but it's not like it does much harm leaving them in... awesome thanks !!
NicoBerlo commented 2023-08-23 03:59:40 -04:00 (Migrated from github.com)

@zoubidabida It should be saved as "guest_accounts.json" in the main nitter folder. You can see an example here of how it would look with 2 accounts though obviously I've redacted the actual credentials. Also I think many of these fields may not be necessary here but it's not like it does much harm leaving them in...

I'm getting this error :
reject(new AxiosError( ^ AxiosError: Request failed with status code 400 at settle (file:///home/nicolas/twaccounts/node_modules/axios/lib/core/settle.js:19:12) at IncomingMessage.handleStreamEnd (file:///home/nicolas/twaccounts/node_modules/axios/lib/adapters/http.js:570:11) at IncomingMessage.emit (node:events:525:35) at endReadableNT (node:internal/streams/readable:1359:12) at process.processTicksAndRejections (node:internal/process/task_queues:82:21) { code: 'ERR_BAD_REQUEST', config: { transitional: { silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false },

> @zoubidabida It should be saved as "guest_accounts.json" in the main nitter folder. You can see an example here of how it would look with 2 accounts though obviously I've redacted the actual credentials. Also I think many of these fields may not be necessary here but it's not like it does much harm leaving them in... I'm getting this error : ` reject(new AxiosError( ^ AxiosError: Request failed with status code 400 at settle (file:///home/nicolas/twaccounts/node_modules/axios/lib/core/settle.js:19:12) at IncomingMessage.handleStreamEnd (file:///home/nicolas/twaccounts/node_modules/axios/lib/adapters/http.js:570:11) at IncomingMessage.emit (node:events:525:35) at endReadableNT (node:internal/streams/readable:1359:12) at process.processTicksAndRejections (node:internal/process/task_queues:82:21) { code: 'ERR_BAD_REQUEST', config: { transitional: { silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false },`
OrangeFlavored commented 2023-08-23 04:02:00 -04:00 (Migrated from github.com)

Probably an issue with the proxy you used. Make sure it supports SSL, and in general if you're using free ones a lot of them just won't work so you may want to try a few.

If you just want one guest account you may be better off just using the initial version of the script for now (which will just use your own IP) which will get you one account without needing to find a proxy.

> Probably an issue with the proxy you used. Make sure it supports SSL, and in general if you're using free ones a lot of them just won't work so you may want to try a few. If you just want one guest account you may be better off just using the initial version of the script for now (which will just use your own IP) which will get you one account without needing to find a proxy.
NicoBerlo commented 2023-08-23 04:09:24 -04:00 (Migrated from github.com)

Probably an issue with the proxy you used. Make sure it supports SSL, and in general if you're using free ones a lot of them just won't work so you may want to try a few.

If you just want one guest account you may be better off just using the initial version of the script for now (which will just use your own IP) which will get you one account without needing to find a proxy.

Ok I switched to the no proxy version and I'm getting "undefined" output.
I'm sorry to bother you with this, I'm not used to nodejs :)

> > > > Probably an issue with the proxy you used. Make sure it supports SSL, and in general if you're using free ones a lot of them just won't work so you may want to try a few. > > If you just want one guest account you may be better off just using the initial version of the script for now (which will just use your own IP) which will get you one account without needing to find a proxy. Ok I switched to the no proxy version and I'm getting "undefined" output. I'm sorry to bother you with this, I'm not used to nodejs :)
OrangeFlavored commented 2023-08-23 04:11:06 -04:00 (Migrated from github.com)

Probably an issue with the proxy you used. Make sure it supports SSL, and in general if you're using free ones a lot of them just won't work so you may want to try a few.
If you just want one guest account you may be better off just using the initial version of the script for now (which will just use your own IP) which will get you one account without needing to find a proxy.

Ok I switched to the no proxy version and I'm getting "undefined" output. I'm sorry to bother you with this, I'm not used to nodejs :)

Most likely your IP has already been used to get a guest account then, I think this process is used for the Android app so if you're already using that maybe it already used yours up though I don't really know much about how that all works.

> > > > > > > > > Probably an issue with the proxy you used. Make sure it supports SSL, and in general if you're using free ones a lot of them just won't work so you may want to try a few. > > If you just want one guest account you may be better off just using the initial version of the script for now (which will just use your own IP) which will get you one account without needing to find a proxy. > > Ok I switched to the no proxy version and I'm getting "undefined" output. I'm sorry to bother you with this, I'm not used to nodejs :) Most likely your IP has already been used to get a guest account then, I think this process is used for the Android app so if you're already using that maybe it already used yours up though I don't really know much about how that all works.
NicoBerlo commented 2023-08-23 04:18:52 -04:00 (Migrated from github.com)

Most likely your IP has already been used to get a guest account then, I think this process is used for the Android app so if you're already using that maybe it already used yours up though I don't really know much about how that all works.

that's strange since I'm using a private ip.
I guess I need to wait for zed to implement a general solution then :)

> Most likely your IP has already been used to get a guest account then, I think this process is used for the Android app so if you're already using that maybe it already used yours up though I don't really know much about how that all works. that's strange since I'm using a private ip. I guess I need to wait for zed to implement a general solution then :)
NicoBerlo commented 2023-08-23 04:25:07 -04:00 (Migrated from github.com)

Most likely your IP has already been used to get a guest account then, I think this process is used for the Android app so if you're already using that maybe it already used yours up though I don't really know much about how that all works.

It worked with a separate computer !
Thanks !!

> > > > > Most likely your IP has already been used to get a guest account then, I think this process is used for the Android app so if you're already using that maybe it already used yours up though I don't really know much about how that all works. It worked with a separate computer ! Thanks !!
NicoBerlo commented 2023-08-23 04:51:46 -04:00 (Migrated from github.com)

@zedeus Hi, I applied the guest_account branch and I'm getting this error :
fatal.nim(54) sysFatal Error: unhandled exception: field 'elems' is not accessible for type 'JsonNodeObj' using 'kind = JObject' [FieldDefect]

I don't know how to solve this.
Thanks :)

@zedeus Hi, I applied the guest_account branch and I'm getting this error : `fatal.nim(54) sysFatal Error: unhandled exception: field 'elems' is not accessible for type 'JsonNodeObj' using 'kind = JObject' [FieldDefect]` I don't know how to solve this. Thanks :)
zedeus commented 2023-08-23 04:52:22 -04:00 (Migrated from github.com)

You need to put the object in a list, like so: [{"user": ...}]

You need to put the object in a list, like so: `[{"user": ...}]`
NicoBerlo commented 2023-08-23 04:54:57 -04:00 (Migrated from github.com)

You need to put the object in a list, like so: [{"user": ...}]

I'm so sorry, of course.
It works, my nitter instance is back up !!
thanks

> You need to put the object in a list, like so: `[{"user": ...}]` I'm so sorry, of course. It works, my nitter instance is back up !! thanks
NicoBerlo commented 2023-08-23 05:26:13 -04:00 (Migrated from github.com)

I used to make around 40 requests every 2 or 3 minutes. It was each time a get for a user. How many requests per hour do you think I can make now with the guest accounts more or less ?

I used to make around 40 requests every 2 or 3 minutes. It was each time a get for a user. How many requests per hour do you think I can make now with the guest accounts more or less ?
Bismanpal-Singh commented 2023-08-23 05:31:57 -04:00 (Migrated from github.com)

Looks like nitter is up and running but whats the deal of rate limit? How many requests can we put in to not get rate limit and scrape smoothly, would love to get any idea if someone has been testing it out

Looks like nitter is up and running but whats the deal of rate limit? How many requests can we put in to not get rate limit and scrape smoothly, would love to get any idea if someone has been testing it out
OrangeFlavored commented 2023-08-23 05:45:48 -04:00 (Migrated from github.com)

Looks like nitter is up and running but whats the deal of rate limit? How many requests can we put in to not get rate limit and scrape smoothly, would love to get any idea if someone has been testing it out

It seems like from my experience and some others here checking a user's basic timeline can be done fairly frequently (I saw the number 500 requests every 15 minutes posted earlier though I don't know if it still holds), but checking tweets+replies is much more strictly limited, and even rotating through 15 accounts and checking once per minute would eventually lead to getting limited. I haven't really tried other endpoints since they're not relevant to my needs. For now I've decided to switch over to doing both, checking basic tweets every 20 seconds and tweets and replies every 3 minutes, and see if that works to prevent anything from getting limited.

> Looks like nitter is up and running but whats the deal of rate limit? How many requests can we put in to not get rate limit and scrape smoothly, would love to get any idea if someone has been testing it out It seems like from my experience and some others here checking a user's basic timeline can be done fairly frequently (I saw the number 500 requests every 15 minutes posted earlier though I don't know if it still holds), but checking tweets+replies is much more strictly limited, and even rotating through 15 accounts and checking once per minute would eventually lead to getting limited. I haven't really tried other endpoints since they're not relevant to my needs. For now I've decided to switch over to doing both, checking basic tweets every 20 seconds and tweets and replies every 3 minutes, and see if that works to prevent anything from getting limited.
Bismanpal-Singh commented 2023-08-23 05:48:10 -04:00 (Migrated from github.com)

Alright , thanks for the info. I'll test some out myself and see how it works

> Alright , thanks for the info. I'll test some out myself and see how it works
DrSocket commented 2023-08-23 10:03:34 -04:00 (Migrated from github.com)

For anyone wondering how to login with a username\password, this snippet below should be helpful. I'm using a requests session in Python with the headers based on #983 (comment).

After task1, you pass the "att" response header as a request header to task2. Username is sent in task2. Password in task3. Task4 should give you the final auth. It gave it to me on the first try, but after running the code again, it asked for a confirmation code that was sent to my email, which is sent in task5. If correct code, auth is returned.

	
username = 'xxxxxxxxxxx'
password = 'xxxxxxxxxxx'

authentication = None

task1 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json',
	params={
		'flow_name': 'login',
		'api_version': '1',
		'known_device_token': '',
		'sim_country_code': 'us'
	},
	json={
		"flow_token": None,
		"input_flow_data": {
			"country_code": None,
			"flow_context": {
				"referrer_context": {
					"referral_details": "utm_source=google-play&utm_medium=organic",
					"referrer_url": ""
				},
				"start_location": {
					"location": "deeplink"
				}
			},
			"requested_variant": None,
			"target_user_id": 0
		}
	}
)

self.session.headers['att'] = task1.headers.get('att')
task2 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={
	"flow_token": task1.json().get('flow_token'),
	"subtask_inputs": [{
			"enter_text": {
				"suggestion_id": None,
				"text": username,
				"link": "next_link"
			},
			"subtask_id": "LoginEnterUserIdentifier"
		}
	]
})

task3 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={
	"flow_token": task2.json().get('flow_token'),
	"subtask_inputs": [{
			"enter_password": {
				"password": password,
				"link": "next_link"
			},
			"subtask_id": "LoginEnterPassword"
		}
	],
})

task4 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={
	"flow_token": task3.json().get('flow_token'),
	"subtask_inputs": [{
			"check_logged_in_account": {
				"link": "AccountDuplicationCheck_false"
			},
			"subtask_id": "AccountDuplicationCheck"
		}
	]
}).json()

for t4_subtask in task4.get('subtasks', []):
	if 'open_account' in t4_subtask:
		authentication = t4_subtask['open_account']
		break
	elif 'enter_text' in t4_subtask:
		response_text = t4_subtask['enter_text']['hint_text']
		code = input(f'Requesting {response_text}: ')
		task5 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={
			"flow_token": task4.get('flow_token'),
			"subtask_inputs": [{
				"enter_text": {
					"suggestion_id": None,
					"text": code,
					"link": "next_link"
				},
				"subtask_id": "LoginAcid"
			}]
		}).json()
		for t5_subtask in task5.get('subtasks', []):
			if 'open_account' in t5_subtask:
				authentication = t5_subtask['open_account']


print(authentication)
		
{
	'attribution_event': 'login',
	'known_device_token': 'XXXXXXXXXXXXXXXXXXXXXX',
	'next_link': {
		'link_id': 'next_link',
		'link_type': 'subtask',
		'subtask_id': 'SuccessExit'
	},
	'oauth_token': 'XXXXXXXXXXXXXXXXXXXXXX',
	'oauth_token_secret': 'XXXXXXXXXXXXXXXXXXXXXX',
	'user': {
		'id': 'XXXXXXXXXXXXXXXXXXXXXX',
		'id_str': 'XXXXXXXXXXXXXXXXXXXXXX',
		'name': 'XXXXXXXXXXXXXXXXXXXXXX',
		'screen_name': 'XXXXXXXXXXXXXXXXXXXXXX'
	}
}

for me this just returns {'errors': [{'code': 215, 'message': 'Bad Authentication data.'}]} on task 1. double checked the account logs in so it's not a problem of username or pwd.

> For anyone wondering how to login with a username\password, this snippet below should be helpful. I'm using a requests session in Python with the headers based on [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357). > > After task1, you pass the "att" response header as a request header to task2. Username is sent in task2. Password in task3. Task4 should give you the final auth. It gave it to me on the first try, but after running the code again, it asked for a confirmation code that was sent to my email, which is sent in task5. If correct code, auth is returned. > > ```python > > username = 'xxxxxxxxxxx' > password = 'xxxxxxxxxxx' > > authentication = None > > task1 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', > params={ > 'flow_name': 'login', > 'api_version': '1', > 'known_device_token': '', > 'sim_country_code': 'us' > }, > json={ > "flow_token": None, > "input_flow_data": { > "country_code": None, > "flow_context": { > "referrer_context": { > "referral_details": "utm_source=google-play&utm_medium=organic", > "referrer_url": "" > }, > "start_location": { > "location": "deeplink" > } > }, > "requested_variant": None, > "target_user_id": 0 > } > } > ) > > self.session.headers['att'] = task1.headers.get('att') > task2 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ > "flow_token": task1.json().get('flow_token'), > "subtask_inputs": [{ > "enter_text": { > "suggestion_id": None, > "text": username, > "link": "next_link" > }, > "subtask_id": "LoginEnterUserIdentifier" > } > ] > }) > > task3 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ > "flow_token": task2.json().get('flow_token'), > "subtask_inputs": [{ > "enter_password": { > "password": password, > "link": "next_link" > }, > "subtask_id": "LoginEnterPassword" > } > ], > }) > > task4 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ > "flow_token": task3.json().get('flow_token'), > "subtask_inputs": [{ > "check_logged_in_account": { > "link": "AccountDuplicationCheck_false" > }, > "subtask_id": "AccountDuplicationCheck" > } > ] > }).json() > > for t4_subtask in task4.get('subtasks', []): > if 'open_account' in t4_subtask: > authentication = t4_subtask['open_account'] > break > elif 'enter_text' in t4_subtask: > response_text = t4_subtask['enter_text']['hint_text'] > code = input(f'Requesting {response_text}: ') > task5 = self.session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ > "flow_token": task4.get('flow_token'), > "subtask_inputs": [{ > "enter_text": { > "suggestion_id": None, > "text": code, > "link": "next_link" > }, > "subtask_id": "LoginAcid" > }] > }).json() > for t5_subtask in task5.get('subtasks', []): > if 'open_account' in t5_subtask: > authentication = t5_subtask['open_account'] > > > print(authentication) > > { > 'attribution_event': 'login', > 'known_device_token': 'XXXXXXXXXXXXXXXXXXXXXX', > 'next_link': { > 'link_id': 'next_link', > 'link_type': 'subtask', > 'subtask_id': 'SuccessExit' > }, > 'oauth_token': 'XXXXXXXXXXXXXXXXXXXXXX', > 'oauth_token_secret': 'XXXXXXXXXXXXXXXXXXXXXX', > 'user': { > 'id': 'XXXXXXXXXXXXXXXXXXXXXX', > 'id_str': 'XXXXXXXXXXXXXXXXXXXXXX', > 'name': 'XXXXXXXXXXXXXXXXXXXXXX', > 'screen_name': 'XXXXXXXXXXXXXXXXXXXXXX' > } > } > ``` for me this just returns `{'errors': [{'code': 215, 'message': 'Bad Authentication data.'}]}` on task 1. double checked the account logs in so it's not a problem of username or pwd.
0o120 commented 2023-08-23 13:02:24 -04:00 (Migrated from github.com)

@DrSocket have you checked that you are using all the correct headers including guest token from: https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357

@DrSocket have you checked that you are using all the correct headers including guest token from: https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357
cmj commented 2023-08-23 19:10:04 -04:00 (Migrated from github.com)

I created a simple shell script today that is another alternative method of grabbing guest tokens. I have one that uses proxy servers but it sifted though over 1000 today and those that did connect were already denied guest tokens. For this I tethered my phone to my computer and just cycled the data on/off to grab a new IP.... Settling on 10 for now.

https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda

Edit: @AlyoshaVasilieva Thanks for the catch.

I created a simple shell script today that is another alternative method of grabbing guest tokens. I have one that uses proxy servers but it sifted though over 1000 today and those that did connect were already denied guest tokens. For this I tethered my phone to my computer and just cycled the data on/off to grab a new IP.... Settling on 10 for now. https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda Edit: @AlyoshaVasilieva Thanks for the catch.
AlyoshaVasilieva commented 2023-08-23 22:56:17 -04:00 (Migrated from github.com)

The shell script has some syntax errors, for example -H 'X-Twitter-API-Version': 5, 'X-Twitter-Client: TwitterAndroid' should be -H 'X-Twitter-API-Version: 5' -H 'X-Twitter-Client: TwitterAndroid'

The shell script has some syntax errors, for example `-H 'X-Twitter-API-Version': 5, 'X-Twitter-Client: TwitterAndroid'` should be `-H 'X-Twitter-API-Version: 5' -H 'X-Twitter-Client: TwitterAndroid'`
Yawning commented 2023-08-24 04:01:27 -04:00 (Migrated from github.com)

My crappy attempt at writing tooling for getting guest accounts, since I have been runing a personal instance to try to alleviate load on the public ones.

It is notably different from the other examples by:

  • Being written in Go vs node/shell/whatever.
  • Being split between a package that implements the actual account creation logic, and a trivial stub frontend to make it into a standalone executable.

The stub frontend the absolute bare minimum required for me to get accounts for my personal instance. The backend package can be used for more elaborate things. But if I'm being honest with myself "it's nothing special, and very Not-Invented-Here, because I dislike Node.js".

https://gitlab.com/yawning/twitter-guest-account

My crappy attempt at writing tooling for getting guest accounts, since I have been runing a personal instance to try to alleviate load on the public ones. It is notably different from the other examples by: - Being written in Go vs node/shell/whatever. - Being split between a package that implements the actual account creation logic, and a trivial stub frontend to make it into a standalone executable. The stub frontend the absolute bare minimum required for me to get accounts for my personal instance. The backend package can be used for more elaborate things. But if I'm being honest with myself "it's nothing special, and very Not-Invented-Here, because I dislike Node.js". https://gitlab.com/yawning/twitter-guest-account
OrangeFlavored commented 2023-08-24 08:41:51 -04:00 (Migrated from github.com)

Looks like nitter is up and running but whats the deal of rate limit? How many requests can we put in to not get rate limit and scrape smoothly, would love to get any idea if someone has been testing it out

It seems like from my experience and some others here checking a user's basic timeline can be done fairly frequently (I saw the number 500 requests every 15 minutes posted earlier though I don't know if it still holds), but checking tweets+replies is much more strictly limited, and even rotating through 15 accounts and checking once per minute would eventually lead to getting limited. I haven't really tried other endpoints since they're not relevant to my needs. For now I've decided to switch over to doing both, checking basic tweets every 20 seconds and tweets and replies every 3 minutes, and see if that works to prevent anything from getting limited.

Just an update for anyone who was interested that things seem to be relatively stable with this method (checking basic profile tweets every 20 seconds and tweets+replies every 3 minutes) and I haven't seen many accounts getting limited since then.

> > Looks like nitter is up and running but whats the deal of rate limit? How many requests can we put in to not get rate limit and scrape smoothly, would love to get any idea if someone has been testing it out > > It seems like from my experience and some others here checking a user's basic timeline can be done fairly frequently (I saw the number 500 requests every 15 minutes posted earlier though I don't know if it still holds), but checking tweets+replies is much more strictly limited, and even rotating through 15 accounts and checking once per minute would eventually lead to getting limited. I haven't really tried other endpoints since they're not relevant to my needs. For now I've decided to switch over to doing both, checking basic tweets every 20 seconds and tweets and replies every 3 minutes, and see if that works to prevent anything from getting limited. Just an update for anyone who was interested that things seem to be relatively stable with this method (checking basic profile tweets every 20 seconds and tweets+replies every 3 minutes) and I haven't seen many accounts getting limited since then.
NicoBerlo commented 2023-08-24 08:57:22 -04:00 (Migrated from github.com)

Just an update for anyone who was interested that things seem to be relatively stable with this method (checking basic profile tweets every 20 seconds and tweets+replies every 3 minutes) and I haven't seen many accounts getting limited

hi ! So you check one account every 20 secs with a simple get /user ?

> Just an update for anyone who was interested that things seem to be relatively stable with this method (checking basic profile tweets every 20 seconds and tweets+replies every 3 minutes) and I haven't seen many accounts getting limited hi ! So you check one account every 20 secs with a simple get /user ?
OrangeFlavored commented 2023-08-24 09:02:28 -04:00 (Migrated from github.com)

Just an update for anyone who was interested that things seem to be relatively stable with this method (checking basic profile tweets every 20 seconds and tweets+replies every 3 minutes) and I haven't seen many accounts getting limited

hi ! So you check one account every 20 secs with a simple get /user ?

Yeah, all on the same account, scraping http://localhost:[port]/[username] or http://localhost:[port]/[username]/with_replies if it's been more than 3 minutes since the last tweet+replies check.

> > Just an update for anyone who was interested that things seem to be relatively stable with this method (checking basic profile tweets every 20 seconds and tweets+replies every 3 minutes) and I haven't seen many accounts getting limited > > hi ! So you check one account every 20 secs with a simple get /user ? Yeah, all on the same account, scraping http://localhost:[port]/[username] or http://localhost:[port]/[username]/with_replies if it's been more than 3 minutes since the last tweet+replies check.
NicoBerlo commented 2023-08-24 09:07:02 -04:00 (Migrated from github.com)

Ok I’m using much more. I do 46 users every 5 minutes (separately). Yours is 180 an hour and I’m doing 552 an hour without any problems :)

Ok I’m using much more. I do 46 users every 5 minutes (separately). Yours is 180 an hour and I’m doing 552 an hour without any problems :)
dylanp-git commented 2023-08-24 09:35:19 -04:00 (Migrated from github.com)

Hey does anyone know what it means if I'm getting a response from the guest account flow which doesn't contain an open_account key with the necessary tokens. There are a lot of subtasks such as sign up but nothing useful by the looks of it.

Hey does anyone know what it means if I'm getting a response from the guest account flow which doesn't contain an open_account key with the necessary tokens. There are a lot of subtasks such as sign up but nothing useful by the looks of it.
zedeus commented 2023-08-24 10:30:39 -04:00 (Migrated from github.com)

@dylanp-git it means you can't do it again from that IP for another 24 hours

@dylanp-git it means you can't do it again from that IP for another 24 hours
AL-THE-BOT-FATHER commented 2023-08-24 16:34:06 -04:00 (Migrated from github.com)

Windows users... here is a Power Shell implementation to grab guest tokens quickly.

Tether your phone to your computer, and run this as many times as you can. Disconnect and repeat.

$guest_token = (Invoke-RestMethod -Method Post -Uri 'https://api.twitter.com/1.1/guest/activate.json' -Headers @{ 'Authorization' = 'Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' }).guest_token

$flow_token_response = (Invoke-RestMethod -Method Post -Uri 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' -Headers @{
    'Authorization'         = 'Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F'
    'Content-Type'          = 'application/json'
    'User-Agent'            = 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)'
    'X-Twitter-API-Version' = '5'
    'X-Twitter-Client'      = 'TwitterAndroid'
    'X-Twitter-Client-Version' = '9.95.0-release.0'
    'OS-Version'            = '28'
    'System-User-Agent'     = 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)'
    'X-Twitter-Active-User' = 'yes'
    'X-Guest-Token'         = $guest_token
} -Body '{
    "flow_token": null,
    "input_flow_data": {
        "country_code": null,
        "flow_context": {
            "start_location": {
                "location": "splash_screen"
            }
        },
        "requested_variant": null,
        "target_user_id": 0
    },
    "subtask_versions": {
        "generic_urt": 3,
        "standard": 1,
        "open_home_timeline": 1,
        "app_locale_update": 1,
        "enter_date": 1,
        "email_verification": 3,
        "enter_password": 5,
        "enter_text": 5,
        "one_tap": 2,
        "cta": 7,
        "single_sign_on": 1,
        "fetch_persisted_data": 1,
        "enter_username": 3,
        "web_modal": 2,
        "fetch_temporary_password": 1,
        "menu_dialog": 1,
        "sign_up_review": 5,
        "interest_picker": 4,
        "user_recommendations_urt": 3,
        "in_app_notification": 1,
        "sign_up": 2,
        "typeahead_search": 1,
        "user_recommendations_list": 4,
        "cta_inline": 1,
        "contacts_live_sync_permission_prompt": 3,
        "choice_selection": 5,
        "js_instrumentation": 1,
        "alert_dialog_suppress_client_events": 1,
        "privacy_options": 1,
        "topics_selector": 1,
        "wait_spinner": 3,
        "tweet_selection_urt": 1,
        "end_flow": 1,
        "settings_list": 7,
        "open_external_link": 1,
        "phone_verification": 5,
        "security_key": 3,
        "select_banner": 2,
        "upload_media": 1,
        "web": 2,
        "alert_dialog": 1,
        "open_account": 2,
        "action_list": 2,
        "enter_phone": 2,
        "open_link": 1,
        "show_code": 1,
        "update_users": 1,
        "check_logged_in_account": 1,
        "enter_email": 2,
        "select_avatar": 4,
        "location_permission_prompt": 2,
        "notifications_permission_prompt": 4
    }
}')

$flow_token = $flow_token_response.flow_token

$headers = @{
    'Authorization'         = 'Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F'
    'Content-Type'          = 'application/json'
    'User-Agent'            = 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)'
    'X-Twitter-API-Version' = '5'
    'X-Twitter-Client'      = 'TwitterAndroid'
    'X-Twitter-Client-Version' = '9.95.0-release.0'
    'OS-Version'            = '28'
    'System-User-Agent'     = 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)'
    'X-Twitter-Active-User' = 'yes'
    'X-Guest-Token'         = $guest_token
}

$payload = @{
    "flow_token" = $flow_token
    "subtask_inputs" = @(
        @{
            "open_link" = @{
                "link" = "next_link"
            }
            "subtask_id" = "NextTaskOpenLink"
        }
    )
    "subtask_versions" = @{
        "generic_urt" = 3
        "standard" = 1
        "open_home_timeline" = 1
        "app_locale_update" = 1
        "enter_date" = 1
        "email_verification" = 3
        "enter_password" = 5
        "enter_text" = 5
        "one_tap" = 2
        "cta" = 7
        "single_sign_on" = 1
        "fetch_persisted_data" = 1
        "enter_username" = 3
        "web_modal" = 2
        "fetch_temporary_password" = 1
        "menu_dialog" = 1
        "sign_up_review" = 5
        "interest_picker" = 4
        "user_recommendations_urt" = 3
        "in_app_notification" = 1
        "sign_up" = 2
        "typeahead_search" = 1
        "user_recommendations_list" = 4
        "cta_inline" = 1
        "contacts_live_sync_permission_prompt" = 3
        "choice_selection" = 5
        "js_instrumentation" = 1
        "alert_dialog_suppress_client_events" = 1
        "privacy_options" = 1
        "topics_selector" = 1
        "wait_spinner" = 3
        "tweet_selection_urt" = 1
        "end_flow" = 1
        "settings_list" = 7
        "open_external_link" = 1
        "phone_verification" = 5
        "security_key" = 3
        "select_banner" = 2
        "upload_media" = 1
        "web" = 2
        "alert_dialog" = 1
        "open_account" = 2
        "action_list" = 2
        "enter_phone" = 2
        "open_link" = 1
        "show_code" = 1
        "update_users" = 1
        "check_logged_in_account" = 1
        "enter_email" = 2
        "select_avatar" = 4
        "location_permission_prompt" = 2
        "notifications_permission_prompt" = 4
    }
}

$uri = 'https://api.twitter.com/1.1/onboarding/task.json'
$response = Invoke-RestMethod -Method Post -Uri $uri -Headers $headers -Body ($payload | ConvertTo-Json)

$open_account_result = $response.subtasks[0].open_account

Output:
user : @{id=1694805356575068160; id_str=1694805356575068160; name=Open App User; screen_name=_LO_0824v6z12eN; user_type=Soft}
next_link : @{link_type=subtask; link_id=next_link; subtask_id=OpenAppFlowStartAccountSetupOpenLink}
oauth_token : 1694805356575068160-HC5qZBoTAcyt9jTu8U0ZLRBbJTBXXX
oauth_token_secret : 1GT1jMrcNh5gkVDCAj7n8rxsl6CIkEvioxemNfSKc2XXX
attribution_event : signup

Windows users... here is a Power Shell implementation to grab guest tokens quickly. Tether your phone to your computer, and run this as many times as you can. Disconnect and repeat. ``` $guest_token = (Invoke-RestMethod -Method Post -Uri 'https://api.twitter.com/1.1/guest/activate.json' -Headers @{ 'Authorization' = 'Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' }).guest_token $flow_token_response = (Invoke-RestMethod -Method Post -Uri 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' -Headers @{ 'Authorization' = 'Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' 'Content-Type' = 'application/json' 'User-Agent' = 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' 'X-Twitter-API-Version' = '5' 'X-Twitter-Client' = 'TwitterAndroid' 'X-Twitter-Client-Version' = '9.95.0-release.0' 'OS-Version' = '28' 'System-User-Agent' = 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' 'X-Twitter-Active-User' = 'yes' 'X-Guest-Token' = $guest_token } -Body '{ "flow_token": null, "input_flow_data": { "country_code": null, "flow_context": { "start_location": { "location": "splash_screen" } }, "requested_variant": null, "target_user_id": 0 }, "subtask_versions": { "generic_urt": 3, "standard": 1, "open_home_timeline": 1, "app_locale_update": 1, "enter_date": 1, "email_verification": 3, "enter_password": 5, "enter_text": 5, "one_tap": 2, "cta": 7, "single_sign_on": 1, "fetch_persisted_data": 1, "enter_username": 3, "web_modal": 2, "fetch_temporary_password": 1, "menu_dialog": 1, "sign_up_review": 5, "interest_picker": 4, "user_recommendations_urt": 3, "in_app_notification": 1, "sign_up": 2, "typeahead_search": 1, "user_recommendations_list": 4, "cta_inline": 1, "contacts_live_sync_permission_prompt": 3, "choice_selection": 5, "js_instrumentation": 1, "alert_dialog_suppress_client_events": 1, "privacy_options": 1, "topics_selector": 1, "wait_spinner": 3, "tweet_selection_urt": 1, "end_flow": 1, "settings_list": 7, "open_external_link": 1, "phone_verification": 5, "security_key": 3, "select_banner": 2, "upload_media": 1, "web": 2, "alert_dialog": 1, "open_account": 2, "action_list": 2, "enter_phone": 2, "open_link": 1, "show_code": 1, "update_users": 1, "check_logged_in_account": 1, "enter_email": 2, "select_avatar": 4, "location_permission_prompt": 2, "notifications_permission_prompt": 4 } }') $flow_token = $flow_token_response.flow_token $headers = @{ 'Authorization' = 'Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' 'Content-Type' = 'application/json' 'User-Agent' = 'TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' 'X-Twitter-API-Version' = '5' 'X-Twitter-Client' = 'TwitterAndroid' 'X-Twitter-Client-Version' = '9.95.0-release.0' 'OS-Version' = '28' 'System-User-Agent' = 'Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' 'X-Twitter-Active-User' = 'yes' 'X-Guest-Token' = $guest_token } $payload = @{ "flow_token" = $flow_token "subtask_inputs" = @( @{ "open_link" = @{ "link" = "next_link" } "subtask_id" = "NextTaskOpenLink" } ) "subtask_versions" = @{ "generic_urt" = 3 "standard" = 1 "open_home_timeline" = 1 "app_locale_update" = 1 "enter_date" = 1 "email_verification" = 3 "enter_password" = 5 "enter_text" = 5 "one_tap" = 2 "cta" = 7 "single_sign_on" = 1 "fetch_persisted_data" = 1 "enter_username" = 3 "web_modal" = 2 "fetch_temporary_password" = 1 "menu_dialog" = 1 "sign_up_review" = 5 "interest_picker" = 4 "user_recommendations_urt" = 3 "in_app_notification" = 1 "sign_up" = 2 "typeahead_search" = 1 "user_recommendations_list" = 4 "cta_inline" = 1 "contacts_live_sync_permission_prompt" = 3 "choice_selection" = 5 "js_instrumentation" = 1 "alert_dialog_suppress_client_events" = 1 "privacy_options" = 1 "topics_selector" = 1 "wait_spinner" = 3 "tweet_selection_urt" = 1 "end_flow" = 1 "settings_list" = 7 "open_external_link" = 1 "phone_verification" = 5 "security_key" = 3 "select_banner" = 2 "upload_media" = 1 "web" = 2 "alert_dialog" = 1 "open_account" = 2 "action_list" = 2 "enter_phone" = 2 "open_link" = 1 "show_code" = 1 "update_users" = 1 "check_logged_in_account" = 1 "enter_email" = 2 "select_avatar" = 4 "location_permission_prompt" = 2 "notifications_permission_prompt" = 4 } } $uri = 'https://api.twitter.com/1.1/onboarding/task.json' $response = Invoke-RestMethod -Method Post -Uri $uri -Headers $headers -Body ($payload | ConvertTo-Json) $open_account_result = $response.subtasks[0].open_account ``` **Output:** user : @{id=1694805356575068160; id_str=1694805356575068160; name=Open App User; screen_name=_LO_0824v6z12eN; user_type=Soft} next_link : @{link_type=subtask; link_id=next_link; subtask_id=OpenAppFlowStartAccountSetupOpenLink} oauth_token : 1694805356575068160-HC5qZBoTAcyt9jTu8U0ZLRBbJTBXXX oauth_token_secret : 1GT1jMrcNh5gkVDCAj7n8rxsl6CIkEvioxemNfSKc2XXX attribution_event : signup
untitaker commented 2023-08-24 17:14:42 -04:00 (Migrated from github.com)

will there be a mode to make nitter grab the guest tokens directly as it needs them? applying for guest tokens in a central place seems annoying, running separate scripts as well.

my instance is very low-traffic (to the point where I am reasonably confident I do not need to even switch IP), and even if, I can already point nitter to a SOCKS HTTP proxy to facilitate that.

will there be a mode to make nitter grab the guest tokens directly as it needs them? applying for guest tokens in a central place seems annoying, running separate scripts as well. my instance is very low-traffic (to the point where I am reasonably confident I do not need to even switch IP), and even if, I can already point nitter to a ~SOCKS~ HTTP proxy to facilitate that.
cmj commented 2023-08-24 17:45:46 -04:00 (Migrated from github.com)

@untitaker That seems like an incredibly complex undertaking. I made 272 calls per hour with 3 tokens, I now have 20 only because I wanted figure out the process to grab them. With 3 guest accounts I didn't see any limit errors.

I would expect this not to be some backend tool that grabs more than one token beyond your working ipaddr. I had a proxy script run on 2000 IP's and only 3 returned with guest tokens today; many were already taken.

If it's private, or a small instance you can probably just get away with one.

@untitaker you can use socks4 too https://i.imgur.com/2vLMawn.png

@untitaker That seems like an incredibly complex undertaking. I made 272 calls per hour with 3 tokens, I now have 20 only because I wanted figure out the process to grab them. With 3 guest accounts I didn't see any limit errors. I would expect this not to be some backend tool that grabs more than one token beyond your working ipaddr. I had a proxy script run on 2000 IP's and only 3 returned with guest tokens today; many were already taken. If it's private, or a small instance you can probably just get away with one. @untitaker you can use socks4 too https://i.imgur.com/2vLMawn.png
Yetangitu commented 2023-08-25 05:55:11 -04:00 (Migrated from github.com)

I created a simple shell script today that is another alternative method of grabbing guest tokens. I have one that uses proxy servers but it sifted though over 1000 today and those that did connect were already denied guest tokens. For this I tethered my phone to my computer and just cycled the data on/off to grab a new IP.... Settling on 10 for now.

https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda

Edit: @AlyoshaVasilieva Thanks for the catch.

Run this on an Android mobile in Termux, switch to flight mode and back between runs and you get a stream of tokens in no time. Don't over do it so others also get a chance (although it would not surprise me if Xitter were less restrictive with mobile IP ranges when it comes to guest token generation).

> I created a simple shell script today that is another alternative method of grabbing guest tokens. I have one that uses proxy servers but it sifted though over 1000 today and those that did connect were already denied guest tokens. For this I tethered my phone to my computer and just cycled the data on/off to grab a new IP.... Settling on 10 for now. > > https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda > > Edit: @AlyoshaVasilieva Thanks for the catch. Run this on an Android mobile in Termux, switch to flight mode and back between runs and you get a stream of tokens in no time. Don't over do it so others also get a chance (although it would not surprise me if Xitter were less restrictive with mobile IP ranges when it comes to guest token generation).
DrSocket commented 2023-08-25 06:59:46 -04:00 (Migrated from github.com)

@DrSocket have you checked that you are using all the correct headers including guest token from: #983 (comment)

Hey, sorry for the late reply, had to work on something else. I got it running, it's all good. thanks a lot for the script! the 'enter_text' logic is in case it asks for email verification code right?

> @DrSocket have you checked that you are using all the correct headers including guest token from: [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357) Hey, sorry for the late reply, had to work on something else. I got it running, it's all good. thanks a lot for the script! the 'enter_text' logic is in case it asks for email verification code right?
0o120 commented 2023-08-25 07:13:27 -04:00 (Migrated from github.com)

@DrSocket have you checked that you are using all the correct headers including guest token from: #983 (comment)

Hey, sorry for the late reply, had to work on something else. I got it running, it's all good. thanks a lot for the script! the 'enter_text' logic is in case it asks for email verification code right?

Yea that's correct. 1 time it asked me for the confirmation code sent to my email, then a separate time it just asked for my phone number connected to the account. Both times I entered it, it worked.

> > @DrSocket have you checked that you are using all the correct headers including guest token from: [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357) > > Hey, sorry for the late reply, had to work on something else. I got it running, it's all good. thanks a lot for the script! the 'enter_text' logic is in case it asks for email verification code right? Yea that's correct. 1 time it asked me for the confirmation code sent to my email, then a separate time it just asked for my phone number connected to the account. Both times I entered it, it worked.
AL-THE-BOT-FATHER commented 2023-08-25 07:14:58 -04:00 (Migrated from github.com)

Would anyone be kind enough to share an example (python preferability) using just the oauth token and secret (guest tokens) in a Twitter API call? Like querying the latest ElonMusk tweet? Tweepy and other libraries require the consumer key and secret. Any help would be greatly appreciated.

Would anyone be kind enough to share an example (python preferability) using just the oauth token and secret (guest tokens) in a Twitter API call? Like querying the latest ElonMusk tweet? Tweepy and other libraries require the consumer key and secret. Any help would be greatly appreciated.
zedeus commented 2023-08-25 07:55:44 -04:00 (Migrated from github.com)

@Allen-Taylor You need all 4, consumer key and secret plus oauth token and secret, otherwise you can't sign a request.

@Allen-Taylor You need all 4, consumer key and secret plus oauth token and secret, otherwise you can't sign a request.
AL-THE-BOT-FATHER commented 2023-08-25 09:10:19 -04:00 (Migrated from github.com)

@Allen-Taylor You need all 4, consumer key and secret plus oauth token and secret, otherwise you can't sign a request.

First, thank you for all you do. Nitter is amazing.

Banka's example uses:
const TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w'
const TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'

These are used to create the Bearer token.

Are these using HIS consumer account creds or are these general consumer creds for the Android guest account?

If I am supposed to use other consumer creds, where do I get them?

Thank you for taking the time to answer my questions. I'm learning a lot from this thread.

> @Allen-Taylor You need all 4, consumer key and secret plus oauth token and secret, otherwise you can't sign a request. First, thank you for all you do. Nitter is amazing. Banka's example uses: const TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w' const TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys' These are used to create the Bearer token. Are these using HIS consumer account creds or are these general consumer creds for the Android guest account? If I am supposed to use other consumer creds, where do I get them? Thank you for taking the time to answer my questions. I'm learning a lot from this thread.
zedeus commented 2023-08-25 09:19:28 -04:00 (Migrated from github.com)

Those are tokens used by the official Android app, so don't worry about it.

Those are tokens used by the official Android app, so don't worry about it.
AL-THE-BOT-FATHER commented 2023-08-25 14:11:25 -04:00 (Migrated from github.com)

Those are tokens used by the official Android app, so don't worry about it.

Have you been able to generate any tokens today? Tried some of the scripts that worked but no go...

> Those are tokens used by the official Android app, so don't worry about it. Have you been able to generate any tokens today? Tried some of the scripts that worked but no go...
zedeus commented 2023-08-25 17:01:27 -04:00 (Migrated from github.com)

Yes, I don't have any issues generating tokens.

Yes, I don't have any issues generating tokens.
JonasBirk commented 2023-08-25 18:19:22 -04:00 (Migrated from github.com)

I am struggling to recreate the extended header successfully. I am constantly getting the error 401 on my side when trying to make a request.
Can someone share how the header should look like for a successful request?

I am struggling to recreate the extended header successfully. I am constantly getting the error 401 on my side when trying to make a request. Can someone share how the header should look like for a successful request?
csisoap commented 2023-08-25 23:26:29 -04:00 (Migrated from github.com)

I am struggling to recreate the extended header successfully. I am constantly getting the error 401 on my side when trying to make a request. Can someone share how the header should look like for a successful request?

It should be like this
Authorization: OAuth realm="http://api.twitter.com/", oauth_version="1.0", oauth_token="1692750343510335488-RDoNrQYUxlNe9A5wygl1JZMJs4oS3F", oauth_nonce="169250878645316925087864531692508786453", oauth_timestamp="1692508786", oauth_signature="fykucfKBx7da6qwzE4AQtwupEA4%3D", oauth_consumer_key="3nVuSoBZnx6U4vzUxf5w", oauth_signature_method="HMAC-SHA1"

Also you might need to check your signature, your signature might not be valid.

> I am struggling to recreate the extended header successfully. I am constantly getting the error 401 on my side when trying to make a request. Can someone share how the header should look like for a successful request? It should be like this `Authorization: OAuth realm="http://api.twitter.com/", oauth_version="1.0", oauth_token="1692750343510335488-RDoNrQYUxlNe9A5wygl1JZMJs4oS3F", oauth_nonce="169250878645316925087864531692508786453", oauth_timestamp="1692508786", oauth_signature="fykucfKBx7da6qwzE4AQtwupEA4%3D", oauth_consumer_key="3nVuSoBZnx6U4vzUxf5w", oauth_signature_method="HMAC-SHA1"` Also you might need to check your signature, your signature might not be valid.
Mertozturkk commented 2023-08-26 08:53:26 -04:00 (Migrated from github.com)

I would like to ask directly in order not to miss the subject. Can we access tweets with python as in the nitter documentation or do we need to use another method?

I would like to ask directly in order not to miss the subject. Can we access tweets with python as in the nitter documentation or do we need to use another method?
jiatern commented 2023-08-27 12:18:12 -04:00 (Migrated from github.com)

I successfully updated my self-hosted instance to the guest_accounts branch and a guest account generated from my own IP.

Everything works well except suddenly user search returns nothing. Searching tweets and directly viewing a user's tweets are all fine, and log shows nothing. I think it is not due to the guest account's rate limit because I can still search for tweets. Did I miss anything?

image

I successfully updated my self-hosted instance to the guest_accounts branch and a guest account generated from my own IP. Everything works well except suddenly user search returns nothing. Searching tweets and directly viewing a user's tweets are all fine, and log shows nothing. I think it is not due to the guest account's rate limit because I can still search for tweets. Did I miss anything? ![image](https://github.com/zedeus/nitter/assets/8150437/7203908c-798f-4abf-8cfd-80b5bd2efa13)
zedeus commented 2023-08-27 17:57:12 -04:00 (Migrated from github.com)

@jiatern what commit? Check the about page at /about

@jiatern what commit? Check the about page at /about
jiatern commented 2023-08-27 22:14:22 -04:00 (Migrated from github.com)

@jiatern what commit? Check the about page at /about

@zedeus The version shown in the about page is 2023.06.05-1234b9b, but git show HEAD shows that I am on the latest commit on the guest_accounts branch.
Nevermind, I started from scratch and rebuilt nitter, it now shows the correct commit 2023.08.26-7630f57. All is well now!

> @jiatern what commit? Check the about page at /about @zedeus ~~The version shown in the about page is [2023.06.05-1234b9b](https://github.com/zedeus/nitter/commit/1234b9b), but `git show HEAD` shows that I am on the latest commit on the guest_accounts branch.~~ Nevermind, I started from scratch and rebuilt nitter, it now shows the correct commit [2023.08.26-7630f57](https://github.com/zedeus/nitter/commit/7630f57). All is well now!
Fa5g commented 2023-08-28 13:11:34 -04:00 (Migrated from github.com)

Hi guys, it's amazing what you've managed to develop by discovering the new X endpoints. Let me ask you something, for searches through 1.1/search/universal.json I read in your previous posts that the rate limit is 50 per day per account, if so, to achieve 800 searches a day, would I have to get at least 16 accounts and rotate them?
My admiration to @zedeus , @BANKA2017 and to all those who have done their bit to get us to this point.

Hi guys, it's amazing what you've managed to develop by discovering the new X endpoints. Let me ask you something, for searches through 1.1/search/universal.json I read in your previous posts that the rate limit is 50 per day per account, if so, to achieve 800 searches a day, would I have to get at least 16 accounts and rotate them? My admiration to @zedeus , @BANKA2017 and to all those who have done their bit to get us to this point.
j-fbriere commented 2023-08-28 14:46:26 -04:00 (Migrated from github.com)

@Fa5g It's not 50 per day per account. It's 50 per 15 minutes per account.
And that rate limit is for the graphql search.
I don't know the rate limit of the 1.1/search/universal.json request. I don't think nitter is currently using this type of request anyway.

@Fa5g It's not 50 per day per account. It's 50 per 15 minutes per account. And that rate limit is for the graphql search. I don't know the rate limit of the 1.1/search/universal.json request. I don't think nitter is currently using this type of request anyway.
the-blank-x commented 2023-08-29 07:47:45 -04:00 (Migrated from github.com)

First of all, thanks zedeus for Nitter and everyone else for research or contributing in one way or another.
Second of all, here's a Python implementation for grabbing guest accounts/tokens, based on Allen-Taylor's Powershell implementation:

#!/usr/bin/env python3
import sys
import json
import textwrap
import requests

with requests.Session() as session:
    guest_token = session.post("https://api.twitter.com/1.1/guest/activate.json", headers={
        "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F",
    }).json()["guest_token"]

    flow_token_resp = session.post("https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us", headers={
        "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F",
        "Content-Type": "application/json",
        "User-Agent": "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)",
        "X-Twitter-API-Version": "5",
        "X-Twitter-Client": "TwitterAndroid",
        "X-Twitter-Client-Version": "9.95.0-release.0",
        "OS-Version": "28",
        "System-User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)",
        "X-Twitter-Active-User": "yes",
        "X-Guest-Token": guest_token,
    }, data=textwrap.dedent(
        """{
            "flow_token": null,
            "input_flow_data": {
                "country_code": null,
                "flow_context": {
                    "start_location": {
                        "location": "splash_screen"
                    }
                },
                "requested_variant": null,
                "target_user_id": 0
            },
            "subtask_versions": {
                "generic_urt": 3,
                "standard": 1,
                "open_home_timeline": 1,
                "app_locale_update": 1,
                "enter_date": 1,
                "email_verification": 3,
                "enter_password": 5,
                "enter_text": 5,
                "one_tap": 2,
                "cta": 7,
                "single_sign_on": 1,
                "fetch_persisted_data": 1,
                "enter_username": 3,
                "web_modal": 2,
                "fetch_temporary_password": 1,
                "menu_dialog": 1,
                "sign_up_review": 5,
                "interest_picker": 4,
                "user_recommendations_urt": 3,
                "in_app_notification": 1,
                "sign_up": 2,
                "typeahead_search": 1,
                "user_recommendations_list": 4,
                "cta_inline": 1,
                "contacts_live_sync_permission_prompt": 3,
                "choice_selection": 5,
                "js_instrumentation": 1,
                "alert_dialog_suppress_client_events": 1,
                "privacy_options": 1,
                "topics_selector": 1,
                "wait_spinner": 3,
                "tweet_selection_urt": 1,
                "end_flow": 1,
                "settings_list": 7,
                "open_external_link": 1,
                "phone_verification": 5,
                "security_key": 3,
                "select_banner": 2,
                "upload_media": 1,
                "web": 2,
                "alert_dialog": 1,
                "open_account": 2,
                "action_list": 2,
                "enter_phone": 2,
                "open_link": 1,
                "show_code": 1,
                "update_users": 1,
                "check_logged_in_account": 1,
                "enter_email": 2,
                "select_avatar": 4,
                "location_permission_prompt": 2,
                "notifications_permission_prompt": 4
            }
        }"""
    ))

    flow_token = flow_token_resp.json()["flow_token"]

    resp = session.post("https://api.twitter.com/1.1/onboarding/task.json", headers={
        "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F",
        "Content-Type": "application/json",
        "User-Agent": "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)",
        "X-Twitter-API-Version": "5",
        "X-Twitter-Client": "TwitterAndroid",
        "X-Twitter-Client-Version": "9.95.0-release.0",
        "OS-Version": "28",
        "System-User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)",
        "X-Twitter-Active-User": "yes",
        "X-Guest-Token": guest_token,
    }, data=json.dumps({
        "flow_token": flow_token,
        "subtask_inputs": [
            {
                "open_link": {
                    "link": "next_link",
                },
                "subtask_id": "NextTaskOpenLink",
            }
        ],
        "subtask_versions": {
            "generic_urt": 3,
            "standard": 1,
            "open_home_timeline": 1,
            "app_locale_update": 1,
            "enter_date": 1,
            "email_verification": 3,
            "enter_password": 5,
            "enter_text": 5,
            "one_tap": 2,
            "cta": 7,
            "single_sign_on": 1,
            "fetch_persisted_data": 1,
            "enter_username": 3,
            "web_modal": 2,
            "fetch_temporary_password": 1,
            "menu_dialog": 1,
            "sign_up_review": 5,
            "interest_picker": 4,
            "user_recommendations_urt": 3,
            "in_app_notification": 1,
            "sign_up": 2,
            "typeahead_search": 1,
            "user_recommendations_list": 4,
            "cta_inline": 1,
            "contacts_live_sync_permission_prompt": 3,
            "choice_selection": 5,
            "js_instrumentation": 1,
            "alert_dialog_suppress_client_events": 1,
            "privacy_options": 1,
            "topics_selector": 1,
            "wait_spinner": 3,
            "tweet_selection_urt": 1,
            "end_flow": 1,
            "settings_list": 7,
            "open_external_link": 1,
            "phone_verification": 5,
            "security_key": 3,
            "select_banner": 2,
            "upload_media": 1,
            "web": 2,
            "alert_dialog": 1,
            "open_account": 2,
            "action_list": 2,
            "enter_phone": 2,
            "open_link": 1,
            "show_code": 1,
            "update_users": 1,
            "check_logged_in_account": 1,
            "enter_email": 2,
            "select_avatar": 4,
            "location_permission_prompt": 2,
            "notifications_permission_prompt": 4,
        }
    }))

    try:
        print(json.dumps(resp.json()["subtasks"][0]["open_account"]))
    except KeyError:
        print("Failed to fetch guest account, is your IP rate limited or so?", file=sys.stderr)
        sys.exit(1)
First of all, thanks zedeus for Nitter and everyone else for research or contributing in one way or another. Second of all, here's a Python implementation for grabbing guest accounts/tokens, based on Allen-Taylor's Powershell implementation: <details> ```python #!/usr/bin/env python3 import sys import json import textwrap import requests with requests.Session() as session: guest_token = session.post("https://api.twitter.com/1.1/guest/activate.json", headers={ "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F", }).json()["guest_token"] flow_token_resp = session.post("https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us", headers={ "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F", "Content-Type": "application/json", "User-Agent": "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)", "X-Twitter-API-Version": "5", "X-Twitter-Client": "TwitterAndroid", "X-Twitter-Client-Version": "9.95.0-release.0", "OS-Version": "28", "System-User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)", "X-Twitter-Active-User": "yes", "X-Guest-Token": guest_token, }, data=textwrap.dedent( """{ "flow_token": null, "input_flow_data": { "country_code": null, "flow_context": { "start_location": { "location": "splash_screen" } }, "requested_variant": null, "target_user_id": 0 }, "subtask_versions": { "generic_urt": 3, "standard": 1, "open_home_timeline": 1, "app_locale_update": 1, "enter_date": 1, "email_verification": 3, "enter_password": 5, "enter_text": 5, "one_tap": 2, "cta": 7, "single_sign_on": 1, "fetch_persisted_data": 1, "enter_username": 3, "web_modal": 2, "fetch_temporary_password": 1, "menu_dialog": 1, "sign_up_review": 5, "interest_picker": 4, "user_recommendations_urt": 3, "in_app_notification": 1, "sign_up": 2, "typeahead_search": 1, "user_recommendations_list": 4, "cta_inline": 1, "contacts_live_sync_permission_prompt": 3, "choice_selection": 5, "js_instrumentation": 1, "alert_dialog_suppress_client_events": 1, "privacy_options": 1, "topics_selector": 1, "wait_spinner": 3, "tweet_selection_urt": 1, "end_flow": 1, "settings_list": 7, "open_external_link": 1, "phone_verification": 5, "security_key": 3, "select_banner": 2, "upload_media": 1, "web": 2, "alert_dialog": 1, "open_account": 2, "action_list": 2, "enter_phone": 2, "open_link": 1, "show_code": 1, "update_users": 1, "check_logged_in_account": 1, "enter_email": 2, "select_avatar": 4, "location_permission_prompt": 2, "notifications_permission_prompt": 4 } }""" )) flow_token = flow_token_resp.json()["flow_token"] resp = session.post("https://api.twitter.com/1.1/onboarding/task.json", headers={ "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F", "Content-Type": "application/json", "User-Agent": "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)", "X-Twitter-API-Version": "5", "X-Twitter-Client": "TwitterAndroid", "X-Twitter-Client-Version": "9.95.0-release.0", "OS-Version": "28", "System-User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)", "X-Twitter-Active-User": "yes", "X-Guest-Token": guest_token, }, data=json.dumps({ "flow_token": flow_token, "subtask_inputs": [ { "open_link": { "link": "next_link", }, "subtask_id": "NextTaskOpenLink", } ], "subtask_versions": { "generic_urt": 3, "standard": 1, "open_home_timeline": 1, "app_locale_update": 1, "enter_date": 1, "email_verification": 3, "enter_password": 5, "enter_text": 5, "one_tap": 2, "cta": 7, "single_sign_on": 1, "fetch_persisted_data": 1, "enter_username": 3, "web_modal": 2, "fetch_temporary_password": 1, "menu_dialog": 1, "sign_up_review": 5, "interest_picker": 4, "user_recommendations_urt": 3, "in_app_notification": 1, "sign_up": 2, "typeahead_search": 1, "user_recommendations_list": 4, "cta_inline": 1, "contacts_live_sync_permission_prompt": 3, "choice_selection": 5, "js_instrumentation": 1, "alert_dialog_suppress_client_events": 1, "privacy_options": 1, "topics_selector": 1, "wait_spinner": 3, "tweet_selection_urt": 1, "end_flow": 1, "settings_list": 7, "open_external_link": 1, "phone_verification": 5, "security_key": 3, "select_banner": 2, "upload_media": 1, "web": 2, "alert_dialog": 1, "open_account": 2, "action_list": 2, "enter_phone": 2, "open_link": 1, "show_code": 1, "update_users": 1, "check_logged_in_account": 1, "enter_email": 2, "select_avatar": 4, "location_permission_prompt": 2, "notifications_permission_prompt": 4, } })) try: print(json.dumps(resp.json()["subtasks"][0]["open_account"])) except KeyError: print("Failed to fetch guest account, is your IP rate limited or so?", file=sys.stderr) sys.exit(1) ``` </details>
riclops17 commented 2023-08-29 09:01:28 -04:00 (Migrated from github.com)

Hi guys, thanks Zedeus and this community for the amazing job you are doing on this project. I'm using Nitter to scrape tweets from the search and retrieve the location of the users. Right now, I'm using the oauth_token and oauth_token_secret in the headers to make the requests, and Express VPN . But lately, I've been getting blocked a lot, and changing the tokens has had no effect. If anyone can give me advice or has experience with something similar, I would really appreciate the help.

Hi guys, thanks Zedeus and this community for the amazing job you are doing on this project. I'm using Nitter to scrape tweets from the search and retrieve the location of the users. Right now, I'm using the oauth_token and oauth_token_secret in the headers to make the requests, and Express VPN . But lately, I've been getting blocked a lot, and changing the tokens has had no effect. If anyone can give me advice or has experience with something similar, I would really appreciate the help.
zedeus commented 2023-08-29 16:16:33 -04:00 (Migrated from github.com)

For anything beyond light scraping (a few requests per minute at most), you're going to need a lot of guest accounts. Twitter has never been known to hand out IP bans besides rate limits, so I wouldn't worry about using a VPN.

For anything beyond light scraping (a few requests per minute at most), you're going to need a lot of guest accounts. Twitter has never been known to hand out IP _bans_ besides rate limits, so I wouldn't worry about using a VPN.
NicoBerlo commented 2023-08-29 16:39:33 -04:00 (Migrated from github.com)

For anything beyond light scraping (a few requests per minute at most), you're going to need a lot of guest accounts. Twitter has never been known to hand out IP bans besides rate limits, so I wouldn't worry about using a VPN.

I’m currently scraping 46 users every minute with 10 guest accounts. I use GET /user 46 times and I haven’t been throttled since I started that a week ago

> For anything beyond light scraping (a few requests per minute at most), you're going to need a lot of guest accounts. Twitter has never been known to hand out IP _bans_ besides rate limits, so I wouldn't worry about using a VPN. I’m currently scraping 46 users every minute with 10 guest accounts. I use GET /user 46 times and I haven’t been throttled since I started that a week ago
zedeus commented 2023-08-29 19:42:25 -04:00 (Migrated from github.com)

For /user it's less of a problem. If you do /user/with_replies, /user/media, /user/search or /search then you need a lot more guest accounts.

For /user it's less of a problem. If you do /user/with_replies, /user/media, /user/search or /search then you need a lot more guest accounts.
Apachez- commented 2023-08-30 00:59:05 -04:00 (Migrated from github.com)

I’m currently scraping 46 users every minute with 10 guest accounts. I use GET /user 46 times and I haven’t been throttled since I started that a week ago

As I myself learned not too long ago nitter supports multiaccounts to make the load less on the nitter backend.

That is instead of:

httpx://nitter.net/user1
httpx://nitter.net/user1
httpx://nitter.net/user1

You can instead do:

httpx://nitter.net/user1,user2,user3

The above also works with /with_replies such as:

httpx://nitter.net/user1,user2,user3/with_replies
> I’m currently scraping 46 users every minute with 10 guest accounts. I use GET /user 46 times and I haven’t been throttled since I started that a week ago As I myself learned not too long ago nitter supports multiaccounts to make the load less on the nitter backend. That is instead of: ``` httpx://nitter.net/user1 httpx://nitter.net/user1 httpx://nitter.net/user1 ``` You can instead do: ``` httpx://nitter.net/user1,user2,user3 ``` The above also works with /with_replies such as: ``` httpx://nitter.net/user1,user2,user3/with_replies ```
MaxosHadj commented 2023-08-30 03:02:38 -04:00 (Migrated from github.com)

For anything beyond light scraping (a few requests per minute at most), you're going to need a lot of guest accounts. Twitter has never been known to hand out IP bans besides rate limits, so I wouldn't worry about using a VPN.

I’m currently scraping 46 users every minute with 10 guest accounts. I use GET /user 46 times and I haven’t been throttled since I started that a week ago

Are the 10 guest accounts each using a different IP address?

> > For anything beyond light scraping (a few requests per minute at most), you're going to need a lot of guest accounts. Twitter has never been known to hand out IP _bans_ besides rate limits, so I wouldn't worry about using a VPN. > > I’m currently scraping 46 users every minute with 10 guest accounts. I use GET /user 46 times and I haven’t been throttled since I started that a week ago Are the 10 guest accounts each using a different IP address?
NicoBerlo commented 2023-08-30 03:10:10 -04:00 (Migrated from github.com)

Are the 10 guest accounts each using a different IP address?

Yeah I used separate IPs when I created them.

> Are the 10 guest accounts each using a different IP address? Yeah I used separate IPs when I created them.
MaxosHadj commented 2023-08-30 03:20:59 -04:00 (Migrated from github.com)

Are the 10 guest accounts each using a different IP address?

Yeah I used separate IPs when I created them.

Do you also rotate your IPs when you scrape data (GET /user)?

> > Are the 10 guest accounts each using a different IP address? > > Yeah I used separate IPs when I created them. Do you also rotate your IPs when you scrape data (GET /user)?
NicoBerlo commented 2023-08-30 03:22:23 -04:00 (Migrated from github.com)

Do you also rotate your IPs when you scrape data (GET /user)?

No I do everything from my own instance. That’s why I use the many guest accounts

> Do you also rotate your IPs when you scrape data (GET /user)? No I do everything from my own instance. That’s why I use the many guest accounts
edel79 commented 2023-08-30 03:22:41 -04:00 (Migrated from github.com)

You can instead do:

httpx://nitter.net/user1,user2,user3

Not working wihout "/with_replies" : get the "no items found" message (with existing accounts, of course).


De : Apachez @.>
Envoyé : mercredi 30 août 2023 06:59
À : zedeus/nitter @.
>
Cc : edel79 @.>; Manual @.>
Objet : Re: [zedeus/nitter] looks like X/twitter(?) broke something again (Issue #983)

I’m currently scraping 46 users every minute with 10 guest accounts. I use GET /user 46 times and I haven’t been throttled since I started that a week ago

As I myself learned not too long ago nitter supports multiaccounts to make the load less on the nitter backend.

That is instead of:

httpx://nitter.net/user1
httpx://nitter.net/user1
httpx://nitter.net/user1

You can instead do:

httpx://nitter.net/user1,user2,user3

The above also works with /with_replies such as:

httpx://nitter.net/user1,user2,user3/with_replies

—
Reply to this email directly, view it on GitHubhttps://github.com/zedeus/nitter/issues/983#issuecomment-1698494056, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ALELY26M4WLIKQRFGYXSUZDXX3CDBANCNFSM6AAAAAA3QWLU6U.
You are receiving this because you are subscribed to this thread.Message ID: @.***>

You can instead do: httpx://nitter.net/user1,user2,user3 Not working wihout "/with_replies" : get the "no items found" message (with existing accounts, of course). ________________________________ De : Apachez ***@***.***> Envoyé : mercredi 30 août 2023 06:59 À : zedeus/nitter ***@***.***> Cc : edel79 ***@***.***>; Manual ***@***.***> Objet : Re: [zedeus/nitter] looks like X/twitter(?) broke something again (Issue #983) I’m currently scraping 46 users every minute with 10 guest accounts. I use GET /user 46 times and I haven’t been throttled since I started that a week ago As I myself learned not too long ago nitter supports multiaccounts to make the load less on the nitter backend. That is instead of: httpx://nitter.net/user1 httpx://nitter.net/user1 httpx://nitter.net/user1 You can instead do: httpx://nitter.net/user1,user2,user3 The above also works with /with_replies such as: httpx://nitter.net/user1,user2,user3/with_replies — Reply to this email directly, view it on GitHub<https://github.com/zedeus/nitter/issues/983#issuecomment-1698494056>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/ALELY26M4WLIKQRFGYXSUZDXX3CDBANCNFSM6AAAAAA3QWLU6U>. You are receiving this because you are subscribed to this thread.Message ID: ***@***.***>
riclops17 commented 2023-08-30 09:59:13 -04:00 (Migrated from github.com)

What would the structure of a guest account be like? It would be like a header with the oauth_token and oauth_token_secret

> What would the structure of a guest account be like? It would be like a header with the oauth_token and oauth_token_secret
RunlevelConsulting commented 2023-08-30 22:31:39 -04:00 (Migrated from github.com)

Thanks for all your work in this regard @zedeus and beyond. I was drawn back here as I get "No items found" on my nitter instance.

I can never seem to get the docker build working so rely on the docker image on Docker Hub. Any signs when a new updated image featuring a guest account system might be available?

Also for general people - are we any closer to working out rate limits for function (user/search), per IP? Is it possible to create like 50 guest accounts on the same IP or will Twitter eventually just rate limit the IP instead of the guest account?

--

I created a simple shell script today that is another alternative method of grabbing guest tokens. I have one that uses proxy servers but it sifted though over 1000 today and those that did connect were already denied guest tokens. For this I tethered my phone to my computer and just cycled the data on/off to grab a new IP.... Settling on 10 for now.

https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda

The first two curls work but the last gives an empty output?

Thanks for all your work in this regard @zedeus and beyond. I was drawn back here as I get "No items found" on my nitter instance. I can never seem to get the docker build working so rely on the docker image on Docker Hub. Any signs when a new updated image featuring a guest account system might be available? Also for general people - are we any closer to working out rate limits for function (user/search), per IP? Is it possible to create like 50 guest accounts on the same IP or will Twitter eventually just rate limit the IP instead of the guest account? -- > I created a simple shell script today that is another alternative method of grabbing guest tokens. I have one that uses proxy servers but it sifted though over 1000 today and those that did connect were already denied guest tokens. For this I tethered my phone to my computer and just cycled the data on/off to grab a new IP.... Settling on 10 for now. > > https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda The first two curls work but the last gives an empty output?
Yetangitu commented 2023-08-31 11:30:27 -04:00 (Migrated from github.com)

Here's a modified version of the script which automates the harvesting of tokens when run on an Android device through termux and bash on a rooted device (needed to control airplane mode) with WiFi disabled. It will attempt to get a token, toggle airplane mode, wait for a random period of time and repeat the process. New tokens are appended to a destination file.

To use the resulting file you need to add square brackets to the beginning and end to enclose the list of objects into an array. Either edit the file itself or run something along the lines of the following (where tokens is to be replaced with the file containing harvested tokens):

echo '[' $(cat tokens) ']' > guest_accounts.json

Here's how to use the script, remember it needs to be run on a rooted Android device (tested with Android 9) with an active data connection and wifi disabled since it uses the fact that those devices get new IP addresses on every reconnect:

USE:    get_tokens name_of_token_file [ count ]
        where count is the number of tokens to collect
        default is unlimited, until the script is terminated (ctrl-C)

...and here is the script:

#!/data/data/com.termux/files/usr/bin/bash

airplane_mode () {
	if [ $1 -eq 1 ]; then
		state=true
	else
		set -- 0 # make sure $1 == 0
		state=false
	fi

	su -c settings put global airplane_mode_on $1
	su -c am broadcast -a android.intent.action.AIRPLANE_MODE --ez state $state
}

get_token () {
	# Grab Twitter guest account tokens for use with Nitter. 
	# https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda

	guest_token=$(curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' | jq -r '.guest_token')

	flow_token=$(curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' \
	  -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
	  -H 'Content-Type: application/json' \
	  -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \
	  -H 'X-Twitter-API-Version: 5' \
	  -H 'X-Twitter-Client: TwitterAndroid' \
	  -H 'X-Twitter-Client-Version: 9.95.0-release.0' \
	  -H 'OS-Version: 28' \
	  -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \
	  -H 'X-Twitter-Active-User: yes' \
	  -H "X-Guest-Token: ${guest_token}" \
	  -d '{"flow_token":null,"input_flow_data":{"country_code":null,"flow_context":{"start_location":{"location":"splash_screen"}},"requested_variant":null,"target_user_id":0},"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}' | jq -r .flow_token)

	curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \
	  -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
	  -H 'Content-Type: application/json' \
	  -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \
	  -H 'X-Twitter-API-Version 5' \
	  -H 'X-Twitter-Client: TwitterAndroid' \
	  -H 'X-Twitter-Client-Version: 9.95.0-release.0' \
	  -H 'OS-Version: 28' \
	  -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \
	  -H 'X-Twitter-Active-User: yes' \
	  -H "X-Guest-Token: ${guest_token}" \
	  -d "{\"flow_token\":\"${flow_token}\",\"subtask_inputs\":[{\"open_link\":{\"link\":\"next_link\"},\"subtask_id\":\"NextTaskOpenLink\"}],\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}" | jq -r '.subtasks[0]|if(.open_account) then .open_account else empty end'
}

countdown () {
        for n in $(seq $1 -1 0); do
                printf "\r%s%d%s   " "$2" "$n" "$3"
                sleep 1
        done
        printf "\r%s%d%s   " "$2" "$n" "$3"|tr '[[:print:]]' ' '
}

if [ -z "$1" ]; then
	printf "USE:\t$0 name_of_token_file [ count ]\n"
	printf "\twhere count is the number of tokens to collect\n"
	printf "\tdefault is unlimited, until the script is terminated (ctrl-C)\n"
	exit 1
fi

if [ -n $2 -a $2 -gt 0 ]; then
	target=$2
	echo Will harvest $target tokens...
else
	echo Will run until terminated...
fi

destination="$1"

if [ -f "$destination" ]; then
	token_count=$(grep oauth_token_secret "$destination"|wc -l)
	if [ $token_count -gt 0 ]; then
		echo "token file ($destination) already exists and contains $token_count tokens, new tokens will be appended to it"
	else
		echo "token file ($destination) exists but does not contain any tokens, are you sure this is a token file?"
		echo "New tokens will be appeneded to the end of the file, press ctrl-C to abort if you chose the wrong file"
	fi
fi

countdown 10 "Harvesting into $destination in " " seconds (ctrl-C to abort)"

printf "\rStarting now...                                               \n"
count=0

while :; do
	token="$(get_token)"
	if [ -n "$token" ]; then
		echo "${token}," >> "$destination"
		((count++))
		echo "got one token (#$count)..."
		if [ -n $target -a $count -ge $target ]; then
			echo "Reached target number of tokens ($target), terminating..."
			exit
		fi
	else
		echo "no token"
	fi
	airplane_mode 1 2>&1 >/dev/null
	sleep 3
	airplane_mode 0 2>&1 >/dev/null
	countdown $((RANDOM/2000+5)) "waiting (" ")" # introduce a random wait between 5 and 21 seconds
done
Here's a modified version of the script which automates the harvesting of tokens when run on an Android device through termux and bash _on a rooted device_ (needed to control airplane mode) with _WiFi disabled_. It will attempt to get a token, toggle airplane mode, wait for a random period of time and repeat the process. New tokens are appended to a destination file. To use the resulting file you need to add square brackets to the beginning and end to enclose the list of objects into an array. Either edit the file itself or run something along the lines of the following (where _tokens_ is to be replaced with the file containing harvested tokens): ``` shell echo '[' $(cat tokens) ']' > guest_accounts.json ``` Here's how to use the script, remember it needs to be run on a *rooted* Android device (tested with Android 9) with an active data connection *and wifi disabled* since it uses the fact that those devices get new IP addresses on every reconnect: ``` USE: get_tokens name_of_token_file [ count ] where count is the number of tokens to collect default is unlimited, until the script is terminated (ctrl-C) ``` ...and here is the script: ``` shell #!/data/data/com.termux/files/usr/bin/bash airplane_mode () { if [ $1 -eq 1 ]; then state=true else set -- 0 # make sure $1 == 0 state=false fi su -c settings put global airplane_mode_on $1 su -c am broadcast -a android.intent.action.AIRPLANE_MODE --ez state $state } get_token () { # Grab Twitter guest account tokens for use with Nitter. # https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda guest_token=$(curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' | jq -r '.guest_token') flow_token=$(curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' \ -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ -H 'Content-Type: application/json' \ -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \ -H 'X-Twitter-API-Version: 5' \ -H 'X-Twitter-Client: TwitterAndroid' \ -H 'X-Twitter-Client-Version: 9.95.0-release.0' \ -H 'OS-Version: 28' \ -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \ -H 'X-Twitter-Active-User: yes' \ -H "X-Guest-Token: ${guest_token}" \ -d '{"flow_token":null,"input_flow_data":{"country_code":null,"flow_context":{"start_location":{"location":"splash_screen"}},"requested_variant":null,"target_user_id":0},"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}' | jq -r .flow_token) curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \ -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ -H 'Content-Type: application/json' \ -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \ -H 'X-Twitter-API-Version 5' \ -H 'X-Twitter-Client: TwitterAndroid' \ -H 'X-Twitter-Client-Version: 9.95.0-release.0' \ -H 'OS-Version: 28' \ -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \ -H 'X-Twitter-Active-User: yes' \ -H "X-Guest-Token: ${guest_token}" \ -d "{\"flow_token\":\"${flow_token}\",\"subtask_inputs\":[{\"open_link\":{\"link\":\"next_link\"},\"subtask_id\":\"NextTaskOpenLink\"}],\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}" | jq -r '.subtasks[0]|if(.open_account) then .open_account else empty end' } countdown () { for n in $(seq $1 -1 0); do printf "\r%s%d%s " "$2" "$n" "$3" sleep 1 done printf "\r%s%d%s " "$2" "$n" "$3"|tr '[[:print:]]' ' ' } if [ -z "$1" ]; then printf "USE:\t$0 name_of_token_file [ count ]\n" printf "\twhere count is the number of tokens to collect\n" printf "\tdefault is unlimited, until the script is terminated (ctrl-C)\n" exit 1 fi if [ -n $2 -a $2 -gt 0 ]; then target=$2 echo Will harvest $target tokens... else echo Will run until terminated... fi destination="$1" if [ -f "$destination" ]; then token_count=$(grep oauth_token_secret "$destination"|wc -l) if [ $token_count -gt 0 ]; then echo "token file ($destination) already exists and contains $token_count tokens, new tokens will be appended to it" else echo "token file ($destination) exists but does not contain any tokens, are you sure this is a token file?" echo "New tokens will be appeneded to the end of the file, press ctrl-C to abort if you chose the wrong file" fi fi countdown 10 "Harvesting into $destination in " " seconds (ctrl-C to abort)" printf "\rStarting now... \n" count=0 while :; do token="$(get_token)" if [ -n "$token" ]; then echo "${token}," >> "$destination" ((count++)) echo "got one token (#$count)..." if [ -n $target -a $count -ge $target ]; then echo "Reached target number of tokens ($target), terminating..." exit fi else echo "no token" fi airplane_mode 1 2>&1 >/dev/null sleep 3 airplane_mode 0 2>&1 >/dev/null countdown $((RANDOM/2000+5)) "waiting (" ")" # introduce a random wait between 5 and 21 seconds done ```
0o120 commented 2023-08-31 12:26:54 -04:00 (Migrated from github.com)

Might be wise to create lots of real accounts. Since browsing Twitter on the app without being logged in was removed, who knows how long until they just nuke all the guest accounts and disable making them. In my opinion, a handful of real accounts would be the way to go to be better prepared for whatever comes next.

Might be wise to create lots of real accounts. Since browsing Twitter on the app without being logged in was removed, who knows how long until they just nuke all the guest accounts and disable making them. In my opinion, a handful of real accounts would be the way to go to be better prepared for whatever comes next.
ImTheDeveloper commented 2023-08-31 12:28:29 -04:00 (Migrated from github.com)

Might be wise to create lots of real accounts. Since browsing Twitter on the app without being logged in was removed, who knows how long until they just nuke all the guest accounts and disable making them. In my opinion, a handful of real accounts would be the way to go to be better prepared for whatever comes next.

Agree I don't see this lasting long..the surge in guest accounts is a huge give away now unfortunately

> Might be wise to create lots of real accounts. Since browsing Twitter on the app without being logged in was removed, who knows how long until they just nuke all the guest accounts and disable making them. In my opinion, a handful of real accounts would be the way to go to be better prepared for whatever comes next. Agree I don't see this lasting long..the surge in guest accounts is a huge give away now unfortunately
Yetangitu commented 2023-08-31 12:39:13 -04:00 (Migrated from github.com)

Yes, it is doubtful things will remain working for long this way, they'll eventually start tying guest accounts to some identifier - IMEI, IMSI, whatever - to limit the number of guest accounts useable from a single device or do away with them altogether. As to making real accounts, well... maybe. They'll be able to put a limit on those as well by tying them to phone numbers or - $deity forbid - some form of ID document.

Yes, it is doubtful things will remain working for long this way, they'll eventually start tying guest accounts to some identifier - IMEI, IMSI, whatever - to limit the number of guest accounts useable from a single device or do away with them altogether. As to making real accounts, well... maybe. They'll be able to put a limit on those as well by tying them to phone numbers or - $deity forbid - some form of ID document.
notherenorthere commented 2023-08-31 14:25:23 -04:00 (Migrated from github.com)

not sure if it's related to this issue? but I'm getting This site can’t be reached. I can't even access https://nitter.net/about

not sure if it's related to this issue? but I'm getting This site can’t be reached. I can't even access https://nitter.net/about
zedeus commented 2023-08-31 15:50:17 -04:00 (Migrated from github.com)

@notherenorthere you probably got IP banned. What are you using nitter.net for?

@notherenorthere you probably got IP banned. What are you using nitter.net for?
rbfowler9lfc commented 2023-08-31 16:00:13 -04:00 (Migrated from github.com)

@notherenorthere @zedeus Same thing here but nothing out of the ordinary, just eventual browsing. ISP got banned perhaps?

@notherenorthere @zedeus Same thing here but nothing out of the ordinary, just eventual browsing. ISP got banned perhaps?
zedeus commented 2023-08-31 16:26:49 -04:00 (Migrated from github.com)

@rbfowler9lfc I was setting up a new rate limiting strategy that seems to have had some false positives. This should be fixed now.

@rbfowler9lfc I was setting up a new rate limiting strategy that seems to have had some false positives. This should be fixed now.
notherenorthere commented 2023-08-31 16:38:31 -04:00 (Migrated from github.com)

oh?? just browsing! after I posted this I figured I should've first checked on google if it was down and when it said it was down I'd check from time to time if it was working okay. Because it didn't go out completely, it went out, then it was normal again and then it died again and a few mins ago I checked and it was still down and says the same here https://downforeveryoneorjustme.com/nitter.net and here https://updownradar.com/status/nitter.net however I'm not sure how trust worthy those sites are

> oh?? just browsing! after I posted this I figured I should've first checked on google if it was down and when it said it was down I'd check from time to time if it was working okay. Because it didn't go out completely, it went out, then it was normal again and then it died again and a few mins ago I checked and it was still down and says the same here https://downforeveryoneorjustme.com/nitter.net and here https://updownradar.com/status/nitter.net however I'm not sure how trust worthy those sites are
notherenorthere commented 2023-08-31 16:39:59 -04:00 (Migrated from github.com)

it's working now please ignoreeee!! I just checked hehe
Edit: dead again lol ahhh I'll check it out later I'm a bit busy rn :(((((

it's working now please ignoreeee!! I just checked hehe Edit: dead again lol ahhh I'll check it out later I'm a bit busy rn :(((((
rbfowler9lfc commented 2023-08-31 16:44:56 -04:00 (Migrated from github.com)

Working again here, thanks @zedeus !
Edit: Checked now and it's down again on home internet but working on cell network, around 2023-08-31T21:55:00Z

~~Working again here~~, thanks @zedeus ! Edit: Checked now and it's down again on home internet but working on cell network, around 2023-08-31T21:55:00Z
zedeus commented 2023-08-31 18:01:25 -04:00 (Migrated from github.com)

@notherenorthere @rbfowler9lfc Please email me your IP addresses that are blocked and I'll take a look to figure out why.

@notherenorthere @rbfowler9lfc Please email me your IP addresses that are blocked and I'll take a look to figure out why.
notherenorthere commented 2023-08-31 18:23:25 -04:00 (Migrated from github.com)

@notherenorthere @rbfowler9lfc Please email me your IP addresses that are blocked and I'll take a look to figure out why.

I emailed you @ the addy in here: https://github.com/zedeus/nitter I don't copy+paste it in case we can't do that

> > @notherenorthere @rbfowler9lfc Please email me your IP addresses that are blocked and I'll take a look to figure out why. I emailed you @ the addy in here: https://github.com/zedeus/nitter I don't copy+paste it in case we can't do that
zedeus commented 2023-08-31 20:50:27 -04:00 (Migrated from github.com)

I think I just found out why it happened, should be fixed now!

I think I just found out why it happened, should be fixed now!
sajiljosephs commented 2023-09-01 02:17:10 -04:00 (Migrated from github.com)

@zedeus I am getting below error:
syncio.nim(855) readFile
Error: unhandled exception: cannot open: ./guest_accounts.json [IOError]

What could be the reason for it. I am running my own nitter instance locally with the guest_accounts branch

@zedeus I am getting below error: syncio.nim(855) readFile Error: unhandled exception: cannot open: ./guest_accounts.json [IOError] What could be the reason for it. I am running my own nitter instance locally with the guest_accounts branch
the-blank-x commented 2023-09-01 03:20:18 -04:00 (Migrated from github.com)

The guest_accounts branch expects a guest_accounts.json file (placed next to nitter.conf). See https://github.com/zedeus/nitter/pull/985#issuecomment-1685963751 for how it's formatted

The guest_accounts branch expects a guest_accounts.json file (placed next to nitter.conf). See https://github.com/zedeus/nitter/pull/985#issuecomment-1685963751 for how it's formatted
guillaumekoto commented 2023-09-01 03:50:12 -04:00 (Migrated from github.com)

Any update for the docker image zedeus/nitter?

Any update for the docker image zedeus/nitter?
orbea commented 2023-09-01 10:16:29 -04:00 (Migrated from github.com)

@zedeus There is still censorship that affects nitter.net.

This Tweet from @ has been withheld in Portugal, Finland, Sweden, Ireland, Slovenia, Czech Republic, Poland, Slovakia, Hungary, Italy, Malta, Germany, Greece, Romania, Netherlands, Bulgaria, Austria, Luxembourg, Latvia, United Kingdom, Denmark, Lithuania, Croatia, Estonia, Cyprus, France, Spain, Belgium in response to a legal demand. Learn more.

https://nitter.net/i/status/1697308269528654180#m

@zedeus There is still censorship that affects nitter.net. >This Tweet from @ has been withheld in Portugal, Finland, Sweden, Ireland, Slovenia, Czech Republic, Poland, Slovakia, Hungary, Italy, Malta, Germany, Greece, Romania, Netherlands, Bulgaria, Austria, Luxembourg, Latvia, United Kingdom, Denmark, Lithuania, Croatia, Estonia, Cyprus, France, Spain, Belgium in response to a legal demand. Learn more. https://nitter.net/i/status/1697308269528654180#m
zedeus commented 2023-09-01 10:24:48 -04:00 (Migrated from github.com)

@guillaumekoto not yet.
@orbea nothing I can do, depends on where the instance is hosted.

@guillaumekoto not yet. @orbea nothing I can do, depends on where the instance is hosted.
rbfowler9lfc commented 2023-09-01 11:39:37 -04:00 (Migrated from github.com)

@zedeus no longer banned here, thanks again!

@zedeus no longer banned here, thanks again!
Apachez- commented 2023-09-01 22:29:11 -04:00 (Migrated from github.com)

I think I just found out why it happened, should be fixed now!

Happend here too, mail sent.

Using multiuser requests as in https://nitter.net/user1,user2,user3/with_replies

> I think I just found out why it happened, should be fixed now! Happend here too, mail sent. Using multiuser requests as in https://nitter.net/user1,user2,user3/with_replies
zedeus commented 2023-09-01 22:44:15 -04:00 (Migrated from github.com)

@Apachez- thank you! It helped me identify an overlooked edge case, which should now be fixed.

@Apachez- thank you! It helped me identify an overlooked edge case, which should now be fixed.
Apachez- commented 2023-09-01 23:10:12 -04:00 (Migrated from github.com)

@zedeus Thanks! :-)

@zedeus Thanks! :-)
machaudhary commented 2023-09-02 03:49:20 -04:00 (Migrated from github.com)

The guest_accounts branch expects a guest_accounts.json file (placed next to nitter.conf). See #985 (comment) for how it's formatted

@the-blank-x I am also getting the same error. Can't seem to resolve it. Can you help?

syncio.nim(855)          readFile
Error: unhandled exception: cannot open: ./guest_accounts.json [IOError]

I have placed guest_accounts.json at the same level as nitter.conf.
WhatsApp Image 2023-09-02 at 13 14 20

Format of guest_accounts.json:

[{"user":{"id":1693553468835831800,"id_str":"1693553468835831808","name":"Open App User","screen_name":"_LO_082193WA35n","user_type":"Soft"},"next_link":{"link_type":"subtask","link_id":"next_link","subtask_id":"OpenAppFlowStartAccountSetupOpenLink"},"oauth_token":"1693553468835831808-TBis5qLp17jenKVyu9jeRjnTcTKjpL","oauth_token_secret":"BvbmNeJucYaUAWoEzrSUzTjkWxifoYaqAnjXTevL6ICxU","attribution_event":"signup"}]

Steps to run:
WhatsApp Image 2023-09-02 at 13 13 54

> The guest_accounts branch expects a guest_accounts.json file (placed next to nitter.conf). See [#985 (comment)](https://github.com/zedeus/nitter/pull/985#issuecomment-1685963751) for how it's formatted @the-blank-x I am also getting the same error. Can't seem to resolve it. Can you help? ``` syncio.nim(855) readFile Error: unhandled exception: cannot open: ./guest_accounts.json [IOError] ``` I have placed guest_accounts.json at the same level as nitter.conf. ![WhatsApp Image 2023-09-02 at 13 14 20](https://github.com/zedeus/nitter/assets/121080377/cee5afc4-b786-4955-8293-27bef9b76598) Format of guest_accounts.json: ``` [{"user":{"id":1693553468835831800,"id_str":"1693553468835831808","name":"Open App User","screen_name":"_LO_082193WA35n","user_type":"Soft"},"next_link":{"link_type":"subtask","link_id":"next_link","subtask_id":"OpenAppFlowStartAccountSetupOpenLink"},"oauth_token":"1693553468835831808-TBis5qLp17jenKVyu9jeRjnTcTKjpL","oauth_token_secret":"BvbmNeJucYaUAWoEzrSUzTjkWxifoYaqAnjXTevL6ICxU","attribution_event":"signup"}] ``` Steps to run: ![WhatsApp Image 2023-09-02 at 13 13 54](https://github.com/zedeus/nitter/assets/121080377/b0b64c5d-6259-477f-a398-a547f2a2ead3)
the-blank-x commented 2023-09-02 04:18:15 -04:00 (Migrated from github.com)

The docker container cannot see the file, add -v $(pwd)/guest_accounts.json:/src/guest_accounts.json after -v $(pwd)/nitter.conf:/src/nitter.conf (or before, the order doesn't matter too much)

The docker container cannot see the file, add `-v $(pwd)/guest_accounts.json:/src/guest_accounts.json` after `-v $(pwd)/nitter.conf:/src/nitter.conf` (or before, the order doesn't matter too much)
RunlevelConsulting commented 2023-09-02 08:34:01 -04:00 (Migrated from github.com)

Does anyone else get the same output running the various "create guest account" scripts in this thread?

How come my output doesn't have the .open_account key?

{
  "flow_token": "g;169365264997293054:-1693652649980:PN9V4OCekTZ69Zjc5K0FjCTi:3",
  "status": "success",
  "subtasks": [
    {
      "subtask_id": "OpenWelcomeFlowLink",
      "callbacks": [
        {
          "trigger": "impression",
          "endpoint": "callback.json?product=metric-tracking&identifier=generic-metric-tracking-cb&params=%7B%22data%22%3A%5B%7B%22dataset%22%3A%22signup_events%22%2C%22signup_event_data%22%3A%7B%22subtask_id%22%3A%22OpenWelcomeFlowLink%22%2C%22flow_token%22%3A%22g%3B169365264997293054%3A-1693652649980%3APN9V4OCekTZ69Zjc5K0FjCTi%3A3%22%2C%22flow_name%22%3A%22welcome%22%2C%22flow_start_location%22%3A%22splash_screen%22%2C%22signup_flow_name%22%3A%22open_app%22%7D%7D%5D%7D"
        },
        {
          "trigger": "impression",
          "scribe_config": {
            "page": "onboarding",
            "section": "open_app",
            "component": "OpenWelcomeFlowLink",
            "action": "impression"
          }
        }
      ],
      "open_link": {
        "link": {
          "link_type": "deep_link_and_abort",
          "link_id": "open_welcome_flow_link",
          "url": "twitter://onboarding/flow?flow_name=welcome"
        }
      }
    }
  ]
}
Does anyone else get the same output running the various "create guest account" scripts in this thread? How come my output doesn't have the `.open_account` key? ``` { "flow_token": "g;169365264997293054:-1693652649980:PN9V4OCekTZ69Zjc5K0FjCTi:3", "status": "success", "subtasks": [ { "subtask_id": "OpenWelcomeFlowLink", "callbacks": [ { "trigger": "impression", "endpoint": "callback.json?product=metric-tracking&identifier=generic-metric-tracking-cb&params=%7B%22data%22%3A%5B%7B%22dataset%22%3A%22signup_events%22%2C%22signup_event_data%22%3A%7B%22subtask_id%22%3A%22OpenWelcomeFlowLink%22%2C%22flow_token%22%3A%22g%3B169365264997293054%3A-1693652649980%3APN9V4OCekTZ69Zjc5K0FjCTi%3A3%22%2C%22flow_name%22%3A%22welcome%22%2C%22flow_start_location%22%3A%22splash_screen%22%2C%22signup_flow_name%22%3A%22open_app%22%7D%7D%5D%7D" }, { "trigger": "impression", "scribe_config": { "page": "onboarding", "section": "open_app", "component": "OpenWelcomeFlowLink", "action": "impression" } } ], "open_link": { "link": { "link_type": "deep_link_and_abort", "link_id": "open_welcome_flow_link", "url": "twitter://onboarding/flow?flow_name=welcome" } } } ] } ```
j-fbriere commented 2023-09-02 11:56:32 -04:00 (Migrated from github.com)

@RunlevelConsulting This happens when the guest account has already been created in a previous execution on the same day from the same location (IP address).
-or-
This happens when this is executed from a location (IP address) blocked from Twitter/X. Maybe you are using a VPN? Try to disable it before executing the guest account creation.

@RunlevelConsulting This happens when the guest account has already been created in a previous execution on the same day from the same location (IP address). -or- This happens when this is executed from a location (IP address) blocked from Twitter/X. Maybe you are using a VPN? Try to disable it before executing the guest account creation.
sajiljosephs commented 2023-09-04 03:53:49 -04:00 (Migrated from github.com)

@the-blank-x Its because of the formatting error in guest_accounts.json file. This happens when you copy paste. Please try creating an empty file and enter the details manually first to test it. I had the same error and was able to fix it.

@the-blank-x Its because of the formatting error in guest_accounts.json file. This happens when you copy paste. Please try creating an empty file and enter the details manually first to test it. I had the same error and was able to fix it.
obito commented 2023-09-04 06:06:45 -04:00 (Migrated from github.com)

@zedeus Is there any reason to ban IPs on nitter.net ? Every Mullvad IPs seems to be banned.

@zedeus Is there any reason to ban IPs on nitter.net ? Every Mullvad IPs seems to be banned.
the-blank-x commented 2023-09-04 06:30:43 -04:00 (Migrated from github.com)

@sajiljosephs: In their case, it's because the container cannot see guest_accounts.conf (it says Error: unhandled exception: cannot open: ./guest_accounts.json [IOError]). In the case of a malformed file, it'd say Error: unhandled exception: input(1, 4) Error: { expected [JsonParsingError]

@obito: See https://github.com/zedeus/nitter/issues/983#issuecomment-1684987665

@sajiljosephs: In their case, it's because the container cannot see guest_accounts.conf (it says `Error: unhandled exception: cannot open: ./guest_accounts.json [IOError]`). In the case of a malformed file, it'd say `Error: unhandled exception: input(1, 4) Error: { expected [JsonParsingError]` @obito: See https://github.com/zedeus/nitter/issues/983#issuecomment-1684987665
pielco11 commented 2023-09-04 09:37:36 -04:00 (Migrated from github.com)

@obito

@zedeus Is there any reason to ban IPs on nitter.net ? Every Mullvad IPs seems to be banned.

This is because people abuse VPN and proxy solutions to scrape tweets.

The community invites you to setup your own instance to scrape content

@obito > @zedeus Is there any reason to ban IPs on nitter.net ? Every Mullvad IPs seems to be banned. This is because people abuse VPN and proxy solutions to scrape tweets. The community invites you to setup your own instance to scrape content
drbergeron commented 2023-09-04 23:13:49 -04:00 (Migrated from github.com)

Did anyone get an updated docker image to work with the guestaccounts branch and guest_accounts.json file and mind sharing theirs? I keep getting IGSEGV: Illegal storage access. (Attempt to read from nil?) in the container logs. I see the files in the container so not sure what exactly it can't read. Here's what I did just in case my process wasn't right:

  • built a new guest accounts image from guest accounts branch using docker build -t guestimage:latest
  • swapped the nitter image inside the docker compose file to the new guestimage:latest image that i built
  • Added the guest_accounts.json file into the volumes section of the docker compose file
  • run docker compose up -d to start nitter and redis together

On main branch it was at least starting fine but not able to load any data from twitter so i figured it was a guest accounts issue.

Did anyone get an updated docker image to work with the guestaccounts branch and guest_accounts.json file and mind sharing theirs? I keep getting `IGSEGV: Illegal storage access. (Attempt to read from nil?)` in the container logs. I see the files in the container so not sure what exactly it can't read. Here's what I did just in case my process wasn't right: - built a new guest accounts image from guest accounts branch using `docker build -t guestimage:latest` - swapped the nitter image inside the docker compose file to the new guestimage:latest image that i built - Added the guest_accounts.json file into the volumes section of the docker compose file - run `docker compose up -d` to start nitter and redis together On main branch it was at least starting fine but not able to load any data from twitter so i figured it was a guest accounts issue.
ojaha065 commented 2023-09-05 11:12:25 -04:00 (Migrated from github.com)

Did anyone get an updated docker image to work with the guestaccounts branch and guest_accounts.json file and mind sharing theirs? I keep getting IGSEGV: Illegal storage access. (Attempt to read from nil?) in the container logs. I see the files in the container so not sure what exactly it can't read. Here's what I did just in case my process wasn't right:

* built a new guest accounts image from guest accounts branch using `docker build -t guestimage:latest`

* swapped the nitter image inside the docker compose file to the new guestimage:latest image that i built

* Added the guest_accounts.json file into the volumes section of the docker compose file

* run `docker compose up -d` to start nitter and redis together

On main branch it was at least starting fine but not able to load any data from twitter so i figured it was a guest accounts issue.

I got mine to work without any issues by pretty much the exact same process than you.

Did you make sure guest_accounts.json is mounted to the right place inside the container? It should be in /src folder, same place than your nitter.conf

> Did anyone get an updated docker image to work with the guestaccounts branch and guest_accounts.json file and mind sharing theirs? I keep getting `IGSEGV: Illegal storage access. (Attempt to read from nil?)` in the container logs. I see the files in the container so not sure what exactly it can't read. Here's what I did just in case my process wasn't right: > > * built a new guest accounts image from guest accounts branch using `docker build -t guestimage:latest` > > * swapped the nitter image inside the docker compose file to the new guestimage:latest image that i built > > * Added the guest_accounts.json file into the volumes section of the docker compose file > > * run `docker compose up -d` to start nitter and redis together > > > On main branch it was at least starting fine but not able to load any data from twitter so i figured it was a guest accounts issue. I got mine to work without any issues by pretty much the exact same process than you. Did you make sure `guest_accounts.json` is mounted to the right place inside the container? It should be in `/src` folder, same place than your `nitter.conf`
drbergeron commented 2023-09-05 20:56:59 -04:00 (Migrated from github.com)

thanks for confirming @ojaha065 and pointing me in the right direction.

Just in case anyone else runs into that error: I was missing brackets around my guest accounts json object and that's the error that manifested in docker. (it was not an array and couldn't be parsed)

thanks for confirming @ojaha065 and pointing me in the right direction. Just in case anyone else runs into that error: I was missing brackets around my guest accounts json object and that's the error that manifested in docker. (it was not an array and couldn't be parsed)
shynome commented 2023-09-07 12:45:34 -04:00 (Migrated from github.com)

hi, I have another way make it working, fetch data via browser by use socks5 proxy.

  1. start xhe vpn in browser page. https://github.com/remoon-net/xhe-link
  2. linux xhe vpn connect browser page and export socks5 proxy. https://github.com/remoon-net/xhe
  3. this project fetch data via socks5 proxy

The full steps you can see here twitter spider example

This way can keep csrf token always fresh.

tip: a chrome browser page need 360M memory in my production envirmoment

hi, I have another way make it working, fetch data via browser by use socks5 proxy. 1. start xhe vpn in browser page. https://github.com/remoon-net/xhe-link 2. linux xhe vpn connect browser page and export socks5 proxy. https://github.com/remoon-net/xhe 3. this project fetch data via socks5 proxy The full steps you can see here [twitter spider example](https://github.com/remoon-net/xhe-link#the-real-example-by-use-userscript) This way can keep csrf token always fresh. tip: a chrome browser page need 360M memory in my production envirmoment
RunlevelConsulting commented 2023-09-09 08:48:50 -04:00 (Migrated from github.com)

@RunlevelConsulting This happens when the guest account has already been created in a previous execution on the same day from the same location (IP address). -or- This happens when this is executed from a location (IP address) blocked from Twitter/X. Maybe you are using a VPN? Try to disable it before executing the guest account creation.

I'm really don't believe this is the case, I ran the following script once only, on a newly spun up Ubuntu server in AWS and still get the "OpenWelcomeFlowLink" response. I see a few others suffering the same issue. The Twitter API definitely doesn't block AWS IPs (or at least it didn't before they started charging ridiculous sums for the API).

I also ran this script on my home computer which is just a regular internet connection, no reason for it to be blocked.

#!/bin/bash
# Grab Twitter guest account tokens for use with Nitter. 

guest_token=$(curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' | jq -r '.guest_token')

flow_token=$(curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' \
  -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
  -H 'Content-Type: application/json' \
  -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \
  -H 'X-Twitter-API-Version: 5' \
  -H 'X-Twitter-Client: TwitterAndroid' \
  -H 'X-Twitter-Client-Version: 9.95.0-release.0' \
  -H 'OS-Version: 28' \
  -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \
  -H 'X-Twitter-Active-User: yes' \
  -H "X-Guest-Token: ${guest_token}" \
  -d '{"flow_token":null,"input_flow_data":{"country_code":null,"flow_context":{"start_location":{"location":"splash_screen"}},"requested_variant":null,"target_user_id":0},"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}' | jq -r .flow_token)

echo $guest_token
echo ""
echo $flow_token
echo ""
echo ""

curl -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \
  -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
  -H 'Content-Type: application/json' \
  -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \
  -H 'X-Twitter-API-Version 5' \
  -H 'X-Twitter-Client: TwitterAndroid' \
  -H 'X-Twitter-Client-Version: 9.95.0-release.0' \
  -H 'OS-Version: 28' \
  -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \
  -H 'X-Twitter-Active-User: yes' \
  -H "X-Guest-Token: ${guest_token}" \
  -d "{\"flow_token\":\"${flow_token}\",\"subtask_inputs\":[{\"open_link\":{\"link\":\"next_link\"},\"subtask_id\":\"NextTaskOpenLink\"}],\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}"

Can others running the guest_account creation script give details on the environment they're running it on?

Edit: Should I make a separate issue for this? Also, I presume a guest account creation script has to be run to generate credentials for the guest_accounts.json file on the guest_accounts branch, correct? There's currently no automated way to create accounts in the branch?

Edit2: @ImTheDeveloper is right. I ran the script through a few proxies, doesn't always work but the success rate is high enough to generate accounts. Cheers!

> @RunlevelConsulting This happens when the guest account has already been created in a previous execution on the same day from the same location (IP address). -or- This happens when this is executed from a location (IP address) blocked from Twitter/X. Maybe you are using a VPN? Try to disable it before executing the guest account creation. I'm really don't believe this is the case, I ran the following script once only, on a newly spun up Ubuntu server in AWS and still get the "OpenWelcomeFlowLink" response. I see a few others suffering the same issue. The Twitter API definitely doesn't block AWS IPs (or at least it didn't before they started charging ridiculous sums for the API). I also ran this script on my home computer which is just a regular internet connection, no reason for it to be blocked. ``` #!/bin/bash # Grab Twitter guest account tokens for use with Nitter. guest_token=$(curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' | jq -r '.guest_token') flow_token=$(curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' \ -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ -H 'Content-Type: application/json' \ -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \ -H 'X-Twitter-API-Version: 5' \ -H 'X-Twitter-Client: TwitterAndroid' \ -H 'X-Twitter-Client-Version: 9.95.0-release.0' \ -H 'OS-Version: 28' \ -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \ -H 'X-Twitter-Active-User: yes' \ -H "X-Guest-Token: ${guest_token}" \ -d '{"flow_token":null,"input_flow_data":{"country_code":null,"flow_context":{"start_location":{"location":"splash_screen"}},"requested_variant":null,"target_user_id":0},"subtask_versions":{"generic_urt":3,"standard":1,"open_home_timeline":1,"app_locale_update":1,"enter_date":1,"email_verification":3,"enter_password":5,"enter_text":5,"one_tap":2,"cta":7,"single_sign_on":1,"fetch_persisted_data":1,"enter_username":3,"web_modal":2,"fetch_temporary_password":1,"menu_dialog":1,"sign_up_review":5,"interest_picker":4,"user_recommendations_urt":3,"in_app_notification":1,"sign_up":2,"typeahead_search":1,"user_recommendations_list":4,"cta_inline":1,"contacts_live_sync_permission_prompt":3,"choice_selection":5,"js_instrumentation":1,"alert_dialog_suppress_client_events":1,"privacy_options":1,"topics_selector":1,"wait_spinner":3,"tweet_selection_urt":1,"end_flow":1,"settings_list":7,"open_external_link":1,"phone_verification":5,"security_key":3,"select_banner":2,"upload_media":1,"web":2,"alert_dialog":1,"open_account":2,"action_list":2,"enter_phone":2,"open_link":1,"show_code":1,"update_users":1,"check_logged_in_account":1,"enter_email":2,"select_avatar":4,"location_permission_prompt":2,"notifications_permission_prompt":4}}' | jq -r .flow_token) echo $guest_token echo "" echo $flow_token echo "" echo "" curl -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \ -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ -H 'Content-Type: application/json' \ -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \ -H 'X-Twitter-API-Version 5' \ -H 'X-Twitter-Client: TwitterAndroid' \ -H 'X-Twitter-Client-Version: 9.95.0-release.0' \ -H 'OS-Version: 28' \ -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \ -H 'X-Twitter-Active-User: yes' \ -H "X-Guest-Token: ${guest_token}" \ -d "{\"flow_token\":\"${flow_token}\",\"subtask_inputs\":[{\"open_link\":{\"link\":\"next_link\"},\"subtask_id\":\"NextTaskOpenLink\"}],\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}" ``` Can others running the guest_account creation script give details on the environment they're running it on? Edit: Should I make a separate issue for this? Also, I presume a guest account creation script has to be run to generate credentials for the guest_accounts.json file on the guest_accounts branch, correct? There's currently no automated way to create accounts in the branch? Edit2: @ImTheDeveloper is right. I ran the script through a few proxies, doesn't always work but the success rate is high enough to generate accounts. Cheers!
ImTheDeveloper commented 2023-09-09 09:45:49 -04:00 (Migrated from github.com)

I'm running my own script rotating proxies through brightdata. Very rarely the first request will provide the oauth tokens, normally it takes 3 or 4 attempts. I usually give up after 4 attempts and move to a new flow token, that said I've removed this logic in my script for a few hours now and the time taken to return the open_account (by requesting multiple times with the same flow token) appears to be completely random. Therefore, the only variable is which proxy is used.

Don't forget, the guest account setup on twitter side has to be async also. They are expecting a real user to take some time to follow the flow steps. We could simply be hitting some processing delays on their side too.

Edit: I've done some testing of 6 proxy services. You'll feel like you're mining for bitcoin trying to use pools of ISP or dedicated DC IP addresses. You really need to go for residential IP's and even better mobile residential. I've switched to mobile IP's and getting a token every single request.

Ps https://techcrunch.com/2023/09/08/x-updates-its-terms-to-ban-crawling-and-scraping/

List of scripts found in this thread:
Original Node.js https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357
Node.js with proxy https://github.com/zedeus/nitter/issues/983#issuecomment-1689430618
Shell Script https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda
Go https://gitlab.com/yawning/twitter-guest-account
PowerShell https://github.com/zedeus/nitter/issues/983#issuecomment-1692369656
Python https://github.com/zedeus/nitter/issues/983#issuecomment-1697288218 & https://github.com/zedeus/nitter/issues/983#issuecomment-1715487727
Android Termux https://github.com/zedeus/nitter/issues/983#issuecomment-1701267067

I'm running my own script rotating proxies through brightdata. Very rarely the first request will provide the oauth tokens, normally it takes 3 or 4 attempts. I usually give up after 4 attempts and move to a new flow token, that said I've removed this logic in my script for a few hours now and the time taken to return the open_account (by requesting multiple times with the same flow token) appears to be completely random. Therefore, the only variable is which proxy is used. Don't forget, the guest account setup on twitter side has to be async also. They are expecting a real user to take some time to follow the flow steps. We could simply be hitting some processing delays on their side too. Edit: I've done some testing of 6 proxy services. You'll feel like you're mining for bitcoin trying to use pools of ISP or dedicated DC IP addresses. You really need to go for residential IP's and even better mobile residential. I've switched to mobile IP's and getting a token every single request. Ps https://techcrunch.com/2023/09/08/x-updates-its-terms-to-ban-crawling-and-scraping/ List of scripts found in this thread: Original Node.js https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357 Node.js with proxy https://github.com/zedeus/nitter/issues/983#issuecomment-1689430618 Shell Script https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda Go https://gitlab.com/yawning/twitter-guest-account PowerShell https://github.com/zedeus/nitter/issues/983#issuecomment-1692369656 Python https://github.com/zedeus/nitter/issues/983#issuecomment-1697288218 & https://github.com/zedeus/nitter/issues/983#issuecomment-1715487727 Android Termux https://github.com/zedeus/nitter/issues/983#issuecomment-1701267067
MaxosHadj commented 2023-09-12 05:36:31 -04:00 (Migrated from github.com)

I can't generate any more guest accounts. Is it just me? It appears the URL isn't working.

I can't generate any more guest accounts. Is it just me? It appears the URL isn't working.
RunlevelConsulting commented 2023-09-12 06:09:31 -04:00 (Migrated from github.com)

I can't generate any more guest accounts. Is it just me? It appears the URL isn't working.

Working for me

> I can't generate any more guest accounts. Is it just me? It appears the URL isn't working. Working for me
OrangeFlavored commented 2023-09-12 06:37:18 -04:00 (Migrated from github.com)

I can't generate any more guest accounts. Is it just me? It appears the URL isn't working.

Yeah it's been working ok for me too, keep in mind that the 24 hour cooldown seems to reset every time you attempt to generate a guest account, so if you keep trying every few hours you're never going to be able to make a new one. I've just been using my own IP and a script to get a new account automatically and add it into my guest_accounts.json (also removing any >30 days old, though I'm not sure what the exact limit is) every 24 hours and 5 minutes just to be safe. So far it's all been working well.

> I can't generate any more guest accounts. Is it just me? It appears the URL isn't working. Yeah it's been working ok for me too, keep in mind that the 24 hour cooldown seems to reset every time you attempt to generate a guest account, so if you keep trying every few hours you're never going to be able to make a new one. I've just been using my own IP and a script to get a new account automatically and add it into my guest_accounts.json (also removing any >30 days old, though I'm not sure what the exact limit is) every 24 hours and 5 minutes just to be safe. So far it's all been working well.
MaxosHadj commented 2023-09-12 06:42:35 -04:00 (Migrated from github.com)

I can't generate any more guest accounts. Is it just me? It appears the URL isn't working.

Yeah it's been working ok for me too, keep in mind that the 24 hour cooldown seems to reset every time you attempt to generate a guest account, so if you keep trying every few hours you're never going to be able to make a new one. I've just been using my own IP and a script to get a new account automatically and add it into my guest_accounts.json (also removing any >30 days old, though I'm not sure what the exact limit is) every 24 hours and 5 minutes just to be safe. So far it's all been working well.

Can you share your script?

> > I can't generate any more guest accounts. Is it just me? It appears the URL isn't working. > > Yeah it's been working ok for me too, keep in mind that the 24 hour cooldown seems to reset every time you attempt to generate a guest account, so if you keep trying every few hours you're never going to be able to make a new one. I've just been using my own IP and a script to get a new account automatically and add it into my guest_accounts.json (also removing any >30 days old, though I'm not sure what the exact limit is) every 24 hours and 5 minutes just to be safe. So far it's all been working well. Can you share your script?
OrangeFlavored commented 2023-09-12 06:46:39 -04:00 (Migrated from github.com)

I can't generate any more guest accounts. Is it just me? It appears the URL isn't working.

Yeah it's been working ok for me too, keep in mind that the 24 hour cooldown seems to reset every time you attempt to generate a guest account, so if you keep trying every few hours you're never going to be able to make a new one. I've just been using my own IP and a script to get a new account automatically and add it into my guest_accounts.json (also removing any >30 days old, though I'm not sure what the exact limit is) every 24 hours and 5 minutes just to be safe. So far it's all been working well.

Can you share your script?

Sure, here:

import os
import json
import requests
from datetime import datetime, timedelta
from dateutil.parser import parse as parsedate
from time import sleep

OUTPUT_FILE = "/disk1/nitter/guest_accounts.json"
LAST_ATTEMPT_FILE = "/disk1/nitter/last_guest_attempt"
CREATE_INTERVAL = timedelta(hours=24, minutes=5)
WAIT_INTERVAL = timedelta(minutes=55)
PRUNE_INTERVAL = timedelta(days=30)

BEARER_TOKEN = "Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F"
BASIC_HEADERS = {
    "Authorization": BEARER_TOKEN,
    "Content-Type": "application/json",
    "User-Agent": "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)",
    "X-Twitter-API-Version": "5",
    "X-Twitter-Client": "TwitterAndroid",
    "X-Twitter-Client-Version": "9.95.0-release.0",
    "OS-Version": "28",
    "System-User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)",
    "X-Twitter-Active-User": "yes",
}
SUBTASK_VERSIONS = {
    "generic_urt": 3,
    "standard": 1,
    "open_home_timeline": 1,
    "app_locale_update": 1,
    "enter_date": 1,
    "email_verification": 3,
    "enter_password": 5,
    "enter_text": 5,
    "one_tap": 2,
    "cta": 7,
    "single_sign_on": 1,
    "fetch_persisted_data": 1,
    "enter_username": 3,
    "web_modal": 2,
    "fetch_temporary_password": 1,
    "menu_dialog": 1,
    "sign_up_review": 5,
    "interest_picker": 4,
    "user_recommendations_urt": 3,
    "in_app_notification": 1,
    "sign_up": 2,
    "typeahead_search": 1,
    "user_recommendations_list": 4,
    "cta_inline": 1,
    "contacts_live_sync_permission_prompt": 3,
    "choice_selection": 5,
    "js_instrumentation": 1,
    "alert_dialog_suppress_client_events": 1,
    "privacy_options": 1,
    "topics_selector": 1,
    "wait_spinner": 3,
    "tweet_selection_urt": 1,
    "end_flow": 1,
    "settings_list": 7,
    "open_external_link": 1,
    "phone_verification": 5,
    "security_key": 3,
    "select_banner": 2,
    "upload_media": 1,
    "web": 2,
    "alert_dialog": 1,
    "open_account": 2,
    "action_list": 2,
    "enter_phone": 2,
    "open_link": 1,
    "show_code": 1,
    "update_users": 1,
    "check_logged_in_account": 1,
    "enter_email": 2,
    "select_avatar": 4,
    "location_permission_prompt": 2,
    "notifications_permission_prompt": 4,
}


def make_request():
    with requests.Session() as session:
        guest_token = session.post(
            "https://api.twitter.com/1.1/guest/activate.json",
            headers={
                "Authorization": BEARER_TOKEN,
            },
        ).json()["guest_token"]
        flow_token = session.post(
            "https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us",
            headers={
                **BASIC_HEADERS,
                "X-Guest-Token": guest_token,
            },
            data=json.dumps(
                {
                    "flow_token": None,
                    "input_flow_data": {
                        "country_code": None,
                        "flow_context": {
                            "start_location": {"location": "splash_screen"}
                        },
                        "requested_variant": None,
                        "target_user_id": 0,
                    },
                    "subtask_versions": SUBTASK_VERSIONS,
                }
            ),
        ).json()["flow_token"]
        response = session.post(
            "https://api.twitter.com/1.1/onboarding/task.json",
            headers={
                **BASIC_HEADERS,
                "X-Guest-Token": guest_token,
            },
            data=json.dumps(
                {
                    "flow_token": flow_token,
                    "subtask_inputs": [
                        {
                            "open_link": {
                                "link": "next_link",
                            },
                            "subtask_id": "NextTaskOpenLink",
                        }
                    ],
                    "subtask_versions": SUBTASK_VERSIONS,
                }
            ),
        )
    return response


def main():
    last_attempt_time = None
    if os.path.exists(LAST_ATTEMPT_FILE):
        with open(LAST_ATTEMPT_FILE) as last_attempt_file:
            last_attempt_time = json.load(last_attempt_file)["Time"]
    if (
        last_attempt_time
        and (time_diff := datetime.now() - parsedate(last_attempt_time))
        <= CREATE_INTERVAL
    ):
        if CREATE_INTERVAL - time_diff <= WAIT_INTERVAL:
            sleep(int((CREATE_INTERVAL - time_diff).total_seconds()))
        else:
            return
    response = make_request()
    if new_account := response.json().get("subtasks", [{}])[0].get("open_account"):
        new_account["creation_time"] = f"{datetime.now()}"
        account_list = []
        if os.path.exists(OUTPUT_FILE):
            with open(OUTPUT_FILE) as accounts_file:
                account_list = json.load(accounts_file)
        if PRUNE_INTERVAL:
            to_prune = 0
            for account in account_list:
                if (
                    creation_time := account.get("creation_time")
                ) and datetime.now() - parsedate(creation_time) < PRUNE_INTERVAL:
                    break
                to_prune += 1
            account_list = account_list[to_prune:]
        account_list.append(new_account)
        with open(OUTPUT_FILE, "w") as accounts_file:
            json.dump(account_list, accounts_file, indent=4)
    with open(LAST_ATTEMPT_FILE, "w") as last_attempt_file:
        json.dump(
            {"Success": bool(new_account), "Time": f"{datetime.now()}"},
            last_attempt_file,
        )


if __name__ == "__main__":
    main()

You may want to set PRUNE_INTERVAL to None initially until you've generated a decent pool of new accounts, because it's going to remove any of your old ones that lack the creation_time attribute. (Or you could just add it manually to roughly the date/time you created them if you know it.) I run this once per hour through cron, and it uses the LAST_ATTEMPT_FILE to track when it should next attempt to make an account.

> > > I can't generate any more guest accounts. Is it just me? It appears the URL isn't working. > > > > > > Yeah it's been working ok for me too, keep in mind that the 24 hour cooldown seems to reset every time you attempt to generate a guest account, so if you keep trying every few hours you're never going to be able to make a new one. I've just been using my own IP and a script to get a new account automatically and add it into my guest_accounts.json (also removing any >30 days old, though I'm not sure what the exact limit is) every 24 hours and 5 minutes just to be safe. So far it's all been working well. > > Can you share your script? Sure, here: ```python import os import json import requests from datetime import datetime, timedelta from dateutil.parser import parse as parsedate from time import sleep OUTPUT_FILE = "/disk1/nitter/guest_accounts.json" LAST_ATTEMPT_FILE = "/disk1/nitter/last_guest_attempt" CREATE_INTERVAL = timedelta(hours=24, minutes=5) WAIT_INTERVAL = timedelta(minutes=55) PRUNE_INTERVAL = timedelta(days=30) BEARER_TOKEN = "Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F" BASIC_HEADERS = { "Authorization": BEARER_TOKEN, "Content-Type": "application/json", "User-Agent": "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)", "X-Twitter-API-Version": "5", "X-Twitter-Client": "TwitterAndroid", "X-Twitter-Client-Version": "9.95.0-release.0", "OS-Version": "28", "System-User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)", "X-Twitter-Active-User": "yes", } SUBTASK_VERSIONS = { "generic_urt": 3, "standard": 1, "open_home_timeline": 1, "app_locale_update": 1, "enter_date": 1, "email_verification": 3, "enter_password": 5, "enter_text": 5, "one_tap": 2, "cta": 7, "single_sign_on": 1, "fetch_persisted_data": 1, "enter_username": 3, "web_modal": 2, "fetch_temporary_password": 1, "menu_dialog": 1, "sign_up_review": 5, "interest_picker": 4, "user_recommendations_urt": 3, "in_app_notification": 1, "sign_up": 2, "typeahead_search": 1, "user_recommendations_list": 4, "cta_inline": 1, "contacts_live_sync_permission_prompt": 3, "choice_selection": 5, "js_instrumentation": 1, "alert_dialog_suppress_client_events": 1, "privacy_options": 1, "topics_selector": 1, "wait_spinner": 3, "tweet_selection_urt": 1, "end_flow": 1, "settings_list": 7, "open_external_link": 1, "phone_verification": 5, "security_key": 3, "select_banner": 2, "upload_media": 1, "web": 2, "alert_dialog": 1, "open_account": 2, "action_list": 2, "enter_phone": 2, "open_link": 1, "show_code": 1, "update_users": 1, "check_logged_in_account": 1, "enter_email": 2, "select_avatar": 4, "location_permission_prompt": 2, "notifications_permission_prompt": 4, } def make_request(): with requests.Session() as session: guest_token = session.post( "https://api.twitter.com/1.1/guest/activate.json", headers={ "Authorization": BEARER_TOKEN, }, ).json()["guest_token"] flow_token = session.post( "https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us", headers={ **BASIC_HEADERS, "X-Guest-Token": guest_token, }, data=json.dumps( { "flow_token": None, "input_flow_data": { "country_code": None, "flow_context": { "start_location": {"location": "splash_screen"} }, "requested_variant": None, "target_user_id": 0, }, "subtask_versions": SUBTASK_VERSIONS, } ), ).json()["flow_token"] response = session.post( "https://api.twitter.com/1.1/onboarding/task.json", headers={ **BASIC_HEADERS, "X-Guest-Token": guest_token, }, data=json.dumps( { "flow_token": flow_token, "subtask_inputs": [ { "open_link": { "link": "next_link", }, "subtask_id": "NextTaskOpenLink", } ], "subtask_versions": SUBTASK_VERSIONS, } ), ) return response def main(): last_attempt_time = None if os.path.exists(LAST_ATTEMPT_FILE): with open(LAST_ATTEMPT_FILE) as last_attempt_file: last_attempt_time = json.load(last_attempt_file)["Time"] if ( last_attempt_time and (time_diff := datetime.now() - parsedate(last_attempt_time)) <= CREATE_INTERVAL ): if CREATE_INTERVAL - time_diff <= WAIT_INTERVAL: sleep(int((CREATE_INTERVAL - time_diff).total_seconds())) else: return response = make_request() if new_account := response.json().get("subtasks", [{}])[0].get("open_account"): new_account["creation_time"] = f"{datetime.now()}" account_list = [] if os.path.exists(OUTPUT_FILE): with open(OUTPUT_FILE) as accounts_file: account_list = json.load(accounts_file) if PRUNE_INTERVAL: to_prune = 0 for account in account_list: if ( creation_time := account.get("creation_time") ) and datetime.now() - parsedate(creation_time) < PRUNE_INTERVAL: break to_prune += 1 account_list = account_list[to_prune:] account_list.append(new_account) with open(OUTPUT_FILE, "w") as accounts_file: json.dump(account_list, accounts_file, indent=4) with open(LAST_ATTEMPT_FILE, "w") as last_attempt_file: json.dump( {"Success": bool(new_account), "Time": f"{datetime.now()}"}, last_attempt_file, ) if __name__ == "__main__": main() ``` You may want to set PRUNE_INTERVAL to None initially until you've generated a decent pool of new accounts, because it's going to remove any of your old ones that lack the creation_time attribute. (Or you could just add it manually to roughly the date/time you created them if you know it.) I run this once per hour through cron, and it uses the LAST_ATTEMPT_FILE to track when it should next attempt to make an account.
jack555444 commented 2023-09-12 15:56:47 -04:00 (Migrated from github.com)

@OrangeFlavored

Many thanks for your script and everyone else who has shared one.

There is just one thing I'm uncertain about. If new tokens are added to guest_accounts.json does Nittter need to be restarted?

@OrangeFlavored Many thanks for your script and everyone else who has shared one. There is just one thing I'm uncertain about. If new tokens are added to guest_accounts.json does Nittter need to be restarted?
OrangeFlavored commented 2023-09-12 20:04:36 -04:00 (Migrated from github.com)

@OrangeFlavored

Many thanks for your script and everyone else who has shared one.

There is just one thing I'm uncertain about. If new tokens are added to guest_accounts.json does Nittter need to be restarted?

Yes, I have it scheduled to restart every day at 5AM for that reason.

> @OrangeFlavored > > Many thanks for your script and everyone else who has shared one. > > There is just one thing I'm uncertain about. If new tokens are added to guest_accounts.json does Nittter need to be restarted? Yes, I have it scheduled to restart every day at 5AM for that reason.
MaxosHadj commented 2023-09-15 05:42:23 -04:00 (Migrated from github.com)

I'm running my own script rotating proxies through brightdata. Very rarely the first request will provide the oauth tokens, normally it takes 3 or 4 attempts. I usually give up after 4 attempts and move to a new flow token, that said I've removed this logic in my script for a few hours now and the time taken to return the open_account (by requesting multiple times with the same flow token) appears to be completely random. Therefore, the only variable is which proxy is used.

Don't forget, the guest account setup on twitter side has to be async also. They are expecting a real user to take some time to follow the flow steps. We could simply be hitting some processing delays on their side too.

Edit: I've done some testing of 6 proxy services. You'll feel like you're mining for bitcoin trying to use pools of ISP or dedicated DC IP addresses. You really need to go for residential IP's and even better mobile residential. I've switched to mobile IP's and getting a token every single request.

Ps https://techcrunch.com/2023/09/08/x-updates-its-terms-to-ban-crawling-and-scraping/

List of scripts found in this thread: Original Node.js #983 (comment) Node.js with proxy #983 (comment) Shell Script https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda Go https://gitlab.com/yawning/twitter-guest-account PowerShell #983 (comment) Python #983 (comment) & #983 (comment) Android Termux #983 (comment)

I've tried using BrightData residential and mobile proxies, but without any success. I haven't been able to set up a single account. I use #983 (comment) script and change the proxy with 'http://brd-customer-**_***-zone-mobile:*****@brd.superproxy.io:22225'

> I'm running my own script rotating proxies through brightdata. Very rarely the first request will provide the oauth tokens, normally it takes 3 or 4 attempts. I usually give up after 4 attempts and move to a new flow token, that said I've removed this logic in my script for a few hours now and the time taken to return the open_account (by requesting multiple times with the same flow token) appears to be completely random. Therefore, the only variable is which proxy is used. > > Don't forget, the guest account setup on twitter side has to be async also. They are expecting a real user to take some time to follow the flow steps. We could simply be hitting some processing delays on their side too. > > Edit: I've done some testing of 6 proxy services. You'll feel like you're mining for bitcoin trying to use pools of ISP or dedicated DC IP addresses. You really need to go for residential IP's and even better mobile residential. I've switched to mobile IP's and getting a token every single request. > > Ps https://techcrunch.com/2023/09/08/x-updates-its-terms-to-ban-crawling-and-scraping/ > > List of scripts found in this thread: Original Node.js [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357) Node.js with proxy [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1689430618) Shell Script https://gist.github.com/cmj/6e6f6cae51c28cf6e161ceba8d108dda Go https://gitlab.com/yawning/twitter-guest-account PowerShell [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1692369656) Python [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1697288218) & [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1715487727) Android Termux [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1701267067) I've tried using BrightData residential and mobile proxies, but without any success. I haven't been able to set up a single account. I use [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1689430618) script and change the proxy with `'http://brd-customer-**_***-zone-mobile:*****@brd.superproxy.io:22225'`
j-fbriere commented 2023-09-15 14:10:26 -04:00 (Migrated from github.com)

@MaxosI Since it takes 4 requests to create a guest account, you probably have to keep using the same IP in multiple requests.
There is an explanation on the BrightData site how to achieve this.

@MaxosI Since it takes 4 requests to create a guest account, you probably have to keep using the same IP in multiple requests. There is an explanation on the BrightData site how to achieve this.
jack555444 commented 2023-09-16 14:58:19 -04:00 (Migrated from github.com)

From my testing it seems to take a few seconds to be IP banned and running the script in a simple loop is netting me a number of tokens. Last run was 10 and a couple before that was 5.

From my testing it seems to take a few seconds to be IP banned and running the script in a simple loop is netting me a number of tokens. Last run was 10 and a couple before that was 5.
jcmag commented 2023-09-16 19:22:17 -04:00 (Migrated from github.com)

I have some questions about the guest accounts:

  1. how many accounts do you recommend to put in the guest_accounts.json file?
  2. is there a limit to this number? (i.e, will nitter crash if I add too many accounts?)
  3. how are these accounts managed by the code? if an account doesn't work, does nitter try the request with another one? (and how many retries?)
  4. should we remove old accounts after a while?
I have some questions about the guest accounts: 1) how many accounts do you recommend to put in the guest_accounts.json file? 2) is there a limit to this number? (i.e, will nitter crash if I add too many accounts?) 3) how are these accounts managed by the code? if an account doesn't work, does nitter try the request with another one? (and how many retries?) 4) should we remove old accounts after a while?
untitaker commented 2023-09-17 13:42:01 -04:00 (Migrated from github.com)

@jcmag (speaking as owner of nitter.services.woodland.cafe)

how many accounts do you recommend to put in the guest_accounts.json file?

you need 40k accounts for a public instance, but that is after you have banned the majority of bots. there was somebody claiming every guest_account can do 499 requests/day, but in my experience much more than that is needed.

is there a limit to this number? (i.e, will nitter crash if I add too many accounts?)

I found that anything above 100k will make nitter consume a lot more memory than necessary, but it will run fine even with 1 mio accounts in my experience for as long as you give it multiple GBs of RAM

how are these accounts managed by the code? if an account doesn't work, does nitter try the request with another one? (and how many retries?)

no, i don't think so. zedeus said in Matrix chat (linked in README) he is planning to fix this as next step, but i am not sure it happened

should we remove old accounts after a while?

guest accounts last for 1 month


generally, if you have any sort of efficient way to acquire multiple guest_accounts a day, it tends to be the case that you can easily generate 2 mio accounts per day, meaning that you can just generate the entire guest_accounts.json from scratch every day. this is wasteful but solves some of the questions above

keep in mind that overall hosting a public nitter instance got a lot harder, and it's not just because there's no docker image or the need for guest-accounts. the biggest timesink after that is abuse prevention. Speaking as an instance owner i feel that scraping of nitter instances and general abuse got a lot worse over the past 2 months. See https://github.com/zedeus/nitter/issues/1015#issuecomment-1714063128 as well.

if you need further help setting up guest_accounts specifically, please hop onto Matrix (linked in README). right now I don't think the core team has a lot of bandwidth to provide support for earlier setup steps though.

@jcmag (speaking as owner of nitter.services.woodland.cafe) > how many accounts do you recommend to put in the guest_accounts.json file? you need 40k accounts for a public instance, but that is _after_ you have banned the majority of bots. there was somebody claiming every guest_account can do 499 requests/day, but in my experience much more than that is needed. > is there a limit to this number? (i.e, will nitter crash if I add too many accounts?) I found that anything above 100k will make nitter consume a lot more memory than necessary, but it will run fine even with 1 mio accounts in my experience for as long as you give it multiple GBs of RAM > how are these accounts managed by the code? if an account doesn't work, does nitter try the request with another one? (and how many retries?) no, i don't think so. zedeus said in Matrix chat (linked in README) he is planning to fix this as next step, but i am not sure it happened > should we remove old accounts after a while? guest accounts last for 1 month ---- generally, if you have any sort of efficient way to acquire multiple guest_accounts a day, it tends to be the case that you can easily generate 2 mio accounts per day, meaning that you can just generate the entire guest_accounts.json from scratch every day. this is wasteful but solves some of the questions above keep in mind that overall hosting a public nitter instance got a lot harder, and it's not just because there's no docker image or the need for guest-accounts. the biggest timesink after that is abuse prevention. Speaking as an instance owner i feel that scraping of nitter instances and general abuse got _a lot worse_ over the past 2 months. See https://github.com/zedeus/nitter/issues/1015#issuecomment-1714063128 as well. if you need further help setting up guest_accounts specifically, please hop onto Matrix (linked in README). right now I don't think the core team has a lot of bandwidth to provide support for earlier setup steps though.
OrangeFlavored commented 2023-09-17 15:29:06 -04:00 (Migrated from github.com)

As someone just running a private instance for some light scraping, I find 15 accounts is fine for one /user request every 20 seconds and one /user/with_replies every 2 minutes. The with_replies is the main bottleneck for me since it seems to get accounts rate limited really easily and I could probably do with less accounts if I didn't bother with replies, though the script I posted above should be fine to maintain a rotating pool of 30 or so accounts without effort on my end anyway so I'm not too worried about it for now.

Also as far as the "how are these accounts managed by the code? if an account doesn't work, does nitter try the request with another one? (and how many retries?)" I believe this was updated recently and requests will be retried with the next available account. Requests are not retried at all, as far as I can tell, and sometimes things that appear as connection errors (at least from what they say in the logs) are also treated as an account having been rate limited.

As someone just running a private instance for some light scraping, I find 15 accounts is fine for one /user request every 20 seconds and one /user/with_replies every 2 minutes. The with_replies is the main bottleneck for me since it seems to get accounts rate limited really easily and I could probably do with less accounts if I didn't bother with replies, though the script I posted above should be fine to maintain a rotating pool of 30 or so accounts without effort on my end anyway so I'm not too worried about it for now. Also as far as the "how are these accounts managed by the code? if an account doesn't work, does nitter try the request with another one? (and how many retries?)" I believe this was updated recently and requests will be retried with the next available account. Requests are not retried at all, as far as I can tell, and sometimes things that appear as connection errors (at least from what they say in the logs) are also treated as an account having been rate limited.
ghost commented 2023-09-17 18:07:34 -04:00 (Migrated from github.com)

What about user/media? I have some media-only feeds and have been wondering if it would help to convert them to user and just set up a filter on my end. Although I'm also worried about losing tweets due to some limit.

What about user/media? I have some media-only feeds and have been wondering if it would help to convert them to user and just set up a filter on my end. Although I'm also worried about losing tweets due to some limit.
zedeus commented 2023-09-17 20:02:31 -04:00 (Migrated from github.com)

@OrangeFlavored @zipfile6209 /user is practically unlimited, aside from the 500 request per 15 minutes per guest account limit. You will run into the strict rate limit doing /search (and of course /user/search), /user/with_replies, /user/media, and /i/status/...

Requests do get retried once with a different account if it fails due to a rate limit, but that account may also fail, so there's no guarantee it will succeed. I'll probably turn this into a config option as smaller instances have more leeway when it comes to increasing max retry attempts etc.

@OrangeFlavored @zipfile6209 /user is practically unlimited, aside from the 500 request per 15 minutes per guest account limit. You will run into the strict rate limit doing /search (and of course /user/search), /user/with_replies, /user/media, and /i/status/... Requests do get retried _once_ with a different account if it fails due to a rate limit, but that account may also fail, so there's no guarantee it will succeed. I'll probably turn this into a config option as smaller instances have more leeway when it comes to increasing max retry attempts etc.
zedeus commented 2023-09-17 20:52:14 -04:00 (Migrated from github.com)

@untitaker
I'll look into the memory usage. A lot of data is stored, but it definitely shouldn't need that much RAM, and I suspect most of the usage is from the initial loading stage since memory doesn't get released afterwards. I'll switch to a faster JSON library and probably require JSONL instead of JSON to parse it line by line, also making scripts that acquire accounts a bit simpler.

he is planning to fix this as next step, but i am not sure it happened

It did: https://github.com/zedeus/nitter/pull/985/commits/fcd74e8048362fcf8284871ee067099e8de28a89

When an account expires after 30 days, the next request made with it will fail with a specific error code. Nitter detects it and removes it from the in-memory pool, but the file will not be updated since it's a temporary solution.

@untitaker I'll look into the memory usage. A lot of data is stored, but it definitely shouldn't need that much RAM, and I suspect most of the usage is from the initial loading stage since memory doesn't get released afterwards. I'll switch to a faster JSON library and probably require JSONL instead of JSON to parse it line by line, also making scripts that acquire accounts a bit simpler. > he is planning to fix this as next step, but i am not sure it happened It did: https://github.com/zedeus/nitter/pull/985/commits/fcd74e8048362fcf8284871ee067099e8de28a89 When an account expires after 30 days, the next request made with it will fail with a specific error code. Nitter detects it and removes it from the in-memory pool, but the file will not be updated since it's a temporary solution.
nerra0pos commented 2023-09-18 02:41:47 -04:00 (Migrated from github.com)

Does anyone have a working example Python code for getting the latest Tweets from a user with created guest account credentials (but without using Nitter)? What headers/payload do I have to send to which API/endpoint? Does the request have to be from the same IP that was used to create the guest account?

Does anyone have a working example Python code for getting the latest Tweets from a user with created guest account credentials (but without using Nitter)? What headers/payload do I have to send to which API/endpoint? Does the request have to be from the same IP that was used to create the guest account?
AL-THE-BOT-FATHER commented 2023-09-19 07:02:55 -04:00 (Migrated from github.com)

Does anyone have a working example Python code for getting the latest Tweets from a user with created guest account credentials (but without using Nitter)? What headers/payload do I have to send to which API/endpoint? Does the request have to be from the same IP that was used to create the guest account?

All the endpoints and features are located in https://github.com/zedeus/nitter/blob/master/src/consts.nim
Headers: https://github.com/zedeus/nitter/blob/master/src/apiutils.nim

> Does anyone have a working example Python code for getting the latest Tweets from a user with created guest account credentials (but without using Nitter)? What headers/payload do I have to send to which API/endpoint? Does the request have to be from the same IP that was used to create the guest account? All the endpoints and features are located in https://github.com/zedeus/nitter/blob/master/src/consts.nim Headers: https://github.com/zedeus/nitter/blob/master/src/apiutils.nim
Fa5g commented 2023-09-19 22:43:52 -04:00 (Migrated from github.com)
Whats next? ![image](https://github.com/zedeus/nitter/assets/4894803/a596039e-8624-4720-b05d-8424bb16fc4a) https://x.com/thesource/status/1704294353693270085?s=46&t=5qaU4aptMKPZtXjSkIh6CA!
waaeh commented 2023-09-20 15:35:03 -04:00 (Migrated from github.com)

Thanks for having created and maintaining despite all the changes Nitter!

I use Nitter on my private instance to read timelines via RSS using feedly. Thanks to the /.tokens debug endpoint, I noticed that feedly browses very aggressively each item of a RSS feed when viewed on the website and the app - triggering sometimes over 10 tweetDetail requests in less than 1 second and worse, not caching these results. Viewing / refreshing a busy timeline can very quickly consume 100's of tweetDetail requests. These requests all originates from 35.187.132.0/24 and are very likely used for summary / screenshots renderings within the feedly app.

Denying access on the reverse proxy for 35.187.132.0/24 solves the problem. Without this rule, my ~15 guest accounts of the private instance may all get limited within 20 min of continuous feedly browsing. I guess that aggressively caching tweets (typically when the timeline is rendered for the RSS feed) could also solve the issue. Hope this trick may help other feedly users!

Thanks for having created and maintaining despite all the changes Nitter! I use Nitter on my private instance to read timelines via RSS using feedly. Thanks to the `/.tokens` debug endpoint, I noticed that feedly browses very aggressively each item of a RSS feed when viewed on the website and the app - triggering sometimes over 10 tweetDetail requests in less than 1 second and worse, not caching these results. Viewing / refreshing a busy timeline can very quickly consume 100's of tweetDetail requests. These requests all originates from `35.187.132.0/24` and are very likely used for summary / screenshots renderings within the feedly app. Denying access on the reverse proxy for `35.187.132.0/24` solves the problem. Without this rule, my ~15 guest accounts of the private instance may all get limited within 20 min of continuous feedly browsing. I guess that aggressively caching tweets (typically when the timeline is rendered for the RSS feed) could also solve the issue. Hope this trick may help other feedly users!
untitaker commented 2023-09-20 15:36:45 -04:00 (Migrated from github.com)

if you're using a rss reader and you're concerned about how hard it hammers your nitter instance, consider doing https://github.com/zedeus/nitter/wiki/Rate-Limiting-%E2%80%90-Nginx

if you're using a rss reader and you're concerned about how hard it hammers your nitter instance, consider doing https://github.com/zedeus/nitter/wiki/Rate-Limiting-%E2%80%90-Nginx
notherenorthere commented 2023-09-20 23:33:23 -04:00 (Migrated from github.com)

might be temporary? hoping it's not elawn doing elawn things but..
502 Bad Gateway
nginx/1.22.1

might be temporary? hoping it's not elawn doing elawn things but.. 502 Bad Gateway nginx/1.22.1
zedeus commented 2023-09-20 23:36:05 -04:00 (Migrated from github.com)

Temporary downtime, messed up the server

Temporary downtime, messed up the server
DarrenSem commented 2023-09-21 10:48:54 -04:00 (Migrated from github.com)
List of nitter instances: https://status.d420.de/ This one works https://nitter.poast.org/elonmusk/status/1704747213736292828#m
lukefromdc commented 2023-09-21 12:54:36 -04:00 (Migrated from github.com)

Twiiter needs to understand this will NOT make people form accounts, it will make them drop Twitter. Today I had to tell some folks I cover in my online news reporting that I would need direct links or better yet video files over Signal or I would be unable to post a report on today's activities.

I neither have nor want corporate social media accounts. I already block all of Meta and have for a decade, plus Google is relegated to Tor-only access, I find Twitter's chronological-only timelines for non-logged in users 100% useless, so I have entirely stopped using their service for anythng but extracting videos or photos from linked posts. Some of the folks I work with have STOPPED POSTING TO TWITTER due to the combination of harassment of non-logged in users and all the reinstated hate accounts.

If Nitter goes down and stays down, Twitter will join Meta on my list of useless servers

Twiiter needs to understand this will NOT make people form accounts, it will make them drop Twitter. Today I had to tell some folks I cover in my online news reporting that I would need direct links or better yet video files over Signal or I would be unable to post a report on today's activities. I neither have nor want corporate social media accounts. I already block all of Meta and have for a decade, plus Google is relegated to Tor-only access, I find Twitter's chronological-only timelines for non-logged in users 100% useless, so I have entirely stopped using their service for anythng but extracting videos or photos from linked posts. Some of the folks I work with have STOPPED POSTING TO TWITTER due to the combination of harassment of non-logged in users and all the reinstated hate accounts. If Nitter goes down and stays down, Twitter will join Meta on my list of useless servers
theo546 commented 2023-09-21 23:01:28 -04:00 (Migrated from github.com)

I can't generate any more guest accounts. Is it just me? It appears the URL isn't working.

Yeah it's been working ok for me too, keep in mind that the 24 hour cooldown seems to reset every time you attempt to generate a guest account, so if you keep trying every few hours you're never going to be able to make a new one. I've just been using my own IP and a script to get a new account automatically and add it into my guest_accounts.json (also removing any >30 days old, though I'm not sure what the exact limit is) every 24 hours and 5 minutes just to be safe. So far it's all been working well.

Can you share your script?

Sure, here:

import os
import json
import requests
from datetime import datetime, timedelta
from dateutil.parser import parse as parsedate
from time import sleep

OUTPUT_FILE = "/disk1/nitter/guest_accounts.json"
LAST_ATTEMPT_FILE = "/disk1/nitter/last_guest_attempt"
CREATE_INTERVAL = timedelta(hours=24, minutes=5)
WAIT_INTERVAL = timedelta(minutes=55)
PRUNE_INTERVAL = timedelta(days=30)

BEARER_TOKEN = "Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F"
BASIC_HEADERS = {
    "Authorization": BEARER_TOKEN,
    "Content-Type": "application/json",
    "User-Agent": "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)",
    "X-Twitter-API-Version": "5",
    "X-Twitter-Client": "TwitterAndroid",
    "X-Twitter-Client-Version": "9.95.0-release.0",
    "OS-Version": "28",
    "System-User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)",
    "X-Twitter-Active-User": "yes",
}
SUBTASK_VERSIONS = {
    "generic_urt": 3,
    "standard": 1,
    "open_home_timeline": 1,
    "app_locale_update": 1,
    "enter_date": 1,
    "email_verification": 3,
    "enter_password": 5,
    "enter_text": 5,
    "one_tap": 2,
    "cta": 7,
    "single_sign_on": 1,
    "fetch_persisted_data": 1,
    "enter_username": 3,
    "web_modal": 2,
    "fetch_temporary_password": 1,
    "menu_dialog": 1,
    "sign_up_review": 5,
    "interest_picker": 4,
    "user_recommendations_urt": 3,
    "in_app_notification": 1,
    "sign_up": 2,
    "typeahead_search": 1,
    "user_recommendations_list": 4,
    "cta_inline": 1,
    "contacts_live_sync_permission_prompt": 3,
    "choice_selection": 5,
    "js_instrumentation": 1,
    "alert_dialog_suppress_client_events": 1,
    "privacy_options": 1,
    "topics_selector": 1,
    "wait_spinner": 3,
    "tweet_selection_urt": 1,
    "end_flow": 1,
    "settings_list": 7,
    "open_external_link": 1,
    "phone_verification": 5,
    "security_key": 3,
    "select_banner": 2,
    "upload_media": 1,
    "web": 2,
    "alert_dialog": 1,
    "open_account": 2,
    "action_list": 2,
    "enter_phone": 2,
    "open_link": 1,
    "show_code": 1,
    "update_users": 1,
    "check_logged_in_account": 1,
    "enter_email": 2,
    "select_avatar": 4,
    "location_permission_prompt": 2,
    "notifications_permission_prompt": 4,
}


def make_request():
    with requests.Session() as session:
        guest_token = session.post(
            "https://api.twitter.com/1.1/guest/activate.json",
            headers={
                "Authorization": BEARER_TOKEN,
            },
        ).json()["guest_token"]
        flow_token = session.post(
            "https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us",
            headers={
                **BASIC_HEADERS,
                "X-Guest-Token": guest_token,
            },
            data=json.dumps(
                {
                    "flow_token": None,
                    "input_flow_data": {
                        "country_code": None,
                        "flow_context": {
                            "start_location": {"location": "splash_screen"}
                        },
                        "requested_variant": None,
                        "target_user_id": 0,
                    },
                    "subtask_versions": SUBTASK_VERSIONS,
                }
            ),
        ).json()["flow_token"]
        response = session.post(
            "https://api.twitter.com/1.1/onboarding/task.json",
            headers={
                **BASIC_HEADERS,
                "X-Guest-Token": guest_token,
            },
            data=json.dumps(
                {
                    "flow_token": flow_token,
                    "subtask_inputs": [
                        {
                            "open_link": {
                                "link": "next_link",
                            },
                            "subtask_id": "NextTaskOpenLink",
                        }
                    ],
                    "subtask_versions": SUBTASK_VERSIONS,
                }
            ),
        )
    return response


def main():
    last_attempt_time = None
    if os.path.exists(LAST_ATTEMPT_FILE):
        with open(LAST_ATTEMPT_FILE) as last_attempt_file:
            last_attempt_time = json.load(last_attempt_file)["Time"]
    if (
        last_attempt_time
        and (time_diff := datetime.now() - parsedate(last_attempt_time))
        <= CREATE_INTERVAL
    ):
        if CREATE_INTERVAL - time_diff <= WAIT_INTERVAL:
            sleep(int((CREATE_INTERVAL - time_diff).total_seconds()))
        else:
            return
    response = make_request()
    if new_account := response.json().get("subtasks", [{}])[0].get("open_account"):
        new_account["creation_time"] = f"{datetime.now()}"
        account_list = []
        if os.path.exists(OUTPUT_FILE):
            with open(OUTPUT_FILE) as accounts_file:
                account_list = json.load(accounts_file)
        if PRUNE_INTERVAL:
            to_prune = 0
            for account in account_list:
                if (
                    creation_time := account.get("creation_time")
                ) and datetime.now() - parsedate(creation_time) < PRUNE_INTERVAL:
                    break
                to_prune += 1
            account_list = account_list[to_prune:]
        account_list.append(new_account)
        with open(OUTPUT_FILE, "w") as accounts_file:
            json.dump(account_list, accounts_file, indent=4)
    with open(LAST_ATTEMPT_FILE, "w") as last_attempt_file:
        json.dump(
            {"Success": bool(new_account), "Time": f"{datetime.now()}"},
            last_attempt_file,
        )


if __name__ == "__main__":
    main()

You may want to set PRUNE_INTERVAL to None initially until you've generated a decent pool of new accounts, because it's going to remove any of your old ones that lack the creation_time attribute. (Or you could just add it manually to roughly the date/time you created them if you know it.) I run this once per hour through cron, and it uses the LAST_ATTEMPT_FILE to track when it should next attempt to make an account.

I tried this script on an OVH server, for the first few days it wasn't picking up any token, I had to generate some beforehand on my home internet connection.
But when I took a look at the guest_accounts.json, it started generating token on the OVH IP, so I guess you have to just keep going until Twitter thinks your IP is safe?

> > > > I can't generate any more guest accounts. Is it just me? It appears the URL isn't working. > > > > > > > > > Yeah it's been working ok for me too, keep in mind that the 24 hour cooldown seems to reset every time you attempt to generate a guest account, so if you keep trying every few hours you're never going to be able to make a new one. I've just been using my own IP and a script to get a new account automatically and add it into my guest_accounts.json (also removing any >30 days old, though I'm not sure what the exact limit is) every 24 hours and 5 minutes just to be safe. So far it's all been working well. > > > > > > Can you share your script? > > Sure, here: > > ```python > import os > import json > import requests > from datetime import datetime, timedelta > from dateutil.parser import parse as parsedate > from time import sleep > > OUTPUT_FILE = "/disk1/nitter/guest_accounts.json" > LAST_ATTEMPT_FILE = "/disk1/nitter/last_guest_attempt" > CREATE_INTERVAL = timedelta(hours=24, minutes=5) > WAIT_INTERVAL = timedelta(minutes=55) > PRUNE_INTERVAL = timedelta(days=30) > > BEARER_TOKEN = "Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F" > BASIC_HEADERS = { > "Authorization": BEARER_TOKEN, > "Content-Type": "application/json", > "User-Agent": "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)", > "X-Twitter-API-Version": "5", > "X-Twitter-Client": "TwitterAndroid", > "X-Twitter-Client-Version": "9.95.0-release.0", > "OS-Version": "28", > "System-User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)", > "X-Twitter-Active-User": "yes", > } > SUBTASK_VERSIONS = { > "generic_urt": 3, > "standard": 1, > "open_home_timeline": 1, > "app_locale_update": 1, > "enter_date": 1, > "email_verification": 3, > "enter_password": 5, > "enter_text": 5, > "one_tap": 2, > "cta": 7, > "single_sign_on": 1, > "fetch_persisted_data": 1, > "enter_username": 3, > "web_modal": 2, > "fetch_temporary_password": 1, > "menu_dialog": 1, > "sign_up_review": 5, > "interest_picker": 4, > "user_recommendations_urt": 3, > "in_app_notification": 1, > "sign_up": 2, > "typeahead_search": 1, > "user_recommendations_list": 4, > "cta_inline": 1, > "contacts_live_sync_permission_prompt": 3, > "choice_selection": 5, > "js_instrumentation": 1, > "alert_dialog_suppress_client_events": 1, > "privacy_options": 1, > "topics_selector": 1, > "wait_spinner": 3, > "tweet_selection_urt": 1, > "end_flow": 1, > "settings_list": 7, > "open_external_link": 1, > "phone_verification": 5, > "security_key": 3, > "select_banner": 2, > "upload_media": 1, > "web": 2, > "alert_dialog": 1, > "open_account": 2, > "action_list": 2, > "enter_phone": 2, > "open_link": 1, > "show_code": 1, > "update_users": 1, > "check_logged_in_account": 1, > "enter_email": 2, > "select_avatar": 4, > "location_permission_prompt": 2, > "notifications_permission_prompt": 4, > } > > > def make_request(): > with requests.Session() as session: > guest_token = session.post( > "https://api.twitter.com/1.1/guest/activate.json", > headers={ > "Authorization": BEARER_TOKEN, > }, > ).json()["guest_token"] > flow_token = session.post( > "https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us", > headers={ > **BASIC_HEADERS, > "X-Guest-Token": guest_token, > }, > data=json.dumps( > { > "flow_token": None, > "input_flow_data": { > "country_code": None, > "flow_context": { > "start_location": {"location": "splash_screen"} > }, > "requested_variant": None, > "target_user_id": 0, > }, > "subtask_versions": SUBTASK_VERSIONS, > } > ), > ).json()["flow_token"] > response = session.post( > "https://api.twitter.com/1.1/onboarding/task.json", > headers={ > **BASIC_HEADERS, > "X-Guest-Token": guest_token, > }, > data=json.dumps( > { > "flow_token": flow_token, > "subtask_inputs": [ > { > "open_link": { > "link": "next_link", > }, > "subtask_id": "NextTaskOpenLink", > } > ], > "subtask_versions": SUBTASK_VERSIONS, > } > ), > ) > return response > > > def main(): > last_attempt_time = None > if os.path.exists(LAST_ATTEMPT_FILE): > with open(LAST_ATTEMPT_FILE) as last_attempt_file: > last_attempt_time = json.load(last_attempt_file)["Time"] > if ( > last_attempt_time > and (time_diff := datetime.now() - parsedate(last_attempt_time)) > <= CREATE_INTERVAL > ): > if CREATE_INTERVAL - time_diff <= WAIT_INTERVAL: > sleep(int((CREATE_INTERVAL - time_diff).total_seconds())) > else: > return > response = make_request() > if new_account := response.json().get("subtasks", [{}])[0].get("open_account"): > new_account["creation_time"] = f"{datetime.now()}" > account_list = [] > if os.path.exists(OUTPUT_FILE): > with open(OUTPUT_FILE) as accounts_file: > account_list = json.load(accounts_file) > if PRUNE_INTERVAL: > to_prune = 0 > for account in account_list: > if ( > creation_time := account.get("creation_time") > ) and datetime.now() - parsedate(creation_time) < PRUNE_INTERVAL: > break > to_prune += 1 > account_list = account_list[to_prune:] > account_list.append(new_account) > with open(OUTPUT_FILE, "w") as accounts_file: > json.dump(account_list, accounts_file, indent=4) > with open(LAST_ATTEMPT_FILE, "w") as last_attempt_file: > json.dump( > {"Success": bool(new_account), "Time": f"{datetime.now()}"}, > last_attempt_file, > ) > > > if __name__ == "__main__": > main() > ``` > > You may want to set PRUNE_INTERVAL to None initially until you've generated a decent pool of new accounts, because it's going to remove any of your old ones that lack the creation_time attribute. (Or you could just add it manually to roughly the date/time you created them if you know it.) I run this once per hour through cron, and it uses the LAST_ATTEMPT_FILE to track when it should next attempt to make an account. I tried this script on an OVH server, for the first few days it wasn't picking up any token, I had to generate some beforehand on my home internet connection. But when I took a look at the guest_accounts.json, it started generating token on the OVH IP, so I guess you have to just keep going until Twitter thinks your IP is safe?
cmj commented 2023-09-22 00:40:52 -04:00 (Migrated from github.com)

In my experience, you can only request a guest account once every 24 hours. Any more requests just pushes your request window out another 24 hours. I have a @daily cronjob that acquires a guest account just fine.

In my experience, you can only request a guest account once every 24 hours. Any more requests just pushes your request window out another 24 hours. I have a ```@daily``` cronjob that acquires a guest account just fine.
drpepper66 commented 2023-09-22 09:24:37 -04:00 (Migrated from github.com)

I've created a small webservice that allows owners of public instances (i.e. listed in the wiki) to fetch 50k guest accounts every month. redacted, it's dead

let me know if you have any feedback, by sending me an email. Do not put more noise into this issue.

I've created a small webservice that allows owners of **public instances** (i.e. listed in the wiki) to fetch 50k guest accounts every month. **redacted, it's dead** let me know if you have any feedback, **by sending me an email**. Do not put more noise into this issue.
tonywangcn commented 2023-09-22 09:47:33 -04:00 (Migrated from github.com)

@drpepper66 Great service. Is everyone sharing the 50k guest accounts ?

@drpepper66 Great service. Is everyone sharing the 50k guest accounts ?
drpepper66 commented 2023-09-22 09:51:00 -04:00 (Migrated from github.com)

no, distinct. it is intended to cover the needs of any large public instance.

no, distinct. it is intended to cover the needs of any large public instance.
tonywangcn commented 2023-09-22 09:54:41 -04:00 (Migrated from github.com)

@drpepper66 Cool, could you share some technical details behind it?

@drpepper66 Cool, could you share some technical details behind it?
drpepper66 commented 2023-09-22 09:57:05 -04:00 (Migrated from github.com)

@tonywangcn all i can say is that it doesn't do anything special that isn't already mentioned in this thread. the service around the script is also boring.

i see you have written blogposts about web crawling before. right now i want to ensure that normal human usage of nitter can resume. i can share more at a later point.

@tonywangcn all i can say is that it doesn't do anything special that isn't already mentioned in this thread. the service around the script is also boring. i see you have written blogposts about web crawling before. right now i want to ensure that normal human usage of nitter can resume. i can share more at a later point.
cooljeanius commented 2023-09-27 16:43:15 -04:00 (Migrated from github.com)

i can share more at a later point.

@drpepper66 about how much later?

> i can share more at a later point. @drpepper66 about how much later?
DrSocket commented 2023-10-01 11:05:22 -04:00 (Migrated from github.com)

Did anyone else notice a big change in how fast an account gets rate limited?

Did anyone else notice a big change in how fast an account gets rate limited?
drpepper66 commented 2023-10-02 10:25:06 -04:00 (Migrated from github.com)

@DrSocket no, not really at all. the same tricks still work since multiple weeks now

@DrSocket no, not really at all. the same tricks still work since multiple weeks now
tinfoil-hat-net commented 2023-10-07 12:05:45 -04:00 (Migrated from github.com)

Can someone give me a TL:DR on how to fix this? I am a bit over my head

Can someone give me a TL:DR on how to fix this? I am a bit over my head
OrangeFlavored commented 2023-10-09 06:28:49 -04:00 (Migrated from github.com)

Has something changed with the guest account process? I've noticed within the past 3 days or so I've been unable to get any new ones with the same process that had been working up until then. (Using new IPs rather than just waiting the 24+ hours on my home IP didn't seem to make a difference either.)

Has something changed with the guest account process? I've noticed within the past 3 days or so I've been unable to get any new ones with the same process that had been working up until then. (Using new IPs rather than just waiting the 24+ hours on my home IP didn't seem to make a difference either.)
thomas-333 commented 2023-10-09 06:47:30 -04:00 (Migrated from github.com)

Still working for me. I'm using your script modified to run in a loop and I got 20 tokens on Saturday and 9 yesterday. It is very variable how many I can get a day. I run it on my own IP.

Still working for me. I'm using your script modified to run in a loop and I got 20 tokens on Saturday and 9 yesterday. It is very variable how many I can get a day. I run it on my own IP.
drpepper66 commented 2023-10-09 09:11:32 -04:00 (Migrated from github.com)

yes, a lot of IP addresses no longer work. it seems they went on a banning spree, possibly ASN-based. it is also possible that certain people became too greedy and polluted the pool for everybody, but i think it is unlikely.

yes, a lot of IP addresses no longer work. it seems they went on a banning spree, possibly ASN-based. it is also possible that certain people became too greedy and polluted the pool for everybody, but i think it is unlikely.
cmj commented 2023-10-09 17:39:42 -04:00 (Migrated from github.com)

@drpepper66 When did you notice this? I'm still able to do @daily cron jobs. I also run against a few proxy lists and "phone tether script" once a week; haven't noticed any change out of the ordinary.

My daily request randomly gets denied and I'm going to assume it's some time precision issue. My last denied request was today. One could bump to every other day...

@drpepper66 When did you notice this? I'm still able to do ```@daily``` cron jobs. I also run against a few proxy lists and "phone tether script" once a week; haven't noticed any change out of the ordinary. My daily request randomly gets denied and I'm going to assume it's some time precision issue. My last denied request was today. One could bump to every other day...
drpepper66 commented 2023-10-09 17:44:12 -04:00 (Migrated from github.com)

1-2 days ago. Exact timeframe unclear. Most IP pools I have tried no longer work reliably. If you have proxy lists that work for large volume of accounts (10k+ / day), please email me them or any hints you have (link in profile). I do not recommend posting publicly. The above linked service for public instances currently does not work reliably.

1-2 days ago. Exact timeframe unclear. Most IP pools I have tried no longer work reliably. If you have proxy lists that work for large volume of accounts (10k+ / day), please email me them or any hints you have (link in profile). I do not recommend posting publicly. The above linked service for public instances currently does not work reliably.
DrSocket commented 2023-10-13 08:07:35 -04:00 (Migrated from github.com)

The user search endpoint seems to be down. is it working for anyone? on X the url still seems to be the same
user: /search?q=xyz&src=typed_query&f=user
latest: /search?q=xyz&src=typed_query&f=live

The user search endpoint seems to be down. is it working for anyone? on X the url still seems to be the same user: /search?q=xyz&src=typed_query&f=user latest: /search?q=xyz&src=typed_query&f=live
lukefromdc commented 2023-10-13 12:33:09 -04:00 (Migrated from github.com)

Seems to be working now.

Seems to be working now.
DrSocket commented 2023-10-13 12:40:40 -04:00 (Migrated from github.com)

@lukefromdc https://nitter.net/search?f=users&q=elon this works for you?

@lukefromdc https://nitter.net/search?f=users&q=elon this works for you?
lukefromdc commented 2023-10-13 17:09:07 -04:00 (Migrated from github.com)

https://nitter.net/search?q=%23test
works,
a user search does not

https://nitter.net/search?q=%23test works, a user search does not
DrSocket commented 2023-10-13 17:24:52 -04:00 (Migrated from github.com)

that's what I said...

that's what I said...
lukefromdc commented 2023-10-13 17:32:06 -04:00 (Migrated from github.com)

I do NOT know enough about website programming to understand much about this, so letting that go. Nitter is something I use, but my programming experience is limited to DE and UI type stuff

I do NOT know enough about website programming to understand much about this, so letting that go. Nitter is something I use, but my programming experience is limited to DE and UI type stuff
Apachez- commented 2023-10-14 09:11:07 -04:00 (Migrated from github.com)

Something borked a few moments ago with https://nitter.net:

"
Instance has been rate limited.
Use another instance or try again later.
"

Something borked a few moments ago with https://nitter.net: " Instance has been rate limited. Use [another instance](https://github.com/zedeus/nitter/wiki/Instances) or try again later. "
Fa5g commented 2023-10-14 11:31:47 -04:00 (Migrated from github.com)

Something borked a few moments ago with https://nitter.net:

" Instance has been rate limited. Use another instance or try again later. "

It seems the guest accounts are exceeding the rate limit too fast. Was the rate limit changed?

> Something borked a few moments ago with https://nitter.net: > > " Instance has been rate limited. Use [another instance](https://github.com/zedeus/nitter/wiki/Instances) or try again later. " It seems the guest accounts are exceeding the rate limit too fast. Was the rate limit changed?
zedeus commented 2023-10-14 11:51:33 -04:00 (Migrated from github.com)

I was experimenting with using fewer guest accounts, nothing else changed. It's working fine now with a larger batch.

I was experimenting with using fewer guest accounts, nothing else changed. It's working fine now with a larger batch.
Fa5g commented 2023-10-14 11:57:46 -04:00 (Migrated from github.com)

What is the rate limit, requests per guest account in a 15 minutes window?

What is the rate limit, requests per guest account in a 15 minutes window?
zedeus commented 2023-10-14 11:59:58 -04:00 (Migrated from github.com)

Depends on the endpoint and requests per second, it's very weird. A lot more guest accounts are needed than expected based on the 15 minute rate limits.

Depends on the endpoint and requests per second, it's very weird. A _lot_ more guest accounts are needed than expected based on the 15 minute rate limits.
VictorVow commented 2023-10-15 05:56:15 -04:00 (Migrated from github.com)

Invidious released smart-ipv6-rotator to circumvent YouTube blocking (docs). Haven't been following the issue here closely but am curious if it's relevant as a solution.

Invidious released [smart-ipv6-rotator](https://github.com/iv-org/smart-ipv6-rotator) to circumvent YouTube blocking ([docs](https://docs.invidious.io/ipv6-rotator/)). Haven't been following the issue here closely but am curious if it's relevant as a solution.
DrSocket commented 2023-10-15 07:35:58 -04:00 (Migrated from github.com)

Hi, no info on User search ?

On Sat, Oct 14, 2023 at 18:00, Zed @.***(mailto:On Sat, Oct 14, 2023 at 18:00, Zed < wrote:

Depends on the endpoint and requests per second, it's very weird. A lot more guest accounts are needed than expected based on the 15 minute rate limits.

—
Reply to this email directly,
view it on GitHub, or unsubscribe.
You are receiving this because you commented.Message ID: @.***>

Hi, no info on User search ? On Sat, Oct 14, 2023 at 18:00, Zed ***@***.***(mailto:On Sat, Oct 14, 2023 at 18:00, Zed <<a href=)> wrote: > Depends on the endpoint and requests per second, it's very weird. A lot more guest accounts are needed than expected based on the 15 minute rate limits. > > — > Reply to this email directly, [view it on GitHub](https://github.com/zedeus/nitter/issues/983#issuecomment-1762995981), or [unsubscribe](https://github.com/notifications/unsubscribe-auth/APZGOP2GSREWICBJL36FA7TX7KZJRANCNFSM6AAAAAA3QWLU6U). > You are receiving this because you commented.Message ID: ***@***.***>
zedeus commented 2023-10-15 09:56:30 -04:00 (Migrated from github.com)

The legacy endpoint used stopped working, I'll replace it soon

The legacy endpoint used stopped working, I'll replace it soon
Apachez- commented 2023-10-15 10:01:25 -04:00 (Migrated from github.com)

Slightly off-topic but since this is the general complain thread I would also like to add some positive experience.

Since about yesterday it feels like nitter.net loads much faster, dunno if thats a coincident or not (about when those rate limited messages went away)?

That is both for a specific username such as:

https://nitter.net/< user1 >/with_replies

But also the multiuser loading:

https://nitter.net/< user1 >,< user2 >,< user3 >/with_replies

Slightly off-topic but since this is the general complain thread I would also like to add some positive experience. Since about yesterday it feels like nitter.net loads much faster, dunno if thats a coincident or not (about when those rate limited messages went away)? That is both for a specific username such as: https://nitter.net/< user1 >/with_replies But also the multiuser loading: https://nitter.net/< user1 >,< user2 >,< user3 >/with_replies
ImTheDeveloper commented 2023-10-15 10:23:02 -04:00 (Migrated from github.com)

1-2 days ago. Exact timeframe unclear. Most IP pools I have tried no longer work reliably. If you have proxy lists that work for large volume of accounts (10k+ / day), please email me them or any hints you have (link in profile). I do not recommend posting publicly. The above linked service for public instances currently does not work reliably.

I was having OK success but noticed the last couple of days I'm able to get anywhere between 600 - 2k tokens but then hit upon a couple of limits:

  1. The client application is not authorised to access this API. - sporadic in nature almost a rate limiting issue.
  2. Fetching oauth tokens happily and then suddenly an endless cycle of the requirement to complete further steps on the open welcome link process. I've seen this happen when ip pools have been used already but this seems to be different as multiple different provider pools all get stuck at the same time

The above can be both fixed by simply killing my processing and waiting an hour or so. Maybe there is a wider rate limit on this now.

> 1-2 days ago. Exact timeframe unclear. Most IP pools I have tried no longer work reliably. If you have proxy lists that work for large volume of accounts (10k+ / day), please email me them or any hints you have (link in profile). I do not recommend posting publicly. The above linked service for public instances currently does not work reliably. I was having OK success but noticed the last couple of days I'm able to get anywhere between 600 - 2k tokens but then hit upon a couple of limits: 1. The client application is not authorised to access this API. - sporadic in nature almost a rate limiting issue. 2. Fetching oauth tokens happily and then suddenly an endless cycle of the requirement to complete further steps on the open welcome link process. I've seen this happen when ip pools have been used already but this seems to be different as multiple different provider pools all get stuck at the same time The above can be both fixed by simply killing my processing and waiting an hour or so. Maybe there is a wider rate limit on this now.
raka01001 commented 2023-10-16 02:16:20 -04:00 (Migrated from github.com)

I have 40k-50k twitter/x new tokens on a daily basis. If anyone required feel free to contact me at raka01001@gmail.com

I have 40k-50k twitter/x new tokens on a daily basis. If anyone required feel free to contact me at raka01001@gmail.com
drpepper66 commented 2023-10-16 11:08:48 -04:00 (Migrated from github.com)

twitterminator is also back up and running. we're able to generate 100k tokens per day, which should be enough for the instances we are currently serving. please email me if you need something for your private instance, I can approve those manually but may have to kick them out if twitter implements further restrictions and resources become tight again.

I would like to point out that there's likely a threshold of traffic at which the twitter team notices how hot their servers run, becomes active and implements further restrictions to save their servers. please do not hammer the API at high concurrency and produce spiky load on twitter's end if you can avoid it -- I believe it is better to load data at a constant, but low request/s. I myself have been guilty of this.

I have noticed the same behavior on myself when fighting bots on my own instance: I don't care about bots that send 1 request every 10 seconds 24/7, but if you are trying to scrape a batch of data in a very short amount of time, every day, and come at me from 1000 different IPs to achieve 200 requests/s, you are getting banned, because I do not want to pay for those additional resources.

Just be polite.

[twitterminator](https://twitterminator.x86-64-unknown-linux-gnu.zip/) is also back up and running. we're able to generate 100k tokens per day, which should be enough for the instances we are currently serving. please email me if you need something for your private instance, I can approve those manually but may have to kick them out if twitter implements further restrictions and resources become tight again. I would like to point out that there's likely a threshold of traffic at which the twitter team notices how hot their servers run, becomes active and implements further restrictions to save their servers. please do not hammer the API at high concurrency and produce spiky load on twitter's end if you can avoid it -- I believe it is better to load data at a constant, but low request/s. I myself have been guilty of this. I have noticed the same behavior on myself when fighting bots on my own instance: I don't care about bots that send 1 request every 10 seconds 24/7, but if you are trying to scrape a batch of data in a very short amount of time, every day, and come at me from 1000 different IPs to achieve 200 requests/s, you are getting banned, because I do not want to pay for those additional resources. Just be polite.
ImTheDeveloper commented 2023-10-18 00:46:24 -04:00 (Migrated from github.com)

https://nitter.net/Support/status/1714429406192582896#m

Interesting move if rolled out everywhere

https://nitter.net/Support/status/1714429406192582896#m Interesting move if rolled out everywhere
lukefromdc commented 2023-10-18 01:41:34 -04:00 (Migrated from github.com)

Any payment requirement (even a penny) to make a new account serves as backdoor identity verification and limits account formation to folks already familiar with using money online,which many are NOT.

If THAT happens, new Twitter account formation should nearly stop. Many folks (myself included) who do not shop online and thus do not have any online currency accounts and/or do not do real names social media will respond to this demand by closing the tab and walking away from Twitter. Meanwhile, no such hassles over at Mastodon. Until Twitter rolls over and sinks for good, we need Nitter. When it does, I just hope Mastodon and not Meta is the main beneficiary

Any payment requirement (even a penny) to make a new account serves as backdoor identity verification and limits account formation to folks already familiar with using money online,which many are NOT. If THAT happens, new Twitter account formation should nearly stop. Many folks (myself included) who do not shop online and thus do not have any online currency accounts and/or do not do real names social media will respond to this demand by closing the tab and walking away from Twitter. Meanwhile, no such hassles over at Mastodon. Until Twitter rolls over and sinks for good, we need Nitter. When it does, I just hope Mastodon and not Meta is the main beneficiary
Petemir commented 2023-10-22 09:48:05 -04:00 (Migrated from github.com)

I usually create one daily guest account from 4 different IPs (one of them at a University and another in a VPS). For several days I have been unable to create any account in any of those IPs -- have they started banning home IPs too? 🤪

I usually create one daily guest account from 4 different IPs (one of them at a University and another in a VPS). For several days I have been unable to create any account in any of those IPs -- have they started banning home IPs too? :zany_face:
undefined-folder commented 2023-10-24 18:31:39 -04:00 (Migrated from github.com)

have they started banning home IPs too? 🤪

I generated a few just now using 5 different IPs (4 mobile, 1 residential) and the yield was pretty low but still enough for my private instance.

> have they started banning home IPs too? 🤪 I generated a few just now using 5 different IPs (4 mobile, 1 residential) and the yield was pretty low but still enough for my private instance.
BhagirathGoud commented 2023-10-24 23:40:42 -04:00 (Migrated from github.com)

have they started banning home IPs too? 🤪

I generated a few just now using 5 different IPs (4 mobile, 1 residential) and the yield was pretty low but still enough for my private instance.

May I know the process on how you are generating guest account tokens ?

> > have they started banning home IPs too? 🤪 > > > > I generated a few just now using 5 different IPs (4 mobile, 1 residential) and the yield was pretty low but still enough for my private instance. May I know the process on how you are generating guest account tokens ?
Petemir commented 2023-10-25 05:40:33 -04:00 (Migrated from github.com)

have they started banning home IPs too? 🤪

I generated a few just now using 5 different IPs (4 mobile, 1 residential) and the yield was pretty low but still enough for my private instance.

Yeah, in the end just in case I waited 48hs. instead of the usual 24hs. and I could get some accounts too, great.

May I know the process on how you are generating guest account tokens ?

There are both python and javascript scripts along this thread, make sure to "Load more" items in order to find them.

> > have they started banning home IPs too? 🤪 > > I generated a few just now using 5 different IPs (4 mobile, 1 residential) and the yield was pretty low but still enough for my private instance. Yeah, in the end just in case I waited 48hs. instead of the usual 24hs. and I could get some accounts too, great. > May I know the process on how you are generating guest account tokens ? There are both python and javascript scripts along this thread, make sure to "Load more" items in order to find them.
yunwei17 commented 2023-10-29 04:34:25 -04:00 (Migrated from github.com)

Hi, is there a way to subscribes to a couple of account using the guest token? If not, is there a way to poll the endpoint? And whats the rate limit like?

Hi, is there a way to subscribes to a couple of account using the guest token? If not, is there a way to poll the endpoint? And whats the rate limit like?
cherryband commented 2023-11-05 10:51:27 -05:00 (Migrated from github.com)

I'm trying to run my personal instance using the latest commit (d175832) but it says it's rate-limited despite having dozen or so guest accounts.
All errors have this structure:
error: RangeDefect, msg: value out of range: 3462608142 notin -2147483648 .. 2147483647, accountId: (...), url:(...)

I'm trying to run my personal instance using the latest commit (d175832) but it says it's rate-limited despite having dozen or so guest accounts. All errors have this structure: `error: RangeDefect, msg: value out of range: 3462608142 notin -2147483648 .. 2147483647, accountId: (...), url:(...)`
zedeus commented 2023-11-05 12:45:10 -05:00 (Migrated from github.com)

@cherryband Can you post one of the account that triggers this error?

@cherryband Can you post one of the account that triggers this error?
cherryband commented 2023-11-05 13:04:35 -05:00 (Migrated from github.com)

@zedeus none of the accounts have succeeded, and I'm not sure how nitter chooses it, but the first one is {"oauth_token":"1721163358626271232-XJNegxOgOBaSjMQPJAT6ZEb5hGAO3O","oauth_token_secret":"juTU729TzjsC9GvmrTN5m41TE9dPMIcEuOlTFcynpPLx6"}

@zedeus none of the accounts have succeeded, and I'm not sure how nitter chooses it, but the first one is `{"oauth_token":"1721163358626271232-XJNegxOgOBaSjMQPJAT6ZEb5hGAO3O","oauth_token_secret":"juTU729TzjsC9GvmrTN5m41TE9dPMIcEuOlTFcynpPLx6"}`
cherryband commented 2023-11-05 13:31:10 -05:00 (Migrated from github.com)

ok trying it on my desktop it works fine, does this software not support 32-bit environment?

ok trying it on my desktop it works fine, does this software not support 32-bit environment?
zedeus commented 2023-11-05 13:33:36 -05:00 (Migrated from github.com)

It should, but I might be missing an explicit int64 somewhere

It should, but I might be missing an explicit int64 somewhere
LGUG2Z commented 2023-11-10 16:39:38 -05:00 (Migrated from github.com)

I had some fun diving into all the comments on this issue yesterday when I wanted to get Nitter running on NixOS. I documented the process for getting the guest_accounts branch working with services.nitter so it should be pretty easily reproducible for people running a NixOS server.

Thanks to the Laughing Man and everyone whose hard work makes a very important piece of software like Nitter possible. 🙏

I had some fun diving into all the comments on this issue yesterday when I wanted to get Nitter running on NixOS. I [documented the process](https://lgug2z.com/articles/a-working-instance-of-nitter-on-nixos/) for getting the `guest_accounts` branch working with `services.nitter` so it should be pretty easily reproducible for people running a NixOS server. Thanks to the Laughing Man and everyone whose hard work makes a very important piece of software like Nitter possible. 🙏
GensHaze commented 2023-11-11 21:33:51 -05:00 (Migrated from github.com)

Hello all,

I had a free afternoon today, so I gave a shot towards getting myself a private instance of Nitter, that I had used for some time until the API changes hit. I have a few other Docker containers running such as for Reddit and YouTube. Unfortunately, I have to give up on this for now as I wasn't quite able to figure it out...

This is in no way slander, I understand this is all very active development. However, I didn't want to leave without at least saying thank you all for such amazing work.

If there is ever anyone willing to create a tutorial for how to build a docker image for this guest_account branch from scratch, I would be extremely grateful. Even more so, if the changes get merged into the master Docker image, that would be beautiful! Until then, I will keep an eye on how this continues to develop!

Thanks all!

Hello all, I had a free afternoon today, so I gave a shot towards getting myself a private instance of Nitter, that I had used for some time until the API changes hit. I have a few other Docker containers running such as for Reddit and YouTube. Unfortunately, I have to give up on this for now as I wasn't quite able to figure it out... This is in no way slander, I understand this is all very active development. However, I didn't want to leave without at least saying thank you all for such amazing work. If there is ever anyone willing to create a tutorial for how to build a docker image for this guest_account branch from scratch, I would be extremely grateful. Even more so, if the changes get merged into the master Docker image, that would be beautiful! Until then, I will keep an eye on how this continues to develop! Thanks all!
ojaha065 commented 2023-11-12 03:32:11 -05:00 (Migrated from github.com)

@GensHaze This is not a comprehensive guide by any means, but here's something:

Prerequisites: Have Git and Docker installed

1. Clone the repository, switch to guest_accounts branch

git clone https://github.com/zedeus/nitter.git
cd nitter
git checkout guest_accounts

2. Use Docker to build the image

docker build . --tag nitter:guest

Tag can be pretty much anything.

3. Update the docker-compose file
Change image: zedeus/nitter:latest --> image: nitter:guest
nitter:guest should be the tag used in step 2.

Create a JSON file and mount it by adding

- ./guest_accounts.json:/src/guest_accounts.json:ro

to the volumes section around line 11.
./guest_accounts.json should be path to the JSON file you created. For simplicity's sake I just keep it in the same folder than my docker-compose file and nitter.conf.

4. Get some guest accounts
This is the hardest part. You can get one quest account per 24h per IP and each account is valid for 30 days only. (So you need to keep generating new accounts manually or even better, automate it somehow.) There's scripts for generating accounts in multiple languages in this thread. For a single-user instance only couple of accounts should be needed, depending on usage ofc. I use around 15 and never have had any issues.
Add the accounts to guest_accounts.json as follows:

[
  {"oauth_token":"...", "oauth_token_secret":"..."},
  {"oauth_token":"...", "oauth_token_secret":"..."},
  ...
]

5. Start the containers as you normally would
e.g. docker compose up -d

@GensHaze This is not a comprehensive guide by any means, but here's something: Prerequisites: Have Git and Docker installed **1. Clone the repository, switch to `guest_accounts` branch** ``` git clone https://github.com/zedeus/nitter.git cd nitter git checkout guest_accounts ``` **2. Use Docker to build the image** ``` docker build . --tag nitter:guest ``` Tag can be pretty much anything. **3. Update the docker-compose file** Change `image: zedeus/nitter:latest` --> `image: nitter:guest` `nitter:guest` should be the tag used in step 2. Create a JSON file and mount it by adding ``` - ./guest_accounts.json:/src/guest_accounts.json:ro ``` to the [volumes section](https://github.com/zedeus/nitter/blob/eaedd2aee7be6bc3dd2dceee09dc93052d0046f4/docker-compose.yml#L10C10-L10C10) around line 11. `./guest_accounts.json` should be path to the JSON file you created. For simplicity's sake I just keep it in the same folder than my docker-compose file and nitter.conf. **4. Get some guest accounts** This is the hardest part. You can get one quest account per 24h per IP and each account is valid for 30 days only. (So you need to keep generating new accounts manually or even better, automate it somehow.) There's scripts for generating accounts in multiple languages in this thread. For a single-user instance only couple of accounts should be needed, depending on usage ofc. I use around 15 and never have had any issues. Add the accounts to `guest_accounts.json` as follows: ``` [ {"oauth_token":"...", "oauth_token_secret":"..."}, {"oauth_token":"...", "oauth_token_secret":"..."}, ... ] ``` **5. Start the containers as you normally would** e.g. `docker compose up -d`
12joan commented 2023-11-12 03:44:15 -05:00 (Migrated from github.com)

To add to @ojaha065's guide, someone also pointed me towards this service for fetching guest accounts using curl.

(@drpepper66 Really nice authentication mechanism, by the way! 🤩)

https://twitterminator.x86-64-unknown-linux-gnu.zip/

To add to @ojaha065's guide, someone also pointed me towards this service for fetching guest accounts using `curl`. (@drpepper66 Really nice authentication mechanism, by the way! 🤩) https://twitterminator.x86-64-unknown-linux-gnu.zip/
GensHaze commented 2023-11-12 15:52:00 -05:00 (Migrated from github.com)

@ojaha065 Indeed, I was so close - just a few pieces I was missing which you just now handed to me, thanks so much, I truly appreciate it a ton!

After finagling some more with some Docker networking things, I am now running my own private Nitter instance fully functional with 10 guest accounts.

I will regardless continue to keep an eye out, see where the future takes us 😄 hope Twitter doesn't keep making things difficult, well... one can only hope!

@ojaha065 Indeed, I was so close - just a few pieces I was missing which you just now handed to me, thanks so much, I truly appreciate it a ton! After finagling some more with some Docker networking things, I am now running my own private Nitter instance fully functional with 10 guest accounts. I will regardless continue to keep an eye out, see where the future takes us 😄 hope Twitter doesn't keep making things difficult, well... one can only hope!
RunlevelConsulting commented 2023-11-14 16:38:31 -05:00 (Migrated from github.com)

Here's a PHP version (yes I know, boo hiss) based off a Python script that was posted a while ago. It's not the cleanest but it does the job.

It does the following:

  • Generates new guest accounts
  • Adds a 'created' key to each guest account created with the current time
  • Removes any guest accounts older than 30 days

This can be run automatically, and in theory, keep adding new accounts to your guest_accounts.json file. You just need to restart your Nitter instance every now and then to load in those new accounts.

<?php

// Create file
$file_guestAccounts = "/tmp/guest_accounts.json";
shell_exec("touch $file_guestAccounts;");


// Remove old Guest Accounts
$currentList = json_decode(shell_exec("cat $file_guestAccounts"), true);
$unset = 0;
if ( isset($currentList) ){
  foreach ( $currentList as $k => $gA){
    if (date("U") - $gA['created'] > 2592000){
      unset($currentList[$k]);
      $unset++;
    }
  }
  echo "Unset $unset accounts...\n";
  file_put_contents($file_guestAccounts, json_encode(array_values($currentList)));
}


// Generate New Guest Account
$guestToken = shell_exec("curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json \
                               -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
                               | jq -r '.guest_token'");

$flowToken = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' \
                              -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
                              -H 'Content-Type: application/json' \
                              -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \
                              -H 'X-Twitter-API-Version: 5' \
                              -H 'X-Twitter-Client: TwitterAndroid' \
                              -H 'X-Twitter-Client-Version: 9.95.0-release.0' \
                              -H 'OS-Version: 28' \
                              -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \
                              -H 'X-Twitter-Active-User: yes' \
                              -H 'X-Guest-Token: " . trim($guestToken) . "' \
                              -d '{\"flow_token\":null,\"input_flow_data\":{\"country_code\":null,\"flow_context\":{\"start_location\":{\"location\":\"splash_screen\"}},\"requested_variant\":null,\"target_user_id\":0},\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \
                              | jq -r .flow_token");

$guestAccount = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \
                                 -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
                                 -H 'Content-Type: application/json' \
                                 -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \
                                 -H 'X-Twitter-API-Version 5' \
                                 -H 'X-Twitter-Client: TwitterAndroid' \
                                 -H 'X-Twitter-Client-Version: 9.95.0-release.0' \
                                 -H 'OS-Version: 28' \
                                 -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \
                                 -H 'X-Twitter-Active-User: yes' \
                                 -H 'X-Guest-Token: " . trim($guestToken) . "' \
                                 -d '{\"flow_token\":\"" . trim($flowToken) . "\",\"subtask_inputs\":[{\"open_link\":{\"link\":\"next_link\"},\"subtask_id\":\"NextTaskOpenLink\"}],\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \
                                 | jq -r '.subtasks[0]|if(.open_account) then .open_account else empty end'");


// If generation successful, add guest account to file
if ( !isset($guestAccount) ){ echo "No new token generated...\n"; exit(); }
$guestAccountRaw = json_decode($guestAccount, true);

if ( $guestAccountRaw['attribution_event'] == "signup"){
  // Add the timestamp
  $guestAccountRaw['created'] = date("U");
  // Add a comma after the new guest account
  $guestAccountModified = json_encode($guestAccountRaw) . ",";
  echo $guestAccountModified;
  // Remove the first and last square brackets
  $currentGuestAccounts = shell_exec("cat $file_guestAccounts | sed 's/,]//g' | sed 's/\[//g'");
  file_put_contents($file_guestAccounts, $guestAccountModified . $currentGuestAccounts);
  // Re-add square brackets, ensuring the last account does not have a comma preceeding the square bracket
  shell_exec("tr '\n' ' ' < $file_guestAccounts; sed -i -e 's/^{/[{/g' -e 's/},$/}]/g' $file_guestAccounts");
}
?>
Here's a PHP version (yes I know, boo hiss) based off a Python script that was posted a while ago. It's not the cleanest but it does the job. It does the following: - Generates new guest accounts - Adds a 'created' key to each guest account created with the current time - Removes any guest accounts older than 30 days This can be run automatically, and in theory, keep adding new accounts to your guest_accounts.json file. You just need to restart your Nitter instance every now and then to load in those new accounts. ``` <?php // Create file $file_guestAccounts = "/tmp/guest_accounts.json"; shell_exec("touch $file_guestAccounts;"); // Remove old Guest Accounts $currentList = json_decode(shell_exec("cat $file_guestAccounts"), true); $unset = 0; if ( isset($currentList) ){ foreach ( $currentList as $k => $gA){ if (date("U") - $gA['created'] > 2592000){ unset($currentList[$k]); $unset++; } } echo "Unset $unset accounts...\n"; file_put_contents($file_guestAccounts, json_encode(array_values($currentList))); } // Generate New Guest Account $guestToken = shell_exec("curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json \ -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ | jq -r '.guest_token'"); $flowToken = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' \ -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ -H 'Content-Type: application/json' \ -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \ -H 'X-Twitter-API-Version: 5' \ -H 'X-Twitter-Client: TwitterAndroid' \ -H 'X-Twitter-Client-Version: 9.95.0-release.0' \ -H 'OS-Version: 28' \ -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \ -H 'X-Twitter-Active-User: yes' \ -H 'X-Guest-Token: " . trim($guestToken) . "' \ -d '{\"flow_token\":null,\"input_flow_data\":{\"country_code\":null,\"flow_context\":{\"start_location\":{\"location\":\"splash_screen\"}},\"requested_variant\":null,\"target_user_id\":0},\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \ | jq -r .flow_token"); $guestAccount = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \ -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ -H 'Content-Type: application/json' \ -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \ -H 'X-Twitter-API-Version 5' \ -H 'X-Twitter-Client: TwitterAndroid' \ -H 'X-Twitter-Client-Version: 9.95.0-release.0' \ -H 'OS-Version: 28' \ -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \ -H 'X-Twitter-Active-User: yes' \ -H 'X-Guest-Token: " . trim($guestToken) . "' \ -d '{\"flow_token\":\"" . trim($flowToken) . "\",\"subtask_inputs\":[{\"open_link\":{\"link\":\"next_link\"},\"subtask_id\":\"NextTaskOpenLink\"}],\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \ | jq -r '.subtasks[0]|if(.open_account) then .open_account else empty end'"); // If generation successful, add guest account to file if ( !isset($guestAccount) ){ echo "No new token generated...\n"; exit(); } $guestAccountRaw = json_decode($guestAccount, true); if ( $guestAccountRaw['attribution_event'] == "signup"){ // Add the timestamp $guestAccountRaw['created'] = date("U"); // Add a comma after the new guest account $guestAccountModified = json_encode($guestAccountRaw) . ","; echo $guestAccountModified; // Remove the first and last square brackets $currentGuestAccounts = shell_exec("cat $file_guestAccounts | sed 's/,]//g' | sed 's/\[//g'"); file_put_contents($file_guestAccounts, $guestAccountModified . $currentGuestAccounts); // Re-add square brackets, ensuring the last account does not have a comma preceeding the square bracket shell_exec("tr '\n' ' ' < $file_guestAccounts; sed -i -e 's/^{/[{/g' -e 's/},$/}]/g' $file_guestAccounts"); } ?> ```
iSack97 commented 2023-11-16 13:40:56 -05:00 (Migrated from github.com)

Here's a PHP version (yes I know, boo hiss) based off a Python script that was posted a while ago. It's not the cleanest but it does the job.

It does the following:

* Generates new guest accounts

* Adds a 'created' key to each guest account created with the current time

* Removes any guest accounts older than 30 days

This can be run automatically, and in theory, keep adding new accounts to your guest_accounts.json file. You just need to restart your Nitter instance every now and then to load in those new accounts.

<?php

// Create file
$file_guestAccounts = "/tmp/guest_accounts.json";
shell_exec("touch $file_guestAccounts;");


// Remove old Guest Accounts
$currentList = json_decode(shell_exec("cat $file_guestAccounts"), true);
$unset = 0;
if ( isset($currentList) ){
  foreach ( $currentList as $k => $gA){
    if (date("U") - $gA['created'] > 2592000){
      unset($currentList[$k]);
      $unset++;
    }
  }
  echo "Unset $unset accounts...\n";
  file_put_contents($file_guestAccounts, json_encode(array_values($currentList)));
}


// Generate New Guest Account
$guestToken = shell_exec("curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json \
                               -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
                               | jq -r '.guest_token'");

$flowToken = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' \
                              -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
                              -H 'Content-Type: application/json' \
                              -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \
                              -H 'X-Twitter-API-Version: 5' \
                              -H 'X-Twitter-Client: TwitterAndroid' \
                              -H 'X-Twitter-Client-Version: 9.95.0-release.0' \
                              -H 'OS-Version: 28' \
                              -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \
                              -H 'X-Twitter-Active-User: yes' \
                              -H 'X-Guest-Token: " . trim($guestToken) . "' \
                              -d '{\"flow_token\":null,\"input_flow_data\":{\"country_code\":null,\"flow_context\":{\"start_location\":{\"location\":\"splash_screen\"}},\"requested_variant\":null,\"target_user_id\":0},\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \
                              | jq -r .flow_token");

$guestAccount = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \
                                 -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
                                 -H 'Content-Type: application/json' \
                                 -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \
                                 -H 'X-Twitter-API-Version 5' \
                                 -H 'X-Twitter-Client: TwitterAndroid' \
                                 -H 'X-Twitter-Client-Version: 9.95.0-release.0' \
                                 -H 'OS-Version: 28' \
                                 -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \
                                 -H 'X-Twitter-Active-User: yes' \
                                 -H 'X-Guest-Token: " . trim($guestToken) . "' \
                                 -d '{\"flow_token\":\"" . trim($flowToken) . "\",\"subtask_inputs\":[{\"open_link\":{\"link\":\"next_link\"},\"subtask_id\":\"NextTaskOpenLink\"}],\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \
                                 | jq -r '.subtasks[0]|if(.open_account) then .open_account else empty end'");


// If generation successful, add guest account to file
if ( !isset($guestAccount) ){ echo "No new token generated...\n"; exit(); }
$guestAccountRaw = json_decode($guestAccount, true);

if ( $guestAccountRaw['attribution_event'] == "signup"){
  // Add the timestamp
  $guestAccountRaw['created'] = date("U");
  // Add a comma after the new guest account
  $guestAccountModified = json_encode($guestAccountRaw) . ",";
  echo $guestAccountModified;
  // Remove the first and last square brackets
  $currentGuestAccounts = shell_exec("cat $file_guestAccounts | sed 's/,]//g' | sed 's/\[//g'");
  file_put_contents($file_guestAccounts, $guestAccountModified . $currentGuestAccounts);
  // Re-add square brackets, ensuring the last account does not have a comma preceeding the square bracket
  shell_exec("tr '\n' ' ' < $file_guestAccounts; sed -i -e 's/^{/[{/g' -e 's/},$/}]/g' $file_guestAccounts");
}
?>

Very cool, but how to add/integrate this php to my guest_account instance?

> Here's a PHP version (yes I know, boo hiss) based off a Python script that was posted a while ago. It's not the cleanest but it does the job. > > It does the following: > > * Generates new guest accounts > > * Adds a 'created' key to each guest account created with the current time > > * Removes any guest accounts older than 30 days > > > This can be run automatically, and in theory, keep adding new accounts to your guest_accounts.json file. You just need to restart your Nitter instance every now and then to load in those new accounts. > > ``` > <?php > > // Create file > $file_guestAccounts = "/tmp/guest_accounts.json"; > shell_exec("touch $file_guestAccounts;"); > > > // Remove old Guest Accounts > $currentList = json_decode(shell_exec("cat $file_guestAccounts"), true); > $unset = 0; > if ( isset($currentList) ){ > foreach ( $currentList as $k => $gA){ > if (date("U") - $gA['created'] > 2592000){ > unset($currentList[$k]); > $unset++; > } > } > echo "Unset $unset accounts...\n"; > file_put_contents($file_guestAccounts, json_encode(array_values($currentList))); > } > > > // Generate New Guest Account > $guestToken = shell_exec("curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json \ > -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ > | jq -r '.guest_token'"); > > $flowToken = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' \ > -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ > -H 'Content-Type: application/json' \ > -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \ > -H 'X-Twitter-API-Version: 5' \ > -H 'X-Twitter-Client: TwitterAndroid' \ > -H 'X-Twitter-Client-Version: 9.95.0-release.0' \ > -H 'OS-Version: 28' \ > -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \ > -H 'X-Twitter-Active-User: yes' \ > -H 'X-Guest-Token: " . trim($guestToken) . "' \ > -d '{\"flow_token\":null,\"input_flow_data\":{\"country_code\":null,\"flow_context\":{\"start_location\":{\"location\":\"splash_screen\"}},\"requested_variant\":null,\"target_user_id\":0},\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \ > | jq -r .flow_token"); > > $guestAccount = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \ > -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ > -H 'Content-Type: application/json' \ > -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \ > -H 'X-Twitter-API-Version 5' \ > -H 'X-Twitter-Client: TwitterAndroid' \ > -H 'X-Twitter-Client-Version: 9.95.0-release.0' \ > -H 'OS-Version: 28' \ > -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \ > -H 'X-Twitter-Active-User: yes' \ > -H 'X-Guest-Token: " . trim($guestToken) . "' \ > -d '{\"flow_token\":\"" . trim($flowToken) . "\",\"subtask_inputs\":[{\"open_link\":{\"link\":\"next_link\"},\"subtask_id\":\"NextTaskOpenLink\"}],\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \ > | jq -r '.subtasks[0]|if(.open_account) then .open_account else empty end'"); > > > // If generation successful, add guest account to file > if ( !isset($guestAccount) ){ echo "No new token generated...\n"; exit(); } > $guestAccountRaw = json_decode($guestAccount, true); > > if ( $guestAccountRaw['attribution_event'] == "signup"){ > // Add the timestamp > $guestAccountRaw['created'] = date("U"); > // Add a comma after the new guest account > $guestAccountModified = json_encode($guestAccountRaw) . ","; > echo $guestAccountModified; > // Remove the first and last square brackets > $currentGuestAccounts = shell_exec("cat $file_guestAccounts | sed 's/,]//g' | sed 's/\[//g'"); > file_put_contents($file_guestAccounts, $guestAccountModified . $currentGuestAccounts); > // Re-add square brackets, ensuring the last account does not have a comma preceeding the square bracket > shell_exec("tr '\n' ' ' < $file_guestAccounts; sed -i -e 's/^{/[{/g' -e 's/},$/}]/g' $file_guestAccounts"); > } > ?> > ``` Very cool, but how to add/integrate this php to my guest_account instance?
RunlevelConsulting commented 2023-11-16 14:05:59 -05:00 (Migrated from github.com)

Very cool, but how to add/integrate this php to my guest_account instance?

Not sure I understand your question, you don't integrate it into the guest account instance. It runs on the host (usually with Nitter running in a Docker container).

Presumably you have PHP running on your host, so you'd just put that code into a script and run something like php myscript.php. The script writes to /tmp/guest_accounts.json but that can be changed to anything.

When you launch the Nitter Docker instance using the guest_accounts branch, you should have the guest_accounts.json file mounted as a volume which the instance then uses to validate API calls.

If I'm misunderstanding, please elaborate on your query a little more so I can help.

> Very cool, but how to add/integrate this php to my guest_account instance? Not sure I understand your question, you don't integrate it into the guest account instance. It runs on the host (usually with Nitter running in a Docker container). Presumably you have PHP running on your host, so you'd just put that code into a script and run something like `php myscript.php`. The script writes to `/tmp/guest_accounts.json` but that can be changed to anything. When you launch the Nitter Docker instance using the guest_accounts branch, you should have the guest_accounts.json file mounted as a volume which the instance then uses to validate API calls. If I'm misunderstanding, please elaborate on your query a little more so I can help.
pantan-cymk commented 2023-11-16 14:55:31 -05:00 (Migrated from github.com)

@RunlevelConsulting Thanks. Thanks to your help, I was able to recover the nitter I use on my home server.

@RunlevelConsulting Thanks. Thanks to your help, I was able to recover the nitter I use on my home server.
mjholub commented 2023-12-03 18:53:59 -05:00 (Migrated from github.com)

I have an idea for how to save Nitter and actually make it pretty much indestructible. And not only Nitter. Any kind of privacy-friendly proxy. And on the top of that, reduce the burden of running an instance and shortage of instances for some proxies, like ruraldictionary for example.

It draws inspiration from onion routing/P2P. In it's simplest form, people would launch a localhost server and receive requests from other nodes. Circuits will regenerate with each request for better privacy.

Let's say that this software will register a route for any supported backend and listens on port 9001. The backend itself doesn't need to run on our machine, the goal is to maximize the use and usability of such proxies as nitter, but some sort of algorithm would probably be in place to ensure both sufficient anonymity and latency and discourage leeching when someone would only run the most lightweight and least data intensive backends.

So we go to localhost:9001/nitter and we see what we'd normally see on our local Nitter instance. But our instance has not directly connected to twitter. Instead something like routing our nitter instance via torsocks happened but without the whole pain of being tossed into one bag with abusers of the Tor network, rendering our instance unusable. Instead, our request was passed through a couple nodes which might not even need to run nitter unless they're the exit node.

The software would work a bit like DHT, let's say each request includes two headers:
provides - list of services accessible at our node
wants - what service a node must be running to send the response to our request

I have an idea for how to save Nitter and actually make it pretty much indestructible. And not only Nitter. Any kind of privacy-friendly proxy. And on the top of that, reduce the burden of running an instance and shortage of instances for some proxies, like ruraldictionary for example. It draws inspiration from onion routing/P2P. In it's simplest form, people would launch a localhost server and receive requests from other nodes. Circuits will regenerate with each request for better privacy. Let's say that this software will register a route for any supported backend and listens on port 9001. The backend itself doesn't need to run on our machine, the goal is to maximize the use and usability of such proxies as nitter, but some sort of algorithm would probably be in place to ensure both sufficient anonymity and latency and discourage leeching when someone would only run the most lightweight and least data intensive backends. So we go to localhost:9001/nitter and we see what we'd normally see on our local Nitter instance. But our instance has not directly connected to twitter. Instead something like routing our nitter instance via torsocks happened but without the whole pain of being tossed into one bag with abusers of the Tor network, rendering our instance unusable. Instead, our request was passed through a couple nodes which might not even need to run nitter unless they're the exit node. The software would work a bit like DHT, let's say each request includes two headers: `provides` - list of services accessible at our node `wants` - what service a node must be running to send the response to our request
koitsu commented 2023-12-09 18:48:58 -05:00 (Migrated from github.com)

It draws inspiration from onion routing/P2P. In it's simplest form, people would launch a localhost server and receive requests from other nodes. Circuits will regenerate with each request for better privacy.

Great idea! I can't wait for users to use my bandwidth, and have my IP in Twitter/X's logs in case they end up accessing content that X/Twitter (or the US government, since they've subpoena'd information from the company in the past) deems sensitive, putting me at risk (with either my ISP or law enforcement). Sounds great!

> It draws inspiration from onion routing/P2P. In it's simplest form, people would launch a localhost server and receive requests from other nodes. Circuits will regenerate with each request for better privacy. Great idea! I can't wait for users to use my bandwidth, and have my IP in Twitter/X's logs in case they end up accessing content that X/Twitter (or the US government, since they've subpoena'd information from the company in the past) deems sensitive, putting me at risk (with either my ISP or law enforcement). [Sounds great!](https://edri.org/our-work/edrigramnumber5-18tor-germany/)
insanity54 commented 2023-12-09 18:52:54 -05:00 (Migrated from github.com)

@154pinkchairs cool idea but this is off topic for this issue thread.
@koitsu The sarcastic comment is not welcome here.

@154pinkchairs cool idea but this is off topic for this issue thread. @koitsu The sarcastic comment is not welcome here.
mjholub commented 2023-12-10 20:06:04 -05:00 (Migrated from github.com)

@koitsu you can always rent a VPS. There are a couple providers that allow anonymous payments.

@koitsu you can always rent a VPS. There are a couple providers that allow anonymous payments.
satonotdead commented 2023-12-11 09:39:09 -05:00 (Migrated from github.com)

There are some (not)PHP script around there? We are limited to modern stack.

There are some (not)PHP script around there? We are limited to *modern* stack.
zedeus commented 2023-12-11 09:43:10 -05:00 (Migrated from github.com)
@satoshinotdead see the wiki page: https://github.com/zedeus/nitter/wiki/Guest-Account-Branch-Deployment
bepvte commented 2023-12-14 17:06:15 -05:00 (Migrated from github.com)

For anyone else coming here with new issues with acquiring guest accounts with their previously successful scripts (like this one) make sure to update the version of your twitter user-agent to 10.10.0 like in example script in the linked wiki page above.

For anyone else coming here with new issues with acquiring guest accounts with their previously successful scripts (like [this one](https://github.com/zedeus/nitter/issues/983#issuecomment-1715487727)) make sure to update the version of your twitter user-agent to `10.10.0` like in example script in the linked wiki page above.
jack555444 commented 2023-12-14 17:17:38 -05:00 (Migrated from github.com)

Is that both "User-Agent" and "X-Twitter-Client-Version"?

Can you elaborate on why this needs to be changed? I managed to grab number of tokens a few hours ago with my existing script.

Is that both "User-Agent" and "X-Twitter-Client-Version"? Can you elaborate on why this needs to be changed? I managed to grab number of tokens a few hours ago with my existing script.
bepvte commented 2023-12-14 19:09:13 -05:00 (Migrated from github.com)

In my case I couldn't get any tokens with any of my IPs until I changed both to 10.10.0. If it still works then theres no reason to change it.

In my case I couldn't get any tokens with any of my IPs until I changed both to 10.10.0. If it still works then theres no reason to change it.
Apachez- commented 2023-12-21 01:07:29 -05:00 (Migrated from github.com)

Looks like something broke again last night...

tweets, with_replies and media all returns 0 messages currently :-(

Example:

https://nitter.net/knytanders

https://nitter.net/knytanders/with_replies

https://nitter.net/knytanders/media

Edit:

Related: https://github.com/zedeus/nitter/issues/1136

Also seems like twitter itself is actually down so not an Nitter issue for now.

Edit2:

https://downforeveryoneorjustme.com/twitter

https://downdetector.com/status/twitter/

Looks like something broke again last night... tweets, with_replies and media all returns 0 messages currently :-( Example: https://nitter.net/knytanders https://nitter.net/knytanders/with_replies https://nitter.net/knytanders/media Edit: Related: https://github.com/zedeus/nitter/issues/1136 Also seems like twitter itself is actually down so not an Nitter issue for now. Edit2: https://downforeveryoneorjustme.com/twitter https://downdetector.com/status/twitter/
zedeus commented 2023-12-21 01:09:36 -05:00 (Migrated from github.com)

Twitter is down, nothing broke.

Twitter is down, nothing broke.
Apachez- commented 2023-12-21 01:13:19 -05:00 (Migrated from github.com)

Twitter is down, nothing broke.

Could perhaps nitter inform about that somehow other than just "No items found"?

Like expand that message into "No items found (no reply from servers)" or such to give a hint if the user really do have 0 messages or if there is some other malfunction going on leading to 0 messages are being displayed?

Because from experience past year or so the "No iteams found" means that twitter have changed something in their API again to break Nitter (and others).

> Twitter is down, nothing broke. Could perhaps nitter inform about that somehow other than just "No items found"? Like expand that message into "No items found (no reply from servers)" or such to give a hint if the user really do have 0 messages or if there is some other malfunction going on leading to 0 messages are being displayed? Because from experience past year or so the "No iteams found" means that twitter have changed something in their API again to break Nitter (and others).
lukefromdc commented 2023-12-21 01:31:10 -05:00 (Migrated from github.com)

I just found experimental direct attempts to reach Twitter hitting their login wall for every user tested (just a few).
I do not have (or want) an account so no idea if the site is responsive behind that

I just found experimental direct attempts to reach Twitter hitting their login wall for every user tested (just a few). I do not have (or want) an account so no idea if the site is responsive behind that
Apachez- commented 2023-12-21 02:50:44 -05:00 (Migrated from github.com)

Seems to currently working again for the accounts I have tested, also the multiaccount listing seems to be working.

That is:

https://nitter.net/user1,user2,user3/with_replies

So case closed (for now ;-)

Seems to currently working again for the accounts I have tested, also the multiaccount listing seems to be working. That is: https://nitter.net/user1,user2,user3/with_replies So case closed (for now ;-)
Loweack commented 2024-01-02 06:39:36 -05:00 (Migrated from github.com)

Here's a PHP version (yes I know, boo hiss) based off a Python script that was posted a while ago. It's not the cleanest but it does the job.

It does the following:

  • Generates new guest accounts
  • Adds a 'created' key to each guest account created with the current time
  • Removes any guest accounts older than 30 days

This can be run automatically, and in theory, keep adding new accounts to your guest_accounts.json file. You just need to restart your Nitter instance every now and then to load in those new accounts.

<?php

// Create file
$file_guestAccounts = "/tmp/guest_accounts.json";
shell_exec("touch $file_guestAccounts;");


// Remove old Guest Accounts
$currentList = json_decode(shell_exec("cat $file_guestAccounts"), true);
$unset = 0;
if ( isset($currentList) ){
  foreach ( $currentList as $k => $gA){
    if (date("U") - $gA['created'] > 2592000){
      unset($currentList[$k]);
      $unset++;
    }
  }
  echo "Unset $unset accounts...\n";
  file_put_contents($file_guestAccounts, json_encode(array_values($currentList)));
}


// Generate New Guest Account
$guestToken = shell_exec("curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json \
                               -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
                               | jq -r '.guest_token'");

$flowToken = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' \
                              -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
                              -H 'Content-Type: application/json' \
                              -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \
                              -H 'X-Twitter-API-Version: 5' \
                              -H 'X-Twitter-Client: TwitterAndroid' \
                              -H 'X-Twitter-Client-Version: 9.95.0-release.0' \
                              -H 'OS-Version: 28' \
                              -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \
                              -H 'X-Twitter-Active-User: yes' \
                              -H 'X-Guest-Token: " . trim($guestToken) . "' \
                              -d '{\"flow_token\":null,\"input_flow_data\":{\"country_code\":null,\"flow_context\":{\"start_location\":{\"location\":\"splash_screen\"}},\"requested_variant\":null,\"target_user_id\":0},\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \
                              | jq -r .flow_token");

$guestAccount = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \
                                 -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \
                                 -H 'Content-Type: application/json' \
                                 -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \
                                 -H 'X-Twitter-API-Version 5' \
                                 -H 'X-Twitter-Client: TwitterAndroid' \
                                 -H 'X-Twitter-Client-Version: 9.95.0-release.0' \
                                 -H 'OS-Version: 28' \
                                 -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \
                                 -H 'X-Twitter-Active-User: yes' \
                                 -H 'X-Guest-Token: " . trim($guestToken) . "' \
                                 -d '{\"flow_token\":\"" . trim($flowToken) . "\",\"subtask_inputs\":[{\"open_link\":{\"link\":\"next_link\"},\"subtask_id\":\"NextTaskOpenLink\"}],\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \
                                 | jq -r '.subtasks[0]|if(.open_account) then .open_account else empty end'");


// If generation successful, add guest account to file
if ( !isset($guestAccount) ){ echo "No new token generated...\n"; exit(); }
$guestAccountRaw = json_decode($guestAccount, true);

if ( $guestAccountRaw['attribution_event'] == "signup"){
  // Add the timestamp
  $guestAccountRaw['created'] = date("U");
  // Add a comma after the new guest account
  $guestAccountModified = json_encode($guestAccountRaw) . ",";
  echo $guestAccountModified;
  // Remove the first and last square brackets
  $currentGuestAccounts = shell_exec("cat $file_guestAccounts | sed 's/,]//g' | sed 's/\[//g'");
  file_put_contents($file_guestAccounts, $guestAccountModified . $currentGuestAccounts);
  // Re-add square brackets, ensuring the last account does not have a comma preceeding the square bracket
  shell_exec("tr '\n' ' ' < $file_guestAccounts; sed -i -e 's/^{/[{/g' -e 's/},$/}]/g' $file_guestAccounts");
}
?>

Thank you for your PHP script. But I got a little error. With the square brackets, the file seems to be unreadable by Nitter. I got this error :

jsony.nim(51)            parseHook
Error: unhandled exception: Expected { but got [ instead. At offset: 0 [JsonError]

As soon as I remove the square brackets, all is working properly.

> Here's a PHP version (yes I know, boo hiss) based off a Python script that was posted a while ago. It's not the cleanest but it does the job. > > It does the following: > > * Generates new guest accounts > * Adds a 'created' key to each guest account created with the current time > * Removes any guest accounts older than 30 days > > This can be run automatically, and in theory, keep adding new accounts to your guest_accounts.json file. You just need to restart your Nitter instance every now and then to load in those new accounts. > > ``` > <?php > > // Create file > $file_guestAccounts = "/tmp/guest_accounts.json"; > shell_exec("touch $file_guestAccounts;"); > > > // Remove old Guest Accounts > $currentList = json_decode(shell_exec("cat $file_guestAccounts"), true); > $unset = 0; > if ( isset($currentList) ){ > foreach ( $currentList as $k => $gA){ > if (date("U") - $gA['created'] > 2592000){ > unset($currentList[$k]); > $unset++; > } > } > echo "Unset $unset accounts...\n"; > file_put_contents($file_guestAccounts, json_encode(array_values($currentList))); > } > > > // Generate New Guest Account > $guestToken = shell_exec("curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json \ > -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ > | jq -r '.guest_token'"); > > $flowToken = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome&api_version=1&known_device_token=&sim_country_code=us' \ > -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ > -H 'Content-Type: application/json' \ > -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \ > -H 'X-Twitter-API-Version: 5' \ > -H 'X-Twitter-Client: TwitterAndroid' \ > -H 'X-Twitter-Client-Version: 9.95.0-release.0' \ > -H 'OS-Version: 28' \ > -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \ > -H 'X-Twitter-Active-User: yes' \ > -H 'X-Guest-Token: " . trim($guestToken) . "' \ > -d '{\"flow_token\":null,\"input_flow_data\":{\"country_code\":null,\"flow_context\":{\"start_location\":{\"location\":\"splash_screen\"}},\"requested_variant\":null,\"target_user_id\":0},\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \ > | jq -r .flow_token"); > > $guestAccount = shell_exec("curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \ > -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \ > -H 'Content-Type: application/json' \ > -H 'User-Agent: TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)' \ > -H 'X-Twitter-API-Version 5' \ > -H 'X-Twitter-Client: TwitterAndroid' \ > -H 'X-Twitter-Client-Version: 9.95.0-release.0' \ > -H 'OS-Version: 28' \ > -H 'System-User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)' \ > -H 'X-Twitter-Active-User: yes' \ > -H 'X-Guest-Token: " . trim($guestToken) . "' \ > -d '{\"flow_token\":\"" . trim($flowToken) . "\",\"subtask_inputs\":[{\"open_link\":{\"link\":\"next_link\"},\"subtask_id\":\"NextTaskOpenLink\"}],\"subtask_versions\":{\"generic_urt\":3,\"standard\":1,\"open_home_timeline\":1,\"app_locale_update\":1,\"enter_date\":1,\"email_verification\":3,\"enter_password\":5,\"enter_text\":5,\"one_tap\":2,\"cta\":7,\"single_sign_on\":1,\"fetch_persisted_data\":1,\"enter_username\":3,\"web_modal\":2,\"fetch_temporary_password\":1,\"menu_dialog\":1,\"sign_up_review\":5,\"interest_picker\":4,\"user_recommendations_urt\":3,\"in_app_notification\":1,\"sign_up\":2,\"typeahead_search\":1,\"user_recommendations_list\":4,\"cta_inline\":1,\"contacts_live_sync_permission_prompt\":3,\"choice_selection\":5,\"js_instrumentation\":1,\"alert_dialog_suppress_client_events\":1,\"privacy_options\":1,\"topics_selector\":1,\"wait_spinner\":3,\"tweet_selection_urt\":1,\"end_flow\":1,\"settings_list\":7,\"open_external_link\":1,\"phone_verification\":5,\"security_key\":3,\"select_banner\":2,\"upload_media\":1,\"web\":2,\"alert_dialog\":1,\"open_account\":2,\"action_list\":2,\"enter_phone\":2,\"open_link\":1,\"show_code\":1,\"update_users\":1,\"check_logged_in_account\":1,\"enter_email\":2,\"select_avatar\":4,\"location_permission_prompt\":2,\"notifications_permission_prompt\":4}}' \ > | jq -r '.subtasks[0]|if(.open_account) then .open_account else empty end'"); > > > // If generation successful, add guest account to file > if ( !isset($guestAccount) ){ echo "No new token generated...\n"; exit(); } > $guestAccountRaw = json_decode($guestAccount, true); > > if ( $guestAccountRaw['attribution_event'] == "signup"){ > // Add the timestamp > $guestAccountRaw['created'] = date("U"); > // Add a comma after the new guest account > $guestAccountModified = json_encode($guestAccountRaw) . ","; > echo $guestAccountModified; > // Remove the first and last square brackets > $currentGuestAccounts = shell_exec("cat $file_guestAccounts | sed 's/,]//g' | sed 's/\[//g'"); > file_put_contents($file_guestAccounts, $guestAccountModified . $currentGuestAccounts); > // Re-add square brackets, ensuring the last account does not have a comma preceeding the square bracket > shell_exec("tr '\n' ' ' < $file_guestAccounts; sed -i -e 's/^{/[{/g' -e 's/},$/}]/g' $file_guestAccounts"); > } > ?> > ``` Thank you for your PHP script. But I got a little error. With the square brackets, the file seems to be unreadable by Nitter. I got this error : ``` jsony.nim(51) parseHook Error: unhandled exception: Expected { but got [ instead. At offset: 0 [JsonError] ``` As soon as I remove the square brackets, all is working properly.
RunlevelConsulting commented 2024-01-02 07:53:29 -05:00 (Migrated from github.com)

Thank you for your PHP script. But I got a little error. With the square brackets, the file seems to be unreadable by Nitter. I got this error :

jsony.nim(51)            parseHook
Error: unhandled exception: Expected { but got [ instead. At offset: 0 [JsonError]

As soon as I remove the square brackets, all is working properly.

Heya, I had that error too, it was from when I manually stopped the script while it was still running.

But yes, the only real error that can occur in the script is a JSON formatting error, so my advice to anyone suffering the same issue - copy and paste the contents of your guest_accounts.json file into a JSON parser, see where things went wonky (probably towards th end of the file), fix it and you should be good to go.

> Thank you for your PHP script. But I got a little error. With the square brackets, the file seems to be unreadable by Nitter. I got this error : > > ``` > jsony.nim(51) parseHook > Error: unhandled exception: Expected { but got [ instead. At offset: 0 [JsonError] > ``` > > As soon as I remove the square brackets, all is working properly. Heya, I had that error too, it was from when I manually stopped the script while it was still running. But yes, the only real error that can occur in the script is a JSON formatting error, so my advice to anyone suffering the same issue - copy and paste the contents of your guest_accounts.json file into a JSON parser, see where things went wonky (probably towards th end of the file), fix it and you should be good to go.
gigirassy commented 2024-01-13 17:18:22 -05:00 (Migrated from github.com)

looks like its down again :/
Hmm. We’re having trouble finding that site. We can’t connect to the server at nitter.net.

looks like its down again :/ ![Hmm. We’re having trouble finding that site. We can’t connect to the server at nitter.net.](https://github.com/zedeus/nitter/assets/145225213/a42dba8c-60cc-4d6f-961f-6550672ebc14)
permanant-timer commented 2024-01-13 19:10:02 -05:00 (Migrated from github.com)

Nitter seems to be down across multiple instances. I dunno why. https://nitter.cz/ is working however, and additionally, the Nitter Instance Uptime page shows that there are a bunch of other working instances.
Screenshot 2024-01-13 at 4 06 07 PM

Nitter seems to be down across multiple instances. I dunno why. https://nitter.cz/ is working however, and additionally, the Nitter Instance Uptime page shows that there are a bunch of other working instances. <img width="1040" alt="Screenshot 2024-01-13 at 4 06 07 PM" src="https://github.com/zedeus/nitter/assets/154493970/909a08c8-f163-4b90-9c64-239d1b4c89d2">
zedeus commented 2024-01-13 20:10:09 -05:00 (Migrated from github.com)

The domain has been suspended. See https://github.com/zedeus/nitter/issues/1150

The domain has been suspended. See https://github.com/zedeus/nitter/issues/1150
lukefromdc commented 2024-01-13 21:21:54 -05:00 (Migrated from github.com)

If that's due to a complaint by Twitter it might be necessary to create some Torified instances that only talk to Twitter via tor. Slow and Tor nodes can be blocked too but more hassle for Twitter given blocking all Tor nodes would cut off many of their users in countries that ban and block Twitter.

If that's due to a complaint by Twitter it might be necessary to create some Torified instances that only talk to Twitter via tor. Slow and Tor nodes can be blocked too but more hassle for Twitter given blocking all Tor nodes would cut off many of their users in countries that ban and block Twitter.
lukefromdc commented 2024-01-13 22:12:26 -05:00 (Migrated from github.com)

So many people have dumped Twitter and closed their accounts that I am now unable to communicate with some activist groups that migrated to Instagram. I have blocked Meta for over a decade and won't change that for anything. Twitter may end up on that list too the way they are going. If not accessed by 3ed party backends, then no accessed at all and treated as permanently down.

So many people have dumped Twitter and closed their accounts that I am now unable to communicate with some activist groups that migrated to Instagram. I have blocked Meta for over a decade and won't change that for anything. Twitter may end up on that list too the way they are going. If not accessed by 3ed party backends, then no accessed at all and treated as permanently down.
lukefromdc commented 2024-01-14 01:20:44 -05:00 (Migrated from github.com)

Also, Musk could choose not to "operate in" such countries which for this purpose means not having an office in, having a server in, or selling ads though a local subsidiary inside the offending country. In some cases (such as China or the US) it also means not travelling to the offending country or in extreme cases its allies. Then you have impunity and can tell the offending regime to address all complaints to /dev/null.

Also, Musk could choose not to "operate in" such countries which for this purpose means not having an office in, having a server in, or selling ads though a local subsidiary inside the offending country. In some cases (such as China or the US) it also means not travelling to the offending country or in extreme cases its allies. Then you have impunity and can tell the offending regime to address all complaints to /dev/null.
magamadov6925 commented 2024-01-14 13:06:12 -05:00 (Migrated from github.com)

I've been unable to play most videos for the last week. The issue seems to be resolved for now. Anyone know what happened?

I've been unable to play most videos for the last week. The issue seems to be resolved for now. Anyone know what happened?
zedeus commented 2024-01-14 13:31:45 -05:00 (Migrated from github.com)

@magamadov6925 #1147

@magamadov6925 #1147
ta1kun commented 2024-01-18 06:00:15 -05:00 (Migrated from github.com)

Screenshot

i have no idea how to solve it. i checked all this post but cant find solution. i installed last verion with docker compose

![Screenshot](https://github.com/zedeus/nitter/assets/22143723/ef6457e2-ecd6-4139-9d13-5f3c44149d55) i have no idea how to solve it. i checked all this post but cant find solution. i installed last verion with docker compose
frepke commented 2024-01-18 07:42:45 -05:00 (Migrated from github.com)

Screenshot

i have no idea how to solve it. i checked all this post but cant find solution. i installed last verion with docker compose

You have to use the guest_accounts Branche.

> ![Screenshot](https://github.com/zedeus/nitter/assets/22143723/ef6457e2-ecd6-4139-9d13-5f3c44149d55) > > > > > > i have no idea how to solve it. i checked all this post but cant find solution. i installed last verion with docker compose You have to use the guest_accounts Branche.
Apachez- commented 2024-01-25 05:09:58 -05:00 (Migrated from github.com)

And here we go again :-(

Instance has been rate limited.
Use [another instance](https://github.com/zedeus/nitter/wiki/Instances) or try again later.

Started about an hour ago where a refresh I assume ended up at another loadbalanced node (that worked) but now all requests (even with several minutes between each request) ends up with "instance has been rate limited".

And here we go again :-( ``` Instance has been rate limited. Use [another instance](https://github.com/zedeus/nitter/wiki/Instances) or try again later. ``` Started about an hour ago where a refresh I assume ended up at another loadbalanced node (that worked) but now all requests (even with several minutes between each request) ends up with "instance has been rate limited".
soopyc commented 2024-01-25 05:37:23 -05:00 (Migrated from github.com)

On 1/25/24 18:10, Apachez wrote:

And here we go again :-(...snip...

hmm, everything works fine with my instance. maybe try another instance
if what you're using doesn't work?

EDIT: disregard that, nothing works

On 1/25/24 18:10, Apachez wrote: > And here we go again :-(...snip... hmm, everything works fine with my instance. maybe try another instance if what you're using doesn't work? EDIT: disregard that, nothing works
notherenorthere commented 2024-01-25 11:03:54 -05:00 (Migrated from github.com)

And here we go again :-(

Instance has been rate limited.
Use [another instance](https://github.com/zedeus/nitter/wiki/Instances) or try again later.

Started about an hour ago where a refresh I assume ended up at another loadbalanced node (that worked) but now all requests (even with several minutes between each request) ends up with "instance has been rate limited".

still happening while doing a search or clicking on a post @ least on nitter.net atm. some other instances do work though

> And here we go again :-( > > ``` > Instance has been rate limited. > Use [another instance](https://github.com/zedeus/nitter/wiki/Instances) or try again later. > ``` > > Started about an hour ago where a refresh I assume ended up at another loadbalanced node (that worked) but now all requests (even with several minutes between each request) ends up with "instance has been rate limited". still happening while doing a search or clicking on a post @ least on nitter.net atm. some other instances do work though
ojaha065 commented 2024-01-25 11:16:12 -05:00 (Migrated from github.com)

Starting today I'm no longer able to generate guest accounts using the bash script posted in the Wiki. I've tried multiple IP addresses that have not been used to generate an account in the last 24 hrs. Anyone else having the same issue? Might be related to instances being rate-limited.

Starting today I'm no longer able to generate guest accounts using the bash script [posted in the Wiki](https://github.com/zedeus/nitter/wiki/Guest-Account-Branch-Deployment#guest-accounts). I've tried multiple IP addresses that have not been used to generate an account in the last 24 hrs. Anyone else having the same issue? Might be related to instances being rate-limited.
ImTheDeveloper commented 2024-01-25 11:17:28 -05:00 (Migrated from github.com)

Yep same issue here
On 25 Jan 2024, 16:16 +0000, Jani Haiko @.***>, wrote:

Starting today I'm no longer able to generate quest accounts using the bash script posted in the Wiki. I've tried multiple IP addresses that have not been used to generate an account in the last 24 hrs. Anyone else having the same issue? Might be related to instances being rate-limited.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: @.***>

Yep same issue here On 25 Jan 2024, 16:16 +0000, Jani Haiko ***@***.***>, wrote: > Starting today I'm no longer able to generate quest accounts using the bash script posted in the Wiki. I've tried multiple IP addresses that have not been used to generate an account in the last 24 hrs. Anyone else having the same issue? Might be related to instances being rate-limited. > — > Reply to this email directly, view it on GitHub, or unsubscribe. > You are receiving this because you are subscribed to this thread.Message ID: ***@***.***>
MaxosHadj commented 2024-01-25 11:32:37 -05:00 (Migrated from github.com)

Starting today I'm no longer able to generate guest accounts using the bash script posted in the Wiki. I've tried multiple IP addresses that have not been used to generate an account in the last 24 hrs. Anyone else having the same issue? Might be related to instances being rate-limited.

Same here

> Starting today I'm no longer able to generate guest accounts using the bash script [posted in the Wiki](https://github.com/zedeus/nitter/wiki/Guest-Account-Branch-Deployment#guest-accounts). I've tried multiple IP addresses that have not been used to generate an account in the last 24 hrs. Anyone else having the same issue? Might be related to instances being rate-limited. Same here
RunlevelConsulting commented 2024-01-25 11:59:55 -05:00 (Migrated from github.com)

Confirming same issue. I'm going through a proxy and it's a different residential IP each request.

Confirming same issue. I'm going through a proxy and it's a different residential IP each request.
dawnerd commented 2024-01-25 14:10:47 -05:00 (Migrated from github.com)

Looks like they removed the OpenAccount task which contained the oauth tokens

Looks like they removed the OpenAccount task which contained the oauth tokens
stemy2 commented 2024-01-25 14:18:02 -05:00 (Migrated from github.com)

Currently, all instances are showing the rate limited error, and i tested a dozen of them. Could it be a change from the X/Twitter side ?

Currently, all instances are showing the rate limited error, and i tested a dozen of them. Could it be a change from the X/Twitter side ?
cmj commented 2024-01-25 14:29:54 -05:00 (Migrated from github.com)

Yeah the only subtask now is "Signup" (in various forms). Guest accounts have been fully removed. Confirmed by installing the Twitter apk. Old accounts seem to still work on my instances, so it might just be allowing them access until they expire.

Current json output

Expected ouptut

Yeah the only subtask now is "Signup" (in various forms). Guest accounts have been fully removed. Confirmed by installing the Twitter apk. Old accounts seem to still work on my instances, so it might just be allowing them access until they expire. Current [json output](https://gist.githubusercontent.com/cmj/b58664643c8b3318cf754be6a7d16452/raw/213984632e2bb0a61a3358aaf1870b34b8565081/task.json) [Expected ouptut](https://gist.github.com/cmj/90beb37279b643e8854bdb6175cae1ab#file-guest_account-json-L17:L18)
Apachez- commented 2024-01-25 16:06:38 -05:00 (Migrated from github.com)

Currently, all instances are showing the rate limited error, and i tested a dozen of them. Could it be a change from the X/Twitter side ?

Same here. Earlier today it was just nitter.net but I guess some codechange that were commited today is behind this so when the mirrors caught up on updates Im getting the same limited error from the others now.

In my case I use /with_replies with infinite scrolling in case that have some connection to this behaviour?

I also use one multiaccount tab (https://nitter.net/user1,user2,user3/with_replies) and 5 singleaccount tabs. I try to have a few seconds between the reloads of each tab and usually dont reload more than a few times each hour.

> Currently, all instances are showing the rate limited error, and i tested a dozen of them. Could it be a change from the X/Twitter side ? Same here. Earlier today it was just nitter.net but I guess some codechange that were commited today is behind this so when the mirrors caught up on updates Im getting the same limited error from the others now. In my case I use /with_replies with infinite scrolling in case that have some connection to this behaviour? I also use one multiaccount tab (https://nitter.net/user1,user2,user3/with_replies) and 5 singleaccount tabs. I try to have a few seconds between the reloads of each tab and usually dont reload more than a few times each hour.
mshadev commented 2024-01-25 16:22:55 -05:00 (Migrated from github.com)

Same. They removed OpenAccount prop

Same. They removed OpenAccount prop
JonasBirk commented 2024-01-25 17:21:36 -05:00 (Migrated from github.com)

here we go again ...

here we go again ...
freedit-dev commented 2024-01-25 20:13:08 -05:00 (Migrated from github.com)

My instance https://nitter.freedit.eu/ works well. And it's behind cloudflare. What's important, cloudflare reports three waves of ddos recently. Maybe other instance suffered ddos too.

My instance https://nitter.freedit.eu/ works well. And it's behind cloudflare. What's important, cloudflare reports three waves of ddos recently. Maybe other instance suffered ddos too.
lukefromdc commented 2024-01-25 23:49:44 -05:00 (Migrated from github.com)

A temporary rate limit could cause a poorly written DDOS script to conclude the site is down and quit.

A temporary rate limit could cause a poorly written DDOS script to conclude the site is down and quit.
freedit-dev commented 2024-01-26 00:27:48 -05:00 (Migrated from github.com)

In fact, almost all instances are affected. https://status.d420.de/

In fact, almost all instances are affected. https://status.d420.de/
stemy2 commented 2024-01-26 01:04:56 -05:00 (Migrated from github.com)

It's working again.

It's working again.
ImTheDeveloper commented 2024-01-26 01:24:34 -05:00 (Migrated from github.com)

It's working again.

Some instances will work dependent on if they hit a guest token set that is still valid. Once the 30 days is up for those tokens the instance will be broken again. The main issue is the token generation is dead as per https://github.com/zedeus/nitter/issues/983#issuecomment-1910848654 so without a method to generate such tokens we are stuck.

> It's working again. Some instances will work dependent on if they hit a guest token set that is still valid. Once the 30 days is up for those tokens the instance will be broken again. The main issue is the token generation is dead as per https://github.com/zedeus/nitter/issues/983#issuecomment-1910848654 so without a method to generate such tokens we are stuck.
Apachez- commented 2024-01-26 02:30:53 -05:00 (Migrated from github.com)

It seems like https://nitter.net/username/with_replies and https://nitter.net/username/status are broken while https://nitter.net/username works without issues for now (at least it loads without error and seems to have up2date content).

Multiuser seems to be broken aswell (https://nitter.net/user1,user2,user3) with and without /with_replies and /status.

It seems like https://nitter.net/username/with_replies and https://nitter.net/username/status are broken while https://nitter.net/username works without issues for now (at least it loads without error and seems to have up2date content). Multiuser seems to be broken aswell (https://nitter.net/user1,user2,user3) with and without /with_replies and /status.
forwindie commented 2024-01-26 04:46:24 -05:00 (Migrated from github.com)

Yeah the only subtask now is "Signup" (in various forms). Guest accounts have been fully removed. Confirmed by installing the Twitter apk. Old accounts seem to still work on my instances, so it might just be allowing them access until they expire.

Current json output

Expected ouptut

If it is no longer possible to create guest accounts, does this mean that there is now only one way - using regular accounts?

> Yeah the only subtask now is "Signup" (in various forms). Guest accounts have been fully removed. Confirmed by installing the Twitter apk. Old accounts seem to still work on my instances, so it might just be allowing them access until they expire. > > Current [json output](https://gist.githubusercontent.com/cmj/b58664643c8b3318cf754be6a7d16452/raw/213984632e2bb0a61a3358aaf1870b34b8565081/task.json) > > [Expected ouptut](https://gist.github.com/cmj/90beb37279b643e8854bdb6175cae1ab#file-guest_account-json-L17:L18) If it is no longer possible to create guest accounts, does this mean that there is now only one way - using regular accounts?
nukeop commented 2024-01-26 04:52:59 -05:00 (Migrated from github.com)

Did they disable the ability to browse tweets anonymously altogether?

Did they disable the ability to browse tweets anonymously altogether?
Loweack commented 2024-01-26 09:38:06 -05:00 (Migrated from github.com)

Yeah the only subtask now is "Signup" (in various forms). Guest accounts have been fully removed. Confirmed by installing the Twitter apk. Old accounts seem to still work on my instances, so it might just be allowing them access until they expire.
Current json output
Expected ouptut

If it is no longer possible to create guest accounts, does this mean that there is now only one way - using regular accounts?

Is there a tutorial on how to do so?

> > Yeah the only subtask now is "Signup" (in various forms). Guest accounts have been fully removed. Confirmed by installing the Twitter apk. Old accounts seem to still work on my instances, so it might just be allowing them access until they expire. > > Current [json output](https://gist.githubusercontent.com/cmj/b58664643c8b3318cf754be6a7d16452/raw/213984632e2bb0a61a3358aaf1870b34b8565081/task.json) > > [Expected ouptut](https://gist.github.com/cmj/90beb37279b643e8854bdb6175cae1ab#file-guest_account-json-L17:L18) > > If it is no longer possible to create guest accounts, does this mean that there is now only one way - using regular accounts? Is there a tutorial on how to do so?
ImTheDeveloper commented 2024-01-26 09:44:24 -05:00 (Migrated from github.com)

Yeah the only subtask now is "Signup" (in various forms). Guest accounts have been fully removed. Confirmed by installing the Twitter apk. Old accounts seem to still work on my instances, so it might just be allowing them access until they expire.
Current json output
Expected ouptut

If it is no longer possible to create guest accounts, does this mean that there is now only one way - using regular accounts?

Correct

> > Yeah the only subtask now is "Signup" (in various forms). Guest accounts have been fully removed. Confirmed by installing the Twitter apk. Old accounts seem to still work on my instances, so it might just be allowing them access until they expire. > > Current [json output](https://gist.githubusercontent.com/cmj/b58664643c8b3318cf754be6a7d16452/raw/213984632e2bb0a61a3358aaf1870b34b8565081/task.json) > > [Expected ouptut](https://gist.github.com/cmj/90beb37279b643e8854bdb6175cae1ab#file-guest_account-json-L17:L18) > > If it is no longer possible to create guest accounts, does this mean that there is now only one way - using regular accounts? Correct
drpepper66 commented 2024-01-27 01:02:35 -05:00 (Migrated from github.com)

received a DDoS from Hetzner and AWS nodes last friday, and around 2 days ago token fetching started to break for twitterminator as well. I suspect that there was a gradual rollout of the guest-accounts blockade, and it made scrapers more desperate and move to public nitter instances :(

I have received mixed reports of existing guest accounts being invalidated as well vs not, but it's not clear to me whether that was an artifact of the DDoS causing a lot of rate limits or a genuine move by twitter.

twitter apk didn't change recently from what i can tell either. i think the "view anonymously" feature in the app is genuinely broken, but if somebody is still able to use twitter for android without an account, on any device, then that would be really good to know.

if somebody still wants some guest accounts to recover from DDoS please email me (see profile), I still have a lot of guest accounts stashed though they'll all expire in 2-3 weeks

received a DDoS from Hetzner and AWS nodes last friday, and around 2 days ago token fetching started to break for twitterminator as well. I suspect that there was a gradual rollout of the guest-accounts blockade, and it made scrapers more desperate and move to public nitter instances :( I have received mixed reports of existing guest accounts being invalidated as well vs not, but it's not clear to me whether that was an artifact of the DDoS causing a lot of rate limits or a genuine move by twitter. twitter apk didn't change recently from what i can tell either. i think the "view anonymously" feature in the app is genuinely broken, but if somebody is still able to use twitter for android without an account, on any device, then that would be really good to know. if somebody still wants some guest accounts to recover from DDoS please email me (see profile), I still have a lot of guest accounts stashed though they'll all expire in 2-3 weeks
nerra0pos commented 2024-01-27 05:54:46 -05:00 (Migrated from github.com)

So this is finally the end of Nitter with creating new guest accounts not working anymore?

So this is finally the end of Nitter with creating new guest accounts not working anymore?
animegrafmays commented 2024-01-27 06:24:41 -05:00 (Migrated from github.com)

it's not the end in that you can still checkout nitter using user accounts. the age of hosting nitter for people is probably over, though unfortunately

it's not the end in that you can still checkout nitter using user accounts. the age of hosting nitter for people is probably over, though unfortunately
frepke commented 2024-01-27 06:36:22 -05:00 (Migrated from github.com)

it's not the end in that you can still checkout nitter using user accounts. the age of hosting nitter for people is probably over, though unfortunately

And how do we use nitter with user accounts?

> it's not the end in that you can still checkout nitter using user accounts. the age of hosting nitter for people is probably over, though unfortunately And how do we use nitter with user accounts?
tghe-retford commented 2024-01-27 07:46:52 -05:00 (Migrated from github.com)

it's not the end in that you can still checkout nitter using user accounts. the age of hosting nitter for people is probably over, though unfortunately

It's probably over for those with individual instances if your intention is to avoid using X. Because new measures have been implemented to deal with scrapers, lurkers and spammers including the introduction of a $1 yearly fee for new accounts, algorithmic checks to see if you are actively engaging on X and posting regularly. Elon wants eyes on his website from registered users and by no other means because he only makes money from registered users who regularly create content, view the ads and preferably for him, subscribe.

This will also become an issue for archiving websites because they'll face the same issue. Nor can they get the funding to pay the API fees either.

> it's not the end in that you can still checkout nitter using user accounts. the age of hosting nitter for people is probably over, though unfortunately It's probably over for those with individual instances if your intention is to avoid using X. Because new measures have been implemented to deal with scrapers, lurkers and spammers including the introduction of a $1 yearly fee for new accounts, algorithmic checks to see if you are actively engaging on X and posting regularly. Elon wants eyes on his website from registered users and by no other means because he only makes money from registered users who regularly create content, view the ads and preferably for him, subscribe. This will also become an issue for archiving websites because they'll face the same issue. Nor can they get the funding to pay the API fees either.
lukefromdc commented 2024-01-27 09:19:48 -05:00 (Migrated from github.com)

If Nitter dies and Musk makes it impossible to find content on X without an account (e.g no access to chronological timeline), I will treat Twitter as Instagram (which I block) and warn my friends who still post there that I can no longer access their content.

If Nitter dies and Musk makes it impossible to find content on X without an account (e.g no access to chronological timeline), I will treat Twitter as Instagram (which I block) and warn my friends who still post there that I can no longer access their content.
tghe-retford commented 2024-01-27 09:24:52 -05:00 (Migrated from github.com)

If Nitter dies and Musk makes it impossible to find content on X without an account (e.g no access to chronological timeline), I will treat Twitter as Instagram (which I block) and warn my friends who still post there that I can no longer access their content.

I agree. The main problem is going to be Government agencies and private companies that have replaced their in-house customer service systems with an account on X in order to inform the public of emergencies, urgent alerts or civil information and companies who wish to cut costs and have Elon host most of their infrastructure to communicate with customers regarding service status, enquiries and complaints. What is happening will lock out anyone who refuses to use X from all of that communication with no prospect of any free and privacy focused alternative.

> If Nitter dies and Musk makes it impossible to find content on X without an account (e.g no access to chronological timeline), I will treat Twitter as Instagram (which I block) and warn my friends who still post there that I can no longer access their content. I agree. The main problem is going to be Government agencies and private companies that have replaced their in-house customer service systems with an account on X in order to inform the public of emergencies, urgent alerts or civil information and companies who wish to cut costs and have Elon host most of their infrastructure to communicate with customers regarding service status, enquiries and complaints. What is happening will lock out anyone who refuses to use X from all of that communication with no prospect of any free and privacy focused alternative.
pin-grid-array commented 2024-01-27 09:32:12 -05:00 (Migrated from github.com)

It's probably over for those with individual instances if your intention is to avoid using X. Because new measures have been implemented to deal with scrapers, lurkers and spammers including the introduction of a $1 yearly fee for new accounts, algorithmic checks to see if you are actively engaging on X and posting regularly.

The $1 fee you mentioned has been implemented only in New Zealand and the Philippines so far. Furthermore, new users who opt out of paying that fee can still use Twitter but are restricted to "'read only' actions, such as: read[ing] posts, watch[ing] videos, and follow[ing] accounts," according to Twitter's announcement.

That makes me doubt that users are being monitored for active engagement. Does Twitter have a reason to punish passive users? I don't think so. Passive users still view ads so there's still value for Twitter in keeping them around.

> It's probably over for those with individual instances if your intention is to avoid using X. Because new measures have been implemented to deal with scrapers, lurkers and spammers including the introduction of a $1 yearly fee for new accounts, algorithmic checks to see if you are actively engaging on X and posting regularly. The $1 fee you mentioned has been implemented [only in New Zealand and the Philippines](https://www.theguardian.com/technology/2023/oct/18/x-twitter-1-dollar-annual-subscription-fee-new-users-elon-musk-new-zealand-nz-philippines) so far. Furthermore, new users who opt out of paying that fee can still use Twitter but are restricted to "'read only' actions, such as: read[ing] posts, watch[ing] videos, and follow[ing] accounts," according to Twitter's announcement. That makes me doubt that users are being monitored for active engagement. Does Twitter have a reason to punish passive users? I don't think so. Passive users still view ads so there's still value for Twitter in keeping them around.
tghe-retford commented 2024-01-27 09:38:01 -05:00 (Migrated from github.com)

That makes me doubt that users are being monitored for active engagement. Does Twitter have a reason to punish passive users? I don't think so. Passive users still view ads so there's still value for Twitter in keeping them around.

They've already done it before where they've purged passive users from the platform. I know one account of another person personally whose account went quiet and was removed. While passive users may see advertising (if they don't use an adblocker), they don't add to the value of the website of which that content attracts advertising/subscription revenue and he can't also verify that the people lurking are humans and not bots that advertisers desire when purchasing advertising space on X. It's why they've targeted and will continue to target lurkers, scrapers and spammers.

> That makes me doubt that users are being monitored for active engagement. Does Twitter have a reason to punish passive users? I don't think so. Passive users still view ads so there's still value for Twitter in keeping them around. They've already done it before where they've purged passive users from the platform. I know one account of another person personally whose account went quiet and was removed. While passive users may see advertising (if they don't use an adblocker), they don't add to the value of the website of which that content attracts advertising/subscription revenue and he can't also verify that the people lurking are humans and not bots that advertisers desire when purchasing advertising space on X. It's why they've targeted and will continue to target lurkers, scrapers and spammers.
dawnerd commented 2024-01-27 10:51:52 -05:00 (Migrated from github.com)

I’ve tried using two real accounts but just get a rate limited message right away so maybe some more work is needed to support real oauth tokens.

I’ve tried using two real accounts but just get a rate limited message right away so maybe some more work is needed to support real oauth tokens.
notherenorthere commented 2024-01-27 10:58:30 -05:00 (Migrated from github.com)

hi, just a regular user who browses nitter here, sorry to interrupt. Is there anything we should/shouldn't do to not make things worse or is it irrelevant? nitter.net is fully down, is it a coincidence? other instances are hanging on and some barely there. Should we refrain from using it? how could we help?

hi, just a regular user who browses nitter here, sorry to interrupt. Is there anything we should/shouldn't do to not make things worse or is it irrelevant? nitter.net is fully down, is it a coincidence? other instances are hanging on and some barely there. Should we refrain from using it? how could we help?
freedit-dev commented 2024-01-27 11:54:43 -05:00 (Migrated from github.com)

hi, just a regular user who browses nitter here, sorry to interrupt. Is there anything we should/shouldn't do to not make things worse or is it irrelevant? nitter.net is fully down, is it a coincidence? other instances are hanging on and some barely there. Should we refrain from using it? how could we help?

Someone is scraping nitter heavily (actually so frequently that being a ddos)

> hi, just a regular user who browses nitter here, sorry to interrupt. Is there anything we should/shouldn't do to not make things worse or is it irrelevant? nitter.net is fully down, is it a coincidence? other instances are hanging on and some barely there. Should we refrain from using it? how could we help? Someone is scraping nitter heavily (actually so frequently that being a ddos)
vitusson commented 2024-01-27 12:22:18 -05:00 (Migrated from github.com)

It's why they've targeted and will continue to target lurkers, scrapers and spammers.

Have you been on Twitter/X lately? Since Elon took over, I have to block a dozen of porn/bitcoin scammer bots per week who like and follow me. Almost never happened before. It feels more like they encourage spammers to sell verified accounts.
But that's OT, sorry ;-)

> It's why they've targeted and will continue to target lurkers, scrapers and spammers. Have you been on Twitter/X lately? Since Elon took over, I have to block a dozen of porn/bitcoin scammer bots per week who like and follow me. Almost never happened before. It feels more like they encourage spammers to sell verified accounts. But that's OT, sorry ;-)
cmj commented 2024-01-27 16:52:51 -05:00 (Migrated from github.com)

My only theory, is that a massive amount of bot code out there used guest accounts for scraping, and public Nitter instances were used as a fallback if that failed. Literally every instance reached insane limits the exact same day.

Which led people to believe guest accounts were being removed.

My only theory, is that a massive amount of bot code out there used guest accounts for scraping, and public Nitter instances were used as a fallback if that failed. Literally every instance reached insane limits _the exact same day_. Which led people to believe guest accounts were being removed.
zedeus commented 2024-01-27 18:09:43 -05:00 (Migrated from github.com)

Guest accounts have been removed, they weren't just led to believe that. With real accounts getting rate limited immediately and likely banned, I don't see any path forward for Nitter.

Guest accounts have been removed, they weren't just led to believe that. With real accounts getting rate limited immediately and likely banned, I don't see any path forward for Nitter.
lukefromdc commented 2024-01-27 18:22:52 -05:00 (Migrated from github.com)

Replacing a rogue front with a rogue APP that connects to Twitter's servers may or may not work, I am no expert in that though.

No path forward for Nitter may mean no path forward for Twitter for me. The mass migration to Instagram suggesta existing 3ed party Instagram sites could use more help. I would prefer to see folks use Telegram and Mastodon, but too much is diverting to Instagram and probably FB as well as Twitter slowly sinks.

Replacing a rogue front with a rogue APP that connects to Twitter's servers may or may not work, I am no expert in that though. No path forward for Nitter may mean no path forward for Twitter for me. The mass migration to Instagram suggesta existing 3ed party Instagram sites could use more help. I would prefer to see folks use Telegram and Mastodon, but too much is diverting to Instagram and probably FB as well as Twitter slowly sinks.
python273 commented 2024-01-27 19:23:53 -05:00 (Migrated from github.com)

Any real info on accounts getting banned? Maybe still possible to have private instances?

Any real info on accounts getting banned? Maybe still possible to have private instances?
cmj commented 2024-01-27 19:43:05 -05:00 (Migrated from github.com)

You can still use a private instance with accounts you have, I have zero accounts limited; but they will expire of course.

You can still use a private instance with accounts you have, I have zero accounts limited; but they will expire of course.
python273 commented 2024-01-27 19:47:42 -05:00 (Migrated from github.com)

Guest accounts will expire, asking about real accounts getting banned.

Guest accounts will expire, asking about real accounts getting banned.
paulo-roger commented 2024-01-28 00:45:06 -05:00 (Migrated from github.com)

Mastodon or other AP protocol software is the answer. Fuck proprietary stuff. Enshittification sucks.

Mastodon or other AP protocol software is the answer. Fuck proprietary stuff. Enshittification sucks.
dnet890 commented 2024-01-28 01:01:56 -05:00 (Migrated from github.com)

@paulo-roger the thing is mastodon still have lacks of content and engagement compared to X

@paulo-roger the thing is mastodon still have lacks of content and engagement compared to X
cooljeanius commented 2024-01-28 01:30:54 -05:00 (Migrated from github.com)

@paulo-roger the thing is mastodon still have lacks of content and engagement compared to X

you can help fix that.

> @paulo-roger the thing is mastodon still have lacks of content and engagement compared to X you can help fix that.
Pawlicker commented 2024-01-28 01:47:00 -05:00 (Migrated from github.com)

@paulo-roger the thing is mastodon still have lacks of content and engagement compared to X

If only instances didn't block each other over the most minor stuff...

> @paulo-roger the thing is mastodon still have lacks of content and engagement compared to X If only instances didn't block each other over the most minor stuff...
mancoi commented 2024-01-28 02:42:59 -05:00 (Migrated from github.com)

@paulo-roger the thing is mastodon still have lacks of content and engagement compared to X

If only instances didn't block each other over the most minor stuff...

Exactly. Mastodon is nice and fun and all until admins realize they can block whoever the hell they want.

> > @paulo-roger the thing is mastodon still have lacks of content and engagement compared to X > > If only instances didn't block each other over the most minor stuff... Exactly. Mastodon is nice and fun and all until admins realize they can block whoever the hell they want.
WOnder93 commented 2024-01-28 03:25:50 -05:00 (Migrated from github.com)

Well, it's currently still possible to browse tweets without logging in through the website. The guest browsing through the web uses something called "guest token", which is returned as part of the page content and can be used for some limited API access (seems that only listing tweets of a user and viewing specific tweets is allowed).

Here is a PoC that gets tweet content by ID using this method:

#!/bin/bash

BEARER_TOKEN="AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"

tweet_id="$1"

guest_token="$(curl "https://twitter.com/" | grep -oP '(?<=document\.cookie="gt=)\d+(?=;)')"

curl -H "Authorization: Bearer $BEARER_TOKEN" -H "x-guest-token: $guest_token" "https://api.twitter.com/graphql/1rDKz-yHAU4JSqcZ0jjm9w/TweetResultByRestId?variables=%7B%22tweetId%22%3A%22$tweet_id%22%2C%22withCommunity%22%3Afalse%2C%22includePromotedContent%22%3Afalse%2C%22withVoice%22%3Afalse%7D&features=%7B%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22rweb_video_timestamps_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22responsive_web_media_download_video_enabled%22%3Afalse%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D"

Maybe this could be used to implement at least a partly functioning Nitter?

Well, it's currently still possible to browse tweets without logging in through the website. The guest browsing through the web uses something called "guest token", which is returned as part of the page content and can be used for some limited API access (seems that only listing tweets of a user and viewing specific tweets is allowed). Here is a PoC that gets tweet content by ID using this method: ```bash #!/bin/bash BEARER_TOKEN="AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA" tweet_id="$1" guest_token="$(curl "https://twitter.com/" | grep -oP '(?<=document\.cookie="gt=)\d+(?=;)')" curl -H "Authorization: Bearer $BEARER_TOKEN" -H "x-guest-token: $guest_token" "https://api.twitter.com/graphql/1rDKz-yHAU4JSqcZ0jjm9w/TweetResultByRestId?variables=%7B%22tweetId%22%3A%22$tweet_id%22%2C%22withCommunity%22%3Afalse%2C%22includePromotedContent%22%3Afalse%2C%22withVoice%22%3Afalse%7D&features=%7B%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22rweb_video_timestamps_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22responsive_web_media_download_video_enabled%22%3Afalse%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D" ``` Maybe this could be used to implement at least a partly functioning Nitter?
BANKA2017 commented 2024-01-28 03:39:21 -05:00 (Migrated from github.com)

Maybe this could be used to implement at least a partly functioning Nitter?

The guest token has strict rate limits and can only use very few endpoints, not even timeline/list/search...

> Maybe this could be used to implement at least a partly functioning Nitter? The guest token has strict rate limits and can only use very few endpoints, not even timeline/list/search...
DraconicNEO commented 2024-01-28 05:06:26 -05:00 (Migrated from github.com)

@paulo-roger the thing is mastodon still have lacks of content and engagement compared to X

If only instances didn't block each other over the most minor stuff...

So Alt-right trolling, illegal content, and spam waves are "minor stuff" to you? God I don't even want to know what you consider major stuff then.

Seriously the people who complain about this shit are almost certainly alt-righties who want "muh freeze peach", if you want something for that, Nostr is where its at.

Ultimately though most people though don't want to join platforms that have constant spam, hate, and flame-wars, so in that regard the platforms and networks without "freeze peach" and have rules and moderation will do much better and have more users and real interaction than the ones that don't and allow people to say whatever they choose without direct repercussions, which will be full of spam, trolls, and people posting threats and hate speech.

> > @paulo-roger the thing is mastodon still have lacks of content and engagement compared to X > > If only instances didn't block each other over the most minor stuff... So Alt-right trolling, illegal content, and spam waves are "minor stuff" to you? God I don't even want to know what you consider major stuff then. Seriously the people who complain about this shit are almost certainly alt-righties who want "muh freeze peach", if you want something for that, Nostr is where its at. Ultimately though most people though don't want to join platforms that have constant spam, hate, and flame-wars, so in that regard the platforms and networks without "freeze peach" and have rules and moderation will do much better and have more users and real interaction than the ones that don't and allow people to say whatever they choose without direct repercussions, which will be full of spam, trolls, and people posting threats and hate speech.
nerra0pos commented 2024-01-28 05:16:39 -05:00 (Migrated from github.com)

Seriously the people who complain about this shit are almost certainly alt-righties who want "muh freeze peach", if you want something for that, Nostr is where its at.

Ultimately though most people though don't want to join platforms that have constant spam, hate, and flame-wars, so in that regard the platforms and networks without "freeze peach" and have rules and moderation will do much better and have more users and real interaction than the ones that don't and allow people to say whatever they choose without direct repercussions, which will be full of spam, trolls, and people posting threats and hate speech.

You seriously have an Elon derangement syndrome. This here is about finding tech solutions, not about leftist feelings.

> > Seriously the people who complain about this shit are almost certainly alt-righties who want "muh freeze peach", if you want something for that, Nostr is where its at. > > Ultimately though most people though don't want to join platforms that have constant spam, hate, and flame-wars, so in that regard the platforms and networks without "freeze peach" and have rules and moderation will do much better and have more users and real interaction than the ones that don't and allow people to say whatever they choose without direct repercussions, which will be full of spam, trolls, and people posting threats and hate speech. You seriously have an Elon derangement syndrome. This here is about finding tech solutions, not about leftist feelings.
nukeop commented 2024-01-28 05:23:59 -05:00 (Migrated from github.com)

So Alt-right trolling, illegal content, and spam waves are "minor stuff" to you? God I don't even want to know what you consider major stuff then.

Yes. Cope, seethe, and dilate.

> So Alt-right trolling, illegal content, and spam waves are "minor stuff" to you? God I don't even want to know what you consider major stuff then. Yes. Cope, seethe, and dilate.
NicoBerlo commented 2024-01-28 05:25:02 -05:00 (Migrated from github.com)

guys this is totally off topic, please stop

guys this is totally off topic, please stop
DraconicNEO commented 2024-01-28 06:19:56 -05:00 (Migrated from github.com)

guys this is totally off topic, please stop

I agree. It's majorly off topic and extremely disruptive.

Edit: Thanks for helping me take out the trash by presenting yourselves as the chuds you are, I promise you're never getting unblocked no matter how good at code you are.

> guys this is totally off topic, please stop I agree. It's majorly off topic and extremely disruptive. Edit: Thanks for helping me take out the trash by presenting yourselves as the chuds you are, I promise you're never getting unblocked no matter how good at code you are.
ShadowJonathan commented 2024-01-28 07:13:09 -05:00 (Migrated from github.com)

Does anyone know how normal accounts can be used for nitter? I only check a few users, via some high-reputation accounts, and I'd want to add those

Does anyone know how normal accounts can be used for nitter? I only check a few users, via some high-reputation accounts, and I'd want to add those
ejv2 commented 2024-01-28 10:02:46 -05:00 (Migrated from github.com)

Just thought I'd leave a comment to say thanks for all the work of those who worked on Nitter. No matter what state it ends up in, it as served me very well.

Just thought I'd leave a comment to say thanks for all the work of those who worked on Nitter. No matter what state it ends up in, it as served me very well.
ghost commented 2024-01-28 11:47:11 -05:00 (Migrated from github.com)

I agree. It's majorly off topic and extremely disruptive.

Edit: Thanks for helping me take out the trash by presenting yourselves as the chuds you are, I promise you're never getting unblocked no matter how good at code you are.

You say you agree, but earlier you maliciously misrepresented another user to accuse him of fascism, and now you threaten and insult everyone who disagrees with you.

I don't know if you are a troll, but please, shut the fuck up and stop derailing such a relevant topic.

> I agree. It's majorly off topic and extremely disruptive. > > Edit: Thanks for helping me take out the trash by presenting yourselves as the chuds you are, I promise you're never getting unblocked no matter how good at code you are. You say you agree, but earlier you maliciously misrepresented another user to accuse him of fascism, and now you threaten and insult everyone who disagrees with you. I don't know if you are a troll, but please, shut the fuck up and stop derailing such a relevant topic.
DraconicNEO commented 2024-01-28 12:02:10 -05:00 (Migrated from github.com)

Does anyone know how normal accounts can be used for nitter? I only check a few users, via some high-reputation accounts, and I'd want to add those

It might be possible, though I'd recommend doing it only through your own personal private nitter instance, so the accounts don't get banned due to ratelimits.

> Does anyone know how normal accounts can be used for nitter? I only check a few users, via some high-reputation accounts, and I'd want to add those It might be possible, though I'd recommend doing it only through your own personal private nitter instance, so the accounts don't get banned due to ratelimits.
DraconicNEO commented 2024-01-28 14:59:30 -05:00 (Migrated from github.com)

Guest accounts will expire, asking about real accounts getting banned.

I think it depends on how old they are, how often they exceed ratelimits (if ever) and if Twitter's team can or will attempt to investigate manually accounts that they suspect of supplying nitter with information.

I suppose one solution could be to have volunteer twitter users supply data to the Nitter servers from their own sessions via an extension or something like that. It would severely limit the amount of content available but could get around issues of accounts being banned because they would be getting the data from legitimate users and mirroring it elsewhere.

> Guest accounts will expire, asking about real accounts getting banned. I think it depends on how old they are, how often they exceed ratelimits (if ever) and if Twitter's team can or will attempt to investigate manually accounts that they suspect of supplying nitter with information. I suppose one solution could be to have volunteer twitter users supply data to the Nitter servers from their own sessions via an extension or something like that. It would severely limit the amount of content available but could get around issues of accounts being banned because they would be getting the data from legitimate users and mirroring it elsewhere.
Yetangitu commented 2024-01-28 15:35:41 -05:00 (Migrated from github.com)

@paulo-roger the thing is mastodon still have lacks of content and engagement compared to X

If only instances didn't block each other over the most minor stuff...

The fact that this post was downvoted so much that had this been 'the orange site' it would have been killed tells it all. Yes, that is the main problem with Twixxer-alternatives, the fact that these tend to become ideological silos where dissent is not only not tolerated but seen as proof of the dissenter being so morally corrupted that any contact with said individual is deemed sinful. Not only do instances in the Fediverse ban other instances for being less than ideologically pure, they ban those instances which refuse to ban banned instances - guilt by association. As long as this practice abounds the Fediverse can not fulfil the role of marketplace of ideas since it actively shields inhabitants of such ban-happy instances of ideas outside the Overton window.

> > @paulo-roger the thing is mastodon still have lacks of content and engagement compared to X > > If only instances didn't block each other over the most minor stuff... The fact that this post was downvoted so much that had this been 'the orange site' it would have been killed tells it all. Yes, that is the main problem with Twixxer-alternatives, the fact that these tend to become ideological silos where dissent is not only not tolerated but seen as proof of the dissenter being so morally corrupted that any contact with said individual is deemed sinful. Not only do instances in the Fediverse ban other instances for being less than ideologically pure, they ban those instances which refuse to ban banned instances - guilt by association. As long as this practice abounds the Fediverse can not fulfil the role of _marketplace of ideas_ since it actively shields inhabitants of such ban-happy instances of ideas outside the Overton window.
0xdeb7ef commented 2024-01-28 16:30:02 -05:00 (Migrated from github.com)

The guest account on the Twitter app (Version 9.95.0-release.0 (29950000)) seems to still work, albeit very rate limited.

The guest account on the Twitter app (Version 9.95.0-release.0 (29950000)) seems to still work, albeit _very_ rate limited.
mnh48 commented 2024-01-28 17:07:51 -05:00 (Migrated from github.com)

I hope there will be somewhat newer workaround for Nitter
probably by using the token that it gets when Twitter/X loads a specific tweet/post?
iirc you can still view tweet/post without logging in, so there should be some kind of token going on there


the thing is mastodon still have lacks of content and engagement compared to X

If only instances didn't block each other over the most minor stuff...

I agree with this .. I had to create separate accounts on multiple instances just to follow different sets of people as the instance they're on blocked the other instance, it gets annoying real quick

Further writing in collapsible box as it's kinda off-topic

I could understand instance blocking other instance due to different laws in some region, like how many Japanese instances are blocked by instances in other countries because many other countries have different law than Japan that some of the toots Japanese users made which are legal in Japan and many Asian countries are highly illegal in some other countries especially in Europe and America

but some instance block other instance just because of ideological differences, for example:

  • instance that blocks any other instance that allow AI art or discussing about it
  • instance that blocks any other instance that discuss about resistance towards AI art or tools like Glaze or Nightshade
  • instance that blocks any other instance that discuss about cryptocurrency
  • instance that blocks any other instance that talks about politics
  • instance that blocks any other instance that talks about religion (either in general or specific religion) or the lack of it
  • instance that blocks any other instance that discuss about gender and sexuality
  • instance A that blocks any other instance B who refuse to block different instance C on B's side just because C has content that A don't like

none of those should be a reason to get blocked on the instance level, cutting off the users on both sides from each other
at most it should just be "silenced", that users on both sides can still interact with each other, but the public posts on one instance don't just appear in the public timeline of the other instance

on Twitter/X you can still interact with everyone regardless what your position on certain issue is with just one account, but on Mastodon (and just Fediverse in general) with the instance admin babysitting their instance, you had to choose which instance to use and possibly hop around different instances many time just to find the one that you can use to interact with most accounts, and then still end up making additional account on other instance(s) to cover the rest of instances that got blocked by your main instance as you still want to interact with people on there in some way or another

I hope there will be somewhat newer workaround for Nitter probably by using the token that it gets when Twitter/X loads a specific tweet/post? iirc you can still view tweet/post without logging in, so there should be some kind of token going on there --- > > the thing is mastodon still have lacks of content and engagement compared to X > > If only instances didn't block each other over the most minor stuff... I agree with this .. I had to create separate accounts on multiple instances just to follow different sets of people as the instance they're on blocked the other instance, it gets annoying real quick <details> <summary>Further writing in collapsible box as it's kinda off-topic</summary> I could understand instance blocking other instance due to different laws in some region, like how many Japanese instances are blocked by instances in other countries because many other countries have different law than Japan that some of the toots Japanese users made which are legal in Japan and many Asian countries are highly illegal in some other countries especially in Europe and America but some instance block other instance just because of ideological differences, for example: - instance that blocks any other instance that allow AI art or discussing about it - instance that blocks any other instance that discuss about resistance towards AI art or tools like Glaze or Nightshade - instance that blocks any other instance that discuss about cryptocurrency - instance that blocks any other instance that talks about politics - instance that blocks any other instance that talks about religion (either in general or specific religion) or the lack of it - instance that blocks any other instance that discuss about gender and sexuality - instance A that blocks any other instance B who refuse to block different instance C on B's side just because C has content that A don't like none of those should be a reason to get blocked on the instance level, cutting off the users on both sides from each other at most it should just be "silenced", that users on both sides can still interact with each other, but the public posts on one instance don't just appear in the public timeline of the other instance on Twitter/X you can still interact with everyone regardless what your position on certain issue is with just one account, but on Mastodon (and just Fediverse in general) with the instance admin babysitting their instance, you had to choose which instance to use and possibly hop around different instances many time just to find the one that you can use to interact with *most* accounts, and then still end up making additional account on other instance(s) to cover the rest of instances that got blocked by your main instance as you still want to interact with people on there in some way or another </details>
Pawlicker commented 2024-01-28 17:27:25 -05:00 (Migrated from github.com)

@paulo-roger the thing is mastodon still have lacks of content and engagement compared to X

If only instances didn't block each other over the most minor stuff...

The fact that this post was downvoted so much that had this been 'the orange site' it would have been killed tells it all. Yes, that is the main problem with Twixxer-alternatives, the fact that these tend to become ideological silos where dissent is not only not tolerated but seen as proof of the dissenter being so morally corrupted that any contact with said individual is deemed sinful. Not only do instances in the Fediverse ban other instances for being less than ideologically pure, they ban those instances which refuse to ban banned instances - guilt by association. As long as this practice abounds the Fediverse can not fulfil the role of marketplace of ideas since it actively shields inhabitants of such ban-happy instances of ideas outside the Overton window.

Essentially this is why I am letdown that Nitter is gone, because as Twitter is login walling their entire site, people still use it due to it's image of being the "digital town square". But unfortunately there is going to have to be a big culture shift to move people over to the fedi.

Spoilered because off topic The whole point I was making with this comment too was that simply, the fediverse is never going to ever become a mainstream Twitter replacement for this very reason. Let me make an argument about why this is a bad idea for someone coming over from Twitter as a very active fedi user, without delving into politics like other users talking about this have.

On the fediverse, you have to make several accounts to follow people for a very good reason. Let's say you have a friend who signs up for Instance B, and you're on Instance A. Unfortunately, due to people you never interacted with or knew about, instance B has blocked instance A, because a member of that instance made fun of someone on an entirely different instance or made a post that an entirely different instance hated (like say something about cryptocurrency for example), which has now added instance A to say fediseer or something to be blindly imported into their blocklist (at least one website even says that you must import a blocklist to run an instance). Even better, you don't even know your instance is blocked because instance B has made their blocklist visible to logged in users. You'll only find this out when it says follow pending or you don't see your posts on his instance, or even better you can't fetch his account or posts on your instance.

Essentially the only way you can communicate with much of the fediverse is to surprise surprise, make an account on the flagship instance (mastodon.social) and follow whatever their rules are to the T. Or you can make a single user instance, but be warned: if you "be yourself" too much you'll end up on more and more blocklists. If you want to avoid moderation similar to that of Twitter, you can expect to be on blocklists because some guy on your instance had harmful opinions on some topic that gets people very worked up.

As a result of this hindering interactions, many people who are not banned for Twitter for some reason or another end up inevitably going back to Twitter, which is as a result where the big discussions online take place. Elon Musk knows this to the point of calling Twitter a "digital town square", and he can abuse this reputation because thinks nobody is going to go anywhere. Most people quite frankly do not want to deal with any of this to just say something online and will go back to Twitter.com if it means they won't deal with the modern day version of a 2000s forum moderator.

This is exactly why I am disappointed that Nitter is getting blocked by Twitter, and why Nitter was so useful. It was a great way to bypass the login walls of Twitter (which went from "login to view NSFW" to "login to view anything other than a single post in a thread") even as the world continues to use it as a major platform for posting announcements, even as the API became unusable, even as "latest tweets" boxes in sites broke. Twitter has broken the site to force people to login.

Unfortunately as the failed Reddit API protest showed, it's going to take a culture shift and actually moving onto different websites to reduce Twitter's influence, and while journalists and others leaving Twitter for numerous reasons is one thing, they're just going to different walled gardens like Facebook, Instagram (owned by FB), and more. The unfortunate reality is that the only thing that makes people actually leave Twitter is being banned from every big social media site. It'll take something on a massive scale like the Tumblr porn ban to make Twitter irrelevant IMO.

> > > @paulo-roger the thing is mastodon still have lacks of content and engagement compared to X > > > > > > If only instances didn't block each other over the most minor stuff... > > The fact that this post was downvoted so much that had this been 'the orange site' it would have been killed tells it all. Yes, that is the main problem with Twixxer-alternatives, the fact that these tend to become ideological silos where dissent is not only not tolerated but seen as proof of the dissenter being so morally corrupted that any contact with said individual is deemed sinful. Not only do instances in the Fediverse ban other instances for being less than ideologically pure, they ban those instances which refuse to ban banned instances - guilt by association. As long as this practice abounds the Fediverse can not fulfil the role of _marketplace of ideas_ since it actively shields inhabitants of such ban-happy instances of ideas outside the Overton window. Essentially this is why I am letdown that Nitter is gone, because as Twitter is login walling their entire site, people still use it due to it's image of being the "digital town square". But unfortunately there is going to have to be a big culture shift to move people over to the fedi. <details> <summary>Spoilered because off topic</summary> The whole point I was making with this comment too was that simply, the fediverse is never going to ever become a mainstream Twitter replacement for this very reason. Let me make an argument about why this is a bad idea for someone coming over from Twitter as a very active fedi user, without delving into politics like other users talking about this have. On the fediverse, you have to make several accounts to follow people for a very good reason. Let's say you have a friend who signs up for Instance B, and you're on Instance A. Unfortunately, due to people you never interacted with or knew about, instance B has blocked instance A, because a member of that instance made fun of someone on an entirely different instance or made a post that an entirely different instance hated (like say something about cryptocurrency for example), which has now added instance A to [say fediseer or something](https://gui.fediseer.com/) to be blindly imported into their blocklist (at least one website even says [that you must import a blocklist](https://codeberg.org/nev/awesome-fediadmin#user-content-moderation-blocking) to run an instance). Even better, you don't even know your instance is blocked because instance B has made their blocklist visible to logged in users. You'll only find this out when it says follow pending or you don't see your posts on his instance, or even better [you can't fetch his account or posts on your instance](https://docs.joinmastodon.org/admin/config/#authorized_fetch). Essentially the only way you can communicate with much of the fediverse is to surprise surprise, make an account on the flagship instance (mastodon.social) and follow whatever their rules are to the T. Or you can make a single user instance, but be warned: if you "be yourself" too much you'll end up on more and more blocklists. If you want to avoid moderation similar to that of Twitter, you can expect to be on blocklists because some guy on your instance had harmful opinions on some topic that gets people very worked up. As a result of this hindering interactions, many people who are not banned for Twitter for some reason or another end up inevitably going back to Twitter, which is as a result where the big discussions online take place. Elon Musk knows this to the point of calling Twitter a ["digital town square"](https://www.prnewswire.com/news-releases/elon-musk-to-acquire-twitter-301532245.html), and he can abuse this reputation because thinks nobody is going to go anywhere. **Most people quite frankly do not want to deal with any of this** to just say something online and will go back to Twitter.com if it means they won't deal with the modern day version of a 2000s forum moderator. **This is exactly why I am disappointed that Nitter is getting blocked by Twitter**, and why Nitter was so useful. It was a great way to bypass the login walls of Twitter (which went from "login to view NSFW" to "login to view anything other than a single post in a thread") even as the world continues to use it as a major platform for posting announcements, even as the API became unusable, even as "latest tweets" boxes in sites broke. Twitter has broken the site to force people to login. Unfortunately as the failed Reddit API protest showed, **it's going to take a culture shift and actually moving onto different websites to reduce Twitter's influence**, and while journalists and others leaving Twitter for numerous reasons is one thing, they're just going to different walled gardens like Facebook, Instagram (owned by FB), and more. The unfortunate reality is that [the only thing that makes people actually leave Twitter is being banned from every big social media site](https://ethanzuckerman.com/2017/08/18/mastodon-is-big-in-japan-the-reason-why-is-uncomfortable/). It'll take something on a massive scale like the Tumblr porn ban to make Twitter irrelevant IMO. </details>
JonasBirk commented 2024-01-28 17:29:16 -05:00 (Migrated from github.com)

twstalker.com has not worked since we noticed the removal of the guest accounts as well. However, it seems like it's working again. Does someone know about their workaround?

twstalker.com has not worked since we noticed the removal of the guest accounts as well. However, it seems like it's working again. Does someone know about their workaround?
ExperiencersInternational commented 2024-01-28 18:34:44 -05:00 (Migrated from github.com)

@paulo-roger the thing is mastodon still have lacks of content and engagement compared to X

If only instances didn't block each other over the most minor stuff...

Don't we all love mastodon.art?

I think bird.makeup seems to still be working, my friend boosted a post from it earlier but I think that's on borrowed time to be honest.

> > @paulo-roger the thing is mastodon still have lacks of content and engagement compared to X > > If only instances didn't block each other over the most minor stuff... Don't we all love mastodon.art? I think bird.makeup seems to still be working, my friend boosted a post from it earlier but I think that's on borrowed time to be honest.
animegrafmays commented 2024-01-28 18:37:48 -05:00 (Migrated from github.com)

I think bird.makeup seems to still be working, my friend boosted a post from it earlier but I think that's on borrowed time to be honest.

bird.makeup was found to be scraping nitter instances for his source code. he was approached by many of us to help him set up his own nitter instance but i don't think he ever did. in which case it's using the list of public instances (failing over to each one) from status.d420.de

> I think bird.makeup seems to still be working, my friend boosted a post from it earlier but I think that's on borrowed time to be honest. bird.makeup was found to be scraping nitter instances for his source code. he was approached by many of us to help him set up his own nitter instance but i don't think he ever did. in which case it's using the list of public instances (failing over to each one) from status.d420.de
0xdeb7ef commented 2024-01-28 18:51:56 -05:00 (Migrated from github.com)

The guest account on the Twitter app (Version 9.95.0-release.0 (29950000)) seems to still work, albeit very rate limited.

Never mind, it seems that it stopped working, replies aren't loading, but tweets from trending and search results do still appear.

> The guest account on the Twitter app (Version 9.95.0-release.0 (29950000)) seems to still work, albeit _very_ rate limited. Never mind, it seems that it stopped working, replies aren't loading, but tweets from trending and search results do still appear.
wiredsis commented 2024-01-28 20:20:49 -05:00 (Migrated from github.com)

sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork

sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork
cmj commented 2024-01-28 20:28:17 -05:00 (Migrated from github.com)

Just be warned, the privacydev pre_guest_accounts tree is only for one account, and you will reach limits fast.

You can't go public on one account at all, use this for local rss, etc.

Just be warned, the privacydev pre_guest_accounts tree is only for one account, and you will reach limits fast. You can't go public on one account at all, use this for local rss, etc.
ExperiencersInternational commented 2024-01-28 20:41:36 -05:00 (Migrated from github.com)

I think bird.makeup seems to still be working, my friend boosted a post from it earlier but I think that's on borrowed time to be honest.

bird.makeup was found to be scraping nitter instances for his source code. he was approached by many of us to help him set up his own nitter instance but i don't think he ever did. in which case it's using the list of public instances (failing over to each one) from status.d420.de

Didn't know that, used to follow the person who ran it but I unfollowed after some people didn't particularly like him. I can see why now lol

> > I think bird.makeup seems to still be working, my friend boosted a post from it earlier but I think that's on borrowed time to be honest. > > bird.makeup was found to be scraping nitter instances for his source code. he was approached by many of us to help him set up his own nitter instance but i don't think he ever did. in which case it's using the list of public instances (failing over to each one) from status.d420.de Didn't know that, used to follow the person who ran it but I unfollowed after some people didn't particularly like him. I can see why now lol
wiredsis commented 2024-01-28 21:12:33 -05:00 (Migrated from github.com)

sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork

guest accounts updated we're back everyone

> sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork guest accounts updated we're back everyone
lukefromdc commented 2024-01-29 00:26:58 -05:00 (Migrated from github.com)

If bird.makeup dies because of all this, then a lot of folks who have tweets reposted on Mastodon will have to manually copy them over. Hopefully in my community that can be leveraged into using mastodon as the primary place to publish.

If bird.makeup dies because of all this, then a lot of folks who have tweets reposted on Mastodon will have to manually copy them over. Hopefully in my community that can be leveraged into using mastodon as the primary place to publish.
MoonlessForest commented 2024-01-29 00:28:25 -05:00 (Migrated from github.com)

Damn it... Now I wish Twitter would just die already and make everyone - especially artists - use some better platform.
I was getting sick and tired of everyone's art gallery being on Twitter until I found Nitter, which was and still is a godsend, so I hope there will be a new workaround soon.

Damn it... Now I wish Twitter would just die already and make everyone - especially artists - use some better platform. I was getting sick and tired of everyone's art gallery being on Twitter until I found Nitter, which was and still is a godsend, so I hope there will be a new workaround soon.
intuser commented 2024-01-29 00:46:51 -05:00 (Migrated from github.com)

One thing I noticed as user: The very few instances which at this moment work for me flawlessly all have very strong DDOS protection.

Could this part of a solution? Or are they only buying some time and in few days/weeks they will be gone too?

One thing I noticed as user: The very few instances which at this moment work for me flawlessly all have very strong DDOS protection. Could this part of a solution? Or are they only buying some time and in few days/weeks they will be gone too?
the-blank-x commented 2024-01-29 00:58:17 -05:00 (Migrated from github.com)

Public nitter instances were/are being scraped to the point of an accidental DDoS, presumably due to guest account creation being killed. DDoS protection has stopped those instances prevented their guest accounts from ratelimited due to being scraped to oblivion, but it only buys some time since the guest accounts will expire within 30 days.

[Public nitter instances were/are being scraped to the point of an accidental DDoS](https://github.com/zedeus/nitter/issues/983#issuecomment-1913021550), presumably due to [guest account creation being killed](https://github.com/zedeus/nitter/issues/983#issuecomment-1910533435). DDoS protection has stopped those instances prevented their guest accounts from ratelimited due to being scraped to oblivion, but it only buys some time since the guest accounts will expire within 30 days.
bokuwatotsukadesu commented 2024-01-29 02:52:16 -05:00 (Migrated from github.com)

Seriously the people who complain about this shit are almost certainly alt-righties who want "muh freeze peach", if you want something for that, Nostr is where its at.
Ultimately though most people though don't want to join platforms that have constant spam, hate, and flame-wars, so in that regard the platforms and networks without "freeze peach" and have rules and moderation will do much better and have more users and real interaction than the ones that don't and allow people to say whatever they choose without direct repercussions, which will be full of spam, trolls, and people posting threats and hate speech.

You seriously have an Elon derangement syndrome. This here is about finding tech solutions, not about leftist feelings.

Yes it is silly. Privacy and free speech is non-partisan. I am a bisexual environmentalist (not that it matters anyway) and I support Nitter and free speech.

> > Seriously the people who complain about this shit are almost certainly alt-righties who want "muh freeze peach", if you want something for that, Nostr is where its at. > > Ultimately though most people though don't want to join platforms that have constant spam, hate, and flame-wars, so in that regard the platforms and networks without "freeze peach" and have rules and moderation will do much better and have more users and real interaction than the ones that don't and allow people to say whatever they choose without direct repercussions, which will be full of spam, trolls, and people posting threats and hate speech. > > You seriously have an Elon derangement syndrome. This here is about finding tech solutions, not about leftist feelings. Yes it is silly. Privacy and free speech is non-partisan. I am a bisexual environmentalist (not that it matters anyway) and I support Nitter and free speech.
bokuwatotsukadesu commented 2024-01-29 02:56:09 -05:00 (Migrated from github.com)

guys this is totally off topic, please stop

I agree. It's majorly off topic and extremely disruptive.

Edit: Thanks for helping me take out the trash by presenting yourselves as the chuds you are, I promise you're never getting unblocked no matter how good at code you are.

What are chuds? Urban Dictionary says unattractive person. If that is the case, I think you will have to ban many respectable programmers. People should be recognised for their merit and skill, rather than their attraction level. If you hate the left that much, then go to a politics forum, instead of GitHub.

Edit: I do not know some of these American terms, so forgive me. I can only go off of things such as Urban Dictionary. My intention was not to insult programmers. Many are attractive. My point is, it does not matter how they look, because their skill is what matters.

> > guys this is totally off topic, please stop > > I agree. It's majorly off topic and extremely disruptive. > > Edit: Thanks for helping me take out the trash by presenting yourselves as the chuds you are, I promise you're never getting unblocked no matter how good at code you are. What are chuds? Urban Dictionary says unattractive person. If that is the case, I think you will have to ban many respectable programmers. People should be recognised for their merit and skill, rather than their attraction level. If you hate the left that much, then go to a politics forum, instead of GitHub. Edit: I do not know some of these American terms, so forgive me. I can only go off of things such as Urban Dictionary. My intention was not to insult programmers. Many are attractive. My point is, it does not matter how they look, because their skill is what matters.
NicoBerlo commented 2024-01-29 03:43:48 -05:00 (Migrated from github.com)

sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork

guest accounts updated we're back everyone

Awesome !
what script are you using ? Mine isn't working

> > sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork > > guest accounts updated we're back everyone Awesome ! what script are you using ? Mine isn't working
Kingwordking commented 2024-01-29 03:56:30 -05:00 (Migrated from github.com)

sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork

guest accounts updated we're back everyone

Can you share your script with me, please?

> > sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork > > guest accounts updated we're back everyone Can you share your script with me, please?
nerra0pos commented 2024-01-29 04:27:02 -05:00 (Migrated from github.com)

sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork

guest accounts updated we're back everyone

What exactly has to be changed? Kindly can you elaborate?

> > sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork > > guest accounts updated we're back everyone What exactly has to be changed? Kindly can you elaborate?
RunlevelConsulting commented 2024-01-29 06:10:44 -05:00 (Migrated from github.com)

Echoing the above. There doesn't seem to be instructions on how to implement the single-user credentials on PrivacyDev fork.
Could someone help give pointers on how to implement it and where to put those credentials?

Echoing the above. There doesn't seem to be instructions on how to implement the single-user credentials on PrivacyDev fork. Could someone help give pointers on how to implement it and where to put those credentials?
ExperiencersInternational commented 2024-01-29 06:14:50 -05:00 (Migrated from github.com)

If bird.makeup dies because of all this, then a lot of folks who have tweets reposted on Mastodon will have to manually copy them over. Hopefully in my community that can be leveraged into using mastodon as the primary place to publish.

I haven't personally used it in a while since I use Firefish and no offense but both the developers of Firefish and bird.makeup seem like they can't be bothered to make any advancement for compatibility. I follow the Firefish developer on GitHub and they've been active here meanwhile things are currently in turmoil on fedi thanks to them not being active there for a month.

My instance admin does have plans to move to Sharkey iirc if the situation doesn't improve with Firefish being abandoned.

> If bird.makeup dies because of all this, then a lot of folks who have tweets reposted on Mastodon will have to manually copy them over. Hopefully in my community that can be leveraged into using mastodon as the primary place to publish. I haven't personally used it in a while since I use Firefish and no offense but both the developers of Firefish and bird.makeup seem like they can't be bothered to make any advancement for compatibility. I follow the Firefish developer on GitHub and they've been active here meanwhile things are currently in turmoil on fedi thanks to them not being active there for a month. My instance admin does have plans to move to Sharkey iirc if the situation doesn't improve with Firefish being abandoned.
the-blank-x commented 2024-01-29 06:51:32 -05:00 (Migrated from github.com)

this issue has derailed like twice now within the past 24 hours, can we not?

this issue has derailed like twice now within the past 24 hours, can we not?
sprtm commented 2024-01-29 06:56:55 -05:00 (Migrated from github.com)

Back in August someone posted a script that gives you the auth token from a logged in account: https://github.com/zedeus/nitter/issues/983#issuecomment-1688495284

If someone can get it working, please share.

Back in August someone posted a script that gives you the auth token from a logged in account: https://github.com/zedeus/nitter/issues/983#issuecomment-1688495284 If someone can get it working, please share.
DIYgod commented 2024-01-29 07:21:12 -05:00 (Migrated from github.com)
Thanks to https://github.com/zedeus/nitter/issues/983#issuecomment-1688495284 and https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357, Twitter RSS is now available on RSSHub again: https://github.com/DIYgod/RSSHub/commit/3ae25ddb7ad8d517b78d8625c4320251727a4eb2
csisoap commented 2024-01-29 07:40:05 -05:00 (Migrated from github.com)

Back in August someone posted a script that gives you the auth token from a logged in account: #983 (comment)

If someone can get it working, please share.

Here you go

import requests
import base64
username = 'XXXXXXXXXXXX'
password = 'XXXXXXXXXXXX'
TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w'
TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'
TW_ANDROID_BASIC_TOKEN = 'Basic {token}'.format(token=base64.b64encode(
    (TW_CONSUMER_KEY + ":" + TW_CONSUMER_SECRET).encode()
).decode())
# print(TW_ANDROID_BASIC_TOKEN)


authentication = None
bearer_token_req = requests.post("https://api.twitter.com/oauth2/token",
	headers={
      'Authorization': TW_ANDROID_BASIC_TOKEN,
      "Content-Type": "application/x-www-form-urlencoded",
    },
	data='grant_type=client_credentials'
).json()
bearer_token = ' '.join(str(x) for x in bearer_token_req.values())
print(bearer_token)

# The bearer token is immutable
# Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F
guest_token = requests.post("https://api.twitter.com/1.1/guest/activate.json", headers={
	'Authorization': bearer_token,
}).json()['guest_token']
print(guest_token)

twitter_header = {
    'Authorization': bearer_token,
    "Content-Type": "application/json",
    "User-Agent":
        "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)",
    "X-Twitter-API-Version": '5',
    "X-Twitter-Client": "TwitterAndroid",
    "X-Twitter-Client-Version": "9.95.0-release.0",
    "OS-Version": "28",
    "System-User-Agent":
        "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)",
    "X-Twitter-Active-User": "yes",
    "X-Guest-Token": guest_token,
}

session = requests.Session()


task1 = session.post('https://api.twitter.com/1.1/onboarding/task.json',
	params={
		'flow_name': 'login',
		'api_version': '1',
		'known_device_token': '',
		'sim_country_code': 'us'
	},
	json={
		"flow_token": None,
		"input_flow_data": {
			"country_code": None,
			"flow_context": {
				"referrer_context": {
					"referral_details": "utm_source=google-play&utm_medium=organic",
					"referrer_url": ""
				},
				"start_location": {
					"location": "deeplink"
				}
			},
			"requested_variant": None,
			"target_user_id": 0
		}
	},
	headers=twitter_header
)

session.headers['att'] = task1.headers.get('att')
task2 = session.post('https://api.twitter.com/1.1/onboarding/task.json', 
	json={
        "flow_token": task1.json().get('flow_token'),
        "subtask_inputs": [{
                "enter_text": {
                    "suggestion_id": None,
                    "text": username,
                    "link": "next_link"
                },
                "subtask_id": "LoginEnterUserIdentifier"
            }
        ]
    },
	headers=twitter_header
)

task3 = session.post('https://api.twitter.com/1.1/onboarding/task.json', 
	json={
        "flow_token": task2.json().get('flow_token'),
        "subtask_inputs": [{
                "enter_password": {
                    "password": password,
                    "link": "next_link"
                },
                "subtask_id": "LoginEnterPassword"
            }
        ],
    },
	headers=twitter_header
)

task4 = session.post('https://api.twitter.com/1.1/onboarding/task.json', 
	json={
        "flow_token": task3.json().get('flow_token'),
        "subtask_inputs": [{
                "check_logged_in_account": {
                    "link": "AccountDuplicationCheck_false"
                },
                "subtask_id": "AccountDuplicationCheck"
            }
        ]
    },
	headers=twitter_header
).json()

for t4_subtask in task4.get('subtasks', []):
	if 'open_account' in t4_subtask:
		authentication = t4_subtask['open_account']
		break
	elif 'enter_text' in t4_subtask:
		response_text = t4_subtask['enter_text']['hint_text']
		code = input(f'Requesting {response_text}: ')
		task5 = session.post('https://api.twitter.com/1.1/onboarding/task.json', json={
			"flow_token": task4.get('flow_token'),
			"subtask_inputs": [{
				"enter_text": {
					"suggestion_id": None,
					"text": code,
					"link": "next_link"
				},
				"subtask_id": "LoginAcid"
			}]
		}, headers=twitter_header).json()
		print(task5)
		for t5_subtask in task5.get('subtasks', []):
			print(t5_subtask)
			if 'open_account' in t5_subtask:
				authentication = t5_subtask['open_account']


print(authentication)
		
# {
# 	'attribution_event': 'login',
# 	'known_device_token': 'XXXXXXXXXXXXXXXXXXXXXX',
# 	'next_link': {
# 		'link_id': 'next_link',
# 		'link_type': 'subtask',
# 		'subtask_id': 'SuccessExit'
# 	},
# 	'oauth_token': 'XXXXXXXXXXXXXXXXXXXXXX',
# 	'oauth_token_secret': 'XXXXXXXXXXXXXXXXXXXXXX',
# 	'user': {
# 		'id': 'XXXXXXXXXXXXXXXXXXXXXX',
# 		'id_str': 'XXXXXXXXXXXXXXXXXXXXXX',
# 		'name': 'XXXXXXXXXXXXXXXXXXXXXX',
# 		'screen_name': 'XXXXXXXXXXXXXXXXXXXXXX'
# 	}
# }
> Back in August someone posted a script that gives you the auth token from a logged in account: [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1688495284) > > If someone can get it working, please share. Here you go ```python import requests import base64 username = 'XXXXXXXXXXXX' password = 'XXXXXXXXXXXX' TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w' TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys' TW_ANDROID_BASIC_TOKEN = 'Basic {token}'.format(token=base64.b64encode( (TW_CONSUMER_KEY + ":" + TW_CONSUMER_SECRET).encode() ).decode()) # print(TW_ANDROID_BASIC_TOKEN) authentication = None bearer_token_req = requests.post("https://api.twitter.com/oauth2/token", headers={ 'Authorization': TW_ANDROID_BASIC_TOKEN, "Content-Type": "application/x-www-form-urlencoded", }, data='grant_type=client_credentials' ).json() bearer_token = ' '.join(str(x) for x in bearer_token_req.values()) print(bearer_token) # The bearer token is immutable # Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F guest_token = requests.post("https://api.twitter.com/1.1/guest/activate.json", headers={ 'Authorization': bearer_token, }).json()['guest_token'] print(guest_token) twitter_header = { 'Authorization': bearer_token, "Content-Type": "application/json", "User-Agent": "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)", "X-Twitter-API-Version": '5', "X-Twitter-Client": "TwitterAndroid", "X-Twitter-Client-Version": "9.95.0-release.0", "OS-Version": "28", "System-User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)", "X-Twitter-Active-User": "yes", "X-Guest-Token": guest_token, } session = requests.Session() task1 = session.post('https://api.twitter.com/1.1/onboarding/task.json', params={ 'flow_name': 'login', 'api_version': '1', 'known_device_token': '', 'sim_country_code': 'us' }, json={ "flow_token": None, "input_flow_data": { "country_code": None, "flow_context": { "referrer_context": { "referral_details": "utm_source=google-play&utm_medium=organic", "referrer_url": "" }, "start_location": { "location": "deeplink" } }, "requested_variant": None, "target_user_id": 0 } }, headers=twitter_header ) session.headers['att'] = task1.headers.get('att') task2 = session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ "flow_token": task1.json().get('flow_token'), "subtask_inputs": [{ "enter_text": { "suggestion_id": None, "text": username, "link": "next_link" }, "subtask_id": "LoginEnterUserIdentifier" } ] }, headers=twitter_header ) task3 = session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ "flow_token": task2.json().get('flow_token'), "subtask_inputs": [{ "enter_password": { "password": password, "link": "next_link" }, "subtask_id": "LoginEnterPassword" } ], }, headers=twitter_header ) task4 = session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ "flow_token": task3.json().get('flow_token'), "subtask_inputs": [{ "check_logged_in_account": { "link": "AccountDuplicationCheck_false" }, "subtask_id": "AccountDuplicationCheck" } ] }, headers=twitter_header ).json() for t4_subtask in task4.get('subtasks', []): if 'open_account' in t4_subtask: authentication = t4_subtask['open_account'] break elif 'enter_text' in t4_subtask: response_text = t4_subtask['enter_text']['hint_text'] code = input(f'Requesting {response_text}: ') task5 = session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ "flow_token": task4.get('flow_token'), "subtask_inputs": [{ "enter_text": { "suggestion_id": None, "text": code, "link": "next_link" }, "subtask_id": "LoginAcid" }] }, headers=twitter_header).json() print(task5) for t5_subtask in task5.get('subtasks', []): print(t5_subtask) if 'open_account' in t5_subtask: authentication = t5_subtask['open_account'] print(authentication) # { # 'attribution_event': 'login', # 'known_device_token': 'XXXXXXXXXXXXXXXXXXXXXX', # 'next_link': { # 'link_id': 'next_link', # 'link_type': 'subtask', # 'subtask_id': 'SuccessExit' # }, # 'oauth_token': 'XXXXXXXXXXXXXXXXXXXXXX', # 'oauth_token_secret': 'XXXXXXXXXXXXXXXXXXXXXX', # 'user': { # 'id': 'XXXXXXXXXXXXXXXXXXXXXX', # 'id_str': 'XXXXXXXXXXXXXXXXXXXXXX', # 'name': 'XXXXXXXXXXXXXXXXXXXXXX', # 'screen_name': 'XXXXXXXXXXXXXXXXXXXXXX' # } # } ```
bokuwatotsukadesu commented 2024-01-29 08:06:58 -05:00 (Migrated from github.com)

What are chuds? Urban Dictionary says unattractive person. If that is the case, I think you will have to ban many respectable programmers. People should be recognised for their merit and skill, rather than their attraction level. If you hate the left that much, then go to a politics forum, instead of GitHub.

You ain't slick

What is slick? I am still learning some of these terms.

I do not know some of these American terms, so forgive me. I can only go off of things such as Urban Dictionary. My intention was not to insult programmers. Many are attractive. My point is, it does not matter how they look, because their skill is what matters.

> > What are chuds? Urban Dictionary says unattractive person. If that is the case, I think you will have to ban many respectable programmers. People should be recognised for their merit and skill, rather than their attraction level. If you hate the left that much, then go to a politics forum, instead of GitHub. > > You ain't slick What is slick? I am still learning some of these terms. >I do not know some of these American terms, so forgive me. I can only go off of things such as Urban Dictionary. My intention was not to insult programmers. Many are attractive. My point is, it does not matter how they look, because their skill is what matters.
wiredsis commented 2024-01-29 12:15:21 -05:00 (Migrated from github.com)

sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork

guest accounts updated we're back everyone

Can you share your script with me, please?

still using twitterminator, just curl a list from https://twitterminator.x86-64-unknown-linux-gnu.zip

though now i think i ran out of accounts...

> > > sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork > > > > > > guest accounts updated we're back everyone > > Can you share your script with me, please? still using twitterminator, just curl a list from https://twitterminator.x86-64-unknown-linux-gnu.zip though now i think i ran out of accounts...
wiredsis commented 2024-01-29 12:17:11 -05:00 (Migrated from github.com)

found some IPs fetching way too many requests coming from "node" user agents. here's how my blocklist is looking

location / {
    proxy_pass http://localhost:8081;
    deny 107.178.200.*;
    deny 167.99.186.11;
    deny 209.97.172.193;
}
found some IPs fetching way too many requests coming from "node" user agents. here's how my blocklist is looking ``` location / { proxy_pass http://localhost:8081; deny 107.178.200.*; deny 167.99.186.11; deny 209.97.172.193; } ```
nyanpasu64 commented 2024-01-29 14:22:39 -05:00 (Migrated from github.com)

You can't go public on one account at all, use this for local rss, etc.

Will my personal account get rate-limited or banned if I enter my credentials into a personal Nitter instance, and follow another medium-activity account (usually a few posts a day) using their RSS feed in Miniflux to automatically fetch their latest posts?

> You can't go public on one account at all, use this for local rss, etc. Will my personal account get rate-limited or banned if I enter my credentials into a personal Nitter instance, and follow another medium-activity account (usually a few posts a day) using their RSS feed in Miniflux to automatically fetch their latest posts?
jstetten commented 2024-01-29 19:17:05 -05:00 (Migrated from github.com)

This is currently the most official & active thread🧵 left to collectively discuss what options remain, if any, going forward. The more off-topic it gets, the sooner it'll get restricted, locked-off🔒, or archived forever...along with the rest of the project. Can we please use what little time we have left to positive brainstorming, only?

Giving thanks 💕 to @zedeus + all contributors & hosters for their amazing dedication all these years — putting in so much work to provide value to so many, for so long — is appropriate (and possibly the only thing left), too. @zedeus has proved himself to be one of the best! 🫡

This is currently the most official & active thread🧵 left to collectively discuss what options remain, if any, going forward. The more off-topic it gets, the sooner it'll get restricted, locked-off🔒, or archived forever...along with the rest of the project. Can we _please_ use what little time we have left to positive brainstorming, only? Giving thanks 💕 to @zedeus + all contributors & hosters for their amazing dedication all these years — putting in so much work to provide value to so many, for so long — is appropriate (and possibly the only thing left), too. @zedeus has proved himself to be one of the best! 🫡
Kingwordking commented 2024-01-29 20:34:56 -05:00 (Migrated from github.com)

sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork

guest accounts updated we're back everyone

Can you share your script with me, please?

still using twitterminator, just curl a list from https://twitterminator.x86-64-unknown-linux-gnu.zip

though now i think i ran out of accounts...

It is not possible to create new guest accounts, but the ones created previously can still be used.

> > > > sadly we dead over here on the mint.lgbt instance D: will try privacydev's fork > > > > > > > > > guest accounts updated we're back everyone > > > > > > Can you share your script with me, please? > > still using twitterminator, just curl a list from https://twitterminator.x86-64-unknown-linux-gnu.zip > > though now i think i ran out of accounts... It is not possible to create new guest accounts, but the ones created previously can still be used.
zedeus commented 2024-01-29 21:13:24 -05:00 (Migrated from github.com)

@stopmotio do you mean user+1@... user+2@...? I guess that's worth a try, but I wouldn't place my bets on it. Things that seem feasible at a small scale tend to break for Nitter. My instance (nitter.net obviously) usually did ~92k API requests per 15 minutes, or 100 per second. At that level you need a lot of accounts to put it lightly (I needed +50k guest accounts to avoid hitting rate limits).

@stopmotio do you mean user+1@... user+2@...? I guess that's worth a try, but I wouldn't place my bets on it. Things that seem feasible at a small scale tend to break for Nitter. My instance (nitter.net obviously) usually did ~92k API requests per 15 minutes, or 100 per second. At that level you need a lot of accounts to put it lightly (I needed +50k guest accounts to avoid hitting rate limits).
AlyoshaVasilieva commented 2024-01-29 21:25:07 -05:00 (Migrated from github.com)

Twitter supports plus indexing so you can have an infinite amount of accounts connected to one email.

At least when I signed up years ago, Twitter demanded I link a phone number within ~4 hours of using my account.

>Twitter supports plus indexing so you can have an infinite amount of accounts connected to one email. At least when I signed up years ago, Twitter demanded I link a phone number within ~4 hours of using my account.
lukefromdc commented 2024-01-30 01:02:47 -05:00 (Migrated from github.com)

Any way to create instances of this or something similar run locally by each user (as a "rogue twitter app") without an account and simply accepting rate limits? I would rather be limited to say, one timeline every 5 minutes than zero any day.

What about an algorithm to keep rate limited instances up, notify users that service will be restricted, then prioritizing access from IP addresses not seen in the last hour or so and as Twitter permits data to flow answering additional requests, with users asking for more than say, ten timelines or 100 tweets last in line but serviced if Twitter will alllow it.

Any way to create instances of this or something similar run locally by each user (as a "rogue twitter app") without an account and simply accepting rate limits? I would rather be limited to say, one timeline every 5 minutes than zero any day. What about an algorithm to keep rate limited instances up, notify users that service will be restricted, then prioritizing access from IP addresses not seen in the last hour or so and as Twitter permits data to flow answering additional requests, with users asking for more than say, ten timelines or 100 tweets last in line but serviced if Twitter will alllow it.
lukefromdc commented 2024-01-30 01:14:34 -05:00 (Migrated from github.com)

I just found that Twitter is refusing on their own site to desplay chronological timelines,
no doubt another attempt to force logins. I'l probably delete my entire text file of stored
Twitter usernames to watch if nitter cannot be saved or replaced.

I just found that Twitter is refusing on their own site to desplay chronological timelines, no doubt another attempt to force logins. I'l probably delete my entire text file of stored Twitter usernames to watch if nitter cannot be saved or replaced.
notherenorthere commented 2024-01-30 11:46:54 -05:00 (Migrated from github.com)

I just found that Twitter is refusing on their own site to desplay chronological timelines, no doubt another attempt to force logins. I'l probably delete my entire text file of stored Twitter usernames to watch if nitter cannot be saved or replaced.

Did they ever go back to chronological order? cause they had done that last year so that their most liked and rt'd stuff would pop before anything else, very annoying. I stopped checking after a few weeks I assumed it was never gonna return to the chronological order. It's not an issue if you're logged in though.

Kinda off topic but I noticed today on twt it gave error when trying to see /with replies, it suggested refreshing I did.. several times, nothing, So I checked only posts and worked fine, I checked again //with replies and then it worked. Not sure if it was a momentary glitch or a consequence of wtv it is those mfs are doing atm.

> I just found that Twitter is refusing on their own site to desplay chronological timelines, no doubt another attempt to force logins. I'l probably delete my entire text file of stored Twitter usernames to watch if nitter cannot be saved or replaced. Did they ever go back to chronological order? cause they had done that last year so that their most liked and rt'd stuff would pop before anything else, very annoying. I stopped checking after a few weeks I assumed it was never gonna return to the chronological order. It's not an issue if you're logged in though. Kinda off topic but I noticed today on twt it gave error when trying to see /with replies, it suggested refreshing I did.. several times, nothing, So I checked only posts and worked fine, I checked again //with replies and then it worked. Not sure if it was a momentary glitch or a consequence of wtv it is those mfs are doing atm.
lukefromdc commented 2024-01-30 13:38:53 -05:00 (Migrated from github.com)

For many years, non logged-in users were able to select the order in which tweets were to appear-but only on the desktop version not the mobile version. One of Musk's changes seems to be removing that option on the desktop site too.

Since I do not have an account and never will, no chronological time line when not logged in means Twitter is now useless to me except for reading single tweets to which I am sent or can find a direct link.

For many years, non logged-in users were able to select the order in which tweets were to appear-but only on the desktop version not the mobile version. One of Musk's changes seems to be removing that option on the desktop site too. Since I do not have an account and never will, no chronological time line when not logged in means Twitter is now useless to me except for reading single tweets to which I am sent or can find a direct link.
lukefromdc commented 2024-01-30 13:43:32 -05:00 (Migrated from github.com)

For the moment nitter.net can be used in GNOME web but cannot be used from Firefox, as GNOME web will allow you to bypass the certificate warning while Firefox won't, citing a site refusal to accept "insecure" connections and that being defined by FF as including bad certificates. There is probably an option somewhere in FF about:config to force this capability but I don't know where it is.

Assuming this dies with the guest accounts supporting it

For the moment nitter.net can be used in GNOME web but cannot be used from Firefox, as GNOME web will allow you to bypass the certificate warning while Firefox won't, citing a site refusal to accept "insecure" connections and that being defined by FF as including bad certificates. There is probably an option somewhere in FF about:config to force this capability but I don't know where it is. Assuming this dies with the guest accounts supporting it
pin-grid-array commented 2024-01-30 14:03:07 -05:00 (Migrated from github.com)

Since I do not have an account and never will, no chronological time line when not logged in means Twitter is now useless to me except for reading single tweets to which I am sent or can find a direct link.

Same here. I survive using RSS feeds, not so much for a full reading experience but rather as an alert system so that I know when a site has been updated. Nitter has been invaluable to me in that manner.

For the moment nitter.net can be used in GNOME web but cannot be used from Firefox, as GNOME web will allow you to bypass the certificate warning while Firefox won't, citing a site refusal to accept "insecure" connections and that being defined by FF as including bad certificates. There is probably an option somewhere in FF about:config to force this capability but I don't know where it is.

In about:config, try changing network.stricttransportsecurity.preloadlist to false.

> Since I do not have an account and never will, no chronological time line when not logged in means Twitter is now useless to me except for reading single tweets to which I am sent or can find a direct link. Same here. I survive using RSS feeds, not so much for a full reading experience but rather as an alert system so that I know when a site has been updated. Nitter has been invaluable to me in that manner. > For the moment nitter.net can be used in GNOME web but cannot be used from Firefox, as GNOME web will allow you to bypass the certificate warning while Firefox won't, citing a site refusal to accept "insecure" connections and that being defined by FF as including bad certificates. There is probably an option somewhere in FF about:config to force this capability but I don't know where it is. In `about:config`, try changing `network.stricttransportsecurity.preloadlist` to `false`.
ExperiencersInternational commented 2024-01-30 18:10:47 -05:00 (Migrated from github.com)

Any way to create instances of this or something similar run locally by each user (as a "rogue twitter app") without an account and simply accepting rate limits? I would rather be limited to say, one timeline every 5 minutes than zero any day.

What about an algorithm to keep rate limited instances up, notify users that service will be restricted, then prioritizing access from IP addresses not seen in the last hour or so and as Twitter permits data to flow answering additional requests, with users asking for more than say, ten timelines or 100 tweets last in line but serviced if Twitter will alllow it.

Something sorta locally exists, I'm using Squawker atm but it relies on guest accounts and it will soon die.

> Any way to create instances of this or something similar run locally by each user (as a "rogue twitter app") without an account and simply accepting rate limits? I would rather be limited to say, one timeline every 5 minutes than zero any day. > > What about an algorithm to keep rate limited instances up, notify users that service will be restricted, then prioritizing access from IP addresses not seen in the last hour or so and as Twitter permits data to flow answering additional requests, with users asking for more than say, ten timelines or 100 tweets last in line but serviced if Twitter will alllow it. Something sorta locally exists, I'm using Squawker atm but it relies on guest accounts and it will soon die.
theo546 commented 2024-01-31 09:43:58 -05:00 (Migrated from github.com)

Would creating an account using the Google Oauth bypass the captchas?
In an attempt to not get the account banned, wouldn't it be wise to use something like Selenium?
I get that it would get very resource intensive but maybe Twitter is seeing something is off because of the way the Nitter client is interacting with Twitter.

Would creating an account using the Google Oauth bypass the captchas? In an attempt to *not* get the account banned, wouldn't it be wise to use something like Selenium? I get that it would get very resource intensive but maybe Twitter is seeing something is off because of the way the Nitter client is interacting with Twitter.
JoeyJoJoJr commented 2024-01-31 17:58:56 -05:00 (Migrated from github.com)

For the moment nitter.net can be used in GNOME web but cannot be used from Firefox, as GNOME web will allow you to bypass the certificate warning while Firefox won't, citing a site refusal to accept "insecure" connections and that being defined by FF as including bad certificates. There is probably an option somewhere in FF about:config to force this capability but I don't know where it is.

Info here https://superuser.com/questions/1780337/let-firefox-accept-a-website-with-self-signed-certificate tl;dr HSTS needs to be turned off on the nitter.net webserver, that's what's forcing the refusal to accept any insecure connections.

> For the moment nitter.net can be used in GNOME web but cannot be used from Firefox, as GNOME web will allow you to bypass the certificate warning while Firefox won't, citing a site refusal to accept "insecure" connections and that being defined by FF as including bad certificates. There is probably an option somewhere in FF about:config to force this capability but I don't know where it is. Info here https://superuser.com/questions/1780337/let-firefox-accept-a-website-with-self-signed-certificate tl;dr HSTS needs to be turned off on the nitter.net webserver, that's what's forcing the refusal to accept any insecure connections.
ofifoto commented 2024-01-31 20:47:06 -05:00 (Migrated from github.com)

tl;dr HSTS needs to be turned off on the nitter.net webserver, that's what's forcing the refusal to accept any insecure connections.

nitter.net is HSTS preloaded so it would need to be removed from that list and then that change would need to be slowly propagated to all browsers' stable release channel. This would most likely take multiple months. There's probably a reason Zed hasn't renewed the certificate (it's easy to do), and while turning off HSTS enforcement in Firefox is absolutely not recommended if you care at all about security, it's that or use another browser to use nitter.net it seems.

> tl;dr HSTS needs to be turned off on the nitter.net webserver, that's what's forcing the refusal to accept any insecure connections. nitter.net is [HSTS preloaded](https://hstspreload.org/?domain=nitter.net) so it would need to be removed from that list and then that change would need to be slowly propagated to all browsers' stable release channel. This would most likely take multiple months. There's probably a reason Zed hasn't renewed the certificate (it's easy to do), and while turning off HSTS enforcement in Firefox is absolutely not recommended if you care at all about security, it's that or use another browser to use nitter.net it seems.
lukefromdc commented 2024-02-01 01:53:10 -05:00 (Migrated from github.com)

For the moment I can get though, thanks to forcing Firefox to allow clicking through the certificate warning in about: config. As a rule I NEVER willingly configure any program to override my orders to it. If you are not logging into a site and not moving private information, a man in the middle attack becomes a much lower risk. Logging into anything with a certifcate error is another matter

For the moment I can get though, thanks to forcing Firefox to allow clicking through the certificate warning in about: config. As a rule I NEVER willingly configure any program to override my orders to it. If you are not logging into a site and not moving private information, a man in the middle attack becomes a much lower risk. Logging into anything with a certifcate error is another matter
ghost commented 2024-02-01 06:02:02 -05:00 (Migrated from github.com)

But instances like privacydev that use permanent accounts will survive this, right? Especially if they are private.

No one is willing to continue to develop it in this case?

But instances like privacydev that use permanent accounts will survive this, right? Especially if they are private. No one is willing to continue to develop it in this case?
rossneilson commented 2024-02-01 15:38:11 -05:00 (Migrated from github.com)

But instances like privacydev that use permanent accounts will survive this, right? Especially if they are private.

No one is willing to continue to develop it in this case?

What's a permanent account for nitter? is there some way to use your own account to run a nitter instance?

> But instances like privacydev that use permanent accounts will survive this, right? Especially if they are private. > > No one is willing to continue to develop it in this case? What's a permanent account for nitter? is there some way to use your own account to run a nitter instance?
somini commented 2024-02-01 19:37:47 -05:00 (Migrated from github.com)

Back in August someone posted a script that gives you the auth token from a logged in account: #983 (comment)
If someone can get it working, please share.

Here you go

I ran this and I do get a OAuth token and secret from my account (I see an Android login on my account too), but my instance is rate-limited anyway. Has anyone actually used a real account to get a proper token? I only get intermittent service if I mix the other older guest accounts too.

> > Back in August someone posted a script that gives you the auth token from a logged in account: [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1688495284) > > If someone can get it working, please share. > > Here you go I ran this and I do get a OAuth token and secret from my account (I see an Android login on my account too), but my instance is rate-limited anyway. Has anyone actually used a real account to get a proper token? I only get intermittent service if I mix the other older guest accounts too.
Salastil commented 2024-02-01 20:53:20 -05:00 (Migrated from github.com)

But instances like privacydev that use permanent accounts will survive this, right? Especially if they are private.
No one is willing to continue to develop it in this case?

What's a permanent account for nitter? is there some way to use your own account to run a nitter instance?

You can generate an auth token from real regular Twitter accounts in the same manner that the guest_accounts.jsonl uses and operate the Nitter instance that way. But its likely impossible to get enough real twitter accounts to run a decent sized instance. Doing this route is just for private usage for people who want RSS capabilities and a lightweight frontend.

> > But instances like privacydev that use permanent accounts will survive this, right? Especially if they are private. > > No one is willing to continue to develop it in this case? > > What's a permanent account for nitter? is there some way to use your own account to run a nitter instance? You can generate an auth token from real regular Twitter accounts in the same manner that the guest_accounts.jsonl uses and operate the Nitter instance that way. But its likely impossible to get enough real twitter accounts to run a decent sized instance. Doing this route is just for private usage for people who want RSS capabilities and a lightweight frontend.
cmj commented 2024-02-02 01:47:55 -05:00 (Migrated from github.com)

Back in August someone posted a script that gives you the auth token from a logged in account: #983 (comment)
If someone can get it working, please share.

Here you go

I ran this and I do get a OAuth token and secret from my account (I see an Android login on my account too), but my instance is rate-limited anyway. Has anyone actually used a real account to get a proper token? I only get intermittent service if I mix the other older guest accounts too.

If your twitter account is older that 30 days you need to remove the age check, see here

If you want to see how old your account is, use this simple script:

#!/bin/bash
# return timestamp of Twitter id/post

# Bitwise left shift of 22, removing sequence number, data center id, and
# machine id, leaving only the milliseconds epoch time of transaction

id=$1
d=$((($id>>22)+1288834974657)); LC_TIME=en_GB date -d @${d:: -3}

Your twitter ID is the snowflake portion before the dash in "oauth_token" that's returned, you of course can find your account ID via other methods. Everyone trying to use old accounts need to remove age checks.

You should just remove it regardless if you want to keep using nitter.

> > > Back in August someone posted a script that gives you the auth token from a logged in account: [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1688495284) > > > If someone can get it working, please share. > > > > > > Here you go > > I ran this and I do get a OAuth token and secret from my account (I see an Android login on my account too), but my instance is rate-limited anyway. Has anyone actually used a real account to get a proper token? I only get intermittent service if I mix the other older guest accounts too. If your twitter account is older that 30 days you need to remove the age check, [see here](https://github.com/zedeus/nitter/issues/1155#issuecomment-1917167072) If you want to see how old your account is, use this simple script: ```bash #!/bin/bash # return timestamp of Twitter id/post # Bitwise left shift of 22, removing sequence number, data center id, and # machine id, leaving only the milliseconds epoch time of transaction id=$1 d=$((($id>>22)+1288834974657)); LC_TIME=en_GB date -d @${d:: -3} ``` Your twitter ID is the snowflake portion before the dash in "oauth_token" that's returned, you of course can find your account ID via other methods. Everyone trying to use old accounts need to remove age checks. You should just remove it regardless if you want to keep using nitter.
lukefromdc commented 2024-02-02 15:19:23 -05:00 (Migrated from github.com)

New problem: Twitter is now shuffling at least some timelines when viewed over Nitter, same as not logged in on their own site. I think the world is almost done with Twitter.

New problem: Twitter is now shuffling at least some timelines when viewed over Nitter, same as not logged in on their own site. I think the world is almost done with Twitter.
nukeop commented 2024-02-02 15:34:00 -05:00 (Migrated from github.com)

I think the world is almost done with Twitter.

It's still as popular as ever. Mastodon didn't make a dent in their userbase.

> I think the world is almost done with Twitter. It's still as popular as ever. Mastodon didn't make a dent in their userbase.
lukefromdc commented 2024-02-02 15:42:24 -05:00 (Migrated from github.com)

Unfortunately, in my community I have seen a major migration to Instagram (which I BLOCK as it is owned by Meta) as people have largely walked away from or closed their Twitter accounts. I have told people that if they want me to be present at events they must inform me directly as I can no longer see their promos posted to any of the corporate owned sites. Twitter used to be an exception. Nitter bought me another six months or so.

Unfortunately, in my community I have seen a major migration to Instagram (which I BLOCK as it is owned by Meta) as people have largely walked away from or closed their Twitter accounts. I have told people that if they want me to be present at events they must inform me directly as I can no longer see their promos posted to any of the corporate owned sites. Twitter used to be an exception. Nitter bought me another six months or so.
ghost commented 2024-02-02 17:55:06 -05:00 (Migrated from github.com)

I'd like to point out that now it is apparently possible to make a Twitter account through Tor without using a phone number now. You have to go through 20 captchas, though, also 10minutemail doesn't work. So it's definitely possible for Nitter in that case lmao

My attempt was a failure, the captcha always restarted for no reason. I ended up creating it with firefox and then trying tor, but even with 2FA it was repeatedly flagged as suspicious. When trying to reactivate it with tor the captcha was so broken I couldn't even try.

The good part is that even after that it didn't ask me for a phone number.

> I'd like to point out that now it is apparently possible to make a Twitter account through Tor without using a phone number now. You have to go through 20 captchas, though, also 10minutemail doesn't work. So it's definitely possible for Nitter in that case lmao My attempt was a failure, the captcha always restarted for no reason. I ended up creating it with firefox and then trying tor, but even with 2FA it was repeatedly flagged as suspicious. When trying to reactivate it with tor the captcha was so broken I couldn't even try. The good part is that even after that it didn't ask me for a phone number.
pin-grid-array commented 2024-02-04 06:03:11 -05:00 (Migrated from github.com)

New problem: Twitter is now shuffling at least some timelines when viewed over Nitter, same as not logged in on their own site. I think the world is almost done with Twitter.

Could you point out some timelines where you've seen this happening? Also, did you notice it happening on a specific public instance, or for all instances?

> New problem: Twitter is now shuffling at least some timelines when viewed over Nitter, same as not logged in on their own site. I think the world is almost done with Twitter. Could you point out some timelines where you've seen this happening? Also, did you notice it happening on a specific public instance, or for all instances?
lukefromdc commented 2024-02-04 12:24:03 -05:00 (Migrated from github.com)

Tests were on the nitter.net instance and on every timeline checked. If this was
not the case during someone else's test it may have been a one-off. I do NOT
recall which timelines I was checking though

On 2/4/2024 at 11:03 AM, "pin-grid-array" @.***> wrote:

New problem: Twitter is now shuffling at least some timelines
when viewed over Nitter, same as not logged in on their own site.
I think the world is almost done with Twitter.

Could you point out some timelines where you've seen this
happening? Also, did you notice it happening on a specific public
instance, or for all instances?

--
Reply to this email directly or view it on GitHub:
https://github.com/zedeus/nitter/issues/983#issuecomment-1925703042
You are receiving this because you were mentioned.

Message ID: @.***>

Tests were on the nitter.net instance and on every timeline checked. If this was not the case during someone else's test it may have been a one-off. I do NOT recall which timelines I was checking though On 2/4/2024 at 11:03 AM, "pin-grid-array" ***@***.***> wrote: > >> New problem: Twitter is now shuffling at least some timelines >when viewed over Nitter, same as not logged in on their own site. >I think the world is almost done with Twitter. > >Could you point out some timelines where you've seen this >happening? Also, did you notice it happening on a specific public >instance, or for all instances? > >-- >Reply to this email directly or view it on GitHub: >https://github.com/zedeus/nitter/issues/983#issuecomment-1925703042 >You are receiving this because you were mentioned. > >Message ID: ***@***.***>
somini commented 2024-02-04 15:48:52 -05:00 (Migrated from github.com)

@cmj See #1164, I'll check if this change works for me.

@cmj See #1164, I'll check if this change works for me.
pin-grid-array commented 2024-02-04 16:24:59 -05:00 (Migrated from github.com)

Tests were on the nitter.net instance and on every timeline checked. If this was not the case during someone else's test it may have been a one-off. I do NOT recall which timelines I was checking though

Interesting. I haven't encountered that myself, not on any timelines or any public instances. I really, really hope it's just a one-off, as you said. If chronological timelines disappear, I personally will have zero reason to ever look at Twitter again.

> Tests were on the nitter.net instance and on every timeline checked. If this was not the case during someone else's test it may have been a one-off. I do NOT recall which timelines I was checking though Interesting. I haven't encountered that myself, not on any timelines or any public instances. I really, really hope it's just a one-off, as you said. If chronological timelines disappear, I personally will have zero reason to ever look at Twitter again.
ExperiencersInternational commented 2024-02-04 19:06:08 -05:00 (Migrated from github.com)

Not sure whether it's of concern but my timeline has completely stopped working in Squawker now even with closing and reopening it

I'm able to view profiles, my following and saved tweets just fine but not the timeline

No errors appear either
Screenshot_2024-02-05-00-03-25-907_org ca squawker

Not sure whether it's of concern but my timeline has completely stopped working in Squawker now even with closing and reopening it I'm able to view profiles, my following and saved tweets just fine but not the timeline No errors appear either ![Screenshot_2024-02-05-00-03-25-907_org ca squawker](https://github.com/zedeus/nitter/assets/56035537/17b719c9-e498-4f3f-aa91-da777ea033cf)
drpepper66 commented 2024-02-04 19:46:11 -05:00 (Migrated from github.com)

@cmj why do you claim that guest accounts can be used past 30d? this has been tested in the past and just wasn't true. do you believe there was a recent change?

@cmj why do you claim that guest accounts can be used past 30d? this has been tested in the past and just wasn't true. do you believe there was a recent change?
cmj commented 2024-02-05 10:06:56 -05:00 (Migrated from github.com)

@drpepper66 I'm not. This is regarding using an oauth token with a 'real' account, since guest accounts can no longer be acquired. The confusing part is probably using the same guest_accounts.json file to store the token for now.

Yes, guest accounts expired after 30 days. If your real account has an id/created_on date over 30 days ago nitter will not load the account (and remove it if your new account age is over 30-days). So the only way to use older accounts is to remove that 30-day-check. Hope that makes sense.

I've been running it just fine with a 5-month-old throwaway account for internal use. Formatted /.health page:
Total accounts: 1 | Rate limited: 0 | Oldest: Sep 06, 2023 | Newest: Sep 06, 2023 | Avg: Sep 06, 2023

There is a python script in one of these threads to quickly obtain the oauth token using account credentials.

@drpepper66 I'm not. This is regarding using an oauth token with a 'real' account, since guest accounts can no longer be acquired. The confusing part is probably using the same ```guest_accounts.json``` file to store the token for now. Yes, guest accounts expired after 30 days. If your _real_ account has an id/created_on date over 30 days ago nitter will not load the account (and remove it if your new account age is over 30-days). So the only way to use older accounts is to remove that 30-day-check. Hope that makes sense. I've been running it just fine with a 5-month-old throwaway account for internal use. Formatted /.health page: ```Total accounts: 1 | Rate limited: 0 | Oldest: Sep 06, 2023 | Newest: Sep 06, 2023 | Avg: Sep 06, 2023``` There is a python script in one of these threads to quickly obtain the oauth token using account credentials.
blackthornecl commented 2024-02-05 14:53:11 -05:00 (Migrated from github.com)

@drpepper66 I'm not. This is regarding using an oauth token with a 'real' account, since guest accounts can no longer be acquired. The confusing part is probably using the same guest_accounts.json file to store the token for now.

Yes, guest accounts expired after 30 days. If your real account has an id/created_on date over 30 days ago nitter will not load the account (and remove it if your new account age is over 30-days). So the only way to use older accounts is to remove that 30-day-check. Hope that makes sense.

I've been running it just fine with a 5-month-old throwaway account for internal use. Formatted /.health page: Total accounts: 1 | Rate limited: 0 | Oldest: Sep 06, 2023 | Newest: Sep 06, 2023 | Avg: Sep 06, 2023

There is a python script in one of these threads to quickly obtain the oauth token using account credentials.

Hi, where's the "30 days ago check" to disabled it?

> @drpepper66 I'm not. This is regarding using an oauth token with a 'real' account, since guest accounts can no longer be acquired. The confusing part is probably using the same `guest_accounts.json` file to store the token for now. > > Yes, guest accounts expired after 30 days. If your _real_ account has an id/created_on date over 30 days ago nitter will not load the account (and remove it if your new account age is over 30-days). So the only way to use older accounts is to remove that 30-day-check. Hope that makes sense. > > I've been running it just fine with a 5-month-old throwaway account for internal use. Formatted /.health page: `Total accounts: 1 | Rate limited: 0 | Oldest: Sep 06, 2023 | Newest: Sep 06, 2023 | Avg: Sep 06, 2023` > > There is a python script in one of these threads to quickly obtain the oauth token using account credentials. Hi, where's the "30 days ago check" to disabled it?
cmj commented 2024-02-05 15:07:31 -05:00 (Migrated from github.com)

You still have to be using the guest_accounts branch.
Comment out line 205 and build as usual:

github.com/zedeus/nitter@52db03b73a/src/auth.nim (L205)

Copy over your oauth_token and oauth_token_secret from your registered account to a fresh guest_accounts.json like before.
Clearly not the best method but works for now until the dust settles.


And again, one of these methods should help you obtain an oauth token for your account

https://github.com/zedeus/nitter/issues/983#issuecomment-1688495284
https://gist.github.com/cmj/c45c46d9dd11fa2d4ba4de55c50598e6
https://gist.github.com/cmj/998f59680e3549e7f181057074eccaa3

You still have to be using the guest_accounts branch. Comment out line 205 and build as usual: https://github.com/zedeus/nitter/blob/52db03b73ad5f83f67c83ab197ae3b20a2523d39/src/auth.nim#L205 Copy over your oauth_token and oauth_token_secret from your registered account to a fresh guest_accounts.json like before. Clearly not the best method but works for now until the dust settles. --- And again, one of these methods should help you obtain an oauth token for your account https://github.com/zedeus/nitter/issues/983#issuecomment-1688495284 https://gist.github.com/cmj/c45c46d9dd11fa2d4ba4de55c50598e6 https://gist.github.com/cmj/998f59680e3549e7f181057074eccaa3
thomas-333 commented 2024-02-06 05:54:49 -05:00 (Migrated from github.com)

@cmj

What is the life of a real account oauth token before the script needs to be run again to obtain a new one?

@cmj What is the life of a real account oauth token before the script needs to be run again to obtain a new one?
cmj commented 2024-02-06 09:32:18 -05:00 (Migrated from github.com)

@thomas-333 That part I'm not entirely sure of. Per docs, they last indefinitely.

Obtaining Access Tokens using 3-legged OAuth flow

To perform actions on behalf of another user, you'll need to obtain their access tokens. Access tokens specify the Twitter account the request is made on behalf of, so for you to obtain these they will need to first grant you access. These tokens do not expire but can be revoked by the user at any time.

But since these are for login sessions and not app permissions, they might be treated differently. Coincidentally, I do have an account with an active session sitting at 87 days, so I'll see if it gets revoked at the 90-day mark (which seems to be the standard for sessions) soon.

One could just create a @monthly cron job that updates the token to forget about it.

@thomas-333 That part I'm not entirely sure of. Per docs, they last indefinitely. > [Obtaining Access Tokens using 3-legged OAuth flow ](https://developer.twitter.com/en/docs/authentication/oauth-1-0a/obtaining-user-access-tokens) > To perform actions on behalf of another user, you'll need to obtain their access tokens. Access tokens specify the Twitter account the request is made on behalf of, so for you to obtain these they will need to first grant you access. **These tokens do not expire but can be revoked by the user at any time.** But since these are for login sessions and not app permissions, they might be treated differently. Coincidentally, I do have an account with an active session sitting at 87 days, so I'll see if it gets revoked at the 90-day mark (which seems to be the standard for sessions) soon. One could just create a ```@monthly``` cron job that updates the token to forget about it.
somini commented 2024-02-07 15:06:06 -05:00 (Migrated from github.com)

https://aur.archlinux.org/packages/nitter-git

In case anyone uses Arch, the AUR package includes the @cmj patch to disable the expiration check, so you can use you tokens, see #1164.

I'm also running this with my very old personal account and it works well for a personal instance with a few users. This seems like the best way forward.

https://aur.archlinux.org/packages/nitter-git In case anyone uses Arch, the AUR package includes the @cmj patch to disable the expiration check, so you can use you tokens, see #1164. I'm also running this with my very old personal account and it works well for a personal instance with a few users. This seems like the best way forward.
DrSocket commented 2024-02-12 01:28:34 -05:00 (Migrated from github.com)

https://aur.archlinux.org/packages/nitter-git

In case anyone uses Arch, the AUR package includes the @cmj patch to disable the expiration check, so you can use you tokens, see #1164.

I'm also running this with my very old personal account and it works well for a personal instance with a few users. This seems like the best way forward.

you don't have any problems with pagination? if you go to page 4-5 of a tweets search?

> https://aur.archlinux.org/packages/nitter-git > > In case anyone uses Arch, the AUR package includes the @cmj patch to disable the expiration check, so you can use you tokens, see #1164. > > I'm also running this with my very old personal account and it works well for a personal instance with a few users. This seems like the best way forward. you don't have any problems with pagination? if you go to page 4-5 of a tweets search?
somini commented 2024-02-14 04:56:21 -05:00 (Migrated from github.com)

you don't have any problems with pagination? if you go to page 4-5 of a tweets search?

Works for me, with some rate limits, using a "real" account.

> you don't have any problems with pagination? if you go to page 4-5 of a tweets search? Works for me, with some rate limits, using a "real" account.
ShadowJonathan commented 2024-02-14 05:08:05 -05:00 (Migrated from github.com)

How exactly could you add your own account to nitter again?

How exactly could you add your own account to nitter again?
pin-grid-array commented 2024-02-14 10:44:25 -05:00 (Migrated from github.com)
> How exactly could you add your own account to nitter again? I think there are different ways to go about doing it but unfortunately all of their instructions are buried in this and other threads. Here's what I could find: 1. https://github.com/zedeus/nitter/issues/983#issuecomment-1688495284 2. https://github.com/zedeus/nitter/issues/983#issuecomment-1688549459 3. https://github.com/zedeus/nitter/issues/983#issuecomment-1914616663 4. https://github.com/zedeus/nitter/issues/983#issuecomment-1923046398 5. https://github.com/zedeus/nitter/issues/983#issuecomment-1928010494 6. https://github.com/zedeus/nitter/issues/1155#issuecomment-1917167072 7. https://github.com/zedeus/nitter/issues/1155#issuecomment-1917812979 8. https://github.com/zedeus/nitter/issues/1155#issuecomment-1951602687
somini commented 2024-02-14 19:34:49 -05:00 (Migrated from github.com)

#1164 and https://github.com/zedeus/nitter/issues/983#issuecomment-1914616663 worked for me.

The videos no longer work, though.

#1164 and https://github.com/zedeus/nitter/issues/983#issuecomment-1914616663 worked for me. The videos no longer work, though.
TempUser13 commented 2024-02-16 09:37:42 -05:00 (Migrated from github.com)

Could someone write a tutorial for setting up nitter for a local rss reader using an account?

Could someone write a tutorial for setting up nitter for a local rss reader using an account?
KTachibanaM commented 2024-02-17 02:01:23 -05:00 (Migrated from github.com)

@TempUser13 Glad you asked :) I was working on it exactly and had it here https://github.com/sekai-soft/freebird

I was able to run a private Nitter and miniflux instance locally on my NAS and had been using it for a while without trouble.

@TempUser13 Glad you asked :) I was working on it exactly and had it here https://github.com/sekai-soft/freebird I was able to run a private Nitter and miniflux instance locally on my NAS and had been using it for a while without trouble.
animegrafmays commented 2024-02-17 02:07:18 -05:00 (Migrated from github.com)

@TempUser13 Glad you asked :) I was working on it exactly and had it here https://github.com/sekai-soft/freebird

I was able to run a private Nitter and miniflux instance locally on my NAS and had been using it for a while without trouble.

this doesn't help anybody at all, it's just a way for you to self flagellate

@TempUser13 there are guides here but utilizing your own account is super easy using a python script in here (sorry to the author i dont care to look for the source now it's literally buried now)

basically:

  1. checkout the guest accounts branch of nitter
  2. make a file in the root directory with guest_accounts.jsonl. as the filename
  3. use one of these scripts to generate the contents of guest_accounts.jsonl
  4. do not EVER give people like @KTachibanaM anything including money
> @TempUser13 Glad you asked :) I was working on it exactly and had it here https://github.com/sekai-soft/freebird > > I was able to run a private Nitter and miniflux instance locally on my NAS and had been using it for a while without trouble. this doesn't help anybody at all, it's just a way for you to self flagellate @TempUser13 there are guides here but utilizing your own account is super easy using a python script in here (sorry to the author i dont care to look for the source now it's literally buried now) basically: 1. checkout the guest accounts branch of nitter 2. make a file in the root directory with guest_accounts.jsonl. as the filename 3. use [one of these scripts](https://github.com/zedeus/nitter/issues/983#issuecomment-1944095658) to generate the contents of guest_accounts.jsonl 4. do not EVER give people like @KTachibanaM anything including money
Apachez- commented 2024-02-17 03:07:25 -05:00 (Migrated from github.com)

Message over at the nitter-mirror https://n.opnxng.com/ :

17.02
Nitter is over. Twitter blocked the last known way to access their network without a user account. Thank you to Zedeus for developing the project over the years.
Learn the story of X.

Links from above message:

https://arstechnica.com/tech-policy/2024/02/twitter-front-end-nitter-dies-as-musk-wins-war-against-third-party-services/

https://liberapay.com/zedeus/

https://soundcloud.com/trueanonpod/sets/the-lamest-show-on-earth

Message over at the nitter-mirror https://n.opnxng.com/ : > 17.02 > Nitter is over. Twitter blocked the last known way to access their network without a user account. Thank you to Zedeus for developing the project over the years. > Learn the story of X. > Links from above message: https://arstechnica.com/tech-policy/2024/02/twitter-front-end-nitter-dies-as-musk-wins-war-against-third-party-services/ https://liberapay.com/zedeus/ https://soundcloud.com/trueanonpod/sets/the-lamest-show-on-earth
animegrafmays commented 2024-02-17 03:13:58 -05:00 (Migrated from github.com)

not over. I've been running nitter both publically and privately with accounts older than 2016 with great results. nitter run as a free service might be over but some operators who choose to run it at no cost (or by donation) it's 100% viable.

I also ran a week of tests with 25 suspended accounts -- you can use suspended accounts with nitter but graphql randomly blocks (or maybe nitter doensnt handle rendering them). in my tests using 25 accounts I could see:

disclosetv: 4
bnonews: 11
bnofeed: 17
elonmusk: 12
nasa: 21

suspended accounts can see all of these users, suspended accounts can be used to view timelines normally on nitter but graphql is limiting viewing some accounts and i haven't figured out why yet.

not over. I've been running nitter both publically and privately with accounts older than 2016 with great results. nitter run as a free service might be over but some operators who choose to run it at no cost (or by donation) it's 100% viable. I also ran a week of tests with 25 suspended accounts -- you can use suspended accounts with nitter but graphql randomly blocks (or maybe nitter doensnt handle rendering them). in my tests using 25 accounts I could see: disclosetv: 4 bnonews: 11 bnofeed: 17 elonmusk: 12 nasa: 21 suspended accounts can see all of these users, suspended accounts can be used to view timelines normally on nitter but graphql is limiting viewing some accounts and i haven't figured out why yet.
animegrafmays commented 2024-02-17 03:17:35 -05:00 (Migrated from github.com)

@zedeus I have about 100 guest accounts from 2022-2023 that are just suspended accounts, you wanna meet up on matrix and check out what im talking about?

@zedeus I have about 100 guest accounts from 2022-2023 that are just suspended accounts, you wanna meet up on matrix and check out what im talking about?
animegrafmays commented 2024-02-17 03:28:57 -05:00 (Migrated from github.com)

example of public facing with aged accounts - avg requests are 4-8000. limited accounts have only been maybe 10-20 max daily. they reset every 12 hours

image

multi works: https://nitter.poast.org/nasa,cnn,msnbc,twitter/

pagination past 4 pages works. you just need >15 accounts to make it work. this seems like a nitter limitation more than twitter maybe?

final edit: i forgot to mention I tried this with accounts from 2022-2024 and accounts from 2010-2016 and the limits for the latter are almost nonexistent. 2022-2024 accounts have maybe 10x the limit of the guest accounts -- 15 of them would burn out publicly in an hour on the same server im running 72 2010-2016 accounts on daily burning out 20-22 accounts total

example of public facing with aged accounts - avg requests are 4-8000. limited accounts have only been maybe 10-20 max daily. they reset every 12 hours ![image](https://github.com/zedeus/nitter/assets/71434691/d571f9c1-6312-40b0-a22b-9c893fac3328) multi works: https://nitter.poast.org/nasa,cnn,msnbc,twitter/ pagination past 4 pages works. you just need >15 accounts to make it work. this seems like a nitter limitation more than twitter maybe? final edit: i forgot to mention I tried this with accounts from 2022-2024 and accounts from 2010-2016 and the limits for the latter are almost nonexistent. 2022-2024 accounts have maybe 10x the limit of the guest accounts -- 15 of them would burn out publicly in an hour on the same server im running 72 2010-2016 accounts on daily burning out 20-22 accounts total
Apachez- commented 2024-02-17 04:03:23 -05:00 (Migrated from github.com)

multi works: https://nitter.poast.org/nasa,cnn,msnbc,twitter/

I assume that mirror is private since Im getting this when trying to connect:

This page isn’t working
nitter.poast.org didn’t send any data.
ERR_EMPTY_RESPONSE
> > multi works: https://nitter.poast.org/nasa,cnn,msnbc,twitter/ > I assume that mirror is private since Im getting this when trying to connect: ``` This page isn’t working nitter.poast.org didn’t send any data. ERR_EMPTY_RESPONSE ```
animegrafmays commented 2024-02-17 04:04:05 -05:00 (Migrated from github.com)

multi works: https://nitter.poast.org/nasa,cnn,msnbc,twitter/

I assume that mirror is private since Im getting this when trying to connect:

This page isn’t working
nitter.poast.org didn’t send any data.
ERR_EMPTY_RESPONSE

not private. just heavily restricted. you're either visiting from an IP I've blocked or you are using an out of date browser

> > multi works: https://nitter.poast.org/nasa,cnn,msnbc,twitter/ > > I assume that mirror is private since Im getting this when trying to connect: > > ``` > This page isn’t working > nitter.poast.org didn’t send any data. > ERR_EMPTY_RESPONSE > ``` not private. just heavily restricted. you're either visiting from an IP I've blocked or you are using an out of date browser
nukeop commented 2024-02-17 07:08:58 -05:00 (Migrated from github.com)

How would a website know if my browser is or isn't "out of date" whatever that means?

How would a website know if my browser is or isn't "out of date" whatever that means?
animegrafmays commented 2024-02-17 09:02:59 -05:00 (Migrated from github.com)

How would a website know if my browser is or isn't "out of date" whatever that means?

The User-Agent request header is a characteristic string that lets servers and network peers identify the application, operating system, vendor, and/or version of the requesting user agent.

>How would a website know if my browser is or isn't "out of date" whatever that means? _The User-Agent [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header) is a characteristic string that lets servers and network peers identify the application, operating system, vendor, and/or version of the requesting [user agent](https://developer.mozilla.org/en-US/docs/Glossary/User_agent)._
nukeop commented 2024-02-17 13:49:15 -05:00 (Migrated from github.com)

So it's a wildly inaccurate guess

So it's a wildly inaccurate guess
somini commented 2024-02-19 14:10:45 -05:00 (Migrated from github.com)

@animegrafmays On the "guest_account" branch, do the videos work? What's the specific commit you are using?

That's the only missing feature I can tell with a "real" account.

@animegrafmays On the "guest_account" branch, do the videos work? What's the specific commit you are using? That's the only missing feature I can tell with a "real" account.
animegrafmays commented 2024-02-19 14:13:20 -05:00 (Migrated from github.com)

@animegrafmays On the "guest_account" branch, do the videos work? What's the specific commit you are using?

using the guest accounts branch here, the latest commit. nothing modified. videos and multi only work with more than 5 accounts. as far as I can tell it's related maybe to how the data is fetched

here is an example: https://nitter.poast.org/NASAUniverse/status/1758594049991225404

our nitter currently has 74 account tokens from accounts aged older than 2016 as newer accounts have much worse limits

edit: just checked with a private instance I run for our fediverse bots that has two accounts and videos play so the limitation must just be 2

> @animegrafmays On the "guest_account" branch, do the videos work? What's the specific commit you are using? using the guest accounts branch here, the latest commit. nothing modified. videos and multi only work with more than 5 accounts. as far as I can tell it's related maybe to how the data is fetched here is an example: https://nitter.poast.org/NASAUniverse/status/1758594049991225404 our nitter currently has 74 account tokens from accounts aged older than 2016 as newer accounts have much worse limits edit: just checked with a private instance I run for our fediverse bots that has two accounts and videos play so the limitation must just be 2
jack555444 commented 2024-02-19 16:33:35 -05:00 (Migrated from github.com)

That video works fine for me using 1 real account just as long as proxy video is disabled.

That video works fine for me using 1 real account just as long as proxy video is disabled.
zedeus commented 2024-02-19 19:44:44 -05:00 (Migrated from github.com)

@animegrafmays it's a cool discovery, but I wonder how feasible it is. I'm not sure crowdsourcing suspended/old accounts would particularly successful, and Twitter would likely close the suspended access loophole. /.health should give you some rate limit info, but your instance returns 403.

@animegrafmays it's a cool discovery, but I wonder how feasible it is. I'm not sure crowdsourcing suspended/old accounts would particularly successful, and Twitter would likely close the suspended access loophole. `/.health` should give you some rate limit info, but your instance returns 403.
animegrafmays commented 2024-02-19 19:48:43 -05:00 (Migrated from github.com)

I'm not sure crowdsourcing suspended/old accounts would particularly successful

the people who use my fediverse instance originated because they were suspended on twitter, im sure out of 31k users we could drum up quite a bit but for the normal person i agree it's probably not as easy as say spinning up a new account

/.health should give you some rate limit info, but your instance returns 403.

this was oversight, you can view it now. anything i can do to aid in facilitating the use of nitter by other operators let me know, I'm open to whatever

edit: the instance domain is actually pointing at two servers so to get a proper estimation you'd need both
https://nitter-west.poast.org/.health
https://nitter-central.poast.org/.health

>I'm not sure crowdsourcing suspended/old accounts would particularly successful the people who use my fediverse instance originated because they were suspended on twitter, im sure out of 31k users we could drum up quite a bit but for the normal person i agree it's probably not as easy as say spinning up a new account >`/.health` should give you some rate limit info, but your instance returns 403. this was oversight, you can view it now. anything i can do to aid in facilitating the use of nitter by other operators let me know, I'm open to whatever edit: the instance domain is actually pointing at two servers so to get a proper estimation you'd need both https://nitter-west.poast.org/.health https://nitter-central.poast.org/.health
zedeus commented 2024-02-19 19:55:42 -05:00 (Migrated from github.com)

I'm surprised your traffic is so relatively low with most instances having died, nitter.net was getting 8-12x more 24/7 for months leading up to the guest account creation removal, despite heavy anti-bot measures.

I'm surprised your traffic is so relatively low with most instances having died, nitter.net was getting 8-12x more 24/7 for months leading up to the guest account creation removal, despite heavy anti-bot measures.
animegrafmays commented 2024-02-19 19:56:59 -05:00 (Migrated from github.com)

combined it's about 12-14k avg. I've been heavy handed with blocks. I had preemptively blocked the status page and blocked github referrals (removed it earlier today for the example post above) so it's mitigated some of that hand off traffic. have lots of ranges blocked from previous scraping as well

combined it's about 12-14k avg. I've been heavy handed with blocks. I had preemptively blocked the status page and blocked github referrals (removed it earlier today for the example post above) so it's mitigated some of that hand off traffic. have lots of ranges blocked from previous scraping as well
zedeus commented 2024-02-19 19:59:29 -05:00 (Migrated from github.com)

I blocked every cloud range and actively blocked abusive ranges and IPs, plus many user agents and all requests without standard headers, but it was never quite enough.

I blocked every cloud range and actively blocked abusive ranges and IPs, plus many user agents and all requests without standard headers, but it was never quite enough.
zedeus commented 2024-02-19 20:01:12 -05:00 (Migrated from github.com)

I also used fail2ban to ban IPs hitting nginx rate limits, and a custom setup to ban IPs not fetching static files served by nitter. Helped a lot, but traffic climbed back up.

I also used fail2ban to ban IPs hitting nginx rate limits, and a custom setup to ban IPs not fetching static files served by nitter. Helped a lot, but traffic climbed back up.
animegrafmays commented 2024-02-19 20:02:06 -05:00 (Migrated from github.com)
$ cat /etc/nginx/conf.d/ipblocks.conf | wc -l
318

these are at minimum /24 but most are /16. that config also doesn't include amazon, oracle et al:

$ cat /etc/nginx/conf.d/amazon.conf | wc -l
14003
$ cat /etc/nginx/conf.d/oracle.conf | wc -l
1648

I've been working on this for a little over a week

``` $ cat /etc/nginx/conf.d/ipblocks.conf | wc -l 318 ``` these are at minimum /24 but most are /16. that config also doesn't include amazon, oracle et al: ``` $ cat /etc/nginx/conf.d/amazon.conf | wc -l 14003 ``` ``` $ cat /etc/nginx/conf.d/oracle.conf | wc -l 1648 ``` I've been working on this for a little over a week
zedeus commented 2024-02-19 20:04:56 -05:00 (Migrated from github.com)

Blocking Tor wasn't a goal, so that's fine. I suspect a lot of traffic came from mobile proxy providers.

Blocking Tor wasn't a goal, so that's fine. I suspect a lot of traffic came from mobile proxy providers.
untitaker commented 2024-02-19 20:11:41 -05:00 (Migrated from github.com)

@stopmotio my personal experience as nitter operator matches Zed's: Tor is a small portion of traffic overall and entirely insignificant when it comes to abuse. I had the data to figure that out. Even if 100% of my Tor traffic was abuse, I would not have cared because the volume was so low.

The load from cloud providers was by far the most significant (particularly AWS doesn't care what people do on their servers) and yet also easiest to block. Residential proxies/mobile proxies/botnets were a close second, and much harder to block.

I ran the same mixture of heuristics as Zed, and the biggest problem were mobile proxies and things that looked like it. Your regular abuse/DoS rules don't apply here, and so for example Cloudflare does not help much without additional config. Scrapers are specifically written for Nitter instances, and unless we're talking about showing CAPTCHAs for every user, the abuse prevention had to be as well.

@stopmotio my personal experience as nitter operator matches Zed's: Tor is a small portion of traffic overall and entirely insignificant when it comes to abuse. I had the data to figure that out. Even if 100% of my Tor traffic was abuse, I would not have cared because the volume was so low. The load from cloud providers was by far the most significant (particularly AWS doesn't care what people do on their servers) and yet also easiest to block. Residential proxies/mobile proxies/botnets were a close second, and much harder to block. I ran the same mixture of heuristics as Zed, and the biggest problem were mobile proxies and things that looked like it. Your regular abuse/DoS rules don't apply here, and so for example Cloudflare does not help much without additional config. Scrapers are specifically written for Nitter instances, and unless we're talking about showing CAPTCHAs for every user, the abuse prevention had to be as well.
notherenorthere commented 2024-02-20 11:23:53 -05:00 (Migrated from github.com)

particularly

@animegrafmays On the "guest_account" branch, do the videos work? What's the specific commit you are using?

using the guest accounts branch here, the latest commit. nothing modified. videos and multi only work with more than 5 accounts. as far as I can tell it's related maybe to how the data is fetched

here is an example: https://nitter.poast.org/NASAUniverse/status/1758594049991225404

our nitter currently has 74 account tokens from accounts aged older than 2016 as newer accounts have much worse limits

edit: just checked with a private instance I run for our fediverse bots that has two accounts and videos play so the limitation must just be 2

is it dead? I get error but didn't really refresh it that many times (I assume most people are trying to use that instance)

Edit: I refreshed it and it worked. not so sure about the video but that status is displaying with its replies too

> particularly > > @animegrafmays On the "guest_account" branch, do the videos work? What's the specific commit you are using? > > using the guest accounts branch here, the latest commit. nothing modified. videos and multi only work with more than 5 accounts. as far as I can tell it's related maybe to how the data is fetched > > here is an example: https://nitter.poast.org/NASAUniverse/status/1758594049991225404 > > our nitter currently has 74 account tokens from accounts aged older than 2016 as newer accounts have much worse limits > > edit: just checked with a private instance I run for our fediverse bots that has two accounts and videos play so the limitation must just be 2 is it dead? I get error but didn't really refresh it that many times (I assume most people are trying to use that instance) Edit: I refreshed it and it worked. not so sure about the video but that status is displaying with its replies too
compuguy commented 2024-02-20 15:07:24 -05:00 (Migrated from github.com)

multi works: https://nitter.poast.org/nasa,cnn,msnbc,twitter/

I assume that mirror is private since Im getting this when trying to connect:

This page isn’t working
nitter.poast.org didn’t send any data.
ERR_EMPTY_RESPONSE

not private. just heavily restricted. you're either visiting from an IP I've blocked or you are using an out of date browser

I'm honestly not sure why one would block of a US ISP's IPv4 addresses (at least in my case). I'm pretty sure I'm using a recent version of a chromium based browser....😕

> > > multi works: https://nitter.poast.org/nasa,cnn,msnbc,twitter/ > > > > > > I assume that mirror is private since Im getting this when trying to connect: > > ``` > > This page isn’t working > > nitter.poast.org didn’t send any data. > > ERR_EMPTY_RESPONSE > > ``` > > not private. just heavily restricted. you're either visiting from an IP I've blocked or you are using an out of date browser I'm honestly not sure why one would block of a US ISP's IPv4 addresses (at least in my case). I'm *pretty sure* I'm using a recent version of a chromium based browser....😕
animegrafmays commented 2024-02-20 17:01:55 -05:00 (Migrated from github.com)

there's no AAAA record so it has nothing to do with IPv6 as it is IPv4 only.

I'm honestly not sure why one would block an entire ISP's IPv6 block

one of the largest DDoS botnets runs on Hetzner and almost exclusively abuses their v6 ranges. thats a perfectly valid reason for doing such. but this is not something that has been done on this nitter instance.

there's no AAAA record so it has nothing to do with IPv6 as it is IPv4 only. `I'm honestly not sure why one would block an entire ISP's IPv6 block` one of the largest DDoS botnets runs on Hetzner and almost exclusively abuses their v6 ranges. thats a perfectly valid reason for doing such. but this is not something that has been done on this nitter instance.
compuguy commented 2024-02-20 18:38:28 -05:00 (Migrated from github.com)

there's no AAAA record so it has nothing to do with IPv6 as it is IPv4 only.

I'm honestly not sure why one would block an entire ISP's IPv6 block

one of the largest DDoS botnets runs on Hetzner and almost exclusively abuses their v6 ranges. thats a perfectly valid reason for doing such. but this is not something that has been done on this nitter instance.

(Apologies all for the slight segue here.)

My bad. I assumed your Nitter instance was dual stack (I've edited my previous comment to correct for that). I'm still not sure why you would restrict/block access to your instance from a block of IPv4 addresses from a major US ISP. I personally think its a bit brute force for ISPs, but that's just me. Then again it seems like your services attract quite a bit of hostile traffic (https://github.com/zedeus/nitter/issues/983#issuecomment-1953328407)....

> there's no AAAA record so it has nothing to do with IPv6 as it is IPv4 only. > > `I'm honestly not sure why one would block an entire ISP's IPv6 block` > > one of the largest DDoS botnets runs on Hetzner and almost exclusively abuses their v6 ranges. thats a perfectly valid reason for doing such. but this is not something that has been done on this nitter instance. (Apologies all for the slight segue here.) My bad. I assumed your Nitter instance was dual stack (I've edited my previous comment to correct for that). I'm still not sure why you would restrict/block access to your instance from a block of IPv4 addresses from a major US ISP. I personally think its a bit brute force for ISPs, but that's just me. Then again it seems like your services attract quite a bit of hostile traffic (https://github.com/zedeus/nitter/issues/983#issuecomment-1953328407)....
compuguy commented 2024-02-20 20:55:36 -05:00 (Migrated from github.com)

Why not rate-limit the Nitter server, or better yet, use a bunch of throwaway accounts, each browsing at an undetectable speed?

I'm sure that is possible.... though the end-user experience would probably be quite poor for a public instance with the traffic volume of say @animegrafmays' instance. That and you're just playing a game of cat-and-mouse with Twitter/Xitter. It's not a long term sustainable strategy. Private instances seem to be the future. One person mentioned a guide to deploy an instance to a Synology NAS: https://github.com/zedeus/nitter/issues/983#issuecomment-1949859380, this PR #830, and this Nitter forks pre_guest_accounts (https://github.com/PrivacyDevel/nitter/tree/pre_guest_accounts) branch.

> Why not rate-limit the Nitter server, or better yet, use a bunch of throwaway accounts, each browsing at an undetectable speed? I'm sure that *is* possible.... though the end-user experience would probably be quite poor for a public instance with the traffic volume of say @animegrafmays' instance. That and you're just playing a game of cat-and-mouse with Twitter/Xitter. It's not a long term sustainable strategy. Private instances seem to be the future. One person mentioned a guide to deploy an instance to a Synology NAS: https://github.com/zedeus/nitter/issues/983#issuecomment-1949859380, this PR #830, and this Nitter forks pre_guest_accounts (https://github.com/PrivacyDevel/nitter/tree/pre_guest_accounts) branch.
lukefromdc commented 2024-02-20 20:59:29 -05:00 (Migrated from github.com)

A private instance may not be useful if the point is to avoid having a Twitter account. I will simply stop trying to read Twitter timelines at all if I cannot get them in chronologicial order without an account. Elon Musk can clean my toilet.

A private instance may not be useful if the point is to avoid having a Twitter account. I will simply stop trying to read Twitter timelines at all if I cannot get them in chronologicial order without an account. Elon Musk can clean my toilet.
anibalburdo commented 2024-02-21 04:05:02 -05:00 (Migrated from github.com)

Twstalker still works, amazingly. Is it because very few people use it, and it gets under Musk's radar?

Twstalker still works, amazingly. Is it because very few people use it, and it gets under Musk's radar?
telekinemon commented 2024-02-21 04:16:59 -05:00 (Migrated from github.com)

Has anyone tried and had any success in automating user account creation? Seems like that could help public instances survive but the captcha seems like a big issue...

Has anyone tried and had any success in automating user account creation? Seems like that could help public instances survive but the captcha seems like a big issue...
ExperiencersInternational commented 2024-02-21 06:42:24 -05:00 (Migrated from github.com)

@animegrafmays On the "guest_account" branch, do the videos work? What's the specific commit you are using?

using the guest accounts branch here, the latest commit. nothing modified. videos and multi only work with more than 5 accounts. as far as I can tell it's related maybe to how the data is fetched

here is an example: https://nitter.poast.org/NASAUniverse/status/1758594049991225404

our nitter currently has 74 account tokens from accounts aged older than 2016 as newer accounts have much worse limits

edit: just checked with a private instance I run for our fediverse bots that has two accounts and videos play so the limitation must just be 2

Not the best place to say it but thank you for keeping nitter.poast.org running, seems to be the last Nitter server now and we desperately need it (I run @splatoon@wetdry.world on fedi).

Still works really well, I'm not sure how we would be continuing on without your service (I assume bird.makeup isn't doing that well lol).

> > @animegrafmays On the "guest_account" branch, do the videos work? What's the specific commit you are using? > > using the guest accounts branch here, the latest commit. nothing modified. videos and multi only work with more than 5 accounts. as far as I can tell it's related maybe to how the data is fetched > > here is an example: https://nitter.poast.org/NASAUniverse/status/1758594049991225404 > > our nitter currently has 74 account tokens from accounts aged older than 2016 as newer accounts have much worse limits > > edit: just checked with a private instance I run for our fediverse bots that has two accounts and videos play so the limitation must just be 2 Not the best place to say it but thank you for keeping nitter.poast.org running, seems to be the last Nitter server now and we desperately need it (I run @splatoon@wetdry.world on fedi). Still works really well, I'm not sure how we would be continuing on without your service (I assume bird.makeup isn't doing that well lol).
animegrafmays commented 2024-02-21 11:13:49 -05:00 (Migrated from github.com)

I assume bird.makeup isn't doing that well

he was still scraping our instance up until a couple days ago. I asked him publicly why he was still doing it and it seems to have stopped

I run @splatoon@wetdry.world on fedi

if you reach out to me on there I will give you access to a private ip-whitelisted instance I run just for bots, that way you're not limited by the current measures I've put in place on the public one

>I assume bird.makeup isn't doing that well he was still scraping our instance up until a couple days ago. I asked him publicly why he was still doing it and it seems to have stopped >I run @[splatoon@wetdry.world](mailto:splatoon@wetdry.world) on fedi if you reach out to me on there I will give you access to a private ip-whitelisted instance I run just for bots, that way you're not limited by the current measures I've put in place on the public one
lukefromdc commented 2024-02-21 14:23:56 -05:00 (Migrated from github.com)

I am still using nitter.net, with Firefox set never to override user choices in overriding the certificate error. Since I am not logging into anything and those are public posts I am reading, an MITM attack isn't worth much.

I am still using nitter.net, with Firefox set never to override user choices in overriding the certificate error. Since I am not logging into anything and those are public posts I am reading, an MITM attack isn't worth much.
somini commented 2024-02-21 16:51:06 -05:00 (Migrated from github.com)

Can anyone with a private account actually watch videos on nitter? If so, what's the exact commit you are running to perform that black magic?

Can anyone with a private account actually watch videos on nitter? If so, what's the exact commit you are running to perform that black magic?
zedeus commented 2024-02-21 18:11:08 -05:00 (Migrated from github.com)

Videos should work again with the latest guest_accounts commit.

Videos should work again with the latest guest_accounts commit.
ExperiencersInternational commented 2024-02-21 18:33:52 -05:00 (Migrated from github.com)

Can anyone with a private account actually watch videos on nitter? If so, what's the exact commit you are running to perform that black magic?

I tested earlier on nitter.poast.org with a video on NintendoUK which had the latest Splatoon song lol

> Can anyone with a private account actually watch videos on nitter? If so, what's the exact commit you are running to perform that black magic? I tested earlier on nitter.poast.org with a video on NintendoUK which had the latest Splatoon song lol
compuguy commented 2024-02-22 04:19:37 -05:00 (Migrated from github.com)

I am still using nitter.net, with Firefox set never to override user choices in overriding the certificate error. Since I am not logging into anything and those are public posts I am reading, an MITM attack isn't worth much.

Not sure exactly how you're doing that when nitter.ner has an expired cert + HTTP Strict Transfer Security (HSTS) enabled.....😕

> I am still using nitter.net, with Firefox set never to override user choices in overriding the certificate error. Since I am not logging into anything and those are public posts I am reading, an MITM attack isn't worth much. Not sure exactly how you're doing that when nitter.ner has an expired cert + HTTP Strict Transfer Security (HSTS) enabled.....😕
animegrafmays commented 2024-02-22 04:22:05 -05:00 (Migrated from github.com)

Not sure exactly how you're doing that when nitter.ner has an expired cert + HTTP Strict Transfer Security (HSTS) enabled.....😕

he explained how in his post. im starting to question your username

> Not sure exactly how you're doing that when nitter.ner has an expired cert + HTTP Strict Transfer Security (HSTS) enabled.....😕 he explained how in his post. im starting to question your username
compuguy commented 2024-02-22 04:32:22 -05:00 (Migrated from github.com)

Not sure exactly how you're doing that when nitter.ner has an expired cert + HTTP Strict Transfer Security (HSTS) enabled.....😕

he explained how in his post. im starting to question your username

You do understand that your GitHub issue has roughly 683 comments, right? I probably did read @lukefromdc's comment at some point. Him or someone else is using another tool to scrape those instances.

he explained how in his post. im starting to question your username

Let's not go down that road....and stay somewhat civil?

> > Not sure exactly how you're doing that when nitter.ner has an expired cert + HTTP Strict Transfer Security (HSTS) enabled.....😕 > > he explained how in his post. im starting to question your username > You do understand that your GitHub issue has roughly *683* comments, right? I probably did read @lukefromdc's comment at some point. Him or someone else is using another tool to scrape those instances. > he explained how in his post. im starting to question your username > Let's not go down that road....and stay *somewhat* civil?
animegrafmays commented 2024-02-22 04:36:46 -05:00 (Migrated from github.com)

Let's not go down that road....and stay somewhat civil?

sure, you are replying to a public issue i created and every time you do that i get an email. in an effort to try to aid the issue i raised and to prevent getting multiple emails about the same issue or comment i try to be as descriptive as possible. getting an email at 3am from you that says "Let's not go down that road....and stay somewhat civil?"

> Let's not go down that road....and stay _somewhat_ civil? sure, you are replying to a public issue i created and every time you do that i get an email. in an effort to try to aid the issue i raised and to prevent getting multiple emails about the same issue or comment i try to be as descriptive as possible. getting an email at 3am from you that says "Let's not go down that road....and stay somewhat civil?"
lukefromdc commented 2024-02-22 13:09:32 -05:00 (Migrated from github.com)

Not sure exactly how you're doing that when nitter.ner has an expired cert + HTTP Strict Transfer Security (HSTS) enabled.....😕

he explained how in his post. im starting to question your username

You do understand that your GitHub issue has roughly 683 comments, right? I probably did read @lukefromdc's comment at some point. Him or someone else is using another tool to scrape those instances.

he explained how in his post. im starting to question your username

Let's not go down that road....and stay somewhat civil?

I would not even know HOW to set up a scraper. Rather I use nitter instances to manually monitor remaining Twitter timelines from my community. This is because of Twitter's refusal to show chronological timelines (the only kind useful to me) without an account.

> > > Not sure exactly how you're doing that when nitter.ner has an expired cert + HTTP Strict Transfer Security (HSTS) enabled.....😕 > > > > > > he explained how in his post. im starting to question your username > > You do understand that your GitHub issue has roughly _683_ comments, right? I probably did read @lukefromdc's comment at some point. Him or someone else is using another tool to scrape those instances. > > > he explained how in his post. im starting to question your username > > Let's not go down that road....and stay _somewhat_ civil? I would not even know HOW to set up a scraper. Rather I use nitter instances to manually monitor remaining Twitter timelines from my community. This is because of Twitter's refusal to show chronological timelines (the only kind useful to me) without an account.
lukefromdc commented 2024-02-22 23:59:41 -05:00 (Migrated from github.com)

Again: to get past the certificate issue in Firefox (do NOT login to anything showing a certificate error!):
1: open about:config
2: set network.stricttransportsecurity.preloadlist to false

Again: to get past the certificate issue in Firefox (do NOT login to anything showing a certificate error!): 1: open about:config 2: set `network.stricttransportsecurity.preloadlist` to `false`
animegrafmays commented 2024-02-23 12:52:00 -05:00 (Migrated from github.com)

in my experience over the last week it appears twitter limits based on account+ip. using the same list of guest accounts on two dedicated server they are always different. right now there's 11 accounts limited on one server and 6 on the other. i wonder if we can use this to our advantage, perhaps a shared pool of accounts would actually work

in my experience over the last week it appears twitter limits based on account+ip. using the same list of guest accounts on two dedicated server they are always different. right now there's 11 accounts limited on one server and 6 on the other. i wonder if we can use this to our advantage, perhaps a shared pool of accounts would actually work
nukeop commented 2024-02-23 14:32:33 -05:00 (Migrated from github.com)

There are tons of websites that list public proxies in residential areas. 90% don't work, but if you can sift through them they're very useful for scraping.

There are tons of websites that list public proxies in residential areas. 90% don't work, but if you can sift through them they're very useful for scraping.
animegrafmays commented 2024-02-25 14:17:26 -05:00 (Migrated from github.com)

@animegrafmays can i ask why your instance is shown as not healthy at https://status.d420.de/ ?

sure. being listed on that page is a death sentence. the warning on the top of the page begging people to not scrape instances is ignored. being scraped is bad. so the status page is blocked so we don't show up. i still also aggressively monitor logs for scraping attempts and have blocked entire AS ranges from major providers (google, aws, digitalocean)

>@animegrafmays can i ask why your instance is shown as not healthy at https://status.d420.de/ ? sure. being listed on that page is a death sentence. the warning on the top of the page begging people to not scrape instances is ignored. _being scraped is bad_. so the status page is blocked so we don't show up. i still also aggressively monitor logs for scraping attempts and have blocked entire AS ranges from major providers (google, aws, digitalocean)
sthalik commented 2024-02-25 14:19:10 -05:00 (Migrated from github.com)

Twitter recently broke videos on Nitter. Can somebody please fix them?

Twitter recently broke videos on Nitter. Can somebody please fix them?
animegrafmays commented 2024-02-25 14:20:27 -05:00 (Migrated from github.com)

Twitter recently broke videos on Nitter. Can somebody please fix them?

try this: https://github.com/zedeus/nitter/pull/1178

>Twitter recently broke videos on Nitter. Can somebody please fix them? try this: https://github.com/zedeus/nitter/pull/1178
somini commented 2024-02-25 22:11:08 -05:00 (Migrated from github.com)

Videos should work again with the latest guest_accounts commit.

Can confirm cdff5e9 works, thanks a lot.

@zedeus #1164 is still needed with older accounts.

> Videos should work again with the latest guest_accounts commit. Can confirm cdff5e9 works, thanks a lot. @zedeus #1164 is still needed with older accounts.
zedeus commented 2024-02-25 22:13:28 -05:00 (Migrated from github.com)

@somini I coincidentally merged that right before you commented

@somini I coincidentally merged that right before you commented
MoonlessForest commented 2024-02-26 17:21:28 -05:00 (Migrated from github.com)

not private. just heavily restricted. you're either visiting from an IP I've blocked or you are using an out of date browser

Oddly, I can only access your instance through a VPN, despite never having used it before. Do you block certain country IPs or dynamic IPs? Or is something wrong on my end?
(not OP)

> not private. just heavily restricted. you're either visiting from an IP I've blocked or you are using an out of date browser Oddly, I can only access your instance through a VPN, despite never having used it before. Do you block certain country IPs or dynamic IPs? Or is something wrong on my end? (not OP)
animegrafmays commented 2024-02-26 17:25:49 -05:00 (Migrated from github.com)

Do you block certain country IPs or dynamic IPs? Or is something wrong on my end?

if three or more IPs in a /24 range have been blocked by fail2ban the entire /24 will get blocked. you can email the first two octets of your ip to graf at poast.org and i will look but that's more than likely what it is

>Do you block certain country IPs or dynamic IPs? Or is something wrong on my end? if three or more IPs in a /24 range have been blocked by fail2ban the entire /24 will get blocked. you can email the first two octets of your ip to graf at poast.org and i will look but that's more than likely what it is
MoonlessForest commented 2024-02-26 18:33:27 -05:00 (Migrated from github.com)

if three or more IPs in a /24 range have been blocked by fail2ban the entire /24 will get blocked. you can email the first two octets of your ip to graf at poast.org and i will look but that's more than likely what it is

Uh... That's far too advanced for me, I'm afraid... I don't even know what a "24 range" is... Should I email you my current IP?

> if three or more IPs in a /24 range have been blocked by fail2ban the entire /24 will get blocked. you can email the first two octets of your ip to graf at poast.org and i will look but that's more than likely what it is Uh... That's far too advanced for me, I'm afraid... I don't even know what a "24 range" is... Should I email you my current IP?
animegrafmays commented 2024-02-26 18:49:24 -05:00 (Migrated from github.com)

that is what i was asking for, yes

that is what i was asking for, yes
MoonlessForest commented 2024-02-26 19:11:13 -05:00 (Migrated from github.com)

that is what i was asking for, yes

Ah, "Graf" is your username! Still, I'm too dumb and couldn't find a way to contact you directly, so I just sent an email to Poast support.

> that is what i was asking for, yes Ah, "Graf" is your username! Still, I'm too dumb and couldn't find a way to contact you directly, so I just sent an email to Poast support.
ln2max commented 2024-03-03 03:04:04 -05:00 (Migrated from github.com)

If we have reached the point where instances have to carefully ration requests:

@zedeus how hard would it be to implement caching/database storage of Tweets?

Most likely a significant portion of requests are for the same (popular) Tweets over and over again. If instances store or cache Tweets, they don't have to spend their request budget getting the same Tweets repeatedly.

Yes I did check the other issues, the closest I could find is #288.

Even more useful would be a collaborative or shared cache used by multiple Nitter instances. This would effectively pool their accounts and request budgets, without disadvantaging any instance operator or requiring them to sacrifice request budget to help others. (EDIT: nevermind, #1188 discusses this)

If we have reached the point where instances have to carefully ration requests: @zedeus how hard would it be to implement caching/database storage of Tweets? Most likely a significant portion of requests are for the same (popular) Tweets over and over again. If instances store or cache Tweets, they don't have to spend their request budget getting the same Tweets repeatedly. Yes I did check the other issues, the closest I could find is #288. Even more useful would be a collaborative or shared cache used by multiple Nitter instances. This would effectively pool their accounts and request budgets, without disadvantaging any instance operator or requiring them to sacrifice request budget to help others. (EDIT: nevermind, #1188 discusses this)
animegrafmays commented 2024-03-03 03:06:55 -05:00 (Migrated from github.com)

I have been told some instances are caching certain users but I've not been told how yet, so I would be for something like this. maybe 2-3 requests in a short time would suffice to trigger some kind of caching. you could probably do it with nginx but im not sure how you would cache the data returned that way. I've been caching twitter media on a 3h expiry and it's helped a lot

I have been told some instances are caching certain users but I've not been told how yet, so I would be for something like this. maybe 2-3 requests in a short time would suffice to trigger some kind of caching. you could probably do it with nginx but im not sure how you would cache the data returned that way. I've been caching twitter media on a 3h expiry and it's helped a lot
ln2max commented 2024-03-03 03:12:38 -05:00 (Migrated from github.com)

@animegrafmays Yeah, it seems like caching was once done more extensively but reduced for performance reasons (unfortunately I can't find the issue anymore). Now since it's a choice between slow loading and not loading, even a very large and not very performant cache is better than being unable to load Tweets.

@animegrafmays Yeah, it seems like caching was once done more extensively but reduced for performance reasons (unfortunately I can't find the issue anymore). Now since it's a choice between slow loading and not loading, even a very large and not very performant cache is better than being unable to load Tweets.
ln2max commented 2024-03-03 03:31:07 -05:00 (Migrated from github.com)

This might also help a lot in dealing with scrapers -- they are probably some of the worst offenders in requesting the same major accounts.

This might also help a lot in dealing with scrapers -- they are probably some of the worst offenders in requesting the same major accounts.
anibalburdo commented 2024-03-11 17:46:11 -04:00 (Migrated from github.com)

Twstalker is doing funny things: when someone quotes a tweet, the quoted tweet repeats what the quoter says.
image

Twstalker is doing funny things: when someone quotes a tweet, the quoted tweet repeats what the quoter says. ![image](https://github.com/zedeus/nitter/assets/160721509/757eaadc-2876-4cce-a9e8-d9f93108e6dd)
robindz commented 2024-03-11 18:00:36 -04:00 (Migrated from github.com)

@animegrafmays Hey, how/where can I contact you to whitelist my IP for nitter.poast.org :) ?

@animegrafmays Hey, how/where can I contact you to whitelist my IP for [nitter.poast.org](https://nitter.poast.org/) :) ?
animegrafmays commented 2024-03-11 19:03:00 -04:00 (Migrated from github.com)

im not in the market of 'whitelisting' IPs. you can email me at graf @ poast.org and I can see why yours is blocked, but I'm not whitelisting people

im not in the market of 'whitelisting' IPs. you can email me at graf @ poast.org and I can see why yours is blocked, but I'm not whitelisting people
Trit34 commented 2024-03-12 05:17:43 -04:00 (Migrated from github.com)

im not in the market of 'whitelisting' IPs. you can email me at graf @ poast.org and I can see why yours is blocked, but I'm not whitelisting people

@animegrafmays Mine is blocked too, maybe because I use the RSS feeds for some accounts (~ 10). I set them to fetch new posts once per hour on my browsers, instead of every 30 minutes. Before I e-mail you, could you confirm that it could have been a cause of “ERR_CONNECTION_REFUSED”?

> im not in the market of 'whitelisting' IPs. you can email me at graf @ poast.org and I can see why yours is blocked, but I'm not whitelisting people @animegrafmays Mine is blocked too, maybe because I use the RSS feeds for some accounts (~ 10). I set them to fetch new posts once per hour on my browsers, instead of every 30 minutes. Before I e-mail you, could you confirm that it could have been a cause of “ERR_CONNECTION_REFUSED”?
animegrafmays commented 2024-03-12 05:20:27 -04:00 (Migrated from github.com)

this github issue is not an issue tracker for your connection issues to my nitter instance. please stop shitting up this github issue by triggering an email every single time you respond and instead use the contact methods i've presented in this thread already

this github issue is not an issue tracker for your connection issues to my nitter instance. please stop shitting up this github issue by triggering an email every single time you respond and instead use the contact methods i've presented in this thread already
ExperiencersInternational commented 2024-03-12 06:18:04 -04:00 (Migrated from github.com)

im not in the market of 'whitelisting' IPs. you can email me at graf @ poast.org and I can see why yours is blocked, but I'm not whitelisting people

@animegrafmays Mine is blocked too, maybe because I use the RSS feeds for some accounts (~ 10). I set them to fetch new posts once per hour on my browsers, instead of every 30 minutes. Before I e-mail you, could you confirm that it could have been a cause of “ERR_CONNECTION_REFUSED”?

I have never had an issue with the RSS feeds lately, I get them fine with Power Automate and Element Feeds.

Fully agree with the fact we are clogging up but it's not like I can move this to fediverse (the servers I am on block poa.st because of allowing some undesirable people that were on certain platforms that's all).

> > im not in the market of 'whitelisting' IPs. you can email me at graf @ poast.org and I can see why yours is blocked, but I'm not whitelisting people > > @animegrafmays Mine is blocked too, maybe because I use the RSS feeds for some accounts (~ 10). I set them to fetch new posts once per hour on my browsers, instead of every 30 minutes. Before I e-mail you, could you confirm that it could have been a cause of “ERR_CONNECTION_REFUSED”? I have never had an issue with the RSS feeds lately, I get them fine with Power Automate and Element Feeds. Fully agree with the fact we are clogging up but it's not like I can move this to fediverse (the servers I am on block poa.st because of allowing some undesirable people that were on certain platforms that's all).
Yetangitu commented 2024-03-12 13:21:41 -04:00 (Migrated from github.com)

@animegrafmays Mine is blocked too ...

the servers I am on block poa.st ...

The solution to all your problems is to host these services yourself. One of the common SBC or an old laptop - screen not required - is more than enough to run an instance of Pleroma (for your fediverse needs), Nitter, Libreddit, Invidious (Youtube proxy) and even Peertube if you go easy on the transcodes. That way you are neither a burden to others nor beholden to them. You may get blocked by the 'purple-hair crowd' on Mastodon but that is more or less unavoidable unless you want to become part of that crowd yourself. As long as you behave sensibly - and why wouldn't you? - you should be able to federate with the world and its dog, minus the aforementioned block-happy group.

Of course all this assumes you either have a stable internet connection at home to which you can attach said SBC or laptop or thin client or what have you or can splurge a few ${currency_unit} for a lightweight VPS somewhere. It does not take much in the way of technical prowess to get these things to run, you can even go the way of e.g. Yunohost or CapRover although you'll probably soon get tired of their restrictions and lack of flexibility.

> > @animegrafmays Mine is blocked too ... > > the servers I am on block poa.st ... The solution to all your problems is to host these services yourself. One of the common SBC or an old laptop - screen not required - is more than enough to run an instance of [Pleroma](https://pleroma.social/) (for your fediverse needs), Nitter, [Libreddit](https://github.com/libreddit/libreddit), [Invidious](https://github.com/iv-org/invidious) (Youtube proxy) and even [Peertube](https://github.com/Chocobozzz/PeerTube) if you go easy on the transcodes. That way you are neither a burden to others nor beholden to them. You may get blocked by the 'purple-hair crowd' on Mastodon but that is more or less unavoidable unless you want to become part of that crowd yourself. As long as you behave sensibly - and why wouldn't you? - you should be able to federate with the world and its dog, minus the aforementioned block-happy group. Of course all this assumes you either have a stable internet connection at home to which you can attach said SBC or laptop or thin client or what have you _or_ can splurge a few `${currency_unit}` for a lightweight VPS somewhere. It does not take much in the way of technical prowess to get these things to run, you can even go the way of e.g. [Yunohost](https://yunohost.org/#/) or [CapRover](https://caprover.com/) although you'll probably soon get tired of their restrictions and lack of flexibility.
lukefromdc commented 2024-03-12 15:38:53 -04:00 (Migrated from github.com)

For those of us with no landline, a need to self-host a service simply to access Twitter content is the same as Twitter not being usable.

For those of us with no landline, a need to self-host a service simply to access Twitter content is the same as Twitter not being usable.
ExperiencersInternational commented 2024-03-12 16:17:21 -04:00 (Migrated from github.com)

@animegrafmays Mine is blocked too ...

the servers I am on block poa.st ...

The solution to all your problems is to host these services yourself. One of the common SBC or an old laptop - screen not required - is more than enough to run an instance of Pleroma (for your fediverse needs), Nitter, Libreddit, Invidious (Youtube proxy) and even Peertube if you go easy on the transcodes. That way you are neither a burden to others nor beholden to them. You may get blocked by the 'purple-hair crowd' on Mastodon but that is more or less unavoidable unless you want to become part of that crowd yourself. As long as you behave sensibly - and why wouldn't you? - you should be able to federate with the world and its dog, minus the aforementioned block-happy group.

Of course all this assumes you either have a stable internet connection at home to which you can attach said SBC or laptop or thin client or what have you or can splurge a few ${currency_unit} for a lightweight VPS somewhere. It does not take much in the way of technical prowess to get these things to run, you can even go the way of e.g. Yunohost or CapRover although you'll probably soon get tired of their restrictions and lack of flexibility.

Wow, amazing information. If I was able to, I would have done so already. I have no experience with hosting stuff and there's no chance of me running up a cable to connect a device.

Using a VPS seems expensive too, a local company wants £3 for their lowest tier a month.

@lukefromdc how is a landline related to this?

> > > @animegrafmays Mine is blocked too ... > > > > > > the servers I am on block poa.st ... > > The solution to all your problems is to host these services yourself. One of the common SBC or an old laptop - screen not required - is more than enough to run an instance of [Pleroma](https://pleroma.social/) (for your fediverse needs), Nitter, [Libreddit](https://github.com/libreddit/libreddit), [Invidious](https://github.com/iv-org/invidious) (Youtube proxy) and even [Peertube](https://github.com/Chocobozzz/PeerTube) if you go easy on the transcodes. That way you are neither a burden to others nor beholden to them. You may get blocked by the 'purple-hair crowd' on Mastodon but that is more or less unavoidable unless you want to become part of that crowd yourself. As long as you behave sensibly - and why wouldn't you? - you should be able to federate with the world and its dog, minus the aforementioned block-happy group. > > Of course all this assumes you either have a stable internet connection at home to which you can attach said SBC or laptop or thin client or what have you _or_ can splurge a few `${currency_unit}` for a lightweight VPS somewhere. It does not take much in the way of technical prowess to get these things to run, you can even go the way of e.g. [Yunohost](https://yunohost.org/#/) or [CapRover](https://caprover.com/) although you'll probably soon get tired of their restrictions and lack of flexibility. Wow, amazing information. If I was able to, I would have done so already. I have no experience with hosting stuff and there's no chance of me running up a cable to connect a device. Using a VPS seems expensive too, a local company wants £3 for their lowest tier a month. @lukefromdc how is a landline related to this?
Yetangitu commented 2024-03-12 16:49:23 -04:00 (Migrated from github.com)

For those of us with no landline, a need to self-host a service simply to access Twitter content is the same as Twitter not being usable.

If you only would use the machine for TwiXXer->Nitter, yes that would be overkill. The idea would be to use your own host for much more than that both to avoid the mentioned blocking problems as well as to host your own services. Host your own photos instead of giving them to Google, host your own music instead of being dependent on streaming services, host your own XMPP server instead of being dependent on Telegram/Whatsapp/Signal/Matrix or (${deity} forbid) Metafacebook or Apple or Microsoft et al.

> For those of us with no landline, a need to self-host a service simply to access Twitter content is the same as Twitter not being usable. If you only would use the machine for TwiXXer->Nitter, yes that would be overkill. The idea would be to use your own host for much more than that both to avoid the mentioned blocking problems as well as to host your own services. Host your own photos instead of giving them to Google, host your own music instead of being dependent on streaming services, host your own XMPP server instead of being dependent on Telegram/Whatsapp/Signal/Matrix or (`${deity}` forbid) Metafacebook or Apple or Microsoft et al.
lukefromdc commented 2024-03-12 22:14:06 -04:00 (Migrated from github.com)

Landline relevence is much more bandwidth available. I have de facto (not admitted to) capped cellular bandwidth via tethering only, when I am on the road it would be out of range of any home server. Forget a static IP address of course.

Also they don't like tethering but blocking sophisticated ways to tether brings lots of false positiives so they don't bother. If they do I get a new carrier and a new phone number. No stable IP address, no continuously on connection in any single location, not going to carry a server everywhere I go and we are not discussing the presumably lighter load of distributed hosting (e.g diaspora) here.

I do not however use Google or Meta for any purpose as I oppose their business models. I publish videos on Mastodon and on archive.org (latter good for linking especially as they want copies of all online content anyway). Twitter used to be widely used in my community so I had to be able to keyword search it and pull up known useful timelines, now neither of those work on the Twitter webapp without an account. I refuse to make an account with any ad supported corporate social media site, but the importance of Twitter is plunging as people stop posting there.

Unfortunately this is fueling a migration to Instagram which is even worse than Twitter but at least still has a partially working 3ed party backend. You must know at least the username whose content you want to see to use it as far as I can tell. On the plus side, the migration to Mastodon has greatly boosted the reach of my content, but some events I would cover now go unseen as they are organized in places I am now blind to.

Landline relevence is much more bandwidth available. I have de facto (not admitted to) capped cellular bandwidth via tethering only, when I am on the road it would be out of range of any home server. Forget a static IP address of course. Also they don't like tethering but blocking sophisticated ways to tether brings lots of false positiives so they don't bother. If they do I get a new carrier and a new phone number. No stable IP address, no continuously on connection in any single location, not going to carry a server everywhere I go and we are not discussing the presumably lighter load of distributed hosting (e.g diaspora) here. I do not however use Google or Meta for any purpose as I oppose their business models. I publish videos on Mastodon and on archive.org (latter good for linking especially as they want copies of all online content anyway). Twitter used to be widely used in my community so I had to be able to keyword search it and pull up known useful timelines, now neither of those work on the Twitter webapp without an account. I refuse to make an account with any ad supported corporate social media site, but the importance of Twitter is plunging as people stop posting there. Unfortunately this is fueling a migration to Instagram which is even worse than Twitter but at least still has a partially working 3ed party backend. You must know at least the username whose content you want to see to use it as far as I can tell. On the plus side, the migration to Mastodon has greatly boosted the reach of my content, but some events I would cover now go unseen as they are organized in places I am now blind to.
ExperiencersInternational commented 2024-03-13 07:53:49 -04:00 (Migrated from github.com)

Landline relevence is much more bandwidth available. I have de facto (not admitted to) capped cellular bandwidth via tethering only, when I am on the road it would be out of range of any home server. Forget a static IP address of course.

Also they don't like tethering but blocking sophisticated ways to tether brings lots of false positiives so they don't bother. If they do I get a new carrier and a new phone number. No stable IP address, no continuously on connection in any single location, not going to carry a server everywhere I go and we are not discussing the presumably lighter load of distributed hosting (e.g diaspora) here.

I do not however use Google or Meta for any purpose as I oppose their business models. I publish videos on Mastodon and on archive.org (latter good for linking especially as they want copies of all online content anyway). Twitter used to be widely used in my community so I had to be able to keyword search it and pull up known useful timelines, now neither of those work on the Twitter webapp without an account. I refuse to make an account with any ad supported corporate social media site, but the importance of Twitter is plunging as people stop posting there.

Unfortunately this is fueling a migration to Instagram which is even worse than Twitter but at least still has a partially working 3ed party backend. You must know at least the username whose content you want to see to use it as far as I can tell. On the plus side, the migration to Mastodon has greatly boosted the reach of my content, but some events I would cover now go unseen as they are organized in places I am now blind to.

Ah that makes sense.

Providers here generally don't require a landline but one provider still only does ADSL service and the other is HFC.

> Landline relevence is much more bandwidth available. I have de facto (not admitted to) capped cellular bandwidth via tethering only, when I am on the road it would be out of range of any home server. Forget a static IP address of course. > > Also they don't like tethering but blocking sophisticated ways to tether brings lots of false positiives so they don't bother. If they do I get a new carrier and a new phone number. No stable IP address, no continuously on connection in any single location, not going to carry a server everywhere I go and we are not discussing the presumably lighter load of distributed hosting (e.g diaspora) here. > > I do not however use Google or Meta for any purpose as I oppose their business models. I publish videos on Mastodon and on archive.org (latter good for linking especially as they want copies of all online content anyway). Twitter used to be widely used in my community so I had to be able to keyword search it and pull up known useful timelines, now neither of those work on the Twitter webapp without an account. I refuse to make an account with any ad supported corporate social media site, but the importance of Twitter is plunging as people stop posting there. > > Unfortunately this is fueling a migration to Instagram which is even worse than Twitter but at least still has a partially working 3ed party backend. You must know at least the username whose content you want to see to use it as far as I can tell. On the plus side, the migration to Mastodon has greatly boosted the reach of my content, but some events I would cover now go unseen as they are organized in places I am now blind to. Ah that makes sense. Providers here generally don't require a landline but one provider still only does ADSL service and the other is HFC.
animegrafmays commented 2024-03-13 07:56:44 -04:00 (Migrated from github.com)

so people stop generating multiple notifications via here and email for stuff that isn't related to nitter development, if it pertains to my nitter instance please email graf at poast dot org. do not post it here. want to be critical of me? email it. have a problem with what im doing? email it. leave this thread for dev.

thanks

so people stop generating multiple notifications via here and email for stuff that isn't related to nitter development, if it pertains to my nitter instance please email graf at poast dot org. do not post it here. want to be critical of me? email it. have a problem with what im doing? email it. leave this thread for dev. thanks
patchhg commented 2024-05-03 00:13:48 -04:00 (Migrated from github.com)

@TempUser13 Glad you asked :) I was working on it exactly and had it here https://github.com/sekai-soft/freebird
I was able to run a private Nitter and miniflux instance locally on my NAS and had been using it for a while without trouble.

this doesn't help anybody at all, it's just a way for you to self flagellate

@TempUser13 there are guides here but utilizing your own account is super easy using a python script in here (sorry to the author i dont care to look for the source now it's literally buried now)

basically:

  1. checkout the guest accounts branch of nitter
  2. make a file in the root directory with guest_accounts.jsonl. as the filename
  3. use [one of these scripts](https://github.com/zedeus/nitter/issues/983 #issuecomment-1944095658) to generate the contents of guest_accounts.jsonl
  4. do not EVER give people like @KTachibanaM anything including money

Cheers for all the work that you do on Poast bud @animegrafmays

Apologies in advance for the plethora of questions but I would appreciate some further tips before I start smashing my head against a wall trying to get a private instance working well enough for my needs. Given your experience running the most reliable Nitter instance as of late I would be very grateful for any advice around accounts usage and I'm sure I'm not the only one.

Basically I need to scrape a few hundred accounts, their complete timelines including likes, complete list of followers and following. What would be the best way to go about it? Would it be more effective to whip up some quick scripts that query graphql rather than run a private nitter instance?

I'm not as concerned about performance gains as I am with how nitter cycles through the accounts. I wonder if e.g. requesting the timelines in order with sane delays through some custom scripts would help as far as not getting the accounts blacklisted as much.

I've also thought about queuing up all the tweets containing media and then spinning up a headless browser separately in order to request them directly from twitter, since you can seemingly still do this much unauthenticated. Or is this overkill?

You've mentioned aged accounts faring better but most people, myself included, don't have access to any. Although the scale of private instances is infinitely smaller than the one you run, I'm still wondering what measures I could take to optimize fresh accounts usage.
Would running each account through a separate fixed residential proxy make a big difference or is it not worth the hassle?
Similarly, would using really big delays make a difference as far as not getting the accounts blocked in any way? For my particular use case, performance is not as much of a concern as getting full coverage. I remember reading in another thread that someone running a private instance for testing was noticing several accounts not retrieving full timelines in some cases, with random tweets missing. That would be a big problem and something I'm looking to avoid at all costs.

Thank you in advance for any insight which will result in less hair pulling on my part.

> > @TempUser13 Glad you asked :) I was working on it exactly and had it here https://github.com/sekai-soft/freebird > > I was able to run a private Nitter and miniflux instance locally on my NAS and had been using it for a while without trouble. > > this doesn't help anybody at all, it's just a way for you to self flagellate > > @TempUser13 there are guides here but utilizing your own account is super easy using a python script in here (sorry to the author i dont care to look for the source now it's literally buried now) > > basically: > > 1. checkout the guest accounts branch of nitter > 2. make a file in the root directory with guest_accounts.jsonl. as the filename > 3. use [one of these scripts](https://github.com/zedeus/nitter/issues/983 #issuecomment-1944095658) to generate the contents of guest_accounts.jsonl > 4. do not EVER give people like @KTachibanaM anything including money Cheers for all the work that you do on Poast bud @animegrafmays Apologies in advance for the plethora of questions but I would appreciate some further tips before I start smashing my head against a wall trying to get a private instance working well enough for my needs. Given your experience running the most reliable Nitter instance as of late I would be very grateful for any advice around accounts usage and I'm sure I'm not the only one. Basically I need to scrape a few hundred accounts, their complete timelines including likes, complete list of followers and following. What would be the best way to go about it? Would it be more effective to whip up some quick scripts that query graphql rather than run a private nitter instance? I'm not as concerned about performance gains as I am with how nitter cycles through the accounts. I wonder if e.g. requesting the timelines in order with sane delays through some custom scripts would help as far as not getting the accounts blacklisted as much. I've also thought about queuing up all the tweets containing media and then spinning up a headless browser separately in order to request them directly from twitter, since you can seemingly still do this much unauthenticated. Or is this overkill? You've mentioned aged accounts faring better but most people, myself included, don't have access to any. Although the scale of private instances is infinitely smaller than the one you run, I'm still wondering what measures I could take to optimize fresh accounts usage. Would running each account through a separate fixed residential proxy make a big difference or is it not worth the hassle? Similarly, would using really big delays make a difference as far as not getting the accounts blocked in any way? For my particular use case, performance is not as much of a concern as getting full coverage. I remember reading in another thread that someone running a private instance for testing was noticing several accounts not retrieving full timelines in some cases, with random tweets missing. That would be a big problem and something I'm looking to avoid at all costs. Thank you in advance for any insight which will result in less hair pulling on my part.
animegrafmays commented 2024-05-03 00:27:15 -04:00 (Migrated from github.com)

Basically I need to scrape a few hundred accounts, their complete timelines including likes, complete list of followers and following.

i run private instances for this so they don't have impact on the public instance, you can reach out to me at graf [at] poast.org if you are interested.

Would it be more effective to whip up some quick scripts that query graphql rather than run a private nitter instance?

for what you are asking, if you are doing a one-time thing, running a quick nitter with some even new-ish accounts would be fine. the limits for accounts older than I think 2018 are doubled whereask those prior to 2012 seem to be tripled or maybe quadrupled. i can't find documentation on this but in practice we run 200 accounts older than 2012 and very rarely run into limited accounts beyond maybe a dozen out of that in a day. older account limits are much, much more lax and definitely the way to go if you can get your hands on them

I'm not as concerned about performance gains as I am with how nitter cycles through the accounts. I wonder if e.g. requesting the timelines in order with sane delays through some custom scripts would help as far as not getting the accounts blacklisted as much.

if you are using RSS it's limited to the cache time of the nitter instance. nitter.poast.org is on 30 minute refresh for rss, staggering requests on a private instance (i.e. request 5 accounts now, 5 more in 5 minutes, etc) would help spread out user account exhaustion but in my experience as I said prior you can more or less ignore this with aged accounts. banned accounts have limits almost identical to those created in the last 12 months so if you can get your hands on a bunch of tokens from those and you're just serving yourself/your own interests its more than adequate. it's a lot easier to find banned/suspended accounts from people than current, active ones

I've also thought about queuing up all the tweets containing media and then spinning up a headless browser separately in order to request them directly from twitter, since you can seemingly still do this much unauthenticated. Or is this overkill?

you mean fetching a list of attachments on the tweet and bulk downloading? seems a bit overkill. if you are running a private nitter instance you should be fine without needing to go to this extreme

You've mentioned aged accounts faring better but most people, myself included, don't have access to any. Although the scale of private instances is infinitely smaller than the one you run

we happen to have a relatively large userbase (32k users at time of writing) who had donated a bunch of accounts and I have some that I had left over. I also have some surplus I could give you tokens for if you're using a private instance for yourself to get you started. we have 22-25k requests/s avg (just recently had to move it to a ryzen 7 server because the core clock on individual threads wasn't enough even running multiple nitter processes)

I'm still wondering what measures I could take to optimize fresh accounts usage.

to be honest, as long as you aren't listing yourself on the wiki or on the status page you likely wont run into issues. new accounts have about ~200 profile queries each that seem to reset between 8-12 hours, so a private instance with maybe 5 or 6 accounts would do you with staggered scraping for quite some time

i dont want to clog up this issue or notify everybody so if you'd like to discuss it further you can email me at the address above

>Basically I need to scrape a few hundred accounts, their complete timelines including likes, complete list of followers and following. i run private instances for this so they don't have impact on the public instance, you can reach out to me at graf [at] poast.org if you are interested. >Would it be more effective to whip up some quick scripts that query graphql rather than run a private nitter instance? for what you are asking, if you are doing a one-time thing, running a quick nitter with some even new-ish accounts would be fine. the limits for accounts older than I think 2018 are doubled whereask those prior to 2012 seem to be tripled or maybe quadrupled. i can't find documentation on this but in practice we run 200 accounts older than 2012 and very rarely run into limited accounts beyond maybe a dozen out of that in a day. older account limits are much, much more lax and definitely the way to go if you can get your hands on them >I'm not as concerned about performance gains as I am with how nitter cycles through the accounts. I wonder if e.g. requesting the timelines in order with sane delays through some custom scripts would help as far as not getting the accounts blacklisted as much. if you are using RSS it's limited to the cache time of the nitter instance. nitter.poast.org is on 30 minute refresh for rss, staggering requests on a private instance (i.e. request 5 accounts now, 5 more in 5 minutes, etc) would help spread out user account exhaustion but in my experience as I said prior you can more or less ignore this with aged accounts. banned accounts have limits almost identical to those created in the last 12 months so if you can get your hands on a bunch of tokens from those and you're just serving yourself/your own interests its more than adequate. it's a lot easier to find banned/suspended accounts from people than current, active ones >I've also thought about queuing up all the tweets containing media and then spinning up a headless browser separately in order to request them directly from twitter, since you can seemingly still do this much unauthenticated. Or is this overkill? you mean fetching a list of attachments on the tweet and bulk downloading? seems a bit overkill. if you are running a private nitter instance you should be fine without needing to go to this extreme >You've mentioned aged accounts faring better but most people, myself included, don't have access to any. Although the scale of private instances is infinitely smaller than the one you run we happen to have a relatively large userbase (32k users at time of writing) who had donated a bunch of accounts and I have some that I had left over. I also have some surplus I could give you tokens for if you're using a private instance for yourself to get you started. we have 22-25k requests/s avg (just recently had to move it to a ryzen 7 server because the core clock on individual threads wasn't enough even running multiple nitter processes) >I'm still wondering what measures I could take to optimize fresh accounts usage. to be honest, as long as you aren't listing yourself on the wiki or on the status page you likely wont run into issues. new accounts have about ~200 profile queries each that seem to reset between 8-12 hours, so a private instance with maybe 5 or 6 accounts would do you with staggered scraping for quite some time i dont want to clog up this issue or notify everybody so if you'd like to discuss it further you can email me at the address above
garoto commented 2024-05-03 18:40:24 -04:00 (Migrated from github.com)

Why are you even engaging in a convo with someone that "needs to scrape a few hundred accounts" and then offering to help with his endeavour? I must be taking crazy pills without knowing.

Why are you even engaging in a convo with someone that "needs to scrape a few hundred accounts" and then offering to help with his endeavour? I must be taking crazy pills without knowing.
nukeop commented 2024-05-03 18:49:41 -04:00 (Migrated from github.com)

Twitter's fault for not providing an API for this. There's nothing wrong with scraping.

Twitter's fault for not providing an API for this. There's nothing wrong with scraping.
patchhg commented 2024-05-04 02:38:39 -04:00 (Migrated from github.com)

Why are you even engaging in a convo with someone that "needs to scrape a few hundred accounts" and then offering to help with his endeavour? I must be taking crazy pills without knowing.

I'm not going to take your bait and get bogged down in a pointless debate re the ethics of scraping and how it all might pertain to Twitter's newest policies.

From a pragmatic standpoint, several Nitter instance maintainers have mentioned in this very thread that scraping is a big enough problem as far as keeping Nitter usable for regular users. Since I prefer to use Nitter myself for casual lurking rather than having to deal with Twitter's interface and algo, the last thing I wanted to do was contribute to the problem.

I believed addressing this out in the open would go a long way towards helping those with this specific need get their own private instances up and running, rather than ruin a good thing for everyone. Taking my own use case as an example, since speed is not a concern it would've certainly been more convenient to scrape graf's instance for weeks rather than have to deal with Twitter socks, but it's a really shitty thing to do.

As for why someone might be interested in scraping Twitter on a small scale - several hundred accounts is nothing really despite your scaremongering - there are legitimate reasons. From Twitter's shitty built-in search to archival purposes; some communities sharing precious tidbits on Twitter are already more or less shutting down in protest because Elon man bad.

> Why are you even engaging in a convo with someone that "needs to scrape a few hundred accounts" and then offering to help with his endeavour? I must be taking crazy pills without knowing. I'm not going to take your bait and get bogged down in a pointless debate re the ethics of scraping and how it all might pertain to Twitter's newest policies. From a pragmatic standpoint, several Nitter instance maintainers have mentioned in this very thread that scraping is a big enough problem as far as keeping Nitter usable for regular users. Since I prefer to use Nitter myself for casual lurking rather than having to deal with Twitter's interface and algo, the last thing I wanted to do was contribute to the problem. I believed addressing this out in the open would go a long way towards helping those with this specific need get their own private instances up and running, rather than ruin a good thing for everyone. Taking my own use case as an example, since speed is not a concern it would've certainly been more convenient to scrape graf's instance for weeks rather than have to deal with Twitter socks, but it's a really shitty thing to do. As for why someone might be interested in scraping Twitter on a small scale - several hundred accounts is nothing really despite your scaremongering - there are legitimate reasons. From Twitter's shitty built-in search to archival purposes; some communities sharing precious tidbits on Twitter are already more or less shutting down in protest because Elon man bad.
animegrafmays commented 2024-05-04 02:40:34 -04:00 (Migrated from github.com)

I'm not going to take your bait and get bogged down in a pointless debate
but you're here arguing.

i'll break it down for you -- i'd rather somebody scrape an instance i run that nobody else is trying to use than use my main instance, that literally everybody is linking to. cool with you? no? i dont give a shit

>I'm not going to take your bait and get bogged down in a pointless debate but you're here arguing. i'll break it down for you -- i'd rather somebody scrape an instance i run that nobody else is trying to use than use my main instance, that literally everybody is linking to. cool with you? no? i dont give a shit
Apachez- commented 2024-05-05 12:32:54 -04:00 (Migrated from github.com)

Twitter's fault for not providing an API for this. There's nothing wrong with scraping.

Scraping is why we cant have nice things such as Nitter in the public as it used to work before "some" started to scrap Twitter through Nitter and put Nitter to a halt.

> Twitter's fault for not providing an API for this. There's nothing wrong with scraping. Scraping is why we cant have nice things such as Nitter in the public as it used to work before "some" started to scrap Twitter through Nitter and put Nitter to a halt.
nkfm200 commented 2024-05-22 18:07:56 -04:00 (Migrated from github.com)

nitter.poast.org sometimes doesn't show search results or individual Tweets. nitter.privacydev.net shows the rate limit error on all searches and account pages even with a full bar of green at the Nitter status. It'd be great if people started working on a solution as opposed to dooming every moment about the death of Nitter 😐

nitter.poast.org sometimes doesn't show search results or individual Tweets. nitter.privacydev.net shows the rate limit error on all searches and account pages even with a full bar of green at the Nitter status. It'd be great if people started working on a solution as opposed to dooming every moment about the death of Nitter 😐
animegrafmays commented 2024-05-22 18:12:24 -04:00 (Migrated from github.com)

the reason searches are "sometimes" not shown is due to the amount of accounts limited. there's currently 200 accounts on that instance and because it's serving traffic to almost 200 thousand unique visitors daily more than half of them are rate limited. with that amount of traffic having more than half the accounts rate limited will result in not being able to expand tweets, searches not functioning etc. it's a literal full time job maintaining it and preventing scraping but I am doing what I can including procuring an additional 100 to add to it this week. sorry I can't be good enough for you, @nkfm200 😭😭😭

the reason searches are "sometimes" not shown is due to the amount of accounts limited. there's currently 200 accounts on that instance and because it's serving traffic to almost 200 thousand unique visitors daily more than half of them are rate limited. with that amount of traffic having more than half the accounts rate limited will result in not being able to expand tweets, searches not functioning etc. it's a literal full time job maintaining it and preventing scraping but I am doing what I can including procuring an additional 100 to add to it this week. sorry I can't be good enough for you, @nkfm200 😭😭😭
nkfm200 commented 2024-05-22 18:31:23 -04:00 (Migrated from github.com)

@animegrafmays That I've heard of, the small number of accounts serving a huge number of visitors every day causing rate limits on accounts. Hopefully that extra 100 accounts is there at the time when it's the end of the week. This may be off-topic but I'm just strict about stuff because this is a world where the people living in it refuse to do something unless it fits the rules of the culture

@animegrafmays That I've heard of, the small number of accounts serving a huge number of visitors every day causing rate limits on accounts. Hopefully that extra 100 accounts is there at the time when it's the end of the week. This may be off-topic but I'm just strict about stuff because this is a world where the people living in it refuse to do something unless it fits the rules of the culture
unixfox commented 2024-05-26 16:00:50 -04:00 (Migrated from github.com)

hello, I have opened a new instance with around 500 accounts. feel free to try: https://xcancel.com

Most popular RSS readers should also work on that instance. If you can't use it on your favorite rss reader then please send me an email rss [AT] xcancel [DOT] com

Thanks.

hello, I have opened a new instance with around 500 accounts. feel free to try: https://xcancel.com Most popular RSS readers should also work on that instance. If you can't use it on your favorite rss reader then please send me an email rss [AT] xcancel [DOT] com Thanks.
wiredsis commented 2024-06-09 13:55:18 -04:00 (Migrated from github.com)

@unixfox saw this. mad work, thanks for sharing.

@unixfox saw this. mad work, thanks for sharing.
animegrafmays commented 2024-06-15 22:56:10 -04:00 (Migrated from github.com)

fellas, looks like twitter backpedaled something. instances on commits from back last August (before the guest account branch) are working fine

https://t.com.sb/dominickmatthew/status/1802031639792632297#m

4b28bd46a63024f8a942a41abfbb6dac82b9d63e6f1db68168a80abf808d7e3a

fellas, looks like twitter backpedaled something. instances on commits from back last August (before the guest account branch) are working fine https://t.com.sb/dominickmatthew/status/1802031639792632297#m ![4b28bd46a63024f8a942a41abfbb6dac82b9d63e6f1db68168a80abf808d7e3a](https://github.com/zedeus/nitter/assets/71434691/4fc1f01a-3ef6-449e-856d-01b42dbe7f3e)
animegrafmays commented 2024-06-15 23:19:20 -04:00 (Migrated from github.com)

can confirm, I just rolled fresh deployment of github.com/zedeus/nitter@d7ca353 with no guest accounts and it is working. I will have my users use this instance and see wat kind of limitations they've imposed and report back

https://nitter.nerv.st

search doesn't work, media tab doesn't load but going to specific users timelines, viewing their threads/comments are all fine.

edit: seems like they've reverted it again {"errors":[{"message":"Bad Authentication data","code":215}]}

can confirm, I just rolled fresh deployment of https://github.com/zedeus/nitter/commit/d7ca353 with no guest accounts and it is working. I will have my users use this instance and see wat kind of limitations they've imposed and report back https://nitter.nerv.st search doesn't work, media tab doesn't load but going to specific users timelines, viewing their threads/comments are all fine. edit: seems like they've reverted it again `{"errors":[{"message":"Bad Authentication data","code":215}]}`
KingCh1ll commented 2024-06-15 23:30:14 -04:00 (Migrated from github.com)

funny timing, I was also looking into why my code from a year ago was suddenly working lmfao

funny timing, I was also looking into why my code from a year ago was suddenly working lmfao
animegrafmays commented 2024-06-16 09:40:15 -04:00 (Migrated from github.com)

Does this mean Nitter is back?

i can't claim to know what they were or are doing, but i was able to spawn a pre-guest account branch version of nitter and have it work reliably. here's hoping maybe they fully reverse their choice but at this time nitter is still "dead"

> Does this mean Nitter is back? i can't claim to know what they were or are doing, but i was able to spawn a pre-guest account branch version of nitter and have it work reliably. here's hoping maybe they fully reverse their choice but at this time nitter is still "dead"
cmj commented 2024-06-16 13:56:23 -04:00 (Migrated from github.com)

Looks like they switched back on the old v1.1 timeline endpoint? It's working on a bunch of old instances right now...

# Latest tweet from NASA example:
curl -s "https://api.twitter.com/1.1/timeline/user.json?id=11348282&count=1" -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF" | jq
Looks like they switched back on the old v1.1 timeline endpoint? It's working on a _bunch_ of old instances right now... ``` # Latest tweet from NASA example: curl -s "https://api.twitter.com/1.1/timeline/user.json?id=11348282&count=1" -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF" | jq ```
sclerometer commented 2024-06-19 02:10:26 -04:00 (Migrated from github.com)

it looks like they fucked up something again. my old instance, running 2023.08.08-d7ca353, suddenly started working again.

it looks like they fucked up something again. my old instance, running 2023.08.08-d7ca353, suddenly started working again.
animegrafmays commented 2024-06-20 03:21:47 -04:00 (Migrated from github.com)

Looks like they switched back on the old v1.1 timeline endpoint? It's working on a bunch of old instances right now...

# Latest tweet from NASA example:
curl -s "https://api.twitter.com/1.1/timeline/user.json?id=11348282&count=1" -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF" | jq

this is definitely what's happened, they've turned it on and off randomly over the past several days so i was hesitant to comment. i don't want to speculate but I also don't believe they'd accidentally enable it again. bait, maybe?

> Looks like they switched back on the old v1.1 timeline endpoint? It's working on a _bunch_ of old instances right now... > > ``` > # Latest tweet from NASA example: > curl -s "https://api.twitter.com/1.1/timeline/user.json?id=11348282&count=1" -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF" | jq > ``` this is definitely what's happened, they've turned it on and off randomly over the past several days so i was hesitant to comment. i don't want to speculate but I also don't believe they'd accidentally enable it again. bait, maybe?
Yetangitu commented 2024-06-20 10:51:13 -04:00 (Migrated from github.com)

Now 'all' that needs to be done is to get video playback working again. TwiXXer videos can be played using 'any' media player, e.g.

mpv 'https://video.twimg.com/ext_tw_video/1800580469764833280/pu/pl/avc1/854x480/7DKqLwCEvmUiVj84.m3u8'

...shows you some knuckleheaded adherents of the climate doom cult putting their tribal mark on the Stonehenge monument. The solution should be fairly simple, I might even have a look at it myself once times arrives.

Now 'all' that needs to be done is to get video playback working again. TwiXXer videos can be played using 'any' media player, e.g. ``` mpv 'https://video.twimg.com/ext_tw_video/1800580469764833280/pu/pl/avc1/854x480/7DKqLwCEvmUiVj84.m3u8' ``` ...shows you some knuckleheaded adherents of the climate doom cult putting their tribal mark on the Stonehenge monument. The solution should be fairly simple, I might even have a look at it myself once times arrives.
canbringyouback commented 2024-06-24 06:36:58 -04:00 (Migrated from github.com)

...shows you some knuckleheaded adherents of the climate doom cult putting their tribal mark on the Stonehenge monument.

There is no need to mocking people's irrational action to a grim future.

> ...shows you some knuckleheaded adherents of the climate doom cult putting their tribal mark on the Stonehenge monument. There is no need to mocking people's irrational action to a grim future.
ImTheDeveloper commented 2024-06-24 06:39:18 -04:00 (Migrated from github.com)

Looks like v1.1 API opening up was temporary
https://status.d420.de/

Most instances are back to being down.

Looks like v1.1 API opening up was temporary https://status.d420.de/ Most instances are back to being down.
nukeop commented 2024-06-24 06:54:54 -04:00 (Migrated from github.com)

Now 'all' that needs to be done is to get video playback working again. TwiXXer videos can be played using 'any' media player, e.g.

mpv 'https://video.twimg.com/ext_tw_video/1800580469764833280/pu/pl/avc1/854x480/7DKqLwCEvmUiVj84.m3u8'

...shows you some knuckleheaded adherents of the climate doom cult putting their tribal mark on the Stonehenge monument. The solution should be fairly simple, I might even have a look at it myself once times arrives.

All this great stuff I'm missing because I'm not on Twitter...

> Now 'all' that needs to be done is to get video playback working again. TwiXXer videos can be played using 'any' media player, e.g. > > ``` > mpv 'https://video.twimg.com/ext_tw_video/1800580469764833280/pu/pl/avc1/854x480/7DKqLwCEvmUiVj84.m3u8' > ``` > > ...shows you some knuckleheaded adherents of the climate doom cult putting their tribal mark on the Stonehenge monument. The solution should be fairly simple, I might even have a look at it myself once times arrives. All this great stuff I'm missing because I'm not on Twitter...
Yetangitu commented 2024-06-24 11:57:19 -04:00 (Migrated from github.com)

...shows you some knuckleheaded adherents of the climate doom cult putting their tribal mark on the Stonehenge monument.

There is no need to mocking people's irrational action to a grim future.

<rant class='off-topic' intensity='sizzling'>

The future is quite bright as long as groups like JSO/XR (UK), Letzte Generation (Germany), Återställ Våtmarken (Sweden) and similar cookie-cutter activist collectivists are held in check. These are doom cults which, in contrast to the doom preachers of yore with their sandwich signs 'The End is Nigh, Repent!' who only rang their bells and shouted a bit use destructive tactics to proclaim their quasi-religious zeal. They do not help whatever cause they claim to adhere to, if anything they achieve the opposite. If you believe in the climate scare - which I do not - and want society to move away from fossil fuels - which I do, just not for those reasons - you should not root for these groups.

As to that 'grim future', do you have children? Do you think it a good idea to tell them they won't live to reach the age where they might have children themselves? Read up on how children react to that type of rhetoric, especially younger children. They actually believe it word for word, abject nonsense though it is. What a way to portray, nay destroy their future.

So yes, call those numbskulls for what they are.

</rant>

> > ...shows you some knuckleheaded adherents of the climate doom cult putting their tribal mark on the Stonehenge monument. > > There is no need to mocking people's irrational action to a grim future. `<rant class='off-topic' intensity='sizzling'>` The future is quite bright as long as groups like JSO/XR (UK), _Letzte Generation_ (Germany), _Återställ Våtmarken_ (Sweden) and similar cookie-cutter activist collectivists are held in check. These are doom cults which, in contrast to the doom preachers of yore with their sandwich signs 'The End is Nigh, Repent!' who only rang their bells and shouted a bit use destructive tactics to proclaim their quasi-religious zeal. They do not help whatever cause they claim to adhere to, if anything they achieve the opposite. If you believe in the climate scare - which I do not - and want society to move away from fossil fuels - which I do, just not for those reasons - you should not root for these groups. As to that 'grim future', do you have children? Do you think it a good idea to tell them they won't live to reach the age where they might have children themselves? Read up on how children react to that type of rhetoric, especially younger children. They _actually believe it word for word_, abject nonsense though it is. What a way to portray, nay _destroy_ their future. So yes, call those numbskulls for what they are. `</rant>`
canbringyouback commented 2024-06-24 22:06:25 -04:00 (Migrated from github.com)

If you believe in the climate scare - which I do not -

</rant>

I take this as you also don't believe in modern medicine(which use even worse methodology than those climate "scare") and never go to hospital.

Which is fine by me. Keep going. You are doing good for your children.

> > > If you believe in the climate scare - which I do not - > > `</rant>` I take this as you also don't believe in modern medicine(which use even worse methodology than those climate "scare") and never go to hospital. Which is fine by me. Keep going. You are doing good for your children.
cmj commented 2024-06-24 22:57:48 -04:00 (Migrated from github.com)

Keep this on topic, please.

@ImTheDeveloper I've been watching this over the past 10 days. It seems all the endpoints were flipped on by accident last weekend after they realized the still left the v1.1 likes rest endpoint running since ... always.

For about a week (until Friday the 21st) they had all timelines open and various other endpoints that enabled old Nitter to operate.

My observations from this: https://gist.github.com/cmj/bdadb2c324e2022fffb2cf2ca0c3e7b8
See: https://github.com/BANKA2017/twitter-monitor-assets/tree/master/rate_limit

Keep this on topic, please. @ImTheDeveloper I've been watching this over the past 10 days. It seems all the endpoints were flipped on by accident last weekend after they realized the still left the v1.1 likes rest endpoint running since ... always. For about a week (until Friday the 21st) they had all timelines open and various other endpoints that enabled old Nitter to operate. My observations from this: https://gist.github.com/cmj/bdadb2c324e2022fffb2cf2ca0c3e7b8 See: https://github.com/BANKA2017/twitter-monitor-assets/tree/master/rate_limit
jeveloper commented 2024-08-07 15:54:12 -04:00 (Migrated from github.com)

Twitter's fault for not providing an API for this. There's nothing wrong with scraping.

Plenty wrong with it. Most won't admit that they use scarped data, that's one thing wrong.
Asking is an act of respect.

> Twitter's fault for not providing an API for this. There's nothing wrong with scraping. Plenty wrong with it. Most won't admit that they use scarped data, that's one thing wrong. Asking is an act of respect.
nukeop commented 2024-08-07 16:42:32 -04:00 (Migrated from github.com)

Asking is an act of respect.

I don't respect twitter

> Asking is an act of respect. I don't respect twitter
jeveloper commented 2024-08-07 19:14:12 -04:00 (Migrated from github.com)

Asking is an act of respect.

I don't respect twitter

Thank you for your personal opinion. I am neutral to Twitter and don't have an attachment to what it was or may have been.
Now when you say , I don't respect twitter, aren't you just in the deficit? Shouldn't they say I don't respect nukeop or their work.

You're practicing the same attitude these tech companies you love to hate.

perhaps I am wrong and am supposed to act out in some way, but I'm not attached to it, I don't want to work for them, avoiding tech work that has anything to do with predatory practices (yes I do and will lose on job opportunities)

> > Asking is an act of respect. > > I don't respect twitter Thank you for your personal opinion. I am neutral to Twitter and don't have an attachment to what it was or may have been. Now when you say , I don't respect twitter, aren't you just in the deficit? Shouldn't they say I don't respect nukeop or their work. You're practicing the same attitude these tech companies you love to hate. perhaps I am wrong and am supposed to act out in some way, but I'm not attached to it, I don't want to work for them, avoiding tech work that has anything to do with predatory practices (yes I do and will lose on job opportunities)
nukeop commented 2024-08-08 16:27:01 -04:00 (Migrated from github.com)

I just want to scrape whatever I want and they should be obliged by law to allow me and others to do it.

I just want to scrape whatever I want and they should be obliged by law to allow me and others to do it.
jeveloper commented 2024-08-09 16:49:22 -04:00 (Migrated from github.com)

I just want to scrape whatever I want and they should be obliged by law to allow me and others to do it.

You now fully sound like a child, this isn't judgement against children at all and not a judgement against adults that chose not to process their issues within. You are or might be a talented engineer, but you bring your unprocessed with you.

If we decide that X/twi/whatever is running an unethical platform with unethical policies, we don't need to act out. maturity damn it

> I just want to scrape whatever I want and they should be obliged by law to allow me and others to do it. You now fully sound like a child, this isn't judgement against children at all and not a judgement against adults that chose not to process their issues within. You are or might be a talented engineer, but you bring your unprocessed with you. If we decide that X/twi/whatever is running an unethical platform with unethical policies, we don't need to act out. maturity damn it
jeveloper commented 2024-08-11 20:56:41 -04:00 (Migrated from github.com)

@lukefromdc Hey Luke,
When was the last time you've donated or supported x.org?
Go ahead and organize a bunch of people, take time , take a year and figure out seeing Musk.
You have all the choices to bring up an issue.
We were talking about X , not elon musk (don't care about specific individual) and their product.

I have a feeling you have a difficulty staying on topic (so very common now, I'm guilty too at times). Forget Oracle and are you a common person directly affected by Oracle? I met James Gosling back in 2005 sun conference. I'm sure he wasn't happy about Oracle but continued his craft. Continue your craft or volunteer.

all that being said, I have no negative feelings toward anyone

@lukefromdc Hey Luke, When was the last time you've donated or supported x.org? Go ahead and organize a bunch of people, take time , take a year and figure out seeing Musk. You have all the choices to bring up an issue. We were talking about X , not elon musk (don't care about specific individual) and their product. I have a feeling you have a difficulty staying on topic (so very common now, I'm guilty too at times). Forget Oracle and are you a common person directly affected by Oracle? I met James Gosling back in 2005 sun conference. I'm sure he wasn't happy about Oracle but continued his craft. Continue your craft or volunteer. all that being said, I have no negative feelings toward anyone
animegrafmays commented 2024-08-11 20:58:16 -04:00 (Migrated from github.com)

this conversation is only tangentially related to nitter, can you stop shitting up our email inboxes?

this conversation is only tangentially related to nitter, can you stop shitting up our email inboxes?
jeveloper commented 2024-08-16 20:14:14 -04:00 (Migrated from github.com)

Sorry about this @animegrafmays. Stopped

Sorry about this @animegrafmays. Stopped
RunlevelConsulting commented 2024-08-19 08:32:06 -04:00 (Migrated from github.com)

Now that the moronic-talk is over. Questions about Nitter, specifically with regards to the regular accounts version.

For those that don't know, the guest_accounts version used 2 curl commands to generate temporary accounts, however there was recently a fork (which I can't find right now) that used real accounts instead.

  1. Can someone point me to the repository? It's lost under all the irrelevant talk
  2. Still working?
  3. Does it only take 1 account or is it like guest_accounts where you could add multiple credentials (i.e - Multiple real accounts)
  4. Any info on rate limits? Presumably it's the same rate limit as if you were using Twitter normally, e.g. If you scroll really fast for a while through someone's profile, it'll eventually fai and say it can't load anymore, I always assumed this was a rate limit.

Any info helpful, thank you!

Now that the moronic-talk is over. Questions about Nitter, specifically with regards to the regular accounts version. For those that don't know, the guest_accounts version used 2 curl commands to generate temporary accounts, however there was recently a fork (which I can't find right now) that used real accounts instead. 1. Can someone point me to the repository? It's lost under all the irrelevant talk 2. Still working? 3. Does it only take 1 account or is it like guest_accounts where you could add multiple credentials (i.e - Multiple real accounts) 4. Any info on rate limits? Presumably it's the same rate limit as if you were using Twitter normally, e.g. If you scroll really fast for a while through someone's profile, it'll eventually fai and say it can't load anymore, I always assumed this was a rate limit. Any info helpful, thank you!
unixfox commented 2024-08-19 08:53:39 -04:00 (Migrated from github.com)

@RunlevelConsulting literally the 7th result after typing "nitter" in the github search: https://github.com/sekai-soft/guide-nitter-self-hosting

@RunlevelConsulting literally the 7th result after typing "nitter" in the github search: https://github.com/sekai-soft/guide-nitter-self-hosting
blackthornecl commented 2024-09-23 15:41:42 -04:00 (Migrated from github.com)

out of nowhere my instance started working again, anyone else?

out of nowhere my instance started working again, anyone else?
Yetangitu commented 2024-09-23 17:29:20 -04:00 (Migrated from github.com)

Mine never stopped working (except for video, that has been broken for a long time) but I'm using it with a real account, would you happen to have it configured with some of those as well?

Mine never stopped working (except for video, that has been broken for a long time) but I'm using it with a real account, would you happen to have it configured with some of those as well?
blackthornecl commented 2024-09-23 17:52:29 -04:00 (Migrated from github.com)

Yes, I'm working with some real accounts, but I remember that stopped working too, I used my own instance for scraping, now I migrated everything to a new system, I'm glad that nitter is still working.

Yes, I'm working with some real accounts, but I remember that stopped working too, I used my own instance for scraping, now I migrated everything to a new system, I'm glad that nitter is still working.
Yetangitu commented 2024-10-28 10:28:44 -04:00 (Migrated from github.com)

...except for video, that has been broken for a long time

Replying to myself for those who also have problems playing video: it does work when you disable Enable HLS video streaming and proxy video streaming through the server while keeping Enable mp3 video playback enabled in Settings (the cog wheel in the top bar, top right). In this case you get mp4 video files which can be streamed directly in the interface.

If you're using Firefox you may need to disable 'Enhanced Tracking Protection' since it (rightfully) considers twimg.com (where video content is served from) a tracking domain and will refuse access when that setting is enabled. With these changes video is fully functional in Nitter.

> ...except for video, that has been broken for a long time Replying to myself for those who also have problems playing video: it _does_ work when you disable _Enable HLS video streaming_ and _proxy video streaming through the server_ while keeping _Enable mp3 video playback_ enabled in Settings (the cog wheel in the top bar, top right). In this case you get mp4 video files which can be streamed directly in the interface. If you're using Firefox you may need to disable 'Enhanced Tracking Protection' since it (rightfully) considers `twimg.com` (where video content is served from) a tracking domain and will refuse access when that setting is enabled. With these changes video is fully functional in _Nitter_.
lukefromdc commented 2024-10-28 13:54:42 -04:00 (Migrated from github.com)

It is also possible in some cases when twimg/twitter JS is disabled to click on
a link to the video itself that will show, then download the file. For some folks
enhanced tracking protection is mandatory and cannot be turned off. Fixing that
would require a way to create an exception in firefox itself to allow twimg.com
from a nitter instance.

It is also possible in some cases when twimg/twitter JS is disabled to click on a link to the video itself that will show, then download the file. For some folks enhanced tracking protection is mandatory and cannot be turned off. Fixing that would require a way to create an exception in firefox itself to allow twimg.com from a nitter instance.
Yetangitu commented 2024-10-28 15:17:08 -04:00 (Migrated from github.com)

You can add per-site exceptions for ETP (Enhanced Tracking Protection) in Firefox. These exceptions are all-or-nothing so it is not possible to only let twimg.com through for the whitelisted site. This could be made to work if Firefox allow users to state an ETP level - off, standard, strict or custom - for whitelisted sites but that is currently not the case.

You can add per-site exceptions for ETP (_Enhanced Tracking Protection_) in Firefox. These exceptions are all-or-nothing so it is not possible to only let `twimg.com` through for the whitelisted site. This could be made to work if Firefox allow users to state an ETP level - off, standard, strict or custom - for whitelisted sites but that is currently not the case.
lukefromdc commented 2024-10-28 15:25:07 -04:00 (Migrated from github.com)

That might be enough so long as nobody ever deploys an ad-supported Nitter instance

That might be enough so long as nobody ever deploys an ad-supported Nitter instance
Apachez- commented 2024-11-03 10:19:08 -05:00 (Migrated from github.com)

Whatever it might be worth here is a working set of settings when using https://xcancel.com/

Display
Theme: Twitter
Infinite scrolling (experimental, requires JavaScript): Enabled
Make profile sidebar stick to top: Disabled
Support bidirectional text (makes clicking on tweets harder): Disabled
Hide tweet stats (replies, retweets, likes): Disabled
Hide profile banner: Disabled
Hide pinned tweets: Enabled
Hide tweet replies: Disabled
Square profile pictures: Disabled

Media
Enable mp4 video playback (only for gifs): Enabled
Enable HLS video streaming (requires JavaScript): Enabled
Proxy video streaming through the server (might be slow): Disabled
Mute videos by default: Enabled
Autoplay gifs: Disabled

Link replacements (blank to disable)
Twitter -> Nitter: xcancel.com
YouTube -> Piped/Invidious: youtube.com
Reddit -> Teddit/Libreddit: teddit.net

Only drawback so far is that the replacement of youtube doesnt work in a post, only for quoted posts.

And that loading too many pages at once will throw you into some kind of temporary blacklist at xcancel.com (so have at least a few seconds between each load/refresh if you visit more than one account).

Also Im not sure on how multiloading usernames affects getting onto the tempory blacklist.

That is when you load multiple accounts in one go such as https://xcancel.com/elonmusk,cb_doge,joerogan,nsagov (just picked some random accounts as example :-)

Whatever it might be worth here is a working set of settings when using https://xcancel.com/<username> Display Theme: Twitter Infinite scrolling (experimental, requires JavaScript): Enabled Make profile sidebar stick to top: Disabled Support bidirectional text (makes clicking on tweets harder): Disabled Hide tweet stats (replies, retweets, likes): Disabled Hide profile banner: Disabled Hide pinned tweets: Enabled Hide tweet replies: Disabled Square profile pictures: Disabled Media Enable mp4 video playback (only for gifs): Enabled Enable HLS video streaming (requires JavaScript): Enabled Proxy video streaming through the server (might be slow): Disabled Mute videos by default: Enabled Autoplay gifs: Disabled Link replacements (blank to disable) Twitter -> Nitter: xcancel.com YouTube -> Piped/Invidious: youtube.com Reddit -> Teddit/Libreddit: teddit.net Only drawback so far is that the replacement of youtube doesnt work in a post, only for quoted posts. And that loading too many pages at once will throw you into some kind of temporary blacklist at xcancel.com (so have at least a few seconds between each load/refresh if you visit more than one account). Also Im not sure on how multiloading usernames affects getting onto the tempory blacklist. That is when you load multiple accounts in one go such as https://xcancel.com/elonmusk,cb_doge,joerogan,nsagov (just picked some random accounts as example :-)
animegrafmays commented 2024-11-06 00:43:30 -05:00 (Migrated from github.com)

tonight during the voting in the US presidential election we topped 1.21 million unique visitors on nitter.poast.org. right now, during the counting we are averaging 21 thousand requests per second across 4 ryzen 7 3800x load balanced.

this is insane. and the 400 accounts we are using isn't even close to enough. i offloaded a lot of requests via proxy directly to twitter via a separate proxy_pass. helped massively. never been more proud to put so much effort into running it 🙏
thank you for everything @zedeus, i think everybody here is thankful for your efforts

tonight during the voting in the US presidential election we topped 1.21 million unique visitors on nitter.poast.org. right now, during the counting we are averaging 21 thousand requests per second across 4 ryzen 7 3800x load balanced. this is insane. and the 400 accounts we are using isn't even close to enough. i offloaded a lot of requests via proxy directly to twitter via a separate proxy_pass. helped massively. never been more proud to put so much effort into running it 🙏 thank you for everything @zedeus, i think everybody here is thankful for your efforts
dhdurgee commented 2024-11-08 22:58:08 -05:00 (Migrated from github.com)

I have been using https://nitter.privacydev.net/MarkDavis/ to keep an eye on the one twitter user I follow as I much prefer the Nitter presentation.

For the past three days I have been getting nothing but "Instance has been rate limited. Use another instance or try again later." messages when I attempt to check.

Did they break something new, or am I the only one seeing this?

I have been using [https://nitter.privacydev.net/MarkDavis/](url) to keep an eye on the one twitter user I follow as I much prefer the Nitter presentation. For the past three days I have been getting nothing but "Instance has been rate limited. Use [another instance](https://github.com/zedeus/nitter/wiki/Instances) or try again later." messages when I attempt to check. Did they break something new, or am I the only one seeing this?
animegrafmays commented 2024-11-08 23:01:20 -05:00 (Migrated from github.com)

works fine for us -- https://nitter.poast.org/MarkDavis/

might be that the instance you are using is genuinely rate limited. not sure how many accounts he is using, but on our instance we run 4 dedicated servers in round robin with 100s of accounts, so usually reloading on ours fixes that issue if it ever appears for you.

this isn't Xitter changing anything or nitter being broken, it's related to rate limits of accounts used to display the tweets to you

works fine for us -- https://nitter.poast.org/MarkDavis/ might be that the instance you are using is genuinely rate limited. not sure how many accounts he is using, but on our instance we run 4 dedicated servers in round robin with 100s of accounts, so usually reloading on ours fixes that issue if it ever appears for you. this isn't Xitter changing anything or nitter being broken, it's related to rate limits of accounts used to display the tweets to you
dhdurgee commented 2024-11-08 23:30:56 -05:00 (Migrated from github.com)

Thank you for your feedback. It does indeed appear to be a problem with that instance in particular. I have changed over to xcancel.com and it is working well. I had though the instance I was using the only functional one and was pleased to discover I was wrong.

Thank you for your feedback. It does indeed appear to be a problem with that instance in particular. I have changed over to xcancel.com and it is working well. I had though the instance I was using the only functional one and was pleased to discover I was wrong.
animegrafmays commented 2024-11-08 23:32:37 -05:00 (Migrated from github.com)

you're welcome friend. im glad you found a solution that fits your needs

you're welcome friend. im glad you found a solution that fits your needs
unixfox commented 2024-11-09 03:42:08 -05:00 (Migrated from github.com)

@dhdurgee here is all the instances that works: https://status.d420.de

@dhdurgee here is all the instances that works: https://status.d420.de
initd0 commented 2024-11-13 08:17:55 -05:00 (Migrated from github.com)

I have been using https://nitter.privacydev.net/MarkDavis/ to keep an eye on the one twitter user I follow as I much prefer the Nitter presentation.

For the past three days I have been getting nothing but "Instance has been rate limited. Use another instance or try again later." messages when I attempt to check.

Did they break something new, or am I the only one seeing this?

Im experiencing the same issue as you since few days now. However im using Tor and none of the other current working instances including xcancel.com allow Tor connections which is very sad.
https://nitter.privacydev.net/ was the only instance that you could use to browse with Tor.
I hope the owner can get it back up or hope other instances can allow Tor at least

> I have been using [https://nitter.privacydev.net/MarkDavis/](url) to keep an eye on the one twitter user I follow as I much prefer the Nitter presentation. > > For the past three days I have been getting nothing but "Instance has been rate limited. Use [another instance](https://github.com/zedeus/nitter/wiki/Instances) or try again later." messages when I attempt to check. > > Did they break something new, or am I the only one seeing this? Im experiencing the same issue as you since few days now. However im using Tor and none of the other current working instances including xcancel.com allow Tor connections which is very sad. https://nitter.privacydev.net/ was the only instance that you could use to browse with Tor. I hope the owner can get it back up or hope other instances can allow Tor at least
animegrafmays commented 2024-11-13 09:39:57 -05:00 (Migrated from github.com)

I hope the owner can get it back up or hope other instances can allow Tor at least

I made the decision after several days of heavy abuse from TOR exits to block them. I will not be removing the block and have automated updating it with any new exits. prior to blocking TOR exits, we were receiving on average over 30k requests per second. after it's down to 10-11k. all used for scraping. it's unfortunate that people abuse TOR in this way, but it's not something I will consider removing.

>I hope the owner can get it back up or hope other instances can allow Tor at least I made the decision after several days of heavy abuse from TOR exits to block them. I will not be removing the block and have automated updating it with any new exits. prior to blocking TOR exits, we were receiving on average over 30k requests per second. after it's down to 10-11k. all used for scraping. it's unfortunate that people abuse TOR in this way, but it's not something I will consider removing.
unixfox commented 2024-11-13 10:41:34 -05:00 (Migrated from github.com)

@initd0

Im experiencing the same issue as you since few days now. However im using Tor and none of the other current working instances including xcancel.com allow Tor connections which is very sad.
https://nitter.privacydev.net/ was the only instance that you could use to browse with Tor.
I hope the owner can get it back up or hope other instances can allow Tor at least

Odd xcancel.com works for me on Tor with the default settings.

Can you send an email at antibot [at] xcancel.com? With some explanation and a screenshot.

I'll try to see what's going on.

@initd0 > Im experiencing the same issue as you since few days now. However im using Tor and none of the other current working instances including xcancel.com allow Tor connections which is very sad. > https://nitter.privacydev.net/ was the only instance that you could use to browse with Tor. > I hope the owner can get it back up or hope other instances can allow Tor at least Odd xcancel.com works for me on Tor with the default settings. Can you send an email at antibot [at] xcancel.com? With some explanation and a screenshot. I'll try to see what's going on.
lukefromdc commented 2024-11-13 13:26:40 -05:00 (Migrated from github.com)

My guess is the few surviving Nitter instances have to take extreme precautions against
bulk scraping expecially by bots or AI to avoid being blocked.

My guess is the few surviving Nitter instances have to take extreme precautions against bulk scraping expecially by bots or AI to avoid being blocked.
lukefromdc commented 2024-11-13 13:34:15 -05:00 (Migrated from github.com)

If someone wanted to set up a dedicated (maybe .onion?) nitter instance just for Tor,
they'd need a way to rate limit each connection to human possible numbers of
connections. This would have to be for each connection separately, and at a very
low rate like one request per second. DDOS scripts might be possible to break by
having the whole instance respond to a wave of bot hits by going offline for first
30 seconds, then five minutes, then an hour and escalating as needed if attacks
continue.

If someone wanted to set up a dedicated (maybe .onion?) nitter instance just for Tor, they'd need a way to rate limit each connection to human possible numbers of connections. This would have to be for each connection separately, and at a very low rate like one request per second. DDOS scripts might be possible to break by having the whole instance respond to a wave of bot hits by going offline for first 30 seconds, then five minutes, then an hour and escalating as needed if attacks continue.
jonathantullett commented 2024-11-14 04:16:54 -05:00 (Migrated from github.com)

I'm sure this has been answered but as it's now an enormous thread, it's hard to find the details:

What is the canonical way to configure a nitter instance using multiple accounts for use, ideally with tokens being refreshed if needed? Thank you.

I'm sure this has been answered but as it's now an enormous thread, it's hard to find the details: What is the canonical way to configure a nitter instance using multiple accounts for use, ideally with tokens being refreshed if needed? Thank you.
unixfox commented 2024-11-14 04:23:24 -05:00 (Migrated from github.com)

I'm sure this has been answered but as it's now an enormous thread, it's hard to find the details:

What is the canonical way to configure a nitter instance using multiple accounts for use, ideally with tokens being refreshed if needed? Thank you.

https://github.com/sekai-soft/guide-nitter-self-hosting

> I'm sure this has been answered but as it's now an enormous thread, it's hard to find the details: > > What is the canonical way to configure a nitter instance using multiple accounts for use, ideally with tokens being refreshed if needed? Thank you. https://github.com/sekai-soft/guide-nitter-self-hosting
initd0 commented 2024-11-14 05:17:19 -05:00 (Migrated from github.com)

@initd0

Im experiencing the same issue as you since few days now. However im using Tor and none of the other current working instances including xcancel.com allow Tor connections which is very sad.
https://nitter.privacydev.net/ was the only instance that you could use to browse with Tor.
I hope the owner can get it back up or hope other instances can allow Tor at least

Odd xcancel.com works for me on Tor with the default settings.

Can you send an email at antibot [at] xcancel.com? With some explanation and a screenshot.

I'll try to see what's going on.

If you can just whitelist QuiteRSS reader, that would be great, because it throws an error saying "RSS reader not yet whitelist!" - I think thats the only issue preventing from using Tor in the reader.

The actual onion links on the wiki dont really work either.

> @initd0 > > > Im experiencing the same issue as you since few days now. However im using Tor and none of the other current working instances including xcancel.com allow Tor connections which is very sad. > > https://nitter.privacydev.net/ was the only instance that you could use to browse with Tor. > > I hope the owner can get it back up or hope other instances can allow Tor at least > > Odd xcancel.com works for me on Tor with the default settings. > > Can you send an email at antibot [at] xcancel.com? With some explanation and a screenshot. > > I'll try to see what's going on. If you can just whitelist QuiteRSS reader, that would be great, because it throws an error saying "RSS reader not yet whitelist!" - I think thats the only issue preventing from using Tor in the reader. The actual onion links on the wiki dont really work either.
unixfox commented 2024-11-14 05:43:20 -05:00 (Migrated from github.com)

If you can just whitelist QuiteRSS reader, that would be great, because it throws an error saying "RSS reader not yet whitelist!" - I think thats the only issue preventing from using Tor in the reader.

The actual onion links on the wiki dont really work either.

Please follow the instructions and send an email at rss [at] xcancel.com

> If you can just whitelist QuiteRSS reader, that would be great, because it throws an error saying "RSS reader not yet whitelist!" - I think thats the only issue preventing from using Tor in the reader. > > The actual onion links on the wiki dont really work either. > Please follow the instructions and send an email at rss [at] xcancel.com
cmj commented 2024-11-14 17:51:34 -05:00 (Migrated from github.com)

This should now work for people wanting to add accounts by hand.

https://gist.github.com/cmj/998f59680e3549e7f181057074eccaa3

This should *now* work for people wanting to add accounts by hand. https://gist.github.com/cmj/998f59680e3549e7f181057074eccaa3
Apachez- commented 2024-12-20 14:55:40 -05:00 (Migrated from github.com)

Looks like xcancel.com have been malfunctioning for a few hours... hopefully that will be resolved soon?

"
500 Internal Server Error
openresty
"

The main page at https://xcancel.com works but not any subpage to get actual user content.

Looks like xcancel.com have been malfunctioning for a few hours... hopefully that will be resolved soon? " 500 Internal Server Error openresty " The main page at https://xcancel.com works but not any subpage to get actual user content.
lukefromdc commented 2024-12-23 02:41:12 -05:00 (Migrated from github.com)

As of now nitter.poast.org still works

As of now nitter.poast.org still works
muhitrhn commented 2025-01-06 04:47:09 -05:00 (Migrated from github.com)

Back in August someone posted a script that gives you the auth token from a logged in account: #983 (comment)
If someone can get it working, please share.

Here you go

import requests
import base64
username = 'XXXXXXXXXXXX'
password = 'XXXXXXXXXXXX'
TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w'
TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'
TW_ANDROID_BASIC_TOKEN = 'Basic {token}'.format(token=base64.b64encode(
    (TW_CONSUMER_KEY + ":" + TW_CONSUMER_SECRET).encode()
).decode())
# print(TW_ANDROID_BASIC_TOKEN)


authentication = None
bearer_token_req = requests.post("https://api.twitter.com/oauth2/token",
	headers={
      'Authorization': TW_ANDROID_BASIC_TOKEN,
      "Content-Type": "application/x-www-form-urlencoded",
    },
	data='grant_type=client_credentials'
).json()
bearer_token = ' '.join(str(x) for x in bearer_token_req.values())
print(bearer_token)

# The bearer token is immutable
# Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F
guest_token = requests.post("https://api.twitter.com/1.1/guest/activate.json", headers={
	'Authorization': bearer_token,
}).json()['guest_token']
print(guest_token)

twitter_header = {
    'Authorization': bearer_token,
    "Content-Type": "application/json",
    "User-Agent":
        "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)",
    "X-Twitter-API-Version": '5',
    "X-Twitter-Client": "TwitterAndroid",
    "X-Twitter-Client-Version": "9.95.0-release.0",
    "OS-Version": "28",
    "System-User-Agent":
        "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)",
    "X-Twitter-Active-User": "yes",
    "X-Guest-Token": guest_token,
}

session = requests.Session()


task1 = session.post('https://api.twitter.com/1.1/onboarding/task.json',
	params={
		'flow_name': 'login',
		'api_version': '1',
		'known_device_token': '',
		'sim_country_code': 'us'
	},
	json={
		"flow_token": None,
		"input_flow_data": {
			"country_code": None,
			"flow_context": {
				"referrer_context": {
					"referral_details": "utm_source=google-play&utm_medium=organic",
					"referrer_url": ""
				},
				"start_location": {
					"location": "deeplink"
				}
			},
			"requested_variant": None,
			"target_user_id": 0
		}
	},
	headers=twitter_header
)

session.headers['att'] = task1.headers.get('att')
task2 = session.post('https://api.twitter.com/1.1/onboarding/task.json', 
	json={
        "flow_token": task1.json().get('flow_token'),
        "subtask_inputs": [{
                "enter_text": {
                    "suggestion_id": None,
                    "text": username,
                    "link": "next_link"
                },
                "subtask_id": "LoginEnterUserIdentifier"
            }
        ]
    },
	headers=twitter_header
)

task3 = session.post('https://api.twitter.com/1.1/onboarding/task.json', 
	json={
        "flow_token": task2.json().get('flow_token'),
        "subtask_inputs": [{
                "enter_password": {
                    "password": password,
                    "link": "next_link"
                },
                "subtask_id": "LoginEnterPassword"
            }
        ],
    },
	headers=twitter_header
)

task4 = session.post('https://api.twitter.com/1.1/onboarding/task.json', 
	json={
        "flow_token": task3.json().get('flow_token'),
        "subtask_inputs": [{
                "check_logged_in_account": {
                    "link": "AccountDuplicationCheck_false"
                },
                "subtask_id": "AccountDuplicationCheck"
            }
        ]
    },
	headers=twitter_header
).json()

for t4_subtask in task4.get('subtasks', []):
	if 'open_account' in t4_subtask:
		authentication = t4_subtask['open_account']
		break
	elif 'enter_text' in t4_subtask:
		response_text = t4_subtask['enter_text']['hint_text']
		code = input(f'Requesting {response_text}: ')
		task5 = session.post('https://api.twitter.com/1.1/onboarding/task.json', json={
			"flow_token": task4.get('flow_token'),
			"subtask_inputs": [{
				"enter_text": {
					"suggestion_id": None,
					"text": code,
					"link": "next_link"
				},
				"subtask_id": "LoginAcid"
			}]
		}, headers=twitter_header).json()
		print(task5)
		for t5_subtask in task5.get('subtasks', []):
			print(t5_subtask)
			if 'open_account' in t5_subtask:
				authentication = t5_subtask['open_account']


print(authentication)
		
# {
# 	'attribution_event': 'login',
# 	'known_device_token': 'XXXXXXXXXXXXXXXXXXXXXX',
# 	'next_link': {
# 		'link_id': 'next_link',
# 		'link_type': 'subtask',
# 		'subtask_id': 'SuccessExit'
# 	},
# 	'oauth_token': 'XXXXXXXXXXXXXXXXXXXXXX',
# 	'oauth_token_secret': 'XXXXXXXXXXXXXXXXXXXXXX',
# 	'user': {
# 		'id': 'XXXXXXXXXXXXXXXXXXXXXX',
# 		'id_str': 'XXXXXXXXXXXXXXXXXXXXXX',
# 		'name': 'XXXXXXXXXXXXXXXXXXXXXX',
# 		'screen_name': 'XXXXXXXXXXXXXXXXXXXXXX'
# 	}
# }

What can I do in case of the account has 2 Step Verification?

> > Back in August someone posted a script that gives you the auth token from a logged in account: [#983 (comment)](https://github.com/zedeus/nitter/issues/983#issuecomment-1688495284) > > If someone can get it working, please share. > > Here you go > > ```python > import requests > import base64 > username = 'XXXXXXXXXXXX' > password = 'XXXXXXXXXXXX' > TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w' > TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys' > TW_ANDROID_BASIC_TOKEN = 'Basic {token}'.format(token=base64.b64encode( > (TW_CONSUMER_KEY + ":" + TW_CONSUMER_SECRET).encode() > ).decode()) > # print(TW_ANDROID_BASIC_TOKEN) > > > authentication = None > bearer_token_req = requests.post("https://api.twitter.com/oauth2/token", > headers={ > 'Authorization': TW_ANDROID_BASIC_TOKEN, > "Content-Type": "application/x-www-form-urlencoded", > }, > data='grant_type=client_credentials' > ).json() > bearer_token = ' '.join(str(x) for x in bearer_token_req.values()) > print(bearer_token) > > # The bearer token is immutable > # Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F > guest_token = requests.post("https://api.twitter.com/1.1/guest/activate.json", headers={ > 'Authorization': bearer_token, > }).json()['guest_token'] > print(guest_token) > > twitter_header = { > 'Authorization': bearer_token, > "Content-Type": "application/json", > "User-Agent": > "TwitterAndroid/9.95.0-release.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)", > "X-Twitter-API-Version": '5', > "X-Twitter-Client": "TwitterAndroid", > "X-Twitter-Client-Version": "9.95.0-release.0", > "OS-Version": "28", > "System-User-Agent": > "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3010 Build/PKQ1.181203.001)", > "X-Twitter-Active-User": "yes", > "X-Guest-Token": guest_token, > } > > session = requests.Session() > > > task1 = session.post('https://api.twitter.com/1.1/onboarding/task.json', > params={ > 'flow_name': 'login', > 'api_version': '1', > 'known_device_token': '', > 'sim_country_code': 'us' > }, > json={ > "flow_token": None, > "input_flow_data": { > "country_code": None, > "flow_context": { > "referrer_context": { > "referral_details": "utm_source=google-play&utm_medium=organic", > "referrer_url": "" > }, > "start_location": { > "location": "deeplink" > } > }, > "requested_variant": None, > "target_user_id": 0 > } > }, > headers=twitter_header > ) > > session.headers['att'] = task1.headers.get('att') > task2 = session.post('https://api.twitter.com/1.1/onboarding/task.json', > json={ > "flow_token": task1.json().get('flow_token'), > "subtask_inputs": [{ > "enter_text": { > "suggestion_id": None, > "text": username, > "link": "next_link" > }, > "subtask_id": "LoginEnterUserIdentifier" > } > ] > }, > headers=twitter_header > ) > > task3 = session.post('https://api.twitter.com/1.1/onboarding/task.json', > json={ > "flow_token": task2.json().get('flow_token'), > "subtask_inputs": [{ > "enter_password": { > "password": password, > "link": "next_link" > }, > "subtask_id": "LoginEnterPassword" > } > ], > }, > headers=twitter_header > ) > > task4 = session.post('https://api.twitter.com/1.1/onboarding/task.json', > json={ > "flow_token": task3.json().get('flow_token'), > "subtask_inputs": [{ > "check_logged_in_account": { > "link": "AccountDuplicationCheck_false" > }, > "subtask_id": "AccountDuplicationCheck" > } > ] > }, > headers=twitter_header > ).json() > > for t4_subtask in task4.get('subtasks', []): > if 'open_account' in t4_subtask: > authentication = t4_subtask['open_account'] > break > elif 'enter_text' in t4_subtask: > response_text = t4_subtask['enter_text']['hint_text'] > code = input(f'Requesting {response_text}: ') > task5 = session.post('https://api.twitter.com/1.1/onboarding/task.json', json={ > "flow_token": task4.get('flow_token'), > "subtask_inputs": [{ > "enter_text": { > "suggestion_id": None, > "text": code, > "link": "next_link" > }, > "subtask_id": "LoginAcid" > }] > }, headers=twitter_header).json() > print(task5) > for t5_subtask in task5.get('subtasks', []): > print(t5_subtask) > if 'open_account' in t5_subtask: > authentication = t5_subtask['open_account'] > > > print(authentication) > > # { > # 'attribution_event': 'login', > # 'known_device_token': 'XXXXXXXXXXXXXXXXXXXXXX', > # 'next_link': { > # 'link_id': 'next_link', > # 'link_type': 'subtask', > # 'subtask_id': 'SuccessExit' > # }, > # 'oauth_token': 'XXXXXXXXXXXXXXXXXXXXXX', > # 'oauth_token_secret': 'XXXXXXXXXXXXXXXXXXXXXX', > # 'user': { > # 'id': 'XXXXXXXXXXXXXXXXXXXXXX', > # 'id_str': 'XXXXXXXXXXXXXXXXXXXXXX', > # 'name': 'XXXXXXXXXXXXXXXXXXXXXX', > # 'screen_name': 'XXXXXXXXXXXXXXXXXXXXXX' > # } > # } > ``` What can I do in case of the account has 2 Step Verification?
zedeus commented 2025-01-29 23:54:37 -05:00 (Migrated from github.com)

I'm happy to announce nitter.net has finally returned. Instability is expected for a while until scraping prevention is improved, etc.

Running an instance is now both difficult and expensive, but it's possible. If anybody is interested please feel free to message me on Matrix.

I'll be updating the guest_accounts PR soon and merge it to master, stay tuned.

I'm happy to announce nitter.net has finally returned. Instability is expected for a while until scraping prevention is improved, etc. Running an instance is now both difficult and expensive, but it's possible. If anybody is interested please feel free to message me on Matrix. I'll be updating the guest_accounts PR soon and merge it to master, stay tuned.
animegrafmays commented 2025-01-29 23:57:08 -05:00 (Migrated from github.com)

Good to hear, thanks for sticking with us friend. Looking forward to many more popping up soon 🙏🏻🩷

Good to hear, thanks for sticking with us friend. Looking forward to many more popping up soon 🙏🏻🩷
Yetangitu commented 2025-01-30 10:02:43 -05:00 (Migrated from github.com)

Good to hear, I've been running an instance all through the changeover from Twitter to X, from no-account to guest-account to registered-throwaway-account and will be glad to go back to guest-account.

Good to hear, I've been running an instance all through the changeover from Twitter to X, from no-account to guest-account to registered-throwaway-account and will be glad to go back to guest-account.
zedeus commented 2025-01-30 17:21:15 -05:00 (Migrated from github.com)

Sorry to disappoint, but guest accounts are not back.

Sorry to disappoint, but guest accounts are not back.
satonotdead commented 2025-02-01 18:20:19 -05:00 (Migrated from github.com)

I'm not a developer. I just want to express gratitude to this project and may I know why they win?

What are the minimal requirements for get this working? It's about time, money, technical knowledge or all of them at scale?

Running a single instance is the best humanity can do those days? I'm polite asking, trying to understand and giving praise to devs.

It's currently the same on Invidious and similar teams. Free internet is almost dead?

Please delete this message if it's not a valuable comment. Trying to philo it's the best activity I can share here.

I'm not a developer. I just want to express gratitude to this project and may I know why they win? What are the minimal requirements for get this working? It's about time, money, technical knowledge or all of them at scale? Running a single instance is the best humanity can do those days? I'm polite asking, trying to understand and giving praise to devs. It's currently the same on Invidious and similar teams. Free internet is almost dead? Please delete this message if it's not a valuable comment. Trying to philo it's the best activity I can share here.
mthmcalixto commented 2025-02-03 18:09:41 -05:00 (Migrated from github.com)

I'm happy to announce nitter.net has finally returned. Instability is expected for a while until scraping prevention is improved, etc.

Running an instance is now both difficult and expensive, but it's possible. If anybody is interested please feel free to message me on Matrix.

I'll be updating the guest_accounts PR soon and merge it to master, stay tuned.

better late than never.

> I'm happy to announce nitter.net has finally returned. Instability is expected for a while until scraping prevention is improved, etc. > > Running an instance is now both difficult and expensive, but it's possible. If anybody is interested please feel free to message me on Matrix. > > I'll be updating the guest_accounts PR soon and merge it to master, stay tuned. better late than never.
gabrielsroka commented 2025-02-03 20:50:45 -05:00 (Migrated from github.com)

@csisoap , these first few lines seem to work just as well. requests knows how to do basic auth/base64 encoding...

import requests

username = 'XXXXXXXXXXXX'
password = 'XXXXXXXXXXXX'
TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w'
TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'

bearer_token_req = requests.post("https://api.twitter.com/oauth2/token", 
    auth=(TW_CONSUMER_KEY, TW_CONSUMER_SECRET),
    headers={
      "Content-Type": "application/x-www-form-urlencoded",
    },
    data='grant_type=client_credentials'
).json()
bearer_token = ' '.join(str(x) for x in bearer_token_req.values())
print(bearer_token)

i'd probably rename bearer_token_req to token, and its values are strings, so

token = requests.post("https://api.twitter.com/oauth2/token", 
    auth=(TW_CONSUMER_KEY, TW_CONSUMER_SECRET),
    headers={
      "Content-Type": "application/x-www-form-urlencoded",
    },
    data='grant_type=client_credentials'
).json()
bearer_token = ' '.join(x for x in token.values())

since the default content-type is urlencoded, if u set data correctly:

token = requests.post("https://api.twitter.com/oauth2/token",
    auth=(TW_CONSUMER_KEY, TW_CONSUMER_SECRET),
    data={'grant_type': 'client_credentials'}
).json()

also, you can probably

session = requests.Session()
session.headers = twitter_header # or session.headers.update...

and then remove headers=twitter_header from future calls to session.post()

@csisoap , these first few lines seem to work just as well. `requests` knows how to do basic auth/base64 encoding... ```py import requests username = 'XXXXXXXXXXXX' password = 'XXXXXXXXXXXX' TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w' TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys' bearer_token_req = requests.post("https://api.twitter.com/oauth2/token", auth=(TW_CONSUMER_KEY, TW_CONSUMER_SECRET), headers={ "Content-Type": "application/x-www-form-urlencoded", }, data='grant_type=client_credentials' ).json() bearer_token = ' '.join(str(x) for x in bearer_token_req.values()) print(bearer_token) ``` i'd probably rename `bearer_token_req` to `token`, and its values are strings, so ```py token = requests.post("https://api.twitter.com/oauth2/token", auth=(TW_CONSUMER_KEY, TW_CONSUMER_SECRET), headers={ "Content-Type": "application/x-www-form-urlencoded", }, data='grant_type=client_credentials' ).json() bearer_token = ' '.join(x for x in token.values()) ``` since the default content-type is urlencoded, if u set data correctly: ```py token = requests.post("https://api.twitter.com/oauth2/token", auth=(TW_CONSUMER_KEY, TW_CONSUMER_SECRET), data={'grant_type': 'client_credentials'} ).json() ``` also, you can probably ```py session = requests.Session() session.headers = twitter_header # or session.headers.update... ``` and then remove `headers=twitter_header` from future calls to `session.post()`
zedeus commented 2025-02-05 20:19:55 -05:00 (Migrated from github.com)

Closing, any further discussions may take place in #1212

Closing, any further discussions may take place in #1212
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#983
No description provided.