-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


[ ]

, 23 2017 . 20:39 +

Streaming API, .

. , .

.






WebSocket. websocket.

import websocket

streaming.getServerUrl. URL endpoint (string) key (string).



def get_streaming_server_key(token):
    request_url = "https://api.vk.com/method/streaming.getServerUrl?access_token={}&v=5.64".format(token)
    r = requests.get(request_url)
    data = r.json()
    return {"server":data["response"]["endpoint"],"key":data["response"]["key"]}



def listen_stream():
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("wss://{}/stream?key={} ".format(stream["server"], stream["key"]),
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    ws.run_forever()

def on_message(ws, message):
    print(">>>> receive message:", message)

def on_error(ws, error):
    print(">>>> error thead:",error)

def on_close(ws):
    print(">>>> close thead")

def on_open(ws):
    print(">>>> open thead")


stream = get_streaming_server_key(my_servise_token)
listen_stream()


request header GET /stream?key=e6290ba04916a314c398c331f60224d012fabeb1 HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: streaming.vk.com
Origin: streaming.vk.com
Sec-WebSocket-Key: vG40A5bwbPaVBS+DLBOyog==
Sec-WebSocket-Version: 13
response header HTTP/1.1 101 Switching Protocols
Server: Apache
Date: Thu, 20 Jul 2017 22:06:55 GMT
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Accept: QRJNqD8K7vWNMcQesYKo64q8MfA=
>>>> open thead
send: b"\x8a\x80d')\x90"
send: b'\x8a\x80\xfcmp\xe6'
send: b'\x8a\x80s\x9f6{'
send: b'\x8a\x80\xc9\xfa.\xd4'
send: b'\x8a\x80fU<\xed'
send: b'\x8a\x80\xc6Ji\x19'
send: b'\x8a\x80\xd2D\x08!'




HTTP POST
Content Type application/json
URL https://{endpoint}/rules?key={key}


def set_my_rules(value):
    rule_params = {"rule":{"value":value,"tag":'tag_'+str(random.randint(11111, 99999))}}
    headers = {'content-type': 'application/json'}
    r = requests.post("https://{}/rules?key={}".format(stream["server"], stream["key"]), data=json.dumps(rule_params), headers=headers)
    data = r.json()

    return data['code'] == 200



HTTP GET
URL https://{endpoint}/rules?key={key}



def get_my_rules():
    r = requests.get("https://{}/rules?key={}".format(stream["server"], stream["key"]))
    data = r.json()
    if data['code'] != 200:
        return False

    return data['rules']



HTTP DELETE
Content Type application/json
URL https://{endpoint}/rules?key={key}


def del_my_rules(tag):
    headers = {'content-type': 'application/json'}
    rule_params = {"tag":tag}
    r = requests.delete("https://{}/rules?key={}".format(stream["server"], stream["key"]), data=json.dumps(rule_params), headers=headers)
    data = r.json()

    return data['code'] == 200



stream = get_streaming_server_key(my_servise_token)
set_my_rules('')
listen_stream()


send: b'\x8a\x80\xc9\xfa.\xd4'
send: b'\x8a\x80fU<\xed'
send: b'\x8a\x80\xc6Ji\x19'
send: b'\x8a\x80\xd2D\x08!'
{code:100,event:{event_type:post,event_id:{post_owner_id:-35708825,post_id:4560},event_url:vk.com/wall-35708825_4560,text:vk.com/small.dolly
. . 16 . , 2 . . . 7 . 27 . - 89250506596 89251527466. ,creation_time:1498942995,tags:[test_cats],author:{id:-35708825}}}


telebot.


import telebot

TELEGRAM_API_TOKEN = '3277332...' #     
bot = telebot.TeleBot(TELEGRAM_API_TOKEN)




def _send(msg):
    markup = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
    markup.add(' ', '  ', '')

    msg = bot.send_message(chatID, msg, reply_markup=markup) #     
    bot.register_next_step_handler(msg, process_step) #     

#   'help', 'start'
@bot.message_handler(commands=['help', 'start'])
def send_welcome(message):
    global chatID
    chatID = message.chat.id
    hello_test = ', %s!    VK Streaming API!' % message.from_user.first_name
    _send(hello_test)

#    
def process_step(message):
    if message.text == ' ':
        _send(get_rules_list())

    if message.text == '  ':
        _send(clear_rules_list())

    if message.text == '':
        msg = bot.send_message(chatID, " ?")
        bot.register_next_step_handler(msg, add_rule_handler)






if message.text == '':
        msg = bot.send_message(chatID, " ?")
        bot.register_next_step_handler(msg, add_rule_handler)
.....
def add_rule_handler(message):
    new_rule = set_my_rules(message.text)
    if new_rule:
        _send("Successful")
    else:
        logging.debug("Error add rules")
        _send("Error")



def get_rules_list():
    rules = get_my_rules()
    if rules:
        return "\n".join([str(rule['value']) for rule in rules])
    else:
        logging.debug("Error get rules list")
        return 'Error'


def clear_rules_list():
    rules = get_my_rules()
    if rules:
        for rule in rules:
            del_my_rules(rule['tag'])

        return "Successful"

    else:
        logging.debug("Error clear rules list")
        return 'Error'



def on_message(ws, message):
    print(">>>> receive message:", message)
    message = json.loads(message)

    if not message['code']:
        return

    if not message['event']['event_type'] or message['event']['event_type'] != 'post':
        return # ,     

    post = message['event']['event_type'] +"\n"+message['event']['text'].replace("
", "\n") +"\n\n"+ message['event']['event_url'] _send_post(post)


.

def listen_stream():
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("wss://{}/stream?key={} ".format(stream["server"], stream["key"]),
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    #ws.run_forever()

    wst = threading.Thread(target=ws.run_forever)
    wst.daemon = True
    wst.start()



if __name__ == '__main__':
    try:
        chatID = 0
        stream = get_streaming_server_key(my_servise_token)
        listen_stream()

        bot.polling(none_stop=True)
    except Exception as e:
        logging.exception("error start")





, .


Streaming API docs
Telegram API docs
Python websocket-client
Python TelegramBotAPI
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/333942/

:  

: [1] []
 

:
: 

: ( )

:

  URL