现在是2019年。您听说过机器人。有聊天机器人,电子邮件机器人,网络抓取机器人和社交媒体机器人。您创建了机器人吗?非常简单。大概是为什么他们到处都是。通过加入他们的行列来拥抱我们的机器人霸主。
在本文中,我将向您展示如何利用Python自动与您的Twitter,Reddit和Instagram帐户进行交互。
使用Python
本演练将Python作为其选择的语言。与其他语言相比,Python的易用性优势超过了它在速度方面的所有不足。您可以下载适用于几乎所有操作系统的Python。使用您选择的编辑器。
Python发行版与名为 pip
的实用程序相关联。在撰写本文时,可以使用 pip
下载超过168,000个库。对于今天将要创建的机器人,只需要三个。
在命令行中,您可以使用以下三行安装所需的库。
pip install --upgrade InstagramAPIpip install --upgrade tweepy pip install --upgrade praw
现在您将能够在需要的地方导入这些库。
获取应用程序密钥和机密
一位明智的哲学家曾经说过:“机密,机密没有乐趣。机密,机密伤害了某人。"恭喜,机器人需要机密。设置机器人的下一步是允许它们访问每个站点的API。为此,您需要一个应用程序密钥或机密。
在收集密钥,机密,令牌和更多内容(听起来像是有趣的游戏!)时,请将它们全部放入一个名为“该文件看起来像这样:
# keystwitter_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设置Twitter机器人的指南,将向您展示如何创建Twitter应用程序。请注意,Twitter将花费一些时间来验证您的帐户并确保您没有创建垃圾邮件帐户。
按照上述步骤操作后,将使用者密钥,使用者密钥,访问令牌和访问令牌密钥复制到
获取Reddit客户端ID和密码与Twitter非常相似。您需要将应用注册为Reddit用户代理。完成此操作后,您绝对应该在履历表上放入“ Reddit用户代理"。
登录到您选择的Reddit帐户。导航至应用程序首选项页面,然后点击创建其他应用程序。为您的用户代理命名有用的名称。 选择脚本用于您的应用。关于URL可以留为空白。填写重定向框的任何地址。
按创建应用后,将向您显示以下屏幕,其中包含您的应用列表。您的应用程序名称下的数字代表客户端ID,客户端密码位于该客户端ID的下方。将这些值复制到您的certificate.py文件。
Instagram的访问权限不同于Twitter和Reddit。您无需注册应用,而是使用用户名和密码。我建议创建一个单独的公共帐户,并将这些详细信息用于您的机器人。
使用Praw访问Reddit
使用praw是一个分为两个步骤的过程。首先,设置访问权限是对praw的Reddit方法的单个函数调用。然后,使用初始化的对象,使用new()方法搜索子项。
import prawfrom 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 = 10for submission in my_reddit.subreddit(sub_name).new(limit=max_posts): print(submission.title)
更改 sub_name
变量以获取来自不同子项的帖子。除了 new()
之外,还可以使用其他方法,例如 hot()
来获取帖子。
通过InstagramAPI搜索Instagram标签
使用Instagram API的第一步是使用客户端ID和密码设置对象。之后,立即调用login()方法完成设置。
from InstagramAPI import InstagramAPIfrom credentials import instagram_client_id, instagram_client_secretmy_insta_api = InstagramAPI(instagram_client_id,instagram_client_secret)my_insta_api.login()
使用该API的方法要比其Reddit方法复杂得多。在此示例中,脚本使用getHashtagFeed从Instagram获取一个非常大的JSON响应对象。
在响应中进行搜索,该脚本查找标题文本,然后打印到屏幕上以进行查看。
p>
get_hashtag = my_insta_api.getHashtagFeed(hashtag)if get_hashtag != False: for item in my_insta_api.LastJson['items']: if 'caption' in item.keys() and 'text' in item['caption'].keys(): caption = item['caption']['text'] print(caption)
向前移动,您可能希望脚本在此标签供稿中获取图像。为此,请遍历JSON响应并找到与每个帖子关联的媒体。这是一个用于从JSON响应中提取信息的实现:
def get_images_from_hashtag(hashtag, num_images): images = [] get_hashtag = my_insta_api.getHashtagFeed(hashtag) if get_hashtag == False: return images for item in my_insta_api.LastJson['items']: if item['media_type'] == 1 and 'image_versions2' in item.keys(): candidate = get_largest_image(item['image_versions2']['candidates']) # get image filename = self.save_image_from_candidate(candidate['url']) if filename != '': # get status, save as tuple caption = get_caption(item) images.append((filename, caption)) if len(images) >= num_images: break return images
此函数中使用了两个辅助函数。 Instagram在JSON响应中发送图像“候选人"列表。在这些图像中选择最大的图像,以便以最高分辨率显示媒体。
def get_largest_image(candidates): candidate = {} pixels = 0 for cand in candidates: # pick the highest resolution one res = cand['height']*cand['width'] if res > pixels: pixels = res candidate = cand return candidate
第二,找到图像的链接后,您可以通过将内容写入文件来在本地保存图像。使用 requests
库使操作变得简单。
def save_image_from_candidate(url): filename = '' response = requests.get(url) # check the response status code, 200 means good if response.status_code == 200: filename = url.split("/")[-1].split('?')[0] with open(filename, 'wb') as f: f.write(response.content) return filename
使用Tweepy分发媒体
首先,您需要使用您的机密和密码设置Twitter访问权限
import tweepyfrom 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)
创建通用的转发机器人仅几行。
for tweet in tweepy.Cursor(tw_api.search,q='PCPC.me').items(10): try: tweet.favorite() tweet.retweet() time.sleep(2) except tweepy.TweepError as e: print(e.reason) except StopIteration: break
该库还可以完成许多其他工作。要结束本演练,您可以使用较早制作的Instagram机器人的 get_images_from_hashtag
函数来发布图像和标题。
此外,您的Twitter机器人可以在Reddit上搜索新的并发推文。要将这两个功能放在一起,就像这样:
# use r/<hashtag> for reddit search# and #<hashtag> for instagram searchhashtag = 'technology'num_posts = 5# tweet reddit inforeddit_posts = my_reddit.subreddit(hashtag).new(limit=num_posts)for submission in reddit_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 mediamedia_info = get_images_from_hashtag(hashtag, num_posts)for (filename, message) in media_info: try: tweet_str = trim_to_280(message) tw_api.update_with_media(filename, status=tweet_str) except tweepy.TweepError as e: print(e.reason) except StopIteration: break
您的Python驱动的社交媒体机器人已经准备好了!
因此,现在您有了一大堆可以拉动媒体的代码从一个站点发布到另一个站点。您也可以混合搭配。拉发推文并发布到Reddit。收集Instagram图片以发布到subreddits。制作一个机器人并成为真实互联网的一部分。
最后,要完全自动化该过程,您将希望您的机器人在服务器上循环运行。这可以在带有时间表的您自己的计算机上。或者,清理掉壁橱中的旧Raspberry Pi,并查看这些可爱的Twitter机器人项目Pi。