GroupMe 推送设置

问题描述 投票:0回答:1

我正在尝试按照 GroupMe Website 上列出的说明操作,使我的 python 程序能够接收来自群组的实时消息。在该过程的第 2 步中,我得到的答复是

'成功':False,'错误':'401:1c5k4zq1mycffe161kgqp13gnvvn:未知客户端'

而不是

“成功”:正确

同样返回了

'订阅':'/用户/'

而不是

“订阅”:“/user/1000112”

我尝试了以下代码,有或没有

json=
import requests

s = requests.Session()

r=s.post('https://push.groupme.com/faye', json={
    "channel":"/meta/subscribe",
    "clientId":"1c5k4zq1mycffe161kgqp13gnvvn",
    "subscription":"/user/<userid>",
    "id":"2",
    "ext":
      {
        "access_token":"SECRET_CODE",
        "timestamp":1322556419
      }
  })

print(r.json())

有什么建议吗?

非常感谢你

python faye groupme
1个回答
0
投票

首先你必须运行

Handshake
它会给你
client_id

import requests

data = [
    {
        "channel": "/meta/handshake",
        "version": "1.0",
        "supportedConnectionTypes": ["long-polling"],
        "id": "1"
    }
]

url = 'https://push.groupme.com/faye'
response = requests.post(url, json=data)
data = response.json()

print(response.text)

#for message in data:
#    for key, val in message.items():
#        print(f'{key}: {val}')

client_id = data[0]['clientId']

接下来您必须在所有其他请求中使用此

client_id


接下来,您必须登录 https://dev.groupme.com(使用与 https://groupme.com 相同的登录名和密码)并创建

Application
以获得
ACCESS TOKEN

为了测试,您可能需要创建自己的群组频道 - 并且它将具有生成

sharing link
(如
https://groupme.com/join_group/101707363/f0RF78na
)的功能,并且需要号码
101707363
来订阅此频道。

ACCESS_TOKEN = 'YfXp........'    # from Application created on dev.groupme.com
client_id = data[0]['clientId']  # from Handshake
group_id = 101707363             # from sharing link

timestamp = int(datetime.datetime.now().timestamp())

data = [
    {
        "channel": "/meta/subscribe",
        "clientId": client_id,
        "subscription": f"/group/{group_id}",
        "id": "2",
        "ext": {
            "access_token": ACCESS_TOKEN,
            "timestamp": timestamp,
        }
    }
]

url = 'https://push.groupme.com/faye'
response = requests.post(url, json=data)
data = response.json()

print(response.text)

#for message in data:
#    for key, val in message.items():
#        print(f'{key}: {val}')

稍后您可以发送数据请求 - 但文档建议为此使用

websockets
。使用正常的
requests
时,它会等待,直到获取新数据或超时。所以它会阻止所有代码。

data = [
    {
        "channel": "/meta/connect",
        "clientId": client_id,
        "connectionType": "long-polling",
        "id": "3"
    }
]    

url = 'https://push.groupme.com/faye'
response = requests.post(url, json=data)
data = response.json()

print(response.text)

#for message in data:
#    for key, val in message.items():
#        print(f'{key}: {val}')

这可能需要循环运行才能获取您(或其他人)在群组频道(为测试而创建)上发送消息的时间。

此时我只收到我正在群组频道上输入的消息,但我仍然没有收到消息。也许它需要在每个请求中创建

id


我的完整测试代码:

您必须创建自己的群组才能获得自己的分享链接以及号码

group_id

import requests
import datetime

def handshake():
    print('--- Step 1: Handshake ---')

    data = [
        {
            "channel": "/meta/handshake",
            "version": "1.0",
            "supportedConnectionTypes": ["long-polling"],
            "id": "1"
        }
    ]

    url = 'https://push.groupme.com/faye'
    response = requests.post(url, json=data)
    data = response.json()

    print('- data -')
    print(response.text)
    for key, val in data[0].items():
        print(f'{key}: {val}')

    client_id = data[0]['clientId']
    print('client_id:', client_id)

    return client_id
    
def subcribe_user_channel(client_id, user_id, ACCESS_TOKEN):
    print('--- Step 2: Subscribe to the user channel ---')

    timestamp = int(datetime.datetime.now().timestamp())
    print(timestamp)

    data = [
        {
            "channel": "/meta/subscribe",
            "clientId": client_id,
            "subscription": f"/user/{user_id}",
            "id": "2",
            "ext": {
                "access_token": ACCESS_TOKEN,
                "timestamp": timestamp, # 1322556419, 
            }
        }
    ]

    #print( datetime.datetime.fromtimestamp(1322556419) )
    # 1322556419 == 2011-11-29 09:46:59

    url = 'https://push.groupme.com/faye'
    response = requests.post(url, json=data)
    data = response.json()

    print('- data -')
    print(response.text)
    for messagein in data:
        for key, val in message.items():
            print(f'{key}: {val}')
    
def subscribe_group_channel(client_id, group_id, ACCESS_TOKEN):
    print('--- Step 2: Subscribe to the user channel ---')

    timestamp = int(datetime.datetime.now().timestamp())
    print(timestamp)

    data = [
        {
            "channel": "/meta/subscribe",
            "clientId": client_id,
            "subscription": f"/group/{group_id}",
            "id": "2",
            "ext": {
                "access_token": ACCESS_TOKEN,
                "timestamp": timestamp, # 1322556419, 
            }
        }
    ]

    url = 'https://push.groupme.com/faye'
    response = requests.post(url, json=data)
    data = response.json()

    print('- data -')
    print(response.text)
    for message in data:
        for key, val in message.items():
            print(f'{key}: {val}')
        
def poll_data(client_id):
    print('--- Step 4: Poll for data ---')
    print('# it can hang and wait for data if there is no data at this moment')

    data = [
        {
            "channel": "/meta/connect",
            "clientId": client_id,
            "connectionType": "long-polling",
            "id": "3"
        }
    ]    

    url = 'https://push.groupme.com/faye'
    response = requests.post(url, json=data)
    data = response.json()

    print('- data -')
    print(response.text)
    for message in data:
        for key, val in message.items():
            print(f'{key}: {val}')

# --- main ---
    
ACCESS_TOKEN = 'YfX..........' # from `Application` created on dev.groupme.com
#user_id  = '1000112'          # ???
group_id = '101707363'         # from sharing link: https://groupme.com/join_group/101707363/f0RF78na

client_id = handshake()
#subscribe_user_channel(client_id, user_id, ACCESS_TOKEN)
subscribe_group_channel(client_id, group_id, ACCESS_TOKEN)

while True:
    poll_data(client_id)
© www.soinside.com 2019 - 2024. All rights reserved.