Почему мой бот Python иногда отправляет слишком много сообщений? - PullRequest
1 голос
/ 24 сентября 2019

Я написал бота, который выбирает сообщения из Reddit и публикует их в учетной записи Twitter.Но иногда - я не знаю почему - он публикуется два раза подряд, а не один раз каждые 3 часа.Я подозреваю, что это потому, что я сделал что-то вроде этого:

do stuff:
    if stuff doesnt already exist:
        do other stuff
    else:
        do stuff

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

У меня есть два пункта в моем коде, где я «перезапускаю» весь код после проверки.Во-первых, когда сообщение, полученное из reddit, не является изображением, другое, когда сообщение, которое было извлечено, уже было опубликовано ранее (и сохранено в файле json для этой точной проверки).

Я надеюсь, что кто-то понимаетЧто я имею в виду, спасибо заранее.

import time
import tweepy
import datetime
import praw
import urllib.request
import os
import json


def Mainbot():
    reddit = praw.Reddit(client_id='X',
                          client_secret='X',
                          user_agent='RedditFetchBot by FlyingThunder')

    def Tweet(postinfo):
        auth = tweepy.OAuthHandler("X", "X")
        auth.set_access_token("X", "X")
        api = tweepy.API(auth)
        try:
            api.update_with_media("local-filename.jpg", postinfo)
        except:
            print("not a file post")
            Mainbot()            #check 1


    post = reddit.subreddit('okbrudimongo').random()
    x = post.id

    with open('data.json', 'r') as e:
        eread = e.read()
        if x not in eread:
            with open('data.json', 'a') as f:
                json.dump(x, f)
                f.close()
                e.close()
        else:
            e.close()
            print("already posted")
            Mainbot()      #check 2

    print(post.url + " " + post.title)
    urllib.request.urlretrieve(post.url, "local-filename.jpg")
    Tweet(postinfo=post.title+" (https://www.reddit.com" + post.permalink+")")
    try:
        time.sleep(5)
        os.remove("local-filename.jpg")
    except:
        print("Datei nicht vorhanden")

def loop():
    time.sleep(1800)
    print("still running")
    print(datetime.datetime.now())

while True:
    Mainbot()
    loop()
    loop()
    loop()
    loop()
    loop()
    loop()

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

still running
2019-09-24 13:27:23.437152
still running
2019-09-24 13:57:23.437595
already posted
https://i.redd.it/xw38s1qrmlh31.jpg Führ Samstag bai ihm
https://i.redd.it/nnaxll9gjwf31.jpg Sorri Mamer
still running
2019-09-24 14:27:39.913651
still running
2019-09-24 14:57:39.913949
still running
2019-09-24 15:27:39.914013

1 Ответ

0 голосов
/ 26 сентября 2019

Решение, которое я нашел (я все еще не до конца понимаю, какой механизм вызвал ошибку):

import time
import tweepy
import datetime
import praw
import urllib.request
import os
import json


def Mainbot():
    reddit = praw.Reddit(client_id='m1E7pmr6Lha-ZQ',
                          client_secret='jphxVmNXhcGv_pl4fLjiL65GoUg',
                          user_agent='RedditFetchBot by FlyingThunder')

    def Tweet(postinfo):
        auth = tweepy.OAuthHandler("AggY2XJMVKasb1t0N1SszCnvC", "UieIGakl70k6kTLkjJiIezvrmPlnFnGzsNRInGzfkR5HvXZA1d")
        auth.set_access_token("1169529991912206336-9BpmvxEJC3fJLMH09vVJ6Wp4lgvSaU",
                              "SetVgrMpw71GEU7KnZvSB04EgyPa70b5Xy8Dlozyrflj3")
        api = tweepy.API(auth)
        try:
            api.update_with_media("local-filename.jpg", postinfo)
        except:
            print("not a file post"+post.permalink)
            Mainbot()


    post = reddit.subreddit('okbrudimongo').random()
    x = post.id

    with open('data.json', 'r') as e:
        eread = e.read()
        if x not in eread:
            with open('data.json', 'a') as f:
                json.dump(x, f)
                f.close()
                e.close()
                print(post.url + " " + post.title)
                urllib.request.urlretrieve(post.url, "local-filename.jpg")
                Tweet(postinfo=post.title + " (https://www.reddit.com" + post.permalink + ")")
                try:
                    time.sleep(5)
                    os.remove("local-filename.jpg")
                except:
                    print("Datei nicht vorhanden")
        else:
            e.close()
            print("already posted")
            Mainbot()
def loop():
    time.sleep(1800)
    print("still running")
    print(datetime.datetime.now())

while True:
    Mainbot()
    loop()
    loop()
    loop()
    loop()
    loop()
    loop()
...