我正在尝试按照 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())
有什么建议吗?
非常感谢你
首先你必须运行
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)