From bb83d1d72fa58728323c65ee7eb6520537ab4bc0 Mon Sep 17 00:00:00 2001 From: JustAnotherArchivist Date: Mon, 24 Aug 2020 19:03:52 +0000 Subject: [PATCH] Validate Twitter usernames Closes #55 --- snscrape/modules/twitter.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/snscrape/modules/twitter.py b/snscrape/modules/twitter.py index 12283d6..db0e96d 100644 --- a/snscrape/modules/twitter.py +++ b/snscrape/modules/twitter.py @@ -7,6 +7,7 @@ import random import logging import re import snscrape.base +import string import time import typing import urllib.parse @@ -254,6 +255,8 @@ class TwitterUserScraper(TwitterSearchScraper): name = 'twitter-user' def __init__(self, username, **kwargs): + if not self.is_valid_username(username): + raise ValueError('Invalid username') super().__init__(f'from:{username}', **kwargs) self._username = username @@ -306,9 +309,18 @@ class TwitterUserScraper(TwitterSearchScraper): profileBannerUrl = user['legacy'].get('profile_banner_url'), ) + @staticmethod + def is_valid_username(s): + return 1 <= len(s) <= 15 and s.strip(string.ascii_letters + string.digits + '_') == '' + @classmethod def setup_parser(cls, subparser): - subparser.add_argument('username', help = 'A Twitter username (without @)') + def username(s): + if cls.is_valid_username(s): + return s + raise ValueError('Invalid username') + + subparser.add_argument('username', type = username, help = 'A Twitter username (without @)') @classmethod def from_args(cls, args):