проблема опроса pystackexchange - PullRequest
0 голосов
/ 07 мая 2011

Итак, я довольно новичок в 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, сначала это правильно, но не обновляется, если мой представитель изменяется.В идеале так и будет.Любая помощь очень ценится.Заранее спасибо.

1 Ответ

1 голос
/ 07 мая 2011

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

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 минут, независимо от того.

...