Используя чирикать как команду на выключение Убунту


Я хочу использовать твиты, отправленные на учетную запись Twitter как команду, чтобы закрыли Убунту. Для этого я написал скрипт на языке Python, используя tweepy, библиотека Python для Twitter. Я запланировала запуск скрипта по половине каждого часа (например в 5:30, 6:30, и так далее) через кронтаб.

Вот сценарий:

import tweepy
import os
from datetime import datetime
p=None

api= tweepy.API()

for status in api.user_timeline('tweetneag4'):         
    while p==None:    #so that it checks only the first tweet
        if status.text.count(str((datetime.now().hour)+1))< 2 and str((datetime.time.now().hour)+1)==10:
            p=1
            pass
        elif str((datetime.now().hour)+1) in status.text:
            print "System shut down in 20 mins."
            os.system('shutdown -h +20')  
            p=1 

Вот пример твита:

#loadshedding schedule in 10mins: 15:00-21:00 #group4 #nea

Аккаунт в Twitter (@tweetneag4) твиты предупреждение 30 мин. и 10 мин. до отключения электроэнергии начинается (вот, на счет твитов, если и только если есть отключения электроэнергии следующий час). Что я пытался сделать, это проверить в 5:30 будь это посты в Твиттере по поводу 6 часов. Я сделал это, видя, если твит содержит строку "6"(при проверке на 5). При проверке за десять часов, то возникает дополнительная трудность, так как он может содержать "10" в двух случаях - первый, а в 10 часов, а второй в 10 минут позже. (Я уверен, что есть лучший способ сделать это)

Если вы видите в Твиттере, все должно быть яснее. Как я мог бы улучшить, чтобы код стал более элегантным?



784
4
задан 29 марта 2011 в 05:03 Источник Поделиться
Комментарии
1 ответ

import tweepy
import os
from datetime import datetime
p=None

Использование одной переменной буквенные имена путает, я понятия не имею, что P является для.

api= tweepy.API()

Ставить пробелы вокруг =

for status in api.user_timeline('tweetneag4'):         
while p==None: #so that it checks only the first tweet

Что ты здесь думал? Если P не задано значение true, вы будете перебирать следующий блок неоднократно в бесконечный цикл. Если вы хотите только первый твит сдать счетчик = 1 до user_timeline

        if status.text.count(str((datetime.now().hour)+1))< 2 and str((datetime.time.now().hour)+1)==10:

p=1

Установка флагов-это некрасиво. Если вам необходимо установить булевых флагов, использовать true и false не None и 1.

            pass
elif str((datetime.now().hour)+1) in status.text:
print "System shut down in 20 mins."
os.system('shutdown -h +20')
p=1

Мне кажется, что гораздо более простой способ сделать это, чтобы посмотреть на время, за которое информация была размещена. Он вроде бы доступен в качестве статуса.created_at. Основываясь на том, что вы знаете, что отключение либо 30 или 10 минут после этого. Так что если прошло более 30 минут с момента этого сообщения, это уже случилось и мы не озабочены.

Что-то вроде этого:

import tweepy
import os
from datetime import datetime, timedelta

api= tweepy.API()

status = api.user_timeline('tweetneag4', count=1)[0]
age = datetime.now() - status.created_at
if age < timedelta(minutes = 45):
print "System shut down in 20 mins."
os.system('shutdown -h +20')

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

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

# split the message up by whitespace, this makes it easy to grab the outage time
outage_time = status.split()[4]
# find everything up to the colon
hour_text, junk = outage_time.split(':')
# parse the actual hour
hour = int(hour_text)

Наконец, для более сложных примеров, используя регулярные выражения для разбора текста будет хорошей идеей.

6
ответ дан 29 марта 2011 в 10:03 Источник Поделиться