예제 #1
0
 def start_poll(self):
     last = 0
     while True:
         r = bot_util.urlopen(self._url_get_updates + "?offset=%s" %
                              (last + 1))
         if r:
             try:
                 r = json.loads(r)
             except ValueError as e:
                 print "Error while polling (json.loads):", e
                 continue
             if 'result' in r:
                 for update in r['result']:
                     if len(update) > 0:
                         print update
                     if 'message' in update:
                         message = update['message']
                         if 'date' in message:
                             date = message['date']
                             if self._previous_update_date >= int(date):
                                 continue
                             if 'update_id' in update:
                                 last = int(update["update_id"])
                             self._process_update(update)
                             previous_update_date = int(date)
                             self._write_previous_update_date(
                                 previous_update_date)
         time.sleep(3)
예제 #2
0
def get_user_info(_user_id):
    u = build_users_get_url(_user_id)
    response_text = bot_util.urlopen(u)
    if response_text:
        response_json = json.loads(response_text)
        if 'response' in response_json:
            response = response_json['response']
            if len(response) == 0:
                return None
            _user_info = response[0]
            first_name = ""
            last_name = ""
            city = ""
            if "first_name" in _user_info:
                first_name = _user_info["first_name"]
            if "last_name" in _user_info:
                last_name = _user_info["last_name"]
            if "city" in _user_info:
                if "title" in _user_info["city"]:
                    city = _user_info["city"]["title"]
            _user_info = {
                'first_name': first_name,
                'last_name': last_name,
                'city': city
            }
            return _user_info
    return None
예제 #3
0
def get_weather():
    page = bot_util.urlopen(_URL_WEATHER)
    if not page:
        return None
    temperature = None
    pressure = None
    rain = None
    wind = None
    weather = ""
    try:
        j = json.loads(page)
        if 'outsideTemp' in j:
            temperature = j['outsideTemp']
        if 'barometer' in j:
            pressure = j['barometer']
        if 'rain' in j:
            rain = j['rain']
        if 'windDirectionDegrees' in j and 'windSpeed' in j and 'windBeaufortScale':
            wind = (j['windDirectionDegrees'], j['windSpeed'], j['windBeaufortScale'])
    except Exception as e:
        print e
    if temperature is not None:
        weather += build_temperature_string(temperature)
    if pressure is not None:
        weather += build_pressure_string(pressure)
    if rain is not None:
        weather += build_rain_string(rain)
    if wind is not None:
        wind = build_wind_string(wind[0], wind[1], wind[2])
        if wind is not None:
            weather += wind

    return weather
    def get_forecast():
        p = bot_util.urlopen(YandexForecaster._URL_FORECAST_YANDEX)
        if not p:
            return False

        root = ET.fromstring(p)
        if root is None:
            return False

        NUMBER_OF_DAYS = 2
        days_list = []
        i = 0
        for child in root:
            if child.tag == YandexForecaster._build_tag_name("day"):
                days_list.append(child)
                i += 1
            if i == NUMBER_OF_DAYS:
                break

        if len(days_list) != 2:
            return False

        today = days_list[0]
        tomorrow = days_list[1]
        today_forecast = YandexForecaster._get_day_forecast_string(today)
        tomorrow_forecast = YandexForecaster._get_day_forecast_string(tomorrow)
        if not today_forecast or not tomorrow_forecast:
            return False

        forecast = u"*Сегодня:*\n" + today_forecast + u"\n*Завтра*:\n" + tomorrow_forecast

        return forecast
예제 #5
0
 def send_response(self, chat_id, response, markdown=False):
     if response is None or chat_id is None or response == "":
         return False
     if isinstance(response, unicode):
         response = response.encode("utf-8")
     d = {"chat_id": chat_id, "text": response}
     if markdown is True:
         d["parse_mode"] = "Markdown"
     return bot_util.urlopen(self._url_send_message, data=d)
예제 #6
0
def get_rain():
    page = bot_util.urlopen(_URL_WEATHER)
    if not page:
        return None
    try:
        j = json.loads(page)
        if 'rain' in j:
            return j['rain']
    except Exception as e:
        print e
    return None
예제 #7
0
def get_temperature():
    page = bot_util.urlopen(_URL_WEATHER)
    if not page:
        return None
    try:
        j = json.loads(page)
        if 'outsideTemp' in j:
            return j['outsideTemp']
    except Exception as e:
        print e
    return None
예제 #8
0
def get_pressure():
    page = bot_util.urlopen(_URL_WEATHER)
    if not page:
        return None
    try:
        j = json.loads(page)
        if 'barometer' in j:
            return j['barometer']
    except Exception as e:
        print e
    return None
예제 #9
0
 def send_response(self, chat_id, response, markdown=False):
     if response is None or chat_id is None or response == '':
         return False
     if isinstance(response, unicode):
         response = response.encode('utf-8')
     d = {
         'chat_id': chat_id,
         'text': response,
     }
     if markdown is True:
         d['parse_mode'] = "Markdown"
     return bot_util.urlopen(self._url_send_message, data=d)
