Как мне сделать бота в Твиттере для поиска новых сообщений в Reddit? - PullRequest
0 голосов
/ 03 марта 2019

Давным-давно я попал в 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" или "уже_твитедом".Я буду признателен за любую помощь.

Кроме того, если вы знаете какие-либо хорошие учебники, относящиеся к этой проблеме, вы можете связать их, я заинтересован в том, чтобы изучить их самостоятельно.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...