ساخت ربات پایتون برای توییتر، اینستاگرام و Reddit — راهنمای کاربردی

۴۴۵ بازدید
آخرین به‌روزرسانی: ۲۴ مهر ۱۴۰۱
زمان مطالعه: ۶ دقیقه
ساخت ربات پایتون برای توییتر، اینستاگرام و Reddit — راهنمای کاربردی

اینک سال 2019 فرا رسیده است و همه جا صحبت از ربات‌ها است. برای نمونه چت‌بات‌ها، ایمیل بات‌ها، ربات‌های وب اسکرپینگ و ربات‌های شبکه‌های اجتماعی همه اطراف ما را احاطه کرده‌اند. آیا تاکنون یک ربات ساخته‌اید؟ این کار فوق‌العاده آسان است. احتمالاً به همین دلیل است که آن‌ها همه جا گسترش یافته‌اند. در این مقاله نشان می‌دهیم که چگونه می‌توان با بهره‌گیری از پایتون اقدام به ساخت ربات پایتون برای توییتر، اینستاگرام و Reddit کرده و تعامل خودکار با حساب‌های کاربری این رسانه‌های اجتماعی داشت.

997696

کار با پایتون

در این راهنمای عملی از پایتون به عنوان زبان برنامه‌نویسی استفاده خواهیم کرد. مزیت سهولت استفاده از پایتون باعث شده است که هرگونه کندی آن در مقایسه با زبان‌های دیگر به چشم نیاید. شما می‌تواند پایتون را تقریباً برای هر سیستم عاملی دانلود کنید. همچنین می‌توانید از ویرایشگر مورد علاقه خود استفاده کنید.

توزیع‌های پایتون به همراه ابزاری به نام pip ارائه می‌شوند. در زمان نگارش این مقاله بیش از 168000 کتابخانه وجود داشته‌اند که امکان دانلود از طریق pip برای آن‌ها وجود داشته است. ما برای ربات‌هایی که می‌خواهیم در این نوشته ایجاد کنیم، تنها به سه مورد از این کتابخانه‌ها نیاز داریم.

در خط فرمان، می‌توانید کتابخانه‌های مورد نیاز خود را با استفاده از خطوط دستور زیر نصب کنید:

1pip install --upgrade InstagramAPI
2pip install --upgrade tweepy
3 pip install --upgrade praw

اینک می‌توانید این کتابخانه‌ها را در موارد نیاز ایمپورت کنید.

دریافت کلیدها و رمزهای اپلیکیشن

یک فیلسوف مشهور زمانی گفته است: «رمزها، رمزها هیچ جنبه سرگرمی ندارند. رمزها، رمزها به افراد صدمه می‌زنند». با این حال ربات‌ها به رمز نیاز دارند. در مرحله بعدی که می‌خواهیم ربات‌ها را راه‌اندازی کنیم، به کمک رمز می‌توانیم به آن‌ها امکان دسترسی به API هر سایت را بدهیم. به این منظور باید یک کلید و یک رمز اپلیکیشن داشته باشیم.

زمانی که همه کلیدها، رمزها، توکن‌ها و موارد دیگر را جمع‌آوری کردیم، همه آن‌ها را داخل یک فایل قرار می‌دهیم و نام آن را «credentials.py» می‌گذاریم. این فایل چیزی مانند زیر خواهد بود:

1# keys
2
3twitter_consumer_key = ''
4twitter_consumer_secret = ''
5twitter_access_token = ''
6twitter_access_token_secret = ''
7
8reddit_client_id = ''
9reddit_client_secret = ''
10reddit_user_agent = ''
11
12instagram_client_id = ''
13instagram_client_secret = ''

پیشنهاد مهمی که در خصوص حریم خصوصی داریم این است که این فایل را در هیچ سیستم کنترل نسخه مانند Git و غیره کامیت نکنید، چون هیچ کس دیگری جز شما نباید به این کلیدها و رمزها دسترسی داشته باشد. به همین دلیل است که رمز نام دارند.

راه‌اندازی دسترسی توییتر

در مورد توییتر ابتدا باید یک حساب خاص برای ربات بسازید. دقت کنید که مدت زمانی طول می‌کشد تا توییتر به درخواست شما پاسخ دهد. سپس می‌توانید با استفاده از Node.js یک ربات توییتر راه‌اندازی کنید. توضیح مراحل ایجاد این ربات خارج از حوصله این مقاله است و پیشنهاد می‌کنیم به این منظور به آموزش‌های Node.js مراجعه کنید.

پس از آن باید موارد زیر را در فایل credentials.py کپی کنید:

  • consumer key
  • consumer secret
  • access token
  • access token secret

