Давным-давно я попал в Python, потому что хотел создать своего собственного робота для сканирования веб-страниц, который берет сообщения из определенного подредакта и загружает их в твиттер, но, к сожалению, у меня возникли некоторые проблемы.
У бота есть лимит X постов, которые он может загрузить
for submission in subreddit_info.hot(limit=X):
После того, как он загрузит указанные посты и отправит их в твиттере, скрипт останавливается, и мне нужно запустить его снова.Повторный запуск бота мало что дает, он выводит диалог «[бот] Уже твитнул: (пост)», как я и запрограммировал, дело в том, что он не будет искать другие посты.
Отступ кода, в то время как True также не показывал никаких результатов, и бот снова распечатывал этот диалог, как бы долго я его не запускал.
import praw
import json
import requests
import tweepy
import time
import os
import urllib.parse
from glob import glob
ACCESS_TOKEN = 'X'
ACCESS_TOKEN_SECRET = 'X'
CONSUMER_KEY = 'X'
CONSUMER_SECRET = 'X'
SUBREDDIT_TO_MONITOR = ''
IMAGE_DIR = 'img'
POSTED_CACHE = 'posted_posts.txt'
TWEET_SUFFIX = ''
TWEET_MAX_LEN = 280
DELAY_BETWEEN_TWEETS = 1
T_CO_LINKS_LEN = 12
def setup_connection_reddit(subreddit):
print('[bot] Setting up connection with reddit')
reddit_api = praw.Reddit(
user_agent='Reddit Twitter Tool Monitoring {}'.format(SUBREDDIT_TO_MONITOR),
client_id='X',
client_secret='X')
return reddit_api.subreddit(SUBREDDIT_TO_MONITOR)
def tweet_creator(subreddit_info):
post_dict = {}
post_ids = []
print('[bot] Getting posts from reddit')
for submission in subreddit_info.hot(limit=10):
if not already_tweeted(submission.id):
post_dict[submission.title] = {}
post = post_dict[submission.title]
post['link'] = submission.url
post['img_path'] = get_image(submission.url)
post_ids.append(submission.id)
else:
print('[bot] Already tweeted: {}'.format(str(submission)))
return post_dict, post_ids
def already_tweeted(post_id):
found = False
with open(POSTED_CACHE, 'r') as in_file:
for line in in_file:
if post_id in line:
found = True
break
return found
def strip_title(title, num_characters):
if len(title) <= num_characters:
return title
else:
return title[:num_characters - 1] + '…'
def get_image(img_url):
if 'i.redd.it' in img_url:
file_name = os.path.basename(urllib.parse.urlsplit(img_url).path)
img_path = IMAGE_DIR + '/' + file_name
print('[bot] Downloading image at URL ' + img_url + ' to ' + img_path)
resp = requests.get(img_url, stream=True)
if resp.status_code == 200:
with open(img_path, 'wb') as image_file:
for chunk in resp:
image_file.write(chunk)
return img_path
else:
print('[bot] Image failed to download. Status code: ' + resp.status_code)
else:
print('[bot] Post doesn\'t point to an i.redd.it link')
return ''
def tweeter(post_dict, post_ids):
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
for post, post_id in zip(post_dict, post_ids):
img_path = post_dict[post]['img_path']
extra_text = ' ' + post_dict[post]['link'] + TWEET_SUFFIX
extra_text_len = 1 + T_CO_LINKS_LEN + len(TWEET_SUFFIX)
if img_path:
extra_text_len += T_CO_LINKS_LEN
post_text = strip_title(post, TWEET_MAX_LEN - extra_text_len) + extra_text
print('[bot] Posting this link on Twitter')
print(post_text)
if img_path:
print('[bot] With image ' + img_path)
api.update_with_media(filename=img_path, status=post_text)
else:
api.update_status(status=post_text)
log_tweet(post_id)
time.sleep(DELAY_BETWEEN_TWEETS)
def log_tweet(post_id):
with open(POSTED_CACHE, 'a') as out_file:
out_file.write(str(post_id) + '\n')
def main():
if not os.path.exists(POSTED_CACHE):
with open(POSTED_CACHE, 'w'):
pass
if not os.path.exists(IMAGE_DIR):
os.makedirs(IMAGE_DIR)
subreddit = setup_connection_reddit(SUBREDDIT_TO_MONITOR)
post_dict, post_ids = tweet_creator(subreddit)
tweeter(post_dict, post_ids)
for filename in glob(IMAGE_DIR + '/*'):
os.remove(filename)
if __name__ == '__main__':
main()
Это код,Я предполагаю, что это связано либо с "tweeter_creator" или "уже_твитедом".Я буду признателен за любую помощь.
Кроме того, если вы знаете какие-либо хорошие учебники, относящиеся к этой проблеме, вы можете связать их, я заинтересован в том, чтобы изучить их самостоятельно.
Спасибо!