проблема с опросом pystackexchange

#python #stackexchange

#python #stackexchange

Вопрос:

Итак, я довольно новичок в python, и сегодня у меня появилась идея создать скрипт, который опрашивает stackoverflow для моего представителя, и когда он меняется, он отправляет электронное письмо, которое отправляется на мой телефон в виде текста.

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

Вот мой код:

 import sys
from stackauth import StackAuth
from stackexchange import Site, StackOverflow
import smtplib

from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email import Encoders
import os

import time

gmail_user = "email@gmail.com"
gmail_pwd = "password"

def mail(to, subject, text):
   msg = MIMEMultipart()

   msg['From'] = gmail_user
   msg['To'] = to
   msg['Subject'] = subject

   msg.attach(MIMEText(text))

   mailServer = smtplib.SMTP("smtp.gmail.com", 587)
   mailServer.ehlo()
   mailServer.starttls()
   mailServer.ehlo()
   mailServer.login(gmail_user, gmail_pwd)
   mailServer.sendmail(gmail_user, to, msg.as_string())
   # Should be mailServer.quit(), but that crashes...
   mailServer.close()

old_rep = None

while True:

    user_id = 731221 if len(sys.argv) < 2 else int(sys.argv[1])
    print 'StackOverflow user %d's accounts:' % user_id

    stack_auth = StackAuth()
    so = Site(StackOverflow)
        accounts = stack_auth.associated(so, user_id)
    REP =  accounts[3].reputation
    print REP
        if REP != old_rep:
        old_rep = REP
                mail("email@email.com","REP",str(REP))
    time.sleep(10)
  

В настоящее время, если вы печатаете REP, сначала он правильный, но не обновляется при изменении моего rep.
В идеале это было бы.
Любая помощь приветствуется. Заранее спасибо.

Комментарии:

1. проклятое форматирование, я это исправлю, оставайся со мной. Извините.

2. Похоже, есть некоторые ошибки с отступами, вам следует исправить свой код в цикле while. Когда вы говорите, что опрос работает неправильно, чего вы ожидаете от него, каково текущее поведение?

3. я не думаю, что в реальном коде есть какие-либо ошибки отступов, я не привык к форматированию stackoverflows. В настоящее время, если вы печатаете REP, сначала он правильный, но не обновляется при изменении моего rep. В идеале это было бы.

4. Вам следует исправить ошибки отступов в вашем сообщении, чтобы люди были более склонны помогать.

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

Ответ №1:

Это упрощенный пример, который будет правильно зацикливаться:

 import time
from stackauth import StackAuth
from stackexchange import Site, StackOverflow

rep = None
while True:
    stack_auth = StackAuth()
    so = Site(StackOverflow)
    accounts = stack_auth.associated(so, 641766) # using my id
    so_acct = filter(lambda x: x.on_site.api_endpoint.endswith('api.stackoverflow.com'), accounts)[0] # filtering my accounts so I only check rep on stackoverflow
    if rep != so_acct.reputation:
        rep = so_acct.reputation
        print rep
        # send e-mail
    time.sleep(30)
  

Я добавил строку для фильтрации учетных записей, чтобы проверять вашу репутацию только на соответствующем сайте. Вы использовали индекс, я понятия не имею, стабильно это или нет, я бы предположил, что нет. Опрос каждые 10 секунд (как в исходном примере) может быть многовато, может быть, сделайте что-нибудь более разумное, например, каждые 5 минут? Вам действительно нужно обновление вашей репутации с точностью до минуты? Подумайте о том, чтобы просто записать это как задание cron и запускать его каждые 5, 10, 15 минут независимо от того.

Комментарии:

1. Это тоже не работает, попробуйте сами. И убедитесь, что вы протестировали, что он делает, когда меняется ваша репутация. 😀