تنظیم دسترسی به Reddit

دریافت ID و رمز کلاینت Reddit تا حدود زیادی شبیه به توییتر است. شما باید یک اپلیکیشن به صورت Reddit User Agent ثبت کنید. پس از انجام این کار باید وارد حساب Reddit خود شوید. به صفحه «ترجیح‌های اپلیکیشن‌ها» (apps preferences) بروید و روی create another app کلیک کنید. نام User Agent خود را چیز معنی‌داری بگذارید. اسکریپت مناسب اپلیکیشن خود را نیز انتخاب کنید. URL مربوط به about می‌تواند خالی باشد. در کادر redirect نیز هر آدرسی را می‌توانید وارد کنید.

ساخت ربات پایتون

پس از کلیک روی create app صفحه زیر را می‌بینید که لیستی از اپلیکیشن‌های شما را نمایش می‌دهد. رقم‌های زیر نام اپلیکیشن نشان دهنده ID کلاینت است و رمز کلاینت نیز زیر آن قرار دارد. این مقادیر را در فایل credentials.py کپی کنید.

ساخت ربات پایتون

راه‌اندازی دسترسی اینستاگرام

دسترسی اینستاگرام تا حدودی متفاوت از توییتر و ردیت است. به جای ثبت کردن یک اپلیکیشن، شما از یک نام کاربری و رمز عبور استفاده می‌کنید. بدین منظور توصیه می‌کنیم که از یک حساب عمومی استفاده کنید و جزییات ربات خود را در آن وارد نمایید.

دسترسی به Reddit با Praw

Praw یک کتابخانه پوششی API مربوط به Reddit برای پایتون است. استفاده از آن دو مرحله دارد. ابتدا باید دسترسی را به صورت یک فراخوانی تابع منفرد به متد praw در Reddit راه‌اندازی کنید. سپس با استفاده از مقداردهی شیء می‌توانید با بهره‌گیری از متد ()new به دنبال subreddit بگردید.

1import praw
2from credentials import *
3
4my_reddit = praw.Reddit(client_id=reddit_client_id, client_secret=reddit_client_secret, user_agent=reddit_user_agent)
5
6sub_name = 'technology'
7max_posts = 10
8
9for submission in my_reddit.subreddit(sub_name).new(limit=max_posts):
10	print(submission.title)

متغیر sub_name را تغییر دهید تا پست‌ها را از subreddit-های دیگر نیز بگیرد. به جای ()new از متدهای دیگر مانند ()hot برای دریافت پست‌ها استفاده کنید.

جستجوی هشتگ‌های اینستاگرام از طریق API آن

نخستین گام برای استفاده از API اینستاگرام، راه‌اندازی یک شیء با ID و رمز کلاینت است. درست پس از آن می‌توانید متد ()login را فراخوانی کرده و این فرایند را تکمیل کنید.

1from InstagramAPI import InstagramAPI
2from credentials import instagram_client_id, instagram_client_secret
3
4my_insta_api = InstagramAPI(instagram_client_id,instagram_client_secret)
5my_insta_api.login()

استفاده از API اینستاگرام نسبت به همتای Reddit آن کمی پیچیده‌تر است. در این مثال، اسکریپت از getHashtagFeed برای دریافت شیء پاسخ JSON بزرگی از اینستاگرام استفاده می‌کند.

اسکریپت در پاسخ به دنبال متن caption جستجو کرده و سپس آن را روی صفحه نمایش می‌دهد.

1get_hashtag = my_insta_api.getHashtagFeed(hashtag)
2
3if get_hashtag != False:
4 for item in my_insta_api.LastJson['items']:
5 if 'caption' in item.keys() and 'text' in item['caption'].keys():
6 	 caption = item['caption']['text']
7 print(caption)

افزودن تصاویر به رسانه‌های اجتماعی

در مراحل پیشرفته‌تر ممکن است بخواهید اسکریپت شما تصاویری را از فید هشتگ دریافت کند. به این منظور روی پاسخ JSON حلقه‌ای تعریف کرده و رسانه مرتبط با هر پست را می‌یابد. در ادامه یک پیاده‌سازی برای استخراج اطلاعات از پاسخ JSON را مشاهده می‌کنید:

1def get_images_from_hashtag(hashtag, num_images):
2	images = []
3	get_hashtag = my_insta_api.getHashtagFeed(hashtag)
4
5	if get_hashtag == False:
6		return images
7
8	for item in my_insta_api.LastJson['items']:
9		if item['media_type'] == 1 and 'image_versions2' in item.keys():
10			candidate = get_largest_image(item['image_versions2']['candidates'])
11			# get image 
12			filename = self.save_image_from_candidate(candidate['url'])
13			if filename != '':
14				# get status, save as tuple
15				caption = get_caption(item)
16				images.append((filename, caption))
17			if len(images) >= num_images:
18				break
19 return images

