Twitter (X) पर पसंद की गई सभी चीज़ों को प्राप्त करने के लिए एक स्क्रिप्ट
नमस्ते, मैं अक्षम हूँ। Twikit नामक एक अनौपचारिक API का उपयोग करके Twitter को स्क्रैप करना संभव है, लेकिन कुछ समय पहले से, नमूना कोड में अतुल्यकालिकता (asynchronicity) की सिफारिश की जा रही थी, और जब मैंने अपग्रेड किया, तो मुझे पता चला कि मुझे अतुल्यकालिक रूप से काम न करने के लिए डांटा जा रहा था, इसलिए मैंने सब कुछ ठीक कर दिया।
haturatu/xd_likes
इस तरह, मैं पहले all_tweets में सब कुछ संग्रहीत करता हूँ।
एक बार जब निर्दिष्ट अधिकतम मान प्राप्त हो जाता है,
मैं all_tweets में सभी ट्वीट्स की सामग्री प्राप्त करूँगा।
यह सब fav.log में लिखा जाएगा, इसलिए यदि आवश्यक हो तो आप grep का उपयोग करके सभी जानकारी निकाल सकते हैं।
API सीमाएँ
https://github.com/d60/twikit/blob/main/ratelimits.md
जैसा कि आप देख सकते हैं, API सीमाएँ काफी भिन्न होती हैं।
इसलिए, मुझे पुनः प्रयास सेटिंग्स के साथ कई बार प्रयास करने की आवश्यकता थी।
# पुनः प्रयास सेटिंग्स
RETRY_LIMIT = 10
RETRY_DELAY = 300
# पुनः प्रयास पर निष्पादित होने वाला फ़ंक्शन
async def perform_request_with_retries(request_func, *args, **kwargs):
for attempt in range(RETRY_LIMIT):
try:
response = await request_func(*args, **kwargs) # अतुल्यकालिक अनुरोध की प्रतीक्षा करें
if response:
return response
except ReadTimeout:
logger.warning(f"Attempt {attempt + 1} failed due to ReadTimeout.")
except Exception as e:
logger.error(f"Attempt {attempt + 1} failed: {e}")
await asyncio.sleep(RETRY_DELAY)
raise Exception("Failed to fetch more tweets after retries.")
चूंकि API सीमाएँ हर 15 मिनट में रीसेट होती हैं, मुझे लगता है कि यदि मैं कुल 50 मिनट तक प्रयास कर सकता हूँ, तो मैंने पर्याप्त समय मार्जिन बनाया है। यह वह हिस्सा था जहाँ मैं काफी अटक गया था; जब मैंने अंतिम सीमा तक धकेलने की कोशिश की, तो इसमें अनंत समय लग गया, इसलिए मैंने अधिकतम मान को काफी बढ़ा दिया।
छवि सहेजना
मैंने लाइक प्राप्त करने वाले स्क्रिप्ट से अलग एक डाउनलोड स्क्रिप्ट को अलग कर दिया है।
मैं xd.py में छवियों को सहेजूँगा।
यदि इसे मानक के रूप में रखा जाता है, तो इसे उच्चतम गुणवत्ता में सहेजा नहीं जा सकता है, इसलिए मैं प्राप्त URL में 'original' पैरामीटर जोड़ता हूँ।
while user_tweets:
for tweet in user_tweets:
for media in tweet.media:
url = media['media_url_https']
if url.endswith('.jpg'):
url = url.replace('.jpg', '?format=jpg&name=orig')
clean_url = get_clean_url(url)
save_path = os.path.join(save_folder, f"{screen_name}_{clean_url.split('/')[-1]}.jpeg")
await download_image(url, save_path)
PNG की गुणवत्ता बेहतर है, लेकिन शायद केवल वे ही मौजूद हैं जो PNG में अपलोड किए गए हैं? पैरामीटर और PNG काफी जगह घेरते हैं, इसलिए मैंने JPG से समझौता किया।
प्रत्येक प्राप्त ID के लिए एक फ़ोल्डर बनाया जाता है और उसमें सहेजा जाता है, और छवियों को भी ID दी जाती है, जो एक विचारशील विनिर्देश है जिससे जापानी भी खुश होंगे।
वर्तमान में, मुझे कोई अन्य समान स्क्रिप्ट नहीं मिली, इसलिए मैंने इसे प्रकाशित करने का प्रयास किया। या शायद हर कोई इसे गुप्त रूप से करता है, इसलिए वे इसे सार्वजनिक नहीं करना चाहते हैं...
वैसे, यदि आप केवल उन पोस्ट की छवियों को सहेजना चाहते हैं जिन्हें आपने पसंद किया है, क्योंकि fav.log में पसंद किए गए URL हैं, तो आपको इसे अलग से करने की आवश्यकता होगी, लेकिन यह संभव है। इसीलिए मैं सब कुछ fav.log में डाल रहा हूँ।
वास्तव में, मैंने सोचा कि fav.log और सभी ट्वीट्स को फ़ेच करने के लॉग को अलग करना बेहतर होगा, लेकिन मैं थक गया हूँ, इसलिए मैं इसे यहीं समाप्त करता हूँ।
ठीक है।
फिर से मिलते हैं।