#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. Это тоже не работает, попробуйте сами. И убедитесь, что вы протестировали, что он делает, когда меняется ваша репутация. 😀