دو تابع کمکی در این تابع استفاده شده‌اند. اینستاگرام لیستی از «تصاویر احتمالی» را در پاسخ JSON بازگشت می‌دهد. بزرگ‌ترین اندازه را انتخاب کنید تا عکسی که بالاترین وضوح تصویر را دارد نمایش یابد:

1def get_largest_image(candidates):
2	candidate = {}
3	pixels = 0
4	for cand in candidates:
5		# pick the highest resolution one
6		res = cand['height']*cand['width']
7		if res > pixels:
8			pixels = res
9			candidate = cand
10	return candidate

در وهله دوم زمانی که لینک یک تصویر یافت شد، می‌توانید تصویر را با نوشتن محتوای فایل روی دیسک به صورت محلی ذخیره کنید. با استفاده از کتابخانه requests این کار بسیار سرراست خواهد بود.

1def save_image_from_candidate(url):
2 filename = ''
3 response = requests.get(url)
4 # check the response status code, 200 means good
5 if response.status_code == 200: 
6 	filename = url.split("/")[-1].split('?')[0]
7 	with open(filename, 'wb') as f:
8 		f.write(response.content)
9 return filename

توییت کردن رسانه (Media) با استفاده از Tweepy

ابتدا باید دسترسی به توییتر را با استفاده از رمزها و کلیدها راه‌اندازی کنید.

1import tweepy
2from credentials import *
3
4tw_auth = tweepy.OAuthHandler(twitter_consumer_key, twitter_consumer_secret)
5tw_auth.set_access_token(twitter_access_token, twitter_access_token_secret)
6tw_api = tweepy.API(tw_auth)

ایجاد یک ربات ریتوییت عمومی با چند خط کد ساده زیر ممکن است:

1for tweet in tweepy.Cursor(tw_api.search,q='MakeUseOf').items(10):
2	try:
3		tweet.favorite()
4		tweet.retweet()
5		time.sleep(2)
6	except tweepy.TweepError as e:
7		print(e.reason)
8	except StopIteration:
9		break

کارهای زیاد دیگری نیز می‌توان با این کتابخانه انجام داد. برای خاتمه این راهنما می‌توانید تابع get_images_from_hashtag را از ربات اینستاگرام که قبلاً ساختیم انتخاب کنید و تصاویر و کپشن‌ها را توییت کنید.

به علاوه ربات توییت می‌تواند در Reddit به دنبال پست‌های جدید، جستجو کرده و آن‌ها را نیز توییت کند. در مثال زیر این دو کارکرد در کنار هم قرار گرفته‌اند:

1# use r/<hashtag> for reddit search
2# and #<hashtag> for instagram search
3hashtag = 'technology'
4num_posts = 5
5
6# tweet reddit info
7reddit_posts = my_reddit.subreddit(hashtag).new(limit=num_posts)
8for submission in reddit_posts:
9	title = submission.title
10	url = 'www.reddit.com{}'.format(submission.permalink)
11	tweet_str = f'Reddit r/{sub} update:\n\n{title} #{sub} {url}'
12	tweet_str = trim_to_280(tweet_str)
13	tw_api.update(tweet_str)
14
15# tweet instagram media
16media_info = get_images_from_hashtag(hashtag, num_posts)
17for (filename, message) in media_info:
18	try:
19		tweet_str = trim_to_280(message)
20		tw_api.update_with_media(filename, status=tweet_str)
21	except tweepy.TweepError as e:
22		print(e.reason)
23	except StopIteration:
24		break

سخن پایانی

بدین ترتیب اینک می‌توانید کدهایی بنویسید که رسانه‌ها را از یک سایت می‌گیرد و به سایت دیگر ارسال می‌کند و شما می‌توانید این کارکردها را با هم ترکیب نیز بکنید. مثلاً توییت‌ها را از یک پست بگیرید و در Reddit منتشر کنید. تصاویر اینستاگرام را برای ارسال در subreddit-ها گرداوری کنید و یک بات بسازید که واقعاً بخشی از اینترنت باشد.

در نهایت برای خودکار سازی کامل این فرایند باید کاری کنید که ربات‌ها روی سرور در یک چرخه زمانی مشخص عمل کنند. این کار روی رایانه به وسیله یک ابزار زمان‌بندی میسر است. همچنین می‌توانید از یک برد کوچک رزبری پای برای ارسال این توییت ها استفاده کنید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
makeuseof
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *