66 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from pathlib import Path
 | |
| 
 | |
| from twikit import Client
 | |
| from twikit.errors import Forbidden, Unauthorized
 | |
| 
 | |
| from . import Feed
 | |
| from ..utils import config, PROGRAM_NAME, prompt
 | |
| 
 | |
| 
 | |
| class TwitterFeed(Feed):
 | |
|     __config_name__ = "twitter"
 | |
| 
 | |
|     @classmethod
 | |
|     def prompt_auth(cls) -> dict:
 | |
|         """
 | |
|         client.login(
 | |
|             auth_info_1=USERNAME ,
 | |
|             auth_info_2=EMAIL,
 | |
|             password=PASSWORD
 | |
|         )
 | |
|         """
 | |
| 
 | |
|         return {
 | |
|             "auth_info_1": prompt.for_string("Username"),
 | |
|             "auth_info_2": prompt.for_string("Email"),
 | |
|             "password": prompt.for_password("Password"),
 | |
|         }
 | |
| 
 | |
|     # https://github.com/d60/twikit
 | |
|     def __init__(self, auth_info_1: str, auth_info_2: str, password: str, cookies: dict = None, **kwargs):
 | |
|         super().__init__()
 | |
| 
 | |
|         self.client = Client('en-US')
 | |
| 
 | |
|         logged_in = False
 | |
|         
 | |
|         if cookies is not None:
 | |
|             self.client.http.client.cookies = cookies
 | |
|             try:
 | |
|                 self.client.user_id()
 | |
|                 logged_in = True
 | |
|             except (Forbidden, Unauthorized):
 | |
|                 self.logger.warning("Cookies are expired.")
 | |
|                 self.client.http.client.cookies.clear()
 | |
| 
 | |
|         if not logged_in:
 | |
|             self.logger.info("Logging in with username and email.")
 | |
|             self.client.login(
 | |
|                 auth_info_1=auth_info_1,
 | |
|                 auth_info_2=auth_info_2,
 | |
|                 password=password,
 | |
|             )
 | |
|             logged_in = True
 | |
| 
 | |
|         config.set_field(self.__config_name__, {
 | |
|             'cookies': dict(self.client.http.client.cookies)
 | |
|         }, update_dict=True)
 | |
| 
 | |
|     def post(self, message: str):
 | |
| 
 | |
|         self.client.create_tweet(
 | |
|             text=message,
 | |
|         )
 | |
| 
 | |
|         super().post(message)
 |