diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..749ce63 --- /dev/null +++ b/backend/.env.example @@ -0,0 +1 @@ +BEARER_TOKEN= \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..c66ba3a --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,2 @@ +.env +.venv \ No newline at end of file diff --git a/backend/Pipfile b/backend/Pipfile new file mode 100644 index 0000000..55f7993 --- /dev/null +++ b/backend/Pipfile @@ -0,0 +1,14 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +tweepy = "*" +python-dotenv = "*" + +[dev-packages] +autopep8 = "*" + +[requires] +python_version = "3.10" diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock new file mode 100644 index 0000000..311f784 --- /dev/null +++ b/backend/Pipfile.lock @@ -0,0 +1,118 @@ +{ + "_meta": { + "hash": { + "sha256": "076ebc5063c8ac3902f789ecb5e27ca1a027009fe96c8ebcdcb01cf2decf975c" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.10" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "certifi": { + "hashes": [ + "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14", + "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==2022.9.24" + }, + "charset-normalizer": { + "hashes": [ + "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", + "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==2.1.1" + }, + "idna": { + "hashes": [ + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + ], + "markers": "python_version >= '3.5'", + "version": "==3.4" + }, + "oauthlib": { + "hashes": [ + "sha256:1565237372795bf6ee3e5aba5e2a85bd5a65d0e2aa5c628b9a97b7d7a0da3721", + "sha256:88e912ca1ad915e1dcc1c06fc9259d19de8deacd6fd17cc2df266decc2e49066" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==3.2.1" + }, + "python-dotenv": { + "hashes": [ + "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5", + "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045" + ], + "index": "pypi", + "version": "==0.21.0" + }, + "requests": { + "hashes": [ + "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", + "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" + ], + "markers": "python_version >= '3.7' and python_version < '4'", + "version": "==2.28.1" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5", + "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.3.1" + }, + "tweepy": { + "hashes": [ + "sha256:0a21396b646af4fcee69762d2908c104e1fe2e2c4e1dfd6e6078a41b38771382", + "sha256:310193775d7fc381abd6f37021a9af27f7e9edfcce5ec51bd73ea5f30c21fa61" + ], + "index": "pypi", + "version": "==4.10.1" + }, + "urllib3": { + "hashes": [ + "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", + "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'", + "version": "==1.26.12" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:6f09e90a2be784317e84dc1add17ebfc7abe3924239957a37e5040e27d812087", + "sha256:ca9b1a83e53a7fad65d731dc7a2a2d50aa48f43850407c59f6a1a306c4201142" + ], + "index": "pypi", + "version": "==1.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785", + "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b" + ], + "markers": "python_version >= '3.6'", + "version": "==2.9.1" + }, + "toml": { + "hashes": [ + "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", + "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.10.2" + } + } +} diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..d871034 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,29 @@ +# CelebrityWall + +### 1) Setup the project + +install pipenv +```bash +pip install pipenv +``` + +install python packages + +```bash +pipenv install --dev +``` + +### 2) Set requirement variables +- Create `.env` same as `.env.example` + +- Change `username` in `main.py` (Note: until we have list of Celebrities) + +### 3) run the script + +```bash +pipenv shell +python main.py +``` + +### 3) More +The python Library we use to call twitter API: https://github.com/tweepy/tweepy diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/helpers/__init__.py b/backend/helpers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/helpers/user_tweets.py b/backend/helpers/user_tweets.py new file mode 100644 index 0000000..e1e20f8 --- /dev/null +++ b/backend/helpers/user_tweets.py @@ -0,0 +1,48 @@ + +from datetime import datetime, timezone +import tweepy + +WANTED_HASHTAGS = ["#mahsaamini", "#مهسا_امینی", "#opiran"] + + +def get_user_tweets(client: tweepy.Client, user_name: str, start_date: datetime.astimezone, end_date: datetime.astimezone): + """Get User's Tweets + This endpoint/method returns Tweets composed by a single user, + specified by the requested user ID + + :param user_name + :return: [user tweets] + """ + + # Get user by username + user = client.get_user(username=user_name) + if not user.data: + # if there is no user, return None + return None + user = user.data + + # Get user tweets + # TODO: find a way to filter by hashtag here + users_tweets = client.get_users_tweets( + id=user.id, + end_time=start_date, + start_time=end_date + ) + return users_tweets.data + + +def get_user_tweets_by_hashtag(client: tweepy.Client, user_name: str, start_date: datetime.astimezone, end_date: datetime.astimezone): + """Get User's tweets which has the hashtag + + :param user_name + :return: [Tweet ID] + """ + # call the get_user_tweets function + users_tweets = get_user_tweets(client, user_name, start_date, end_date) + if users_tweets: + tweets_with_hashtag = [] + for tweet in users_tweets: + # Check if one of hashtags is on the tweet + if any([wanted_hashtag in tweet.text.lower() for wanted_hashtag in WANTED_HASHTAGS]): + tweets_with_hashtag.append(tweet.id) + return tweets_with_hashtag diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..862def2 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,24 @@ +import tweepy +from dotenv import dotenv_values +from helpers.user_tweets import get_user_tweets_by_hashtag +from datetime import datetime + +# Get the .env values +config = dotenv_values(".env") + +bearer_token = config.get("BEARER_TOKEN") +# access_token = config.get("API_KEY") +# access_token_secret = config.get("API_KEY_SECRET") + +start_date = datetime.now().astimezone() +end_date = datetime(2022, 9, 16, 0, 0, 0, 0).astimezone() + +# set-up tweepy Client +client = tweepy.Client(bearer_token) + + +# Get user Tweets +# TODO: Loop all the users +username = "FoadHaydri" +tweet_ids = get_user_tweets_by_hashtag(client, username, start_date, end_date) +print(tweet_ids)