تعداد بازدید ها: 349
اینک سال 2019 فرا رسیده است و همه جا صحبت از رباتها است. برای نمونه چتباتها، ایمیل باتها، رباتهای وب اسکرپینگ و رباتهای شبکههای اجتماعی همه اطراف ما را احاطه کردهاند. آیا تاکنون یک ربات ساختهاید؟ این کار فوقالعاده آسان است. احتمالاً به همین دلیل است که آنها همه جا گسترش یافتهاند. در این مقاله نشان میدهیم که چگونه میتوان با بهرهگیری از پایتون اقدام به ساخت ربات پایتون برای توییتر، اینستاگرام و Reddit کرده و تعامل خودکار با حسابهای کاربری این رسانههای اجتماعی داشت.
کار با پایتون
در این راهنمای عملی از پایتون به عنوان زبان برنامهنویسی استفاده خواهیم کرد. مزیت سهولت استفاده از پایتون باعث شده است که هرگونه کندی آن در مقایسه با زبانهای دیگر به چشم نیاید. شما میتواند پایتون را تقریباً برای هر سیستم عاملی دانلود کنید. همچنین میتوانید از ویرایشگر مورد علاقه خود استفاده کنید.
توزیعهای پایتون به همراه ابزاری به نام pip ارائه میشوند. در زمان نگارش این مقاله بیش از 168000 کتابخانه وجود داشتهاند که امکان دانلود از طریق pip برای آنها وجود داشته است. ما برای رباتهایی که میخواهیم در این نوشته ایجاد کنیم، تنها به سه مورد از این کتابخانهها نیاز داریم.
در خط فرمان، میتوانید کتابخانههای مورد نیاز خود را با استفاده از خطوط دستور زیر نصب کنید:
pip install--upgrade InstagramAPI pip install--upgrade tweepy pip install--upgrade praw |
اینک میتوانید این کتابخانهها را در موارد نیاز ایمپورت کنید.
دریافت کلیدها و رمزهای اپلیکیشن
یک فیلسوف مشهور زمانی گفته است: «رمزها، رمزها هیچ جنبه سرگرمی ندارند. رمزها، رمزها به افراد صدمه میزنند». با این حال رباتها به رمز نیاز دارند. در مرحله بعدی که میخواهیم رباتها را راهاندازی کنیم، به کمک رمز میتوانیم به آنها امکان دسترسی به API هر سایت را بدهیم. به این منظور باید یک کلید و یک رمز اپلیکیشن داشته باشیم.
زمانی که همه کلیدها، رمزها، توکنها و موارد دیگر را جمعآوری کردیم، همه آنها را داخل یک فایل قرار میدهیم و نام آن را «credentials.py» میگذاریم. این فایل چیزی مانند زیر خواهد بود:
# keys twitter_consumer_key='' twitter_consumer_secret='' twitter_access_token='' twitter_access_token_secret='' reddit_client_id='' reddit_client_secret='' reddit_user_agent='' instagram_client_id='' instagram_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 بگردید.
import praw from credentials import * my_reddit=praw.Reddit(client_id=reddit_client_id,client_secret=reddit_client_secret,user_agent=reddit_user_agent) sub_name='technology' max_posts=10 forsubmission inmy_reddit.subreddit(sub_name).new(limit=max_posts): print(submission.title) |
متغیر sub_name را تغییر دهید تا پستها را از subreddit-های دیگر نیز بگیرد. به جای ()new از متدهای دیگر مانند ()hot برای دریافت پستها استفاده کنید.
جستجوی هشتگهای اینستاگرام از طریق API آن
نخستین گام برای استفاده از API اینستاگرام، راهاندازی یک شیء با ID و رمز کلاینت است. درست پس از آن میتوانید متد ()login را فراخوانی کرده و این فرایند را تکمیل کنید.
from InstagramAPI import InstagramAPI from credentials import instagram_client_id,instagram_client_secret my_insta_api=InstagramAPI(instagram_client_id,instagram_client_secret) my_insta_api.login() |
استفاده از API اینستاگرام نسبت به همتای Reddit آن کمی پیچیدهتر است. در این مثال، اسکریپت از getHashtagFeed برای دریافت شیء پاسخ JSON بزرگی از اینستاگرام استفاده میکند.
اسکریپت در پاسخ به دنبال متن caption جستجو کرده و سپس آن را روی صفحه نمایش میدهد.
get_hashtag=my_insta_api.getHashtagFeed(hashtag) ifget_hashtag!=False: foritem inmy_insta_api.LastJson['items']: if'caption'initem.keys()and'text'initem['caption'].keys(): caption=item['caption']['text'] print(caption) |
افزودن تصاویر به رسانههای اجتماعی
در مراحل پیشرفتهتر ممکن است بخواهید اسکریپت شما تصاویری را از فید هشتگ دریافت کند. به این منظور روی پاسخ JSON حلقهای تعریف کرده و رسانه مرتبط با هر پست را مییابد. در ادامه یک پیادهسازی برای استخراج اطلاعات از پاسخ JSON را مشاهده میکنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def get_images_from_hashtag(hashtag,num_images): images=[] get_hashtag=my_insta_api.getHashtagFeed(hashtag) ifget_hashtag==False: returnimages foritem inmy_insta_api.LastJson['items']: ifitem['media_type']==1and'image_versions2'initem.keys(): candidate=get_largest_image(item['image_versions2']['candidates']) # get image filename=self.save_image_from_candidate(candidate['url']) iffilename!='': # get status, save as tuple caption=get_caption(item) images.append((filename,caption)) iflen(images)>=num_images: break returnimages |
دو تابع کمکی در این تابع استفاده شدهاند. اینستاگرام لیستی از «تصاویر احتمالی» را در پاسخ JSON بازگشت میدهد. بزرگترین اندازه را انتخاب کنید تا عکسی که بالاترین وضوح تصویر را دارد نمایش یابد:
def get_largest_image(candidates): candidate={} pixels=0 forcand incandidates: # pick the highest resolution one res=cand['height']*cand['width'] ifres>pixels: pixels=res candidate=cand returncandidate |
در وهله دوم زمانی که لینک یک تصویر یافت شد، میتوانید تصویر را با نوشتن محتوای فایل روی دیسک به صورت محلی ذخیره کنید. با استفاده از کتابخانه requests این کار بسیار سرراست خواهد بود.
def save_image_from_candidate(url): filename='' response=requests.get(url) # check the response status code, 200 means good ifresponse.status_code==200: filename=url.split("/")[-1].split('?')[0] with open(filename,'wb')asf: f.write(response.content) returnfilename |
توییت کردن رسانه (Media) با استفاده از Tweepy
ابتدا باید دسترسی به توییتر را با استفاده از رمزها و کلیدها راهاندازی کنید.
import tweepy from credentials import * tw_auth=tweepy.OAuthHandler(twitter_consumer_key,twitter_consumer_secret) tw_auth.set_access_token(twitter_access_token,twitter_access_token_secret) tw_api=tweepy.API(tw_auth) |
ایجاد یک ربات ریتوییت عمومی با چند خط کد ساده زیر ممکن است:
fortweet intweepy.Cursor(tw_api.search,q='MakeUseOf').items(10): try: tweet.favorite() tweet.retweet() time.sleep(2) except tweepy.TweepError ase: print(e.reason) except StopIteration: break |
کارهای زیاد دیگری نیز میتوان با این کتابخانه انجام داد. برای خاتمه این راهنما میتوانید تابع get_images_from_hashtag را از ربات اینستاگرام که قبلاً ساختیم انتخاب کنید و تصاویر و کپشنها را توییت کنید.
به علاوه ربات توییت میتواند در Reddit به دنبال پستهای جدید، جستجو کرده و آنها را نیز توییت کند. در مثال زیر این دو کارکرد در کنار هم قرار گرفتهاند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# use r/<hashtag> for reddit search # and #<hashtag> for instagram search hashtag='technology' num_posts=5 # tweet reddit info reddit_posts=my_reddit.subreddit(hashtag).new(limit=num_posts) forsubmission inreddit_posts: title=submission.title url='www.reddit.com{}'.format(submission.permalink) tweet_str=f'Reddit r/{sub} update:\n\n{title} #{sub} {url}' tweet_str=trim_to_280(tweet_str) tw_api.update(tweet_str) # tweet instagram media media_info=get_images_from_hashtag(hashtag,num_posts) for(filename,message)inmedia_info: try: tweet_str=trim_to_280(message) tw_api.update_with_media(filename,status=tweet_str) except tweepy.TweepError ase: print(e.reason) except StopIteration: break |
سخن پایانی
بدین ترتیب اینک میتوانید کدهایی بنویسید که رسانهها را از یک سایت میگیرد و به سایت دیگر ارسال میکند و شما میتوانید این کارکردها را با هم ترکیب نیز بکنید. مثلاً توییتها را از یک پست بگیرید و در Reddit منتشر کنید. تصاویر اینستاگرام را برای ارسال در subreddit-ها گرداوری کنید و یک بات بسازید که واقعاً بخشی از اینترنت باشد.
در نهایت برای خودکار سازی کامل این فرایند باید کاری کنید که رباتها روی سرور در یک چرخه زمانی مشخص عمل کنند. این کار روی رایانه به وسیله یک ابزار زمانبندی میسر است. همچنین میتوانید از یک برد کوچک رزبری پای برای ارسال این توییت ها استفاده کنید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزش های برنامه نویسی پایتون
- آموزش برنامه نویسی پایتون – مقدماتی
- مجموعه آموزشهای برنامه نویسی
- گنجینه آموزش های برنامه نویسی پایتون (Python)
- آموزش ساخت ربات تلگرام با پایتون (Python)
- افزایش فالوورهای اینستاگرام با ربات پایتون — راهنمای کاربردی
==
به عنوان حامی، استارتاپ، محصول و خدمات خود را در انتهای مطالب مرتبط مجله فرادرس معرفی کنید.
میثم لطفی
«میثم لطفی» دانشآموخته کارشناسی ریاضیات کاربردی و شیفته فناوری به خصوص در حوزه رایانه است. وی در حال حاضر علاوه بر پیگیری همه علاقهمندیهای خود در رشتههای برنامهنویسی، کپیرایتینگ و تولید محتوای چندرسانهای، در زمینه نگارش مقالاتی با محوریت نرمافزار نیز با مجله فرادرس همکاری دارد.
بر اساس رای 1 نفر
آیا این مطلب برای شما مفید بود؟