예제 #10
0
def get_weather():
    page = bot_util.urlopen(_URL_WEATHER)
    if not page:
        return None
    temperature = _get_temperature_from_page(page)
    humidity = _get_humidity_from_page(page)
    pressure = _get_pressure_from_page(page)
    wind = _get_wind_from_page(page)
    weather = ""
    if temperature is not None:
        weather += build_temperature_string(temperature)
    if humidity is not None:
        weather += build_humidity_string(humidity)
    if pressure is not None:
        weather += build_pressure_string(pressure)
    if wind is not None:
        weather += build_wind_string(wind)
    return weather
예제 #11
0
 def start_poll(self):
     last = 0
     while True:
         r = bot_util.urlopen(self._url_get_updates + "?offset=%s" % (last + 1))
         if r:
             try:
                 r = json.loads(r)
             except ValueError as e:
                 print "Error while polling (json.loads):", e
                 continue
             # print r["result"]
             for update in r["result"]:
                 if len(update) > 0:
                     print update
                 if self._previous_update_date >= int(update["message"]["date"]):
                     continue
                 last = int(update["update_id"])
                 self._process_update(update)
                 previous_update_date = int(update["message"]["date"])
                 self._write_previous_update_date(previous_update_date)
         time.sleep(3)
예제 #12
0
    def get_forecast(self):
        forecast = bot_util.urlopen(self._url_get_forecast)
        if forecast:
            forecast = json.loads(forecast)
            if "forecast" in forecast:
                forecast = forecast["forecast"]
                if "simpleforecast" in forecast:
                    simple_forecast = forecast["simpleforecast"]
                    if "forecastday" in simple_forecast:
                        forecastday = simple_forecast["forecastday"]
                        if len(forecastday) >= 4:
                            forecast = u""

                            forecast_today = forecastday[0]
                            forecast_today = self._get_day_forecast(forecast_today)
                            forecast += u"*Today:*\n" + forecast_today

                            forecast_tomorrow = forecastday[1]
                            forecast_tomorrow = self._get_day_forecast(forecast_tomorrow)
                            forecast += u"\n*Tomorrow:*\n" + forecast_tomorrow

                            return forecast
        return False
예제 #13
0
def build_message(_hashtag):
    url = get_newsfeed_search_hashtag_url(_hashtag)
    response_text = bot_util.urlopen(url)

    if not response_text:
        print "Failed to get data from VK"
        return None
    response_json = json.loads(response_text)
    if 'response' not in response_json:
        print "No 'response' in response"
        print response_json
        return None
    response = response_json['response']
    if 'items' not in response:
        print "No 'items' in 'response'"
        return None
    items = response['items']
    if len(items) == 0:
        print "Length of 'items' is zero"
        return None
    last_item = items[0]
    if 'owner_id' not in last_item and 'id' not in last_item:
        print "No 'owner_id' and 'id' in item"
        return None
    if last_item['owner_id'] in _BANNED:
        return None

    print last_item['owner_id']
    print last_item

    last_item_url = build_wall_url(last_item['owner_id'], last_item['id'])
    last_item_filename = _LAST_ITEM_FILENAME + "_" + _hashtag
    last_item_in_file = bot_util.read_one_string_file(last_item_filename)
    if not last_item_in_file or last_item_url != last_item_in_file:
        bot_util.write_one_string_file(last_item_filename, last_item_url)
        print "New post: " + last_item_url
        print last_item
        message = ""
        if 'attachments' in last_item:
            attachments = last_item['attachments']
            photo_url = None
            for attachment in attachments:
                if 'photo' in attachment:
                    photo = attachment['photo']
                    if 'photo_1280' in photo:
                        photo_url = photo['photo_1280']
                    break
            if photo_url:
                print photo_url
                message += photo_url + "\n\n"
        owner_id = last_item['owner_id']
        if 'text' in last_item:
            text = last_item['text']
            message += text + "\n\n"
        if not bot_util.check_file_for_string(_ALL_POSTS_FILENAME,
                                              last_item_url + "\n"):
            return None
        else:
            bot_util.append_string_to_file(_ALL_POSTS_FILENAME,
                                           last_item_url + "\n")
        message += u"<b>Пост:</b> " + last_item_url + "\n"
        if owner_id > 0:
            user_info = get_user_info(owner_id)
            first_name = user_info['first_name']
            last_name = user_info['last_name']
            message += u"<b>Автор:</b> <a href=\"https://vk.com/id" + str(
                owner_id) + u"\">" + first_name + u" " + last_name + u"</a>"
        else:
            message += u"<b>Автор:</b> https://vk.com/club" + str(-owner_id)
        return message
    else:
        print "There is no new posts for #" + _hashtag
    return None
예제 #14
0
def get_wind():
    page = bot_util.urlopen(_URL_WEATHER)
    if not page:
        return None
    return _get_wind_from_page(page)
예제 #15
0
def get_pressure():
    page = bot_util.urlopen(_URL_WEATHER)
    if not page:
        return None
    return _get_pressure_from_page(page)
예제 #16
0
def get_humidity():
    page = bot_util.urlopen(_URL_WEATHER)
    if not page:
        return None
    return _get_humidity_from_page(page)